https://github.com/arsenm created 
https://github.com/llvm/llvm-project/pull/187571

This eliminates duplicated epilog code. The unused half
optimizes out just fine after inlining.

>From 7657ea5a8bd88469b3fd676910ddae1a947b1c08 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <[email protected]>
Date: Thu, 19 Mar 2026 11:12:44 +0100
Subject: [PATCH] libclc: Implement sin and cos with sincos

This eliminates duplicated epilog code. The unused half
optimizes out just fine after inlining.
---
 libclc/clc/lib/generic/math/clc_cos.cl  | 10 +---
 libclc/clc/lib/generic/math/clc_cos.inc | 60 ++--------------------
 libclc/clc/lib/generic/math/clc_sin.cl  | 14 +-----
 libclc/clc/lib/generic/math/clc_sin.inc | 66 +------------------------
 4 files changed, 9 insertions(+), 141 deletions(-)

diff --git a/libclc/clc/lib/generic/math/clc_cos.cl 
b/libclc/clc/lib/generic/math/clc_cos.cl
index c6e9ed7d7f0a4..6e629e6ffd117 100644
--- a/libclc/clc/lib/generic/math/clc_cos.cl
+++ b/libclc/clc/lib/generic/math/clc_cos.cl
@@ -6,14 +6,8 @@
 //
 
//===----------------------------------------------------------------------===//
 
-#include "clc/clc_convert.h"
-#include "clc/float/definitions.h"
-#include "clc/math/clc_fabs.h"
-#include "clc/math/clc_sincos_helpers.h"
-#include "clc/math/math.h"
-#include "clc/relational/clc_isinf.h"
-#include "clc/relational/clc_isnan.h"
-#include "clc/relational/clc_select.h"
+#include "clc/math/clc_cos.h"
+#include "clc/math/clc_sincos.h"
 
 #define __CLC_BODY "clc_cos.inc"
 #include "clc/math/gentype.inc"
diff --git a/libclc/clc/lib/generic/math/clc_cos.inc 
b/libclc/clc/lib/generic/math/clc_cos.inc
index 9f6125a9da8e3..05927b1ffe7ee 100644
--- a/libclc/clc/lib/generic/math/clc_cos.inc
+++ b/libclc/clc/lib/generic/math/clc_cos.inc
@@ -6,62 +6,8 @@
 //
 
//===----------------------------------------------------------------------===//
 
-#if __CLC_FPSIZE == 32
-
-_CLC_OVERLOAD _CLC_DEF __CLC_FLOATN __clc_cos(__CLC_FLOATN x) {
-  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);
-  __CLC_SINCOS_RET_GENTYPE eval = __clc_sincos_reduced_eval(r0);
-  eval.sin = -eval.sin;
-
-  __CLC_FLOATN c = (regn & 1) != 0 ? eval.sin : eval.cos;
-  return __CLC_AS_FLOATN(__CLC_AS_UINTN(c) ^ (regn > 1 ? SIGNBIT_SP32 : 0));
-}
-
-#elif __CLC_FPSIZE == 16
-
-_CLC_OVERLOAD _CLC_DEF __CLC_HALFN __clc_cos(__CLC_HALFN x) {
-  x = __clc_select(x, __CLC_GENTYPE_NAN,
-                   __CLC_CONVERT_S_GENTYPE(__clc_isinf(x)));
-
-  __CLC_HALFN absx = __clc_fabs(x);
-
-  __CLC_HALFN reduced;
-  __CLC_INTN n = __clc_argReductionS(&reduced, absx);
-
-  __CLC_SINCOS_RET_GENTYPE eval = __clc_sincos_reduced_eval(reduced);
-
-  __CLC_HALFN c = __CLC_CONVERT_S_GENTYPE((n & 1) == 0) ? eval.cos : -eval.sin;
-
-  __CLC_S_GENTYPE flip = __CLC_CONVERT_S_GENTYPE(n > 1)
-                             ? (__CLC_S_GENTYPE)SIGNBIT_FP16
-                             : (__CLC_S_GENTYPE)0;
-
-  __CLC_S_GENTYPE result_i = __CLC_AS_SHORTN(c) ^ flip;
-  return __CLC_AS_HALFN(result_i);
-}
-
-#elif __CLC_FPSIZE == 64
-
 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_cos(__CLC_GENTYPE x) {
-  x = __clc_select(x, __CLC_GENTYPE_NAN, __CLC_CONVERT_LONGN(__clc_isinf(x)));
-
-  __CLC_DOUBLEN absx = __clc_fabs(x);
-
-  __CLC_DOUBLEN 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_ULONGN c = __CLC_AS_ULONGN(
-      __CLC_CONVERT_LONGN((regn & 1) != 0) ? -eval.sin : eval.cos);
-  c ^= __CLC_CONVERT_LONGN(regn > 1) ? SIGNBIT_DP64 : 0u;
-
-  return __CLC_AS_GENTYPE(c);
+  __CLC_GENTYPE cos;
+  (void)__clc_sincos(x, &cos);
+  return cos;
 }
