<div dir="ltr">I couldn't add Chad to this code review via Phabricator but I'd like him to take a look too.</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Aug 22, 2013 at 12:31 AM, David Majnemer <span dir="ltr"><<a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi craig.topper,<br>
<br>
MASM let's you do stuff like 'MOV FS:20, EAX' and 'MOV EAX, FS:20'<br>
<br>
<a href="http://llvm-reviews.chandlerc.com/D1470" target="_blank">http://llvm-reviews.chandlerc.com/D1470</a><br>
<br>
Files:<br>
  lib/Target/X86/AsmParser/X86AsmParser.cpp<br>
  test/MC/X86/intel-syntax.s<br>
<br>
Index: lib/Target/X86/AsmParser/X86AsmParser.cpp<br>
===================================================================<br>
--- lib/Target/X86/AsmParser/X86AsmParser.cpp<br>
+++ lib/Target/X86/AsmParser/X86AsmParser.cpp<br>
@@ -497,6 +497,8 @@<br>
   X86Operand *ParseIntelOffsetOfOperator();<br>
   X86Operand *ParseIntelDotOperator(const MCExpr *Disp, const MCExpr *&NewDisp);<br>
   X86Operand *ParseIntelOperator(unsigned OpKind);<br>
+  X86Operand *TryParseIntelSegmentOffset(unsigned SegReg, int64_t ImmDisp,<br>
+                                         SMLoc Start, SMLoc End, unsigned Size);<br>
   X86Operand *ParseIntelMemOperand(unsigned SegReg, int64_t ImmDisp,<br>
                                    SMLoc StartLoc);<br>
   X86Operand *ParseIntelExpression(IntelExprStateMachine &SM, SMLoc &End);<br>
@@ -1424,6 +1426,21 @@<br>
   return 0;<br>
 }<br>
<br>
+/// \brief Parse intel style segment offset.<br>
+X86Operand *X86AsmParser::TryParseIntelSegmentOffset(unsigned SegReg,<br>
+                                                     int64_t ImmDisp,<br>
+                                                     SMLoc Start, SMLoc End,<br>
+                                                     unsigned Size) {<br>
+  if (SegReg && (getLexer().is(AsmToken::Comma) ||<br>
+                 getLexer().is(AsmToken::EndOfStatement))) {<br>
+    // Handle things like INST SegReg : Imm, SRC<br>
+    //                and INST DST, SegReg : Imm<br>
+    const MCExpr *Disp = MCConstantExpr::Create(ImmDisp, getContext());<br>
+    return X86Operand::CreateMem(SegReg, Disp, /*BaseReg=*/0, /*IndexReg=*/0,<br>
+                                 /*Scale=*/1, Start, End, Size);<br>
+  }<br>
+  return 0;<br>
+}<br>
 /// ParseIntelMemOperand - Parse intel style memory operand.<br>
 X86Operand *X86AsmParser::ParseIntelMemOperand(unsigned SegReg,<br>
                                                int64_t ImmDisp,<br>
@@ -1441,11 +1458,17 @@<br>
<br>
   // Parse ImmDisp [ BaseReg + Scale*IndexReg + Disp ].<br>
   if (getLexer().is(AsmToken::Integer)) {<br>
+    int64_t ImmDisp = Tok.getIntVal();<br>
+    AsmToken ImmDispToken = Parser.Lex(); // Eat the integer.<br>
+<br>
+    if (X86Operand *SegmentOffsetOp = TryParseIntelSegmentOffset(<br>
+            SegReg, ImmDisp, Start, ImmDispToken.getEndLoc(), Size))<br>
+      return SegmentOffsetOp;<br>
+<br>
     if (isParsingInlineAsm())<br>
       InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_ImmPrefix,<br>
-                                                  Tok.getLoc()));<br>
-    int64_t ImmDisp = Tok.getIntVal();<br>
-    Parser.Lex(); // Eat the integer.<br>
+                                                  ImmDispToken.getLoc()));<br>
+<br>
     if (getLexer().isNot(AsmToken::LBrac))<br>
       return ErrorOperand(Start, "Expected '[' token!");<br>
     return ParseIntelBracExpression(SegReg, Start, ImmDisp, Size);<br>
@@ -1459,6 +1482,13 @@<br>
     if (getLexer().isNot(AsmToken::Colon))<br>
       return ErrorOperand(Start, "Expected ':' token!");<br>
     Parser.Lex(); // Eat :<br>
+    if (getLexer().is(AsmToken::Integer)) {<br>
+      int64_t ImmDisp = Tok.getIntVal();<br>
+      AsmToken ImmDispToken = Parser.Lex(); // Eat the integer.<br>
+      if (X86Operand *SegmentOffsetOp = TryParseIntelSegmentOffset(<br>
+              SegReg, ImmDisp, Start, ImmDispToken.getEndLoc(), Size))<br>
+        return SegmentOffsetOp;<br>
+    }<br>
     if (getLexer().isNot(AsmToken::LBrac))<br>
       return ErrorOperand(Start, "Expected '[' token!");<br>
     return ParseIntelBracExpression(SegReg, Start, ImmDisp, Size);<br>
Index: test/MC/X86/intel-syntax.s<br>
===================================================================<br>
--- test/MC/X86/intel-syntax.s<br>
+++ test/MC/X86/intel-syntax.s<br>
@@ -63,6 +63,10 @@<br>
     mov ECX, DWORD PTR [4*ECX + _fnan]<br>
 // CHECK: movq %fs:320, %rax<br>
     mov RAX, QWORD PTR FS:[320]<br>
+// CHECK: movq %fs:320, %rax<br>
+    mov RAX, QWORD PTR FS:320<br>
+// CHECK: movq %rax, %fs:320<br>
+    mov QWORD PTR FS:320, RAX<br>
 // CHECK: vpgatherdd %xmm8, (%r15,%xmm9,2), %xmm1<br>
     vpgatherdd XMM10, DWORD PTR [R15 + 2*XMM9], XMM8<br>
 // CHECK: movsd        -8, %xmm5<br>
</blockquote></div><br></div>