[PATCH] [ms-inline asm] Support offsets after segment registers
David Majnemer
david.majnemer at gmail.com
Mon Aug 26 16:12:18 PDT 2013
- Further address comments
Hi craig.topper, rnk,
http://llvm-reviews.chandlerc.com/D1470
CHANGE SINCE LAST DIFF
http://llvm-reviews.chandlerc.com/D1470?vs=3760&id=3773#toc
Files:
lib/Target/X86/AsmParser/X86AsmParser.cpp
test/MC/X86/intel-syntax.s
Index: lib/Target/X86/AsmParser/X86AsmParser.cpp
===================================================================
--- lib/Target/X86/AsmParser/X86AsmParser.cpp
+++ lib/Target/X86/AsmParser/X86AsmParser.cpp
@@ -497,6 +497,8 @@
X86Operand *ParseIntelOffsetOfOperator();
X86Operand *ParseIntelDotOperator(const MCExpr *Disp, const MCExpr *&NewDisp);
X86Operand *ParseIntelOperator(unsigned OpKind);
+ X86Operand *CreateIntelSegmentOffset(unsigned SegReg, int64_t ImmDisp,
+ SMLoc Start, SMLoc End, unsigned Size);
X86Operand *ParseIntelMemOperand(unsigned SegReg, int64_t ImmDisp,
SMLoc StartLoc);
X86Operand *ParseIntelExpression(IntelExprStateMachine &SM, SMLoc &End);
@@ -1424,6 +1426,20 @@
return 0;
}
+/// \brief Parse intel style segment offset.
+X86Operand *X86AsmParser::CreateIntelSegmentOffset(unsigned SegReg,
+ int64_t ImmDisp, SMLoc Start,
+ SMLoc End, unsigned Size) {
+ if (SegReg && (getLexer().is(AsmToken::Comma) ||
+ getLexer().is(AsmToken::EndOfStatement))) {
+ // We know we hit a segment offset if the next token after the immediate we
+ // just parsed is a comma or the end of the statement.
+ const MCExpr *Disp = MCConstantExpr::Create(ImmDisp, getContext());
+ return X86Operand::CreateMem(SegReg, Disp, /*BaseReg=*/0, /*IndexReg=*/0,
+ /*Scale=*/1, Start, End, Size);
+ }
+ return 0;
+}
/// ParseIntelMemOperand - Parse intel style memory operand.
X86Operand *X86AsmParser::ParseIntelMemOperand(unsigned SegReg,
int64_t ImmDisp,
@@ -1439,13 +1455,22 @@
Parser.Lex(); // Eat ptr.
}
- // Parse ImmDisp [ BaseReg + Scale*IndexReg + Disp ].
+ // Parse ImmDisp.
+ // - If we are dealing with a segment and the displacement is the only memory
+ // operand after the colon, use it.
+ // - Otherwise, try to parse [ BaseReg + Scale*IndexReg + Disp ].
if (getLexer().is(AsmToken::Integer)) {
+ int64_t ImmDisp = Tok.getIntVal();
+ AsmToken ImmDispToken = Parser.Lex(); // Eat the integer.
+
+ if (X86Operand *SegmentOffsetOp = CreateIntelSegmentOffset(
+ SegReg, ImmDisp, Start, ImmDispToken.getEndLoc(), Size))
+ return SegmentOffsetOp;
+
if (isParsingInlineAsm())
InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_ImmPrefix,
- Tok.getLoc()));
- int64_t ImmDisp = Tok.getIntVal();
- Parser.Lex(); // Eat the integer.
+ ImmDispToken.getLoc()));
+
if (getLexer().isNot(AsmToken::LBrac))
return ErrorOperand(Start, "Expected '[' token!");
return ParseIntelBracExpression(SegReg, Start, ImmDisp, Size);
@@ -1459,6 +1484,13 @@
if (getLexer().isNot(AsmToken::Colon))
return ErrorOperand(Start, "Expected ':' token!");
Parser.Lex(); // Eat :
+ if (getLexer().is(AsmToken::Integer)) {
+ int64_t ImmDisp = Tok.getIntVal();
+ AsmToken ImmDispToken = Parser.Lex(); // Eat the integer.
+ if (X86Operand *SegmentOffsetOp = CreateIntelSegmentOffset(
+ SegReg, ImmDisp, Start, ImmDispToken.getEndLoc(), Size))
+ return SegmentOffsetOp;
+ }
if (getLexer().isNot(AsmToken::LBrac))
return ErrorOperand(Start, "Expected '[' token!");
return ParseIntelBracExpression(SegReg, Start, ImmDisp, Size);
Index: test/MC/X86/intel-syntax.s
===================================================================
--- test/MC/X86/intel-syntax.s
+++ test/MC/X86/intel-syntax.s
@@ -63,6 +63,10 @@
mov ECX, DWORD PTR [4*ECX + _fnan]
// CHECK: movq %fs:320, %rax
mov RAX, QWORD PTR FS:[320]
+// CHECK: movq %fs:320, %rax
+ mov RAX, QWORD PTR FS:320
+// CHECK: movq %rax, %fs:320
+ mov QWORD PTR FS:320, RAX
// CHECK: vpgatherdd %xmm8, (%r15,%xmm9,2), %xmm1
vpgatherdd XMM10, DWORD PTR [R15 + 2*XMM9], XMM8
// CHECK: movsd -8, %xmm5
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D1470.3.patch
Type: text/x-patch
Size: 4097 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130826/6e5f0e94/attachment.bin>
More information about the llvm-commits
mailing list