LDCL_POST and STCL_POST need one's-complement offsets, rather than two's complement...
authorOwen Anderson <resistor@mac.com>
Thu, 4 Aug 2011 18:24:14 +0000 (18:24 +0000)
committerOwen Anderson <resistor@mac.com>
Thu, 4 Aug 2011 18:24:14 +0000 (18:24 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136896 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMInstrInfo.td
lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp
lib/Target/ARM/InstPrinter/ARMInstPrinter.h
utils/TableGen/EDEmitter.cpp

index f03aced9cb7eea6ecfa5dc0eee1a8a6cd036f4a1..9fac575c1dbddb5f65d0a38626c97b045ff94f53 100644 (file)
@@ -626,6 +626,17 @@ def postidx_imm8 : Operand<i32> {
   let MIOperandInfo = (ops i32imm);
 }
 
+// postidx_imm8s4 := +/- [0,1020]
+//
+// 9 bit value:
+//  {8}       1 is imm8 is non-negative. 0 otherwise.
+//  {7-0}     [0,255] imm8 value, scaled by 4.
+def postidx_imm8s4 : Operand<i32> {
+  let PrintMethod = "printPostIdxImm8s4Operand";
+  let MIOperandInfo = (ops i32imm);
+}
+
+
 // postidx_reg := +/- reg
 //
 def PostIdxRegAsmOperand : AsmOperandClass {
@@ -3974,7 +3985,7 @@ multiclass LdStCop<bits<4> op31_28, bit load, dag ops, string opc, string cond>{
 
   def L_POST : ACI<(outs),
       !con((ins nohash_imm:$cop, nohash_imm:$CRd, addr_offset_none:$addr,
-            i32imm:$offset), ops),
+            postidx_imm8s4:$offset), ops),
       !strconcat(!strconcat(opc, "l"), cond), "\tp$cop, cr$CRd, $addr, $offset",
       IndexModePost> {
     let Inst{31-28} = op31_28;
index 2394340e6026aa511c41f9a7a3bef6cfe81387bd..37359cec7faa6fb2ea58e61fac43459830d917ba 100644 (file)
@@ -382,6 +382,15 @@ void ARMInstPrinter::printPostIdxImm8Operand(const MCInst *MI,
   O << '#' << ((Imm & 256) ? "" : "-") << (Imm & 0xff);
 }
 
+void ARMInstPrinter::printPostIdxImm8s4Operand(const MCInst *MI,
+                                             unsigned OpNum,
+                                             raw_ostream &O) {
+  const MCOperand &MO = MI->getOperand(OpNum);
+  unsigned Imm = MO.getImm();
+  O << '#' << ((Imm & 256) ? "" : "-") << ((Imm & 0xff) << 2);
+}
+
+
 void ARMInstPrinter::printLdStmModeOperand(const MCInst *MI, unsigned OpNum,
                                            raw_ostream &O) {
   ARM_AM::AMSubMode Mode = ARM_AM::getAM4SubMode(MI->getOperand(OpNum)
index 9f481e912899c0b8e0ef9087d5df6a9cb98f0f1b..ac78d02835902e024fef1eb37d4eaa09cadb9fbb 100644 (file)
@@ -55,6 +55,8 @@ public:
   void printAM3PreOrOffsetIndexOp(const MCInst *MI, unsigned Op,raw_ostream &O);
   void printPostIdxImm8Operand(const MCInst *MI, unsigned OpNum,
                                raw_ostream &O);
+  void printPostIdxImm8s4Operand(const MCInst *MI, unsigned OpNum,
+                               raw_ostream &O);
 
   void printLdStmModeOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
   void printAddrMode5Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
index e7dba13984482cdc71908ab1466dfbf0eb5b6714..bf2cbe23c8abc63295e5670fd6d19385e2b01bbb 100644 (file)
@@ -614,6 +614,7 @@ static int ARMFlagFromOpName(LiteralConstantEmitter *type,
   IMM("shr_imm64");
   IMM("t2ldrlabel");
   IMM("postidx_imm8");
+  IMM("postidx_imm8s4");
 
   MISC("brtarget", "kOperandTypeARMBranchTarget");                // ?
   MISC("uncondbrtarget", "kOperandTypeARMBranchTarget");           // ?