[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");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user