diff --git a/include/llvm/MC/MCParser/MCParsedAsmOperand.h b/include/llvm/MC/MCParser/MCParsedAsmOperand.h index 0ce32d617ef..06e9dc90652 100644 --- a/include/llvm/MC/MCParser/MCParsedAsmOperand.h +++ b/include/llvm/MC/MCParser/MCParsedAsmOperand.h @@ -34,6 +34,13 @@ public: /// isMem - Is this a memory operand? virtual bool isMem() const = 0; + /// isMSAsmWildcard - Is this a wildcard operand? This is specific to + /// MS-style inline assembly and should never happen in normal assembly. + virtual bool isMSAsmWildcard() const { return false; } + + /// setMSAsmWildcard - Convert the operand into a wildcard. + virtual void setMSAsmWildcard(unsigned Size) { } + /// getStartLoc - Get the location of the first token of this operand. virtual SMLoc getStartLoc() const = 0; /// getEndLoc - Get the location of the last token of this operand. diff --git a/lib/Target/X86/AsmParser/X86AsmParser.cpp b/lib/Target/X86/AsmParser/X86AsmParser.cpp index 704d5f94261..2f78b16e445 100644 --- a/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -158,7 +158,8 @@ struct X86Operand : public MCParsedAsmOperand { Token, Register, Immediate, - Memory + Memory, + MSAsmWildcard } Kind; SMLoc StartLoc, EndLoc; @@ -185,6 +186,10 @@ struct X86Operand : public MCParsedAsmOperand { unsigned Scale; unsigned Size; } Mem; + + struct { + unsigned Size; + } MSAsm; }; X86Operand(KindTy K, SMLoc Start, SMLoc End) @@ -318,25 +323,32 @@ struct X86Operand : public MCParsedAsmOperand { bool isMem() const { return Kind == Memory; } bool isMem8() const { - return Kind == Memory && (!Mem.Size || Mem.Size == 8); + return (Kind == Memory && (!Mem.Size || Mem.Size == 8)) || + (Kind == MSAsmWildcard && MSAsm.Size == 8); } bool isMem16() const { - return Kind == Memory && (!Mem.Size || Mem.Size == 16); + return (Kind == Memory && (!Mem.Size || Mem.Size == 16)) || + (Kind == MSAsmWildcard && MSAsm.Size == 16); } bool isMem32() const { - return Kind == Memory && (!Mem.Size || Mem.Size == 32); + return (Kind == Memory && (!Mem.Size || Mem.Size == 32)) || + (Kind == MSAsmWildcard && MSAsm.Size == 32); } bool isMem64() const { - return Kind == Memory && (!Mem.Size || Mem.Size == 64); + return (Kind == Memory && (!Mem.Size || Mem.Size == 64)) || + (Kind == MSAsmWildcard && MSAsm.Size == 64); } bool isMem80() const { - return Kind == Memory && (!Mem.Size || Mem.Size == 80); + return (Kind == Memory && (!Mem.Size || Mem.Size == 80)) || + (Kind == MSAsmWildcard && MSAsm.Size == 80); } bool isMem128() const { - return Kind == Memory && (!Mem.Size || Mem.Size == 128); + return (Kind == Memory && (!Mem.Size || Mem.Size == 128)) || + (Kind == MSAsmWildcard && MSAsm.Size == 128); } bool isMem256() const { - return Kind == Memory && (!Mem.Size || Mem.Size == 256); + return (Kind == Memory && (!Mem.Size || Mem.Size == 256)) || + (Kind == MSAsmWildcard && MSAsm.Size == 256); } bool isMemVX32() const { @@ -363,6 +375,12 @@ struct X86Operand : public MCParsedAsmOperand { bool isReg() const { return Kind == Register; } + bool isMSAsmWildcard() const { return Kind == MSAsmWildcard; } + void setMSAsmWildcard(unsigned Size) { + Kind = MSAsmWildcard; + this->MSAsm.Size = Size; + } + void addExpr(MCInst &Inst, const MCExpr *Expr) const { // Add as immediates when possible. if (const MCConstantExpr *CE = dyn_cast(Expr))