diff options
| author | Venkatraman Govindaraju <venkatra@cs.wisc.edu> | 2014-03-02 03:39:39 +0000 |
|---|---|---|
| committer | Venkatraman Govindaraju <venkatra@cs.wisc.edu> | 2014-03-02 03:39:39 +0000 |
| commit | 81aae572828077f54948b6dfdcab5003a4985ab9 (patch) | |
| tree | 07d11385b9accc78a79b1d1569f84e0288ecbc1f /llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp | |
| parent | 871171a25beb46d128e0a5713d8fff18516191e7 (diff) | |
| download | bcm5719-llvm-81aae572828077f54948b6dfdcab5003a4985ab9.tar.gz bcm5719-llvm-81aae572828077f54948b6dfdcab5003a4985ab9.zip | |
[Sparc] Add support for parsing fcmp with %fcc registers.
llvm-svn: 202610
Diffstat (limited to 'llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp')
| -rw-r--r-- | llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp b/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp index 65d9228ad94..9cbece93a3c 100644 --- a/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp +++ b/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp @@ -68,7 +68,8 @@ class SparcAsmParser : public MCTargetAsmParser { StringRef Name); OperandMatchResultTy - parseSparcAsmOperand(SparcOperand *&Operand, bool isCall = false); + parseSparcAsmOperand(SparcOperand *&Operand, bool isCall = false, + bool createTokenForFCC = true); OperandMatchResultTy parseBranchModifiers(SmallVectorImpl<MCParsedAsmOperand*> &Operands); @@ -631,7 +632,10 @@ parseOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands, } SparcOperand *Op = 0; - ResTy = parseSparcAsmOperand(Op, (Mnemonic == "call")); + + bool createTokenForFCC = !(Mnemonic == "fcmps" || Mnemonic == "fcmpd" + || Mnemonic == "fcmpq"); + ResTy = parseSparcAsmOperand(Op, (Mnemonic == "call"), createTokenForFCC); if (ResTy != MatchOperand_Success || !Op) return MatchOperand_ParseFail; @@ -642,7 +646,8 @@ parseOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands, } SparcAsmParser::OperandMatchResultTy -SparcAsmParser::parseSparcAsmOperand(SparcOperand *&Op, bool isCall) +SparcAsmParser::parseSparcAsmOperand(SparcOperand *&Op, bool isCall, + bool createTokenForFCC) { SMLoc S = Parser.getTok().getLoc(); @@ -677,9 +682,11 @@ SparcAsmParser::parseSparcAsmOperand(SparcOperand *&Op, bool isCall) break; case Sparc::FCC0: - assert(name == "fcc0" && "Cannot handle %fcc other than %fcc0 yet"); - Op = SparcOperand::CreateToken("%fcc0", S); - break; + if (createTokenForFCC) { + assert(name == "fcc0" && "Cannot handle %fcc other than %fcc0 yet"); + Op = SparcOperand::CreateToken("%fcc0", S); + break; + } } break; } @@ -783,7 +790,7 @@ bool SparcAsmParser::matchRegisterName(const AsmToken &Tok, && !name.substr(3).getAsInteger(10, intVal) && intVal < 4) { // FIXME: check 64bit and handle %fcc1 - %fcc3 - RegNo = Sparc::FCC0; + RegNo = Sparc::FCC0 + intVal; RegKind = SparcOperand::rk_CCReg; return true; } |