-
-#endif
diff --git a/libclc/clc/lib/generic/math/clc_sin.cl 
b/libclc/clc/lib/generic/math/clc_sin.cl
index ec8727f717847..c45e025bad591 100644
--- a/libclc/clc/lib/generic/math/clc_sin.cl
+++ b/libclc/clc/lib/generic/math/clc_sin.cl
@@ -6,18 +6,8 @@
 //
 
//===----------------------------------------------------------------------===//
 
-#include "clc/clc_convert.h"
-#include "clc/float/definitions.h"
-#include "clc/internal/clc.h"
-#include "clc/math/clc_fabs.h"
-#include "clc/math/clc_sincos_helpers.h"
-#include "clc/math/clc_trunc.h"
-#include "clc/math/math.h"
-#include "clc/math/tables.h"
-#include "clc/relational/clc_isinf.h"
-#include "clc/relational/clc_isnan.h"
-#include "clc/relational/clc_select.h"
-#include "clc/shared/clc_max.h"
+#include "clc/math/clc_sin.h"
+#include "clc/math/clc_sincos.h"
 
 #define __CLC_BODY "clc_sin.inc"
 #include "clc/math/gentype.inc"
diff --git a/libclc/clc/lib/generic/math/clc_sin.inc 
b/libclc/clc/lib/generic/math/clc_sin.inc
index 9a3ad8989f45d..cf99e2a8dbaea 100644
--- a/libclc/clc/lib/generic/math/clc_sin.inc
+++ b/libclc/clc/lib/generic/math/clc_sin.inc
@@ -6,69 +6,7 @@
 //
 
//===----------------------------------------------------------------------===//
 
-#if __CLC_FPSIZE == 32
-
-_CLC_OVERLOAD _CLC_DEF __CLC_FLOATN __clc_sin(__CLC_FLOATN x) {
-  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);
-  __CLC_SINCOS_RET_GENTYPE eval = __clc_sincos_reduced_eval(r0);
-
-  __CLC_FLOATN s = (regn & 1) != 0 ? eval.cos : eval.sin;
-
-  return __CLC_AS_FLOATN(__CLC_AS_UINTN(s) ^ (regn > 1 ? SIGNBIT_SP32 : 0) ^
-                         (__CLC_AS_UINTN(x) ^ __CLC_AS_UINTN(absx)));
-}
-
-#elif __CLC_FPSIZE == 16
-
-_CLC_OVERLOAD _CLC_DEF __CLC_HALFN __clc_sin(__CLC_HALFN x) {
-  x = __clc_select(x, __CLC_GENTYPE_NAN,
-                   __CLC_CONVERT_S_GENTYPE(__clc_isinf(x)));
-
-  __CLC_HALFN absx = __clc_fabs(x);
-
-  __CLC_HALFN reduced;
-  __CLC_INTN n = __clc_argReductionS(&reduced, absx);
-
-  __CLC_SINCOS_RET_GENTYPE eval = __clc_sincos_reduced_eval(reduced);
-
-  __CLC_HALFN s = __CLC_CONVERT_S_GENTYPE((n & 1) == 0) ? eval.sin : eval.cos;
-  __CLC_S_GENTYPE flip = __CLC_CONVERT_S_GENTYPE(n > 1)
-                             ? (__CLC_S_GENTYPE)SIGNBIT_FP16
-                             : (__CLC_S_GENTYPE)0;
-
-  __CLC_S_GENTYPE result_i =
-      __CLC_AS_SHORTN(s) ^
-      (flip ^ (__CLC_AS_SHORTN(x) & (__CLC_S_GENTYPE)SIGNBIT_FP16));
-  return __CLC_AS_HALFN(result_i);
-}
-
-#elif __CLC_FPSIZE == 64
-
 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_sin(__CLC_GENTYPE x) {
-  x = __clc_select(x, __CLC_GENTYPE_NAN, __CLC_CONVERT_LONGN(__clc_isinf(x)));
-
-  __CLC_DOUBLEN absx = __clc_fabs(x);
-
-  __CLC_DOUBLEN 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_DOUBLEN s = __CLC_CONVERT_LONGN((regn & 1) == 0) ? eval.sin : eval.cos;
-
-  s = __CLC_AS_DOUBLEN(__CLC_AS_ULONGN(s) ^
-                       (__CLC_CONVERT_LONGN(regn > 1)
-                            ? (__CLC_ULONGN)SIGNBIT_DP64
-                            : (__CLC_ULONGN)0) ^
-                       (__CLC_AS_ULONGN(x) ^ __CLC_AS_ULONGN(absx)));
-
-  return __CLC_AS_GENTYPE(s);
+  __CLC_GENTYPE unused_cos;
+  return __clc_sincos(x, &unused_cos);
 }
-
-#endif

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

Reply via email to