diff options
author | Alex Lorenz <arphaman@gmail.com> | 2015-07-31 20:49:21 +0000 |
---|---|---|
committer | Alex Lorenz <arphaman@gmail.com> | 2015-07-31 20:49:21 +0000 |
commit | ad156fb6af9f58c35357405b0ecd83a60185ed84 (patch) | |
tree | 0ae0c1cd07ced2376fdcd74321003d1987abe626 /llvm/lib/CodeGen/MIRParser/MILexer.cpp | |
parent | 375fa1381d5bd9c02895049bcc3390f5df29f55e (diff) | |
download | bcm5719-llvm-ad156fb6af9f58c35357405b0ecd83a60185ed84.tar.gz bcm5719-llvm-ad156fb6af9f58c35357405b0ecd83a60185ed84.zip |
MIR Serialization: Serialize the floating point immediate machine operands.
Reviewers: Duncan P. N. Exon Smith
llvm-svn: 243780
Diffstat (limited to 'llvm/lib/CodeGen/MIRParser/MILexer.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MIRParser/MILexer.cpp | 47 |
1 files changed, 45 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.cpp b/llvm/lib/CodeGen/MIRParser/MILexer.cpp index 3c0dc4c0ded..2104f002b1f 100644 --- a/llvm/lib/CodeGen/MIRParser/MILexer.cpp +++ b/llvm/lib/CodeGen/MIRParser/MILexer.cpp @@ -150,6 +150,12 @@ static MIToken::TokenKind getIdentifierKind(StringRef Identifier) { .Case(".cfi_def_cfa", MIToken::kw_cfi_def_cfa) .Case("blockaddress", MIToken::kw_blockaddress) .Case("target-index", MIToken::kw_target_index) + .Case("half", MIToken::kw_half) + .Case("float", MIToken::kw_float) + .Case("double", MIToken::kw_double) + .Case("x86_fp80", MIToken::kw_x86_fp80) + .Case("fp128", MIToken::kw_fp128) + .Case("ppc_fp128", MIToken::kw_ppc_fp128) .Default(MIToken::Identifier); } @@ -308,13 +314,48 @@ static Cursor maybeLexExternalSymbol( /*PrefixLength=*/1, ErrorCallback); } -static Cursor maybeLexIntegerLiteral(Cursor C, MIToken &Token) { +static bool isValidHexFloatingPointPrefix(char C) { + return C == 'H' || C == 'K' || C == 'L' || C == 'M'; +} + +static Cursor maybeLexHexFloatingPointLiteral(Cursor C, MIToken &Token) { + if (C.peek() != '0' || C.peek(1) != 'x') + return None; + Cursor Range = C; + C.advance(2); // Skip '0x' + if (isValidHexFloatingPointPrefix(C.peek())) + C.advance(); + while (isxdigit(C.peek())) + C.advance(); + Token = MIToken(MIToken::FloatingPointLiteral, Range.upto(C)); + return C; +} + +static Cursor lexFloatingPointLiteral(Cursor Range, Cursor C, MIToken &Token) { + C.advance(); + // Skip over [0-9]*([eE][-+]?[0-9]+)? + while (isdigit(C.peek())) + C.advance(); + if ((C.peek() == 'e' || C.peek() == 'E') && + (isdigit(C.peek(1)) || + ((C.peek(1) == '-' || C.peek(1) == '+') && isdigit(C.peek(2))))) { + C.advance(2); + while (isdigit(C.peek())) + C.advance(); + } + Token = MIToken(MIToken::FloatingPointLiteral, Range.upto(C)); + return C; +} + +static Cursor maybeLexNumericalLiteral(Cursor C, MIToken &Token) { if (!isdigit(C.peek()) && (C.peek() != '-' || !isdigit(C.peek(1)))) return None; auto Range = C; C.advance(); while (isdigit(C.peek())) C.advance(); + if (C.peek() == '.') + return lexFloatingPointLiteral(Range, C, Token); StringRef StrVal = Range.upto(C); Token = MIToken(MIToken::IntegerLiteral, StrVal, APSInt(StrVal)); return C; @@ -378,7 +419,9 @@ StringRef llvm::lexMIToken( return R.remaining(); if (Cursor R = maybeLexExternalSymbol(C, Token, ErrorCallback)) return R.remaining(); - if (Cursor R = maybeLexIntegerLiteral(C, Token)) + if (Cursor R = maybeLexHexFloatingPointLiteral(C, Token)) + return R.remaining(); + if (Cursor R = maybeLexNumericalLiteral(C, Token)) return R.remaining(); if (Cursor R = maybeLexSymbol(C, Token)) return R.remaining(); |