[BACK]Return to softfloat-macros.h CVS log [TXT][DIR] Up to [local] / sys / lib / libkern

Annotation of sys/lib/libkern/softfloat-macros.h, Revision 1.1

1.1     ! nbrk        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 */

CVSweb