diff options
author | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2015-02-25 10:55:21 +0000 |
---|---|---|
committer | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2015-02-25 10:55:21 +0000 |
commit | fcd117bf126a67af54d546c3c2ca40d18c7f53aa (patch) | |
tree | ab6862027fc5c7ed1d2f3ccb36132a184339194c | |
parent | 74342d61293cd8b75d606e239457f2fda59a9e7f (diff) | |
download | mpfr-fcd117bf126a67af54d546c3c2ca40d18c7f53aa.tar.gz |
Value coverage checking when MPFR_COV_CHECK is defined, initially
for mpfr_sum.
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/branches/new-sum@9315 280ebfd0-de03-0410-8827-d642c229c3f4
-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; } |