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_vsin_big(int, double *, int, double *, int, int); 72*25c28e83SPiotr Jasiukajtis 73*25c28e83SPiotr Jasiukajtis void 74*25c28e83SPiotr Jasiukajtis __vlibm_vsin_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 &= 3; 180*25c28e83SPiotr Jasiukajtis n1 &= 3; 181*25c28e83SPiotr Jasiukajtis n2 &= 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 &= 3; 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 &= 3; 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_vsin_big(nsave, xsave, sxsave, ysave, sysave, 0x413921fb); 653*25c28e83SPiotr Jasiukajtis } 654