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 | |
| parent | af3dc759e786324c8a38fa7849da0791b99e67b0 (diff) | |
| download | bcm5719-llvm-a617967d68770643a18c26714c5c113927be8a0b.tar.gz bcm5719-llvm-a617967d68770643a18c26714c5c113927be8a0b.zip | |
[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')
| -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 c7a88906019..e82923519f4 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: { | 

