1010#include " src/__support/FPUtil/generic/mul.h"
1111#include " src/__support/FPUtil/nearest_integer.h"
1212#include " src/math/pow.h"
13- #include " range_reduction_double_nofma.h"
14- #include " src/__support/FPUtil/multiply_add.h"
15- #include " src/math/generic/range_reduction_double_common.h"
13+ // #include "range_reduction_double_nofma.h"
14+ // #include "src/__support/FPUtil/multiply_add.h"
15+ // #include "src/math/generic/range_reduction_double_common.h"
1616#include < iostream>
1717
1818namespace LIBC_NAMESPACE_DECL {
1919
2020LLVM_LIBC_FUNCTION (double , sinpi, (double x)) {
21-
22- // Range reduction:
23- // Given x = (k + y) * 1/128
24- // find k and y such that
25- // k = round(x * 128)
26- // y = x * 128 - k
27-
28- // x = (k + y) * 1/128 and
29- // sin(x * pi) = sin((k +y)*pi/128)
30- // = sin(k * pi/128) * cos(y * pi/128) +
31- // = sin(y * pi/128) * cos(k* pi/128)
21+ // Given x * pi = y - (k * (pi/128))
22+ // find y and k such that
23+ // y = x * pi - (k * pi/128) = x * pi - kpi/128
24+ // k = round(x, 128)
3225
3326 using FPBits = typename fputil::FPBits<double >;
3427 using DoubleDouble = fputil::DoubleDouble;
3528
36- LargeRangeReduction range_reduction_large{};
37- double k = fputil::nearest_integer (x * 128 );
38- FPBits kbits (k);
3929 FPBits xbits (x);
40- uint64_t k_bits = kbits.uintval ();
4130
42- double fff = 5.0 ;
43- [[maybe_unused]] Float128 ggg = range_reduction_small_f128 (fff);
44-
45- double y = (x * 128 ) - k;
46- constexpr DoubleDouble PI_OVER_128_DD = {0x1 .1a62633145c07p-60 ,
47- 0x1 .921fb54442d18p-6 };
48- double pi_over_128 = PI_OVER_128_DD.hi ;
49- DoubleDouble yy = fputil::exact_mult (y, pi_over_128);
31+ double k = fputil::nearest_integer (x * 128 );
32+ int k_int = static_cast <int >(k);
33+
34+ std::cout << " k" << k << std::endl;
35+
36+ double yk = x - k/128 ;
5037
38+ DoubleDouble yy = fputil::exact_mult (yk, 3.141592653589793115997963468544185161590576171875 );
39+ yy.lo = fputil::multiply_add (yk, 1.2246467991473532071737640294583966046256921246776e-16 , yy.lo );
40+
5141 uint64_t abs_u = xbits.uintval ();
5242
5343 uint64_t x_abs = abs_u & 0xFFFFFFFFFFFFFFFF ;
5444
5545 if (LIBC_UNLIKELY (x_abs == 0U ))
5646 return x;
57-
5847 if (x_abs >= 0x4330000000000000 ) {
5948 if (xbits.is_nan ())
6049 return x;
@@ -69,76 +58,38 @@ LLVM_LIBC_FUNCTION(double, sinpi, (double x)) {
6958 DoubleDouble sin_y, cos_y;
7059
7160 [[maybe_unused]] double err = generic::sincos_eval (yy, sin_y, cos_y);
72- DoubleDouble sin_k = SIN_K_PI_OVER_128[k_bits & 255 ];
73- DoubleDouble cos_k = SIN_K_PI_OVER_128[(k_bits + 64 ) & 255 ];
61+ DoubleDouble sin_k = SIN_K_PI_OVER_128[k_int & 255 ];
62+ DoubleDouble cos_k = SIN_K_PI_OVER_128[(k_int + 64 ) & 255 ];
7463
75- DoubleDouble sin_k_cos_y = fputil::quick_mult (cos_y, sin_k);
76- DoubleDouble cos_k_sin_y = fputil::quick_mult (sin_y, cos_k);
64+ std::cout << " sin_k: " << sin_k.hi << std::endl;
65+ std::cout << " sin_klo: " << sin_k.lo << std::endl;
66+ std::cout << " sin_y: " << sin_y.hi << std::endl;
67+ std::cout << " cos_y: " << cos_y.hi << std::endl;
68+ std::cout << " sin_y.lo: " << sin_y.lo << std::endl;
69+ std::cout << " cos_y.o: " << cos_y.lo << std::endl;
7770
71+ double cosm1_y = cos_y.hi - 1.0 ;
72+ DoubleDouble sin_y_cos_k = fputil::quick_mult (sin_y, cos_k);
7873
79- DoubleDouble rr = fputil::exact_add<false >(sin_k_cos_y.hi , cos_k_sin_y.hi );
80- rr.lo += sin_k_cos_y.lo + cos_k_sin_y.lo ;
81-
82- double rlp = rr.lo + err;
83- double rlm = rr.lo - err;
84-
85- double r_upper = rr.hi + rlp; // (rr.lo + ERR);
86- double r_lower = rr.hi + rlm; // (rr.lo - ERR);
87-
88- uint16_t x_e = xbits.get_biased_exponent ();
89-
90- // Ziv's rounding test.
91- if (LIBC_LIKELY (r_upper == r_lower))
92- return r_upper;
93-
94- Float128 u_f128, sin_u, cos_u;
95- if (LIBC_LIKELY (x_e < FPBits::EXP_BIAS + FAST_PASS_EXPONENT))
96- u_f128 = range_reduction_small_f128 (x);
97- else
98- u_f128 = range_reduction_large.accurate ();
99-
100- generic::sincos_eval (u_f128, sin_u, cos_u);
101-
102- auto get_sin_k = [](unsigned kk) -> Float128 {
103- unsigned idx = (kk & 64 ) ? 64 - (kk & 63 ) : (kk & 63 );
104- Float128 ans = SIN_K_PI_OVER_128_F128[idx];
105- if (kk & 128 )
106- ans.sign = Sign::NEG;
107- return ans;
108- };
109-
110- unsigned k_r = range_reduction_large.fast (x, yy);
111- std::cout << k_r << " k_r" << std::endl;
112- // cos(k * pi/128) = sin(k * pi/128 + pi/2) = sin((k + 64) * pi/128).
113- Float128 sin_k_f128 = get_sin_k (k_r);
114- Float128 cos_k_f128 = get_sin_k (k_r + 64 );
115-
116- // sin(x) = sin((k * pi/128 + u)
117- // = sin(u) * cos(k*pi/128) + cos(u) * sin(k*pi/128)
118- Float128 r = fputil::quick_add (fputil::quick_mul (sin_k_f128, cos_u),
119- fputil::quick_mul (cos_k_f128, sin_u));
120-
121- // TODO: Add assertion if Ziv's accuracy tests fail in debug mode.
122- // https://github.com/llvm/llvm-project/issues/96452.
123-
124- return static_cast <double >(r);
74+ std::cout << " cosm1" << cosm1_y << std::endl;
75+ DoubleDouble cosm1_yy;
76+ cosm1_yy.hi = cosm1_y;
77+ cosm1_yy.lo = 0.0 ;
12578
126- // double cos_ulp = cos_k.lo + err;
127- // double sin_ulp = sin_k.hi + err;
128- /*
129- double sin_yy = sin_y.hi;
130- double cos_yy = cos_y.hi;
131- double sin_kk = sin_k.hi;
132- double cos_kk = cos_k.hi;
133- */
134- /*
135- if (LIBC_UNLIKELY(sin_yy == 0 && sin_kk == 0))
136- return FPBits::zero(xbits.sign()).get_val();
137- */
138- /*
139- return static_cast<double>(fputil::multiply_add(
140- sin_yy, cos_kk, fputil::multiply_add(cos_yy, sin_kk, 0.0)));
141- */
142-
143- }
79+ DoubleDouble cos_y_sin_k = fputil::quick_mult (cos_y, sin_k);
80+ DoubleDouble rr = fputil::exact_add<false >(sin_y_cos_k.hi , cos_y_sin_k.hi );
81+
82+ std::cout << " r.hi:" << rr.hi << std::endl;
83+ std::cout << " r.lo" << rr.lo << std::endl;
84+
85+ rr.lo += sin_y_cos_k.lo + cos_y_sin_k.lo ;
86+
87+ std::cout << " rrlo2: " << rr.lo << std::endl;
88+ std::cout << " cos_y_sin_k:" << cos_y_sin_k.hi << std::endl;
89+ std::cout << " siny*cosk.lo:" << sin_y_cos_k.lo << std::endl;
90+ std::cout << " rrhi + rrlo + sink.hi " << rr.hi + rr.lo + sin_k.hi + sin_k.lo << std::endl;
91+ std::cout << " rrhi + rrlo " << rr.hi + rr.lo << std::endl;
92+
93+ return rr.hi + rr.lo ;
94+ }
14495} // namespace LIBC_NAMESPACE_DECL
0 commit comments