llvm::Type *getUnderlyingType() const;
/// Utilities to identify types.
+ bool isBFloatTy() { return getUnderlyingType()->isBFloatTy(); }
bool isHalfTy() { return getUnderlyingType()->isHalfTy(); }
bool isFloatTy() { return getUnderlyingType()->isFloatTy(); }
bool isDoubleTy() { return getUnderlyingType()->isDoubleTy(); }
/// Utilities used to generate floating point types.
static LLVMType getDoubleTy(LLVMDialect *dialect);
static LLVMType getFloatTy(LLVMDialect *dialect);
+ static LLVMType getBFloatTy(LLVMDialect *dialect);
static LLVMType getHalfTy(LLVMDialect *dialect);
static LLVMType getFP128Ty(LLVMDialect *dialect);
static LLVMType getX86_FP80Ty(LLVMDialect *dialect);
if (auto llvmType = type.dyn_cast<LLVM::LLVMType>()) {
if (llvmType.isVectorTy())
llvmType = llvmType.getVectorElementType();
- if (llvmType.isIntegerTy() || llvmType.isHalfTy() ||
- llvmType.isFloatTy() || llvmType.isDoubleTy()) {
+ if (llvmType.isIntegerTy() || llvmType.isBFloatTy() ||
+ llvmType.isHalfTy() || llvmType.isFloatTy() ||
+ llvmType.isDoubleTy()) {
return success();
}
return op.emitOpError("type must be non-index integer types, float "
} else if (op.bin_op() == AtomicBinOp::xchg) {
if (!valType.isIntegerTy(8) && !valType.isIntegerTy(16) &&
!valType.isIntegerTy(32) && !valType.isIntegerTy(64) &&
- !valType.isHalfTy() && !valType.isFloatTy() && !valType.isDoubleTy())
+ !valType.isBFloatTy() && !valType.isHalfTy() && !valType.isFloatTy() &&
+ !valType.isDoubleTy())
return op.emitOpError("unexpected LLVM IR type for 'xchg' bin_op");
} else {
if (!valType.isIntegerTy(8) && !valType.isIntegerTy(16) &&
"match type for all other operands");
if (!valType.isPointerTy() && !valType.isIntegerTy(8) &&
!valType.isIntegerTy(16) && !valType.isIntegerTy(32) &&
- !valType.isIntegerTy(64) && !valType.isHalfTy() && !valType.isFloatTy() &&
- !valType.isDoubleTy())
+ !valType.isIntegerTy(64) && !valType.isBFloatTy() &&
+ !valType.isHalfTy() && !valType.isFloatTy() && !valType.isDoubleTy())
return op.emitOpError("unexpected LLVM IR type");
if (op.success_ordering() < AtomicOrdering::monotonic ||
op.failure_ordering() < AtomicOrdering::monotonic)
/// A set of LLVMTypes that are cached on construction to avoid any lookups or
/// locking.
LLVMType int1Ty, int8Ty, int16Ty, int32Ty, int64Ty, int128Ty;
- LLVMType doubleTy, floatTy, halfTy, fp128Ty, x86_fp80Ty;
+ LLVMType doubleTy, floatTy, bfloatTy, halfTy, fp128Ty, x86_fp80Ty;
LLVMType voidTy;
/// A smart mutex to lock access to the llvm context. Unlike MLIR, LLVM is not
/// Float Types.
impl->doubleTy = LLVMType::get(context, llvm::Type::getDoubleTy(llvmContext));
impl->floatTy = LLVMType::get(context, llvm::Type::getFloatTy(llvmContext));
+ impl->bfloatTy = LLVMType::get(context, llvm::Type::getBFloatTy(llvmContext));
impl->halfTy = LLVMType::get(context, llvm::Type::getHalfTy(llvmContext));
impl->fp128Ty = LLVMType::get(context, llvm::Type::getFP128Ty(llvmContext));
impl->x86_fp80Ty =
LLVMType LLVMType::getFloatTy(LLVMDialect *dialect) {
return dialect->impl->floatTy;
}
+LLVMType LLVMType::getBFloatTy(LLVMDialect *dialect) {
+ return dialect->impl->bfloatTy;
+}
LLVMType LLVMType::getHalfTy(LLVMDialect *dialect) {
return dialect->impl->halfTy;
}