[llvm-commits] [llvm] r166632 - /llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
Eli Friedman
eli.friedman at gmail.com
Wed Oct 24 16:30:40 PDT 2012
On Wed, Oct 24, 2012 at 3:21 PM, Chad Rosier <mcrosier at apple.com> wrote:
> Author: mcrosier
> Date: Wed Oct 24 17:21:50 2012
> New Revision: 166632
>
> URL: http://llvm.org/viewvc/llvm-project?rev=166632&view=rev
> Log:
> [ms-inline asm] Add support for parsing the '.' operator. Given,
>
> [register].field
>
> The operator returns the value at the location pointed to by register plus the
> offset of field within its structure or union. This patch only handles
> immediate fields (i.e., [eax].4). The original displacement has to be a
> MCConstantExpr as well.
> Part of rdar://12470415 and rdar://12470514
>
>
> Modified:
> llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
>
> Modified: llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp?rev=166632&r1=166631&r2=166632&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp (original)
> +++ llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp Wed Oct 24 17:21:50 2012
> @@ -60,6 +60,8 @@
> X86Operand *ParseIntelBracExpression(unsigned SegReg, unsigned Size);
> X86Operand *ParseMemOperand(unsigned SegReg, SMLoc StartLoc);
>
> + const MCExpr *ParseIntelDotOperator(const MCExpr *Disp);
> +
> bool ParseDirectiveWord(unsigned Size, SMLoc L);
> bool ParseDirectiveCode(StringRef IDVal, SMLoc L);
>
> @@ -742,6 +744,11 @@
> Parser.Lex();
> End = Tok.getLoc();
>
> + if (Tok.getString().startswith("."))
> + Disp = ParseIntelDotOperator(Disp);
> +
> + End = Tok.getLoc();
> +
> // handle [-42]
> if (!BaseReg && !IndexReg)
> return X86Operand::CreateMem(Disp, Start, End, Size);
> @@ -801,6 +808,33 @@
> /*Scale*/1, Start, End, Size, NeedSizeDir);
> }
>
> +/// Parse the '.' operator.
> +const MCExpr *X86AsmParser::ParseIntelDotOperator(const MCExpr *Disp) {
> + AsmToken Tok = *&Parser.getTok();
> +
> + // Drop the '.'.
> + StringRef DotDispStr = Tok.getString().drop_front(1);
> +
> + Lex(); // Eat .field.
> +
> + // .Imm gets lexed as a real.
> + if (Tok.is(AsmToken::Real)) {
> + APInt DotDisp;
> + DotDispStr.getAsInteger(10, DotDisp);
> + uint64_t DotDispVal = DotDisp.getZExtValue();
> +
> + // Special case zero dot displacement.
> + if (!DotDispVal) return Disp;
> +
> + // FIXME: Handle non-constant expressions.
> + if (const MCConstantExpr *OrigDisp = dyn_cast<MCConstantExpr>(Disp)) {
> + uint64_t OrigDispVal = OrigDisp->getValue();
> + return MCConstantExpr::Create(OrigDispVal + DotDispVal, getContext());
> + }
> + }
> + return Disp;
> +}
Error handling?
-Eli
More information about the llvm-commits
mailing list