diff options
author | Ties Stuij <ties.stuij@arm.com> | 2020-03-31 23:49:38 +0100 |
---|---|---|
committer | Ties Stuij <ties.stuij@arm.com> | 2020-05-15 14:43:43 +0100 |
commit | 8c24f33158d81d5f4b0c5d27c2f07396f0f1484b (patch) | |
tree | b78f8dec4d437ddaad0c62f98ef087f19da271bf /llvm/lib/AsmParser/LLLexer.cpp | |
parent | 7063a83a7cca45a9b12a7e447c90abe681f6ebaf (diff) | |
download | llvm-8c24f33158d81d5f4b0c5d27c2f07396f0f1484b.zip llvm-8c24f33158d81d5f4b0c5d27c2f07396f0f1484b.tar.gz llvm-8c24f33158d81d5f4b0c5d27c2f07396f0f1484b.tar.bz2 |
[IR][BFloat] Add BFloat IR type
Summary:
The BFloat IR type is introduced to provide support for, initially, the BFloat16
datatype introduced with the Armv8.6 architecture (optional from Armv8.2
onwards). It has an 8-bit exponent and a 7-bit mantissa and behaves like an IEEE
754 floating point IR type.
This is part of a patch series upstreaming Armv8.6 features. Subsequent patches
will upstream intrinsics support and C-lang support for BFloat.
Reviewers: SjoerdMeijer, rjmccall, rsmith, liutianle, RKSimon, craig.topper, jfb, LukeGeeson, sdesmalen, deadalnix, ctetreau
Subscribers: hiraditya, llvm-commits, danielkiss, arphaman, kristof.beyls, dexonsmith
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D78190
Diffstat (limited to 'llvm/lib/AsmParser/LLLexer.cpp')
-rw-r--r-- | llvm/lib/AsmParser/LLLexer.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/llvm/lib/AsmParser/LLLexer.cpp b/llvm/lib/AsmParser/LLLexer.cpp index 06631fc..eb85ef7 100644 --- a/llvm/lib/AsmParser/LLLexer.cpp +++ b/llvm/lib/AsmParser/LLLexer.cpp @@ -820,6 +820,7 @@ lltok::Kind LLLexer::LexIdentifier() { TYPEKEYWORD("void", Type::getVoidTy(Context)); TYPEKEYWORD("half", Type::getHalfTy(Context)); + TYPEKEYWORD("bfloat", Type::getBFloatTy(Context)); TYPEKEYWORD("float", Type::getFloatTy(Context)); TYPEKEYWORD("double", Type::getDoubleTy(Context)); TYPEKEYWORD("x86_fp80", Type::getX86_FP80Ty(Context)); @@ -985,11 +986,13 @@ lltok::Kind LLLexer::LexIdentifier() { /// HexFP128Constant 0xL[0-9A-Fa-f]+ /// HexPPC128Constant 0xM[0-9A-Fa-f]+ /// HexHalfConstant 0xH[0-9A-Fa-f]+ +/// HexBFloatConstant 0xR[0-9A-Fa-f]+ lltok::Kind LLLexer::Lex0x() { CurPtr = TokStart + 2; char Kind; - if ((CurPtr[0] >= 'K' && CurPtr[0] <= 'M') || CurPtr[0] == 'H') { + if ((CurPtr[0] >= 'K' && CurPtr[0] <= 'M') || CurPtr[0] == 'H' || + CurPtr[0] == 'R') { Kind = *CurPtr++; } else { Kind = 'J'; @@ -1007,7 +1010,7 @@ lltok::Kind LLLexer::Lex0x() { if (Kind == 'J') { // HexFPConstant - Floating point constant represented in IEEE format as a // hexadecimal number for when exponential notation is not precise enough. - // Half, Float, and double only. + // Half, BFloat, Float, and double only. APFloatVal = APFloat(APFloat::IEEEdouble(), APInt(64, HexIntToVal(TokStart + 2, CurPtr))); return lltok::APFloat; @@ -1035,6 +1038,11 @@ lltok::Kind LLLexer::Lex0x() { APFloatVal = APFloat(APFloat::IEEEhalf(), APInt(16,HexIntToVal(TokStart+3, CurPtr))); return lltok::APFloat; + case 'R': + // Brain floating point + APFloatVal = APFloat(APFloat::BFloat(), + APInt(16, HexIntToVal(TokStart + 3, CurPtr))); + return lltok::APFloat; } } |