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
