libclc: Use frexp and ldexp in trig reduction instead of bit hacking (#186982)
diff --git a/libclc/clc/lib/generic/math/clc_sincos_helpers.cl b/libclc/clc/lib/generic/math/clc_sincos_helpers.cl
index aeba3c1..59f2fb8 100644
--- a/libclc/clc/lib/generic/math/clc_sincos_helpers.cl
+++ b/libclc/clc/lib/generic/math/clc_sincos_helpers.cl
@@ -6,6 +6,8 @@
//
//===----------------------------------------------------------------------===//
+#include "clc/math/clc_frexp.h"
+#include "clc/math/clc_ldexp.h"
#include <clc/clc_convert.h>
#include <clc/integer/clc_clz.h>
#include <clc/integer/clc_mul_hi.h>
diff --git a/libclc/clc/lib/generic/math/clc_sincos_helpers.inc b/libclc/clc/lib/generic/math/clc_sincos_helpers.inc
index 8b126a6..e0691a5 100644
--- a/libclc/clc/lib/generic/math/clc_sincos_helpers.inc
+++ b/libclc/clc/lib/generic/math/clc_sincos_helpers.inc
@@ -199,8 +199,11 @@
_CLC_DEF _CLC_OVERLOAD __CLC_INTN __clc_argReductionLargeS(
private __CLC_FLOATN *r, private __CLC_FLOATN *rr, __CLC_FLOATN x) {
- __CLC_INTN xe = __CLC_AS_INTN((__CLC_AS_UINTN(x) >> 23) - 127);
- __CLC_UINTN xm = 0x00800000U | (__CLC_AS_UINTN(x) & 0x7fffffU);
+ __CLC_INTN xe;
+ __CLC_FLOATN m = __clc_frexp(x, &xe);
+ --xe;
+
+ __CLC_UINTN xm = __CLC_CONVERT_UINTN(__clc_ldexp(m, 24));
// 224 bits of 2/PI: . A2F9836E 4E441529 FC2757D1 F534DDC0 DB629599 3C439041
// FE5163AB