1 /* $OpenBSD: softfloat-macros.h,v 1.1 2002/04/28 20:55:14 pvalchev Exp $ */ 2 /* $NetBSD: softfloat-macros.h,v 1.1 2001/04/26 03:10:47 ross Exp $ */ 3 4 /* 5 =============================================================================== 6 7 This C source fragment is part of the SoftFloat IEC/IEEE Floating-point 8 Arithmetic Package, Release 2a. 9 10 Written by John R. Hauser. This work was made possible in part by the 11 International Computer Science Institute, located at Suite 600, 1947 Center 12 Street, Berkeley, California 94704. Funding was partially provided by the 13 National Science Foundation under grant MIP-9311980. The original version 14 of this code was written as part of a project to build a fixed-point vector 15 processor in collaboration with the University of California at Berkeley, 16 overseen by Profs. Nelson Morgan and John Wawrzynek. More information 17 is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/ 18 arithmetic/SoftFloat.html'. 19 20 THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable 21 effort has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT 22 WILL AT TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS 23 RESTRICTED TO PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL 24 RESPONSIBILITY FOR ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM 25 THEIR OWN USE OF THE SOFTWARE, AND WHO ALSO EFFECTIVELY INDEMNIFY 26 (possibly via similar legal warning) JOHN HAUSER AND THE INTERNATIONAL 27 COMPUTER SCIENCE INSTITUTE AGAINST ALL LOSSES, COSTS, OR OTHER PROBLEMS 28 ARISING FROM THE USE OF THE SOFTWARE BY THEIR CUSTOMERS AND CLIENTS. 29 30 Derivative works are acceptable, even for commercial purposes, so long as 31 (1) they include prominent notice that the work is derivative, and (2) they 32 include prominent notice akin to these four paragraphs for those parts of 33 this code that are retained. 34 35 =============================================================================== 36 */ 37 38 #ifndef NO_IEEE 39 40 /* 41 ------------------------------------------------------------------------------- 42 Shifts `a' right by the number of bits given in `count'. If any nonzero 43 bits are shifted off, they are ``jammed'' into the least significant bit of 44 the result by setting the least significant bit to 1. The value of `count' 45 can be arbitrarily large; in particular, if `count' is greater than 32, the 46 result will be either 0 or 1, depending on whether `a' is zero or nonzero. 47 The result is stored in the location pointed to by `zPtr'. 48 ------------------------------------------------------------------------------- 49 */ 50 INLINE void shift32RightJamming( bits32 a, int16 count, bits32 *zPtr ) 51 { 52 bits32 z; 53 54 if ( count == 0 ) { 55 z = a; 56 } 57 else if ( count < 32 ) { 58 z = ( a>>count ) | ( ( a<<( ( - count ) & 31 ) ) != 0 ); 59 } 60 else { 61 z = ( a != 0 ); 62 } 63 *zPtr = z; 64 65 } 66 67 /* 68 ------------------------------------------------------------------------------- 69 Shifts `a' right by the number of bits given in `count'. If any nonzero 70 bits are shifted off, they are ``jammed'' into the least significant bit of 71 the result by setting the least significant bit to 1. The value of `count' 72 can be arbitrarily large; in particular, if `count' is greater than 64, the 73 result will be either 0 or 1, depending on whether `a' is zero or nonzero. 74 The result is stored in the location pointed to by `zPtr'. 75 ------------------------------------------------------------------------------- 76 */ 77 INLINE void shift64RightJamming( bits64 a, int16 count, bits64 *zPtr ) 78 { 79 bits64 z; 80 81 if ( count == 0 ) { 82 z = a; 83 } 84 else if ( count < 64 ) { 85 z = ( a>>count ) | ( ( a<<( ( - count ) & 63 ) ) != 0 ); 86 } 87 else { 88 z = ( a != 0 ); 89 } 90 *zPtr = z; 91 92 } 93 94 /* 95 ------------------------------------------------------------------------------- 96 Shifts the 128-bit value formed by concatenating `a0' and `a1' right by 64 97 _plus_ the number of bits given in `count'. The shifted result is at most 98 64 nonzero bits; this is stored at the location pointed to by `z0Ptr'. The 99 bits shifted off form a second 64-bit result as follows: The _last_ bit 100 shifted off is the most-significant bit of the extra result, and the other 101 63 bits of the extra result are all zero if and only if _all_but_the_last_ 102 bits shifted off were all zero. This extra result is stored in the location 103 pointed to by `z1Ptr'. The value of `count' can be arbitrarily large. 104 (This routine makes more sense if `a0' and `a1' are considered to form a 105 fixed-point value with binary point between `a0' and `a1'. This fixed-point 106 value is shifted right by the number of bits given in `count', and the 107 integer part of the result is returned at the location pointed to by 108 `z0Ptr'. The fractional part of the result may be slightly corrupted as 109 described above, and is returned at the location pointed to by `z1Ptr'.) 110 ------------------------------------------------------------------------------- 111 */ 112 INLINE void 113 shift64ExtraRightJamming( 114 bits64 a0, bits64 a1, int16 count, bits64 *z0Ptr, bits64 *z1Ptr ) 115 { 116 bits64 z0, z1; 117 int8 negCount = ( - count ) & 63; 118 119 if ( count == 0 ) { 120 z1 = a1; 121 z0 = a0; 122 } 123 else if ( count < 64 ) { 124 z1 = ( a0<<negCount ) | ( a1 != 0 ); 125 z0 = a0>>count; 126 } 127 else { 128 if ( count == 64 ) { 129 z1 = a0 | ( a1 != 0 ); 130 } 131 else { 132 z1 = ( ( a0 | a1 ) != 0 ); 133 } 134 z0 = 0; 135 } 136 *z1Ptr = z1; 137 *z0Ptr = z0; 138 139 } 140 141 /* 142 ------------------------------------------------------------------------------- 143 Shifts the 128-bit value formed by concatenating `a0' and `a1' right by the 144 number of bits given in `count'. Any bits shifted off are lost. The value 145 of `count' can be arbitrarily large; in particular, if `count' is greater 146 than 128, the result will be 0. The result is broken into two 64-bit pieces 147 which are stored at the locations pointed to by `z0Ptr' and `z1Ptr'. 148 ------------------------------------------------------------------------------- 149 */ 150 INLINE void 151 shift128Right( 152 bits64 a0, bits64 a1, int16 count, bits64 *z0Ptr, bits64 *z1Ptr ) 153 { 154 bits64 z0, z1; 155 int8 negCount = ( - count ) & 63; 156 157 if ( count == 0 ) { 158 z1 = a1; 159 z0 = a0; 160 } 161 else if ( count < 64 ) { 162 z1 = ( a0<<negCount ) | ( a1>>count ); 163 z0 = a0>>count; 164 } 165 else { 166 z1 = ( count < 64 ) ? ( a0>>( count & 63 ) ) : 0; 167 z0 = 0; 168 } 169 *z1Ptr = z1; 170 *z0Ptr = z0; 171 172 } 173 174 /* 175 ------------------------------------------------------------------------------- 176 Shifts the 128-bit value formed by concatenating `a0' and `a1' right by the 177 number of bits given in `count'. If any nonzero bits are shifted off, they 178 are ``jammed'' into the least significant bit of the result by setting the 179 least significant bit to 1. The value of `count' can be arbitrarily large; 180 in particular, if `count' is greater than 128, the result will be either 181 0 or 1, depending on whether the concatenation of `a0' and `a1' is zero or 182 nonzero. The result is broken into two 64-bit pieces which are stored at 183 the locations pointed to by `z0Ptr' and `z1Ptr'. 184 ------------------------------------------------------------------------------- 185 */ 186 INLINE void 187 shift128RightJamming( 188 bits64 a0, bits64 a1, int16 count, bits64 *z0Ptr, bits64 *z1Ptr ) 189 { 190 bits64 z0, z1; 191 int8 negCount = ( - count ) & 63; 192 193 if ( count == 0 ) { 194 z1 = a1; 195 z0 = a0; 196 } 197 else if ( count < 64 ) { 198 z1 = ( a0<<negCount ) | ( a1>>count ) | ( ( a1<<negCount ) != 0 ); 199 z0 = a0>>count; 200 } 201 else { 202 if ( count == 64 ) { 203 z1 = a0 | ( a1 != 0 ); 204 } 205 else if ( count < 128 ) { 206 z1 = ( a0>>( count & 63 ) ) | ( ( ( a0<<negCount ) | a1 ) != 0 ); 207 } 208 else { 209 z1 = ( ( a0 | a1 ) != 0 ); 210 } 211 z0 = 0; 212 } 213 *z1Ptr = z1; 214 *z0Ptr = z0; 215 216 } 217 218 /* 219 ------------------------------------------------------------------------------- 220 Shifts the 192-bit value formed by concatenating `a0', `a1', and `a2' right 221 by 64 _plus_ the number of bits given in `count'. The shifted result is 222 at most 128 nonzero bits; these are broken into two 64-bit pieces which are 223 stored at the locations pointed to by `z0Ptr' and `z1Ptr'. The bits shifted 224 off form a third 64-bit result as follows: The _last_ bit shifted off is 225 the most-significant bit of the extra result, and the other 63 bits of the 226 extra result are all zero if and only if _all_but_the_last_ bits shifted off 227 were all zero. This extra result is stored in the location pointed to by 228 `z2Ptr'. The value of `count' can be arbitrarily large. 229 (This routine makes more sense if `a0', `a1', and `a2' are considered 230 to form a fixed-point value with binary point between `a1' and `a2'. This 231 fixed-point value is shifted right by the number of bits given in `count', 232 and the integer part of the result is returned at the locations pointed to 233 by `z0Ptr' and `z1Ptr'. The fractional part of the result may be slightly 234 corrupted as described above, and is returned at the location pointed to by 235 `z2Ptr'.) 236 ------------------------------------------------------------------------------- 237 */ 238 INLINE void 239 shift128ExtraRightJamming( 240 bits64 a0, 241 bits64 a1, 242 bits64 a2, 243 int16 count, 244 bits64 *z0Ptr, 245 bits64 *z1Ptr, 246 bits64 *z2Ptr 247 ) 248 { 249 bits64 z0, z1, z2; 250 int8 negCount = ( - count ) & 63; 251 252 if ( count == 0 ) { 253 z2 = a2; 254 z1 = a1; 255 z0 = a0; 256 } 257 else { 258 if ( count < 64 ) { 259 z2 = a1<<negCount; 260 z1 = ( a0<<negCount ) | ( a1>>count ); 261 z0 = a0>>count; 262 } 263 else { 264 if ( count == 64 ) { 265 z2 = a1; 266 z1 = a0; 267 } 268 else { 269 a2 |= a1; 270 if ( count < 128 ) { 271 z2 = a0<<negCount; 272 z1 = a0>>( count & 63 ); 273 } 274 else { 275 z2 = ( count == 128 ) ? a0 : ( a0 != 0 ); 276 z1 = 0; 277 } 278 } 279 z0 = 0; 280 } 281 z2 |= ( a2 != 0 ); 282 } 283 *z2Ptr = z2; 284 *z1Ptr = z1; 285 *z0Ptr = z0; 286 287 } 288 289 /* 290 ------------------------------------------------------------------------------- 291 Shifts the 128-bit value formed by concatenating `a0' and `a1' left by the 292 number of bits given in `count'. Any bits shifted off are lost. The value 293 of `count' must be less than 64. The result is broken into two 64-bit 294 pieces which are stored at the locations pointed to by `z0Ptr' and `z1Ptr'. 295 ------------------------------------------------------------------------------- 296 */ 297 INLINE void 298 shortShift128Left( 299 bits64 a0, bits64 a1, int16 count, bits64 *z0Ptr, bits64 *z1Ptr ) 300 { 301 302 *z1Ptr = a1<<count; 303 *z0Ptr = 304 ( count == 0 ) ? a0 : ( a0<<count ) | ( a1>>( ( - count ) & 63 ) ); 305 306 } 307 308 /* 309 ------------------------------------------------------------------------------- 310 Shifts the 192-bit value formed by concatenating `a0', `a1', and `a2' left 311 by the number of bits given in `count'. Any bits shifted off are lost. 312 The value of `count' must be less than 64. The result is broken into three 313 64-bit pieces which are stored at the locations pointed to by `z0Ptr', 314 `z1Ptr', and `z2Ptr'. 315 ------------------------------------------------------------------------------- 316 */ 317 INLINE void 318 shortShift192Left( 319 bits64 a0, 320 bits64 a1, 321 bits64 a2, 322 int16 count, 323 bits64 *z0Ptr, 324 bits64 *z1Ptr, 325 bits64 *z2Ptr 326 ) 327 { 328 bits64 z0, z1, z2; 329 int8 negCount; 330 331 z2 = a2<<count; 332 z1 = a1<<count; 333 z0 = a0<<count; 334 if ( 0 < count ) { 335 negCount = ( ( - count ) & 63 ); 336 z1 |= a2>>negCount; 337 z0 |= a1>>negCount; 338 } 339 *z2Ptr = z2; 340 *z1Ptr = z1; 341 *z0Ptr = z0; 342 343 } 344 345 /* 346 ------------------------------------------------------------------------------- 347 Adds the 128-bit value formed by concatenating `a0' and `a1' to the 128-bit 348 value formed by concatenating `b0' and `b1'. Addition is modulo 2^128, so 349 any carry out is lost. The result is broken into two 64-bit pieces which 350 are stored at the locations pointed to by `z0Ptr' and `z1Ptr'. 351 ------------------------------------------------------------------------------- 352 */ 353 INLINE void 354 add128( 355 bits64 a0, bits64 a1, bits64 b0, bits64 b1, bits64 *z0Ptr, bits64 *z1Ptr ) 356 { 357 bits64 z1; 358 359 z1 = a1 + b1; 360 *z1Ptr = z1; 361 *z0Ptr = a0 + b0 + ( z1 < a1 ); 362 363 } 364 365 /* 366 ------------------------------------------------------------------------------- 367 Adds the 192-bit value formed by concatenating `a0', `a1', and `a2' to the 368 192-bit value formed by concatenating `b0', `b1', and `b2'. Addition is 369 modulo 2^192, so any carry out is lost. The result is broken into three 370 64-bit pieces which are stored at the locations pointed to by `z0Ptr', 371 `z1Ptr', and `z2Ptr'. 372 ------------------------------------------------------------------------------- 373 */ 374 INLINE void 375 add192( 376 bits64 a0, 377 bits64 a1, 378 bits64 a2, 379 bits64 b0, 380 bits64 b1, 381 bits64 b2, 382 bits64 *z0Ptr, 383 bits64 *z1Ptr, 384 bits64 *z2Ptr 385 ) 386 { 387 bits64 z0, z1, z2; 388 int8 carry0, carry1; 389 390 z2 = a2 + b2; 391 carry1 = ( z2 < a2 ); 392 z1 = a1 + b1; 393 carry0 = ( z1 < a1 ); 394 z0 = a0 + b0; 395 z1 += carry1; 396 z0 += ( z1 < carry1 ); 397 z0 += carry0; 398 *z2Ptr = z2; 399 *z1Ptr = z1; 400 *z0Ptr = z0; 401 402 } 403 404 /* 405 ------------------------------------------------------------------------------- 406 Subtracts the 128-bit value formed by concatenating `b0' and `b1' from the 407 128-bit value formed by concatenating `a0' and `a1'. Subtraction is modulo 408 2^128, so any borrow out (carry out) is lost. The result is broken into two 409 64-bit pieces which are stored at the locations pointed to by `z0Ptr' and 410 `z1Ptr'. 411 ------------------------------------------------------------------------------- 412 */ 413 INLINE void 414 sub128( 415 bits64 a0, bits64 a1, bits64 b0, bits64 b1, bits64 *z0Ptr, bits64 *z1Ptr ) 416 { 417 418 *z1Ptr = a1 - b1; 419 *z0Ptr = a0 - b0 - ( a1 < b1 ); 420 421 } 422 423 /* 424 ------------------------------------------------------------------------------- 425 Subtracts the 192-bit value formed by concatenating `b0', `b1', and `b2' 426 from the 192-bit value formed by concatenating `a0', `a1', and `a2'. 427 Subtraction is modulo 2^192, so any borrow out (carry out) is lost. The 428 result is broken into three 64-bit pieces which are stored at the locations 429 pointed to by `z0Ptr', `z1Ptr', and `z2Ptr'. 430 ------------------------------------------------------------------------------- 431 */ 432 INLINE void 433 sub192( 434 bits64 a0, 435 bits64 a1, 436 bits64 a2, 437 bits64 b0, 438 bits64 b1, 439 bits64 b2, 440 bits64 *z0Ptr, 441 bits64 *z1Ptr, 442 bits64 *z2Ptr 443 ) 444 { 445 bits64 z0, z1, z2; 446 int8 borrow0, borrow1; 447 448 z2 = a2 - b2; 449 borrow1 = ( a2 < b2 ); 450 z1 = a1 - b1; 451 borrow0 = ( a1 < b1 ); 452 z0 = a0 - b0; 453 z0 -= ( z1 < borrow1 ); 454 z1 -= borrow1; 455 z0 -= borrow0; 456 *z2Ptr = z2; 457 *z1Ptr = z1; 458 *z0Ptr = z0; 459 460 } 461 462 /* 463 ------------------------------------------------------------------------------- 464 Multiplies `a' by `b' to obtain a 128-bit product. The product is broken 465 into two 64-bit pieces which are stored at the locations pointed to by 466 `z0Ptr' and `z1Ptr'. 467 ------------------------------------------------------------------------------- 468 */ 469 INLINE void mul64To128( bits64 a, bits64 b, bits64 *z0Ptr, bits64 *z1Ptr ) 470 { 471 bits32 aHigh, aLow, bHigh, bLow; 472 bits64 z0, zMiddleA, zMiddleB, z1; 473 474 aLow = a; 475 aHigh = a>>32; 476 bLow = b; 477 bHigh = b>>32; 478 z1 = ( (bits64) aLow ) * bLow; 479 zMiddleA = ( (bits64) aLow ) * bHigh; 480 zMiddleB = ( (bits64) aHigh ) * bLow; 481 z0 = ( (bits64) aHigh ) * bHigh; 482 zMiddleA += zMiddleB; 483 z0 += ( ( (bits64) ( zMiddleA < zMiddleB ) )<<32 ) + ( zMiddleA>>32 ); 484 zMiddleA <<= 32; 485 z1 += zMiddleA; 486 z0 += ( z1 < zMiddleA ); 487 *z1Ptr = z1; 488 *z0Ptr = z0; 489 490 } 491 492 /* 493 ------------------------------------------------------------------------------- 494 Multiplies the 128-bit value formed by concatenating `a0' and `a1' by 495 `b' to obtain a 192-bit product. The product is broken into three 64-bit 496 pieces which are stored at the locations pointed to by `z0Ptr', `z1Ptr', and 497 `z2Ptr'. 498 ------------------------------------------------------------------------------- 499 */ 500 INLINE void 501 mul128By64To192( 502 bits64 a0, 503 bits64 a1, 504 bits64 b, 505 bits64 *z0Ptr, 506 bits64 *z1Ptr, 507 bits64 *z2Ptr 508 ) 509 { 510 bits64 z0, z1, z2, more1; 511 512 mul64To128( a1, b, &z1, &z2 ); 513 mul64To128( a0, b, &z0, &more1 ); 514 add128( z0, more1, 0, z1, &z0, &z1 ); 515 *z2Ptr = z2; 516 *z1Ptr = z1; 517 *z0Ptr = z0; 518 519 } 520 521 /* 522 ------------------------------------------------------------------------------- 523 Multiplies the 128-bit value formed by concatenating `a0' and `a1' to the 524 128-bit value formed by concatenating `b0' and `b1' to obtain a 256-bit 525 product. The product is broken into four 64-bit pieces which are stored at 526 the locations pointed to by `z0Ptr', `z1Ptr', `z2Ptr', and `z3Ptr'. 527 ------------------------------------------------------------------------------- 528 */ 529 INLINE void 530 mul128To256( 531 bits64 a0, 532 bits64 a1, 533 bits64 b0, 534 bits64 b1, 535 bits64 *z0Ptr, 536 bits64 *z1Ptr, 537 bits64 *z2Ptr, 538 bits64 *z3Ptr 539 ) 540 { 541 bits64 z0, z1, z2, z3; 542 bits64 more1, more2; 543 544 mul64To128( a1, b1, &z2, &z3 ); 545 mul64To128( a1, b0, &z1, &more2 ); 546 add128( z1, more2, 0, z2, &z1, &z2 ); 547 mul64To128( a0, b0, &z0, &more1 ); 548 add128( z0, more1, 0, z1, &z0, &z1 ); 549 mul64To128( a0, b1, &more1, &more2 ); 550 add128( more1, more2, 0, z2, &more1, &z2 ); 551 add128( z0, z1, 0, more1, &z0, &z1 ); 552 *z3Ptr = z3; 553 *z2Ptr = z2; 554 *z1Ptr = z1; 555 *z0Ptr = z0; 556 557 } 558 559 /* 560 ------------------------------------------------------------------------------- 561 Returns an approximation to the 64-bit integer quotient obtained by dividing 562 `b' into the 128-bit value formed by concatenating `a0' and `a1'. The 563 divisor `b' must be at least 2^63. If q is the exact quotient truncated 564 toward zero, the approximation returned lies between q and q + 2 inclusive. 565 If the exact quotient q is larger than 64 bits, the maximum positive 64-bit 566 unsigned integer is returned. 567 ------------------------------------------------------------------------------- 568 */ 569 static bits64 estimateDiv128To64( bits64 a0, bits64 a1, bits64 b ) 570 { 571 bits64 b0, b1; 572 bits64 rem0, rem1, term0, term1; 573 bits64 z; 574 575 if ( b <= a0 ) return LIT64( 0xFFFFFFFFFFFFFFFF ); 576 b0 = b>>32; 577 z = ( b0<<32 <= a0 ) ? LIT64( 0xFFFFFFFF00000000 ) : ( a0 / b0 )<<32; 578 mul64To128( b, z, &term0, &term1 ); 579 sub128( a0, a1, term0, term1, &rem0, &rem1 ); 580 while ( ( (sbits64) rem0 ) < 0 ) { 581 z -= LIT64( 0x100000000 ); 582 b1 = b<<32; 583 add128( rem0, rem1, b0, b1, &rem0, &rem1 ); 584 } 585 rem0 = ( rem0<<32 ) | ( rem1>>32 ); 586 z |= ( b0<<32 <= rem0 ) ? 0xFFFFFFFF : rem0 / b0; 587 return z; 588 589 } 590 591 #ifndef SOFTFLOAT_FOR_GCC /* Not used */ 592 /* 593 ------------------------------------------------------------------------------- 594 Returns an approximation to the square root of the 32-bit significand given 595 by `a'. Considered as an integer, `a' must be at least 2^31. If bit 0 of 596 `aExp' (the least significant bit) is 1, the integer returned approximates 597 2^31*sqrt(`a'/2^31), where `a' is considered an integer. If bit 0 of `aExp' 598 is 0, the integer returned approximates 2^31*sqrt(`a'/2^30). In either 599 case, the approximation returned lies strictly within +/-2 of the exact 600 value. 601 ------------------------------------------------------------------------------- 602 */ 603 static bits32 estimateSqrt32( int16 aExp, bits32 a ) 604 { 605 static const bits16 sqrtOddAdjustments[] = { 606 0x0004, 0x0022, 0x005D, 0x00B1, 0x011D, 0x019F, 0x0236, 0x02E0, 607 0x039C, 0x0468, 0x0545, 0x0631, 0x072B, 0x0832, 0x0946, 0x0A67 608 }; 609 static const bits16 sqrtEvenAdjustments[] = { 610 0x0A2D, 0x08AF, 0x075A, 0x0629, 0x051A, 0x0429, 0x0356, 0x029E, 611 0x0200, 0x0179, 0x0109, 0x00AF, 0x0068, 0x0034, 0x0012, 0x0002 612 }; 613 int8 index; 614 bits32 z; 615 616 index = ( a>>27 ) & 15; 617 if ( aExp & 1 ) { 618 z = 0x4000 + ( a>>17 ) - sqrtOddAdjustments[ index ]; 619 z = ( ( a / z )<<14 ) + ( z<<15 ); 620 a >>= 1; 621 } 622 else { 623 z = 0x8000 + ( a>>17 ) - sqrtEvenAdjustments[ index ]; 624 z = a / z + z; 625 z = ( 0x20000 <= z ) ? 0xFFFF8000 : ( z<<15 ); 626 if ( z <= a ) return (bits32) ( ( (sbits32) a )>>1 ); 627 } 628 return ( (bits32) ( ( ( (bits64) a )<<31 ) / z ) ) + ( z>>1 ); 629 630 } 631 #endif 632 633 /* 634 ------------------------------------------------------------------------------- 635 Returns the number of leading 0 bits before the most-significant 1 bit of 636 `a'. If `a' is zero, 32 is returned. 637 ------------------------------------------------------------------------------- 638 */ 639 static int8 countLeadingZeros32( bits32 a ) 640 { 641 static const int8 countLeadingZerosHigh[] = { 642 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 643 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 644 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 645 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 646 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 647 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 648 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 649 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 650 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 651 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 652 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 653 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 654 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 655 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 656 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 657 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 658 }; 659 int8 shiftCount; 660 661 shiftCount = 0; 662 if ( a < 0x10000 ) { 663 shiftCount += 16; 664 a <<= 16; 665 } 666 if ( a < 0x1000000 ) { 667 shiftCount += 8; 668 a <<= 8; 669 } 670 shiftCount += countLeadingZerosHigh[ a>>24 ]; 671 return shiftCount; 672 673 } 674 675 /* 676 ------------------------------------------------------------------------------- 677 Returns the number of leading 0 bits before the most-significant 1 bit of 678 `a'. If `a' is zero, 64 is returned. 679 ------------------------------------------------------------------------------- 680 */ 681 static int8 countLeadingZeros64( bits64 a ) 682 { 683 int8 shiftCount; 684 685 shiftCount = 0; 686 if ( a < ( (bits64) 1 )<<32 ) { 687 shiftCount += 32; 688 } 689 else { 690 a >>= 32; 691 } 692 shiftCount += countLeadingZeros32( a ); 693 return shiftCount; 694 695 } 696 697 /* 698 ------------------------------------------------------------------------------- 699 Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' 700 is equal to the 128-bit value formed by concatenating `b0' and `b1'. 701 Otherwise, returns 0. 702 ------------------------------------------------------------------------------- 703 */ 704 INLINE flag eq128( bits64 a0, bits64 a1, bits64 b0, bits64 b1 ) 705 { 706 707 return ( a0 == b0 ) && ( a1 == b1 ); 708 709 } 710 711 /* 712 ------------------------------------------------------------------------------- 713 Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' is less 714 than or equal to the 128-bit value formed by concatenating `b0' and `b1'. 715 Otherwise, returns 0. 716 ------------------------------------------------------------------------------- 717 */ 718 INLINE flag le128( bits64 a0, bits64 a1, bits64 b0, bits64 b1 ) 719 { 720 721 return ( a0 < b0 ) || ( ( a0 == b0 ) && ( a1 <= b1 ) ); 722 723 } 724 725 /* 726 ------------------------------------------------------------------------------- 727 Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' is less 728 than the 128-bit value formed by concatenating `b0' and `b1'. Otherwise, 729 returns 0. 730 ------------------------------------------------------------------------------- 731 */ 732 INLINE flag lt128( bits64 a0, bits64 a1, bits64 b0, bits64 b1 ) 733 { 734 735 return ( a0 < b0 ) || ( ( a0 == b0 ) && ( a1 < b1 ) ); 736 737 } 738 739 /* 740 ------------------------------------------------------------------------------- 741 Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' is 742 not equal to the 128-bit value formed by concatenating `b0' and `b1'. 743 Otherwise, returns 0. 744 ------------------------------------------------------------------------------- 745 */ 746 INLINE flag ne128( bits64 a0, bits64 a1, bits64 b0, bits64 b1 ) 747 { 748 749 return ( a0 != b0 ) || ( a1 != b1 ); 750 751 } 752 753 #endif /* !NO_IEEE */