4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
26 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
27 * Use is subject to license terms.
30 #include <sys/isa_defs.h>
31 #include <sys/ccompile.h>
34 #define HI(x) *(1+(int*)x)
35 #define LO(x) *(unsigned*)x
37 #define HI(x) *(int*)x
38 #define LO(x) *(1+(unsigned*)x)
42 #define restrict _Restrict
50 * Vector cosine function. Just slight modifications to vsin.8.c, mainly
51 * in the primary range part.
53 * Modification to primary range processing. If an argument that does not
54 * fall in the primary range is encountered, then processing is continued
55 * in the medium range.
59 extern const double __vlibm_TBL_sincos_hi
[], __vlibm_TBL_sincos_lo
[];
62 half
[2] = { 0.5, -0.5 },
64 invpio2
= 0.636619772367581343075535, /* 53 bits of pi/2 */
65 pio2_1
= 1.570796326734125614166, /* first 33 bits of pi/2 */
66 pio2_2
= 6.077100506303965976596e-11, /* second 33 bits of pi/2 */
67 pio2_3
= 2.022266248711166455796e-21, /* third 33 bits of pi/2 */
68 pio2_3t
= 8.478427660368899643959e-32, /* pi/2 - pio2_3 */
69 pp1
= -1.666666666605760465276263943134982554676e-0001,
70 pp2
= 8.333261209690963126718376566146180944442e-0003,
71 qq1
= -4.999999999977710986407023955908711557870e-0001,
72 qq2
= 4.166654863857219350645055881018842089580e-0002,
73 poly1
[2]= { -1.666666666666629669805215138920301589656e-0001,
74 -4.999999999999931701464060878888294524481e-0001 },
75 poly2
[2]= { 8.333333332390951295683993455280336376663e-0003,
76 4.166666666394861917535640593963708222319e-0002 },
77 poly3
[2]= { -1.984126237997976692791551778230098403960e-0004,
78 -1.388888552656142867832756687736851681462e-0003 },
79 poly4
[2]= { 2.753403624854277237649987622848330351110e-0006,
80 2.478519423681460796618128289454530524759e-0005 };
82 static const unsigned thresh
[2] = { 0x3fc90000, 0x3fc40000 };
84 /* Don't __ the following; acomp will handle it */
85 extern double fabs(double);
86 extern void __vlibm_vcos_big(int, double *, int, double *, int, int);
89 * y[i*stridey] := cos( x[i*stridex] ), for i = 0..n.
91 * Calls __vlibm_vcos_big to handle all elts which have abs >~ 1.647e+06.
92 * Argument reduction is done here for elts pi/4 < arg < 1.647e+06.
94 * elts < 2^-27 use the approximation 1.0 ~ cos(x).
97 __vcos(int n
, double * restrict x
, int stridex
, double * restrict y
,
100 double x0_or_one
[4], x1_or_one
[4], x2_or_one
[4];
101 double y0_or_zero
[4], y1_or_zero
[4], y2_or_zero
[4];
102 double x0
, x1
, x2
, *py0
= 0, *py1
= 0, *py2
, *xsave
, *ysave
;
103 unsigned hx0
, hx1
, hx2
, xsb0
, xsb1
= 0, xsb2
;
104 int i
, biguns
, nsave
, sxsave
, sysave
;
105 volatile int v __GNU_UNUSED
;
115 /* Gotos here so _break_ exits MAIN LOOP. */
116 LOOP0
: /* Find first arg in right range. */
117 xsb0
= HI(x
); /* get most significant word */
118 hx0
= xsb0
& ~0x80000000; /* mask off sign bit */
119 if (hx0
> 0x3fe921fb) {
120 /* Too big: arg reduction needed, so leave for second part */
124 if (hx0
< 0x3e400000) {
125 /* Too small. cos x ~ 1. */
143 LOOP1
: /* Get second arg, same as above. */
145 hx1
= xsb1
& ~0x80000000;
146 if (hx1
> 0x3fe921fb)
151 if (hx1
< 0x3e400000)
170 LOOP2
: /* Get third arg, same as above. */
172 hx2
= xsb2
& ~0x80000000;
173 if (hx2
> 0x3fe921fb)
178 if (hx2
< 0x3e400000)
193 * 0x3fc40000 = 5/32 ~ 0.15625
194 * Get msb after subtraction. Will be 1 only if
195 * hx0 - 5/32 is negative.
197 i
= (hx0
- 0x3fc40000) >> 31;
198 i
|= ((hx1
- 0x3fc40000) >> 30) & 2;
199 i
|= ((hx2
- 0x3fc40000) >> 29) & 4;
202 double a0
, a1
, a2
, w0
, w1
, w2
;
203 double t0
, t1
, t2
, z0
, z1
, z2
;
206 case 0: /* All are > 5/32 */
207 j0
= (xsb0
+ 0x4000) & 0xffff8000;
208 j1
= (xsb1
+ 0x4000) & 0xffff8000;
209 j2
= (xsb2
+ 0x4000) & 0xffff8000;
222 t0
= z0
* (qq1
+ z0
* qq2
);
223 t1
= z1
* (qq1
+ z1
* qq2
);
224 t2
= z2
* (qq1
+ z2
* qq2
);
225 w0
= x0
* (one
+ z0
* (pp1
+ z0
* pp2
));
226 w1
= x1
* (one
+ z1
* (pp1
+ z1
* pp2
));
227 w2
= x2
* (one
+ z2
* (pp1
+ z2
* pp2
));
228 j0
= (((j0
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
229 j1
= (((j1
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
230 j2
= (((j2
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
231 xsb0
= (xsb0
>> 30) & 2;
232 xsb1
= (xsb1
>> 30) & 2;
233 xsb2
= (xsb2
>> 30) & 2;
234 a0
= __vlibm_TBL_sincos_hi
[j0
+1]; /* cos_hi(t) */
235 a1
= __vlibm_TBL_sincos_hi
[j1
+1];
236 a2
= __vlibm_TBL_sincos_hi
[j2
+1];
237 /* cos_lo(t) sin_hi(t) */
238 t0
= __vlibm_TBL_sincos_lo
[j0
+1] - (__vlibm_TBL_sincos_hi
[j0
+xsb0
]*w0
- a0
*t0
);
239 t1
= __vlibm_TBL_sincos_lo
[j1
+1] - (__vlibm_TBL_sincos_hi
[j1
+xsb1
]*w1
- a1
*t1
);
240 t2
= __vlibm_TBL_sincos_lo
[j2
+1] - (__vlibm_TBL_sincos_hi
[j2
+xsb2
]*w2
- a2
*t2
);
248 j1
= (xsb1
+ 0x4000) & 0xffff8000;
249 j2
= (xsb2
+ 0x4000) & 0xffff8000;
259 t0
= z0
* (poly3
[1] + z0
* poly4
[1]);
260 t1
= z1
* (qq1
+ z1
* qq2
);
261 t2
= z2
* (qq1
+ z2
* qq2
);
262 t0
= z0
* (poly1
[1] + z0
* (poly2
[1] + t0
));
263 w1
= x1
* (one
+ z1
* (pp1
+ z1
* pp2
));
264 w2
= x2
* (one
+ z2
* (pp1
+ z2
* pp2
));
265 j1
= (((j1
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
266 j2
= (((j2
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
267 xsb1
= (xsb1
>> 30) & 2;
268 xsb2
= (xsb2
>> 30) & 2;
269 a1
= __vlibm_TBL_sincos_hi
[j1
+1];
270 a2
= __vlibm_TBL_sincos_hi
[j2
+1];
271 t1
= __vlibm_TBL_sincos_lo
[j1
+1] - (__vlibm_TBL_sincos_hi
[j1
+xsb1
]*w1
- a1
*t1
);
272 t2
= __vlibm_TBL_sincos_lo
[j2
+1] - (__vlibm_TBL_sincos_hi
[j2
+xsb2
]*w2
- a2
*t2
);
279 j0
= (xsb0
+ 0x4000) & 0xffff8000;
280 j2
= (xsb2
+ 0x4000) & 0xffff8000;
290 t0
= z0
* (qq1
+ z0
* qq2
);
291 t1
= z1
* (poly3
[1] + z1
* poly4
[1]);
292 t2
= z2
* (qq1
+ z2
* qq2
);
293 w0
= x0
* (one
+ z0
* (pp1
+ z0
* pp2
));
294 t1
= z1
* (poly1
[1] + z1
* (poly2
[1] + t1
));
295 w2
= x2
* (one
+ z2
* (pp1
+ z2
* pp2
));
296 j0
= (((j0
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
297 j2
= (((j2
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
298 xsb0
= (xsb0
>> 30) & 2;
299 xsb2
= (xsb2
>> 30) & 2;
300 a0
= __vlibm_TBL_sincos_hi
[j0
+1];
301 a2
= __vlibm_TBL_sincos_hi
[j2
+1];
302 t0
= __vlibm_TBL_sincos_lo
[j0
+1] - (__vlibm_TBL_sincos_hi
[j0
+xsb0
]*w0
- a0
*t0
);
303 t2
= __vlibm_TBL_sincos_lo
[j2
+1] - (__vlibm_TBL_sincos_hi
[j2
+xsb2
]*w2
- a2
*t2
);
310 j2
= (xsb2
+ 0x4000) & 0xffff8000;
317 t0
= z0
* (poly3
[1] + z0
* poly4
[1]);
318 t1
= z1
* (poly3
[1] + z1
* poly4
[1]);
319 t2
= z2
* (qq1
+ z2
* qq2
);
320 t0
= z0
* (poly1
[1] + z0
* (poly2
[1] + t0
));
321 t1
= z1
* (poly1
[1] + z1
* (poly2
[1] + t1
));
322 w2
= x2
* (one
+ z2
* (pp1
+ z2
* pp2
));
323 j2
= (((j2
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
324 xsb2
= (xsb2
>> 30) & 2;
325 a2
= __vlibm_TBL_sincos_hi
[j2
+1];
326 t2
= __vlibm_TBL_sincos_lo
[j2
+1] - (__vlibm_TBL_sincos_hi
[j2
+xsb2
]*w2
- a2
*t2
);
333 j0
= (xsb0
+ 0x4000) & 0xffff8000;
334 j1
= (xsb1
+ 0x4000) & 0xffff8000;
344 t0
= z0
* (qq1
+ z0
* qq2
);
345 t1
= z1
* (qq1
+ z1
* qq2
);
346 t2
= z2
* (poly3
[1] + z2
* poly4
[1]);
347 w0
= x0
* (one
+ z0
* (pp1
+ z0
* pp2
));
348 w1
= x1
* (one
+ z1
* (pp1
+ z1
* pp2
));
349 t2
= z2
* (poly1
[1] + z2
* (poly2
[1] + t2
));
350 j0
= (((j0
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
351 j1
= (((j1
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
352 xsb0
= (xsb0
>> 30) & 2;
353 xsb1
= (xsb1
>> 30) & 2;
354 a0
= __vlibm_TBL_sincos_hi
[j0
+1];
355 a1
= __vlibm_TBL_sincos_hi
[j1
+1];
356 t0
= __vlibm_TBL_sincos_lo
[j0
+1] - (__vlibm_TBL_sincos_hi
[j0
+xsb0
]*w0
- a0
*t0
);
357 t1
= __vlibm_TBL_sincos_lo
[j1
+1] - (__vlibm_TBL_sincos_hi
[j1
+xsb1
]*w1
- a1
*t1
);
364 j1
= (xsb1
+ 0x4000) & 0xffff8000;
371 t0
= z0
* (poly3
[1] + z0
* poly4
[1]);
372 t1
= z1
* (qq1
+ z1
* qq2
);
373 t2
= z2
* (poly3
[1] + z2
* poly4
[1]);
374 t0
= z0
* (poly1
[1] + z0
* (poly2
[1] + t0
));
375 w1
= x1
* (one
+ z1
* (pp1
+ z1
* pp2
));
376 t2
= z2
* (poly1
[1] + z2
* (poly2
[1] + t2
));
377 j1
= (((j1
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
378 xsb1
= (xsb1
>> 30) & 2;
379 a1
= __vlibm_TBL_sincos_hi
[j1
+1];
380 t1
= __vlibm_TBL_sincos_lo
[j1
+1] - (__vlibm_TBL_sincos_hi
[j1
+xsb1
]*w1
- a1
*t1
);
387 j0
= (xsb0
+ 0x4000) & 0xffff8000;
394 t0
= z0
* (qq1
+ z0
* qq2
);
395 t1
= z1
* (poly3
[1] + z1
* poly4
[1]);
396 t2
= z2
* (poly3
[1] + z2
* poly4
[1]);
397 w0
= x0
* (one
+ z0
* (pp1
+ z0
* pp2
));
398 t1
= z1
* (poly1
[1] + z1
* (poly2
[1] + t1
));
399 t2
= z2
* (poly1
[1] + z2
* (poly2
[1] + t2
));
400 j0
= (((j0
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
401 xsb0
= (xsb0
>> 30) & 2;
402 a0
= __vlibm_TBL_sincos_hi
[j0
+1];
403 t0
= __vlibm_TBL_sincos_lo
[j0
+1] - (__vlibm_TBL_sincos_hi
[j0
+xsb0
]*w0
- a0
*t0
);
409 case 7: /* All are < 5/32 */
413 t0
= z0
* (poly3
[1] + z0
* poly4
[1]);
414 t1
= z1
* (poly3
[1] + z1
* poly4
[1]);
415 t2
= z2
* (poly3
[1] + z2
* poly4
[1]);
416 t0
= z0
* (poly1
[1] + z0
* (poly2
[1] + t0
));
417 t1
= z1
* (poly1
[1] + z1
* (poly2
[1] + t1
));
418 t2
= z2
* (poly1
[1] + z2
* (poly2
[1] + t2
));
428 } while (--n
> 0); /* END MAIN LOOP */
431 * CLEAN UP last 0, 1, or 2 elts.
433 if (i
> 0) /* Clean up elts at tail. i < 3. */
435 double a0
, a1
, w0
, w1
;
436 double t0
, t1
, z0
, z1
;
441 if (hx1
< 0x3fc40000)
444 t1
= z1
* (poly3
[1] + z1
* poly4
[1]);
445 t1
= z1
* (poly1
[1] + z1
* (poly2
[1] + t1
));
451 j1
= (xsb1
+ 0x4000) & 0xffff8000;
456 t1
= z1
* (qq1
+ z1
* qq2
);
457 w1
= x1
* (one
+ z1
* (pp1
+ z1
* pp2
));
458 j1
= (((j1
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
459 xsb1
= (xsb1
>> 30) & 2;
460 a1
= __vlibm_TBL_sincos_hi
[j1
+1];
461 t1
= __vlibm_TBL_sincos_lo
[j1
+1]
462 - (__vlibm_TBL_sincos_hi
[j1
+xsb1
]*w1
- a1
*t1
);
466 if (hx0
< 0x3fc40000)
469 t0
= z0
* (poly3
[1] + z0
* poly4
[1]);
470 t0
= z0
* (poly1
[1] + z0
* (poly2
[1] + t0
));
476 j0
= (xsb0
+ 0x4000) & 0xffff8000;
481 t0
= z0
* (qq1
+ z0
* qq2
);
482 w0
= x0
* (one
+ z0
* (pp1
+ z0
* pp2
));
483 j0
= (((j0
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
484 xsb0
= (xsb0
>> 30) & 2;
485 a0
= __vlibm_TBL_sincos_hi
[j0
+1];
486 t0
= __vlibm_TBL_sincos_lo
[j0
+1] - (__vlibm_TBL_sincos_hi
[j0
+xsb0
]*w0
- a0
*t0
);
494 * Take care of BIGUNS.
496 * We have jumped here in the middle of processing after having
497 * encountered a medium range argument. Therefore things are in a
523 else if (biguns
== 2)
533 double fn0
, fn1
, fn2
, a0
, a1
, a2
, w0
, w1
, w2
, y0
, y1
, y2
;
538 * Find 3 more to work on: Not already done, not too big.
545 if (hx
> 0x413921fb) /* (1.6471e+06) Too big: leave it. */
547 if (hx
>= 0x7ff00000) /* Inf or NaN */
575 if (hx
>= 0x7ff00000)
603 if (hx
>= 0x7ff00000)
620 n0
= (int) (x0
* invpio2
+ half
[xsb0
]);
621 n1
= (int) (x1
* invpio2
+ half
[xsb1
]);
622 n2
= (int) (x2
* invpio2
+ half
[xsb2
]);
626 n0
= (n0
+ 1) & 3; /* Add 1 (before the mod) to make sin into cos */
629 a0
= x0
- fn0
* pio2_1
;
630 a1
= x1
- fn1
* pio2_1
;
631 a2
= x2
- fn2
* pio2_1
;
644 w0
= fn0
* pio2_3
- y0
;
645 w1
= fn1
* pio2_3
- y1
;
646 w2
= fn2
* pio2_3
- y2
;
656 w0
= fn0
* pio2_3t
- y0
;
657 w1
= fn1
* pio2_3t
- y1
;
658 w2
= fn2
* pio2_3t
- y2
;
666 i
= ((xsb0
& ~0x80000000) - thresh
[n0
&1]) >> 31;
668 i
|= (((xsb1
& ~0x80000000) - thresh
[n1
&1]) >> 30) & 2;
670 i
|= (((xsb2
& ~0x80000000) - thresh
[n2
&1]) >> 29) & 4;
673 double t0
, t1
, t2
, z0
, z1
, z2
;
677 j0
= (xsb0
+ 0x4000) & 0xffff8000;
678 j1
= (xsb1
+ 0x4000) & 0xffff8000;
679 j2
= (xsb2
+ 0x4000) & 0xffff8000;
692 t0
= z0
* (qq1
+ z0
* qq2
);
693 t1
= z1
* (qq1
+ z1
* qq2
);
694 t2
= z2
* (qq1
+ z2
* qq2
);
695 w0
= x0
* (one
+ z0
* (pp1
+ z0
* pp2
));
696 w1
= x1
* (one
+ z1
* (pp1
+ z1
* pp2
));
697 w2
= x2
* (one
+ z2
* (pp1
+ z2
* pp2
));
698 j0
= (((j0
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
699 j1
= (((j1
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
700 j2
= (((j2
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
701 xsb0
= (xsb0
>> 30) & 2;
702 xsb1
= (xsb1
>> 30) & 2;
703 xsb2
= (xsb2
>> 30) & 2;
704 n0
^= (xsb0
& ~(n0
<< 1));
705 n1
^= (xsb1
& ~(n1
<< 1));
706 n2
^= (xsb2
& ~(n2
<< 1));
710 a0
= __vlibm_TBL_sincos_hi
[j0
+n0
];
711 a1
= __vlibm_TBL_sincos_hi
[j1
+n1
];
712 a2
= __vlibm_TBL_sincos_hi
[j2
+n2
];
713 t0
= (__vlibm_TBL_sincos_hi
[j0
+((n0
+xsb0
)&3)] * w0
+ a0
* t0
) + __vlibm_TBL_sincos_lo
[j0
+n0
];
714 t1
= (__vlibm_TBL_sincos_hi
[j1
+((n1
+xsb1
)&3)] * w1
+ a1
* t1
) + __vlibm_TBL_sincos_lo
[j1
+n1
];
715 t2
= (__vlibm_TBL_sincos_hi
[j2
+((n2
+xsb2
)&3)] * w2
+ a2
* t2
) + __vlibm_TBL_sincos_lo
[j2
+n2
];
723 j1
= (xsb1
+ 0x4000) & 0xffff8000;
724 j2
= (xsb2
+ 0x4000) & 0xffff8000;
738 t0
= z0
* (poly3
[j0
] + z0
* poly4
[j0
]);
739 t1
= z1
* (qq1
+ z1
* qq2
);
740 t2
= z2
* (qq1
+ z2
* qq2
);
741 t0
= z0
* (poly1
[j0
] + z0
* (poly2
[j0
] + t0
));
742 w1
= x1
* (one
+ z1
* (pp1
+ z1
* pp2
));
743 w2
= x2
* (one
+ z2
* (pp1
+ z2
* pp2
));
744 j1
= (((j1
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
745 j2
= (((j2
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
746 xsb1
= (xsb1
>> 30) & 2;
747 xsb2
= (xsb2
>> 30) & 2;
748 n1
^= (xsb1
& ~(n1
<< 1));
749 n2
^= (xsb2
& ~(n2
<< 1));
752 a1
= __vlibm_TBL_sincos_hi
[j1
+n1
];
753 a2
= __vlibm_TBL_sincos_hi
[j2
+n2
];
754 t0
= x0_or_one
[n0
] + (y0_or_zero
[n0
] + x0_or_one
[n0
] * t0
);
755 t1
= (__vlibm_TBL_sincos_hi
[j1
+((n1
+xsb1
)&3)] * w1
+ a1
* t1
) + __vlibm_TBL_sincos_lo
[j1
+n1
];
756 t2
= (__vlibm_TBL_sincos_hi
[j2
+((n2
+xsb2
)&3)] * w2
+ a2
* t2
) + __vlibm_TBL_sincos_lo
[j2
+n2
];
763 j0
= (xsb0
+ 0x4000) & 0xffff8000;
765 j2
= (xsb2
+ 0x4000) & 0xffff8000;
779 t0
= z0
* (qq1
+ z0
* qq2
);
780 t1
= z1
* (poly3
[j1
] + z1
* poly4
[j1
]);
781 t2
= z2
* (qq1
+ z2
* qq2
);
782 w0
= x0
* (one
+ z0
* (pp1
+ z0
* pp2
));
783 t1
= z1
* (poly1
[j1
] + z1
* (poly2
[j1
] + t1
));
784 w2
= x2
* (one
+ z2
* (pp1
+ z2
* pp2
));
785 j0
= (((j0
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
786 j2
= (((j2
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
787 xsb0
= (xsb0
>> 30) & 2;
788 xsb2
= (xsb2
>> 30) & 2;
789 n0
^= (xsb0
& ~(n0
<< 1));
790 n2
^= (xsb2
& ~(n2
<< 1));
793 a0
= __vlibm_TBL_sincos_hi
[j0
+n0
];
794 a2
= __vlibm_TBL_sincos_hi
[j2
+n2
];
795 t0
= (__vlibm_TBL_sincos_hi
[j0
+((n0
+xsb0
)&3)] * w0
+ a0
* t0
) + __vlibm_TBL_sincos_lo
[j0
+n0
];
796 t1
= x1_or_one
[n1
] + (y1_or_zero
[n1
] + x1_or_one
[n1
] * t1
);
797 t2
= (__vlibm_TBL_sincos_hi
[j2
+((n2
+xsb2
)&3)] * w2
+ a2
* t2
) + __vlibm_TBL_sincos_lo
[j2
+n2
];
806 j2
= (xsb2
+ 0x4000) & 0xffff8000;
821 t0
= z0
* (poly3
[j0
] + z0
* poly4
[j0
]);
822 t1
= z1
* (poly3
[j1
] + z1
* poly4
[j1
]);
823 t2
= z2
* (qq1
+ z2
* qq2
);
824 t0
= z0
* (poly1
[j0
] + z0
* (poly2
[j0
] + t0
));
825 t1
= z1
* (poly1
[j1
] + z1
* (poly2
[j1
] + t1
));
826 w2
= x2
* (one
+ z2
* (pp1
+ z2
* pp2
));
827 j2
= (((j2
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
828 xsb2
= (xsb2
>> 30) & 2;
829 n2
^= (xsb2
& ~(n2
<< 1));
831 a2
= __vlibm_TBL_sincos_hi
[j2
+n2
];
832 t0
= x0_or_one
[n0
] + (y0_or_zero
[n0
] + x0_or_one
[n0
] * t0
);
833 t1
= x1_or_one
[n1
] + (y1_or_zero
[n1
] + x1_or_one
[n1
] * t1
);
834 t2
= (__vlibm_TBL_sincos_hi
[j2
+((n2
+xsb2
)&3)] * w2
+ a2
* t2
) + __vlibm_TBL_sincos_lo
[j2
+n2
];
841 j0
= (xsb0
+ 0x4000) & 0xffff8000;
842 j1
= (xsb1
+ 0x4000) & 0xffff8000;
857 t0
= z0
* (qq1
+ z0
* qq2
);
858 t1
= z1
* (qq1
+ z1
* qq2
);
859 t2
= z2
* (poly3
[j2
] + z2
* poly4
[j2
]);
860 w0
= x0
* (one
+ z0
* (pp1
+ z0
* pp2
));
861 w1
= x1
* (one
+ z1
* (pp1
+ z1
* pp2
));
862 t2
= z2
* (poly1
[j2
] + z2
* (poly2
[j2
] + t2
));
863 j0
= (((j0
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
864 j1
= (((j1
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
865 xsb0
= (xsb0
>> 30) & 2;
866 xsb1
= (xsb1
>> 30) & 2;
867 n0
^= (xsb0
& ~(n0
<< 1));
868 n1
^= (xsb1
& ~(n1
<< 1));
871 a0
= __vlibm_TBL_sincos_hi
[j0
+n0
];
872 a1
= __vlibm_TBL_sincos_hi
[j1
+n1
];
873 t0
= (__vlibm_TBL_sincos_hi
[j0
+((n0
+xsb0
)&3)] * w0
+ a0
* t0
) + __vlibm_TBL_sincos_lo
[j0
+n0
];
874 t1
= (__vlibm_TBL_sincos_hi
[j1
+((n1
+xsb1
)&3)] * w1
+ a1
* t1
) + __vlibm_TBL_sincos_lo
[j1
+n1
];
875 t2
= x2_or_one
[n2
] + (y2_or_zero
[n2
] + x2_or_one
[n2
] * t2
);
883 j1
= (xsb1
+ 0x4000) & 0xffff8000;
899 t0
= z0
* (poly3
[j0
] + z0
* poly4
[j0
]);
900 t1
= z1
* (qq1
+ z1
* qq2
);
901 t2
= z2
* (poly3
[j2
] + z2
* poly4
[j2
]);
902 t0
= z0
* (poly1
[j0
] + z0
* (poly2
[j0
] + t0
));
903 w1
= x1
* (one
+ z1
* (pp1
+ z1
* pp2
));
904 t2
= z2
* (poly1
[j2
] + z2
* (poly2
[j2
] + t2
));
905 j1
= (((j1
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
906 xsb1
= (xsb1
>> 30) & 2;
907 n1
^= (xsb1
& ~(n1
<< 1));
909 a1
= __vlibm_TBL_sincos_hi
[j1
+n1
];
910 t0
= x0_or_one
[n0
] + (y0_or_zero
[n0
] + x0_or_one
[n0
] * t0
);
911 t1
= (__vlibm_TBL_sincos_hi
[j1
+((n1
+xsb1
)&3)] * w1
+ a1
* t1
) + __vlibm_TBL_sincos_lo
[j1
+n1
];
912 t2
= x2_or_one
[n2
] + (y2_or_zero
[n2
] + x2_or_one
[n2
] * t2
);
919 j0
= (xsb0
+ 0x4000) & 0xffff8000;
936 t0
= z0
* (qq1
+ z0
* qq2
);
937 t1
= z1
* (poly3
[j1
] + z1
* poly4
[j1
]);
938 t2
= z2
* (poly3
[j2
] + z2
* poly4
[j2
]);
939 w0
= x0
* (one
+ z0
* (pp1
+ z0
* pp2
));
940 t1
= z1
* (poly1
[j1
] + z1
* (poly2
[j1
] + t1
));
941 t2
= z2
* (poly1
[j2
] + z2
* (poly2
[j2
] + t2
));
942 j0
= (((j0
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
943 xsb0
= (xsb0
>> 30) & 2;
944 n0
^= (xsb0
& ~(n0
<< 1));
946 a0
= __vlibm_TBL_sincos_hi
[j0
+n0
];
947 t0
= (__vlibm_TBL_sincos_hi
[j0
+((n0
+xsb0
)&3)] * w0
+ a0
* t0
) + __vlibm_TBL_sincos_lo
[j0
+n0
];
948 t1
= x1_or_one
[n1
] + (y1_or_zero
[n1
] + x1_or_one
[n1
] * t1
);
949 t2
= x2_or_one
[n2
] + (y2_or_zero
[n2
] + x2_or_one
[n2
] * t2
);
974 t0
= z0
* (poly3
[j0
] + z0
* poly4
[j0
]);
975 t1
= z1
* (poly3
[j1
] + z1
* poly4
[j1
]);
976 t2
= z2
* (poly3
[j2
] + z2
* poly4
[j2
]);
977 t0
= z0
* (poly1
[j0
] + z0
* (poly2
[j0
] + t0
));
978 t1
= z1
* (poly1
[j1
] + z1
* (poly2
[j1
] + t1
));
979 t2
= z2
* (poly1
[j2
] + z2
* (poly2
[j2
] + t2
));
980 t0
= x0_or_one
[n0
] + (y0_or_zero
[n0
] + x0_or_one
[n0
] * t0
);
981 t1
= x1_or_one
[n1
] + (y1_or_zero
[n1
] + x1_or_one
[n1
] * t1
);
982 t2
= x2_or_one
[n2
] + (y2_or_zero
[n2
] + x2_or_one
[n2
] * t2
);
996 double fn0
, fn1
, a0
, a1
, w0
, w1
, y0
, y1
;
997 double t0
, t1
, z0
, z1
;
1003 n1
= (int) (x1
* invpio2
+ half
[xsb1
]);
1005 n1
= (n1
+ 1) & 3; /* Add 1 (before the mod) to make sin into cos */
1006 a1
= x1
- fn1
* pio2_1
;
1009 y1
= (a1
- x1
) - w1
;
1011 w1
= fn1
* pio2_3
- y1
;
1013 y1
= (a1
- x1
) - w1
;
1015 w1
= fn1
* pio2_3t
- y1
;
1017 y1
= (a1
- x1
) - w1
;
1019 if ((xsb1
& ~0x80000000) < thresh
[n1
&1])
1025 y1_or_zero
[2] = -y1
;
1027 t1
= z1
* (poly3
[j1
] + z1
* poly4
[j1
]);
1028 t1
= z1
* (poly1
[j1
] + z1
* (poly2
[j1
] + t1
));
1029 t1
= x1_or_one
[n1
] + (y1_or_zero
[n1
] + x1_or_one
[n1
] * t1
);
1034 j1
= (xsb1
+ 0x4000) & 0xffff8000;
1037 x1
= (x1
- t1
) + y1
;
1039 t1
= z1
* (qq1
+ z1
* qq2
);
1040 w1
= x1
* (one
+ z1
* (pp1
+ z1
* pp2
));
1041 j1
= (((j1
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
1042 xsb1
= (xsb1
>> 30) & 2;
1043 n1
^= (xsb1
& ~(n1
<< 1));
1045 a1
= __vlibm_TBL_sincos_hi
[j1
+n1
];
1046 t1
= (__vlibm_TBL_sincos_hi
[j1
+((n1
+xsb1
)&3)] * w1
+ a1
* t1
) + __vlibm_TBL_sincos_lo
[j1
+n1
];
1050 n0
= (int) (x0
* invpio2
+ half
[xsb0
]);
1052 n0
= (n0
+ 1) & 3; /* Add 1 (before the mod) to make sin into cos */
1053 a0
= x0
- fn0
* pio2_1
;
1056 y0
= (a0
- x0
) - w0
;
1058 w0
= fn0
* pio2_3
- y0
;
1060 y0
= (a0
- x0
) - w0
;
1062 w0
= fn0
* pio2_3t
- y0
;
1064 y0
= (a0
- x0
) - w0
;
1066 if ((xsb0
& ~0x80000000) < thresh
[n0
&1])
1072 y0_or_zero
[2] = -y0
;
1074 t0
= z0
* (poly3
[j0
] + z0
* poly4
[j0
]);
1075 t0
= z0
* (poly1
[j0
] + z0
* (poly2
[j0
] + t0
));
1076 t0
= x0_or_one
[n0
] + (y0_or_zero
[n0
] + x0_or_one
[n0
] * t0
);
1081 j0
= (xsb0
+ 0x4000) & 0xffff8000;
1084 x0
= (x0
- t0
) + y0
;
1086 t0
= z0
* (qq1
+ z0
* qq2
);
1087 w0
= x0
* (one
+ z0
* (pp1
+ z0
* pp2
));
1088 j0
= (((j0
& ~0x80000000) - 0x3fc40000) >> 13) & ~0x3;
1089 xsb0
= (xsb0
>> 30) & 2;
1090 n0
^= (xsb0
& ~(n0
<< 1));
1092 a0
= __vlibm_TBL_sincos_hi
[j0
+n0
];
1093 t0
= (__vlibm_TBL_sincos_hi
[j0
+((n0
+xsb0
)&3)] * w0
+ a0
* t0
) + __vlibm_TBL_sincos_lo
[j0
+n0
];
1099 __vlibm_vcos_big(nsave
, xsave
, sxsave
, ysave
, sysave
, 0x413921fb);