mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2026-07-18 13:15:38 -04:00
[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
This commit is contained in:
@@ -1720,6 +1720,9 @@ Error BitcodeReader::parseTypeTableBody() {
|
||||
case bitc::TYPE_CODE_HALF: // HALF
|
||||
ResultTy = Type::getHalfTy(Context);
|
||||
break;
|
||||
case bitc::TYPE_CODE_BFLOAT: // BFLOAT
|
||||
ResultTy = Type::getBFloatTy(Context);
|
||||
break;
|
||||
case bitc::TYPE_CODE_FLOAT: // FLOAT
|
||||
ResultTy = Type::getFloatTy(Context);
|
||||
break;
|
||||
@@ -2429,6 +2432,9 @@ Error BitcodeReader::parseConstants() {
|
||||
if (CurTy->isHalfTy())
|
||||
V = ConstantFP::get(Context, APFloat(APFloat::IEEEhalf(),
|
||||
APInt(16, (uint16_t)Record[0])));
|
||||
else if (CurTy->isBFloatTy())
|
||||
V = ConstantFP::get(Context, APFloat(APFloat::BFloat(),
|
||||
APInt(16, (uint32_t)Record[0])));
|
||||
else if (CurTy->isFloatTy())
|
||||
V = ConstantFP::get(Context, APFloat(APFloat::IEEEsingle(),
|
||||
APInt(32, (uint32_t)Record[0])));
|
||||
@@ -2526,21 +2532,27 @@ Error BitcodeReader::parseConstants() {
|
||||
} else if (EltTy->isHalfTy()) {
|
||||
SmallVector<uint16_t, 16> Elts(Record.begin(), Record.end());
|
||||
if (isa<VectorType>(CurTy))
|
||||
V = ConstantDataVector::getFP(Context, Elts);
|
||||
V = ConstantDataVector::getFP(EltTy, Elts);
|
||||
else
|
||||
V = ConstantDataArray::getFP(Context, Elts);
|
||||
V = ConstantDataArray::getFP(EltTy, Elts);
|
||||
} else if (EltTy->isBFloatTy()) {
|
||||
SmallVector<uint16_t, 16> Elts(Record.begin(), Record.end());
|
||||
if (isa<VectorType>(CurTy))
|
||||
V = ConstantDataVector::getFP(EltTy, Elts);
|
||||
else
|
||||
V = ConstantDataArray::getFP(EltTy, Elts);
|
||||
} else if (EltTy->isFloatTy()) {
|
||||
SmallVector<uint32_t, 16> Elts(Record.begin(), Record.end());
|
||||
if (isa<VectorType>(CurTy))
|
||||
V = ConstantDataVector::getFP(Context, Elts);
|
||||
V = ConstantDataVector::getFP(EltTy, Elts);
|
||||
else
|
||||
V = ConstantDataArray::getFP(Context, Elts);
|
||||
V = ConstantDataArray::getFP(EltTy, Elts);
|
||||
} else if (EltTy->isDoubleTy()) {
|
||||
SmallVector<uint64_t, 16> Elts(Record.begin(), Record.end());
|
||||
if (isa<VectorType>(CurTy))
|
||||
V = ConstantDataVector::getFP(Context, Elts);
|
||||
V = ConstantDataVector::getFP(EltTy, Elts);
|
||||
else
|
||||
V = ConstantDataArray::getFP(Context, Elts);
|
||||
V = ConstantDataArray::getFP(EltTy, Elts);
|
||||
} else {
|
||||
return error("Invalid type for value");
|
||||
}
|
||||
|
||||
@@ -881,6 +881,7 @@ void ModuleBitcodeWriter::writeTypeTable() {
|
||||
switch (T->getTypeID()) {
|
||||
case Type::VoidTyID: Code = bitc::TYPE_CODE_VOID; break;
|
||||
case Type::HalfTyID: Code = bitc::TYPE_CODE_HALF; break;
|
||||
case Type::BFloatTyID: Code = bitc::TYPE_CODE_BFLOAT; break;
|
||||
case Type::FloatTyID: Code = bitc::TYPE_CODE_FLOAT; break;
|
||||
case Type::DoubleTyID: Code = bitc::TYPE_CODE_DOUBLE; break;
|
||||
case Type::X86_FP80TyID: Code = bitc::TYPE_CODE_X86_FP80; break;
|
||||
@@ -2387,7 +2388,8 @@ void ModuleBitcodeWriter::writeConstants(unsigned FirstVal, unsigned LastVal,
|
||||
} else if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C)) {
|
||||
Code = bitc::CST_CODE_FLOAT;
|
||||
Type *Ty = CFP->getType();
|
||||
if (Ty->isHalfTy() || Ty->isFloatTy() || Ty->isDoubleTy()) {
|
||||
if (Ty->isHalfTy() || Ty->isBFloatTy() || Ty->isFloatTy() ||
|
||||
Ty->isDoubleTy()) {
|
||||
Record.push_back(CFP->getValueAPF().bitcastToAPInt().getZExtValue());
|
||||
} else if (Ty->isX86_FP80Ty()) {
|
||||
// api needed to prevent premature destruction
|
||||
|
||||
Reference in New Issue
Block a user