Intel syntax: Parse memory operand with empty base reg, e.g. DWORD PTR [4*RDI]
authorDevang Patel <dpatel@apple.com>
Mon, 23 Jan 2012 20:20:06 +0000 (20:20 +0000)
committerDevang Patel <dpatel@apple.com>
Mon, 23 Jan 2012 20:20:06 +0000 (20:20 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@148721 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/AsmParser/X86AsmParser.cpp
test/MC/X86/intel-syntax.s

index f2fee362611ef1d0ba80fcae9897b4720bc9694a..29e26eddc8691bfd373bb7dd16200ee24b700999 100644 (file)
@@ -618,13 +618,23 @@ X86Operand *X86AsmParser::ParseIntelBracExpression(unsigned SegReg,
       return X86Operand::CreateMem(Disp, Start, End, Size);
     }
   } else if (getLexer().is(AsmToken::Integer)) {
-      // Handle '[' number ']'
-      const MCExpr *Disp = MCConstantExpr::Create(0, getParser().getContext());
-      if (getParser().ParseExpression(Disp, End)) return 0;
-      if (getLexer().isNot(AsmToken::RBrac))
-        return ErrorOperand(Start, "Expected ']' token!");
+      int64_t Val = Parser.getTok().getIntVal();
       Parser.Lex();
-      return X86Operand::CreateMem(Disp, Start, End, Size);
+      SMLoc Loc = Parser.getTok().getLoc();
+      if (getLexer().is(AsmToken::RBrac)) {
+        // Handle '[' number ']'
+        Parser.Lex();
+        return X86Operand::CreateMem(MCConstantExpr::Create(Val, getContext()),
+                                     Start, End, Size);
+      } else if (getLexer().is(AsmToken::Star)) {
+        // Handle '[' Scale*IndexReg ']'
+        Parser.Lex();
+        SMLoc IdxRegLoc = Parser.getTok().getLoc();
+       if (ParseRegister(IndexReg, IdxRegLoc, End))
+         return ErrorOperand(IdxRegLoc, "Expected register");
+        Scale = Val;
+      } else
+        return ErrorOperand(Loc, "Unepxeted token");
   }
 
   if (getLexer().is(AsmToken::Plus) || getLexer().is(AsmToken::Minus)) {
index fa58f1ee697f1c67c26fe392baa090f2d57efeae..a06907085771dedd79ff2811710bea5e13bb79d9 100644 (file)
@@ -56,5 +56,7 @@ _main:
 // CHECK:      fld     %st(0)
        fld     ST(0)
 // CHECK:      movl    %fs:(%rdi), %eax
-mov     EAX, DWORD PTR FS:[RDI]        
+mov     EAX, DWORD PTR FS:[RDI]
+// CHECK:      leal    (,%rdi,4), %r8d
+lea     R8D, DWORD PTR [4*RDI]        
        ret