Annotation of qemu/fpu/softfloat-macros.h, revision 1.1.1.4

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.