diff --git a/llvm/lib/Target/ARM/ARMInstrInfo.td b/llvm/lib/Target/ARM/ARMInstrInfo.td index 6582a5b26425..23b2155c8511 100644 --- a/llvm/lib/Target/ARM/ARMInstrInfo.td +++ b/llvm/lib/Target/ARM/ARMInstrInfo.td @@ -113,6 +113,22 @@ def ldr : InstARM<(ops IntRegs:$dst, memri:$addr), "ldr $dst, $addr", [(set IntRegs:$dst, (load iaddr:$addr))]>; +def LDRB : InstARM<(ops IntRegs:$dst, IntRegs:$addr), + "ldrb $dst, $addr", + [(set IntRegs:$dst, (zextloadi8 IntRegs:$addr))]>; + +def LDRSB : InstARM<(ops IntRegs:$dst, IntRegs:$addr), + "ldrsb $dst, $addr", + [(set IntRegs:$dst, (sextloadi8 IntRegs:$addr))]>; + +def LDRH : InstARM<(ops IntRegs:$dst, IntRegs:$addr), + "ldrh $dst, $addr", + [(set IntRegs:$dst, (zextloadi16 IntRegs:$addr))]>; + +def LDRSH : InstARM<(ops IntRegs:$dst, IntRegs:$addr), + "ldrsh $dst, $addr", + [(set IntRegs:$dst, (sextloadi16 IntRegs:$addr))]>; + def str : InstARM<(ops IntRegs:$src, memri:$addr), "str $src, $addr", [(store IntRegs:$src, iaddr:$addr)]>; diff --git a/llvm/lib/Target/ARM/README.txt b/llvm/lib/Target/ARM/README.txt index 768a2e6f3e45..9e846565c83f 100644 --- a/llvm/lib/Target/ARM/README.txt +++ b/llvm/lib/Target/ARM/README.txt @@ -51,3 +51,7 @@ Only needs 8 bytes of stack space. We currently allocate 16. should try to declare smull and umull as returning two values. ---------------------------------------------------------- + +Implement addressing modes 2 (ldrb) and 3 (ldrsb) + +---------------------------------------------------------- diff --git a/llvm/test/Regression/CodeGen/ARM/load.ll b/llvm/test/Regression/CodeGen/ARM/load.ll new file mode 100644 index 000000000000..603a8b278063 --- /dev/null +++ b/llvm/test/Regression/CodeGen/ARM/load.ll @@ -0,0 +1,33 @@ +; RUN: llvm-as < %s | llc -march=arm && +; RUN: llvm-as < %s | llc -march=arm | grep ldrsb && +; RUN: llvm-as < %s | llc -march=arm | grep ldrb && +; RUN: llvm-as < %s | llc -march=arm | grep ldrsh && +; RUN: llvm-as < %s | llc -march=arm | grep ldrh + +int %f1(sbyte* %p) { +entry: + %tmp = load sbyte* %p ; [#uses=1] + %tmp = cast sbyte %tmp to int ; [#uses=1] + ret int %tmp +} + +int %f2(ubyte* %p) { +entry: + %tmp = load ubyte* %p ; [#uses=1] + %tmp = cast ubyte %tmp to int ; [#uses=1] + ret int %tmp +} + +int %f3(short* %p) { +entry: + %tmp = load short* %p ; [#uses=1] + %tmp = cast short %tmp to int ; [#uses=1] + ret int %tmp +} + +int %f4(ushort* %p) { +entry: + %tmp = load ushort* %p ; [#uses=1] + %tmp = cast ushort %tmp to int ; [#uses=1] + ret int %tmp +}