ARM: fix regression caused by r198914
authorSaleem Abdulrasool <compnerd@compnerd.org>
Fri, 10 Jan 2014 16:22:47 +0000 (16:22 +0000)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Fri, 10 Jan 2014 16:22:47 +0000 (16:22 +0000)
The disassembler would no longer be able to disambiguage between the two
variants (explicit immediate #0 vs implicit, omitted #0) for the ldrt, strt,
ldrbt, strbt mnemonics as both versions indicated the disassembler routine.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198944 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMInstrInfo.td
test/MC/Disassembler/ARM/addrmode2-reencoding.txt [new file with mode: 0644]

index ad134d3f99c37745afd2f49df1565c36fdd5c7e5..3d38cc98960c28f2d518f5c1ba7665ad5552846b 100644 (file)
@@ -2463,12 +2463,14 @@ class LDRTImmediate<bit has_offset, string args, dag iops>
   let Inst{21} = 1; // overwrite
   let Inst{19-16} = addr;
   let Inst{11-0} = !if(has_offset, offset{11-0}, 0);
-  let DecoderMethod = "DecodeAddrMode2IdxInstruction";
 }
 
 def LDRT_POST_IMM
   : LDRTImmediate<1, "\t$Rt, $addr, $offset",
-                  (ins addr_offset_none:$addr, am2offset_imm:$offset)>;
+                  (ins addr_offset_none:$addr, am2offset_imm:$offset)> {
+  let DecoderMethod = "DecodeAddrMode2IdxInstruction";
+}
+
 def LDRT_POST_IMM_0
   : LDRTImmediate<0, "\t$Rt, $addr", (ins addr_offset_none:$addr)>;
 
@@ -2504,12 +2506,14 @@ class LDRBTImmediate<bit has_offset, string args, dag iops>
   let Inst{21} = 1; // overwrite
   let Inst{19-16} = addr;
   let Inst{11-0} = !if(has_offset, offset{11-0}, 0);
-  let DecoderMethod = "DecodeAddrMode2IdxInstruction";
 }
 
 def LDRBT_POST_IMM
   : LDRBTImmediate<1, "\t$Rt, $addr, $offset",
-                   (ins addr_offset_none:$addr, am2offset_imm:$offset)>;
+                   (ins addr_offset_none:$addr, am2offset_imm:$offset)> {
+  let DecoderMethod = "DecodeAddrMode2IdxInstruction";
+}
+
 def LDRBT_POST_IMM_0
   : LDRBTImmediate<0, "\t$Rt, $addr", (ins addr_offset_none:$addr)>;
 
@@ -2785,12 +2789,15 @@ class STRBTImmediate<bit has_offset, string args, dag iops>
   let Inst{21} = 1; // overwrite
   let Inst{19-16} = addr;
   let Inst{11-0} = !if(has_offset, offset{11-0}, 0);
-  let DecoderMethod = "DecodeAddrMode2IdxInstruction";
 }
 
 def STRBT_POST_IMM
   : STRBTImmediate<1, "\t$Rt, $addr, $offset",
-                   (ins GPR:$Rt, addr_offset_none:$addr, am2offset_imm:$offset)>;
+                 (ins GPR:$Rt, addr_offset_none:$addr, am2offset_imm:$offset)> {
+  let DecoderMethod = "DecodeAddrMode2IdxInstruction";
+}
+
+
 def STRBT_POST_IMM_0
   : STRBTImmediate<0, "\t$Rt, $addr", (ins GPR:$Rt, addr_offset_none:$addr)>;
 
@@ -2826,12 +2833,14 @@ class STRTImmediate<bit has_offset, string args, dag iops>
   let Inst{21} = 1; // overwrite
   let Inst{19-16} = addr;
   let Inst{11-0} = !if(has_offset, offset{11-0}, 0);
-  let DecoderMethod = "DecodeAddrMode2IdxInstruction";
 }
 
 def STRT_POST_IMM
   : STRTImmediate<1, "\t$Rt, $addr, $offset",
-                  (ins GPR:$Rt, addr_offset_none:$addr, am2offset_imm:$offset)>;
+                 (ins GPR:$Rt, addr_offset_none:$addr, am2offset_imm:$offset)> {
+  let DecoderMethod = "DecodeAddrMode2IdxInstruction";
+}
+
 def STRT_POST_IMM_0
   : STRTImmediate<0, "\t$Rt, $addr", (ins GPR:$Rt, addr_offset_none:$addr)>;
 }
diff --git a/test/MC/Disassembler/ARM/addrmode2-reencoding.txt b/test/MC/Disassembler/ARM/addrmode2-reencoding.txt
new file mode 100644 (file)
index 0000000..128b4b9
--- /dev/null
@@ -0,0 +1,12 @@
+# RUN: llvm-mc -triple armv7 -show-encoding -disassemble < %s | FileCheck %s
+
+0x00 0x10 0xb0 0xe4
+0x00 0x10 0xf0 0xe4
+0x00 0x10 0xa0 0xe4
+0x00 0x10 0xe0 0xe4
+
+# CHECK: ldrt r1, [r0]    @ encoding: [0x00,0x10,0xb0,0xe4]
+# CHECK: ldrbt r1, [r0]   @ encoding: [0x00,0x10,0xf0,0xe4]
+# CHECK: strt r1, [r0]    @ encoding: [0x00,0x10,0xa0,0xe4]
+# CHECK: strbt r1, [r0]   @ encoding: [0x00,0x10,0xe0,0xe4]
+