1*25c28e83SPiotr Jasiukajtis /*
2*25c28e83SPiotr Jasiukajtis  * CDDL HEADER START
3*25c28e83SPiotr Jasiukajtis  *
4*25c28e83SPiotr Jasiukajtis  * The contents of this file are subject to the terms of the
5*25c28e83SPiotr Jasiukajtis  * Common Development and Distribution License (the "License").
6*25c28e83SPiotr Jasiukajtis  * You may not use this file except in compliance with the License.
7*25c28e83SPiotr Jasiukajtis  *
8*25c28e83SPiotr Jasiukajtis  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*25c28e83SPiotr Jasiukajtis  * or http://www.opensolaris.org/os/licensing.
10*25c28e83SPiotr Jasiukajtis  * See the License for the specific language governing permissions
11*25c28e83SPiotr Jasiukajtis  * and limitations under the License.
12*25c28e83SPiotr Jasiukajtis  *
13*25c28e83SPiotr Jasiukajtis  * When distributing Covered Code, include this CDDL HEADER in each
14*25c28e83SPiotr Jasiukajtis  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*25c28e83SPiotr Jasiukajtis  * If applicable, add the following below this CDDL HEADER, with the
16*25c28e83SPiotr Jasiukajtis  * fields enclosed by brackets "[]" replaced with your own identifying
17*25c28e83SPiotr Jasiukajtis  * information: Portions Copyright [yyyy] [name of copyright owner]
18*25c28e83SPiotr Jasiukajtis  *
19*25c28e83SPiotr Jasiukajtis  * CDDL HEADER END
20*25c28e83SPiotr Jasiukajtis  */
21*25c28e83SPiotr Jasiukajtis 
22*25c28e83SPiotr Jasiukajtis /*
23*25c28e83SPiotr Jasiukajtis  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
24*25c28e83SPiotr Jasiukajtis  */
25*25c28e83SPiotr Jasiukajtis /*
26*25c28e83SPiotr Jasiukajtis  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
27*25c28e83SPiotr Jasiukajtis  * Use is subject to license terms.
28*25c28e83SPiotr Jasiukajtis  */
29*25c28e83SPiotr Jasiukajtis 
30*25c28e83SPiotr Jasiukajtis #include <sys/isa_defs.h>
31*25c28e83SPiotr Jasiukajtis 
32*25c28e83SPiotr Jasiukajtis #ifdef _LITTLE_ENDIAN
33*25c28e83SPiotr Jasiukajtis #define HI(x)	*(1+(int*)x)
34*25c28e83SPiotr Jasiukajtis #define LO(x)	*(unsigned*)x
35*25c28e83SPiotr Jasiukajtis #else
36*25c28e83SPiotr Jasiukajtis #define HI(x)	*(int*)x
37*25c28e83SPiotr Jasiukajtis #define LO(x)	*(1+(unsigned*)x)
38*25c28e83SPiotr Jasiukajtis #endif
39*25c28e83SPiotr Jasiukajtis 
40*25c28e83SPiotr Jasiukajtis #ifdef __RESTRICT
41*25c28e83SPiotr Jasiukajtis #define restrict _Restrict
42*25c28e83SPiotr Jasiukajtis #else
43*25c28e83SPiotr Jasiukajtis #define restrict
44*25c28e83SPiotr Jasiukajtis #endif
45*25c28e83SPiotr Jasiukajtis 
46*25c28e83SPiotr Jasiukajtis extern const double __vlibm_TBL_sincos_hi[], __vlibm_TBL_sincos_lo[];
47*25c28e83SPiotr Jasiukajtis 
48*25c28e83SPiotr Jasiukajtis static const double
49*25c28e83SPiotr Jasiukajtis 	half[2]	= { 0.5, -0.5 },
50*25c28e83SPiotr Jasiukajtis 	one		= 1.0,
51*25c28e83SPiotr Jasiukajtis 	invpio2	= 0.636619772367581343075535,
52*25c28e83SPiotr Jasiukajtis 	pio2_1	= 1.570796326734125614166,
53*25c28e83SPiotr Jasiukajtis 	pio2_2	= 6.077100506303965976596e-11,
54*25c28e83SPiotr Jasiukajtis 	pio2_3	= 2.022266248711166455796e-21,
55*25c28e83SPiotr Jasiukajtis 	pio2_3t	= 8.478427660368899643959e-32,
56*25c28e83SPiotr Jasiukajtis 	pp1		= -1.666666666605760465276263943134982554676e-0001,
57*25c28e83SPiotr Jasiukajtis 	pp2		=  8.333261209690963126718376566146180944442e-0003,
58*25c28e83SPiotr Jasiukajtis 	qq1		= -4.999999999977710986407023955908711557870e-0001,
59*25c28e83SPiotr Jasiukajtis 	qq2		=  4.166654863857219350645055881018842089580e-0002,
60*25c28e83SPiotr Jasiukajtis 	poly1[2]= { -1.666666666666629669805215138920301589656e-0001,
61*25c28e83SPiotr Jasiukajtis 				-4.999999999999931701464060878888294524481e-0001 },
62*25c28e83SPiotr Jasiukajtis 	poly2[2]= {  8.333333332390951295683993455280336376663e-0003,
63*25c28e83SPiotr Jasiukajtis 				 4.166666666394861917535640593963708222319e-0002 },
64*25c28e83SPiotr Jasiukajtis 	poly3[2]= { -1.984126237997976692791551778230098403960e-0004,
65*25c28e83SPiotr Jasiukajtis 				-1.388888552656142867832756687736851681462e-0003 },
66*25c28e83SPiotr Jasiukajtis 	poly4[2]= {  2.753403624854277237649987622848330351110e-0006,
67*25c28e83SPiotr Jasiukajtis 				 2.478519423681460796618128289454530524759e-0005 };
68*25c28e83SPiotr Jasiukajtis 
69*25c28e83SPiotr Jasiukajtis static const unsigned thresh[2] = { 0x3fc90000, 0x3fc40000 };
70*25c28e83SPiotr Jasiukajtis 
71*25c28e83SPiotr Jasiukajtis extern void __vlibm_vcos_big(int, double *, int, double *, int, int);
72*25c28e83SPiotr Jasiukajtis 
73*25c28e83SPiotr Jasiukajtis void
__vlibm_vcos_big_ultra3(int n,double * restrict x,int stridex,double * restrict y,int stridey,int pthresh)74*25c28e83SPiotr Jasiukajtis __vlibm_vcos_big_ultra3(int n, double * restrict x, int stridex, double * restrict y,
75*25c28e83SPiotr Jasiukajtis 	int stridey, int pthresh)
76*25c28e83SPiotr Jasiukajtis {
77*25c28e83SPiotr Jasiukajtis 	double		x0_or_one[4], x1_or_one[4], x2_or_one[4];
78*25c28e83SPiotr Jasiukajtis 	double		y0_or_zero[4], y1_or_zero[4], y2_or_zero[4];
79*25c28e83SPiotr Jasiukajtis 	double		x0, x1, x2, *py0, *py1, *py2, *xsave, *ysave;
80*25c28e83SPiotr Jasiukajtis 	unsigned	xsb0, xsb1, xsb2;
81*25c28e83SPiotr Jasiukajtis 	int			i, biguns, nsave, sxsave, sysave;
82*25c28e83SPiotr Jasiukajtis 
83*25c28e83SPiotr Jasiukajtis 	nsave = n;
84*25c28e83SPiotr Jasiukajtis 	xsave = x;
85*25c28e83SPiotr Jasiukajtis 	sxsave = stridex;
86*25c28e83SPiotr Jasiukajtis 	ysave = y;
87*25c28e83SPiotr Jasiukajtis 	sysave = stridey;
88*25c28e83SPiotr Jasiukajtis 	biguns = 0;
89*25c28e83SPiotr Jasiukajtis 
90*25c28e83SPiotr Jasiukajtis 	x0_or_one[1] = 1.0;
91*25c28e83SPiotr Jasiukajtis 	x1_or_one[1] = 1.0;
92*25c28e83SPiotr Jasiukajtis 	x2_or_one[1] = 1.0;
93*25c28e83SPiotr Jasiukajtis 	x0_or_one[3] = -1.0;
94*25c28e83SPiotr Jasiukajtis 	x1_or_one[3] = -1.0;
95*25c28e83SPiotr Jasiukajtis 	x2_or_one[3] = -1.0;
96*25c28e83SPiotr Jasiukajtis 	y0_or_zero[1] = 0.0;
97*25c28e83SPiotr Jasiukajtis 	y1_or_zero[1] = 0.0;
98*25c28e83SPiotr Jasiukajtis 	y2_or_zero[1] = 0.0;
99*25c28e83SPiotr Jasiukajtis 	y0_or_zero[3] = 0.0;
100*25c28e83SPiotr Jasiukajtis 	y1_or_zero[3] = 0.0;
101*25c28e83SPiotr Jasiukajtis 	y2_or_zero[3] = 0.0;
102*25c28e83SPiotr Jasiukajtis 
103*25c28e83SPiotr Jasiukajtis 	do
104*25c28e83SPiotr Jasiukajtis 	{
105*25c28e83SPiotr Jasiukajtis 		double		fn0, fn1, fn2, a0, a1, a2, w0, w1, w2, y0, y1, y2;
106*25c28e83SPiotr Jasiukajtis 		unsigned	hx;
107*25c28e83SPiotr Jasiukajtis 		int			n0, n1, n2;
108*25c28e83SPiotr Jasiukajtis 
109*25c28e83SPiotr Jasiukajtis loop0:
110*25c28e83SPiotr Jasiukajtis 		hx = HI(x);
111*25c28e83SPiotr Jasiukajtis 		xsb0 = hx >> 31;
112*25c28e83SPiotr Jasiukajtis 		hx &= ~0x80000000;
113*25c28e83SPiotr Jasiukajtis 		if (hx <= pthresh || hx > 0x413921fb)
114*25c28e83SPiotr Jasiukajtis 		{
115*25c28e83SPiotr Jasiukajtis 			if (hx > 0x413921fb && hx < 0x7ff00000)
116*25c28e83SPiotr Jasiukajtis 				biguns = 1;
117*25c28e83SPiotr Jasiukajtis 			x += stridex;
118*25c28e83SPiotr Jasiukajtis 			y += stridey;
119*25c28e83SPiotr Jasiukajtis 			i = 0;
120*25c28e83SPiotr Jasiukajtis 			if (--n <= 0)
121*25c28e83SPiotr Jasiukajtis 				break;
122*25c28e83SPiotr Jasiukajtis 			goto loop0;
123*25c28e83SPiotr Jasiukajtis 		}
124*25c28e83SPiotr Jasiukajtis 		x0 = *x;
125*25c28e83SPiotr Jasiukajtis 		py0 = y;
126*25c28e83SPiotr Jasiukajtis 		x += stridex;
127*25c28e83SPiotr Jasiukajtis 		y += stridey;
128*25c28e83SPiotr Jasiukajtis 		i = 1;
129*25c28e83SPiotr Jasiukajtis 		if (--n <= 0)
130*25c28e83SPiotr Jasiukajtis 			break;
131*25c28e83SPiotr Jasiukajtis 
132*25c28e83SPiotr Jasiukajtis loop1:
133*25c28e83SPiotr Jasiukajtis 		hx = HI(x);
134*25c28e83SPiotr Jasiukajtis 		xsb1 = hx >> 31;
135*25c28e83SPiotr Jasiukajtis 		hx &= ~0x80000000;
136*25c28e83SPiotr Jasiukajtis 		if (hx <= pthresh || hx > 0x413921fb)
137*25c28e83SPiotr Jasiukajtis 		{
138*25c28e83SPiotr Jasiukajtis 			if (hx > 0x413921fb && hx < 0x7ff00000)
139*25c28e83SPiotr Jasiukajtis 				biguns = 1;
140*25c28e83SPiotr Jasiukajtis 			x += stridex;
141*25c28e83SPiotr Jasiukajtis 			y += stridey;
142*25c28e83SPiotr Jasiukajtis 			i = 1;
143*25c28e83SPiotr Jasiukajtis 			if (--n <= 0)
144*25c28e83SPiotr Jasiukajtis 				break;
145*25c28e83SPiotr Jasiukajtis 			goto loop1;
146*25c28e83SPiotr Jasiukajtis 		}
147*25c28e83SPiotr Jasiukajtis 		x1 = *x;
148*25c28e83SPiotr Jasiukajtis 		py1 = y;
149*25c28e83SPiotr Jasiukajtis 		x += stridex;
150*25c28e83SPiotr Jasiukajtis 		y += stridey;
151*25c28e83SPiotr Jasiukajtis 		i = 2;
152*25c28e83SPiotr Jasiukajtis 		if (--n <= 0)
153*25c28e83SPiotr Jasiukajtis 			break;
154*25c28e83SPiotr Jasiukajtis 
155*25c28e83SPiotr Jasiukajtis loop2:
156*25c28e83SPiotr Jasiukajtis 		hx = HI(x);
157*25c28e83SPiotr Jasiukajtis 		xsb2 = hx >> 31;
158*25c28e83SPiotr Jasiukajtis 		hx &= ~0x80000000;
159*25c28e83SPiotr Jasiukajtis 		if (hx <= pthresh || hx > 0x413921fb)
160*25c28e83SPiotr Jasiukajtis 		{
161*25c28e83SPiotr Jasiukajtis 			if (hx > 0x413921fb && hx < 0x7ff00000)
162*25c28e83SPiotr Jasiukajtis 				biguns = 1;
163*25c28e83SPiotr Jasiukajtis 			x += stridex;
164*25c28e83SPiotr Jasiukajtis 			y += stridey;
165*25c28e83SPiotr Jasiukajtis 			i = 2;
166*25c28e83SPiotr Jasiukajtis 			if (--n <= 0)
167*25c28e83SPiotr Jasiukajtis 				break;
168*25c28e83SPiotr Jasiukajtis 			goto loop2;
169*25c28e83SPiotr Jasiukajtis 		}
170*25c28e83SPiotr Jasiukajtis 		x2 = *x;
171*25c28e83SPiotr Jasiukajtis 		py2 = y;
172*25c28e83SPiotr Jasiukajtis 
173*25c28e83SPiotr Jasiukajtis 		n0 = (int) (x0 * invpio2 + half[xsb0]);
174*25c28e83SPiotr Jasiukajtis 		n1 = (int) (x1 * invpio2 + half[xsb1]);
175*25c28e83SPiotr Jasiukajtis 		n2 = (int) (x2 * invpio2 + half[xsb2]);
176*25c28e83SPiotr Jasiukajtis 		fn0 = (double) n0;
177*25c28e83SPiotr Jasiukajtis 		fn1 = (double) n1;
178*25c28e83SPiotr Jasiukajtis 		fn2 = (double) n2;
179*25c28e83SPiotr Jasiukajtis 		n0 = (n0 + 1) & 3; /* Add 1 (before the mod) to make sin into cos */
180*25c28e83SPiotr Jasiukajtis 		n1 = (n1 + 1) & 3;
181*25c28e83SPiotr Jasiukajtis 		n2 = (n2 + 1) & 3;
182*25c28e83SPiotr Jasiukajtis 		a0 = x0 - fn0 * pio2_1;
183*25c28e83SPiotr Jasiukajtis 		a1 = x1 - fn1 * pio2_1;
184*25c28e83SPiotr Jasiukajtis 		a2 = x2 - fn2 * pio2_1;
185*25c28e83SPiotr Jasiukajtis 		w0 = fn0 * pio2_2;
186*25c28e83SPiotr Jasiukajtis 		w1 = fn1 * pio2_2;
187*25c28e83SPiotr Jasiukajtis 		w2 = fn2 * pio2_2;
188*25c28e83SPiotr Jasiukajtis 		x0 = a0 - w0;
189*25c28e83SPiotr Jasiukajtis 		x1 = a1 - w1;
190*25c28e83SPiotr Jasiukajtis 		x2 = a2 - w2;
191*25c28e83SPiotr Jasiukajtis 		y0 = (a0 - x0) - w0;
192*25c28e83SPiotr Jasiukajtis 		y1 = (a1 - x1) - w1;
193*25c28e83SPiotr Jasiukajtis 		y2 = (a2 - x2) - w2;
194*25c28e83SPiotr Jasiukajtis 		a0 = x0;
195*25c28e83SPiotr Jasiukajtis 		a1 = x1;
196*25c28e83SPiotr Jasiukajtis 		a2 = x2;
197*25c28e83SPiotr Jasiukajtis 		w0 = fn0 * pio2_3 - y0;
198*25c28e83SPiotr Jasiukajtis 		w1 = fn1 * pio2_3 - y1;
199*25c28e83SPiotr Jasiukajtis 		w2 = fn2 * pio2_3 - y2;
200*25c28e83SPiotr Jasiukajtis 		x0 = a0 - w0;
201*25c28e83SPiotr Jasiukajtis 		x1 = a1 - w1;
202*25c28e83SPiotr Jasiukajtis 		x2 = a2 - w2;
203*25c28e83SPiotr Jasiukajtis 		y0 = (a0 - x0) - w0;
204*25c28e83SPiotr Jasiukajtis 		y1 = (a1 - x1) - w1;
205*25c28e83SPiotr Jasiukajtis 		y2 = (a2 - x2) - w2;
206*25c28e83SPiotr Jasiukajtis 		a0 = x0;
207*25c28e83SPiotr Jasiukajtis 		a1 = x1;
208*25c28e83SPiotr Jasiukajtis 		a2 = x2;
209*25c28e83SPiotr Jasiukajtis 		w0 = fn0 * pio2_3t - y0;
210*25c28e83SPiotr Jasiukajtis 		w1 = fn1 * pio2_3t - y1;
211*25c28e83SPiotr Jasiukajtis 		w2 = fn2 * pio2_3t - y2;
212*25c28e83SPiotr Jasiukajtis 		x0 = a0 - w0;
213*25c28e83SPiotr Jasiukajtis 		x1 = a1 - w1;
214*25c28e83SPiotr Jasiukajtis 		x2 = a2 - w2;
215*25c28e83SPiotr Jasiukajtis 		y0 = (a0 - x0) - w0;
216*25c28e83SPiotr Jasiukajtis 		y1 = (a1 - x1) - w1;
217*25c28e83SPiotr Jasiukajtis 		y2 = (a2 - x2) - w2;
218*25c28e83SPiotr Jasiukajtis 		xsb0 = HI(&x0);
219*25c28e83SPiotr Jasiukajtis 		i = ((xsb0 & ~0x80000000) - thresh[n0&1]) >> 31;
220*25c28e83SPiotr Jasiukajtis 		xsb1 = HI(&x1);
221*25c28e83SPiotr Jasiukajtis 		i |= (((xsb1 & ~0x80000000) - thresh[n1&1]) >> 30) & 2;
222*25c28e83SPiotr Jasiukajtis 		xsb2 = HI(&x2);
223*25c28e83SPiotr Jasiukajtis 		i |= (((xsb2 & ~0x80000000) - thresh[n2&1]) >> 29) & 4;
224*25c28e83SPiotr Jasiukajtis 		switch (i)
225*25c28e83SPiotr Jasiukajtis 		{
226*25c28e83SPiotr Jasiukajtis 			double		t0, t1, t2, z0, z1, z2;
227*25c28e83SPiotr Jasiukajtis 			unsigned	j0, j1, j2;
228*25c28e83SPiotr Jasiukajtis 
229*25c28e83SPiotr Jasiukajtis 		case 0:
230*25c28e83SPiotr Jasiukajtis 			j0 = (xsb0 + 0x4000) & 0xffff8000;
231*25c28e83SPiotr Jasiukajtis 			j1 = (xsb1 + 0x4000) & 0xffff8000;
232*25c28e83SPiotr Jasiukajtis 			j2 = (xsb2 + 0x4000) & 0xffff8000;
233*25c28e83SPiotr Jasiukajtis 			HI(&t0) = j0;
234*25c28e83SPiotr Jasiukajtis 			HI(&t1) = j1;
235*25c28e83SPiotr Jasiukajtis 			HI(&t2) = j2;
236*25c28e83SPiotr Jasiukajtis 			LO(&t0) = 0;
237*25c28e83SPiotr Jasiukajtis 			LO(&t1) = 0;
238*25c28e83SPiotr Jasiukajtis 			LO(&t2) = 0;
239*25c28e83SPiotr Jasiukajtis 			x0 = (x0 - t0) + y0;
240*25c28e83SPiotr Jasiukajtis 			x1 = (x1 - t1) + y1;
241*25c28e83SPiotr Jasiukajtis 			x2 = (x2 - t2) + y2;
242*25c28e83SPiotr Jasiukajtis 			z0 = x0 * x0;
243*25c28e83SPiotr Jasiukajtis 			z1 = x1 * x1;
244*25c28e83SPiotr Jasiukajtis 			z2 = x2 * x2;
245*25c28e83SPiotr Jasiukajtis 			t0 = z0 * (qq1 + z0 * qq2);
246*25c28e83SPiotr Jasiukajtis 			t1 = z1 * (qq1 + z1 * qq2);
247*25c28e83SPiotr Jasiukajtis 			t2 = z2 * (qq1 + z2 * qq2);
248*25c28e83SPiotr Jasiukajtis 			w0 = x0 * (one + z0 * (pp1 + z0 * pp2));
249*25c28e83SPiotr Jasiukajtis 			w1 = x1 * (one + z1 * (pp1 + z1 * pp2));
250*25c28e83SPiotr Jasiukajtis 			w2 = x2 * (one + z2 * (pp1 + z2 * pp2));
251*25c28e83SPiotr Jasiukajtis 			j0 = (((j0 & ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
252*25c28e83SPiotr Jasiukajtis 			j1 = (((j1 & ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
253*25c28e83SPiotr Jasiukajtis 			j2 = (((j2 & ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
254*25c28e83SPiotr Jasiukajtis 			xsb0 = (xsb0 >> 30) & 2;
255*25c28e83SPiotr Jasiukajtis 			xsb1 = (xsb1 >> 30) & 2;
256*25c28e83SPiotr Jasiukajtis 			xsb2 = (xsb2 >> 30) & 2;
257*25c28e83SPiotr Jasiukajtis 			n0 ^= (xsb0 & ~(n0 << 1));
258*25c28e83SPiotr Jasiukajtis 			n1 ^= (xsb1 & ~(n1 << 1));
259*25c28e83SPiotr Jasiukajtis 			n2 ^= (xsb2 & ~(n2 << 1));
260*25c28e83SPiotr Jasiukajtis 			xsb0 |= 1;
261*25c28e83SPiotr Jasiukajtis 			xsb1 |= 1;
262*25c28e83SPiotr Jasiukajtis 			xsb2 |= 1;
263*25c28e83SPiotr Jasiukajtis 			a0 = __vlibm_TBL_sincos_hi[j0+n0];
264*25c28e83SPiotr Jasiukajtis 			a1 = __vlibm_TBL_sincos_hi[j1+n1];
265*25c28e83SPiotr Jasiukajtis 			a2 = __vlibm_TBL_sincos_hi[j2+n2];
266*25c28e83SPiotr Jasiukajtis 			t0 = (__vlibm_TBL_sincos_hi[j0+((n0+xsb0)&3)] * w0 + a0 * t0) + __vlibm_TBL_sincos_lo[j0+n0];
267*25c28e83SPiotr Jasiukajtis 			t1 = (__vlibm_TBL_sincos_hi[j1+((n1+xsb1)&3)] * w1 + a1 * t1) + __vlibm_TBL_sincos_lo[j1+n1];
268*25c28e83SPiotr Jasiukajtis 			t2 = (__vlibm_TBL_sincos_hi[j2+((n2+xsb2)&3)] * w2 + a2 * t2) + __vlibm_TBL_sincos_lo[j2+n2];
269*25c28e83SPiotr Jasiukajtis 			*py0 = ( a0 + t0 );
270*25c28e83SPiotr Jasiukajtis 			*py1 = ( a1 + t1 );
271*25c28e83SPiotr Jasiukajtis 			*py2 = ( a2 + t2 );
272*25c28e83SPiotr Jasiukajtis 			break;
273*25c28e83SPiotr Jasiukajtis 
274*25c28e83SPiotr Jasiukajtis 		case 1:
275*25c28e83SPiotr Jasiukajtis 			j0 = n0 & 1;
276*25c28e83SPiotr Jasiukajtis 			j1 = (xsb1 + 0x4000) & 0xffff8000;
277*25c28e83SPiotr Jasiukajtis 			j2 = (xsb2 + 0x4000) & 0xffff8000;
278*25c28e83SPiotr Jasiukajtis 			HI(&t1) = j1;
279*25c28e83SPiotr Jasiukajtis 			HI(&t2) = j2;
280*25c28e83SPiotr Jasiukajtis 			LO(&t1) = 0;
281*25c28e83SPiotr Jasiukajtis 			LO(&t2) = 0;
282*25c28e83SPiotr Jasiukajtis 			x0_or_one[0] = x0;
283*25c28e83SPiotr Jasiukajtis 			x0_or_one[2] = -x0;
284*25c28e83SPiotr Jasiukajtis 			y0_or_zero[0] = y0;
285*25c28e83SPiotr Jasiukajtis 			y0_or_zero[2] = -y0;
286*25c28e83SPiotr Jasiukajtis 			x1 = (x1 - t1) + y1;
287*25c28e83SPiotr Jasiukajtis 			x2 = (x2 - t2) + y2;
288*25c28e83SPiotr Jasiukajtis 			z0 = x0 * x0;
289*25c28e83SPiotr Jasiukajtis 			z1 = x1 * x1;
290*25c28e83SPiotr Jasiukajtis 			z2 = x2 * x2;
291*25c28e83SPiotr Jasiukajtis 			t0 = z0 * (poly3[j0] + z0 * poly4[j0]);
292*25c28e83SPiotr Jasiukajtis 			t1 = z1 * (qq1 + z1 * qq2);
293*25c28e83SPiotr Jasiukajtis 			t2 = z2 * (qq1 + z2 * qq2);
294*25c28e83SPiotr Jasiukajtis 			t0 = z0 * (poly1[j0] + z0 * (poly2[j0] + t0));
295*25c28e83SPiotr Jasiukajtis 			w1 = x1 * (one + z1 * (pp1 + z1 * pp2));
296*25c28e83SPiotr Jasiukajtis 			w2 = x2 * (one + z2 * (pp1 + z2 * pp2));
297*25c28e83SPiotr Jasiukajtis 			j1 = (((j1 & ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
298*25c28e83SPiotr Jasiukajtis 			j2 = (((j2 & ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
299*25c28e83SPiotr Jasiukajtis 			xsb1 = (xsb1 >> 30) & 2;
300*25c28e83SPiotr Jasiukajtis 			xsb2 = (xsb2 >> 30) & 2;
301*25c28e83SPiotr Jasiukajtis 			n1 ^= (xsb1 & ~(n1 << 1));
302*25c28e83SPiotr Jasiukajtis 			n2 ^= (xsb2 & ~(n2 << 1));
303*25c28e83SPiotr Jasiukajtis 			xsb1 |= 1;
304*25c28e83SPiotr Jasiukajtis 			xsb2 |= 1;
305*25c28e83SPiotr Jasiukajtis 			a1 = __vlibm_TBL_sincos_hi[j1+n1];
306*25c28e83SPiotr Jasiukajtis 			a2 = __vlibm_TBL_sincos_hi[j2+n2];
307*25c28e83SPiotr Jasiukajtis 			t0 = x0_or_one[n0] + (y0_or_zero[n0] + x0_or_one[n0] * t0);
308*25c28e83SPiotr Jasiukajtis 			t1 = (__vlibm_TBL_sincos_hi[j1+((n1+xsb1)&3)] * w1 + a1 * t1) + __vlibm_TBL_sincos_lo[j1+n1];
309*25c28e83SPiotr Jasiukajtis 			t2 = (__vlibm_TBL_sincos_hi[j2+((n2+xsb2)&3)] * w2 + a2 * t2) + __vlibm_TBL_sincos_lo[j2+n2];
310*25c28e83SPiotr Jasiukajtis 			*py0 = t0;
311*25c28e83SPiotr Jasiukajtis 			*py1 = ( a1 + t1 );
312*25c28e83SPiotr Jasiukajtis 			*py2 = ( a2 + t2 );
313*25c28e83SPiotr Jasiukajtis 			break;
314*25c28e83SPiotr Jasiukajtis 
315*25c28e83SPiotr Jasiukajtis 		case 2:
316*25c28e83SPiotr Jasiukajtis 			j0 = (xsb0 + 0x4000) & 0xffff8000;
317*25c28e83SPiotr Jasiukajtis 			j1 = n1 & 1;
318*25c28e83SPiotr Jasiukajtis 			j2 = (xsb2 + 0x4000) & 0xffff8000;
319*25c28e83SPiotr Jasiukajtis 			HI(&t0) = j0;
320*25c28e83SPiotr Jasiukajtis 			HI(&t2) = j2;
321*25c28e83SPiotr Jasiukajtis 			LO(&t0) = 0;
322*25c28e83SPiotr Jasiukajtis 			LO(&t2) = 0;
323*25c28e83SPiotr Jasiukajtis 			x1_or_one[0] = x1;
324*25c28e83SPiotr Jasiukajtis 			x1_or_one[2] = -x1;
325*25c28e83SPiotr Jasiukajtis 			x0 = (x0 - t0) + y0;
326*25c28e83SPiotr Jasiukajtis 			y1_or_zero[0] = y1;
327*25c28e83SPiotr Jasiukajtis 			y1_or_zero[2] = -y1;
328*25c28e83SPiotr Jasiukajtis 			x2 = (x2 - t2) + y2;
329*25c28e83SPiotr Jasiukajtis 			z0 = x0 * x0;
330*25c28e83SPiotr Jasiukajtis 			z1 = x1 * x1;
331*25c28e83SPiotr Jasiukajtis 			z2 = x2 * x2;
332*25c28e83SPiotr Jasiukajtis 			t0 = z0 * (qq1 + z0 * qq2);
333*25c28e83SPiotr Jasiukajtis 			t1 = z1 * (poly3[j1] + z1 * poly4[j1]);
334*25c28e83SPiotr Jasiukajtis 			t2 = z2 * (qq1 + z2 * qq2);
335*25c28e83SPiotr Jasiukajtis 			w0 = x0 * (one + z0 * (pp1 + z0 * pp2));
336*25c28e83SPiotr Jasiukajtis 			t1 = z1 * (poly1[j1] + z1 * (poly2[j1] + t1));
337*25c28e83SPiotr Jasiukajtis 			w2 = x2 * (one + z2 * (pp1 + z2 * pp2));
338*25c28e83SPiotr Jasiukajtis 			j0 = (((j0 & ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
339*25c28e83SPiotr Jasiukajtis 			j2 = (((j2 & ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
340*25c28e83SPiotr Jasiukajtis 			xsb0 = (xsb0 >> 30) & 2;
341*25c28e83SPiotr Jasiukajtis 			xsb2 = (xsb2 >> 30) & 2;
342*25c28e83SPiotr Jasiukajtis 			n0 ^= (xsb0 & ~(n0 << 1));
343*25c28e83SPiotr Jasiukajtis 			n2 ^= (xsb2 & ~(n2 << 1));
344*25c28e83SPiotr Jasiukajtis 			xsb0 |= 1;
345*25c28e83SPiotr Jasiukajtis 			xsb2 |= 1;
346*25c28e83SPiotr Jasiukajtis 			a0 = __vlibm_TBL_sincos_hi[j0+n0];
347*25c28e83SPiotr Jasiukajtis 			a2 = __vlibm_TBL_sincos_hi[j2+n2];
348*25c28e83SPiotr Jasiukajtis 			t0 = (__vlibm_TBL_sincos_hi[j0+((n0+xsb0)&3)] * w0 + a0 * t0) + __vlibm_TBL_sincos_lo[j0+n0];
349*25c28e83SPiotr Jasiukajtis 			t1 = x1_or_one[n1] + (y1_or_zero[n1] + x1_or_one[n1] * t1);
350*25c28e83SPiotr Jasiukajtis 			t2 = (__vlibm_TBL_sincos_hi[j2+((n2+xsb2)&3)] * w2 + a2 * t2) + __vlibm_TBL_sincos_lo[j2+n2];
351*25c28e83SPiotr Jasiukajtis 			*py0 = ( a0 + t0 );
352*25c28e83SPiotr Jasiukajtis 			*py1 = t1;
353*25c28e83SPiotr Jasiukajtis 			*py2 = ( a2 + t2 );
354*25c28e83SPiotr Jasiukajtis 			break;
355*25c28e83SPiotr Jasiukajtis 
356*25c28e83SPiotr Jasiukajtis 		case 3:
357*25c28e83SPiotr Jasiukajtis 			j0 = n0 & 1;
358*25c28e83SPiotr Jasiukajtis 			j1 = n1 & 1;
359*25c28e83SPiotr Jasiukajtis 			j2 = (xsb2 + 0x4000) & 0xffff8000;
360*25c28e83SPiotr Jasiukajtis 			HI(&t2) = j2;
361*25c28e83SPiotr Jasiukajtis 			LO(&t2) = 0;
362*25c28e83SPiotr Jasiukajtis 			x0_or_one[0] = x0;
363*25c28e83SPiotr Jasiukajtis 			x0_or_one[2] = -x0;
364*25c28e83SPiotr Jasiukajtis 			x1_or_one[0] = x1;
365*25c28e83SPiotr Jasiukajtis 			x1_or_one[2] = -x1;
366*25c28e83SPiotr Jasiukajtis 			y0_or_zero[0] = y0;
367*25c28e83SPiotr Jasiukajtis 			y0_or_zero[2] = -y0;
368*25c28e83SPiotr Jasiukajtis 			y1_or_zero[0] = y1;
369*25c28e83SPiotr Jasiukajtis 			y1_or_zero[2] = -y1;
370*25c28e83SPiotr Jasiukajtis 			x2 = (x2 - t2) + y2;
371*25c28e83SPiotr Jasiukajtis 			z0 = x0 * x0;
372*25c28e83SPiotr Jasiukajtis 			z1 = x1 * x1;
373*25c28e83SPiotr Jasiukajtis 			z2 = x2 * x2;
374*25c28e83SPiotr Jasiukajtis 			t0 = z0 * (poly3[j0] + z0 * poly4[j0]);
375*25c28e83SPiotr Jasiukajtis 			t1 = z1 * (poly3[j1] + z1 * poly4[j1]);
376*25c28e83SPiotr Jasiukajtis 			t2 = z2 * (qq1 + z2 * qq2);
377*25c28e83SPiotr Jasiukajtis 			t0 = z0 * (poly1[j0] + z0 * (poly2[j0] + t0));
378*25c28e83SPiotr Jasiukajtis 			t1 = z1 * (poly1[j1] + z1 * (poly2[j1] + t1));
379*25c28e83SPiotr Jasiukajtis 			w2 = x2 * (one + z2 * (pp1 + z2 * pp2));
380*25c28e83SPiotr Jasiukajtis 			j2 = (((j2 & ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
381*25c28e83SPiotr Jasiukajtis 			xsb2 = (xsb2 >> 30) & 2;
382*25c28e83SPiotr Jasiukajtis 			n2 ^= (xsb2 & ~(n2 << 1));
383*25c28e83SPiotr Jasiukajtis 			xsb2 |= 1;
384*25c28e83SPiotr Jasiukajtis 			a2 = __vlibm_TBL_sincos_hi[j2+n2];
385*25c28e83SPiotr Jasiukajtis 			t0 = x0_or_one[n0] + (y0_or_zero[n0] + x0_or_one[n0] * t0);
386*25c28e83SPiotr Jasiukajtis 			t1 = x1_or_one[n1] + (y1_or_zero[n1] + x1_or_one[n1] * t1);
387*25c28e83SPiotr Jasiukajtis 			t2 = (__vlibm_TBL_sincos_hi[j2+((n2+xsb2)&3)] * w2 + a2 * t2) + __vlibm_TBL_sincos_lo[j2+n2];
388*25c28e83SPiotr Jasiukajtis 			*py0 = t0;
389*25c28e83SPiotr Jasiukajtis 			*py1 = t1;
390*25c28e83SPiotr Jasiukajtis 			*py2 = ( a2 + t2 );
391*25c28e83SPiotr Jasiukajtis 			break;
392*25c28e83SPiotr Jasiukajtis 
393*25c28e83SPiotr Jasiukajtis 		case 4:
394*25c28e83SPiotr Jasiukajtis 			j0 = (xsb0 + 0x4000) & 0xffff8000;
395*25c28e83SPiotr Jasiukajtis 			j1 = (xsb1 + 0x4000) & 0xffff8000;
396*25c28e83SPiotr Jasiukajtis 			j2 = n2 & 1;
397*25c28e83SPiotr Jasiukajtis 			HI(&t0) = j0;
398*25c28e83SPiotr Jasiukajtis 			HI(&t1) = j1;
399*25c28e83SPiotr Jasiukajtis 			LO(&t0) = 0;
400*25c28e83SPiotr Jasiukajtis 			LO(&t1) = 0;
401*25c28e83SPiotr Jasiukajtis 			x2_or_one[0] = x2;
402*25c28e83SPiotr Jasiukajtis 			x2_or_one[2] = -x2;
403*25c28e83SPiotr Jasiukajtis 			x0 = (x0 - t0) + y0;
404*25c28e83SPiotr Jasiukajtis 			x1 = (x1 - t1) + y1;
405*25c28e83SPiotr Jasiukajtis 			y2_or_zero[0] = y2;
406*25c28e83SPiotr Jasiukajtis 			y2_or_zero[2] = -y2;
407*25c28e83SPiotr Jasiukajtis 			z0 = x0 * x0;
408*25c28e83SPiotr Jasiukajtis 			z1 = x1 * x1;
409*25c28e83SPiotr Jasiukajtis 			z2 = x2 * x2;
410*25c28e83SPiotr Jasiukajtis 			t0 = z0 * (qq1 + z0 * qq2);
411*25c28e83SPiotr Jasiukajtis 			t1 = z1 * (qq1 + z1 * qq2);
412*25c28e83SPiotr Jasiukajtis 			t2 = z2 * (poly3[j2] + z2 * poly4[j2]);
413*25c28e83SPiotr Jasiukajtis 			w0 = x0 * (one + z0 * (pp1 + z0 * pp2));
414*25c28e83SPiotr Jasiukajtis 			w1 = x1 * (one + z1 * (pp1 + z1 * pp2));
415*25c28e83SPiotr Jasiukajtis 			t2 = z2 * (poly1[j2] + z2 * (poly2[j2] + t2));
416*25c28e83SPiotr Jasiukajtis 			j0 = (((j0 & ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
417*25c28e83SPiotr Jasiukajtis 			j1 = (((j1 & ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
418*25c28e83SPiotr Jasiukajtis 			xsb0 = (xsb0 >> 30) & 2;
419*25c28e83SPiotr Jasiukajtis 			xsb1 = (xsb1 >> 30) & 2;
420*25c28e83SPiotr Jasiukajtis 			n0 ^= (xsb0 & ~(n0 << 1));
421*25c28e83SPiotr Jasiukajtis 			n1 ^= (xsb1 & ~(n1 << 1));
422*25c28e83SPiotr Jasiukajtis 			xsb0 |= 1;
423*25c28e83SPiotr Jasiukajtis 			xsb1 |= 1;
424*25c28e83SPiotr Jasiukajtis 			a0 = __vlibm_TBL_sincos_hi[j0+n0];
425*25c28e83SPiotr Jasiukajtis 			a1 = __vlibm_TBL_sincos_hi[j1+n1];
426*25c28e83SPiotr Jasiukajtis 			t0 = (__vlibm_TBL_sincos_hi[j0+((n0+xsb0)&3)] * w0 + a0 * t0) + __vlibm_TBL_sincos_lo[j0+n0];
427*25c28e83SPiotr Jasiukajtis 			t1 = (__vlibm_TBL_sincos_hi[j1+((n1+xsb1)&3)] * w1 + a1 * t1) + __vlibm_TBL_sincos_lo[j1+n1];
428*25c28e83SPiotr Jasiukajtis 			t2 = x2_or_one[n2] + (y2_or_zero[n2] + x2_or_one[n2] * t2);
429*25c28e83SPiotr Jasiukajtis 			*py0 = ( a0 + t0 );
430*25c28e83SPiotr Jasiukajtis 			*py1 = ( a1 + t1 );
431*25c28e83SPiotr Jasiukajtis 			*py2 = t2;
432*25c28e83SPiotr Jasiukajtis 			break;
433*25c28e83SPiotr Jasiukajtis 
434*25c28e83SPiotr Jasiukajtis 		case 5:
435*25c28e83SPiotr Jasiukajtis 			j0 = n0 & 1;
436*25c28e83SPiotr Jasiukajtis 			j1 = (xsb1 + 0x4000) & 0xffff8000;
437*25c28e83SPiotr Jasiukajtis 			j2 = n2 & 1;
438*25c28e83SPiotr Jasiukajtis 			HI(&t1) = j1;
439*25c28e83SPiotr Jasiukajtis 			LO(&t1) = 0;
440*25c28e83SPiotr Jasiukajtis 			x0_or_one[0] = x0;
441*25c28e83SPiotr Jasiukajtis 			x0_or_one[2] = -x0;
442*25c28e83SPiotr Jasiukajtis 			x2_or_one[0] = x2;
443*25c28e83SPiotr Jasiukajtis 			x2_or_one[2] = -x2;
444*25c28e83SPiotr Jasiukajtis 			y0_or_zero[0] = y0;
445*25c28e83SPiotr Jasiukajtis 			y0_or_zero[2] = -y0;
446*25c28e83SPiotr Jasiukajtis 			x1 = (x1 - t1) + y1;
447*25c28e83SPiotr Jasiukajtis 			y2_or_zero[0] = y2;
448*25c28e83SPiotr Jasiukajtis 			y2_or_zero[2] = -y2;
449*25c28e83SPiotr Jasiukajtis 			z0 = x0 * x0;
450*25c28e83SPiotr Jasiukajtis 			z1 = x1 * x1;
451*25c28e83SPiotr Jasiukajtis 			z2 = x2 * x2;
452*25c28e83SPiotr Jasiukajtis 			t0 = z0 * (poly3[j0] + z0 * poly4[j0]);
453*25c28e83SPiotr Jasiukajtis 			t1 = z1 * (qq1 + z1 * qq2);
454*25c28e83SPiotr Jasiukajtis 			t2 = z2 * (poly3[j2] + z2 * poly4[j2]);
455*25c28e83SPiotr Jasiukajtis 			t0 = z0 * (poly1[j0] + z0 * (poly2[j0] + t0));
456*25c28e83SPiotr Jasiukajtis 			w1 = x1 * (one + z1 * (pp1 + z1 * pp2));
457*25c28e83SPiotr Jasiukajtis 			t2 = z2 * (poly1[j2] + z2 * (poly2[j2] + t2));
458*25c28e83SPiotr Jasiukajtis 			j1 = (((j1 & ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
459*25c28e83SPiotr Jasiukajtis 			xsb1 = (xsb1 >> 30) & 2;
460*25c28e83SPiotr Jasiukajtis 			n1 ^= (xsb1 & ~(n1 << 1));
461*25c28e83SPiotr Jasiukajtis 			xsb1 |= 1;
462*25c28e83SPiotr Jasiukajtis 			a1 = __vlibm_TBL_sincos_hi[j1+n1];
463*25c28e83SPiotr Jasiukajtis 			t0 = x0_or_one[n0] + (y0_or_zero[n0] + x0_or_one[n0] * t0);
464*25c28e83SPiotr Jasiukajtis 			t1 = (__vlibm_TBL_sincos_hi[j1+((n1+xsb1)&3)] * w1 + a1 * t1) + __vlibm_TBL_sincos_lo[j1+n1];
465*25c28e83SPiotr Jasiukajtis 			t2 = x2_or_one[n2] + (y2_or_zero[n2] + x2_or_one[n2] * t2);
466*25c28e83SPiotr Jasiukajtis 			*py0 = t0;
467*25c28e83SPiotr Jasiukajtis 			*py1 = ( a1 + t1 );
468*25c28e83SPiotr Jasiukajtis 			*py2 = t2;
469*25c28e83SPiotr Jasiukajtis 			break;
470*25c28e83SPiotr Jasiukajtis 
471*25c28e83SPiotr Jasiukajtis 		case 6:
472*25c28e83SPiotr Jasiukajtis 			j0 = (xsb0 + 0x4000) & 0xffff8000;
473*25c28e83SPiotr Jasiukajtis 			j1 = n1 & 1;
474*25c28e83SPiotr Jasiukajtis 			j2 = n2 & 1;
475*25c28e83SPiotr Jasiukajtis 			HI(&t0) = j0;
476*25c28e83SPiotr Jasiukajtis 			LO(&t0) = 0;
477*25c28e83SPiotr Jasiukajtis 			x1_or_one[0] = x1;
478*25c28e83SPiotr Jasiukajtis 			x1_or_one[2] = -x1;
479*25c28e83SPiotr Jasiukajtis 			x2_or_one[0] = x2;
480*25c28e83SPiotr Jasiukajtis 			x2_or_one[2] = -x2;
481*25c28e83SPiotr Jasiukajtis 			x0 = (x0 - t0) + y0;
482*25c28e83SPiotr Jasiukajtis 			y1_or_zero[0] = y1;
483*25c28e83SPiotr Jasiukajtis 			y1_or_zero[2] = -y1;
484*25c28e83SPiotr Jasiukajtis 			y2_or_zero[0] = y2;
485*25c28e83SPiotr Jasiukajtis 			y2_or_zero[2] = -y2;
486*25c28e83SPiotr Jasiukajtis 			z0 = x0 * x0;
487*25c28e83SPiotr Jasiukajtis 			z1 = x1 * x1;
488*25c28e83SPiotr Jasiukajtis 			z2 = x2 * x2;
489*25c28e83SPiotr Jasiukajtis 			t0 = z0 * (qq1 + z0 * qq2);
490*25c28e83SPiotr Jasiukajtis 			t1 = z1 * (poly3[j1] + z1 * poly4[j1]);
491*25c28e83SPiotr Jasiukajtis 			t2 = z2 * (poly3[j2] + z2 * poly4[j2]);
492*25c28e83SPiotr Jasiukajtis 			w0 = x0 * (one + z0 * (pp1 + z0 * pp2));
493*25c28e83SPiotr Jasiukajtis 			t1 = z1 * (poly1[j1] + z1 * (poly2[j1] + t1));
494*25c28e83SPiotr Jasiukajtis 			t2 = z2 * (poly1[j2] + z2 * (poly2[j2] + t2));
495*25c28e83SPiotr Jasiukajtis 			j0 = (((j0 & ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
496*25c28e83SPiotr Jasiukajtis 			xsb0 = (xsb0 >> 30) & 2;
497*25c28e83SPiotr Jasiukajtis 			n0 ^= (xsb0 & ~(n0 << 1));
498*25c28e83SPiotr Jasiukajtis 			xsb0 |= 1;
499*25c28e83SPiotr Jasiukajtis 			a0 = __vlibm_TBL_sincos_hi[j0+n0];
500*25c28e83SPiotr Jasiukajtis 			t0 = (__vlibm_TBL_sincos_hi[j0+((n0+xsb0)&3)] * w0 + a0 * t0) + __vlibm_TBL_sincos_lo[j0+n0];
501*25c28e83SPiotr Jasiukajtis 			t1 = x1_or_one[n1] + (y1_or_zero[n1] + x1_or_one[n1] * t1);
502*25c28e83SPiotr Jasiukajtis 			t2 = x2_or_one[n2] + (y2_or_zero[n2] + x2_or_one[n2] * t2);
503*25c28e83SPiotr Jasiukajtis 			*py0 = ( a0 + t0 );
504*25c28e83SPiotr Jasiukajtis 			*py1 = t1;
505*25c28e83SPiotr Jasiukajtis 			*py2 = t2;
506*25c28e83SPiotr Jasiukajtis 			break;
507*25c28e83SPiotr Jasiukajtis 
508*25c28e83SPiotr Jasiukajtis 		case 7:
509*25c28e83SPiotr Jasiukajtis 			j0 = n0 & 1;
510*25c28e83SPiotr Jasiukajtis 			j1 = n1 & 1;
511*25c28e83SPiotr Jasiukajtis 			j2 = n2 & 1;
512*25c28e83SPiotr Jasiukajtis 			x0_or_one[0] = x0;
513*25c28e83SPiotr Jasiukajtis 			x0_or_one[2] = -x0;
514*25c28e83SPiotr Jasiukajtis 			x1_or_one[0] = x1;
515*25c28e83SPiotr Jasiukajtis 			x1_or_one[2] = -x1;
516*25c28e83SPiotr Jasiukajtis 			x2_or_one[0] = x2;
517*25c28e83SPiotr Jasiukajtis 			x2_or_one[2] = -x2;
518*25c28e83SPiotr Jasiukajtis 			y0_or_zero[0] = y0;
519*25c28e83SPiotr Jasiukajtis 			y0_or_zero[2] = -y0;
520*25c28e83SPiotr Jasiukajtis 			y1_or_zero[0] = y1;
521*25c28e83SPiotr Jasiukajtis 			y1_or_zero[2] = -y1;
522*25c28e83SPiotr Jasiukajtis 			y2_or_zero[0] = y2;
523*25c28e83SPiotr Jasiukajtis 			y2_or_zero[2] = -y2;
524*25c28e83SPiotr Jasiukajtis 			z0 = x0 * x0;
525*25c28e83SPiotr Jasiukajtis 			z1 = x1 * x1;
526*25c28e83SPiotr Jasiukajtis 			z2 = x2 * x2;
527*25c28e83SPiotr Jasiukajtis 			t0 = z0 * (poly3[j0] + z0 * poly4[j0]);
528*25c28e83SPiotr Jasiukajtis 			t1 = z1 * (poly3[j1] + z1 * poly4[j1]);
529*25c28e83SPiotr Jasiukajtis 			t2 = z2 * (poly3[j2] + z2 * poly4[j2]);
530*25c28e83SPiotr Jasiukajtis 			t0 = z0 * (poly1[j0] + z0 * (poly2[j0] + t0));
531*25c28e83SPiotr Jasiukajtis 			t1 = z1 * (poly1[j1] + z1 * (poly2[j1] + t1));
532*25c28e83SPiotr Jasiukajtis 			t2 = z2 * (poly1[j2] + z2 * (poly2[j2] + t2));
533*25c28e83SPiotr Jasiukajtis 			t0 = x0_or_one[n0] + (y0_or_zero[n0] + x0_or_one[n0] * t0);
534*25c28e83SPiotr Jasiukajtis 			t1 = x1_or_one[n1] + (y1_or_zero[n1] + x1_or_one[n1] * t1);
535*25c28e83SPiotr Jasiukajtis 			t2 = x2_or_one[n2] + (y2_or_zero[n2] + x2_or_one[n2] * t2);
536*25c28e83SPiotr Jasiukajtis 			*py0 = t0;
537*25c28e83SPiotr Jasiukajtis 			*py1 = t1;
538*25c28e83SPiotr Jasiukajtis 			*py2 = t2;
539*25c28e83SPiotr Jasiukajtis 			break;
540*25c28e83SPiotr Jasiukajtis 		}
541*25c28e83SPiotr Jasiukajtis 
542*25c28e83SPiotr Jasiukajtis 		x += stridex;
543*25c28e83SPiotr Jasiukajtis 		y += stridey;
544*25c28e83SPiotr Jasiukajtis 		i = 0;
545*25c28e83SPiotr Jasiukajtis 	} while (--n > 0);
546*25c28e83SPiotr Jasiukajtis 
547*25c28e83SPiotr Jasiukajtis 	if (i > 0)
548*25c28e83SPiotr Jasiukajtis 	{
549*25c28e83SPiotr Jasiukajtis 		double		fn0, fn1, a0, a1, w0, w1, y0, y1;
550*25c28e83SPiotr Jasiukajtis 		double		t0, t1, z0, z1;
551*25c28e83SPiotr Jasiukajtis 		unsigned	j0, j1;
552*25c28e83SPiotr Jasiukajtis 		int			n0, n1;
553*25c28e83SPiotr Jasiukajtis 
554*25c28e83SPiotr Jasiukajtis 		if (i > 1)
555*25c28e83SPiotr Jasiukajtis 		{
556*25c28e83SPiotr Jasiukajtis 			n1 = (int) (x1 * invpio2 + half[xsb1]);
557*25c28e83SPiotr Jasiukajtis 			fn1 = (double) n1;
558*25c28e83SPiotr Jasiukajtis 			n1 = (n1 + 1) & 3; /* Add 1 (before the mod) to make sin into cos */
559*25c28e83SPiotr Jasiukajtis 			a1 = x1 - fn1 * pio2_1;
560*25c28e83SPiotr Jasiukajtis 			w1 = fn1 * pio2_2;
561*25c28e83SPiotr Jasiukajtis 			x1 = a1 - w1;
562*25c28e83SPiotr Jasiukajtis 			y1 = (a1 - x1) - w1;
563*25c28e83SPiotr Jasiukajtis 			a1 = x1;
564*25c28e83SPiotr Jasiukajtis 			w1 = fn1 * pio2_3 - y1;
565*25c28e83SPiotr Jasiukajtis 			x1 = a1 - w1;
566*25c28e83SPiotr Jasiukajtis 			y1 = (a1 - x1) - w1;
567*25c28e83SPiotr Jasiukajtis 			a1 = x1;
568*25c28e83SPiotr Jasiukajtis 			w1 = fn1 * pio2_3t - y1;
569*25c28e83SPiotr Jasiukajtis 			x1 = a1 - w1;
570*25c28e83SPiotr Jasiukajtis 			y1 = (a1 - x1) - w1;
571*25c28e83SPiotr Jasiukajtis 			xsb1 = HI(&x1);
572*25c28e83SPiotr Jasiukajtis 			if ((xsb1 & ~0x80000000) < thresh[n1&1])
573*25c28e83SPiotr Jasiukajtis 			{
574*25c28e83SPiotr Jasiukajtis 				j1 = n1 & 1;
575*25c28e83SPiotr Jasiukajtis 				x1_or_one[0] = x1;
576*25c28e83SPiotr Jasiukajtis 				x1_or_one[2] = -x1;
577*25c28e83SPiotr Jasiukajtis 				y1_or_zero[0] = y1;
578*25c28e83SPiotr Jasiukajtis 				y1_or_zero[2] = -y1;
579*25c28e83SPiotr Jasiukajtis 				z1 = x1 * x1;
580*25c28e83SPiotr Jasiukajtis 				t1 = z1 * (poly3[j1] + z1 * poly4[j1]);
581*25c28e83SPiotr Jasiukajtis 				t1 = z1 * (poly1[j1] + z1 * (poly2[j1] + t1));
582*25c28e83SPiotr Jasiukajtis 				t1 = x1_or_one[n1] + (y1_or_zero[n1] + x1_or_one[n1] * t1);
583*25c28e83SPiotr Jasiukajtis 				*py1 = t1;
584*25c28e83SPiotr Jasiukajtis 			}
585*25c28e83SPiotr Jasiukajtis 			else
586*25c28e83SPiotr Jasiukajtis 			{
587*25c28e83SPiotr Jasiukajtis 				j1 = (xsb1 + 0x4000) & 0xffff8000;
588*25c28e83SPiotr Jasiukajtis 				HI(&t1) = j1;
589*25c28e83SPiotr Jasiukajtis 				LO(&t1) = 0;
590*25c28e83SPiotr Jasiukajtis 				x1 = (x1 - t1) + y1;
591*25c28e83SPiotr Jasiukajtis 				z1 = x1 * x1;
592*25c28e83SPiotr Jasiukajtis 				t1 = z1 * (qq1 + z1 * qq2);
593*25c28e83SPiotr Jasiukajtis 				w1 = x1 * (one + z1 * (pp1 + z1 * pp2));
594*25c28e83SPiotr Jasiukajtis 				j1 = (((j1 & ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
595*25c28e83SPiotr Jasiukajtis 				xsb1 = (xsb1 >> 30) & 2;
596*25c28e83SPiotr Jasiukajtis 				n1 ^= (xsb1 & ~(n1 << 1));
597*25c28e83SPiotr Jasiukajtis 				xsb1 |= 1;
598*25c28e83SPiotr Jasiukajtis 				a1 = __vlibm_TBL_sincos_hi[j1+n1];
599*25c28e83SPiotr Jasiukajtis 				t1 = (__vlibm_TBL_sincos_hi[j1+((n1+xsb1)&3)] * w1 + a1 * t1) + __vlibm_TBL_sincos_lo[j1+n1];
600*25c28e83SPiotr Jasiukajtis 				*py1 = ( a1 + t1 );
601*25c28e83SPiotr Jasiukajtis 			}
602*25c28e83SPiotr Jasiukajtis 		}
603*25c28e83SPiotr Jasiukajtis 		n0 = (int) (x0 * invpio2 + half[xsb0]);
604*25c28e83SPiotr Jasiukajtis 		fn0 = (double) n0;
605*25c28e83SPiotr Jasiukajtis 		n0 = (n0 + 1) & 3; /* Add 1 (before the mod) to make sin into cos */
606*25c28e83SPiotr Jasiukajtis 		a0 = x0 - fn0 * pio2_1;
607*25c28e83SPiotr Jasiukajtis 		w0 = fn0 * pio2_2;
608*25c28e83SPiotr Jasiukajtis 		x0 = a0 - w0;
609*25c28e83SPiotr Jasiukajtis 		y0 = (a0 - x0) - w0;
610*25c28e83SPiotr Jasiukajtis 		a0 = x0;
611*25c28e83SPiotr Jasiukajtis 		w0 = fn0 * pio2_3 - y0;
612*25c28e83SPiotr Jasiukajtis 		x0 = a0 - w0;
613*25c28e83SPiotr Jasiukajtis 		y0 = (a0 - x0) - w0;
614*25c28e83SPiotr Jasiukajtis 		a0 = x0;
615*25c28e83SPiotr Jasiukajtis 		w0 = fn0 * pio2_3t - y0;
616*25c28e83SPiotr Jasiukajtis 		x0 = a0 - w0;
617*25c28e83SPiotr Jasiukajtis 		y0 = (a0 - x0) - w0;
618*25c28e83SPiotr Jasiukajtis 		xsb0 = HI(&x0);
619*25c28e83SPiotr Jasiukajtis 		if ((xsb0 & ~0x80000000) < thresh[n0&1])
620*25c28e83SPiotr Jasiukajtis 		{
621*25c28e83SPiotr Jasiukajtis 			j0 = n0 & 1;
622*25c28e83SPiotr Jasiukajtis 			x0_or_one[0] = x0;
623*25c28e83SPiotr Jasiukajtis 			x0_or_one[2] = -x0;
624*25c28e83SPiotr Jasiukajtis 			y0_or_zero[0] = y0;
625*25c28e83SPiotr Jasiukajtis 			y0_or_zero[2] = -y0;
626*25c28e83SPiotr Jasiukajtis 			z0 = x0 * x0;
627*25c28e83SPiotr Jasiukajtis 			t0 = z0 * (poly3[j0] + z0 * poly4[j0]);
628*25c28e83SPiotr Jasiukajtis 			t0 = z0 * (poly1[j0] + z0 * (poly2[j0] + t0));
629*25c28e83SPiotr Jasiukajtis 			t0 = x0_or_one[n0] + (y0_or_zero[n0] + x0_or_one[n0] * t0);
630*25c28e83SPiotr Jasiukajtis 			*py0 = t0;
631*25c28e83SPiotr Jasiukajtis 		}
632*25c28e83SPiotr Jasiukajtis 		else
633*25c28e83SPiotr Jasiukajtis 		{
634*25c28e83SPiotr Jasiukajtis 			j0 = (xsb0 + 0x4000) & 0xffff8000;
635*25c28e83SPiotr Jasiukajtis 			HI(&t0) = j0;
636*25c28e83SPiotr Jasiukajtis 			LO(&t0) = 0;
637*25c28e83SPiotr Jasiukajtis 			x0 = (x0 - t0) + y0;
638*25c28e83SPiotr Jasiukajtis 			z0 = x0 * x0;
639*25c28e83SPiotr Jasiukajtis 			t0 = z0 * (qq1 + z0 * qq2);
640*25c28e83SPiotr Jasiukajtis 			w0 = x0 * (one + z0 * (pp1 + z0 * pp2));
641*25c28e83SPiotr Jasiukajtis 			j0 = (((j0 & ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
642*25c28e83SPiotr Jasiukajtis 			xsb0 = (xsb0 >> 30) & 2;
643*25c28e83SPiotr Jasiukajtis 			n0 ^= (xsb0 & ~(n0 << 1));
644*25c28e83SPiotr Jasiukajtis 			xsb0 |= 1;
645*25c28e83SPiotr Jasiukajtis 			a0 = __vlibm_TBL_sincos_hi[j0+n0];
646*25c28e83SPiotr Jasiukajtis 			t0 = (__vlibm_TBL_sincos_hi[j0+((n0+xsb0)&3)] * w0 + a0 * t0) + __vlibm_TBL_sincos_lo[j0+n0];
647*25c28e83SPiotr Jasiukajtis 			*py0 = ( a0 + t0 );
648*25c28e83SPiotr Jasiukajtis 		}
649*25c28e83SPiotr Jasiukajtis 	}
650*25c28e83SPiotr Jasiukajtis 
651*25c28e83SPiotr Jasiukajtis 	if (biguns)
652*25c28e83SPiotr Jasiukajtis 		__vlibm_vcos_big(nsave, xsave, sxsave, ysave, sysave, 0x413921fb);
653*25c28e83SPiotr Jasiukajtis }
654