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

Kevin Enderby enderby at apple.com
Tue Oct 13 15:19:02 PDT 2009


Author: enderby
Date: Tue Oct 13 17:19:02 2009
New Revision: 84040

URL: http://llvm.org/viewvc/llvm-project?rev=84040&view=rev
Log:
More bits of the ARM target assembler for llvm-mc to parse immediates.
Also fixed a couple of coding style things that crept in.  And added more
to the temporary hacked up ARMAsmParser::MatchInstruction() method for testing.

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=84040&r1=84039&r2=84040&view=diff

==============================================================================
--- llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp (original)
+++ llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp Tue Oct 13 17:19:02 2009
@@ -92,6 +92,7 @@
   enum {
     Token,
     Register,
+    Immediate,
     Memory
   } Kind;
 
@@ -107,6 +108,10 @@
       bool Writeback;
     } Reg;
 
+    struct {
+      const MCExpr *Val;
+    } Imm;
+
     // This is for all forms of ARM address expressions
     struct {
       unsigned BaseRegNum;
@@ -134,6 +139,11 @@
     return Reg.RegNum;
   }
 
+  const MCExpr *getImm() const {
+    assert(Kind == Immediate && "Invalid access!");
+    return Imm.Val;
+  }
+
   bool isToken() const {return Kind == Token; }
 
   bool isReg() const { return Kind == Register; }
@@ -159,6 +169,13 @@
     return Res;
   }
 
+  static ARMOperand CreateImm(const MCExpr *Val) {
+    ARMOperand Res;
+    Res.Kind = Immediate;
+    Res.Imm.Val = Val;
+    return Res;
+  }
+
   static ARMOperand CreateMem(unsigned BaseRegNum, bool OffsetIsReg,
                               const MCExpr *Offset, unsigned OffsetRegNum,
                               bool OffsetRegShifted, enum ShiftType ShiftType,
@@ -217,7 +234,7 @@
 // for now.
 bool ARMAsmParser::ParseRegisterList(ARMOperand &Op) {
   assert(getLexer().getTok().is(AsmToken::LCurly) &&
-	 "Token is not an Left Curly Brace");
+         "Token is not an Left Curly Brace");
   getLexer().Lex(); // Eat left curly brace token.
 
   const AsmToken &RegTok = getLexer().getTok();
@@ -498,7 +515,8 @@
       Mnemonic == "str" ||
       Mnemonic == "ldmfd" ||
       Mnemonic == "ldr" ||
-      Mnemonic == "mov")
+      Mnemonic == "mov" ||
+      Mnemonic == "sub")
     return false;
 
   return true;
@@ -517,9 +535,15 @@
       return false;
   case AsmToken::LCurly:
     if (!ParseRegisterList(Op))
-      return(false);
+      return false;
   case AsmToken::Hash:
-    return Error(getLexer().getTok().getLoc(), "immediates not yet supported");
+    // $42 -> immediate.
+    getLexer().Lex();
+    const MCExpr *Val;
+    if (getParser().ParseExpression(Val))
+      return true;
+    Op = ARMOperand::CreateImm(Val);
+    return false;
   default:
     return Error(getLexer().getTok().getLoc(), "unexpected token in operand");
   }





More information about the llvm-commits mailing list