[llvm-commits] [llvm] r123738 - /llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp

Daniel Dunbar daniel at zuster.org
Mon Jan 17 21:34:11 PST 2011


Author: ddunbar
Date: Mon Jan 17 23:34:11 2011
New Revision: 123738

URL: http://llvm.org/viewvc/llvm-project?rev=123738&view=rev
Log:
McARM: Always keep an offset expression, if used (instead of assuming == 0 if used but not present), and simplify logic.

Also, clean up various non-sensicalisms in isMemModeRegThumb() and isMemModeImmThumb().

Modified:
    llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp

Modified: llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp?rev=123738&r1=123737&r2=123738&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp (original)
+++ llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp Mon Jan 17 23:34:11 2011
@@ -234,9 +234,6 @@
         Mem.Writeback || Mem.Negative)
       return false;
 
-    // If there is an offset expression, make sure it's valid.
-    if (!Mem.Offset) return true;
-
     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Mem.Offset);
     if (!CE) return false;
 
@@ -245,16 +242,14 @@
     return ((Value & 0x3) == 0 && Value <= 1020 && Value >= -1020);
   }
   bool isMemModeRegThumb() const {
-    if (!isMemory() || (!Mem.OffsetIsReg && !Mem.Offset) || Mem.Writeback)
+    if (!isMemory() || !Mem.OffsetIsReg || Mem.Writeback)
       return false;
-    return !Mem.Offset || !isa<MCConstantExpr>(Mem.Offset);
+    return true;
   }
   bool isMemModeImmThumb() const {
-    if (!isMemory() || (!Mem.OffsetIsReg && !Mem.Offset) || Mem.Writeback)
+    if (!isMemory() || Mem.OffsetIsReg || Mem.Writeback)
       return false;
 
-    if (!Mem.Offset) return false;
-
     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Mem.Offset);
     if (!CE) return false;
 
@@ -319,22 +314,18 @@
 
     // FIXME: #-0 is encoded differently than #0. Does the parser preserve
     // the difference?
-    if (Mem.Offset) {
-      const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Mem.Offset);
-      assert(CE && "Non-constant mode 5 offset operand!");
-
-      // The MCInst offset operand doesn't include the low two bits (like
-      // the instruction encoding).
-      int64_t Offset = CE->getValue() / 4;
-      if (Offset >= 0)
-        Inst.addOperand(MCOperand::CreateImm(ARM_AM::getAM5Opc(ARM_AM::add,
-                                                               Offset)));
-      else
-        Inst.addOperand(MCOperand::CreateImm(ARM_AM::getAM5Opc(ARM_AM::sub,
-                                                               -Offset)));
-    } else {
-      Inst.addOperand(MCOperand::CreateImm(0));
-    }
+    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Mem.Offset);
+    assert(CE && "Non-constant mode 5 offset operand!");
+
+    // The MCInst offset operand doesn't include the low two bits (like
+    // the instruction encoding).
+    int64_t Offset = CE->getValue() / 4;
+    if (Offset >= 0)
+      Inst.addOperand(MCOperand::CreateImm(ARM_AM::getAM5Opc(ARM_AM::add,
+                                                             Offset)));
+    else
+      Inst.addOperand(MCOperand::CreateImm(ARM_AM::getAM5Opc(ARM_AM::sub,
+                                                             -Offset)));
   }
 
   void addMemModeRegThumbOperands(MCInst &Inst, unsigned N) const {
@@ -424,6 +415,8 @@
            "OffsetRegNum must imply OffsetIsReg!");
     assert((!OffsetRegShifted || OffsetIsReg) &&
            "OffsetRegShifted must imply OffsetIsReg!");
+    assert((Offset || OffsetIsReg) &&
+           "Offset must exists unless register offset is used!");
     assert((!ShiftAmount || (OffsetIsReg && OffsetRegShifted)) &&
            "Cannot have shift amount without shifted register offset!");
     assert((!Offset || !OffsetIsReg) &&
@@ -755,6 +748,12 @@
       Parser.Lex(); // Eat exclaim token
     }
 
+    // Force Offset to exist if used.
+    if (!OffsetIsReg) {
+      if (!Offset)
+        Offset = MCConstantExpr::Create(0, getContext());
+    }
+      
     Operands.push_back(ARMOperand::CreateMem(BaseRegNum, OffsetIsReg, Offset,
                                              OffsetRegNum, OffsetRegShifted,
                                              ShiftType, ShiftAmount, Preindexed,
@@ -797,6 +796,12 @@
         return true;
     }
 
+    // Force Offset to exist if used.
+    if (!OffsetIsReg) {
+      if (!Offset)
+        Offset = MCConstantExpr::Create(0, getContext());
+    }
+
     Operands.push_back(ARMOperand::CreateMem(BaseRegNum, OffsetIsReg, Offset,
                                              OffsetRegNum, OffsetRegShifted,
                                              ShiftType, ShiftAmount, Preindexed,





More information about the llvm-commits mailing list