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
