[clang] [llvm] [WIP] Add initial support for arc hyperbolic intrinsics (PR #106766)
Simon Pilgrim via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 30 10:35:25 PDT 2024
https://github.com/RKSimon created https://github.com/llvm/llvm-project/pull/106766
None
>From 6567d4b48c492a054fcbbfb0f0826d32bbb29404 Mon Sep 17 00:00:00 2001
From: Simon Pilgrim <llvm-dev at redking.me.uk>
Date: Fri, 30 Aug 2024 18:34:27 +0100
Subject: [PATCH] [WIP] Add initial support for arc hyperbolic intrinsics
---
clang/include/clang/Basic/Builtins.td | 18 ++---
clang/lib/CodeGen/CGBuiltin.cpp | 33 +++++++++
llvm/include/llvm/CodeGen/BasicTTIImpl.h | 9 +++
llvm/include/llvm/CodeGen/ISDOpcodes.h | 6 ++
llvm/include/llvm/IR/Intrinsics.td | 15 ++++
llvm/include/llvm/IR/RuntimeLibcalls.def | 15 ++++
llvm/include/llvm/Support/TargetOpcodes.def | 9 +++
llvm/include/llvm/Target/GenericOpcodes.td | 21 ++++++
.../Target/GlobalISel/SelectionDAGCompat.td | 3 +
.../include/llvm/Target/TargetSelectionDAG.td | 3 +
llvm/lib/Analysis/VectorUtils.cpp | 3 +
llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 6 ++
llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 20 ++++++
.../SelectionDAG/LegalizeFloatTypes.cpp | 70 ++++++++++++++++++-
llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h | 6 ++
.../SelectionDAG/LegalizeVectorOps.cpp | 3 +
.../SelectionDAG/LegalizeVectorTypes.cpp | 9 +++
.../lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 3 +
.../SelectionDAG/SelectionDAGBuilder.cpp | 24 +++++++
.../SelectionDAG/SelectionDAGDumper.cpp | 6 ++
llvm/lib/CodeGen/TargetLoweringBase.cpp | 17 +++--
.../Target/AArch64/AArch64ISelLowering.cpp | 25 +++----
llvm/lib/Target/X86/X86ISelLowering.cpp | 3 +
23 files changed, 297 insertions(+), 30 deletions(-)
diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td
index 8668b25661dec8..50e3da1f8c3849 100644
--- a/clang/include/clang/Basic/Builtins.td
+++ b/clang/include/clang/Basic/Builtins.td
@@ -90,11 +90,11 @@ def AcosF16F128 : Builtin, F16F128MathTemplate {
let Prototype = "T(T)";
}
-def AcoshF128 : Builtin {
- let Spellings = ["__builtin_acoshf128"];
+def AcoshF16F128 : Builtin, F16F128MathTemplate {
+ let Spellings = ["__builtin_acosh"];
let Attributes = [FunctionWithBuiltinPrefix, NoThrow,
ConstIgnoringErrnoAndExceptions];
- let Prototype = "__float128(__float128)";
+ let Prototype = "T(T)";
}
def AsinF16F128 : Builtin, F16F128MathTemplate {
@@ -104,11 +104,11 @@ def AsinF16F128 : Builtin, F16F128MathTemplate {
let Prototype = "T(T)";
}
-def AsinhF128 : Builtin {
- let Spellings = ["__builtin_asinhf128"];
+def AsinhF16F128 : Builtin, F16F128MathTemplate {
+ let Spellings = ["__builtin_asinh"];
let Attributes = [FunctionWithBuiltinPrefix, NoThrow,
ConstIgnoringErrnoAndExceptions];
- let Prototype = "__float128(__float128)";
+ let Prototype = "T(T)";
}
def AtanF16F128 : Builtin, F16F128MathTemplate {
@@ -118,11 +118,11 @@ def AtanF16F128 : Builtin, F16F128MathTemplate {
let Prototype = "T(T)";
}
-def AtanhF128 : Builtin {
- let Spellings = ["__builtin_atanhf128"];
+def AtanhF16F128 : Builtin, F16F128MathTemplate {
+ let Spellings = ["__builtin_atanh"];
let Attributes = [FunctionWithBuiltinPrefix, NoThrow,
ConstIgnoringErrnoAndExceptions];
- let Prototype = "__float128(__float128)";
+ let Prototype = "T(T)";
}
def CbrtF128 : Builtin {
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index c9f21f9ded24f4..0a683b13dd53c1 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -2670,6 +2670,17 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(
*this, E, Intrinsic::acos, Intrinsic::experimental_constrained_acos));
+ case Builtin::BIacosh:
+ case Builtin::BIacoshf:
+ case Builtin::BIacoshl:
+ case Builtin::BI__builtin_acosh:
+ case Builtin::BI__builtin_acoshf:
+ //case Builtin::BI__builtin_acoshf16:
+ case Builtin::BI__builtin_acoshl:
+ case Builtin::BI__builtin_acoshf128:
+ return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(
+ *this, E, Intrinsic::acosh, Intrinsic::experimental_constrained_acosh));
+
case Builtin::BIasin:
case Builtin::BIasinf:
case Builtin::BIasinl:
@@ -2681,6 +2692,17 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(
*this, E, Intrinsic::asin, Intrinsic::experimental_constrained_asin));
+ case Builtin::BIasinh:
+ case Builtin::BIasinhf:
+ case Builtin::BIasinhl:
+ case Builtin::BI__builtin_asinh:
+ case Builtin::BI__builtin_asinhf:
+ //case Builtin::BI__builtin_asinhf16:
+ case Builtin::BI__builtin_asinhl:
+ case Builtin::BI__builtin_asinhf128:
+ return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(
+ *this, E, Intrinsic::asinh, Intrinsic::experimental_constrained_asinh));
+
case Builtin::BIatan:
case Builtin::BIatanf:
case Builtin::BIatanl:
@@ -2692,6 +2714,17 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(
*this, E, Intrinsic::atan, Intrinsic::experimental_constrained_atan));
+ case Builtin::BIatanh:
+ case Builtin::BIatanhf:
+ case Builtin::BIatanhl:
+ case Builtin::BI__builtin_atanh:
+ case Builtin::BI__builtin_atanhf:
+ //case Builtin::BI__builtin_atanhf16:
+ case Builtin::BI__builtin_atanhl:
+ case Builtin::BI__builtin_atanhf128:
+ return RValue::get(emitUnaryMaybeConstrainedFPBuiltin(
+ *this, E, Intrinsic::atanh, Intrinsic::experimental_constrained_atanh));
+
case Builtin::BIceil:
case Builtin::BIceilf:
case Builtin::BIceill:
diff --git a/llvm/include/llvm/CodeGen/BasicTTIImpl.h b/llvm/include/llvm/CodeGen/BasicTTIImpl.h
index 47323ca067a435..4f6a48bd99f03b 100644
--- a/llvm/include/llvm/CodeGen/BasicTTIImpl.h
+++ b/llvm/include/llvm/CodeGen/BasicTTIImpl.h
@@ -1996,6 +1996,15 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase<T> {
case Intrinsic::tanh:
ISD = ISD::FTANH;
break;
+ case Intrinsic::asinh:
+ ISD = ISD::FASINH;
+ break;
+ case Intrinsic::acosh:
+ ISD = ISD::FACOSH;
+ break;
+ case Intrinsic::atanh:
+ ISD = ISD::FATANH;
+ break;
case Intrinsic::exp:
ISD = ISD::FEXP;
break;
diff --git a/llvm/include/llvm/CodeGen/ISDOpcodes.h b/llvm/include/llvm/CodeGen/ISDOpcodes.h
index 187d624f0a73b9..dde7e5ef923e73 100644
--- a/llvm/include/llvm/CodeGen/ISDOpcodes.h
+++ b/llvm/include/llvm/CodeGen/ISDOpcodes.h
@@ -428,6 +428,9 @@ enum NodeType {
STRICT_FSINH,
STRICT_FCOSH,
STRICT_FTANH,
+ STRICT_FASINH,
+ STRICT_FACOSH,
+ STRICT_FATANH,
STRICT_FEXP,
STRICT_FEXP2,
STRICT_FLOG,
@@ -990,6 +993,9 @@ enum NodeType {
FSINH,
FCOSH,
FTANH,
+ FASINH,
+ FACOSH,
+ FATANH,
FPOW,
FPOWI,
/// FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
diff --git a/llvm/include/llvm/IR/Intrinsics.td b/llvm/include/llvm/IR/Intrinsics.td
index 232d6be1073f49..0478964cca56ee 100644
--- a/llvm/include/llvm/IR/Intrinsics.td
+++ b/llvm/include/llvm/IR/Intrinsics.td
@@ -1024,6 +1024,9 @@ let IntrProperties = [IntrNoMem, IntrSpeculatable, IntrWillReturn] in {
def int_sin : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
def int_cos : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
def int_tan : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
+ def int_asinh : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
+ def int_acosh : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
+ def int_atanh : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
def int_sinh : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
def int_cosh : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
def int_tanh : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
@@ -1242,6 +1245,18 @@ let IntrProperties = [IntrInaccessibleMemOnly, IntrWillReturn, IntrStrictFP] in
[ LLVMMatchType<0>,
llvm_metadata_ty,
llvm_metadata_ty ]>;
+ def int_experimental_constrained_asinh : DefaultAttrsIntrinsic<[ llvm_anyfloat_ty ],
+ [ LLVMMatchType<0>,
+ llvm_metadata_ty,
+ llvm_metadata_ty ]>;
+ def int_experimental_constrained_acosh : DefaultAttrsIntrinsic<[ llvm_anyfloat_ty ],
+ [ LLVMMatchType<0>,
+ llvm_metadata_ty,
+ llvm_metadata_ty ]>;
+ def int_experimental_constrained_atanh : DefaultAttrsIntrinsic<[ llvm_anyfloat_ty ],
+ [ LLVMMatchType<0>,
+ llvm_metadata_ty,
+ llvm_metadata_ty ]>;
def int_experimental_constrained_sinh : DefaultAttrsIntrinsic<[ llvm_anyfloat_ty ],
[ LLVMMatchType<0>,
llvm_metadata_ty,
diff --git a/llvm/include/llvm/IR/RuntimeLibcalls.def b/llvm/include/llvm/IR/RuntimeLibcalls.def
index c3d5ef9f4e4f82..12831fca3e1463 100644
--- a/llvm/include/llvm/IR/RuntimeLibcalls.def
+++ b/llvm/include/llvm/IR/RuntimeLibcalls.def
@@ -232,6 +232,21 @@ HANDLE_LIBCALL(ATAN_F64, "atan")
HANDLE_LIBCALL(ATAN_F80, "atanl")
HANDLE_LIBCALL(ATAN_F128,"atanl")
HANDLE_LIBCALL(ATAN_PPCF128, "atanl")
+HANDLE_LIBCALL(ASINH_F32, "asinhf")
+HANDLE_LIBCALL(ASINH_F64, "asinh")
+HANDLE_LIBCALL(ASINH_F80, "asinhl")
+HANDLE_LIBCALL(ASINH_F128, "asinhl")
+HANDLE_LIBCALL(ASINH_PPCF128, "asinhl")
+HANDLE_LIBCALL(ACOSH_F32, "acoshf")
+HANDLE_LIBCALL(ACOSH_F64, "acosh")
+HANDLE_LIBCALL(ACOSH_F80, "acoshl")
+HANDLE_LIBCALL(ACOSH_F128, "acoshl")
+HANDLE_LIBCALL(ACOSH_PPCF128, "acoshl")
+HANDLE_LIBCALL(ATANH_F32, "atanhf")
+HANDLE_LIBCALL(ATANH_F64, "atanh")
+HANDLE_LIBCALL(ATANH_F80, "atanhl")
+HANDLE_LIBCALL(ATANH_F128, "atanhl")
+HANDLE_LIBCALL(ATANH_PPCF128, "atanhl")
HANDLE_LIBCALL(SINCOS_F32, nullptr)
HANDLE_LIBCALL(SINCOS_F64, nullptr)
HANDLE_LIBCALL(SINCOS_F80, nullptr)
diff --git a/llvm/include/llvm/Support/TargetOpcodes.def b/llvm/include/llvm/Support/TargetOpcodes.def
index 635c265a433631..c167c7fc72a8f0 100644
--- a/llvm/include/llvm/Support/TargetOpcodes.def
+++ b/llvm/include/llvm/Support/TargetOpcodes.def
@@ -808,6 +808,15 @@ HANDLE_TARGET_OPCODE(G_FASIN)
/// Floating point arctangent.
HANDLE_TARGET_OPCODE(G_FATAN)
+/// Floating point hyperbolic arccosine.
+HANDLE_TARGET_OPCODE(G_FACOSH)
+
+/// Floating point hyperbolic arcsine.
+HANDLE_TARGET_OPCODE(G_FASINH)
+
+/// Floating point hyperbolic arctangent.
+HANDLE_TARGET_OPCODE(G_FATANH)
+
/// Floating point hyperbolic cosine.
HANDLE_TARGET_OPCODE(G_FCOSH)
diff --git a/llvm/include/llvm/Target/GenericOpcodes.td b/llvm/include/llvm/Target/GenericOpcodes.td
index 36a0a087ba457c..0e84eb66442995 100644
--- a/llvm/include/llvm/Target/GenericOpcodes.td
+++ b/llvm/include/llvm/Target/GenericOpcodes.td
@@ -1057,6 +1057,27 @@ def G_FTANH : GenericInstruction {
let hasSideEffects = false;
}
+// Floating point hyperbolic arccosine of a value.
+def G_FACOSH : GenericInstruction {
+ let OutOperandList = (outs type0:$dst);
+ let InOperandList = (ins type0:$src1);
+ let hasSideEffects = false;
+}
+
+// Floating point hyperbolic arcsine of a value.
+def G_FASINH : GenericInstruction {
+ let OutOperandList = (outs type0:$dst);
+ let InOperandList = (ins type0:$src1);
+ let hasSideEffects = false;
+}
+
+// Floating point hyperbolic arctangent of a value.
+def G_FATANH : GenericInstruction {
+ let OutOperandList = (outs type0:$dst);
+ let InOperandList = (ins type0:$src1);
+ let hasSideEffects = false;
+}
+
// Floating point square root of a value.
// This returns NaN for negative nonzero values.
// NOTE: Unlike libm sqrt(), this never sets errno. In all other respects it's
diff --git a/llvm/include/llvm/Target/GlobalISel/SelectionDAGCompat.td b/llvm/include/llvm/Target/GlobalISel/SelectionDAGCompat.td
index 72d155b483cf2b..9e103ec1ea2639 100644
--- a/llvm/include/llvm/Target/GlobalISel/SelectionDAGCompat.td
+++ b/llvm/include/llvm/Target/GlobalISel/SelectionDAGCompat.td
@@ -155,6 +155,9 @@ def : GINodeEquiv<G_FATAN, fatan>;
def : GINodeEquiv<G_FCOSH, fcosh>;
def : GINodeEquiv<G_FSINH, fsinh>;
def : GINodeEquiv<G_FTANH, ftanh>;
+def : GINodeEquiv<G_FACOSH, facosh>;
+def : GINodeEquiv<G_FASINH, fasinh>;
+def : GINodeEquiv<G_FATANH, fatanh>;
def : GINodeEquiv<G_FABS, fabs>;
def : GINodeEquiv<G_FSQRT, fsqrt>;
def : GINodeEquiv<G_FFLOOR, ffloor>;
diff --git a/llvm/include/llvm/Target/TargetSelectionDAG.td b/llvm/include/llvm/Target/TargetSelectionDAG.td
index dd79002dcbdb48..c846fae0c1bc96 100644
--- a/llvm/include/llvm/Target/TargetSelectionDAG.td
+++ b/llvm/include/llvm/Target/TargetSelectionDAG.td
@@ -537,6 +537,9 @@ def fatan : SDNode<"ISD::FATAN" , SDTFPUnaryOp>;
def fsinh : SDNode<"ISD::FSINH" , SDTFPUnaryOp>;
def fcosh : SDNode<"ISD::FCOSH" , SDTFPUnaryOp>;
def ftanh : SDNode<"ISD::FTANH" , SDTFPUnaryOp>;
+def fasinh : SDNode<"ISD::FASINH" , SDTFPUnaryOp>;
+def facosh : SDNode<"ISD::FACOSH" , SDTFPUnaryOp>;
+def fatanh : SDNode<"ISD::FATANH" , SDTFPUnaryOp>;
def fexp2 : SDNode<"ISD::FEXP2" , SDTFPUnaryOp>;
def fexp10 : SDNode<"ISD::FEXP10" , SDTFPUnaryOp>;
def fpow : SDNode<"ISD::FPOW" , SDTFPBinOp>;
diff --git a/llvm/lib/Analysis/VectorUtils.cpp b/llvm/lib/Analysis/VectorUtils.cpp
index 32ce34114b2f50..faa1b86ebbe9be 100644
--- a/llvm/lib/Analysis/VectorUtils.cpp
+++ b/llvm/lib/Analysis/VectorUtils.cpp
@@ -72,6 +72,9 @@ bool llvm::isTriviallyVectorizable(Intrinsic::ID ID) {
case Intrinsic::sin:
case Intrinsic::cos:
case Intrinsic::tan:
+ case Intrinsic::asinh:
+ case Intrinsic::acosh:
+ case Intrinsic::atanh:
case Intrinsic::sinh:
case Intrinsic::cosh:
case Intrinsic::tanh:
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index b290d7fb4ce4a1..bedb9d2d5e2787 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -1885,6 +1885,12 @@ unsigned IRTranslator::getSimpleIntrinsicOpcode(Intrinsic::ID ID) {
return TargetOpcode::G_FASIN;
case Intrinsic::atan:
return TargetOpcode::G_FATAN;
+ case Intrinsic::acosh:
+ return TargetOpcode::G_FACOSH;
+ case Intrinsic::asinh:
+ return TargetOpcode::G_FASINH;
+ case Intrinsic::atanh:
+ return TargetOpcode::G_FATANH;
case Intrinsic::bswap:
return TargetOpcode::G_BSWAP;
case Intrinsic::bitreverse:
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
index f5fbc01cd95e96..86feb296bc2145 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
@@ -4616,6 +4616,20 @@ void SelectionDAGLegalize::ConvertNodeToLibcall(SDNode *Node) {
case ISD::STRICT_FTANH:
ExpandFPLibCall(Node, RTLIB::TANH_F32, RTLIB::TANH_F64, RTLIB::TANH_F80,
RTLIB::TANH_F128, RTLIB::TANH_PPCF128, Results);
+ case ISD::FASINH:
+ case ISD::STRICT_FASINH:
+ ExpandFPLibCall(Node, RTLIB::ASINH_F32, RTLIB::ASINH_F64, RTLIB::ASINH_F80,
+ RTLIB::ASINH_F128, RTLIB::ASINH_PPCF128, Results);
+ break;
+ case ISD::FACOSH:
+ case ISD::STRICT_FACOSH:
+ ExpandFPLibCall(Node, RTLIB::ACOSH_F32, RTLIB::ACOSH_F64, RTLIB::ACOSH_F80,
+ RTLIB::ACOSH_F128, RTLIB::ACOSH_PPCF128, Results);
+ break;
+ case ISD::FATANH:
+ case ISD::STRICT_FATANH:
+ ExpandFPLibCall(Node, RTLIB::ATANH_F32, RTLIB::ATANH_F64, RTLIB::ATANH_F80,
+ RTLIB::ATANH_F128, RTLIB::ATANH_PPCF128, Results);
break;
case ISD::FSINCOS:
// Expand into sincos libcall.
@@ -5599,6 +5613,9 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) {
case ISD::FSINH:
case ISD::FCOSH:
case ISD::FTANH:
+ case ISD::FASINH:
+ case ISD::FACOSH:
+ case ISD::FATANH:
case ISD::FLOG:
case ISD::FLOG2:
case ISD::FLOG10:
@@ -5630,6 +5647,9 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) {
case ISD::STRICT_FSINH:
case ISD::STRICT_FCOSH:
case ISD::STRICT_FTANH:
+ case ISD::STRICT_FASINH:
+ case ISD::STRICT_FACOSH:
+ case ISD::STRICT_FATANH:
case ISD::STRICT_FLOG:
case ISD::STRICT_FLOG2:
case ISD::STRICT_FLOG10:
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
index b5c80005a0ecc1..bd66070230d249 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp
@@ -84,6 +84,12 @@ void DAGTypeLegalizer::SoftenFloatResult(SDNode *N, unsigned ResNo) {
case ISD::FASIN: R = SoftenFloatRes_FASIN(N); break;
case ISD::STRICT_FATAN:
case ISD::FATAN: R = SoftenFloatRes_FATAN(N); break;
+ case ISD::STRICT_FACOSH:
+ case ISD::FACOSH: R = SoftenFloatRes_FACOSH(N); break;
+ case ISD::STRICT_FASINH:
+ case ISD::FASINH: R = SoftenFloatRes_FASINH(N); break;
+ case ISD::STRICT_FATANH:
+ case ISD::FATANH: R = SoftenFloatRes_FATANH(N); break;
case ISD::FCBRT: R = SoftenFloatRes_FCBRT(N); break;
case ISD::STRICT_FCEIL:
case ISD::FCEIL: R = SoftenFloatRes_FCEIL(N); break;
@@ -354,18 +360,39 @@ SDValue DAGTypeLegalizer::SoftenFloatRes_FACOS(SDNode *N) {
RTLIB::ACOS_F80, RTLIB::ACOS_F128, RTLIB::ACOS_PPCF128));
}
+SDValue DAGTypeLegalizer::SoftenFloatRes_FACOSH(SDNode *N) {
+ return SoftenFloatRes_Unary(
+ N,
+ GetFPLibCall(N->getValueType(0), RTLIB::ACOSH_F32, RTLIB::ACOSH_F64,
+ RTLIB::ACOSH_F80, RTLIB::ACOSH_F128, RTLIB::ACOSH_PPCF128));
+}
+
SDValue DAGTypeLegalizer::SoftenFloatRes_FASIN(SDNode *N) {
return SoftenFloatRes_Unary(
N, GetFPLibCall(N->getValueType(0), RTLIB::ASIN_F32, RTLIB::ASIN_F64,
RTLIB::ASIN_F80, RTLIB::ASIN_F128, RTLIB::ASIN_PPCF128));
}
+SDValue DAGTypeLegalizer::SoftenFloatRes_FASINH(SDNode *N) {
+ return SoftenFloatRes_Unary(
+ N,
+ GetFPLibCall(N->getValueType(0), RTLIB::ASINH_F32, RTLIB::ASINH_F64,
+ RTLIB::ASINH_F80, RTLIB::ASINH_F128, RTLIB::ASINH_PPCF128));
+}
+
SDValue DAGTypeLegalizer::SoftenFloatRes_FATAN(SDNode *N) {
return SoftenFloatRes_Unary(
N, GetFPLibCall(N->getValueType(0), RTLIB::ATAN_F32, RTLIB::ATAN_F64,
RTLIB::ATAN_F80, RTLIB::ATAN_F128, RTLIB::ATAN_PPCF128));
}
+SDValue DAGTypeLegalizer::SoftenFloatRes_FATANH(SDNode *N) {
+ return SoftenFloatRes_Unary(
+ N,
+ GetFPLibCall(N->getValueType(0), RTLIB::ATANH_F32, RTLIB::ATANH_F64,
+ RTLIB::ATANH_F80, RTLIB::ATANH_F128, RTLIB::ATANH_PPCF128));
+}
+
SDValue DAGTypeLegalizer::SoftenFloatRes_FCBRT(SDNode *N) {
return SoftenFloatRes_Unary(N, GetFPLibCall(N->getValueType(0),
RTLIB::CBRT_F32,
@@ -1430,6 +1457,12 @@ void DAGTypeLegalizer::ExpandFloatResult(SDNode *N, unsigned ResNo) {
case ISD::FASIN: ExpandFloatRes_FASIN(N, Lo, Hi); break;
case ISD::STRICT_FATAN:
case ISD::FATAN: ExpandFloatRes_FATAN(N, Lo, Hi); break;
+ case ISD::STRICT_FACOSH:
+ case ISD::FACOSH: ExpandFloatRes_FACOSH(N, Lo, Hi); break;
+ case ISD::STRICT_FASINH:
+ case ISD::FASINH: ExpandFloatRes_FASINH(N, Lo, Hi); break;
+ case ISD::STRICT_FATANH:
+ case ISD::FATANH: ExpandFloatRes_FATANH(N, Lo, Hi); break;
case ISD::FCBRT: ExpandFloatRes_FCBRT(N, Lo, Hi); break;
case ISD::STRICT_FCEIL:
case ISD::FCEIL: ExpandFloatRes_FCEIL(N, Lo, Hi); break;
@@ -1478,7 +1511,7 @@ void DAGTypeLegalizer::ExpandFloatResult(SDNode *N, unsigned ResNo) {
case ISD::STRICT_FSIN:
case ISD::FSIN: ExpandFloatRes_FSIN(N, Lo, Hi); break;
case ISD::STRICT_FSINH:
- case ISD::FSINH: ExpandFloatRes_FSINH(N, Lo, Hi); break;
+ case ISD::FSINH: ExpandFloatRes_FSINH(N, Lo, Hi); break;
case ISD::STRICT_FSQRT:
case ISD::FSQRT: ExpandFloatRes_FSQRT(N, Lo, Hi); break;
case ISD::STRICT_FSUB:
@@ -1486,7 +1519,7 @@ void DAGTypeLegalizer::ExpandFloatResult(SDNode *N, unsigned ResNo) {
case ISD::STRICT_FTAN:
case ISD::FTAN: ExpandFloatRes_FTAN(N, Lo, Hi); break;
case ISD::STRICT_FTANH:
- case ISD::FTANH: ExpandFloatRes_FTANH(N, Lo, Hi); break;
+ case ISD::FTANH: ExpandFloatRes_FTANH(N, Lo, Hi); break;
case ISD::STRICT_FTRUNC:
case ISD::FTRUNC: ExpandFloatRes_FTRUNC(N, Lo, Hi); break;
case ISD::LOAD: ExpandFloatRes_LOAD(N, Lo, Hi); break;
@@ -1613,6 +1646,15 @@ void DAGTypeLegalizer::ExpandFloatRes_FACOS(SDNode *N, SDValue &Lo,
Lo, Hi);
}
+void DAGTypeLegalizer::ExpandFloatRes_FACOSH(SDNode *N, SDValue &Lo,
+ SDValue &Hi) {
+ ExpandFloatRes_Unary(N,
+ GetFPLibCall(N->getValueType(0), RTLIB::ACOSH_F32,
+ RTLIB::ACOSH_F64, RTLIB::ACOSH_F80,
+ RTLIB::ACOSH_F128, RTLIB::ACOSH_PPCF128),
+ Lo, Hi);
+}
+
void DAGTypeLegalizer::ExpandFloatRes_FASIN(SDNode *N, SDValue &Lo,
SDValue &Hi) {
ExpandFloatRes_Unary(N,
@@ -1622,6 +1664,15 @@ void DAGTypeLegalizer::ExpandFloatRes_FASIN(SDNode *N, SDValue &Lo,
Lo, Hi);
}
+void DAGTypeLegalizer::ExpandFloatRes_FASINH(SDNode *N, SDValue &Lo,
+ SDValue &Hi) {
+ ExpandFloatRes_Unary(N,
+ GetFPLibCall(N->getValueType(0), RTLIB::ASINH_F32,
+ RTLIB::ASINH_F64, RTLIB::ASINH_F80,
+ RTLIB::ASINH_F128, RTLIB::ASINH_PPCF128),
+ Lo, Hi);
+}
+
void DAGTypeLegalizer::ExpandFloatRes_FATAN(SDNode *N, SDValue &Lo,
SDValue &Hi) {
ExpandFloatRes_Unary(N,
@@ -1631,6 +1682,15 @@ void DAGTypeLegalizer::ExpandFloatRes_FATAN(SDNode *N, SDValue &Lo,
Lo, Hi);
}
+void DAGTypeLegalizer::ExpandFloatRes_FATANH(SDNode *N, SDValue &Lo,
+ SDValue &Hi) {
+ ExpandFloatRes_Unary(N,
+ GetFPLibCall(N->getValueType(0), RTLIB::ATANH_F32,
+ RTLIB::ATANH_F64, RTLIB::ATANH_F80,
+ RTLIB::ATANH_F128, RTLIB::ATANH_PPCF128),
+ Lo, Hi);
+}
+
void DAGTypeLegalizer::ExpandFloatRes_FCBRT(SDNode *N, SDValue &Lo,
SDValue &Hi) {
ExpandFloatRes_Unary(N, GetFPLibCall(N->getValueType(0), RTLIB::CBRT_F32,
@@ -2642,6 +2702,9 @@ void DAGTypeLegalizer::PromoteFloatResult(SDNode *N, unsigned ResNo) {
case ISD::FACOS:
case ISD::FASIN:
case ISD::FATAN:
+ case ISD::FACOSH:
+ case ISD::FASINH:
+ case ISD::FATANH:
case ISD::FCBRT:
case ISD::FCEIL:
case ISD::FCOS:
@@ -3085,6 +3148,9 @@ void DAGTypeLegalizer::SoftPromoteHalfResult(SDNode *N, unsigned ResNo) {
case ISD::FACOS:
case ISD::FASIN:
case ISD::FATAN:
+ case ISD::FACOSH:
+ case ISD::FASINH:
+ case ISD::FATANH:
case ISD::FCBRT:
case ISD::FCEIL:
case ISD::FCOS:
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
index f15e3d7fd1eb63..7c9919ca8b519b 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
@@ -567,6 +567,9 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
SDValue SoftenFloatRes_FACOS(SDNode *N);
SDValue SoftenFloatRes_FASIN(SDNode *N);
SDValue SoftenFloatRes_FATAN(SDNode *N);
+ SDValue SoftenFloatRes_FACOSH(SDNode *N);
+ SDValue SoftenFloatRes_FASINH(SDNode *N);
+ SDValue SoftenFloatRes_FATANH(SDNode *N);
SDValue SoftenFloatRes_FMINNUM(SDNode *N);
SDValue SoftenFloatRes_FMAXNUM(SDNode *N);
SDValue SoftenFloatRes_FMINIMUMNUM(SDNode *N);
@@ -661,6 +664,9 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
void ExpandFloatRes_FACOS (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandFloatRes_FASIN (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandFloatRes_FATAN (SDNode *N, SDValue &Lo, SDValue &Hi);
+ void ExpandFloatRes_FACOSH (SDNode *N, SDValue &Lo, SDValue &Hi);
+ void ExpandFloatRes_FASINH (SDNode *N, SDValue &Lo, SDValue &Hi);
+ void ExpandFloatRes_FATANH (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandFloatRes_FMINNUM (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandFloatRes_FMAXNUM (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandFloatRes_FMINIMUMNUM(SDNode *N, SDValue &Lo, SDValue &Hi);
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
index 87221c14433ab5..ff92e6d03d2d70 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp
@@ -411,6 +411,9 @@ SDValue VectorLegalizer::LegalizeOp(SDValue Op) {
case ISD::FSINH:
case ISD::FCOSH:
case ISD::FTANH:
+ case ISD::FASINH:
+ case ISD::FACOSH:
+ case ISD::FATANH:
case ISD::FLDEXP:
case ISD::FPOWI:
case ISD::FPOW:
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
index ae994d492d57e6..a1124edb8ff79f 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
@@ -88,6 +88,9 @@ void DAGTypeLegalizer::ScalarizeVectorResult(SDNode *N, unsigned ResNo) {
case ISD::FACOS:
case ISD::FASIN:
case ISD::FATAN:
+ case ISD::FACOSH:
+ case ISD::FASINH:
+ case ISD::FATANH:
case ISD::FCEIL:
case ISD::FCOS:
case ISD::FCOSH:
@@ -1195,6 +1198,9 @@ void DAGTypeLegalizer::SplitVectorResult(SDNode *N, unsigned ResNo) {
case ISD::FACOS:
case ISD::FASIN:
case ISD::FATAN:
+ case ISD::FACOSH:
+ case ISD::FASINH:
+ case ISD::FATANH:
case ISD::FCEIL:
case ISD::VP_FCEIL:
case ISD::FCOS:
@@ -4659,6 +4665,9 @@ void DAGTypeLegalizer::WidenVectorResult(SDNode *N, unsigned ResNo) {
case ISD::FACOS:
case ISD::FASIN:
case ISD::FATAN:
+ case ISD::FACOSH:
+ case ISD::FASINH:
+ case ISD::FATANH:
case ISD::FCEIL:
case ISD::FCOS:
case ISD::FCOSH:
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 7f57b6db40ef49..169f30cfdab9bb 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -5433,6 +5433,9 @@ bool SelectionDAG::isKnownNeverNaN(SDValue Op, bool SNaN, unsigned Depth) const
case ISD::FSINH:
case ISD::FCOSH:
case ISD::FTANH:
+ case ISD::FASINH:
+ case ISD::FACOSH:
+ case ISD::FATANH:
case ISD::FMA:
case ISD::FMAD: {
if (SNaN)
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index 4b326ba76f97f2..42f23e8f39b9a0 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -6803,6 +6803,9 @@ void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
case Intrinsic::sinh:
case Intrinsic::cosh:
case Intrinsic::tanh:
+ case Intrinsic::asinh:
+ case Intrinsic::acosh:
+ case Intrinsic::atanh:
case Intrinsic::exp10:
case Intrinsic::floor:
case Intrinsic::ceil:
@@ -6827,6 +6830,9 @@ void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
case Intrinsic::sinh: Opcode = ISD::FSINH; break;
case Intrinsic::cosh: Opcode = ISD::FCOSH; break;
case Intrinsic::tanh: Opcode = ISD::FTANH; break;
+ case Intrinsic::asinh: Opcode = ISD::FASINH; break;
+ case Intrinsic::acosh: Opcode = ISD::FACOSH; break;
+ case Intrinsic::atanh: Opcode = ISD::FATANH; break;
case Intrinsic::exp10: Opcode = ISD::FEXP10; break;
case Intrinsic::floor: Opcode = ISD::FFLOOR; break;
case Intrinsic::ceil: Opcode = ISD::FCEIL; break;
@@ -9373,6 +9379,24 @@ void SelectionDAGBuilder::visitCall(const CallInst &I) {
if (visitUnaryFloatCall(I, ISD::FTANH))
return;
break;
+ case LibFunc_asinh:
+ case LibFunc_asinhf:
+ case LibFunc_asinhl:
+ if (visitUnaryFloatCall(I, ISD::FASINH))
+ return;
+ break;
+ case LibFunc_acosh:
+ case LibFunc_acoshf:
+ case LibFunc_acoshl:
+ if (visitUnaryFloatCall(I, ISD::FACOSH))
+ return;
+ break;
+ case LibFunc_atanh:
+ case LibFunc_atanhf:
+ case LibFunc_atanhl:
+ if (visitUnaryFloatCall(I, ISD::FATANH))
+ return;
+ break;
case LibFunc_sqrt:
case LibFunc_sqrtf:
case LibFunc_sqrtl:
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp
index a253d1a0e20170..4efdeb495a2f4c 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp
@@ -228,6 +228,12 @@ std::string SDNode::getOperationName(const SelectionDAG *G) const {
case ISD::STRICT_FCOSH: return "strict_fcosh";
case ISD::FTANH: return "ftanh";
case ISD::STRICT_FTANH: return "strict_ftanh";
+ case ISD::FASINH: return "fasinh";
+ case ISD::STRICT_FASINH: return "strict_fasinh";
+ case ISD::FACOSH: return "facosh";
+ case ISD::STRICT_FACOSH: return "strict_facosh";
+ case ISD::FATANH: return "fatanh";
+ case ISD::STRICT_FATANH: return "strict_fatanh";
case ISD::FTRUNC: return "ftrunc";
case ISD::STRICT_FTRUNC: return "strict_ftrunc";
case ISD::FFLOOR: return "ffloor";
diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp
index 35d6304cf9b400..e424d395c1a4d1 100644
--- a/llvm/lib/CodeGen/TargetLoweringBase.cpp
+++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp
@@ -776,7 +776,8 @@ void TargetLoweringBase::initActions() {
ISD::SIGN_EXTEND_VECTOR_INREG, ISD::ZERO_EXTEND_VECTOR_INREG,
ISD::SPLAT_VECTOR, ISD::LRINT, ISD::LLRINT, ISD::LROUND,
ISD::LLROUND, ISD::FTAN, ISD::FACOS, ISD::FASIN, ISD::FATAN,
- ISD::FCOSH, ISD::FSINH, ISD::FTANH},
+ ISD::FCOSH, ISD::FSINH, ISD::FTANH, ISD::FACOSH, ISD::FASINH,
+ ISD::FATANH},
VT, Expand);
// Constrained floating-point operations default to expand.
@@ -831,11 +832,12 @@ void TargetLoweringBase::initActions() {
Expand);
// These library functions default to expand.
- setOperationAction({ISD::FCBRT, ISD::FLOG, ISD::FLOG2, ISD::FLOG10,
- ISD::FEXP, ISD::FEXP2, ISD::FEXP10, ISD::FFLOOR,
- ISD::FNEARBYINT, ISD::FCEIL, ISD::FRINT, ISD::FTRUNC,
- ISD::FROUNDEVEN, ISD::FTAN, ISD::FACOS, ISD::FASIN,
- ISD::FATAN, ISD::FCOSH, ISD::FSINH, ISD::FTANH},
+ setOperationAction({ISD::FCBRT, ISD::FLOG, ISD::FLOG2, ISD::FLOG10,
+ ISD::FEXP, ISD::FEXP2, ISD::FEXP10, ISD::FFLOOR,
+ ISD::FNEARBYINT, ISD::FCEIL, ISD::FRINT, ISD::FTRUNC,
+ ISD::FROUNDEVEN, ISD::FTAN, ISD::FACOS, ISD::FASIN,
+ ISD::FATAN, ISD::FCOSH, ISD::FSINH, ISD::FTANH,
+ ISD::FACOSH, ISD::FASINH, ISD::FATANH},
{MVT::f32, MVT::f64, MVT::f128}, Expand);
// FIXME: Query RuntimeLibCalls to make the decision.
@@ -843,7 +845,8 @@ void TargetLoweringBase::initActions() {
{MVT::f32, MVT::f64, MVT::f128}, LibCall);
setOperationAction({ISD::FTAN, ISD::FACOS, ISD::FASIN, ISD::FATAN, ISD::FCOSH,
- ISD::FSINH, ISD::FTANH},
+ ISD::FSINH, ISD::FTANH, ISD::FACOSH, ISD::FASINH,
+ ISD::FATANH},
MVT::f16, Promote);
// Default ISD::TRAP to expand (which turns it into abort).
setOperationAction(ISD::TRAP, MVT::Other, Expand);
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 28ad0abf25703b..50fd1432d07b5b 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -732,18 +732,19 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
setOperationAction(ISD::FCOPYSIGN, MVT::bf16, Promote);
}
- for (auto Op : {ISD::FREM, ISD::FPOW, ISD::FPOWI,
- ISD::FCOS, ISD::FSIN, ISD::FSINCOS,
- ISD::FACOS, ISD::FASIN, ISD::FATAN,
- ISD::FCOSH, ISD::FSINH, ISD::FTANH,
- ISD::FTAN, ISD::FEXP, ISD::FEXP2,
- ISD::FEXP10, ISD::FLOG, ISD::FLOG2,
- ISD::FLOG10, ISD::STRICT_FREM, ISD::STRICT_FPOW,
- ISD::STRICT_FPOWI, ISD::STRICT_FCOS, ISD::STRICT_FSIN,
- ISD::STRICT_FACOS, ISD::STRICT_FASIN, ISD::STRICT_FATAN,
- ISD::STRICT_FCOSH, ISD::STRICT_FSINH, ISD::STRICT_FTANH,
- ISD::STRICT_FEXP, ISD::STRICT_FEXP2, ISD::STRICT_FLOG,
- ISD::STRICT_FLOG2, ISD::STRICT_FLOG10, ISD::STRICT_FTAN}) {
+ for (auto Op : {ISD::FREM, ISD::FPOW, ISD::FPOWI,
+ ISD::FCOS, ISD::FSIN, ISD::FSINCOS,
+ ISD::FACOS, ISD::FASIN, ISD::FATAN,
+ ISD::FCOSH, ISD::FSINH, ISD::FTANH,
+ ISD::FTAN, ISD::FEXP, ISD::FEXP2,
+ ISD::FEXP10, ISD::FLOG, ISD::FLOG2,
+ ISD::FLOG10, ISD::STRICT_FREM, ISD::STRICT_FPOW,
+ ISD::STRICT_FPOWI, ISD::STRICT_FCOS, ISD::STRICT_FSIN,
+ ISD::STRICT_FACOS, ISD::STRICT_FASIN, ISD::STRICT_FATAN,
+ ISD::STRICT_FCOSH, ISD::STRICT_FSINH, ISD::STRICT_FTANH,
+ ISD::STRICT_FACOSH, ISD::STRICT_FASINH, ISD::STRICT_FATANH,
+ ISD::STRICT_FEXP, ISD::STRICT_FEXP2, ISD::STRICT_FLOG,
+ ISD::STRICT_FLOG2, ISD::STRICT_FLOG10, ISD::STRICT_FTAN}) {
setOperationAction(Op, MVT::f16, Promote);
setOperationAction(Op, MVT::v4f16, Expand);
setOperationAction(Op, MVT::v8f16, Expand);
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index f011249d295040..f799a35968363b 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -2478,8 +2478,11 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
// clang-format off
for (ISD::NodeType Op :
{ISD::FACOS, ISD::STRICT_FACOS,
+ ISD::FACOSH, ISD::STRICT_FACOSH,
ISD::FASIN, ISD::STRICT_FASIN,
+ ISD::FASINH, ISD::STRICT_FASINH,
ISD::FATAN, ISD::STRICT_FATAN,
+ ISD::FATANH, ISD::STRICT_FATANH,
ISD::FCEIL, ISD::STRICT_FCEIL,
ISD::FCOS, ISD::STRICT_FCOS,
ISD::FCOSH, ISD::STRICT_FCOSH,
More information about the cfe-commits
mailing list