[flang-commits] [flang] [flang] Fix for atand(Y, X), and implment atan2d(Y, X), atanpi(X), atanpi(Y, X), atan2pi(Y, X) (PR #79002)
via flang-commits
flang-commits at lists.llvm.org
Wed Jan 31 07:35:01 PST 2024
- Previous message: [flang-commits] [flang] [flang] Fix for atand(Y, X), and implment atan2d(Y, X), atanpi(X), atanpi(Y, X), atan2pi(Y, X) (PR #79002)
- Next message: [flang-commits] [flang] [flang] Fix for atand(Y, X), and implment atan2d(Y, X), atanpi(X), atanpi(Y, X), atan2pi(Y, X) (PR #79002)
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
================
@@ -2128,20 +2131,56 @@ IntrinsicLibrary::genAny(mlir::Type resultType,
return readAndAddCleanUp(resultMutableBox, resultType, "ANY");
}
+// ATAND, ATAN2D
mlir::Value IntrinsicLibrary::genAtand(mlir::Type resultType,
llvm::ArrayRef<mlir::Value> args) {
- assert(args.size() == 1);
+ // assert for: atand(X), atand(Y,X), atan2d(Y,X)
+ assert(args.size() >= 1 && args.size() <= 2);
+
mlir::MLIRContext *context = builder.getContext();
- mlir::FunctionType ftype =
- mlir::FunctionType::get(context, {resultType}, {args[0].getType()});
- mlir::Value atan = getRuntimeCallGenerator("atan", ftype)(builder, loc, args);
+ mlir::Value atan;
+
+ // atand(Y,X) atan2d(Y,X) == atan2(Y,X) * 180/pi
+ if (args.size() == 2) {
+ atan = builder.create<mlir::math::Atan2Op>(loc, fir::getBase(args[0]),
+ fir::getBase(args[1]));
+ } else {
+ mlir::FunctionType ftype =
+ mlir::FunctionType::get(context, {resultType}, {args[0].getType()});
+ atan = getRuntimeCallGenerator("atan", ftype)(builder, loc, args);
+ }
llvm::APFloat pi = llvm::APFloat(llvm::numbers::pi);
mlir::Value dfactor = builder.createRealConstant(
loc, mlir::FloatType::getF64(context), llvm::APFloat(180.0) / pi);
mlir::Value factor = builder.createConvert(loc, resultType, dfactor);
return builder.create<mlir::arith::MulFOp>(loc, atan, factor);
}
+// ATAN, ATAN2PI
+mlir::Value IntrinsicLibrary::genAtanpi(mlir::Type resultType,
+ llvm::ArrayRef<mlir::Value> args) {
+ // assert for: atanpi(X), atanpi(Y,X), atan2pi(Y,X)
+ assert(args.size() >= 1 && args.size() <= 2);
+
+ mlir::Value atan;
+ mlir::MLIRContext *context = builder.getContext();
+
+ // atanpi(Y,X) atan2pi(Y,X) == atan2(Y,X) / pi
+ if (args.size() == 2) {
+ atan = builder.create<mlir::math::Atan2Op>(loc, fir::getBase(args[0]),
+ fir::getBase(args[1]));
+ } else {
+ mlir::FunctionType ftype =
+ mlir::FunctionType::get(context, {resultType}, {args[0].getType()});
+ atan = getRuntimeCallGenerator("atan", ftype)(builder, loc, args);
+ }
+ llvm::APFloat pi = llvm::APFloat(llvm::numbers::pi);
+ mlir::Value dfactor =
+ builder.createRealConstant(loc, mlir::FloatType::getF64(context), pi);
+ mlir::Value factor = builder.createConvert(loc, resultType, dfactor);
+ return builder.create<mlir::arith::DivFOp>(loc, atan, factor);
----------------
jeanPerier wrote:
I think using `llvm::numbers::inv_pi` and a `MulFOp` is likely faster than using a DivFOp.
https://github.com/llvm/llvm-project/pull/79002
- Previous message: [flang-commits] [flang] [flang] Fix for atand(Y, X), and implment atan2d(Y, X), atanpi(X), atanpi(Y, X), atan2pi(Y, X) (PR #79002)
- Next message: [flang-commits] [flang] [flang] Fix for atand(Y, X), and implment atan2d(Y, X), atanpi(X), atanpi(Y, X), atan2pi(Y, X) (PR #79002)
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the flang-commits
mailing list