root/lib/libkern/softfloat-macros.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. shift32RightJamming
  2. shift64RightJamming
  3. shift64ExtraRightJamming
  4. shift128Right
  5. shift128RightJamming
  6. shift128ExtraRightJamming
  7. shortShift128Left
  8. shortShift192Left
  9. add128
  10. add192
  11. sub128
  12. sub192
  13. mul64To128
  14. mul128By64To192
  15. mul128To256
  16. estimateDiv128To64
  17. estimateSqrt32
  18. countLeadingZeros32
  19. countLeadingZeros64
  20. eq128
  21. le128
  22. lt128
  23. ne128

    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 */

/* [<][>][^][v][top][bottom][index][help] */