@@ -39,18 +39,30 @@ constexpr float SIN_K_PI_OVER_32[64] = {
3939 -0x1 .6a09e6p-1 , -0x1 .44cf32p-1 , -0x1 .1c73b4p-1 , -0x1 .e2b5d4p -2 ,
4040 -0x1 .87de2ap-2 , -0x1 .294062p-2 , -0x1 .8f8b84p-3 , -0x1 .917a6cp-4 };
4141
42+ static constexpr float THIRTYTWO_OVER_PI[4 ] = {
43+ // 0x1.45fp3, 0x1.837p-12, -0x1.b1b8p-28, -0x1.f568p-43
44+ 0x1 .46p3, -0x1 .9f4p-10 , 0x1 .b94p -22 , -0x1 .bcp -36
45+ };
46+
4247LIBC_INLINE int32_t range_reduction_sincospif16 (float x, float &y) {
4348 float kf = fputil::nearest_integer (x * 32 );
4449 y = fputil::multiply_add<float >(x, 32.0 , -kf);
4550
4651 return static_cast <int32_t >(kf);
4752}
4853
49- LIBC_INLINE void sincospif16_eval (float xf, float &sin_k, float &cos_k,
50- float &sin_y, float &cosm1_y) {
51- float y;
52- int32_t k = range_reduction_sincospif16 (xf, y);
54+ LIBC_INLINE int32_t range_reduction_sincosf16 (float x, float &y) {
55+ double xd = x;
56+ double prod = xd * 0x1 .45f306dc9c883p3;
57+ double kf = fputil::nearest_integer (prod);
58+ double yd = prod - kf;
5359
60+ y = static_cast <float >(yd);
61+ return static_cast <int32_t >(kf);
62+ }
63+
64+ static LIBC_INLINE void sincosf16_poly_eval (int32_t k, float y, float &sin_k, float &cos_k, float &sin_y, float &cosm1_y) {
65+
5466 sin_k = SIN_K_PI_OVER_32[k & 63 ];
5567 cos_k = SIN_K_PI_OVER_32[(k + 16 ) & 63 ];
5668
@@ -72,6 +84,21 @@ LIBC_INLINE void sincospif16_eval(float xf, float &sin_k, float &cos_k,
7284 0x1 .a6f7a2p -29f );
7385}
7486
87+ LIBC_INLINE void sincosf16_eval (float xf, float &sin_k, float &cos_k, float &sin_y, float &cosm1_y) {
88+ float y;
89+ int32_t k = range_reduction_sincosf16 (xf, y);
90+
91+ sincosf16_poly_eval (k, y, sin_k, cos_k, sin_y, cosm1_y);
92+ }
93+
94+ LIBC_INLINE void sincospif16_eval (float xf, float &sin_k, float &cos_k,
95+ float &sin_y, float &cosm1_y) {
96+ float y;
97+ int32_t k = range_reduction_sincospif16 (xf, y);
98+
99+ sincosf16_poly_eval (k, y, sin_k, cos_k, sin_y, cosm1_y);
100+ }
101+
75102} // namespace LIBC_NAMESPACE_DECL
76103
77104#endif // LLVM_LIBC_SRC_MATH_GENERIC_SINCOSF16_UTILS_H
0 commit comments