Intel Syntax: Parse mem operand with seg reg. QWORD PTR FS:[320]
authorDevang Patel <dpatel@apple.com>
Fri, 27 Jan 2012 19:48:28 +0000 (19:48 +0000)
committerDevang Patel <dpatel@apple.com>
Fri, 27 Jan 2012 19:48:28 +0000 (19:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149142 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 3afdaf2d7542d5a350c471494dbea524b0381cfe..266f521b70b01c808deb50936c30ccdd95411d62 100644 (file)
@@ -610,7 +610,6 @@ X86Operand *X86AsmParser::ParseIntelBracExpression(unsigned SegReg,
     // Parse BaseReg
     if (ParseRegister(BaseReg, Start, End)) {
       // Handle '[' 'symbol' ']'
-      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!");
@@ -624,8 +623,11 @@ X86Operand *X86AsmParser::ParseIntelBracExpression(unsigned SegReg,
       if (getLexer().is(AsmToken::RBrac)) {
         // Handle '[' number ']'
         Parser.Lex();
-        return X86Operand::CreateMem(MCConstantExpr::Create(Val, getContext()),
-                                     Start, End, Size);
+        const MCExpr *Disp = MCConstantExpr::Create(Val, getContext());
+        if (SegReg)
+          return X86Operand::CreateMem(SegReg, Disp, 0, 0, Scale,
+                                       Start, End, Size);
+        return X86Operand::CreateMem(Disp, Start, End, Size);
       } else if (getLexer().is(AsmToken::Star)) {
         // Handle '[' Scale*IndexReg ']'
         Parser.Lex();
index 2c69280711ea659352c729a28975ec5515533e48..7cd56777b0e9c81930f84c34af5c95e31f30e784 100644 (file)
@@ -61,4 +61,6 @@ _main:
         lea     R8D, DWORD PTR [4*RDI]
 // CHECK:        movl    _fnan(,%ecx,4), %ecx
         mov     ECX, DWORD PTR [4*ECX + _fnan]
+// CHECK:       movq    %fs:320, %rax
+        mov     RAX, QWORD PTR FS:[320]
        ret