diff options
author | Wouter van Oortmerssen <aardappel@gmail.com> | 2019-07-11 18:18:07 +0000 |
---|---|---|
committer | Wouter van Oortmerssen <aardappel@gmail.com> | 2019-07-11 18:18:07 +0000 |
commit | a617967d68770643a18c26714c5c113927be8a0b (patch) | |
tree | a96ebc5c81ac31566dd72fb4514d75b727f2059e /llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp | |
parent | af3dc759e786324c8a38fa7849da0791b99e67b0 (diff) | |
download | llvm-a617967d68770643a18c26714c5c113927be8a0b.zip llvm-a617967d68770643a18c26714c5c113927be8a0b.tar.gz llvm-a617967d68770643a18c26714c5c113927be8a0b.tar.bz2 |
[WebAssembly] Assembler: support negative float constants.
Reviewers: dschuff
Subscribers: sbc100, jgravelle-google, aheejin, sunfish, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D64367
llvm-svn: 365802
Diffstat (limited to 'llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp')
-rw-r--r-- | llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp | 39 |
1 files changed, 27 insertions, 12 deletions
diff --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp index c7a8890..e829235 100644 --- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp +++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp @@ -349,6 +349,20 @@ public: Parser.Lex(); } + bool parseSingleFloat(bool IsNegative, OperandVector &Operands) { + auto &Flt = Lexer.getTok(); + double Val; + if (Flt.getString().getAsDouble(Val, false)) + return error("Cannot parse real: ", Flt); + if (IsNegative) + Val = -Val; + Operands.push_back(make_unique<WebAssemblyOperand>( + WebAssemblyOperand::Float, Flt.getLoc(), Flt.getEndLoc(), + WebAssemblyOperand::FltOp{Val})); + Parser.Lex(); + return false; + } + bool checkForP2AlignIfLoadStore(OperandVector &Operands, StringRef InstName) { // FIXME: there is probably a cleaner way to do this. auto IsLoadStore = InstName.find(".load") != StringRef::npos || @@ -486,11 +500,17 @@ public: } case AsmToken::Minus: Parser.Lex(); - if (Lexer.isNot(AsmToken::Integer)) - return error("Expected integer instead got: ", Lexer.getTok()); - parseSingleInteger(true, Operands); - if (checkForP2AlignIfLoadStore(Operands, Name)) - return true; + if (Lexer.is(AsmToken::Integer)) { + parseSingleInteger(true, Operands); + if (checkForP2AlignIfLoadStore(Operands, Name)) + return true; + } else if(Lexer.is(AsmToken::Real)) { + if (parseSingleFloat(true, Operands)) + return true; + } else { + return error("Expected numeric constant instead got: ", + Lexer.getTok()); + } break; case AsmToken::Integer: parseSingleInteger(false, Operands); @@ -498,13 +518,8 @@ public: return true; break; case AsmToken::Real: { - double Val; - if (Tok.getString().getAsDouble(Val, false)) - return error("Cannot parse real: ", Tok); - Operands.push_back(make_unique<WebAssemblyOperand>( - WebAssemblyOperand::Float, Tok.getLoc(), Tok.getEndLoc(), - WebAssemblyOperand::FltOp{Val})); - Parser.Lex(); + if (parseSingleFloat(false, Operands)) + return true; break; } case AsmToken::LCurly: { |