Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /* Copyright (C) 2007-2015 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.