1*6c640833Skettenis /*-
2*6c640833Skettenis * ====================================================
3*6c640833Skettenis * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
4*6c640833Skettenis * Copyright (c) 2008 Steven G. Kargl, David Schultz, Bruce D. Evans.
5*6c640833Skettenis *
6*6c640833Skettenis * Developed at SunSoft, a Sun Microsystems, Inc. business.
7*6c640833Skettenis * Permission to use, copy, modify, and distribute this
8*6c640833Skettenis * software is freely granted, provided that this notice
9*6c640833Skettenis * is preserved.
10*6c640833Skettenis * ====================================================
11*6c640833Skettenis *
12*6c640833Skettenis * k_sinl.c and k_cosl.c merged by Steven G. Kargl
13*6c640833Skettenis */
14*6c640833Skettenis
15*6c640833Skettenis static const long double
16*6c640833Skettenis C1 = 0.04166666666666666666666666666666658424671L,
17*6c640833Skettenis C2 = -0.001388888888888888888888888888863490893732L,
18*6c640833Skettenis C3 = 0.00002480158730158730158730158600795304914210L,
19*6c640833Skettenis C4 = -0.2755731922398589065255474947078934284324e-6L,
20*6c640833Skettenis C5 = 0.2087675698786809897659225313136400793948e-8L,
21*6c640833Skettenis C6 = -0.1147074559772972315817149986812031204775e-10L,
22*6c640833Skettenis C7 = 0.4779477332386808976875457937252120293400e-13L,
23*6c640833Skettenis S1 = -0.16666666666666666666666666666666666606732416116558L,
24*6c640833Skettenis S2 = 0.0083333333333333333333333333333331135404851288270047L,
25*6c640833Skettenis S3 = -0.00019841269841269841269841269839935785325638310428717L,
26*6c640833Skettenis S4 = 0.27557319223985890652557316053039946268333231205686e-5L,
27*6c640833Skettenis S5 = -0.25052108385441718775048214826384312253862930064745e-7L,
28*6c640833Skettenis S6 = 0.16059043836821614596571832194524392581082444805729e-9L,
29*6c640833Skettenis S7 = -0.76471637318198151807063387954939213287488216303768e-12L,
30*6c640833Skettenis S8 = 0.28114572543451292625024967174638477283187397621303e-14L;
31*6c640833Skettenis
32*6c640833Skettenis static const double
33*6c640833Skettenis C8 = -0.1561920696721507929516718307820958119868e-15,
34*6c640833Skettenis C9 = 0.4110317413744594971475941557607804508039e-18,
35*6c640833Skettenis C10 = -0.8896592467191938803288521958313920156409e-21,
36*6c640833Skettenis C11 = 0.1601061435794535138244346256065192782581e-23,
37*6c640833Skettenis S9 = -0.82206352458348947812512122163446202498005154296863e-17,
38*6c640833Skettenis S10 = 0.19572940011906109418080609928334380560135358385256e-19,
39*6c640833Skettenis S11 = -0.38680813379701966970673724299207480965452616911420e-22,
40*6c640833Skettenis S12 = 0.64038150078671872796678569586315881020659912139412e-25;
41*6c640833Skettenis
42*6c640833Skettenis static inline void
__kernel_sincosl(long double x,long double y,int iy,long double * sn,long double * cs)43*6c640833Skettenis __kernel_sincosl(long double x, long double y, int iy, long double *sn,
44*6c640833Skettenis long double *cs)
45*6c640833Skettenis {
46*6c640833Skettenis long double hz, r, v, w, z;
47*6c640833Skettenis
48*6c640833Skettenis z = x * x;
49*6c640833Skettenis v = z * x;
50*6c640833Skettenis /*
51*6c640833Skettenis * XXX Replace Horner scheme with an algorithm suitable for CPUs
52*6c640833Skettenis * with more complex pipelines.
53*6c640833Skettenis */
54*6c640833Skettenis r = S2 + z * (S3 + z * (S4 + z * (S5 + z * (S6 + z * (S7 + z * (S8 +
55*6c640833Skettenis z * (S9 + z * (S10 + z * (S11 + z * S12)))))))));
56*6c640833Skettenis
57*6c640833Skettenis if (iy == 0)
58*6c640833Skettenis *sn = x + v * (S1 + z * r);
59*6c640833Skettenis else
60*6c640833Skettenis *cs = x - ((z * (y / 2 - v * r) - y) - v * S1);
61*6c640833Skettenis
62*6c640833Skettenis hz = z / 2;
63*6c640833Skettenis w = 1 - hz;
64*6c640833Skettenis r = z * (C1 + z * (C2 + z * (C3 + z * (C4 + z * (C5 + z * (C6 +
65*6c640833Skettenis z * (C7 + z * (C8 + z * (C9 + z * (C10 + z * C11))))))))));
66*6c640833Skettenis
67*6c640833Skettenis *cs = w + (((1 - w) - hz) + (z * r - x * y));
68*6c640833Skettenis }
69