ARM range checking for so_imm operands in assembly parsing.
authorJim Grosbach <grosbach@apple.com>
Tue, 19 Jul 2011 16:50:30 +0000 (16:50 +0000)
committerJim Grosbach <grosbach@apple.com>
Tue, 19 Jul 2011 16:50:30 +0000 (16:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@135489 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMInstrInfo.td
lib/Target/ARM/AsmParser/ARMAsmParser.cpp

index a42dd1a54ec72ca09a79a0c2637737c6097d388d..9845e0be6f9fee26688daccb0dbde6a9f57c70ee 100644 (file)
@@ -443,10 +443,12 @@ def shift_so_reg : Operand<i32>,    // reg reg imm
 
 // so_imm - Match a 32-bit shifter_operand immediate operand, which is an
 // 8-bit immediate rotated by an arbitrary number of bits.
+def SOImmAsmOperand: AsmOperandClass { let Name = "ARMSOImm"; }
 def so_imm : Operand<i32>, ImmLeaf<i32, [{
     return ARM_AM::getSOImmVal(Imm) != -1;
   }]> {
   let EncoderMethod = "getSOImmOpValue";
+  let ParserMatchClass = SOImmAsmOperand;
 }
 
 // Break so_imm's up into two pieces.  This handles immediates with up to 16
index a4741270c7a5f0eecd8c53fd1092d5084e78de32..a0f2726af31c52d1dec5ea7d8650f1730615f648 100644 (file)
@@ -407,6 +407,14 @@ public:
     int64_t Value = CE->getValue();
     return Value >= 0 && Value < 65536;
   }
+  bool isARMSOImm() const {
+    if (Kind != Immediate)
+      return false;
+    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
+    if (!CE) return false;
+    int64_t Value = CE->getValue();
+    return ARM_AM::getSOImmVal(Value) != -1;
+  }
   bool isT2SOImm() const {
     if (Kind != Immediate)
       return false;
@@ -613,6 +621,11 @@ public:
     addExpr(Inst, getImm());
   }
 
+  void addARMSOImmOperands(MCInst &Inst, unsigned N) const {
+    assert(N == 1 && "Invalid number of operands!");
+    addExpr(Inst, getImm());
+  }
+
   void addT2SOImmOperands(MCInst &Inst, unsigned N) const {
     assert(N == 1 && "Invalid number of operands!");
     addExpr(Inst, getImm());