https://github.com/c8ef created https://github.com/llvm/llvm-project/pull/150238
None >From 5f1e70f3486f5e66ff3db5bf3a56095632118d1d Mon Sep 17 00:00:00 2001 From: c8ef <c...@outlook.com> Date: Wed, 23 Jul 2025 15:20:37 +0000 Subject: [PATCH] [flang] Implement `asinpi` --- .../flang/Optimizer/Builder/IntrinsicCall.h | 1 + flang/lib/Evaluate/intrinsics.cpp | 1 + flang/lib/Optimizer/Builder/IntrinsicCall.cpp | 16 ++++++++++++ flang/test/Lower/Intrinsics/asinpi.f90 | 26 +++++++++++++++++++ 4 files changed, 44 insertions(+) create mode 100644 flang/test/Lower/Intrinsics/asinpi.f90 diff --git a/flang/include/flang/Optimizer/Builder/IntrinsicCall.h b/flang/include/flang/Optimizer/Builder/IntrinsicCall.h index a93b397240576..2afd50410ae82 100644 --- a/flang/include/flang/Optimizer/Builder/IntrinsicCall.h +++ b/flang/include/flang/Optimizer/Builder/IntrinsicCall.h @@ -204,6 +204,7 @@ struct IntrinsicLibrary { fir::ExtendedValue genCommandArgumentCount(mlir::Type, llvm::ArrayRef<fir::ExtendedValue>); mlir::Value genAsind(mlir::Type, llvm::ArrayRef<mlir::Value>); + mlir::Value genAsinpi(mlir::Type, llvm::ArrayRef<mlir::Value>); fir::ExtendedValue genAssociated(mlir::Type, llvm::ArrayRef<fir::ExtendedValue>); mlir::Value genAtand(mlir::Type, llvm::ArrayRef<mlir::Value>); diff --git a/flang/lib/Evaluate/intrinsics.cpp b/flang/lib/Evaluate/intrinsics.cpp index 97e87935c02b0..768e4bafa90ee 100644 --- a/flang/lib/Evaluate/intrinsics.cpp +++ b/flang/lib/Evaluate/intrinsics.cpp @@ -359,6 +359,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{ {"asin", {{"x", SameFloating}}, SameFloating}, {"asind", {{"x", SameFloating}}, SameFloating}, {"asinh", {{"x", SameFloating}}, SameFloating}, + {"asinpi", {{"x", SameFloating}}, SameFloating}, {"associated", {{"pointer", AnyPointer, Rank::anyOrAssumedRank, Optionality::required, common::Intent::In, {ArgFlag::canBeNullPointer}}, diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp index f3af423b24685..4753d0add6787 100644 --- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp +++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp @@ -279,6 +279,7 @@ static constexpr IntrinsicHandler handlers[]{ {{{"mask", asValue}, {"pred", asValue}}}, /*isElemental=*/false}, {"asind", &I::genAsind}, + {"asinpi", &I::genAsinpi}, {"associated", &I::genAssociated, {{{"pointer", asInquired}, {"target", asInquired}}}, @@ -2845,6 +2846,21 @@ mlir::Value IntrinsicLibrary::genAsind(mlir::Type resultType, return mlir::arith::MulFOp::create(builder, loc, result, factor); } +// ASINPI +mlir::Value IntrinsicLibrary::genAsinpi(mlir::Type resultType, + llvm::ArrayRef<mlir::Value> args) { + assert(args.size() == 1); + mlir::MLIRContext *context = builder.getContext(); + mlir::FunctionType ftype = + mlir::FunctionType::get(context, {resultType}, {args[0].getType()}); + mlir::Value asin = getRuntimeCallGenerator("asin", ftype)(builder, loc, args); + llvm::APFloat inv_pi = llvm::APFloat(llvm::numbers::inv_pi); + mlir::Value dfactor = + builder.createRealConstant(loc, mlir::Float64Type::get(context), inv_pi); + mlir::Value factor = builder.createConvert(loc, resultType, dfactor); + return mlir::arith::MulFOp::create(builder, loc, asin, factor); +} + // ATAND, ATAN2D mlir::Value IntrinsicLibrary::genAtand(mlir::Type resultType, llvm::ArrayRef<mlir::Value> args) { diff --git a/flang/test/Lower/Intrinsics/asinpi.f90 b/flang/test/Lower/Intrinsics/asinpi.f90 new file mode 100644 index 0000000000000..1c1838c56ca27 --- /dev/null +++ b/flang/test/Lower/Intrinsics/asinpi.f90 @@ -0,0 +1,26 @@ +! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s --check-prefixes="CHECK,CHECK-FAST" +! RUN: bbc --math-runtime=precise -emit-fir -hlfir=false %s -o - | FileCheck %s --check-prefixes="CHECK,CHECK-PRECISE" +! RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir %s -o - | FileCheck %s --check-prefixes="CHECK,CHECK-FAST" + +function test_real4(x) + real :: x, test_real4 + test_real4 = asinpi(x) +end function + +! CHECK-LABEL: @_QPtest_real4 +! CHECK-PRECISE: %[[asin:.*]] = fir.call @asinf({{%[A-Za-z0-9._]+}}) fastmath<contract> : (f32) -> f32 +! CHECK-FAST: %[[asin:.*]] = math.asin %{{.*}} : f32 +! CHECK: %[[dpi:.*]] = arith.constant 0.31830988618379069 : f64 +! CHECK: %[[inv_pi:.*]] = fir.convert %[[dpi]] : (f64) -> f32 +! CHECK: %{{.*}} = arith.mulf %[[asin]], %[[inv_pi]] fastmath<contract> : f32 + +function test_real8(x) + real(8) :: x, test_real8 + test_real8 = asinpi(x) +end function + +! CHECK-LABEL: @_QPtest_real8 +! CHECK-PRECISE: %[[asin:.*]] = fir.call @asin({{%[A-Za-z0-9._]+}}) fastmath<contract> : (f64) -> f64 +! CHECK-FAST: %[[asin:.*]] = math.asin %{{.*}} : f64 +! CHECK: %[[inv_pi:.*]] = arith.constant 0.31830988618379069 : f64 +! CHECK: %{{.*}} = arith.mulf %[[asin]], %[[inv_pi]] fastmath<contract> : f64 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits