summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2015-02-25 10:55:21 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2015-02-25 10:55:21 +0000
commitfcd117bf126a67af54d546c3c2ca40d18c7f53aa (patch)
treeab6862027fc5c7ed1d2f3ccb36132a184339194c
parent74342d61293cd8b75d606e239457f2fda59a9e7f (diff)
downloadmpfr-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.h27
-rw-r--r--src/sum.c6
-rw-r--r--tests/tsum.c24
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
diff --git a/src/sum.c b/src/sum.c
index 6393a5865..a4ea7960a 100644
--- a/src/sum.c
+++ b/src/sum.c
@@ -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;
}