Home | History | Annotate | Line # | Download | only in libbid
bid64_add.c revision 1.1
      1 /* Copyright (C) 2007, 2009  Free Software Foundation, Inc.
      2 
      3 This file is part of GCC.
      4 
      5 GCC is free software; you can redistribute it and/or modify it under
      6 the terms of the GNU General Public License as published by the Free
      7 Software Foundation; either version 3, or (at your option) any later
      8 version.
      9 
     10 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     11 WARRANTY; without even the implied warranty of MERCHANTABILITY or
     12 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     13 for more details.
     14 
     15 Under Section 7 of GPL version 3, you are granted additional
     16 permissions described in the GCC Runtime Library Exception, version
     17 3.1, as published by the Free Software Foundation.
     18 
     19 You should have received a copy of the GNU General Public License and
     20 a copy of the GCC Runtime Library Exception along with this program;
     21 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     22 <http://www.gnu.org/licenses/>.  */
     23 
     24 /*****************************************************************************
     25  *    BID64 add
     26  *****************************************************************************
     27  *
     28  *  Algorithm description:
     29  *
     30  *   if(exponent_a < exponent_b)
     31  *       switch a, b
     32  *   diff_expon = exponent_a - exponent_b
     33  *   if(diff_expon > 16)
     34  *      return normalize(a)
     35  *   if(coefficient_a*10^diff_expon guaranteed below 2^62)
     36  *       S = sign_a*coefficient_a*10^diff_expon + sign_b*coefficient_b
     37  *       if(|S|<10^16)
     38  *           return get_BID64(sign(S),exponent_b,|S|)
     39  *       else
     40  *          determine number of extra digits in S (1, 2, or 3)
     41  *            return rounded result
     42  *   else // large exponent difference
     43  *       if(number_digits(coefficient_a*10^diff_expon) +/- 10^16)
     44  *          guaranteed the same as
     45  *          number_digits(coefficient_a*10^diff_expon) )
     46  *           S = normalize(coefficient_a + (sign_a^sign_b)*10^(16-diff_expon))
     47  *           corr = 10^16 + (sign_a^sign_b)*coefficient_b
     48  *           corr*10^exponent_b is rounded so it aligns with S*10^exponent_S
     49  *           return get_BID64(sign_a,exponent(S),S+rounded(corr))
     50  *       else
     51  *         add sign_a*coefficient_a*10^diff_expon, sign_b*coefficient_b
     52  *             in 128-bit integer arithmetic, then round to 16 decimal digits
     53  *
     54  *
     55  ****************************************************************************/
     56 
     57 #include "bid_internal.h"
     58 
     59 #if DECIMAL_CALL_BY_REFERENCE
     60 void bid64_add (UINT64 * pres, UINT64 * px,
     61 		UINT64 *
     62 		py _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
     63 		_EXC_INFO_PARAM);
     64 #else
     65 UINT64 bid64_add (UINT64 x,
     66 		  UINT64 y _RND_MODE_PARAM _EXC_FLAGS_PARAM
     67 		  _EXC_MASKS_PARAM _EXC_INFO_PARAM);
     68 #endif
     69 
     70 #if DECIMAL_CALL_BY_REFERENCE
     71 
     72 void
     73 bid64_sub (UINT64 * pres, UINT64 * px,
     74 	   UINT64 *
     75 	   py _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
     76 	   _EXC_INFO_PARAM) {
     77   UINT64 y = *py;
     78 #if !DECIMAL_GLOBAL_ROUNDING
     79   _IDEC_round rnd_mode = *prnd_mode;
     80 #endif
     81   // check if y is not NaN
     82   if (((y & NAN_MASK64) != NAN_MASK64))
     83     y ^= 0x8000000000000000ull;
     84   bid64_add (pres, px,
     85 	     &y _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
     86 	     _EXC_INFO_ARG);
     87 }
     88 #else
     89 
     90 UINT64
     91 bid64_sub (UINT64 x,
     92 	   UINT64 y _RND_MODE_PARAM _EXC_FLAGS_PARAM
     93 	   _EXC_MASKS_PARAM _EXC_INFO_PARAM) {
     94   // check if y is not NaN
     95   if (((y & NAN_MASK64) != NAN_MASK64))
     96     y ^= 0x8000000000000000ull;
     97 
     98   return bid64_add (x,
     99 		    y _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
    100 		    _EXC_INFO_ARG);
    101 }
    102 #endif
    103 
    104 
    105 
    106 #if DECIMAL_CALL_BY_REFERENCE
    107 
    108 void
    109 bid64_add (UINT64 * pres, UINT64 * px,
    110 	   UINT64 *
    111 	   py _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
    112 	   _EXC_INFO_PARAM) {
    113   UINT64 x, y;
    114 #else
    115 
    116 UINT64
    117 bid64_add (UINT64 x,
    118 	   UINT64 y _RND_MODE_PARAM _EXC_FLAGS_PARAM
    119 	   _EXC_MASKS_PARAM _EXC_INFO_PARAM) {
    120 #endif
    121 
    122   UINT128 CA, CT, CT_new;
    123   UINT64 sign_x, sign_y, coefficient_x, coefficient_y, C64_new;
    124   UINT64 valid_x, valid_y;
    125   UINT64 res;
    126   UINT64 sign_a, sign_b, coefficient_a, coefficient_b, sign_s, sign_ab,
    127     rem_a;
    128   UINT64 saved_ca, saved_cb, C0_64, C64, remainder_h, T1, carry, tmp;
    129   int_double tempx;
    130   int exponent_x, exponent_y, exponent_a, exponent_b, diff_dec_expon;
    131   int bin_expon_ca, extra_digits, amount, scale_k, scale_ca;
    132   unsigned rmode, status;
    133 
    134 #if DECIMAL_CALL_BY_REFERENCE
    135 #if !DECIMAL_GLOBAL_ROUNDING
    136   _IDEC_round rnd_mode = *prnd_mode;
    137 #endif
    138   x = *px;
    139   y = *py;
    140 #endif
    141 
    142   valid_x = unpack_BID64 (&sign_x, &exponent_x, &coefficient_x, x);
    143   valid_y = unpack_BID64 (&sign_y, &exponent_y, &coefficient_y, y);
    144 
    145   // unpack arguments, check for NaN or Infinity
    146   if (!valid_x) {
    147     // x is Inf. or NaN
    148 
    149     // test if x is NaN
    150     if ((x & NAN_MASK64) == NAN_MASK64) {
    151 #ifdef SET_STATUS_FLAGS
    152       if (((x & SNAN_MASK64) == SNAN_MASK64)	// sNaN
    153 	  || ((y & SNAN_MASK64) == SNAN_MASK64))
    154 	__set_status_flags (pfpsf, INVALID_EXCEPTION);
    155 #endif
    156       res = coefficient_x & QUIET_MASK64;
    157       BID_RETURN (res);
    158     }
    159     // x is Infinity?
    160     if ((x & INFINITY_MASK64) == INFINITY_MASK64) {
    161       // check if y is Inf
    162       if (((y & NAN_MASK64) == INFINITY_MASK64)) {
    163 	if (sign_x == (y & 0x8000000000000000ull)) {
    164 	  res = coefficient_x;
    165 	  BID_RETURN (res);
    166 	}
    167 	// return NaN
    168 	{
    169 #ifdef SET_STATUS_FLAGS
    170 	  __set_status_flags (pfpsf, INVALID_EXCEPTION);
    171 #endif
    172 	  res = NAN_MASK64;
    173 	  BID_RETURN (res);
    174 	}
    175       }
    176       // check if y is NaN
    177       if (((y & NAN_MASK64) == NAN_MASK64)) {
    178 	res = coefficient_y & QUIET_MASK64;
    179 #ifdef SET_STATUS_FLAGS
    180 	if (((y & SNAN_MASK64) == SNAN_MASK64))
    181 	  __set_status_flags (pfpsf, INVALID_EXCEPTION);
    182 #endif
    183 	BID_RETURN (res);
    184       }
    185       // otherwise return +/-Inf
    186       {
    187 	res = coefficient_x;
    188 	BID_RETURN (res);
    189       }
    190     }
    191     // x is 0
    192     {
    193       if (((y & INFINITY_MASK64) != INFINITY_MASK64) && coefficient_y) {
    194 	if (exponent_y <= exponent_x) {
    195 	  res = y;
    196 	  BID_RETURN (res);
    197 	}
    198       }
    199     }
    200 
    201   }
    202   if (!valid_y) {
    203     // y is Inf. or NaN?
    204     if (((y & INFINITY_MASK64) == INFINITY_MASK64)) {
    205 #ifdef SET_STATUS_FLAGS
    206       if ((y & SNAN_MASK64) == SNAN_MASK64)	// sNaN
    207 	__set_status_flags (pfpsf, INVALID_EXCEPTION);
    208 #endif
    209       res = coefficient_y & QUIET_MASK64;
    210       BID_RETURN (res);
    211     }
    212     // y is 0
    213     if (!coefficient_x) {	// x==0
    214       if (exponent_x <= exponent_y)
    215 	res = ((UINT64) exponent_x) << 53;
    216       else
    217 	res = ((UINT64) exponent_y) << 53;
    218       if (sign_x == sign_y)
    219 	res |= sign_x;
    220 #ifndef IEEE_ROUND_NEAREST_TIES_AWAY
    221 #ifndef IEEE_ROUND_NEAREST
    222       if (rnd_mode == ROUNDING_DOWN && sign_x != sign_y)
    223 	res |= 0x8000000000000000ull;
    224 #endif
    225 #endif
    226       BID_RETURN (res);
    227     } else if (exponent_y >= exponent_x) {
    228       res = x;
    229       BID_RETURN (res);
    230     }
    231   }
    232   // sort arguments by exponent
    233   if (exponent_x < exponent_y) {
    234     sign_a = sign_y;
    235     exponent_a = exponent_y;
    236     coefficient_a = coefficient_y;
    237     sign_b = sign_x;
    238     exponent_b = exponent_x;
    239     coefficient_b = coefficient_x;
    240   } else {
    241     sign_a = sign_x;
    242     exponent_a = exponent_x;
    243     coefficient_a = coefficient_x;
    244     sign_b = sign_y;
    245     exponent_b = exponent_y;
    246     coefficient_b = coefficient_y;
    247   }
    248 
    249   // exponent difference
    250   diff_dec_expon = exponent_a - exponent_b;
    251 
    252   /* get binary coefficients of x and y */
    253 
    254   //--- get number of bits in the coefficients of x and y ---
    255 
    256   // version 2 (original)
    257   tempx.d = (double) coefficient_a;
    258   bin_expon_ca = ((tempx.i & MASK_BINARY_EXPONENT) >> 52) - 0x3ff;
    259 
    260   if (diff_dec_expon > MAX_FORMAT_DIGITS) {
    261     // normalize a to a 16-digit coefficient
    262 
    263     scale_ca = estimate_decimal_digits[bin_expon_ca];
    264     if (coefficient_a >= power10_table_128[scale_ca].w[0])
    265       scale_ca++;
    266 
    267     scale_k = 16 - scale_ca;
    268 
    269     coefficient_a *= power10_table_128[scale_k].w[0];
    270 
    271     diff_dec_expon -= scale_k;
    272     exponent_a -= scale_k;
    273 
    274     /* get binary coefficients of x and y */
    275 
    276     //--- get number of bits in the coefficients of x and y ---
    277     tempx.d = (double) coefficient_a;
    278     bin_expon_ca = ((tempx.i & MASK_BINARY_EXPONENT) >> 52) - 0x3ff;
    279 
    280     if (diff_dec_expon > MAX_FORMAT_DIGITS) {
    281 #ifdef SET_STATUS_FLAGS
    282       if (coefficient_b) {
    283 	__set_status_flags (pfpsf, INEXACT_EXCEPTION);
    284       }
    285 #endif
    286 
    287 #ifndef IEEE_ROUND_NEAREST_TIES_AWAY
    288 #ifndef IEEE_ROUND_NEAREST
    289       if (((rnd_mode) & 3) && coefficient_b)	// not ROUNDING_TO_NEAREST
    290       {
    291 	switch (rnd_mode) {
    292 	case ROUNDING_DOWN:
    293 	  if (sign_b) {
    294 	    coefficient_a -= ((((SINT64) sign_a) >> 63) | 1);
    295 	    if (coefficient_a < 1000000000000000ull) {
    296 	      exponent_a--;
    297 	      coefficient_a = 9999999999999999ull;
    298 	    } else if (coefficient_a >= 10000000000000000ull) {
    299 	      exponent_a++;
    300 	      coefficient_a = 1000000000000000ull;
    301 	    }
    302 	  }
    303 	  break;
    304 	case ROUNDING_UP:
    305 	  if (!sign_b) {
    306 	    coefficient_a += ((((SINT64) sign_a) >> 63) | 1);
    307 	    if (coefficient_a < 1000000000000000ull) {
    308 	      exponent_a--;
    309 	      coefficient_a = 9999999999999999ull;
    310 	    } else if (coefficient_a >= 10000000000000000ull) {
    311 	      exponent_a++;
    312 	      coefficient_a = 1000000000000000ull;
    313 	    }
    314 	  }
    315 	  break;
    316 	default:	// RZ
    317 	  if (sign_a != sign_b) {
    318 	    coefficient_a--;
    319 	    if (coefficient_a < 1000000000000000ull) {
    320 	      exponent_a--;
    321 	      coefficient_a = 9999999999999999ull;
    322 	    }
    323 	  }
    324 	  break;
    325 	}
    326       } else
    327 #endif
    328 #endif
    329 	// check special case here
    330 	if ((coefficient_a == 1000000000000000ull)
    331 	    && (diff_dec_expon == MAX_FORMAT_DIGITS + 1)
    332 	    && (sign_a ^ sign_b)
    333 	    && (coefficient_b > 5000000000000000ull)) {
    334 	coefficient_a = 9999999999999999ull;
    335 	exponent_a--;
    336       }
    337 
    338       res =
    339 	fast_get_BID64_check_OF (sign_a, exponent_a, coefficient_a,
    340 				 rnd_mode, pfpsf);
    341       BID_RETURN (res);
    342     }
    343   }
    344   // test whether coefficient_a*10^(exponent_a-exponent_b)  may exceed 2^62
    345   if (bin_expon_ca + estimate_bin_expon[diff_dec_expon] < 60) {
    346     // coefficient_a*10^(exponent_a-exponent_b)<2^63
    347 
    348     // multiply by 10^(exponent_a-exponent_b)
    349     coefficient_a *= power10_table_128[diff_dec_expon].w[0];
    350 
    351     // sign mask
    352     sign_b = ((SINT64) sign_b) >> 63;
    353     // apply sign to coeff. of b
    354     coefficient_b = (coefficient_b + sign_b) ^ sign_b;
    355 
    356     // apply sign to coefficient a
    357     sign_a = ((SINT64) sign_a) >> 63;
    358     coefficient_a = (coefficient_a + sign_a) ^ sign_a;
    359 
    360     coefficient_a += coefficient_b;
    361     // get sign
    362     sign_s = ((SINT64) coefficient_a) >> 63;
    363     coefficient_a = (coefficient_a + sign_s) ^ sign_s;
    364     sign_s &= 0x8000000000000000ull;
    365 
    366     // coefficient_a < 10^16 ?
    367     if (coefficient_a < power10_table_128[MAX_FORMAT_DIGITS].w[0]) {
    368 #ifndef IEEE_ROUND_NEAREST_TIES_AWAY
    369 #ifndef IEEE_ROUND_NEAREST
    370       if (rnd_mode == ROUNDING_DOWN && (!coefficient_a)
    371 	  && sign_a != sign_b)
    372 	sign_s = 0x8000000000000000ull;
    373 #endif
    374 #endif
    375       res = very_fast_get_BID64 (sign_s, exponent_b, coefficient_a);
    376       BID_RETURN (res);
    377     }
    378     // otherwise rounding is necessary
    379 
    380     // already know coefficient_a<10^19
    381     // coefficient_a < 10^17 ?
    382     if (coefficient_a < power10_table_128[17].w[0])
    383       extra_digits = 1;
    384     else if (coefficient_a < power10_table_128[18].w[0])
    385       extra_digits = 2;
    386     else
    387       extra_digits = 3;
    388 
    389 #ifndef IEEE_ROUND_NEAREST_TIES_AWAY
    390 #ifndef IEEE_ROUND_NEAREST
    391     rmode = rnd_mode;
    392     if (sign_s && (unsigned) (rmode - 1) < 2)
    393       rmode = 3 - rmode;
    394 #else
    395     rmode = 0;
    396 #endif
    397 #else
    398     rmode = 0;
    399 #endif
    400     coefficient_a += round_const_table[rmode][extra_digits];
    401 
    402     // get P*(2^M[extra_digits])/10^extra_digits
    403     __mul_64x64_to_128 (CT, coefficient_a,
    404 			reciprocals10_64[extra_digits]);
    405 
    406     // now get P/10^extra_digits: shift C64 right by M[extra_digits]-128
    407     amount = short_recip_scale[extra_digits];
    408     C64 = CT.w[1] >> amount;
    409 
    410   } else {
    411     // coefficient_a*10^(exponent_a-exponent_b) is large
    412     sign_s = sign_a;
    413 
    414 #ifndef IEEE_ROUND_NEAREST_TIES_AWAY
    415 #ifndef IEEE_ROUND_NEAREST
    416     rmode = rnd_mode;
    417     if (sign_s && (unsigned) (rmode - 1) < 2)
    418       rmode = 3 - rmode;
    419 #else
    420     rmode = 0;
    421 #endif
    422 #else
    423     rmode = 0;
    424 #endif
    425 
    426     // check whether we can take faster path
    427     scale_ca = estimate_decimal_digits[bin_expon_ca];
    428 
    429     sign_ab = sign_a ^ sign_b;
    430     sign_ab = ((SINT64) sign_ab) >> 63;
    431 
    432     // T1 = 10^(16-diff_dec_expon)
    433     T1 = power10_table_128[16 - diff_dec_expon].w[0];
    434 
    435     // get number of digits in coefficient_a
    436     if (coefficient_a >= power10_table_128[scale_ca].w[0]) {
    437       scale_ca++;
    438     }
    439 
    440     scale_k = 16 - scale_ca;
    441 
    442     // addition
    443     saved_ca = coefficient_a - T1;
    444     coefficient_a =
    445       (SINT64) saved_ca *(SINT64) power10_table_128[scale_k].w[0];
    446     extra_digits = diff_dec_expon - scale_k;
    447 
    448     // apply sign
    449     saved_cb = (coefficient_b + sign_ab) ^ sign_ab;
    450     // add 10^16 and rounding constant
    451     coefficient_b =
    452       saved_cb + 10000000000000000ull +
    453       round_const_table[rmode][extra_digits];
    454 
    455     // get P*(2^M[extra_digits])/10^extra_digits
    456     __mul_64x64_to_128 (CT, coefficient_b,
    457 			reciprocals10_64[extra_digits]);
    458 
    459     // now get P/10^extra_digits: shift C64 right by M[extra_digits]-128
    460     amount = short_recip_scale[extra_digits];
    461     C0_64 = CT.w[1] >> amount;
    462 
    463     // result coefficient
    464     C64 = C0_64 + coefficient_a;
    465     // filter out difficult (corner) cases
    466     // this test ensures the number of digits in coefficient_a does not change
    467     // after adding (the appropriately scaled and rounded) coefficient_b
    468     if ((UINT64) (C64 - 1000000000000000ull - 1) >
    469 	9000000000000000ull - 2) {
    470       if (C64 >= 10000000000000000ull) {
    471 	// result has more than 16 digits
    472 	if (!scale_k) {
    473 	  // must divide coeff_a by 10
    474 	  saved_ca = saved_ca + T1;
    475 	  __mul_64x64_to_128 (CA, saved_ca, 0x3333333333333334ull);
    476 	  //reciprocals10_64[1]);
    477 	  coefficient_a = CA.w[1] >> 1;
    478 	  rem_a =
    479 	    saved_ca - (coefficient_a << 3) - (coefficient_a << 1);
    480 	  coefficient_a = coefficient_a - T1;
    481 
    482 	  saved_cb += rem_a * power10_table_128[diff_dec_expon].w[0];
    483 	} else
    484 	  coefficient_a =
    485 	    (SINT64) (saved_ca - T1 -
    486 		      (T1 << 3)) * (SINT64) power10_table_128[scale_k -
    487 							      1].w[0];
    488 
    489 	extra_digits++;
    490 	coefficient_b =
    491 	  saved_cb + 100000000000000000ull +
    492 	  round_const_table[rmode][extra_digits];
    493 
    494 	// get P*(2^M[extra_digits])/10^extra_digits
    495 	__mul_64x64_to_128 (CT, coefficient_b,
    496 			    reciprocals10_64[extra_digits]);
    497 
    498 	// now get P/10^extra_digits: shift C64 right by M[extra_digits]-128
    499 	amount = short_recip_scale[extra_digits];
    500 	C0_64 = CT.w[1] >> amount;
    501 
    502 	// result coefficient
    503 	C64 = C0_64 + coefficient_a;
    504       } else if (C64 <= 1000000000000000ull) {
    505 	// less than 16 digits in result
    506 	coefficient_a =
    507 	  (SINT64) saved_ca *(SINT64) power10_table_128[scale_k +
    508 							1].w[0];
    509 	//extra_digits --;
    510 	exponent_b--;
    511 	coefficient_b =
    512 	  (saved_cb << 3) + (saved_cb << 1) + 100000000000000000ull +
    513 	  round_const_table[rmode][extra_digits];
    514 
    515 	// get P*(2^M[extra_digits])/10^extra_digits
    516 	__mul_64x64_to_128 (CT_new, coefficient_b,
    517 			    reciprocals10_64[extra_digits]);
    518 
    519 	// now get P/10^extra_digits: shift C64 right by M[extra_digits]-128
    520 	amount = short_recip_scale[extra_digits];
    521 	C0_64 = CT_new.w[1] >> amount;
    522 
    523 	// result coefficient
    524 	C64_new = C0_64 + coefficient_a;
    525 	if (C64_new < 10000000000000000ull) {
    526 	  C64 = C64_new;
    527 #ifdef SET_STATUS_FLAGS
    528 	  CT = CT_new;
    529 #endif
    530 	} else
    531 	  exponent_b++;
    532       }
    533 
    534     }
    535 
    536   }
    537 
    538 #ifndef IEEE_ROUND_NEAREST_TIES_AWAY
    539 #ifndef IEEE_ROUND_NEAREST
    540   if (rmode == 0)	//ROUNDING_TO_NEAREST
    541 #endif
    542     if (C64 & 1) {
    543       // check whether fractional part of initial_P/10^extra_digits is
    544       // exactly .5
    545       // this is the same as fractional part of
    546       //      (initial_P + 0.5*10^extra_digits)/10^extra_digits is exactly zero
    547 
    548       // get remainder
    549       remainder_h = CT.w[1] << (64 - amount);
    550 
    551       // test whether fractional part is 0
    552       if (!remainder_h && (CT.w[0] < reciprocals10_64[extra_digits])) {
    553 	C64--;
    554       }
    555     }
    556 #endif
    557 
    558 #ifdef SET_STATUS_FLAGS
    559   status = INEXACT_EXCEPTION;
    560 
    561   // get remainder
    562   remainder_h = CT.w[1] << (64 - amount);
    563 
    564   switch (rmode) {
    565   case ROUNDING_TO_NEAREST:
    566   case ROUNDING_TIES_AWAY:
    567     // test whether fractional part is 0
    568     if ((remainder_h == 0x8000000000000000ull)
    569 	&& (CT.w[0] < reciprocals10_64[extra_digits]))
    570       status = EXACT_STATUS;
    571     break;
    572   case ROUNDING_DOWN:
    573   case ROUNDING_TO_ZERO:
    574     if (!remainder_h && (CT.w[0] < reciprocals10_64[extra_digits]))
    575       status = EXACT_STATUS;
    576     //if(!C64 && rmode==ROUNDING_DOWN) sign_s=sign_y;
    577     break;
    578   default:
    579     // round up
    580     __add_carry_out (tmp, carry, CT.w[0],
    581 		     reciprocals10_64[extra_digits]);
    582     if ((remainder_h >> (64 - amount)) + carry >=
    583 	(((UINT64) 1) << amount))
    584       status = EXACT_STATUS;
    585     break;
    586   }
    587   __set_status_flags (pfpsf, status);
    588 
    589 #endif
    590 
    591   res =
    592     fast_get_BID64_check_OF (sign_s, exponent_b + extra_digits, C64,
    593 			     rnd_mode, pfpsf);
    594   BID_RETURN (res);
    595 }
    596