diff options
author | Benjamin Maxwell <benjamin.maxwell@arm.com> | 2025-02-11 09:01:30 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-02-11 09:01:30 +0000 |
commit | 701223ac20a45d23b9b01c8a514294eb16219d79 (patch) | |
tree | d65c2dfa42b392e0df846192bd47c27f4910085d /llvm/lib/CodeGen/TargetLoweringBase.cpp | |
parent | 6a961dc03d802fb1f34b2b0cd8d09f427382dbdb (diff) | |
download | llvm-701223ac20a45d23b9b01c8a514294eb16219d79.zip llvm-701223ac20a45d23b9b01c8a514294eb16219d79.tar.gz llvm-701223ac20a45d23b9b01c8a514294eb16219d79.tar.bz2 |
[IR] Add llvm.sincospi intrinsic (#125873)
This adds the `llvm.sincospi` intrinsic, legalization, and lowering
(mostly reusing the lowering for sincos and frexp).
The `llvm.sincospi` intrinsic takes a floating-point value and returns
both the sine and cosine of the value multiplied by pi. It computes the
result more accurately than the naive approach of doing the
multiplication ahead of time, especially for large input values.
```
declare { float, float } @llvm.sincospi.f32(float %Val)
declare { double, double } @llvm.sincospi.f64(double %Val)
declare { x86_fp80, x86_fp80 } @llvm.sincospi.f80(x86_fp80 %Val)
declare { fp128, fp128 } @llvm.sincospi.f128(fp128 %Val)
declare { ppc_fp128, ppc_fp128 } @llvm.sincospi.ppcf128(ppc_fp128 %Val)
declare { <4 x float>, <4 x float> } @llvm.sincospi.v4f32(<4 x float> %Val)
```
Currently, the default lowering of this intrinsic relies on the
`sincospi[f|l]` functions being available in the target's runtime (e.g.
libc).
Diffstat (limited to 'llvm/lib/CodeGen/TargetLoweringBase.cpp')
-rw-r--r-- | llvm/lib/CodeGen/TargetLoweringBase.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp index 1f39ec20..d9a19df 100644 --- a/llvm/lib/CodeGen/TargetLoweringBase.cpp +++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp @@ -407,6 +407,11 @@ RTLIB::Libcall RTLIB::getFSINCOS(EVT RetVT) { SINCOS_PPCF128); } +RTLIB::Libcall RTLIB::getSINCOSPI(EVT RetVT) { + return getFPLibCall(RetVT, SINCOSPI_F32, SINCOSPI_F64, SINCOSPI_F80, + SINCOSPI_F128, SINCOSPI_PPCF128); +} + RTLIB::Libcall RTLIB::getMODF(EVT RetVT) { return getFPLibCall(RetVT, MODF_F32, MODF_F64, MODF_F80, MODF_F128, MODF_PPCF128); @@ -781,7 +786,7 @@ void TargetLoweringBase::initActions() { // These library functions default to expand. setOperationAction({ISD::FROUND, ISD::FPOWI, ISD::FLDEXP, ISD::FFREXP, - ISD::FSINCOS, ISD::FMODF}, + ISD::FSINCOS, ISD::FSINCOSPI, ISD::FMODF}, VT, Expand); // These operations default to expand for vector types. |