diff options
author | Chris Lattner <sabre@nondot.org> | 2010-09-29 01:50:45 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-09-29 01:50:45 +0000 |
commit | 7c51a3172cf5104ebeaef22f1366fa634ca00d85 (patch) | |
tree | 4bd279eda0304c769d2eb9f971a5757e8861bace /lib | |
parent | 7036f8be4df8a1a830ca01afe9497b035a5647d6 (diff) | |
download | llvm-7c51a3172cf5104ebeaef22f1366fa634ca00d85.tar.gz llvm-7c51a3172cf5104ebeaef22f1366fa634ca00d85.tar.bz2 llvm-7c51a3172cf5104ebeaef22f1366fa634ca00d85.tar.xz |
implement rdar://8456378 and PR7557 - support for the fstsw,
an instruction that requires a WHOLE NEW wonderful kind of alias.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115015 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 4 | ||||
-rw-r--r-- | lib/Target/X86/AsmParser/X86AsmParser.cpp | 21 |
2 files changed, 18 insertions, 7 deletions
diff --git a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index 6eb564bc56..95b57f3471 100644 --- a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -81,8 +81,8 @@ private: bool ParseDirectiveSyntax(SMLoc L); bool MatchAndEmitInstruction(SMLoc IDLoc, - const SmallVectorImpl<MCParsedAsmOperand*> &Operands, - MCStreamer &Out) { + SmallVectorImpl<MCParsedAsmOperand*> &Operands, + MCStreamer &Out) { MCInst Inst; unsigned ErrorInfo; if (MatchInstructionImpl(Operands, Inst, ErrorInfo) == Match_Success) { diff --git a/lib/Target/X86/AsmParser/X86AsmParser.cpp b/lib/Target/X86/AsmParser/X86AsmParser.cpp index 012288a144..c8b25cea30 100644 --- a/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -52,7 +52,7 @@ private: bool ParseDirectiveWord(unsigned Size, SMLoc L); bool MatchAndEmitInstruction(SMLoc IDLoc, - const SmallVectorImpl<MCParsedAsmOperand*> &Operands, + SmallVectorImpl<MCParsedAsmOperand*> &Operands, MCStreamer &Out); /// @name Auto-generated Matcher Functions @@ -1109,10 +1109,24 @@ bool X86ATTAsmParser::ParseDirectiveWord(unsigned Size, SMLoc L) { bool X86ATTAsmParser:: MatchAndEmitInstruction(SMLoc IDLoc, - const SmallVectorImpl<MCParsedAsmOperand*> &Operands, + SmallVectorImpl<MCParsedAsmOperand*> &Operands, MCStreamer &Out) { assert(!Operands.empty() && "Unexpect empty operand list!"); + X86Operand *Op = static_cast<X86Operand*>(Operands[0]); + assert(Op->isToken() && "Leading operand should always be a mnemonic!"); + + // First, handle aliases that expand to multiple instructions. + // FIXME: This should be replaced with a real .td file alias mechanism. + if (Op->getToken() == "fstsw") { + MCInst Inst; + Inst.setOpcode(X86::WAIT); + Out.EmitInstruction(Inst); + delete Operands[0]; + Operands[0] = X86Operand::CreateToken("fnstsw", IDLoc); + } + + bool WasOriginallyInvalidOperand = false; unsigned OrigErrorInfo; MCInst Inst; @@ -1136,9 +1150,6 @@ MatchAndEmitInstruction(SMLoc IDLoc, // valid prefixes, and we could just infer the right unambiguous // type. However, that requires substantially more matcher support than the // following hack. - - X86Operand *Op = static_cast<X86Operand*>(Operands[0]); - assert(Op->isToken() && "Leading operand should always be a mnemonic!"); // Change the operand to point to a temporary token. StringRef Base = Op->getToken(); |