softfloat-macros.h (28306B)
1/* 2 * QEMU float support macros 3 * 4 * The code in this source file is derived from release 2a of the SoftFloat 5 * IEC/IEEE Floating-point Arithmetic Package. Those parts of the code (and 6 * some later contributions) are provided under that license, as detailed below. 7 * It has subsequently been modified by contributors to the QEMU Project, 8 * so some portions are provided under: 9 * the SoftFloat-2a license 10 * the BSD license 11 * GPL-v2-or-later 12 * 13 * Any future contributions to this file after December 1st 2014 will be 14 * taken to be licensed under the Softfloat-2a license unless specifically 15 * indicated otherwise. 16 */ 17 18/* 19=============================================================================== 20This C source fragment is part of the SoftFloat IEC/IEEE Floating-point 21Arithmetic Package, Release 2a. 22 23Written by John R. Hauser. This work was made possible in part by the 24International Computer Science Institute, located at Suite 600, 1947 Center 25Street, Berkeley, California 94704. Funding was partially provided by the 26National Science Foundation under grant MIP-9311980. The original version 27of this code was written as part of a project to build a fixed-point vector 28processor in collaboration with the University of California at Berkeley, 29overseen by Profs. Nelson Morgan and John Wawrzynek. More information 30is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/ 31arithmetic/SoftFloat.html'. 32 33THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort 34has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT 35TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO 36PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY 37AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE. 38 39Derivative works are acceptable, even for commercial purposes, so long as 40(1) they include prominent notice that the work is derivative, and (2) they 41include prominent notice akin to these four paragraphs for those parts of 42this code that are retained. 43 44=============================================================================== 45*/ 46 47/* BSD licensing: 48 * Copyright (c) 2006, Fabrice Bellard 49 * All rights reserved. 50 * 51 * Redistribution and use in source and binary forms, with or without 52 * modification, are permitted provided that the following conditions are met: 53 * 54 * 1. Redistributions of source code must retain the above copyright notice, 55 * this list of conditions and the following disclaimer. 56 * 57 * 2. Redistributions in binary form must reproduce the above copyright notice, 58 * this list of conditions and the following disclaimer in the documentation 59 * and/or other materials provided with the distribution. 60 * 61 * 3. Neither the name of the copyright holder nor the names of its contributors 62 * may be used to endorse or promote products derived from this software without 63 * specific prior written permission. 64 * 65 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 66 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 67 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 68 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 69 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 70 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 71 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 72 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 73 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 74 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 75 * THE POSSIBILITY OF SUCH DAMAGE. 76 */ 77 78/* Portions of this work are licensed under the terms of the GNU GPL, 79 * version 2 or later. See the COPYING file in the top-level directory. 80 */ 81 82#ifndef FPU_SOFTFLOAT_MACROS_H 83#define FPU_SOFTFLOAT_MACROS_H 84 85#include "fpu/softfloat-types.h" 86#include "qemu/host-utils.h" 87 88/** 89 * shl_double: double-word merging left shift 90 * @l: left or most-significant word 91 * @r: right or least-significant word 92 * @c: shift count 93 * 94 * Shift @l left by @c bits, shifting in bits from @r. 95 */ 96static inline uint64_t shl_double(uint64_t l, uint64_t r, int c) 97{ 98#if defined(__x86_64__) 99 asm("shld %b2, %1, %0" : "+r"(l) : "r"(r), "ci"(c)); 100 return l; 101#else 102 return c ? (l << c) | (r >> (64 - c)) : l; 103#endif 104} 105 106/** 107 * shr_double: double-word merging right shift 108 * @l: left or most-significant word 109 * @r: right or least-significant word 110 * @c: shift count 111 * 112 * Shift @r right by @c bits, shifting in bits from @l. 113 */ 114static inline uint64_t shr_double(uint64_t l, uint64_t r, int c) 115{ 116#if defined(__x86_64__) 117 asm("shrd %b2, %1, %0" : "+r"(r) : "r"(l), "ci"(c)); 118 return r; 119#else 120 return c ? (r >> c) | (l << (64 - c)) : r; 121#endif 122} 123 124/*---------------------------------------------------------------------------- 125| Shifts `a' right by the number of bits given in `count'. If any nonzero 126| bits are shifted off, they are ``jammed'' into the least significant bit of 127| the result by setting the least significant bit to 1. The value of `count' 128| can be arbitrarily large; in particular, if `count' is greater than 32, the 129| result will be either 0 or 1, depending on whether `a' is zero or nonzero. 130| The result is stored in the location pointed to by `zPtr'. 131*----------------------------------------------------------------------------*/ 132 133static inline void shift32RightJamming(uint32_t a, int count, uint32_t *zPtr) 134{ 135 uint32_t z; 136 137 if ( count == 0 ) { 138 z = a; 139 } 140 else if ( count < 32 ) { 141 z = ( a>>count ) | ( ( a<<( ( - count ) & 31 ) ) != 0 ); 142 } 143 else { 144 z = ( a != 0 ); 145 } 146 *zPtr = z; 147 148} 149 150/*---------------------------------------------------------------------------- 151| Shifts `a' right by the number of bits given in `count'. If any nonzero 152| bits are shifted off, they are ``jammed'' into the least significant bit of 153| the result by setting the least significant bit to 1. The value of `count' 154| can be arbitrarily large; in particular, if `count' is greater than 64, the 155| result will be either 0 or 1, depending on whether `a' is zero or nonzero. 156| The result is stored in the location pointed to by `zPtr'. 157*----------------------------------------------------------------------------*/ 158 159static inline void shift64RightJamming(uint64_t a, int count, uint64_t *zPtr) 160{ 161 uint64_t z; 162 163 if ( count == 0 ) { 164 z = a; 165 } 166 else if ( count < 64 ) { 167 z = ( a>>count ) | ( ( a<<( ( - count ) & 63 ) ) != 0 ); 168 } 169 else { 170 z = ( a != 0 ); 171 } 172 *zPtr = z; 173 174} 175 176/*---------------------------------------------------------------------------- 177| Shifts the 128-bit value formed by concatenating `a0' and `a1' right by 64 178| _plus_ the number of bits given in `count'. The shifted result is at most 179| 64 nonzero bits; this is stored at the location pointed to by `z0Ptr'. The 180| bits shifted off form a second 64-bit result as follows: The _last_ bit 181| shifted off is the most-significant bit of the extra result, and the other 182| 63 bits of the extra result are all zero if and only if _all_but_the_last_ 183| bits shifted off were all zero. This extra result is stored in the location 184| pointed to by `z1Ptr'. The value of `count' can be arbitrarily large. 185| (This routine makes more sense if `a0' and `a1' are considered to form a 186| fixed-point value with binary point between `a0' and `a1'. This fixed-point 187| value is shifted right by the number of bits given in `count', and the 188| integer part of the result is returned at the location pointed to by 189| `z0Ptr'. The fractional part of the result may be slightly corrupted as 190| described above, and is returned at the location pointed to by `z1Ptr'.) 191*----------------------------------------------------------------------------*/ 192 193static inline void 194 shift64ExtraRightJamming( 195 uint64_t a0, uint64_t a1, int count, uint64_t *z0Ptr, uint64_t *z1Ptr) 196{ 197 uint64_t z0, z1; 198 int8_t negCount = ( - count ) & 63; 199 200 if ( count == 0 ) { 201 z1 = a1; 202 z0 = a0; 203 } 204 else if ( count < 64 ) { 205 z1 = ( a0<<negCount ) | ( a1 != 0 ); 206 z0 = a0>>count; 207 } 208 else { 209 if ( count == 64 ) { 210 z1 = a0 | ( a1 != 0 ); 211 } 212 else { 213 z1 = ( ( a0 | a1 ) != 0 ); 214 } 215 z0 = 0; 216 } 217 *z1Ptr = z1; 218 *z0Ptr = z0; 219 220} 221 222/*---------------------------------------------------------------------------- 223| Shifts the 128-bit value formed by concatenating `a0' and `a1' right by the 224| number of bits given in `count'. Any bits shifted off are lost. The value 225| of `count' can be arbitrarily large; in particular, if `count' is greater 226| than 128, the result will be 0. The result is broken into two 64-bit pieces 227| which are stored at the locations pointed to by `z0Ptr' and `z1Ptr'. 228*----------------------------------------------------------------------------*/ 229 230static inline void 231 shift128Right( 232 uint64_t a0, uint64_t a1, int count, uint64_t *z0Ptr, uint64_t *z1Ptr) 233{ 234 uint64_t z0, z1; 235 int8_t negCount = ( - count ) & 63; 236 237 if ( count == 0 ) { 238 z1 = a1; 239 z0 = a0; 240 } 241 else if ( count < 64 ) { 242 z1 = ( a0<<negCount ) | ( a1>>count ); 243 z0 = a0>>count; 244 } 245 else { 246 z1 = (count < 128) ? (a0 >> (count & 63)) : 0; 247 z0 = 0; 248 } 249 *z1Ptr = z1; 250 *z0Ptr = z0; 251 252} 253 254/*---------------------------------------------------------------------------- 255| Shifts the 128-bit value formed by concatenating `a0' and `a1' right by the 256| number of bits given in `count'. If any nonzero bits are shifted off, they 257| are ``jammed'' into the least significant bit of the result by setting the 258| least significant bit to 1. The value of `count' can be arbitrarily large; 259| in particular, if `count' is greater than 128, the result will be either 260| 0 or 1, depending on whether the concatenation of `a0' and `a1' is zero or 261| nonzero. The result is broken into two 64-bit pieces which are stored at 262| the locations pointed to by `z0Ptr' and `z1Ptr'. 263*----------------------------------------------------------------------------*/ 264 265static inline void 266 shift128RightJamming( 267 uint64_t a0, uint64_t a1, int count, uint64_t *z0Ptr, uint64_t *z1Ptr) 268{ 269 uint64_t z0, z1; 270 int8_t negCount = ( - count ) & 63; 271 272 if ( count == 0 ) { 273 z1 = a1; 274 z0 = a0; 275 } 276 else if ( count < 64 ) { 277 z1 = ( a0<<negCount ) | ( a1>>count ) | ( ( a1<<negCount ) != 0 ); 278 z0 = a0>>count; 279 } 280 else { 281 if ( count == 64 ) { 282 z1 = a0 | ( a1 != 0 ); 283 } 284 else if ( count < 128 ) { 285 z1 = ( a0>>( count & 63 ) ) | ( ( ( a0<<negCount ) | a1 ) != 0 ); 286 } 287 else { 288 z1 = ( ( a0 | a1 ) != 0 ); 289 } 290 z0 = 0; 291 } 292 *z1Ptr = z1; 293 *z0Ptr = z0; 294 295} 296 297/*---------------------------------------------------------------------------- 298| Shifts the 192-bit value formed by concatenating `a0', `a1', and `a2' right 299| by 64 _plus_ the number of bits given in `count'. The shifted result is 300| at most 128 nonzero bits; these are broken into two 64-bit pieces which are 301| stored at the locations pointed to by `z0Ptr' and `z1Ptr'. The bits shifted 302| off form a third 64-bit result as follows: The _last_ bit shifted off is 303| the most-significant bit of the extra result, and the other 63 bits of the 304| extra result are all zero if and only if _all_but_the_last_ bits shifted off 305| were all zero. This extra result is stored in the location pointed to by 306| `z2Ptr'. The value of `count' can be arbitrarily large. 307| (This routine makes more sense if `a0', `a1', and `a2' are considered 308| to form a fixed-point value with binary point between `a1' and `a2'. This 309| fixed-point value is shifted right by the number of bits given in `count', 310| and the integer part of the result is returned at the locations pointed to 311| by `z0Ptr' and `z1Ptr'. The fractional part of the result may be slightly 312| corrupted as described above, and is returned at the location pointed to by 313| `z2Ptr'.) 314*----------------------------------------------------------------------------*/ 315 316static inline void 317 shift128ExtraRightJamming( 318 uint64_t a0, 319 uint64_t a1, 320 uint64_t a2, 321 int count, 322 uint64_t *z0Ptr, 323 uint64_t *z1Ptr, 324 uint64_t *z2Ptr 325 ) 326{ 327 uint64_t z0, z1, z2; 328 int8_t negCount = ( - count ) & 63; 329 330 if ( count == 0 ) { 331 z2 = a2; 332 z1 = a1; 333 z0 = a0; 334 } 335 else { 336 if ( count < 64 ) { 337 z2 = a1<<negCount; 338 z1 = ( a0<<negCount ) | ( a1>>count ); 339 z0 = a0>>count; 340 } 341 else { 342 if ( count == 64 ) { 343 z2 = a1; 344 z1 = a0; 345 } 346 else { 347 a2 |= a1; 348 if ( count < 128 ) { 349 z2 = a0<<negCount; 350 z1 = a0>>( count & 63 ); 351 } 352 else { 353 z2 = ( count == 128 ) ? a0 : ( a0 != 0 ); 354 z1 = 0; 355 } 356 } 357 z0 = 0; 358 } 359 z2 |= ( a2 != 0 ); 360 } 361 *z2Ptr = z2; 362 *z1Ptr = z1; 363 *z0Ptr = z0; 364 365} 366 367/*---------------------------------------------------------------------------- 368| Shifts the 128-bit value formed by concatenating `a0' and `a1' left by the 369| number of bits given in `count'. Any bits shifted off are lost. The value 370| of `count' must be less than 64. The result is broken into two 64-bit 371| pieces which are stored at the locations pointed to by `z0Ptr' and `z1Ptr'. 372*----------------------------------------------------------------------------*/ 373 374static inline void shortShift128Left(uint64_t a0, uint64_t a1, int count, 375 uint64_t *z0Ptr, uint64_t *z1Ptr) 376{ 377 *z1Ptr = a1 << count; 378 *z0Ptr = count == 0 ? a0 : (a0 << count) | (a1 >> (-count & 63)); 379} 380 381/*---------------------------------------------------------------------------- 382| Shifts the 128-bit value formed by concatenating `a0' and `a1' left by the 383| number of bits given in `count'. Any bits shifted off are lost. The value 384| of `count' may be greater than 64. The result is broken into two 64-bit 385| pieces which are stored at the locations pointed to by `z0Ptr' and `z1Ptr'. 386*----------------------------------------------------------------------------*/ 387 388static inline void shift128Left(uint64_t a0, uint64_t a1, int count, 389 uint64_t *z0Ptr, uint64_t *z1Ptr) 390{ 391 if (count < 64) { 392 *z1Ptr = a1 << count; 393 *z0Ptr = count == 0 ? a0 : (a0 << count) | (a1 >> (-count & 63)); 394 } else { 395 *z1Ptr = 0; 396 *z0Ptr = a1 << (count - 64); 397 } 398} 399 400/*---------------------------------------------------------------------------- 401| Shifts the 192-bit value formed by concatenating `a0', `a1', and `a2' left 402| by the number of bits given in `count'. Any bits shifted off are lost. 403| The value of `count' must be less than 64. The result is broken into three 404| 64-bit pieces which are stored at the locations pointed to by `z0Ptr', 405| `z1Ptr', and `z2Ptr'. 406*----------------------------------------------------------------------------*/ 407 408static inline void 409 shortShift192Left( 410 uint64_t a0, 411 uint64_t a1, 412 uint64_t a2, 413 int count, 414 uint64_t *z0Ptr, 415 uint64_t *z1Ptr, 416 uint64_t *z2Ptr 417 ) 418{ 419 uint64_t z0, z1, z2; 420 int8_t negCount; 421 422 z2 = a2<<count; 423 z1 = a1<<count; 424 z0 = a0<<count; 425 if ( 0 < count ) { 426 negCount = ( ( - count ) & 63 ); 427 z1 |= a2>>negCount; 428 z0 |= a1>>negCount; 429 } 430 *z2Ptr = z2; 431 *z1Ptr = z1; 432 *z0Ptr = z0; 433 434} 435 436/*---------------------------------------------------------------------------- 437| Adds the 128-bit value formed by concatenating `a0' and `a1' to the 128-bit 438| value formed by concatenating `b0' and `b1'. Addition is modulo 2^128, so 439| any carry out is lost. The result is broken into two 64-bit pieces which 440| are stored at the locations pointed to by `z0Ptr' and `z1Ptr'. 441*----------------------------------------------------------------------------*/ 442 443static inline void add128(uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1, 444 uint64_t *z0Ptr, uint64_t *z1Ptr) 445{ 446 bool c = 0; 447 *z1Ptr = uadd64_carry(a1, b1, &c); 448 *z0Ptr = uadd64_carry(a0, b0, &c); 449} 450 451/*---------------------------------------------------------------------------- 452| Adds the 192-bit value formed by concatenating `a0', `a1', and `a2' to the 453| 192-bit value formed by concatenating `b0', `b1', and `b2'. Addition is 454| modulo 2^192, so any carry out is lost. The result is broken into three 455| 64-bit pieces which are stored at the locations pointed to by `z0Ptr', 456| `z1Ptr', and `z2Ptr'. 457*----------------------------------------------------------------------------*/ 458 459static inline void add192(uint64_t a0, uint64_t a1, uint64_t a2, 460 uint64_t b0, uint64_t b1, uint64_t b2, 461 uint64_t *z0Ptr, uint64_t *z1Ptr, uint64_t *z2Ptr) 462{ 463 bool c = 0; 464 *z2Ptr = uadd64_carry(a2, b2, &c); 465 *z1Ptr = uadd64_carry(a1, b1, &c); 466 *z0Ptr = uadd64_carry(a0, b0, &c); 467} 468 469/*---------------------------------------------------------------------------- 470| Subtracts the 128-bit value formed by concatenating `b0' and `b1' from the 471| 128-bit value formed by concatenating `a0' and `a1'. Subtraction is modulo 472| 2^128, so any borrow out (carry out) is lost. The result is broken into two 473| 64-bit pieces which are stored at the locations pointed to by `z0Ptr' and 474| `z1Ptr'. 475*----------------------------------------------------------------------------*/ 476 477static inline void sub128(uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1, 478 uint64_t *z0Ptr, uint64_t *z1Ptr) 479{ 480 bool c = 0; 481 *z1Ptr = usub64_borrow(a1, b1, &c); 482 *z0Ptr = usub64_borrow(a0, b0, &c); 483} 484 485/*---------------------------------------------------------------------------- 486| Subtracts the 192-bit value formed by concatenating `b0', `b1', and `b2' 487| from the 192-bit value formed by concatenating `a0', `a1', and `a2'. 488| Subtraction is modulo 2^192, so any borrow out (carry out) is lost. The 489| result is broken into three 64-bit pieces which are stored at the locations 490| pointed to by `z0Ptr', `z1Ptr', and `z2Ptr'. 491*----------------------------------------------------------------------------*/ 492 493static inline void sub192(uint64_t a0, uint64_t a1, uint64_t a2, 494 uint64_t b0, uint64_t b1, uint64_t b2, 495 uint64_t *z0Ptr, uint64_t *z1Ptr, uint64_t *z2Ptr) 496{ 497 bool c = 0; 498 *z2Ptr = usub64_borrow(a2, b2, &c); 499 *z1Ptr = usub64_borrow(a1, b1, &c); 500 *z0Ptr = usub64_borrow(a0, b0, &c); 501} 502 503/*---------------------------------------------------------------------------- 504| Multiplies `a' by `b' to obtain a 128-bit product. The product is broken 505| into two 64-bit pieces which are stored at the locations pointed to by 506| `z0Ptr' and `z1Ptr'. 507*----------------------------------------------------------------------------*/ 508 509static inline void 510mul64To128(uint64_t a, uint64_t b, uint64_t *z0Ptr, uint64_t *z1Ptr) 511{ 512 mulu64(z1Ptr, z0Ptr, a, b); 513} 514 515/*---------------------------------------------------------------------------- 516| Multiplies the 128-bit value formed by concatenating `a0' and `a1' by 517| `b' to obtain a 192-bit product. The product is broken into three 64-bit 518| pieces which are stored at the locations pointed to by `z0Ptr', `z1Ptr', and 519| `z2Ptr'. 520*----------------------------------------------------------------------------*/ 521 522static inline void 523mul128By64To192(uint64_t a0, uint64_t a1, uint64_t b, 524 uint64_t *z0Ptr, uint64_t *z1Ptr, uint64_t *z2Ptr) 525{ 526 uint64_t z0, z1, m1; 527 528 mul64To128(a1, b, &m1, z2Ptr); 529 mul64To128(a0, b, &z0, &z1); 530 add128(z0, z1, 0, m1, z0Ptr, z1Ptr); 531} 532 533/*---------------------------------------------------------------------------- 534| Multiplies the 128-bit value formed by concatenating `a0' and `a1' to the 535| 128-bit value formed by concatenating `b0' and `b1' to obtain a 256-bit 536| product. The product is broken into four 64-bit pieces which are stored at 537| the locations pointed to by `z0Ptr', `z1Ptr', `z2Ptr', and `z3Ptr'. 538*----------------------------------------------------------------------------*/ 539 540static inline void mul128To256(uint64_t a0, uint64_t a1, 541 uint64_t b0, uint64_t b1, 542 uint64_t *z0Ptr, uint64_t *z1Ptr, 543 uint64_t *z2Ptr, uint64_t *z3Ptr) 544{ 545 uint64_t z0, z1, z2; 546 uint64_t m0, m1, m2, n1, n2; 547 548 mul64To128(a1, b0, &m1, &m2); 549 mul64To128(a0, b1, &n1, &n2); 550 mul64To128(a1, b1, &z2, z3Ptr); 551 mul64To128(a0, b0, &z0, &z1); 552 553 add192( 0, m1, m2, 0, n1, n2, &m0, &m1, &m2); 554 add192(m0, m1, m2, z0, z1, z2, z0Ptr, z1Ptr, z2Ptr); 555} 556 557/*---------------------------------------------------------------------------- 558| Returns an approximation to the 64-bit integer quotient obtained by dividing 559| `b' into the 128-bit value formed by concatenating `a0' and `a1'. The 560| divisor `b' must be at least 2^63. If q is the exact quotient truncated 561| toward zero, the approximation returned lies between q and q + 2 inclusive. 562| If the exact quotient q is larger than 64 bits, the maximum positive 64-bit 563| unsigned integer is returned. 564*----------------------------------------------------------------------------*/ 565 566static inline uint64_t estimateDiv128To64(uint64_t a0, uint64_t a1, uint64_t b) 567{ 568 uint64_t b0, b1; 569 uint64_t rem0, rem1, term0, term1; 570 uint64_t z; 571 572 if ( b <= a0 ) return UINT64_C(0xFFFFFFFFFFFFFFFF); 573 b0 = b>>32; 574 z = ( b0<<32 <= a0 ) ? UINT64_C(0xFFFFFFFF00000000) : ( a0 / b0 )<<32; 575 mul64To128( b, z, &term0, &term1 ); 576 sub128( a0, a1, term0, term1, &rem0, &rem1 ); 577 while ( ( (int64_t) rem0 ) < 0 ) { 578 z -= UINT64_C(0x100000000); 579 b1 = b<<32; 580 add128( rem0, rem1, b0, b1, &rem0, &rem1 ); 581 } 582 rem0 = ( rem0<<32 ) | ( rem1>>32 ); 583 z |= ( b0<<32 <= rem0 ) ? 0xFFFFFFFF : rem0 / b0; 584 return z; 585 586} 587 588/* From the GNU Multi Precision Library - longlong.h __udiv_qrnnd 589 * (https://gmplib.org/repo/gmp/file/tip/longlong.h) 590 * 591 * Licensed under the GPLv2/LGPLv3 592 */ 593static inline uint64_t udiv_qrnnd(uint64_t *r, uint64_t n1, 594 uint64_t n0, uint64_t d) 595{ 596#if defined(__x86_64__) 597 uint64_t q; 598 asm("divq %4" : "=a"(q), "=d"(*r) : "0"(n0), "1"(n1), "rm"(d)); 599 return q; 600#elif defined(__s390x__) && !defined(__clang__) 601 /* Need to use a TImode type to get an even register pair for DLGR. */ 602 unsigned __int128 n = (unsigned __int128)n1 << 64 | n0; 603 asm("dlgr %0, %1" : "+r"(n) : "r"(d)); 604 *r = n >> 64; 605 return n; 606#elif defined(_ARCH_PPC64) && defined(_ARCH_PWR7) 607 /* From Power ISA 2.06, programming note for divdeu. */ 608 uint64_t q1, q2, Q, r1, r2, R; 609 asm("divdeu %0,%2,%4; divdu %1,%3,%4" 610 : "=&r"(q1), "=r"(q2) 611 : "r"(n1), "r"(n0), "r"(d)); 612 r1 = -(q1 * d); /* low part of (n1<<64) - (q1 * d) */ 613 r2 = n0 - (q2 * d); 614 Q = q1 + q2; 615 R = r1 + r2; 616 if (R >= d || R < r2) { /* overflow implies R > d */ 617 Q += 1; 618 R -= d; 619 } 620 *r = R; 621 return Q; 622#else 623 uint64_t d0, d1, q0, q1, r1, r0, m; 624 625 d0 = (uint32_t)d; 626 d1 = d >> 32; 627 628 r1 = n1 % d1; 629 q1 = n1 / d1; 630 m = q1 * d0; 631 r1 = (r1 << 32) | (n0 >> 32); 632 if (r1 < m) { 633 q1 -= 1; 634 r1 += d; 635 if (r1 >= d) { 636 if (r1 < m) { 637 q1 -= 1; 638 r1 += d; 639 } 640 } 641 } 642 r1 -= m; 643 644 r0 = r1 % d1; 645 q0 = r1 / d1; 646 m = q0 * d0; 647 r0 = (r0 << 32) | (uint32_t)n0; 648 if (r0 < m) { 649 q0 -= 1; 650 r0 += d; 651 if (r0 >= d) { 652 if (r0 < m) { 653 q0 -= 1; 654 r0 += d; 655 } 656 } 657 } 658 r0 -= m; 659 660 *r = r0; 661 return (q1 << 32) | q0; 662#endif 663} 664 665/*---------------------------------------------------------------------------- 666| Returns an approximation to the square root of the 32-bit significand given 667| by `a'. Considered as an integer, `a' must be at least 2^31. If bit 0 of 668| `aExp' (the least significant bit) is 1, the integer returned approximates 669| 2^31*sqrt(`a'/2^31), where `a' is considered an integer. If bit 0 of `aExp' 670| is 0, the integer returned approximates 2^31*sqrt(`a'/2^30). In either 671| case, the approximation returned lies strictly within +/-2 of the exact 672| value. 673*----------------------------------------------------------------------------*/ 674 675static inline uint32_t estimateSqrt32(int aExp, uint32_t a) 676{ 677 static const uint16_t sqrtOddAdjustments[] = { 678 0x0004, 0x0022, 0x005D, 0x00B1, 0x011D, 0x019F, 0x0236, 0x02E0, 679 0x039C, 0x0468, 0x0545, 0x0631, 0x072B, 0x0832, 0x0946, 0x0A67 680 }; 681 static const uint16_t sqrtEvenAdjustments[] = { 682 0x0A2D, 0x08AF, 0x075A, 0x0629, 0x051A, 0x0429, 0x0356, 0x029E, 683 0x0200, 0x0179, 0x0109, 0x00AF, 0x0068, 0x0034, 0x0012, 0x0002 684 }; 685 int8_t index; 686 uint32_t z; 687 688 index = ( a>>27 ) & 15; 689 if ( aExp & 1 ) { 690 z = 0x4000 + ( a>>17 ) - sqrtOddAdjustments[ (int)index ]; 691 z = ( ( a / z )<<14 ) + ( z<<15 ); 692 a >>= 1; 693 } 694 else { 695 z = 0x8000 + ( a>>17 ) - sqrtEvenAdjustments[ (int)index ]; 696 z = a / z + z; 697 z = ( 0x20000 <= z ) ? 0xFFFF8000 : ( z<<15 ); 698 if ( z <= a ) return (uint32_t) ( ( (int32_t) a )>>1 ); 699 } 700 return ( (uint32_t) ( ( ( (uint64_t) a )<<31 ) / z ) ) + ( z>>1 ); 701 702} 703 704/*---------------------------------------------------------------------------- 705| Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' 706| is equal to the 128-bit value formed by concatenating `b0' and `b1'. 707| Otherwise, returns 0. 708*----------------------------------------------------------------------------*/ 709 710static inline bool eq128(uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1) 711{ 712 return a0 == b0 && a1 == b1; 713} 714 715/*---------------------------------------------------------------------------- 716| Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' is less 717| than or equal to the 128-bit value formed by concatenating `b0' and `b1'. 718| Otherwise, returns 0. 719*----------------------------------------------------------------------------*/ 720 721static inline bool le128(uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1) 722{ 723 return a0 < b0 || (a0 == b0 && a1 <= b1); 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 732static inline bool lt128(uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1) 733{ 734 return a0 < b0 || (a0 == b0 && a1 < b1); 735} 736 737/*---------------------------------------------------------------------------- 738| Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' is 739| not equal to the 128-bit value formed by concatenating `b0' and `b1'. 740| Otherwise, returns 0. 741*----------------------------------------------------------------------------*/ 742 743static inline bool ne128(uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1) 744{ 745 return a0 != b0 || a1 != b1; 746} 747 748/* 749 * Similarly, comparisons of 192-bit values. 750 */ 751 752static inline bool eq192(uint64_t a0, uint64_t a1, uint64_t a2, 753 uint64_t b0, uint64_t b1, uint64_t b2) 754{ 755 return ((a0 ^ b0) | (a1 ^ b1) | (a2 ^ b2)) == 0; 756} 757 758static inline bool le192(uint64_t a0, uint64_t a1, uint64_t a2, 759 uint64_t b0, uint64_t b1, uint64_t b2) 760{ 761 if (a0 != b0) { 762 return a0 < b0; 763 } 764 if (a1 != b1) { 765 return a1 < b1; 766 } 767 return a2 <= b2; 768} 769 770static inline bool lt192(uint64_t a0, uint64_t a1, uint64_t a2, 771 uint64_t b0, uint64_t b1, uint64_t b2) 772{ 773 if (a0 != b0) { 774 return a0 < b0; 775 } 776 if (a1 != b1) { 777 return a1 < b1; 778 } 779 return a2 < b2; 780} 781 782#endif