diff options
Diffstat (limited to 'flang/lib/Optimizer/Builder/Runtime/Numeric.cpp')
| -rw-r--r-- | flang/lib/Optimizer/Builder/Runtime/Numeric.cpp | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/flang/lib/Optimizer/Builder/Runtime/Numeric.cpp b/flang/lib/Optimizer/Builder/Runtime/Numeric.cpp index 8ac9d64f576b..1d13248db598 100644 --- a/flang/lib/Optimizer/Builder/Runtime/Numeric.cpp +++ b/flang/lib/Optimizer/Builder/Runtime/Numeric.cpp @@ -22,6 +22,28 @@ using namespace Fortran::runtime; // may not have them in their runtime library. This can occur in the // case of cross compilation, for example. +/// Placeholder for real*10 version of ErfcScaled Intrinsic +struct ForcedErfcScaled10 { + static constexpr const char *name = ExpandAndQuoteKey(RTNAME(ErfcScaled10)); + static constexpr fir::runtime::FuncTypeBuilderFunc getTypeModel() { + return [](mlir::MLIRContext *ctx) { + auto ty = mlir::FloatType::getF80(ctx); + return mlir::FunctionType::get(ctx, {ty}, {ty}); + }; + } +}; + +/// Placeholder for real*16 version of ErfcScaled Intrinsic +struct ForcedErfcScaled16 { + static constexpr const char *name = ExpandAndQuoteKey(RTNAME(ErfcScaled16)); + static constexpr fir::runtime::FuncTypeBuilderFunc getTypeModel() { + return [](mlir::MLIRContext *ctx) { + auto ty = mlir::FloatType::getF128(ctx); + return mlir::FunctionType::get(ctx, {ty}, {ty}); + }; + } +}; + /// Placeholder for real*10 version of Exponent Intrinsic struct ForcedExponent10_4 { static constexpr const char *name = ExpandAndQuoteKey(RTNAME(Exponent10_4)); @@ -444,6 +466,30 @@ mlir::Value fir::runtime::genRRSpacing(fir::FirOpBuilder &builder, return builder.create<fir::CallOp>(loc, func, args).getResult(0); } +/// Generate call to ErfcScaled intrinsic runtime routine. +mlir::Value fir::runtime::genErfcScaled(fir::FirOpBuilder &builder, + mlir::Location loc, mlir::Value x) { + mlir::func::FuncOp func; + mlir::Type fltTy = x.getType(); + + if (fltTy.isF32()) + func = fir::runtime::getRuntimeFunc<mkRTKey(ErfcScaled4)>(loc, builder); + else if (fltTy.isF64()) + func = fir::runtime::getRuntimeFunc<mkRTKey(ErfcScaled8)>(loc, builder); + else if (fltTy.isF80()) + func = fir::runtime::getRuntimeFunc<ForcedErfcScaled10>(loc, builder); + else if (fltTy.isF128()) + func = fir::runtime::getRuntimeFunc<ForcedErfcScaled16>(loc, builder); + else + fir::intrinsicTypeTODO(builder, fltTy, loc, "ERFC_SCALED"); + + auto funcTy = func.getFunctionType(); + llvm::SmallVector<mlir::Value> args = { + builder.createConvert(loc, funcTy.getInput(0), x)}; + + return builder.create<fir::CallOp>(loc, func, args).getResult(0); +} + /// Generate call to Scale intrinsic runtime routine. mlir::Value fir::runtime::genScale(fir::FirOpBuilder &builder, mlir::Location loc, mlir::Value x, |
