[llvm] f875636 - [MC][ARM] add implicit immediate form for ldrsbt/ldrht/ldrsht

Stefan Agner via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 19 15:06:48 PDT 2020


Author: Stefan Agner
Date: 2020-03-19T22:36:42+01:00
New Revision: f87563661d6661fd4843beb8f391acd077b08dbe

URL: https://github.com/llvm/llvm-project/commit/f87563661d6661fd4843beb8f391acd077b08dbe
DIFF: https://github.com/llvm/llvm-project/commit/f87563661d6661fd4843beb8f391acd077b08dbe.diff

LOG: [MC][ARM] add implicit immediate form for ldrsbt/ldrht/ldrsht

Add pseudo instructions for ldrsbt/ldrht/ldrsht with implicit immediate
and add fall back C++ code to transform the instruction to the
equivalent LDRSBTi/LDRHTi/LDRSHTi form.

This is similar to how it has been done in commit
fb3950ec6312dfa4317d8cbf83a1db4aae7428ce

This fixes:
https://bugs.llvm.org/show_bug.cgi?id=45070

Added: 
    

Modified: 
    llvm/lib/Target/ARM/ARMInstrInfo.td
    llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
    llvm/test/MC/ARM/arm-memory-instructions.s

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/ARM/ARMInstrInfo.td b/llvm/lib/Target/ARM/ARMInstrInfo.td
index b006b5e7e08f..de87b323f79c 100644
--- a/llvm/lib/Target/ARM/ARMInstrInfo.td
+++ b/llvm/lib/Target/ARM/ARMInstrInfo.td
@@ -2981,6 +2981,9 @@ multiclass AI3ldrT<bits<4> op, string opc> {
     let Inst{3-0} = Rm{3-0};
     let DecoderMethod = "DecodeLDR";
   }
+
+  def ii : ARMAsmPseudo<!strconcat(opc, "${p} $Rt, $addr"),
+                        (ins addr_offset_none:$addr, pred:$p), (outs GPR:$Rt)>;
 }
 
 defm LDRSBT : AI3ldrT<0b1101, "ldrsbt">;

diff  --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
index c1bddfb847d6..8ae7525ddea6 100644
--- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
+++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
@@ -8546,6 +8546,26 @@ bool ARMAsmParser::processInstruction(MCInst &Inst,
     Inst = TmpInst;
     return true;
   }
+  // Alias for 'ldr{sb,h,sh}t Rt, [Rn] {, #imm}' for ommitted immediate.
+  case ARM::LDRSBTii:
+  case ARM::LDRHTii:
+  case ARM::LDRSHTii: {
+    MCInst TmpInst;
+
+    if (Inst.getOpcode() == ARM::LDRSBTii)
+      TmpInst.setOpcode(ARM::LDRSBTi);
+    else if (Inst.getOpcode() == ARM::LDRHTii)
+      TmpInst.setOpcode(ARM::LDRHTi);
+    else if (Inst.getOpcode() == ARM::LDRSHTii)
+      TmpInst.setOpcode(ARM::LDRSHTi);
+    TmpInst.addOperand(Inst.getOperand(0));
+    TmpInst.addOperand(Inst.getOperand(1));
+    TmpInst.addOperand(Inst.getOperand(1));
+    TmpInst.addOperand(MCOperand::createImm(256));
+    TmpInst.addOperand(Inst.getOperand(2));
+    Inst = TmpInst;
+    return true;
+  }
   // Alias for alternate form of 'str{,b}t Rt, [Rn], #imm' instruction.
   case ARM::STRT_POST:
   case ARM::STRBT_POST: {

diff  --git a/llvm/test/MC/ARM/arm-memory-instructions.s b/llvm/test/MC/ARM/arm-memory-instructions.s
index 416069ac5d2c..259afb2f5fd6 100644
--- a/llvm/test/MC/ARM/arm-memory-instructions.s
+++ b/llvm/test/MC/ARM/arm-memory-instructions.s
@@ -194,11 +194,13 @@ Lbaz: .quad 0
 @------------------------------------------------------------------------------
         ldrht r9, [r7], #128
         ldrht r4, [r3], #-75
+        ldrht r4, [r3]
         ldrht r9, [r7], r2
         ldrht r4, [r3], -r2
 
 @ CHECK: ldrht	r9, [r7], #128          @ encoding: [0xb0,0x98,0xf7,0xe0]
 @ CHECK: ldrht	r4, [r3], #-75          @ encoding: [0xbb,0x44,0x73,0xe0]
+@ CHECK: ldrht	r4, [r3], #0            @ encoding: [0xb0,0x40,0xf3,0xe0]
 @ CHECK: ldrht	r9, [r7], r2            @ encoding: [0xb2,0x90,0xb7,0xe0]
 @ CHECK: ldrht	r4, [r3], -r2           @ encoding: [0xb2,0x40,0x33,0xe0]
 
@@ -244,11 +246,13 @@ Lbaz: .quad 0
 @------------------------------------------------------------------------------
         ldrsbt r5, [r6], #1
         ldrsbt r3, [r8], #-12
+        ldrsbt r5, [r6]
         ldrsbt r8, [r9], r5
         ldrsbt r2, [r1], -r4
 
 @ CHECK: ldrsbt	r5, [r6], #1            @ encoding: [0xd1,0x50,0xf6,0xe0]
 @ CHECK: ldrsbt	r3, [r8], #-12          @ encoding: [0xdc,0x30,0x78,0xe0]
+@ CHECK: ldrsbt	r5, [r6], #0            @ encoding: [0xd0,0x50,0xf6,0xe0]
 @ CHECK: ldrsbt	r8, [r9], r5            @ encoding: [0xd5,0x80,0xb9,0xe0]
 @ CHECK: ldrsbt	r2, [r1], -r4           @ encoding: [0xd4,0x20,0x31,0xe0]
 
@@ -293,11 +297,13 @@ Lbaz: .quad 0
 @------------------------------------------------------------------------------
         ldrsht r5, [r6], #1
         ldrsht r3, [r8], #-12
+        ldrsht r5, [r6]
         ldrsht r8, [r9], r5
         ldrsht r2, [r1], -r4
 
 @ CHECK: ldrsht	r5, [r6], #1            @ encoding: [0xf1,0x50,0xf6,0xe0]
 @ CHECK: ldrsht	r3, [r8], #-12          @ encoding: [0xfc,0x30,0x78,0xe0]
+@ CHECK: ldrsht	r5, [r6], #0            @ encoding: [0xf0,0x50,0xf6,0xe0]
 @ CHECK: ldrsht	r8, [r9], r5            @ encoding: [0xf5,0x80,0xb9,0xe0]
 @ CHECK: ldrsht	r2, [r1], -r4           @ encoding: [0xf4,0x20,0x31,0xe0]
 


        


More information about the llvm-commits mailing list