[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