diff options
author | hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-09-27 17:47:23 +0000 |
---|---|---|
committer | hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-09-27 17:47:23 +0000 |
commit | 84d1fc49c54eda6906a643de78b72df65c2ce9fb (patch) | |
tree | 373fa862a43e43bb30e4f569c9c95e43119764f8 /libgcc/config/libbid/bid128_quantize.c | |
parent | 72c59a18cc11b00528f439ea717715b9baddad9d (diff) | |
download | gcc-84d1fc49c54eda6906a643de78b72df65c2ce9fb.tar.gz |
libgcc/
2007-09-27 H.J. Lu <hongjiu.lu@intel.com>
* Makefile.in (dfp-filenames): Replace decimal_globals,
decimal_data, binarydecimal and convert_data with
bid_decimal_globals, bid_decimal_data, bid_binarydecimal
and bid_convert_data, respectively.
libgcc/config/libbid/
2007-09-27 H.J. Lu <hongjiu.lu@intel.com>
* bid128_fromstring.c: Removed.
* bid_dpd.c: New from libbid 2007-09-26.
* bid128_to_int16.c: Likewise.
* bid128_to_int8.c: Likewise.
* bid128_to_uint8.c: Likewise.
* bid128_to_uint16.c: Likewise.
* bid64_to_int16.c: Likewise.
* bid64_to_int8.c: Likewise.
* bid64_to_uint16.c: Likewise.
* bid64_to_uint8.c: Likewise.
* bid128_2_str.h: Updated from libbid 2007-09-26.
* bid128_2_str_macros.h: Likewise.
* bid128_2_str_tables.c: Likewise.
* bid128_add.c: Likewise.
* bid128.c: Likewise.
* bid128_compare.c: Likewise.
* bid128_div.c: Likewise.
* bid128_fma.c: Likewise.
* bid128_logb.c: Likewise.
* bid128_minmax.c: Likewise.
* bid128_mul.c: Likewise.
* bid128_next.c: Likewise.
* bid128_noncomp.c: Likewise.
* bid128_quantize.c: Likewise.
* bid128_rem.c: Likewise.
* bid128_round_integral.c: Likewise.
* bid128_scalb.c: Likewise.
* bid128_sqrt.c: Likewise.
* bid128_string.c: Likewise.
* bid128_to_int32.c: Likewise.
* bid128_to_int64.c: Likewise.
* bid128_to_uint32.c: Likewise.
* bid128_to_uint64.c: Likewise.
* bid32_to_bid128.c: Likewise.
* bid32_to_bid64.c: Likewise.
* bid64_add.c: Likewise.
* bid64_compare.c: Likewise.
* bid64_div.c: Likewise.
* bid64_fma.c: Likewise.
* bid64_logb.c: Likewise.
* bid64_minmax.c: Likewise.
* bid64_mul.c: Likewise.
* bid64_next.c: Likewise.
* bid64_noncomp.c: Likewise.
* bid64_quantize.c: Likewise.
* bid64_rem.c: Likewise.
* bid64_round_integral.c: Likewise.
* bid64_scalb.c: Likewise.
* bid64_sqrt.c: Likewise.
* bid64_string.c: Likewise.
* bid64_to_bid128.c: Likewise.
* bid64_to_int32.c: Likewise.
* bid64_to_int64.c: Likewise.
* bid64_to_uint32.c: Likewise.
* bid64_to_uint64.c: Likewise.
* bid_b2d.h: Likewise.
* bid_binarydecimal.c: Likewise.
* bid_conf.h: Likewise.
* bid_convert_data.c: Likewise.
* bid_decimal_data.c: Likewise.
* bid_decimal_globals.c: Likewise.
* bid_div_macros.h: Likewise.
* bid_flag_operations.c: Likewise.
* bid_from_int.c: Likewise.
* bid_functions.h: Likewise.
* bid_gcc_intrinsics.h: Likewise.
* bid_inline_add.h: Likewise.
* bid_internal.h: Likewise.
* bid_round.c: Likewise.
* bid_sqrt_macros.h: Likewise.
* _addsub_dd.c: Likewise.
* _addsub_sd.c: Likewise.
* _addsub_td.c: Likewise.
* _dd_to_df.c: Likewise.
* _dd_to_di.c: Likewise.
* _dd_to_sd.c: Likewise.
* _dd_to_sf.c: Likewise.
* _dd_to_si.c: Likewise.
* _dd_to_td.c: Likewise.
* _dd_to_tf.c: Likewise.
* _dd_to_udi.c: Likewise.
* _dd_to_usi.c: Likewise.
* _dd_to_xf.c: Likewise.
* _df_to_dd.c: Likewise.
* _df_to_sd.c: Likewise.
* _df_to_td.c: Likewise.
* _di_to_dd.c: Likewise.
* _di_to_sd.c: Likewise.
* _di_to_td.c: Likewise.
* _div_dd.c: Likewise.
* _div_sd.c: Likewise.
* _div_td.c: Likewise.
* _eq_dd.c: Likewise.
* _eq_sd.c: Likewise.
* _eq_td.c: Likewise.
* _ge_dd.c: Likewise.
* _ge_sd.c: Likewise.
* _ge_td.c: Likewise.
* _gt_dd.c: Likewise.
* _gt_sd.c: Likewise.
* _gt_td.c: Likewise.
* _isinfd128.c: Likewise.
* _isinfd32.c: Likewise.
* _isinfd64.c: Likewise.
* _le_dd.c: Likewise.
* _le_sd.c: Likewise.
* _le_td.c: Likewise.
* _lt_dd.c: Likewise.
* _lt_sd.c: Likewise.
* _lt_td.c: Likewise.
* _mul_dd.c: Likewise.
* _mul_sd.c: Likewise.
* _mul_td.c: Likewise.
* _ne_dd.c: Likewise.
* _ne_sd.c: Likewise.
* _ne_td.c: Likewise.
* _sd_to_dd.c: Likewise.
* _sd_to_df.c: Likewise.
* _sd_to_di.c: Likewise.
* _sd_to_sf.c: Likewise.
* _sd_to_si.c: Likewise.
* _sd_to_td.c: Likewise.
* _sd_to_tf.c: Likewise.
* _sd_to_udi.c: Likewise.
* _sd_to_usi.c: Likewise.
* _sd_to_xf.c: Likewise.
* _sf_to_dd.c: Likewise.
* _sf_to_sd.c: Likewise.
* _sf_to_td.c: Likewise.
* _si_to_dd.c: Likewise.
* _si_to_sd.c: Likewise.
* _si_to_td.c: Likewise.
* _td_to_dd.c: Likewise.
* _td_to_df.c: Likewise.
* _td_to_di.c: Likewise.
* _td_to_sd.c: Likewise.
* _td_to_sf.c: Likewise.
* _td_to_si.c: Likewise.
* _td_to_tf.c: Likewise.
* _td_to_udi.c: Likewise.
* _td_to_usi.c: Likewise.
* _td_to_xf.c: Likewise.
* _tf_to_dd.c: Likewise.
* _tf_to_sd.c: Likewise.
* _tf_to_td.c: Likewise.
* _udi_to_dd.c: Likewise.
* _udi_to_sd.c: Likewise.
* _udi_to_td.c: Likewise.
* _unord_dd.c: Likewise.
* _unord_sd.c: Likewise.
* _unord_td.c: Likewise.
* _usi_to_dd.c: Likewise.
* _usi_to_sd.c: Likewise.
* _usi_to_td.c: Likewise.
* _xf_to_dd.c: Likewise.
* _xf_to_sd.c: Likewise.
* _xf_to_td.c: Likewise.
2007-09-27 H.J. Lu <hongjiu.lu@intel.com>
* b2d.h: Renamed to ...
* bid_b2d.h: This.
* bid128_to_string.c: Renamed to ...
* bid128_string.c: This.
* bid_intrinsics.h: Renamed to ...
* bid_gcc_intrinsics.h: This.
* bid_string.c: Renamed to ...
* bid64_string.c: This.
* binarydecimal.c: Renamed to ...
* bid_decimal_globals.c: This.
* convert_data.c: Renamed to ...
* bid_convert_data.c: This.
* decimal_data.c: Renamed to ...
* bid_decimal_data.c: This.
* decimal_globals.c: Renamed to ...
* bid_decimal_globals.c: This.
* div_macros.h: Renamed to ...
* bid_div_macros.h: This.
* inline_bid_add.h: Renamed to ...
* bid_inline_add.h: This.
* sqrt_macros.h: Renamed to ...
* bid_sqrt_macros.h: This.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@128841 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgcc/config/libbid/bid128_quantize.c')
-rw-r--r-- | libgcc/config/libbid/bid128_quantize.c | 369 |
1 files changed, 189 insertions, 180 deletions
diff --git a/libgcc/config/libbid/bid128_quantize.c b/libgcc/config/libbid/bid128_quantize.c index aa69b84fc33..83f7345c834 100644 --- a/libgcc/config/libbid/bid128_quantize.c +++ b/libgcc/config/libbid/bid128_quantize.c @@ -29,242 +29,251 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA #define BID_128RES #include "bid_internal.h" -BID128_FUNCTION_ARG2(__bid128_quantize, x, y) +BID128_FUNCTION_ARG2 (bid128_quantize, x, y) - UINT256 CT; - UINT128 CX, CY, T, CX2, CR, Stemp, res, REM_H, C2N; - UINT64 sign_x, sign_y, remainder_h, carry, CY64; - int_float tempx; - int exponent_x = 0, exponent_y = 0, digits_x, extra_digits, amount; - int expon_diff, total_digits, bin_expon_cx, rmode, status; + UINT256 CT; + UINT128 CX, CY, T, CX2, CR, Stemp, res, REM_H, C2N; + UINT64 sign_x, sign_y, remainder_h, carry, CY64, valid_x; + int_float tempx; + int exponent_x, exponent_y, digits_x, extra_digits, amount; + int expon_diff, total_digits, bin_expon_cx, rmode, status; + +valid_x = unpack_BID128_value (&sign_x, &exponent_x, &CX, x); // unpack arguments, check for NaN or Infinity - if (!unpack_BID128_value (&sign_y, &exponent_y, &CY, y)) { +if (!unpack_BID128_value (&sign_y, &exponent_y, &CY, y)) { // y is Inf. or NaN #ifdef SET_STATUS_FLAGS - if ((x.w[1] & SNAN_MASK64) == SNAN_MASK64) // y is sNaN - __set_status_flags (pfpsf, INVALID_EXCEPTION); +if ((x.w[1] & SNAN_MASK64) == SNAN_MASK64) // y is sNaN + __set_status_flags (pfpsf, INVALID_EXCEPTION); #endif // test if y is NaN - if ((y.w[1] & 0x7c00000000000000ull) == 0x7c00000000000000ull) { +if ((y.w[1] & 0x7c00000000000000ull) == 0x7c00000000000000ull) { #ifdef SET_STATUS_FLAGS - if ((y.w[1] & 0x7e00000000000000ull) == 0x7e00000000000000ull) { - // set status flags - __set_status_flags (pfpsf, INVALID_EXCEPTION); - } + if ((y.w[1] & 0x7e00000000000000ull) == 0x7e00000000000000ull) { + // set status flags + __set_status_flags (pfpsf, INVALID_EXCEPTION); + } #endif - res.w[1] = y.w[1] & QUIET_MASK64; - res.w[0] = y.w[0]; - BID_RETURN (res); - } + if ((x.w[1] & 0x7c00000000000000ull) != 0x7c00000000000000ull) { + res.w[1] = CY.w[1] & QUIET_MASK64; + res.w[0] = CY.w[0]; + } else { + res.w[1] = CX.w[1] & QUIET_MASK64; + res.w[0] = CX.w[0]; + } + BID_RETURN (res); +} // y is Infinity? - if ((y.w[1] & 0x7800000000000000ull) == 0x7800000000000000ull) { - // check if x is not Inf. - if (((x.w[1] & 0x7c00000000000000ull) < 0x7800000000000000ull)) { - // return NaN +if ((y.w[1] & 0x7800000000000000ull) == 0x7800000000000000ull) { + // check if x is not Inf. + if (((x.w[1] & 0x7c00000000000000ull) < 0x7800000000000000ull)) { + // return NaN #ifdef SET_STATUS_FLAGS - // set status flags - __set_status_flags (pfpsf, INVALID_EXCEPTION); + // set status flags + __set_status_flags (pfpsf, INVALID_EXCEPTION); #endif - res.w[1] = 0x7c00000000000000ull; - res.w[0] = 0; - BID_RETURN (res); - } else if (((x.w[1] & 0x7c00000000000000ull) <= 0x7800000000000000ull)) { - res.w[1] = x.w[1]; - res.w[0] = x.w[0]; - BID_RETURN (res); - } - } + res.w[1] = 0x7c00000000000000ull; + res.w[0] = 0; + BID_RETURN (res); + } else + if (((x.w[1] & 0x7c00000000000000ull) <= 0x7800000000000000ull)) { + res.w[1] = CX.w[1] & QUIET_MASK64; + res.w[0] = CX.w[0]; + BID_RETURN (res); } +} - if (!unpack_BID128_value (&sign_x, &exponent_x, &CX, x)) { - // test if x is NaN or Inf - if ((x.w[1] & 0x7c00000000000000ull) == 0x7800000000000000ull) { +} + +if (!valid_x) { + // test if x is NaN or Inf + if ((x.w[1] & 0x7c00000000000000ull) == 0x7800000000000000ull) { #ifdef SET_STATUS_FLAGS - // set status flags - __set_status_flags (pfpsf, INVALID_EXCEPTION); + // set status flags + __set_status_flags (pfpsf, INVALID_EXCEPTION); #endif - res.w[1] = 0x7c00000000000000ull; - res.w[0] = x.w[0]; - BID_RETURN (res); - } else if ((x.w[1] & 0x7c00000000000000ull) == - 0x7c00000000000000ull) { - if ((x.w[1] & 0x7e00000000000000ull) == 0x7e00000000000000ull) { + res.w[1] = 0x7c00000000000000ull; + res.w[0] = 0; + BID_RETURN (res); + } else if ((x.w[1] & 0x7c00000000000000ull) == 0x7c00000000000000ull) { + if ((x.w[1] & 0x7e00000000000000ull) == 0x7e00000000000000ull) { #ifdef SET_STATUS_FLAGS - // set status flags - __set_status_flags (pfpsf, INVALID_EXCEPTION); + // set status flags + __set_status_flags (pfpsf, INVALID_EXCEPTION); #endif - } - res.w[1] = x.w[1] & QUIET_MASK64; - res.w[0] = x.w[0]; - BID_RETURN (res); - } - if (!CX.w[1] && !CX.w[0]) { - get_BID128_very_fast (&res, sign_x, exponent_y, CX); - BID_RETURN (res); } + res.w[1] = CX.w[1] & QUIET_MASK64; + res.w[0] = CX.w[0]; + BID_RETURN (res); } - // get number of decimal digits in coefficient_x - if (CX.w[1]) { - tempx.d = (float) CX.w[1]; - bin_expon_cx = ((tempx.i >> 23) & 0xff) - 0x7f + 64; - } else { - tempx.d = (float) CX.w[0]; - bin_expon_cx = ((tempx.i >> 23) & 0xff) - 0x7f; + if (!CX.w[1] && !CX.w[0]) { + get_BID128_very_fast (&res, sign_x, exponent_y, CX); + BID_RETURN (res); } - digits_x = __bid_estimate_decimal_digits[bin_expon_cx]; - if (CX.w[1] > __bid_power10_table_128[digits_x].w[1] - || (CX.w[1] == __bid_power10_table_128[digits_x].w[1] - && CX.w[0] >= __bid_power10_table_128[digits_x].w[0])) - digits_x++; +} + // get number of decimal digits in coefficient_x +if (CX.w[1]) { + tempx.d = (float) CX.w[1]; + bin_expon_cx = ((tempx.i >> 23) & 0xff) - 0x7f + 64; +} else { + tempx.d = (float) CX.w[0]; + bin_expon_cx = ((tempx.i >> 23) & 0xff) - 0x7f; +} - expon_diff = exponent_x - exponent_y; - total_digits = digits_x + expon_diff; +digits_x = estimate_decimal_digits[bin_expon_cx]; +if (CX.w[1] > power10_table_128[digits_x].w[1] + || (CX.w[1] == power10_table_128[digits_x].w[1] + && CX.w[0] >= power10_table_128[digits_x].w[0])) + digits_x++; - if ((UINT32) total_digits <= 34) { - if (expon_diff >= 0) { - T = __bid_power10_table_128[expon_diff]; - __mul_128x128_low (CX2, T, CX); - get_BID128_very_fast (&res, sign_x, exponent_y, CX2); - BID_RETURN (res); - } +expon_diff = exponent_x - exponent_y; +total_digits = digits_x + expon_diff; + +if ((UINT32) total_digits <= 34) { + if (expon_diff >= 0) { + T = power10_table_128[expon_diff]; + __mul_128x128_low (CX2, T, CX); + get_BID128_very_fast (&res, sign_x, exponent_y, CX2); + BID_RETURN (res); + } #ifndef IEEE_ROUND_NEAREST_TIES_AWAY #ifndef IEEE_ROUND_NEAREST - rmode = rnd_mode; - if (sign_x && (unsigned) (rmode - 1) < 2) - rmode = 3 - rmode; + rmode = rnd_mode; + if (sign_x && (unsigned) (rmode - 1) < 2) + rmode = 3 - rmode; #else - rmode = 0; + rmode = 0; #endif #else - rmode = 0; + rmode = 0; #endif - // must round off -expon_diff digits - extra_digits = -expon_diff; - __add_128_128 (CX, CX, __bid_round_const_table_128[rmode][extra_digits]); + // must round off -expon_diff digits + extra_digits = -expon_diff; + __add_128_128 (CX, CX, round_const_table_128[rmode][extra_digits]); - // get P*(2^M[extra_digits])/10^extra_digits - __mul_128x128_to_256 (CT, CX, __bid_reciprocals10_128[extra_digits]); + // get P*(2^M[extra_digits])/10^extra_digits + __mul_128x128_to_256 (CT, CX, reciprocals10_128[extra_digits]); - // now get P/10^extra_digits: shift C64 right by M[extra_digits]-128 - amount = __bid_recip_scale[extra_digits]; - CX2.w[0] = CT.w[2]; - CX2.w[1] = CT.w[3]; - if (amount >= 64) { - CR.w[1] = 0; - CR.w[0] = CX2.w[1] >> (amount - 64); - } else { - __shr_128 (CR, CX2, amount); - } + // now get P/10^extra_digits: shift C64 right by M[extra_digits]-128 + amount = recip_scale[extra_digits]; + CX2.w[0] = CT.w[2]; + CX2.w[1] = CT.w[3]; + if (amount >= 64) { + CR.w[1] = 0; + CR.w[0] = CX2.w[1] >> (amount - 64); + } else { + __shr_128 (CR, CX2, amount); + } #ifndef IEEE_ROUND_NEAREST_TIES_AWAY #ifndef IEEE_ROUND_NEAREST - if (rnd_mode == 0) + if (rnd_mode == 0) #endif - if (CR.w[0] & 1) { - // check whether fractional part of initial_P/10^extra_digits is - // exactly .5 this is the same as fractional part of - // (initial_P + 0.5*10^extra_digits)/10^extra_digits is exactly zero + if (CR.w[0] & 1) { + // check whether fractional part of initial_P/10^extra_digits is + // exactly .5 this is the same as fractional part of + // (initial_P + 0.5*10^extra_digits)/10^extra_digits is exactly zero - // get remainder - if (amount >= 64) { - remainder_h = CX2.w[0] | (CX2.w[1] << (128 - amount)); - } else - remainder_h = CX2.w[0] << (64 - amount); + // get remainder + if (amount >= 64) { + remainder_h = CX2.w[0] | (CX2.w[1] << (128 - amount)); + } else + remainder_h = CX2.w[0] << (64 - amount); - // test whether fractional part is 0 - if (!remainder_h - && (CT.w[1] < __bid_reciprocals10_128[extra_digits].w[1] - || (CT.w[1] == __bid_reciprocals10_128[extra_digits].w[1] - && CT.w[0] < __bid_reciprocals10_128[extra_digits].w[0]))) { - CR.w[0]--; - } + // test whether fractional part is 0 + if (!remainder_h + && (CT.w[1] < reciprocals10_128[extra_digits].w[1] + || (CT.w[1] == reciprocals10_128[extra_digits].w[1] + && CT.w[0] < reciprocals10_128[extra_digits].w[0]))) { + CR.w[0]--; } + } #endif #ifdef SET_STATUS_FLAGS - status = INEXACT_EXCEPTION; + status = INEXACT_EXCEPTION; - // get remainder - if (amount >= 64) { - REM_H.w[1] = (CX2.w[1] << (128 - amount)); - REM_H.w[0] = CX2.w[0]; - } else { - REM_H.w[1] = CX2.w[0] << (64 - amount); - REM_H.w[0] = 0; - } + // get remainder + if (amount >= 64) { + REM_H.w[1] = (CX2.w[1] << (128 - amount)); + REM_H.w[0] = CX2.w[0]; + } else { + REM_H.w[1] = CX2.w[0] << (64 - amount); + REM_H.w[0] = 0; + } - switch (rmode) { - case ROUNDING_TO_NEAREST: - case ROUNDING_TIES_AWAY: - // test whether fractional part is 0 - if (REM_H.w[1] == 0x8000000000000000ull && !REM_H.w[0] - && (CT.w[1] < __bid_reciprocals10_128[extra_digits].w[1] - || (CT.w[1] == __bid_reciprocals10_128[extra_digits].w[1] - && CT.w[0] < __bid_reciprocals10_128[extra_digits].w[0]))) - status = EXACT_STATUS; - break; - case ROUNDING_DOWN: - case ROUNDING_TO_ZERO: - if (!(REM_H.w[1] | REM_H.w[0]) - && (CT.w[1] < __bid_reciprocals10_128[extra_digits].w[1] - || (CT.w[1] == __bid_reciprocals10_128[extra_digits].w[1] - && CT.w[0] < __bid_reciprocals10_128[extra_digits].w[0]))) - status = EXACT_STATUS; - break; - default: - // round up - __add_carry_out (Stemp.w[0], CY64, CT.w[0], - __bid_reciprocals10_128[extra_digits].w[0]); - __add_carry_in_out (Stemp.w[1], carry, CT.w[1], - __bid_reciprocals10_128[extra_digits].w[1], CY64); - if (amount < 64) { - C2N.w[1] = 0; - C2N.w[0] = ((UINT64) 1) << amount; - REM_H.w[0] = REM_H.w[1] >> (64 - amount); - REM_H.w[1] = 0; - } else { - C2N.w[1] = ((UINT64) 1) << (amount - 64); - C2N.w[0] = 0; - REM_H.w[1] >>= (128 - amount); - } - REM_H.w[0] += carry; - if (REM_H.w[0] < carry) - REM_H.w[1]++; - if (__unsigned_compare_ge_128 (REM_H, C2N)) - status = EXACT_STATUS; + switch (rmode) { + case ROUNDING_TO_NEAREST: + case ROUNDING_TIES_AWAY: + // test whether fractional part is 0 + if (REM_H.w[1] == 0x8000000000000000ull && !REM_H.w[0] + && (CT.w[1] < reciprocals10_128[extra_digits].w[1] + || (CT.w[1] == reciprocals10_128[extra_digits].w[1] + && CT.w[0] < reciprocals10_128[extra_digits].w[0]))) + status = EXACT_STATUS; + break; + case ROUNDING_DOWN: + case ROUNDING_TO_ZERO: + if (!(REM_H.w[1] | REM_H.w[0]) + && (CT.w[1] < reciprocals10_128[extra_digits].w[1] + || (CT.w[1] == reciprocals10_128[extra_digits].w[1] + && CT.w[0] < reciprocals10_128[extra_digits].w[0]))) + status = EXACT_STATUS; + break; + default: + // round up + __add_carry_out (Stemp.w[0], CY64, CT.w[0], + reciprocals10_128[extra_digits].w[0]); + __add_carry_in_out (Stemp.w[1], carry, CT.w[1], + reciprocals10_128[extra_digits].w[1], CY64); + if (amount < 64) { + C2N.w[1] = 0; + C2N.w[0] = ((UINT64) 1) << amount; + REM_H.w[0] = REM_H.w[1] >> (64 - amount); + REM_H.w[1] = 0; + } else { + C2N.w[1] = ((UINT64) 1) << (amount - 64); + C2N.w[0] = 0; + REM_H.w[1] >>= (128 - amount); } + REM_H.w[0] += carry; + if (REM_H.w[0] < carry) + REM_H.w[1]++; + if (__unsigned_compare_ge_128 (REM_H, C2N)) + status = EXACT_STATUS; + } - __set_status_flags (pfpsf, status); + __set_status_flags (pfpsf, status); #endif - get_BID128_very_fast (&res, sign_x, exponent_y, CR); - BID_RETURN (res); - } - if (total_digits < 0) { - CR.w[1] = CR.w[0] = 0; + get_BID128_very_fast (&res, sign_x, exponent_y, CR); + BID_RETURN (res); +} +if (total_digits < 0) { + CR.w[1] = CR.w[0] = 0; #ifndef IEEE_ROUND_NEAREST_TIES_AWAY #ifndef IEEE_ROUND_NEAREST - rmode = rnd_mode; - if (sign_x && (unsigned) (rmode - 1) < 2) - rmode = 3 - rmode; - if (rmode == ROUNDING_UP) - CR.w[0] = 1; + rmode = rnd_mode; + if (sign_x && (unsigned) (rmode - 1) < 2) + rmode = 3 - rmode; + if (rmode == ROUNDING_UP) + CR.w[0] = 1; #endif #endif #ifdef SET_STATUS_FLAGS - __set_status_flags (pfpsf, INEXACT_EXCEPTION); + __set_status_flags (pfpsf, INEXACT_EXCEPTION); #endif - get_BID128_very_fast (&res, sign_x, exponent_y, CR); - BID_RETURN (res); - } + get_BID128_very_fast (&res, sign_x, exponent_y, CR); + BID_RETURN (res); +} // else more than 34 digits in coefficient #ifdef SET_STATUS_FLAGS - __set_status_flags (pfpsf, INVALID_EXCEPTION); +__set_status_flags (pfpsf, INVALID_EXCEPTION); #endif - res.w[1] = 0x7c00000000000000ull; - res.w[0] = 0; - BID_RETURN (res); +res.w[1] = 0x7c00000000000000ull; +res.w[0] = 0; +BID_RETURN (res); } |