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