Author: Matt Arsenault
Date: 2026-03-19T09:52:30+01:00
New Revision: 1ba5b6e875d106bf5f900035e42b6ba56807b65e

URL: 
https://github.com/llvm/llvm-project/commit/1ba5b6e875d106bf5f900035e42b6ba56807b65e
DIFF: 
https://github.com/llvm/llvm-project/commit/1ba5b6e875d106bf5f900035e42b6ba56807b65e.diff

LOG: libclc: Stop implementing sincos as separate sin and cos (#187456)

Added: 
    

Modified: 
    libclc/clc/lib/generic/math/clc_sincos.cl
    libclc/clc/lib/generic/math/clc_sincos.inc

Removed: 
    


################################################################################
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) {                     
\


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to