diff options
-rw-r--r-- | src/mpfr-impl.h | 27 | ||||
-rw-r--r-- | src/sum.c | 6 | ||||
-rw-r--r-- | tests/tsum.c | 24 |
3 files changed, 57 insertions, 0 deletions
diff --git a/src/mpfr-impl.h b/src/mpfr-impl.h index 8c3af99d4..66c56afbd 100644 --- a/src/mpfr-impl.h +++ b/src/mpfr-impl.h @@ -2079,4 +2079,31 @@ __MPFR_DECLSPEC void mpfr_mpz_clear _MPFR_PROTO((mpz_ptr)); #endif +/****************************************************** + ************* Value Coverage Checking ************** + ******************************************************/ + +#ifdef MPFR_COV_CHECK + +/* Variable names should start with the __gmpfr_cov_ prefix. */ + +#define MPFR_COV_SET(X) (__gmpfr_cov_ ## X = 1) + +#if defined (__cplusplus) +extern "C" { +#endif + +__MPFR_DECLSPEC extern int __gmpfr_cov_sum_tmd[MPFR_RND_MAX][2][2][3]; + +#if defined (__cplusplus) +} +#endif + +#else + +#define MPFR_COV_SET(X) ((void) 0) + +#endif + + #endif @@ -36,6 +36,10 @@ VL: This is very different: sequencial parallel (& sequential) */ +#ifdef MPFR_COV_CHECK +int __gmpfr_cov_sum_tmd[MPFR_RND_MAX][2][2][3] = { 0 }; +#endif + /* Update minexp after detecting a potential integer overflow in extreme cases (only 32-bit machines may be concerned in practice). */ #define UPDATE_MINEXP(E,SH) \ @@ -893,6 +897,8 @@ sum_aux (mpfr_ptr sum, mpfr_ptr *const x, unsigned long n, mpfr_rnd_t rnd, MPFR_LOG_MSG (("[Step 8] tmd=%d rbit=%d sst=%d\n", tmd, (int) rbit, sst)); + MPFR_COV_SET (sum_tmd[(int) rnd][tmd-1][rbit][sst+1]); + inex = MPFR_IS_LIKE_RNDD (rnd, pos ? 1 : -1) ? (sst ? -1 : 0) : MPFR_IS_LIKE_RNDU (rnd, pos ? 1 : -1) ? (sst ? 1 : 0) : diff --git a/tests/tsum.c b/tests/tsum.c index b91fca2e1..4c243c425 100644 --- a/tests/tsum.c +++ b/tests/tsum.c @@ -453,6 +453,29 @@ cancel (void) } } +static void +check_coverage (void) +{ +#ifdef MPFR_COV_CHECK + int r, i, j, k; + int err = 0; + + for (r = 0; r < MPFR_RND_MAX; r++) + for (i = 0; i < 2; i++) + for (j = 0; j < 2; j++) + for (k = 0; k < 3; k++) + if (!__gmpfr_cov_sum_tmd[r][i][j][k]) + { + printf ("TMD not tested on %s, tmd=%d, rbit=%d, sst=%d\n", + mpfr_print_rnd_mode ((mpfr_rnd_t) r), i+1, j, k-1); + err = 1; + } + + if (err) + exit (1); +#endif +} + int main (void) { @@ -465,6 +488,7 @@ main (void) check_extreme (); cancel (); + check_coverage (); tests_end_mpfr (); return 0; } |