diff options
Diffstat (limited to 'Build/source/libs/mpfr/mpfr-src/src/round_raw_generic.c')
-rw-r--r-- | Build/source/libs/mpfr/mpfr-src/src/round_raw_generic.c | 76 |
1 files changed, 44 insertions, 32 deletions
diff --git a/Build/source/libs/mpfr/mpfr-src/src/round_raw_generic.c b/Build/source/libs/mpfr/mpfr-src/src/round_raw_generic.c index 1c87ad24409..ee83d65b7fb 100644 --- a/Build/source/libs/mpfr/mpfr-src/src/round_raw_generic.c +++ b/Build/source/libs/mpfr/mpfr-src/src/round_raw_generic.c @@ -1,6 +1,6 @@ /* mpfr_round_raw_generic -- Generic rounding function -Copyright 1999-2019 Free Software Foundation, Inc. +Copyright 1999-2020 Free Software Foundation, Inc. Contributed by the AriC and Caramba projects, INRIA. This file is part of the GNU MPFR Library. @@ -54,6 +54,10 @@ https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., * may change in the future without notice. */ +#if !(flag == 0 || flag == 1) +#error "flag must be 0 or 1" +#endif + int mpfr_round_raw_generic( #if flag == 0 @@ -72,20 +76,21 @@ mpfr_round_raw_generic( #if flag == 0 int carry; #endif -#if use_inexp == 0 - int *inexp; -#endif - if (use_inexp) - MPFR_ASSERTD(inexp != ((int*) 0)); - MPFR_ASSERTD(neg == 0 || neg == 1); +#if use_inexp != 0 + MPFR_ASSERTD (inexp != ((int*) 0)); +#endif + MPFR_ASSERTD (neg == 0 || neg == 1); +#if flag == 1 + /* rnd_mode = RNDF is only possible for flag = 0. */ + MPFR_ASSERTD (rnd_mode != MPFR_RNDF); +#endif if (rnd_mode == MPFR_RNDF) { - if (use_inexp) - *inexp = 0; /* make sure it has a valid value */ - if (flag) - return 0; +#if use_inexp != 0 + *inexp = 0; /* make sure it has a valid value */ +#endif rnd_mode = MPFR_RNDZ; /* faster */ new_use_inexp = 0; } @@ -108,8 +113,9 @@ mpfr_round_raw_generic( nw++; MPFR_ASSERTD(nw >= 1); MPFR_ASSERTD(nw >= xsize); - if (use_inexp) - *inexp = 0; +#if use_inexp != 0 + *inexp = 0; +#endif #if flag == 0 mpn_copyd (yp + (nw - xsize), xp, xsize); MPN_ZERO(yp, nw - xsize); @@ -154,8 +160,9 @@ mpfr_round_raw_generic( sb = xp[xsize - nw] & (himask ^ (himask << 1)); if (sb == 0) { - if (use_inexp) - *inexp = 2*MPFR_EVEN_INEX*neg-MPFR_EVEN_INEX; +#if use_inexp != 0 + *inexp = 2 * MPFR_EVEN_INEX * neg - MPFR_EVEN_INEX; +#endif /* ((neg!=0)^(sb!=0)) ? MPFR_EVEN_INEX : -MPFR_EVEN_INEX */ /* since neg = 0 or 1 and sb = 0 */ #if flag == 0 @@ -168,8 +175,9 @@ mpfr_round_raw_generic( { away_addone_ulp: /* sb != 0 && rnd_mode == MPFR_RNDN */ - if (use_inexp) - *inexp = MPFR_EVEN_INEX-2*MPFR_EVEN_INEX*neg; +#if use_inexp != 0 + *inexp = MPFR_EVEN_INEX - 2 * MPFR_EVEN_INEX * neg; +#endif /* ((neg!=0)^(sb!=0)) ? MPFR_EVEN_INEX : -MPFR_EVEN_INEX */ /* since neg = 0 or 1 and sb != 0 */ goto rnd_RNDN_add_one_ulp; @@ -177,8 +185,9 @@ mpfr_round_raw_generic( } else /* sb != 0 && rnd_mode == MPFR_RNDN */ { - if (use_inexp) - *inexp = 1-2*neg; /* neg == 0 ? 1 : -1 */ +#if use_inexp != 0 + *inexp = 1 - 2 * neg; /* neg == 0 ? 1 : -1 */ +#endif rnd_RNDN_add_one_ulp: #if flag == 1 return 1; /* sb != 0 && rnd_mode != MPFR_RNDZ */ @@ -197,12 +206,13 @@ mpfr_round_raw_generic( { /* rnd_mode == MPFR_RNDZ */ rnd_RNDZ: - while (MPFR_UNLIKELY(sb == 0) && k > 0) + while (MPFR_UNLIKELY (sb == 0) && k > 0) sb = xp[--k]; - if (use_inexp) - /* rnd_mode == MPFR_RNDZ and neg = 0 or 1 */ - /* ((neg != 0) ^ (rnd_mode != MPFR_RNDZ)) ? 1 : -1 */ - *inexp = MPFR_UNLIKELY(sb == 0) ? 0 : (2*neg-1); +#if use_inexp != 0 + /* rnd_mode == MPFR_RNDZ and neg = 0 or 1 */ + /* ((neg != 0) ^ (rnd_mode != MPFR_RNDZ)) ? 1 : -1 */ + *inexp = MPFR_UNLIKELY (sb == 0) ? 0 : 2 * neg - 1; +#endif #if flag == 0 mpn_copyi (yp, xp + xsize - nw, nw); yp[0] &= himask; @@ -212,14 +222,15 @@ mpfr_round_raw_generic( else { /* Rounding away from zero */ - while (MPFR_UNLIKELY(sb == 0) && k > 0) + while (MPFR_UNLIKELY (sb == 0) && k > 0) sb = xp[--k]; - if (MPFR_UNLIKELY(sb == 0)) + if (MPFR_UNLIKELY (sb == 0)) { /* sb = 0 && rnd_mode != MPFR_RNDZ */ - if (use_inexp) - /* ((neg != 0) ^ (rnd_mode != MPFR_RNDZ)) ? 1 : -1 */ - *inexp = 0; +#if use_inexp != 0 + /* ((neg != 0) ^ (rnd_mode != MPFR_RNDZ)) ? 1 : -1 */ + *inexp = 0; +#endif #if flag == 0 mpn_copyi (yp, xp + xsize - nw, nw); yp[0] &= himask; @@ -229,14 +240,15 @@ mpfr_round_raw_generic( else { /* sb != 0 && rnd_mode != MPFR_RNDZ */ - if (use_inexp) - *inexp = 1-2*neg; /* neg == 0 ? 1 : -1 */ +#if use_inexp != 0 + *inexp = 1 - 2 * neg; /* neg == 0 ? 1 : -1 */ +#endif #if flag == 1 return 1; #else carry = mpn_add_1(yp, xp + xsize - nw, nw, rw ? MPFR_LIMB_ONE << (GMP_NUMB_BITS - rw) - : 1); + : MPFR_LIMB_ONE); yp[0] &= himask; return carry; #endif |