[llvm-branch-commits] [libclc] libclc: Stop implementing sincos as separate sin and cos (PR #187456)
Matt Arsenault via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Mar 19 01:11:56 PDT 2026
https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/187456
>From cc17bcaba9d8ea16a5f4f2c2ce29dc013f3ba5ee Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Wed, 18 Mar 2026 12:58:40 +0100
Subject: [PATCH] libclc: Stop implementing sincos as separate sin and cos
---
libclc/clc/lib/generic/math/clc_sincos.cl | 7 +++
libclc/clc/lib/generic/math/clc_sincos.inc | 67 ++++++++++++++++++++--
2 files changed, 70 insertions(+), 4 deletions(-)
diff --git a/libclc/clc/lib/generic/math/clc_sincos.cl b/libclc/clc/lib/generic/math/clc_sincos.cl
index 6efe59cadea76..7a57921013c01 100644
--- a/libclc/clc/lib/generic/math/clc_sincos.cl
+++ b/libclc/clc/lib/generic/math/clc_sincos.cl
@@ -6,9 +6,16 @@
//
//===----------------------------------------------------------------------===//
+#include "clc/clc_convert.h"
+#include "clc/float/definitions.h"
#include "clc/internal/clc.h"
#include "clc/math/clc_cos.h"
+#include "clc/math/clc_fabs.h"
#include "clc/math/clc_sin.h"
+#include "clc/math/clc_sincos_helpers.h"
+#include "clc/math/math.h"
+#include "clc/relational/clc_isinf.h"
+#include "clc/relational/clc_select.h"
#define __CLC_BODY "clc_sincos.inc"
#include "clc/math/gentype.inc"
diff --git a/libclc/clc/lib/generic/math/clc_sincos.inc b/libclc/clc/lib/generic/math/clc_sincos.inc
index d268c75674e98..944b8032fae1a 100644
--- a/libclc/clc/lib/generic/math/clc_sincos.inc
+++ b/libclc/clc/lib/generic/math/clc_sincos.inc
@@ -6,12 +6,71 @@
//
//===----------------------------------------------------------------------===//
-_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE
-__clc_sincos(__CLC_GENTYPE x, private __CLC_GENTYPE *cosval) {
- *cosval = __clc_cos(x);
- return __clc_sin(x);
+#if __CLC_FPSIZE == 32
+
+_CLC_OVERLOAD _CLC_DEF __CLC_FLOATN
+__clc_sincos(__CLC_FLOATN x, private __CLC_FLOATN *cos_out) {
+ x = __clc_select(x, __CLC_GENTYPE_NAN, __clc_isinf(x));
+
+ __CLC_FLOATN absx = __clc_fabs(x);
+
+ __CLC_FLOATN r0;
+ __CLC_INTN regn = __clc_argReductionS(&r0, absx);
+ const __CLC_SINCOS_RET_GENTYPE eval = __clc_sincos_reduced_eval(r0);
+
+ __CLC_FLOATN s = (regn & 1) != 0 ? eval.cos : eval.sin;
+ __CLC_FLOATN sin_result =
+ __CLC_AS_FLOATN(__CLC_AS_UINTN(s) ^ (regn > 1 ? SIGNBIT_SP32 : 0) ^
+ (__CLC_AS_UINTN(x) ^ __CLC_AS_UINTN(absx)));
+
+ __CLC_FLOATN c = (regn & 1) != 0 ? -eval.sin : eval.cos;
+ *cos_out = __CLC_AS_FLOATN(__CLC_AS_UINTN(c) ^ (regn > 1 ? SIGNBIT_SP32 : 0));
+
+ return sin_result;
}
+#elif __CLC_FPSIZE == 16
+
+_CLC_OVERLOAD _CLC_DEF __CLC_HALFN __clc_sincos(__CLC_HALFN x,
+ private __CLC_HALFN *cos_out) {
+ __CLC_FLOATN cos_result;
+ __CLC_FLOATN sin_result = __clc_sincos(__CLC_CONVERT_FLOATN(x), &cos_result);
+ *cos_out = __CLC_CONVERT_HALFN(cos_result);
+ return __CLC_CONVERT_HALFN(sin_result);
+}
+
+#elif __CLC_FPSIZE == 64
+
+_CLC_OVERLOAD _CLC_DEF __CLC_DOUBLEN
+__clc_sincos(__CLC_DOUBLEN x, private __CLC_DOUBLEN *cos_out) {
+ x = __clc_select(x, __CLC_GENTYPE_NAN,
+ __CLC_CONVERT_S_GENTYPE(__clc_isinf(x)));
+
+ __CLC_GENTYPE absx = __clc_fabs(x);
+
+ __CLC_GENTYPE reduced_lo, reduced_hi;
+ __CLC_INTN regn = __clc_argReductionS(&reduced_lo, &reduced_hi, absx);
+
+ __CLC_SINCOS_RET_GENTYPE eval =
+ __clc_sincos_reduced_eval(reduced_hi, reduced_lo);
+
+ __CLC_LONGN flip = __CLC_CONVERT_LONGN(regn > 1) ? (__CLC_LONGN)SIGNBIT_DP64
+ : (__CLC_LONGN)0;
+ __CLC_LONGN odd = __CLC_CONVERT_LONGN((regn & 1) != 0);
+
+ __CLC_DOUBLEN sin_result = odd ? eval.cos : eval.sin;
+ sin_result =
+ __CLC_AS_DOUBLEN(__CLC_AS_LONGN(sin_result) ^ flip ^
+ (__CLC_AS_LONGN(x) & (__CLC_LONGN)SIGNBIT_DP64));
+
+ __CLC_DOUBLEN c = odd ? -eval.sin : eval.cos;
+ *cos_out = __CLC_AS_DOUBLEN(__CLC_AS_LONGN(c) ^ flip);
+
+ return sin_result;
+}
+
+#endif
+
#define __CLC_SINCOS_DEF(addrspace) \
_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_sincos( \
__CLC_GENTYPE x, addrspace __CLC_GENTYPE *cos_out) { \
More information about the llvm-branch-commits
mailing list