1 /* 2 * CDDL HEADER START 3 * 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. 7 * 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. 12 * 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] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2011 Nexenta Systems, Inc. All rights reserved. 24 */ 25 /* 26 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 27 * Use is subject to license terms. 28 */ 29 30 #include <sys/isa_defs.h> 31 #include <sys/ccompile.h> 32 33 #ifdef _LITTLE_ENDIAN 34 #define HI(x) *(1+(int*)x) 35 #define LO(x) *(unsigned*)x 36 #else 37 #define HI(x) *(int*)x 38 #define LO(x) *(1+(unsigned*)x) 39 #endif 40 41 #ifdef __RESTRICT 42 #define restrict _Restrict 43 #else 44 #define restrict 45 #endif 46 47 /* 48 * vcos.1.c 49 * 50 * Vector cosine function. Just slight modifications to vsin.8.c, mainly 51 * in the primary range part. 52 * 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. 56 * 57 */ 58 59 extern const double __vlibm_TBL_sincos_hi[], __vlibm_TBL_sincos_lo[]; 60 61 static const double 62 half[2] = { 0.5, -0.5 }, 63 one = 1.0, 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 }; 81 82 static const unsigned thresh[2] = { 0x3fc90000, 0x3fc40000 }; 83 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 ); 87 88 /* 89 * y[i*stridey] := cos( x[i*stridex] ), for i = 0..n. 90 * 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. 93 * 94 * elts < 2^-27 use the approximation 1.0 ~ cos(x). 95 */ 96 void 97 __vcos( int n, double * restrict x, int stridex, double * restrict y, 98 int stridey ) 99 { 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 nsave = n; 106 xsave = x; 107 sxsave = stridex; 108 ysave = y; 109 sysave = stridey; 110 biguns = 0; 111 112 do /* MAIN LOOP */ 113 { 114 /* Gotos here so _break_ exits MAIN LOOP. */ 115 LOOP0: /* Find first arg in right range. */ 116 xsb0 = HI(x); /* get most significant word */ 117 hx0 = xsb0 & ~0x80000000; /* mask off sign bit */ 118 if ( hx0 > 0x3fe921fb ) { 119 /* Too big: arg reduction needed, so leave for second part */ 120 biguns = 1; 121 goto MEDIUM; 122 } 123 if ( hx0 < 0x3e400000 ) { 124 /* Too small. cos x ~ 1. */ 125 *y = 1.0; 126 x += stridex; 127 y += stridey; 128 i = 0; 129 if ( --n <= 0 ) 130 break; 131 goto LOOP0; 132 } 133 x0 = *x; 134 py0 = y; 135 x += stridex; 136 y += stridey; 137 i = 1; 138 if ( --n <= 0 ) 139 break; 140 141 LOOP1: /* Get second arg, same as above. */ 142 xsb1 = HI(x); 143 hx1 = xsb1 & ~0x80000000; 144 if ( hx1 > 0x3fe921fb ) 145 { 146 biguns = 2; 147 goto MEDIUM; 148 } 149 if ( hx1 < 0x3e400000 ) 150 { 151 *y = 1.0; 152 x += stridex; 153 y += stridey; 154 i = 1; 155 if ( --n <= 0 ) 156 break; 157 goto LOOP1; 158 } 159 x1 = *x; 160 py1 = y; 161 x += stridex; 162 y += stridey; 163 i = 2; 164 if ( --n <= 0 ) 165 break; 166 167 LOOP2: /* Get third arg, same as above. */ 168 xsb2 = HI(x); 169 hx2 = xsb2 & ~0x80000000; 170 if ( hx2 > 0x3fe921fb ) 171 { 172 biguns = 3; 173 goto MEDIUM; 174 } 175 if ( hx2 < 0x3e400000 ) 176 { 177 *y = 1.0; 178 x += stridex; 179 y += stridey; 180 i = 2; 181 if ( --n <= 0 ) 182 break; 183 goto LOOP2; 184 } 185 x2 = *x; 186 py2 = y; 187 188 /* 189 * 0x3fc40000 = 5/32 ~ 0.15625 190 * Get msb after subtraction. Will be 1 only if 191 * hx0 - 5/32 is negative. 192 */ 193 i = ( hx0 - 0x3fc40000 ) >> 31; 194 i |= ( ( hx1 - 0x3fc40000 ) >> 30 ) & 2; 195 i |= ( ( hx2 - 0x3fc40000 ) >> 29 ) & 4; 196 switch ( i ) 197 { 198 double a0, a1, a2, w0, w1, w2; 199 double t0, t1, t2, z0, z1, z2; 200 unsigned j0, j1, j2; 201 202 case 0: /* All are > 5/32 */ 203 j0 = ( xsb0 + 0x4000 ) & 0xffff8000; 204 j1 = ( xsb1 + 0x4000 ) & 0xffff8000; 205 j2 = ( xsb2 + 0x4000 ) & 0xffff8000; 206 HI(&t0) = j0; 207 HI(&t1) = j1; 208 HI(&t2) = j2; 209 LO(&t0) = 0; 210 LO(&t1) = 0; 211 LO(&t2) = 0; 212 x0 -= t0; 213 x1 -= t1; 214 x2 -= t2; 215 z0 = x0 * x0; 216 z1 = x1 * x1; 217 z2 = x2 * x2; 218 t0 = z0 * ( qq1 + z0 * qq2 ); 219 t1 = z1 * ( qq1 + z1 * qq2 ); 220 t2 = z2 * ( qq1 + z2 * qq2 ); 221 w0 = x0 * ( one + z0 * ( pp1 + z0 * pp2 ) ); 222 w1 = x1 * ( one + z1 * ( pp1 + z1 * pp2 ) ); 223 w2 = x2 * ( one + z2 * ( pp1 + z2 * pp2 ) ); 224 j0 = ( ( ( j0 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 225 j1 = ( ( ( j1 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 226 j2 = ( ( ( j2 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 227 xsb0 = ( xsb0 >> 30 ) & 2; 228 xsb1 = ( xsb1 >> 30 ) & 2; 229 xsb2 = ( xsb2 >> 30 ) & 2; 230 a0 = __vlibm_TBL_sincos_hi[j0+1]; /* cos_hi(t) */ 231 a1 = __vlibm_TBL_sincos_hi[j1+1]; 232 a2 = __vlibm_TBL_sincos_hi[j2+1]; 233 /* cos_lo(t) sin_hi(t) */ 234 t0 = __vlibm_TBL_sincos_lo[j0+1] - ( __vlibm_TBL_sincos_hi[j0+xsb0]*w0 - a0*t0 ); 235 t1 = __vlibm_TBL_sincos_lo[j1+1] - ( __vlibm_TBL_sincos_hi[j1+xsb1]*w1 - a1*t1 ); 236 t2 = __vlibm_TBL_sincos_lo[j2+1] - ( __vlibm_TBL_sincos_hi[j2+xsb2]*w2 - a2*t2 ); 237 238 *py0 = a0 + t0; 239 *py1 = a1 + t1; 240 *py2 = a2 + t2; 241 break; 242 243 case 1: 244 j1 = ( xsb1 + 0x4000 ) & 0xffff8000; 245 j2 = ( xsb2 + 0x4000 ) & 0xffff8000; 246 HI(&t1) = j1; 247 HI(&t2) = j2; 248 LO(&t1) = 0; 249 LO(&t2) = 0; 250 x1 -= t1; 251 x2 -= t2; 252 z0 = x0 * x0; 253 z1 = x1 * x1; 254 z2 = x2 * x2; 255 t0 = z0 * ( poly3[1] + z0 * poly4[1] ); 256 t1 = z1 * ( qq1 + z1 * qq2 ); 257 t2 = z2 * ( qq1 + z2 * qq2 ); 258 t0 = z0 * ( poly1[1] + z0 * ( poly2[1] + t0 ) ); 259 w1 = x1 * ( one + z1 * ( pp1 + z1 * pp2 ) ); 260 w2 = x2 * ( one + z2 * ( pp1 + z2 * pp2 ) ); 261 j1 = ( ( ( j1 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 262 j2 = ( ( ( j2 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 263 xsb1 = ( xsb1 >> 30 ) & 2; 264 xsb2 = ( xsb2 >> 30 ) & 2; 265 a1 = __vlibm_TBL_sincos_hi[j1+1]; 266 a2 = __vlibm_TBL_sincos_hi[j2+1]; 267 t1 = __vlibm_TBL_sincos_lo[j1+1] - ( __vlibm_TBL_sincos_hi[j1+xsb1]*w1 - a1*t1 ); 268 t2 = __vlibm_TBL_sincos_lo[j2+1] - ( __vlibm_TBL_sincos_hi[j2+xsb2]*w2 - a2*t2 ); 269 *py0 = one + t0; 270 *py1 = a1 + t1; 271 *py2 = a2 + t2; 272 break; 273 274 case 2: 275 j0 = ( xsb0 + 0x4000 ) & 0xffff8000; 276 j2 = ( xsb2 + 0x4000 ) & 0xffff8000; 277 HI(&t0) = j0; 278 HI(&t2) = j2; 279 LO(&t0) = 0; 280 LO(&t2) = 0; 281 x0 -= t0; 282 x2 -= t2; 283 z0 = x0 * x0; 284 z1 = x1 * x1; 285 z2 = x2 * x2; 286 t0 = z0 * ( qq1 + z0 * qq2 ); 287 t1 = z1 * ( poly3[1] + z1 * poly4[1] ); 288 t2 = z2 * ( qq1 + z2 * qq2 ); 289 w0 = x0 * ( one + z0 * ( pp1 + z0 * pp2 ) ); 290 t1 = z1 * ( poly1[1] + z1 * ( poly2[1] + t1 ) ); 291 w2 = x2 * ( one + z2 * ( pp1 + z2 * pp2 ) ); 292 j0 = ( ( ( j0 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 293 j2 = ( ( ( j2 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 294 xsb0 = ( xsb0 >> 30 ) & 2; 295 xsb2 = ( xsb2 >> 30 ) & 2; 296 a0 = __vlibm_TBL_sincos_hi[j0+1]; 297 a2 = __vlibm_TBL_sincos_hi[j2+1]; 298 t0 = __vlibm_TBL_sincos_lo[j0+1] - ( __vlibm_TBL_sincos_hi[j0+xsb0]*w0 - a0*t0 ); 299 t2 = __vlibm_TBL_sincos_lo[j2+1] - ( __vlibm_TBL_sincos_hi[j2+xsb2]*w2 - a2*t2 ); 300 *py0 = a0 + t0; 301 *py1 = one + t1; 302 *py2 = a2 + t2; 303 break; 304 305 case 3: 306 j2 = ( xsb2 + 0x4000 ) & 0xffff8000; 307 HI(&t2) = j2; 308 LO(&t2) = 0; 309 x2 -= t2; 310 z0 = x0 * x0; 311 z1 = x1 * x1; 312 z2 = x2 * x2; 313 t0 = z0 * ( poly3[1] + z0 * poly4[1] ); 314 t1 = z1 * ( poly3[1] + z1 * poly4[1] ); 315 t2 = z2 * ( qq1 + z2 * qq2 ); 316 t0 = z0 * ( poly1[1] + z0 * ( poly2[1] + t0 ) ); 317 t1 = z1 * ( poly1[1] + z1 * ( poly2[1] + t1 ) ); 318 w2 = x2 * ( one + z2 * ( pp1 + z2 * pp2 ) ); 319 j2 = ( ( ( j2 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 320 xsb2 = ( xsb2 >> 30 ) & 2; 321 a2 = __vlibm_TBL_sincos_hi[j2+1]; 322 t2 = __vlibm_TBL_sincos_lo[j2+1] - ( __vlibm_TBL_sincos_hi[j2+xsb2]*w2 - a2*t2 ); 323 *py0 = one + t0; 324 *py1 = one + t1; 325 *py2 = a2 + t2; 326 break; 327 328 case 4: 329 j0 = ( xsb0 + 0x4000 ) & 0xffff8000; 330 j1 = ( xsb1 + 0x4000 ) & 0xffff8000; 331 HI(&t0) = j0; 332 HI(&t1) = j1; 333 LO(&t0) = 0; 334 LO(&t1) = 0; 335 x0 -= t0; 336 x1 -= t1; 337 z0 = x0 * x0; 338 z1 = x1 * x1; 339 z2 = x2 * x2; 340 t0 = z0 * ( qq1 + z0 * qq2 ); 341 t1 = z1 * ( qq1 + z1 * qq2 ); 342 t2 = z2 * ( poly3[1] + z2 * poly4[1] ); 343 w0 = x0 * ( one + z0 * ( pp1 + z0 * pp2 ) ); 344 w1 = x1 * ( one + z1 * ( pp1 + z1 * pp2 ) ); 345 t2 = z2 * ( poly1[1] + z2 * ( poly2[1] + t2 ) ); 346 j0 = ( ( ( j0 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 347 j1 = ( ( ( j1 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 348 xsb0 = ( xsb0 >> 30 ) & 2; 349 xsb1 = ( xsb1 >> 30 ) & 2; 350 a0 = __vlibm_TBL_sincos_hi[j0+1]; 351 a1 = __vlibm_TBL_sincos_hi[j1+1]; 352 t0 = __vlibm_TBL_sincos_lo[j0+1] - ( __vlibm_TBL_sincos_hi[j0+xsb0]*w0 - a0*t0 ); 353 t1 = __vlibm_TBL_sincos_lo[j1+1] - ( __vlibm_TBL_sincos_hi[j1+xsb1]*w1 - a1*t1 ); 354 *py0 = a0 + t0; 355 *py1 = a1 + t1; 356 *py2 = one + t2; 357 break; 358 359 case 5: 360 j1 = ( xsb1 + 0x4000 ) & 0xffff8000; 361 HI(&t1) = j1; 362 LO(&t1) = 0; 363 x1 -= t1; 364 z0 = x0 * x0; 365 z1 = x1 * x1; 366 z2 = x2 * x2; 367 t0 = z0 * ( poly3[1] + z0 * poly4[1] ); 368 t1 = z1 * ( qq1 + z1 * qq2 ); 369 t2 = z2 * ( poly3[1] + z2 * poly4[1] ); 370 t0 = z0 * ( poly1[1] + z0 * ( poly2[1] + t0 ) ); 371 w1 = x1 * ( one + z1 * ( pp1 + z1 * pp2 ) ); 372 t2 = z2 * ( poly1[1] + z2 * ( poly2[1] + t2 ) ); 373 j1 = ( ( ( j1 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 374 xsb1 = ( xsb1 >> 30 ) & 2; 375 a1 = __vlibm_TBL_sincos_hi[j1+1]; 376 t1 = __vlibm_TBL_sincos_lo[j1+1] - ( __vlibm_TBL_sincos_hi[j1+xsb1]*w1 - a1*t1 ); 377 *py0 = one + t0; 378 *py1 = a1 + t1; 379 *py2 = one + t2; 380 break; 381 382 case 6: 383 j0 = ( xsb0 + 0x4000 ) & 0xffff8000; 384 HI(&t0) = j0; 385 LO(&t0) = 0; 386 x0 -= t0; 387 z0 = x0 * x0; 388 z1 = x1 * x1; 389 z2 = x2 * x2; 390 t0 = z0 * ( qq1 + z0 * qq2 ); 391 t1 = z1 * ( poly3[1] + z1 * poly4[1] ); 392 t2 = z2 * ( poly3[1] + z2 * poly4[1] ); 393 w0 = x0 * ( one + z0 * ( pp1 + z0 * pp2 ) ); 394 t1 = z1 * ( poly1[1] + z1 * ( poly2[1] + t1 ) ); 395 t2 = z2 * ( poly1[1] + z2 * ( poly2[1] + t2 ) ); 396 j0 = ( ( ( j0 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 397 xsb0 = ( xsb0 >> 30 ) & 2; 398 a0 = __vlibm_TBL_sincos_hi[j0+1]; 399 t0 = __vlibm_TBL_sincos_lo[j0+1] - ( __vlibm_TBL_sincos_hi[j0+xsb0]*w0 - a0*t0 ); 400 *py0 = a0 + t0; 401 *py1 = one + t1; 402 *py2 = one + t2; 403 break; 404 405 case 7: /* All are < 5/32 */ 406 z0 = x0 * x0; 407 z1 = x1 * x1; 408 z2 = x2 * x2; 409 t0 = z0 * ( poly3[1] + z0 * poly4[1] ); 410 t1 = z1 * ( poly3[1] + z1 * poly4[1] ); 411 t2 = z2 * ( poly3[1] + z2 * poly4[1] ); 412 t0 = z0 * ( poly1[1] + z0 * ( poly2[1] + t0 ) ); 413 t1 = z1 * ( poly1[1] + z1 * ( poly2[1] + t1 ) ); 414 t2 = z2 * ( poly1[1] + z2 * ( poly2[1] + t2 ) ); 415 *py0 = one + t0; 416 *py1 = one + t1; 417 *py2 = one + t2; 418 break; 419 } 420 421 x += stridex; 422 y += stridey; 423 i = 0; 424 } while ( --n > 0 ); /* END MAIN LOOP */ 425 426 /* 427 * CLEAN UP last 0, 1, or 2 elts. 428 */ 429 if ( i > 0 ) /* Clean up elts at tail. i < 3. */ 430 { 431 double a0, a1, w0, w1; 432 double t0, t1, z0, z1; 433 unsigned j0, j1; 434 435 if ( i > 1 ) 436 { 437 if ( hx1 < 0x3fc40000 ) 438 { 439 z1 = x1 * x1; 440 t1 = z1 * ( poly3[1] + z1 * poly4[1] ); 441 t1 = z1 * ( poly1[1] + z1 * ( poly2[1] + t1 ) ); 442 t1 = one + t1; 443 *py1 = t1; 444 } 445 else 446 { 447 j1 = ( xsb1 + 0x4000 ) & 0xffff8000; 448 HI(&t1) = j1; 449 LO(&t1) = 0; 450 x1 -= t1; 451 z1 = x1 * x1; 452 t1 = z1 * ( qq1 + z1 * qq2 ); 453 w1 = x1 * ( one + z1 * ( pp1 + z1 * pp2 ) ); 454 j1 = ( ( ( j1 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 455 xsb1 = ( xsb1 >> 30 ) & 2; 456 a1 = __vlibm_TBL_sincos_hi[j1+1]; 457 t1 = __vlibm_TBL_sincos_lo[j1+1] 458 - ( __vlibm_TBL_sincos_hi[j1+xsb1]*w1 - a1*t1 ); 459 *py1 = a1 + t1; 460 } 461 } 462 if ( hx0 < 0x3fc40000 ) 463 { 464 z0 = x0 * x0; 465 t0 = z0 * ( poly3[1] + z0 * poly4[1] ); 466 t0 = z0 * ( poly1[1] + z0 * ( poly2[1] + t0 ) ); 467 t0 = one + t0; 468 *py0 = t0; 469 } 470 else 471 { 472 j0 = ( xsb0 + 0x4000 ) & 0xffff8000; 473 HI(&t0) = j0; 474 LO(&t0) = 0; 475 x0 -= t0; 476 z0 = x0 * x0; 477 t0 = z0 * ( qq1 + z0 * qq2 ); 478 w0 = x0 * ( one + z0 * ( pp1 + z0 * pp2 ) ); 479 j0 = ( ( ( j0 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 480 xsb0 = ( xsb0 >> 30 ) & 2; 481 a0 = __vlibm_TBL_sincos_hi[j0+1]; 482 t0 = __vlibm_TBL_sincos_lo[j0+1] - ( __vlibm_TBL_sincos_hi[j0+xsb0]*w0 - a0*t0 ); 483 *py0 = a0 + t0; 484 } 485 } /* END CLEAN UP */ 486 487 return; 488 489 /* 490 * Take care of BIGUNS. 491 * 492 * We have jumped here in the middle of processing after having 493 * encountered a medium range argument. Therefore things are in a 494 * bit of a tizzy. 495 */ 496 497 MEDIUM: 498 499 x0_or_one[1] = 1.0; 500 x1_or_one[1] = 1.0; 501 x2_or_one[1] = 1.0; 502 x0_or_one[3] = -1.0; 503 x1_or_one[3] = -1.0; 504 x2_or_one[3] = -1.0; 505 y0_or_zero[1] = 0.0; 506 y1_or_zero[1] = 0.0; 507 y2_or_zero[1] = 0.0; 508 y0_or_zero[3] = 0.0; 509 y1_or_zero[3] = 0.0; 510 y2_or_zero[3] = 0.0; 511 512 if ( biguns == 3 ) 513 { 514 biguns = 0; 515 xsb0 = xsb0 >> 31; 516 xsb1 = xsb1 >> 31; 517 goto loop2; 518 } 519 else if ( biguns == 2 ) 520 { 521 xsb0 = xsb0 >> 31; 522 biguns = 0; 523 goto loop1; 524 } 525 biguns = 0; 526 527 do 528 { 529 double fn0, fn1, fn2, a0, a1, a2, w0, w1, w2, y0, y1, y2; 530 unsigned hx; 531 int n0, n1, n2; 532 533 /* 534 * Find 3 more to work on: Not already done, not too big. 535 */ 536 537 loop0: 538 hx = HI(x); 539 xsb0 = hx >> 31; 540 hx &= ~0x80000000; 541 if ( hx > 0x413921fb ) /* (1.6471e+06) Too big: leave it. */ 542 { 543 if ( hx >= 0x7ff00000 ) /* Inf or NaN */ 544 { 545 x0 = *x; 546 *y = x0 - x0; 547 } 548 else 549 biguns = 1; 550 x += stridex; 551 y += stridey; 552 i = 0; 553 if ( --n <= 0 ) 554 break; 555 goto loop0; 556 } 557 x0 = *x; 558 py0 = y; 559 x += stridex; 560 y += stridey; 561 i = 1; 562 if ( --n <= 0 ) 563 break; 564 565 loop1: 566 hx = HI(x); 567 xsb1 = hx >> 31; 568 hx &= ~0x80000000; 569 if ( hx > 0x413921fb ) 570 { 571 if ( hx >= 0x7ff00000 ) 572 { 573 x1 = *x; 574 *y = x1 - x1; 575 } 576 else 577 biguns = 1; 578 x += stridex; 579 y += stridey; 580 i = 1; 581 if ( --n <= 0 ) 582 break; 583 goto loop1; 584 } 585 x1 = *x; 586 py1 = y; 587 x += stridex; 588 y += stridey; 589 i = 2; 590 if ( --n <= 0 ) 591 break; 592 593 loop2: 594 hx = HI(x); 595 xsb2 = hx >> 31; 596 hx &= ~0x80000000; 597 if ( hx > 0x413921fb ) 598 { 599 if ( hx >= 0x7ff00000 ) 600 { 601 x2 = *x; 602 *y = x2 - x2; 603 } 604 else 605 biguns = 1; 606 x += stridex; 607 y += stridey; 608 i = 2; 609 if ( --n <= 0 ) 610 break; 611 goto loop2; 612 } 613 x2 = *x; 614 py2 = y; 615 616 n0 = (int) ( x0 * invpio2 + half[xsb0] ); 617 n1 = (int) ( x1 * invpio2 + half[xsb1] ); 618 n2 = (int) ( x2 * invpio2 + half[xsb2] ); 619 fn0 = (double) n0; 620 fn1 = (double) n1; 621 fn2 = (double) n2; 622 n0 = (n0 + 1) & 3; /* Add 1 (before the mod) to make sin into cos */ 623 n1 = (n1 + 1) & 3; 624 n2 = (n2 + 1) & 3; 625 a0 = x0 - fn0 * pio2_1; 626 a1 = x1 - fn1 * pio2_1; 627 a2 = x2 - fn2 * pio2_1; 628 w0 = fn0 * pio2_2; 629 w1 = fn1 * pio2_2; 630 w2 = fn2 * pio2_2; 631 x0 = a0 - w0; 632 x1 = a1 - w1; 633 x2 = a2 - w2; 634 y0 = ( a0 - x0 ) - w0; 635 y1 = ( a1 - x1 ) - w1; 636 y2 = ( a2 - x2 ) - w2; 637 a0 = x0; 638 a1 = x1; 639 a2 = x2; 640 w0 = fn0 * pio2_3 - y0; 641 w1 = fn1 * pio2_3 - y1; 642 w2 = fn2 * pio2_3 - y2; 643 x0 = a0 - w0; 644 x1 = a1 - w1; 645 x2 = a2 - w2; 646 y0 = ( a0 - x0 ) - w0; 647 y1 = ( a1 - x1 ) - w1; 648 y2 = ( a2 - x2 ) - w2; 649 a0 = x0; 650 a1 = x1; 651 a2 = x2; 652 w0 = fn0 * pio2_3t - y0; 653 w1 = fn1 * pio2_3t - y1; 654 w2 = fn2 * pio2_3t - y2; 655 x0 = a0 - w0; 656 x1 = a1 - w1; 657 x2 = a2 - w2; 658 y0 = ( a0 - x0 ) - w0; 659 y1 = ( a1 - x1 ) - w1; 660 y2 = ( a2 - x2 ) - w2; 661 xsb0 = HI(&x0); 662 i = ( ( xsb0 & ~0x80000000 ) - thresh[n0&1] ) >> 31; 663 xsb1 = HI(&x1); 664 i |= ( ( ( xsb1 & ~0x80000000 ) - thresh[n1&1] ) >> 30 ) & 2; 665 xsb2 = HI(&x2); 666 i |= ( ( ( xsb2 & ~0x80000000 ) - thresh[n2&1] ) >> 29 ) & 4; 667 switch ( i ) 668 { 669 double t0, t1, t2, z0, z1, z2; 670 unsigned j0, j1, j2; 671 672 case 0: 673 j0 = ( xsb0 + 0x4000 ) & 0xffff8000; 674 j1 = ( xsb1 + 0x4000 ) & 0xffff8000; 675 j2 = ( xsb2 + 0x4000 ) & 0xffff8000; 676 HI(&t0) = j0; 677 HI(&t1) = j1; 678 HI(&t2) = j2; 679 LO(&t0) = 0; 680 LO(&t1) = 0; 681 LO(&t2) = 0; 682 x0 = ( x0 - t0 ) + y0; 683 x1 = ( x1 - t1 ) + y1; 684 x2 = ( x2 - t2 ) + y2; 685 z0 = x0 * x0; 686 z1 = x1 * x1; 687 z2 = x2 * x2; 688 t0 = z0 * ( qq1 + z0 * qq2 ); 689 t1 = z1 * ( qq1 + z1 * qq2 ); 690 t2 = z2 * ( qq1 + z2 * qq2 ); 691 w0 = x0 * ( one + z0 * ( pp1 + z0 * pp2 ) ); 692 w1 = x1 * ( one + z1 * ( pp1 + z1 * pp2 ) ); 693 w2 = x2 * ( one + z2 * ( pp1 + z2 * pp2 ) ); 694 j0 = ( ( ( j0 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 695 j1 = ( ( ( j1 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 696 j2 = ( ( ( j2 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 697 xsb0 = ( xsb0 >> 30 ) & 2; 698 xsb1 = ( xsb1 >> 30 ) & 2; 699 xsb2 = ( xsb2 >> 30 ) & 2; 700 n0 ^= ( xsb0 & ~( n0 << 1 ) ); 701 n1 ^= ( xsb1 & ~( n1 << 1 ) ); 702 n2 ^= ( xsb2 & ~( n2 << 1 ) ); 703 xsb0 |= 1; 704 xsb1 |= 1; 705 xsb2 |= 1; 706 a0 = __vlibm_TBL_sincos_hi[j0+n0]; 707 a1 = __vlibm_TBL_sincos_hi[j1+n1]; 708 a2 = __vlibm_TBL_sincos_hi[j2+n2]; 709 t0 = ( __vlibm_TBL_sincos_hi[j0+((n0+xsb0)&3)] * w0 + a0 * t0 ) + __vlibm_TBL_sincos_lo[j0+n0]; 710 t1 = ( __vlibm_TBL_sincos_hi[j1+((n1+xsb1)&3)] * w1 + a1 * t1 ) + __vlibm_TBL_sincos_lo[j1+n1]; 711 t2 = ( __vlibm_TBL_sincos_hi[j2+((n2+xsb2)&3)] * w2 + a2 * t2 ) + __vlibm_TBL_sincos_lo[j2+n2]; 712 *py0 = ( a0 + t0 ); 713 *py1 = ( a1 + t1 ); 714 *py2 = ( a2 + t2 ); 715 break; 716 717 case 1: 718 j0 = n0 & 1; 719 j1 = ( xsb1 + 0x4000 ) & 0xffff8000; 720 j2 = ( xsb2 + 0x4000 ) & 0xffff8000; 721 HI(&t1) = j1; 722 HI(&t2) = j2; 723 LO(&t1) = 0; 724 LO(&t2) = 0; 725 x0_or_one[0] = x0; 726 x0_or_one[2] = -x0; 727 y0_or_zero[0] = y0; 728 y0_or_zero[2] = -y0; 729 x1 = ( x1 - t1 ) + y1; 730 x2 = ( x2 - t2 ) + y2; 731 z0 = x0 * x0; 732 z1 = x1 * x1; 733 z2 = x2 * x2; 734 t0 = z0 * ( poly3[j0] + z0 * poly4[j0] ); 735 t1 = z1 * ( qq1 + z1 * qq2 ); 736 t2 = z2 * ( qq1 + z2 * qq2 ); 737 t0 = z0 * ( poly1[j0] + z0 * ( poly2[j0] + t0 ) ); 738 w1 = x1 * ( one + z1 * ( pp1 + z1 * pp2 ) ); 739 w2 = x2 * ( one + z2 * ( pp1 + z2 * pp2 ) ); 740 j1 = ( ( ( j1 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 741 j2 = ( ( ( j2 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 742 xsb1 = ( xsb1 >> 30 ) & 2; 743 xsb2 = ( xsb2 >> 30 ) & 2; 744 n1 ^= ( xsb1 & ~( n1 << 1 ) ); 745 n2 ^= ( xsb2 & ~( n2 << 1 ) ); 746 xsb1 |= 1; 747 xsb2 |= 1; 748 a1 = __vlibm_TBL_sincos_hi[j1+n1]; 749 a2 = __vlibm_TBL_sincos_hi[j2+n2]; 750 t0 = x0_or_one[n0] + ( y0_or_zero[n0] + x0_or_one[n0] * t0 ); 751 t1 = ( __vlibm_TBL_sincos_hi[j1+((n1+xsb1)&3)] * w1 + a1 * t1 ) + __vlibm_TBL_sincos_lo[j1+n1]; 752 t2 = ( __vlibm_TBL_sincos_hi[j2+((n2+xsb2)&3)] * w2 + a2 * t2 ) + __vlibm_TBL_sincos_lo[j2+n2]; 753 *py0 = t0; 754 *py1 = ( a1 + t1 ); 755 *py2 = ( a2 + t2 ); 756 break; 757 758 case 2: 759 j0 = ( xsb0 + 0x4000 ) & 0xffff8000; 760 j1 = n1 & 1; 761 j2 = ( xsb2 + 0x4000 ) & 0xffff8000; 762 HI(&t0) = j0; 763 HI(&t2) = j2; 764 LO(&t0) = 0; 765 LO(&t2) = 0; 766 x1_or_one[0] = x1; 767 x1_or_one[2] = -x1; 768 x0 = ( x0 - t0 ) + y0; 769 y1_or_zero[0] = y1; 770 y1_or_zero[2] = -y1; 771 x2 = ( x2 - t2 ) + y2; 772 z0 = x0 * x0; 773 z1 = x1 * x1; 774 z2 = x2 * x2; 775 t0 = z0 * ( qq1 + z0 * qq2 ); 776 t1 = z1 * ( poly3[j1] + z1 * poly4[j1] ); 777 t2 = z2 * ( qq1 + z2 * qq2 ); 778 w0 = x0 * ( one + z0 * ( pp1 + z0 * pp2 ) ); 779 t1 = z1 * ( poly1[j1] + z1 * ( poly2[j1] + t1 ) ); 780 w2 = x2 * ( one + z2 * ( pp1 + z2 * pp2 ) ); 781 j0 = ( ( ( j0 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 782 j2 = ( ( ( j2 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 783 xsb0 = ( xsb0 >> 30 ) & 2; 784 xsb2 = ( xsb2 >> 30 ) & 2; 785 n0 ^= ( xsb0 & ~( n0 << 1 ) ); 786 n2 ^= ( xsb2 & ~( n2 << 1 ) ); 787 xsb0 |= 1; 788 xsb2 |= 1; 789 a0 = __vlibm_TBL_sincos_hi[j0+n0]; 790 a2 = __vlibm_TBL_sincos_hi[j2+n2]; 791 t0 = ( __vlibm_TBL_sincos_hi[j0+((n0+xsb0)&3)] * w0 + a0 * t0 ) + __vlibm_TBL_sincos_lo[j0+n0]; 792 t1 = x1_or_one[n1] + ( y1_or_zero[n1] + x1_or_one[n1] * t1 ); 793 t2 = ( __vlibm_TBL_sincos_hi[j2+((n2+xsb2)&3)] * w2 + a2 * t2 ) + __vlibm_TBL_sincos_lo[j2+n2]; 794 *py0 = ( a0 + t0 ); 795 *py1 = t1; 796 *py2 = ( a2 + t2 ); 797 break; 798 799 case 3: 800 j0 = n0 & 1; 801 j1 = n1 & 1; 802 j2 = ( xsb2 + 0x4000 ) & 0xffff8000; 803 HI(&t2) = j2; 804 LO(&t2) = 0; 805 x0_or_one[0] = x0; 806 x0_or_one[2] = -x0; 807 x1_or_one[0] = x1; 808 x1_or_one[2] = -x1; 809 y0_or_zero[0] = y0; 810 y0_or_zero[2] = -y0; 811 y1_or_zero[0] = y1; 812 y1_or_zero[2] = -y1; 813 x2 = ( x2 - t2 ) + y2; 814 z0 = x0 * x0; 815 z1 = x1 * x1; 816 z2 = x2 * x2; 817 t0 = z0 * ( poly3[j0] + z0 * poly4[j0] ); 818 t1 = z1 * ( poly3[j1] + z1 * poly4[j1] ); 819 t2 = z2 * ( qq1 + z2 * qq2 ); 820 t0 = z0 * ( poly1[j0] + z0 * ( poly2[j0] + t0 ) ); 821 t1 = z1 * ( poly1[j1] + z1 * ( poly2[j1] + t1 ) ); 822 w2 = x2 * ( one + z2 * ( pp1 + z2 * pp2 ) ); 823 j2 = ( ( ( j2 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 824 xsb2 = ( xsb2 >> 30 ) & 2; 825 n2 ^= ( xsb2 & ~( n2 << 1 ) ); 826 xsb2 |= 1; 827 a2 = __vlibm_TBL_sincos_hi[j2+n2]; 828 t0 = x0_or_one[n0] + ( y0_or_zero[n0] + x0_or_one[n0] * t0 ); 829 t1 = x1_or_one[n1] + ( y1_or_zero[n1] + x1_or_one[n1] * t1 ); 830 t2 = ( __vlibm_TBL_sincos_hi[j2+((n2+xsb2)&3)] * w2 + a2 * t2 ) + __vlibm_TBL_sincos_lo[j2+n2]; 831 *py0 = t0; 832 *py1 = t1; 833 *py2 = ( a2 + t2 ); 834 break; 835 836 case 4: 837 j0 = ( xsb0 + 0x4000 ) & 0xffff8000; 838 j1 = ( xsb1 + 0x4000 ) & 0xffff8000; 839 j2 = n2 & 1; 840 HI(&t0) = j0; 841 HI(&t1) = j1; 842 LO(&t0) = 0; 843 LO(&t1) = 0; 844 x2_or_one[0] = x2; 845 x2_or_one[2] = -x2; 846 x0 = ( x0 - t0 ) + y0; 847 x1 = ( x1 - t1 ) + y1; 848 y2_or_zero[0] = y2; 849 y2_or_zero[2] = -y2; 850 z0 = x0 * x0; 851 z1 = x1 * x1; 852 z2 = x2 * x2; 853 t0 = z0 * ( qq1 + z0 * qq2 ); 854 t1 = z1 * ( qq1 + z1 * qq2 ); 855 t2 = z2 * ( poly3[j2] + z2 * poly4[j2] ); 856 w0 = x0 * ( one + z0 * ( pp1 + z0 * pp2 ) ); 857 w1 = x1 * ( one + z1 * ( pp1 + z1 * pp2 ) ); 858 t2 = z2 * ( poly1[j2] + z2 * ( poly2[j2] + t2 ) ); 859 j0 = ( ( ( j0 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 860 j1 = ( ( ( j1 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 861 xsb0 = ( xsb0 >> 30 ) & 2; 862 xsb1 = ( xsb1 >> 30 ) & 2; 863 n0 ^= ( xsb0 & ~( n0 << 1 ) ); 864 n1 ^= ( xsb1 & ~( n1 << 1 ) ); 865 xsb0 |= 1; 866 xsb1 |= 1; 867 a0 = __vlibm_TBL_sincos_hi[j0+n0]; 868 a1 = __vlibm_TBL_sincos_hi[j1+n1]; 869 t0 = ( __vlibm_TBL_sincos_hi[j0+((n0+xsb0)&3)] * w0 + a0 * t0 ) + __vlibm_TBL_sincos_lo[j0+n0]; 870 t1 = ( __vlibm_TBL_sincos_hi[j1+((n1+xsb1)&3)] * w1 + a1 * t1 ) + __vlibm_TBL_sincos_lo[j1+n1]; 871 t2 = x2_or_one[n2] + ( y2_or_zero[n2] + x2_or_one[n2] * t2 ); 872 *py0 = ( a0 + t0 ); 873 *py1 = ( a1 + t1 ); 874 *py2 = t2; 875 break; 876 877 case 5: 878 j0 = n0 & 1; 879 j1 = ( xsb1 + 0x4000 ) & 0xffff8000; 880 j2 = n2 & 1; 881 HI(&t1) = j1; 882 LO(&t1) = 0; 883 x0_or_one[0] = x0; 884 x0_or_one[2] = -x0; 885 x2_or_one[0] = x2; 886 x2_or_one[2] = -x2; 887 y0_or_zero[0] = y0; 888 y0_or_zero[2] = -y0; 889 x1 = ( x1 - t1 ) + y1; 890 y2_or_zero[0] = y2; 891 y2_or_zero[2] = -y2; 892 z0 = x0 * x0; 893 z1 = x1 * x1; 894 z2 = x2 * x2; 895 t0 = z0 * ( poly3[j0] + z0 * poly4[j0] ); 896 t1 = z1 * ( qq1 + z1 * qq2 ); 897 t2 = z2 * ( poly3[j2] + z2 * poly4[j2] ); 898 t0 = z0 * ( poly1[j0] + z0 * ( poly2[j0] + t0 ) ); 899 w1 = x1 * ( one + z1 * ( pp1 + z1 * pp2 ) ); 900 t2 = z2 * ( poly1[j2] + z2 * ( poly2[j2] + t2 ) ); 901 j1 = ( ( ( j1 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 902 xsb1 = ( xsb1 >> 30 ) & 2; 903 n1 ^= ( xsb1 & ~( n1 << 1 ) ); 904 xsb1 |= 1; 905 a1 = __vlibm_TBL_sincos_hi[j1+n1]; 906 t0 = x0_or_one[n0] + ( y0_or_zero[n0] + x0_or_one[n0] * t0 ); 907 t1 = ( __vlibm_TBL_sincos_hi[j1+((n1+xsb1)&3)] * w1 + a1 * t1 ) + __vlibm_TBL_sincos_lo[j1+n1]; 908 t2 = x2_or_one[n2] + ( y2_or_zero[n2] + x2_or_one[n2] * t2 ); 909 *py0 = t0; 910 *py1 = ( a1 + t1 ); 911 *py2 = t2; 912 break; 913 914 case 6: 915 j0 = ( xsb0 + 0x4000 ) & 0xffff8000; 916 j1 = n1 & 1; 917 j2 = n2 & 1; 918 HI(&t0) = j0; 919 LO(&t0) = 0; 920 x1_or_one[0] = x1; 921 x1_or_one[2] = -x1; 922 x2_or_one[0] = x2; 923 x2_or_one[2] = -x2; 924 x0 = ( x0 - t0 ) + y0; 925 y1_or_zero[0] = y1; 926 y1_or_zero[2] = -y1; 927 y2_or_zero[0] = y2; 928 y2_or_zero[2] = -y2; 929 z0 = x0 * x0; 930 z1 = x1 * x1; 931 z2 = x2 * x2; 932 t0 = z0 * ( qq1 + z0 * qq2 ); 933 t1 = z1 * ( poly3[j1] + z1 * poly4[j1] ); 934 t2 = z2 * ( poly3[j2] + z2 * poly4[j2] ); 935 w0 = x0 * ( one + z0 * ( pp1 + z0 * pp2 ) ); 936 t1 = z1 * ( poly1[j1] + z1 * ( poly2[j1] + t1 ) ); 937 t2 = z2 * ( poly1[j2] + z2 * ( poly2[j2] + t2 ) ); 938 j0 = ( ( ( j0 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 939 xsb0 = ( xsb0 >> 30 ) & 2; 940 n0 ^= ( xsb0 & ~( n0 << 1 ) ); 941 xsb0 |= 1; 942 a0 = __vlibm_TBL_sincos_hi[j0+n0]; 943 t0 = ( __vlibm_TBL_sincos_hi[j0+((n0+xsb0)&3)] * w0 + a0 * t0 ) + __vlibm_TBL_sincos_lo[j0+n0]; 944 t1 = x1_or_one[n1] + ( y1_or_zero[n1] + x1_or_one[n1] * t1 ); 945 t2 = x2_or_one[n2] + ( y2_or_zero[n2] + x2_or_one[n2] * t2 ); 946 *py0 = ( a0 + t0 ); 947 *py1 = t1; 948 *py2 = t2; 949 break; 950 951 case 7: 952 j0 = n0 & 1; 953 j1 = n1 & 1; 954 j2 = n2 & 1; 955 x0_or_one[0] = x0; 956 x0_or_one[2] = -x0; 957 x1_or_one[0] = x1; 958 x1_or_one[2] = -x1; 959 x2_or_one[0] = x2; 960 x2_or_one[2] = -x2; 961 y0_or_zero[0] = y0; 962 y0_or_zero[2] = -y0; 963 y1_or_zero[0] = y1; 964 y1_or_zero[2] = -y1; 965 y2_or_zero[0] = y2; 966 y2_or_zero[2] = -y2; 967 z0 = x0 * x0; 968 z1 = x1 * x1; 969 z2 = x2 * x2; 970 t0 = z0 * ( poly3[j0] + z0 * poly4[j0] ); 971 t1 = z1 * ( poly3[j1] + z1 * poly4[j1] ); 972 t2 = z2 * ( poly3[j2] + z2 * poly4[j2] ); 973 t0 = z0 * ( poly1[j0] + z0 * ( poly2[j0] + t0 ) ); 974 t1 = z1 * ( poly1[j1] + z1 * ( poly2[j1] + t1 ) ); 975 t2 = z2 * ( poly1[j2] + z2 * ( poly2[j2] + t2 ) ); 976 t0 = x0_or_one[n0] + ( y0_or_zero[n0] + x0_or_one[n0] * t0 ); 977 t1 = x1_or_one[n1] + ( y1_or_zero[n1] + x1_or_one[n1] * t1 ); 978 t2 = x2_or_one[n2] + ( y2_or_zero[n2] + x2_or_one[n2] * t2 ); 979 *py0 = t0; 980 *py1 = t1; 981 *py2 = t2; 982 break; 983 } 984 985 x += stridex; 986 y += stridey; 987 i = 0; 988 } while ( --n > 0 ); 989 990 if ( i > 0 ) 991 { 992 double fn0, fn1, a0, a1, w0, w1, y0, y1; 993 double t0, t1, z0, z1; 994 unsigned j0, j1; 995 int n0, n1; 996 997 if ( i > 1 ) 998 { 999 n1 = (int) ( x1 * invpio2 + half[xsb1] ); 1000 fn1 = (double) n1; 1001 n1 = (n1 + 1) & 3; /* Add 1 (before the mod) to make sin into cos */ 1002 a1 = x1 - fn1 * pio2_1; 1003 w1 = fn1 * pio2_2; 1004 x1 = a1 - w1; 1005 y1 = ( a1 - x1 ) - w1; 1006 a1 = x1; 1007 w1 = fn1 * pio2_3 - y1; 1008 x1 = a1 - w1; 1009 y1 = ( a1 - x1 ) - w1; 1010 a1 = x1; 1011 w1 = fn1 * pio2_3t - y1; 1012 x1 = a1 - w1; 1013 y1 = ( a1 - x1 ) - w1; 1014 xsb1 = HI(&x1); 1015 if ( ( xsb1 & ~0x80000000 ) < thresh[n1&1] ) 1016 { 1017 j1 = n1 & 1; 1018 x1_or_one[0] = x1; 1019 x1_or_one[2] = -x1; 1020 y1_or_zero[0] = y1; 1021 y1_or_zero[2] = -y1; 1022 z1 = x1 * x1; 1023 t1 = z1 * ( poly3[j1] + z1 * poly4[j1] ); 1024 t1 = z1 * ( poly1[j1] + z1 * ( poly2[j1] + t1 ) ); 1025 t1 = x1_or_one[n1] + ( y1_or_zero[n1] + x1_or_one[n1] * t1 ); 1026 *py1 = t1; 1027 } 1028 else 1029 { 1030 j1 = ( xsb1 + 0x4000 ) & 0xffff8000; 1031 HI(&t1) = j1; 1032 LO(&t1) = 0; 1033 x1 = ( x1 - t1 ) + y1; 1034 z1 = x1 * x1; 1035 t1 = z1 * ( qq1 + z1 * qq2 ); 1036 w1 = x1 * ( one + z1 * ( pp1 + z1 * pp2 ) ); 1037 j1 = ( ( ( j1 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 1038 xsb1 = ( xsb1 >> 30 ) & 2; 1039 n1 ^= ( xsb1 & ~( n1 << 1 ) ); 1040 xsb1 |= 1; 1041 a1 = __vlibm_TBL_sincos_hi[j1+n1]; 1042 t1 = ( __vlibm_TBL_sincos_hi[j1+((n1+xsb1)&3)] * w1 + a1 * t1 ) + __vlibm_TBL_sincos_lo[j1+n1]; 1043 *py1 = ( a1 + t1 ); 1044 } 1045 } 1046 n0 = (int) ( x0 * invpio2 + half[xsb0] ); 1047 fn0 = (double) n0; 1048 n0 = (n0 + 1) & 3; /* Add 1 (before the mod) to make sin into cos */ 1049 a0 = x0 - fn0 * pio2_1; 1050 w0 = fn0 * pio2_2; 1051 x0 = a0 - w0; 1052 y0 = ( a0 - x0 ) - w0; 1053 a0 = x0; 1054 w0 = fn0 * pio2_3 - y0; 1055 x0 = a0 - w0; 1056 y0 = ( a0 - x0 ) - w0; 1057 a0 = x0; 1058 w0 = fn0 * pio2_3t - y0; 1059 x0 = a0 - w0; 1060 y0 = ( a0 - x0 ) - w0; 1061 xsb0 = HI(&x0); 1062 if ( ( xsb0 & ~0x80000000 ) < thresh[n0&1] ) 1063 { 1064 j0 = n0 & 1; 1065 x0_or_one[0] = x0; 1066 x0_or_one[2] = -x0; 1067 y0_or_zero[0] = y0; 1068 y0_or_zero[2] = -y0; 1069 z0 = x0 * x0; 1070 t0 = z0 * ( poly3[j0] + z0 * poly4[j0] ); 1071 t0 = z0 * ( poly1[j0] + z0 * ( poly2[j0] + t0 ) ); 1072 t0 = x0_or_one[n0] + ( y0_or_zero[n0] + x0_or_one[n0] * t0 ); 1073 *py0 = t0; 1074 } 1075 else 1076 { 1077 j0 = ( xsb0 + 0x4000 ) & 0xffff8000; 1078 HI(&t0) = j0; 1079 LO(&t0) = 0; 1080 x0 = ( x0 - t0 ) + y0; 1081 z0 = x0 * x0; 1082 t0 = z0 * ( qq1 + z0 * qq2 ); 1083 w0 = x0 * ( one + z0 * ( pp1 + z0 * pp2 ) ); 1084 j0 = ( ( ( j0 & ~0x80000000 ) - 0x3fc40000 ) >> 13 ) & ~0x3; 1085 xsb0 = ( xsb0 >> 30 ) & 2; 1086 n0 ^= ( xsb0 & ~( n0 << 1 ) ); 1087 xsb0 |= 1; 1088 a0 = __vlibm_TBL_sincos_hi[j0+n0]; 1089 t0 = ( __vlibm_TBL_sincos_hi[j0+((n0+xsb0)&3)] * w0 + a0 * t0 ) + __vlibm_TBL_sincos_lo[j0+n0]; 1090 *py0 = ( a0 + t0 ); 1091 } 1092 } 1093 1094 if ( biguns ) 1095 __vlibm_vcos_big( nsave, xsave, sxsave, ysave, sysave, 0x413921fb ); 1096 }