about summary refs log tree commit diff
path: root/math/gen-auto-libm-tests.c
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2014-06-23 20:15:14 +0000
committerJoseph Myers <joseph@codesourcery.com>2014-06-23 20:15:14 +0000
commit863893ec95f316a3d156d487b99242ee1b52f803 (patch)
tree88b7b115fcd0036af09a8089645db9e9cc221f7a /math/gen-auto-libm-tests.c
parent4da6db51880289f0bf41b39e05cf9bb1c4769c47 (diff)
downloadglibc-863893ec95f316a3d156d487b99242ee1b52f803.tar.gz
glibc-863893ec95f316a3d156d487b99242ee1b52f803.tar.xz
glibc-863893ec95f316a3d156d487b99242ee1b52f803.zip
Test cpow in all rounding modes.
This patch enables testing of cpow in all rounding modes using
ALL_RM_TEST.  There were two reasons this was previously deferred:

* MPC has complicated rounding-mode-dependent rules for the signs of
  exact zero real or imaginary parts in the result of mpc_pow.  Annex
  G does not impose any such requirements and I don't think glibc
  should try to implement any particular logic here.  This patch adds
  support for gen-auto-libm-tests passing the IGNORE_ZERO_INF_SIGN
  flag to libm-test.inc.

* Error accumulations in some tests in non-default rounding modes
  exceed the maximum error permitted in libm-test.inc.  This patch
  marks the problem tests with xfail-rounding.  (It might be possible
  to reduce the accumulations a bit by using round-to-nearest when
  cpow calls clog, but I don't think there's much point; the
  implementation approach for cpow is fundamentally deficient, as
  discussed in the existing bug for cpow inaccuracy which can
  reasonably be considered to cover these less-inaccurate cases as
  well.  It's possible that the test "cpow 2 0 10 0" will also need
  xfail-rounding on some platforms.)

Tested x86_64 and x86 and ulps updated accordingly.

	* math/gen-auto-libm-tests.c: Document use of
	ignore-zero-inf-sign.
	(input_flag_type): Add value flag_ignore_zero_inf_sign.
	(input_flags): Add ignore-zero-inf-sign.
	(output_for_one_input_case): Handle flag_ignore_zero_inf_sign.
	* math/gen-libm-test.pl (generate_testfile): Handle
	ignore-zero-inf-sign.
	* math/auto-libm-test-in: Mark some cpow tests with
	ignore-zero-inf-sign and some with xfail-rounding.
	* math/auto-libm-test-out: Regenerated.
	* math/libm-test.inc (cpow_test): Use ALL_RM_TEST.
	* sysdeps/i386/fpu/libm-test-ulps: Update.
	* sysdeps/x86_64/fpu/libm-test-ulps: Likewise.
Diffstat (limited to 'math/gen-auto-libm-tests.c')
-rw-r--r--math/gen-auto-libm-tests.c44
1 files changed, 24 insertions, 20 deletions
diff --git a/math/gen-auto-libm-tests.c b/math/gen-auto-libm-tests.c
index 132cca2b2e..12c530a335 100644
--- a/math/gen-auto-libm-tests.c
+++ b/math/gen-auto-libm-tests.c
@@ -84,15 +84,16 @@
    permitted), errno is expected to be left unchanged.
 
    The flag "no-test-inline" indicates a test is disabled for inline
-   function testing; "xfail" indicates the test is disabled as
-   expected to produce incorrect results, "xfail-rounding" indicates
-   the test is disabled only in rounding modes other than
-   round-to-nearest.  Otherwise, test flags are of the form
-   "spurious-<exception>" and "missing-<exception>", for any exception
-   ("overflow", "underflow", "inexact", "invalid", "divbyzero"),
-   "spurious-errno" and "missing-errno", to indicate when tests are
-   expected to deviate from the exception and errno settings
-   corresponding to the mathematical results.  "xfail",
+   function testing; "ignore-zero-inf-sign" indicates the the signs of
+   zero and infinite results should be ignored; "xfail" indicates the
+   test is disabled as expected to produce incorrect results,
+   "xfail-rounding" indicates the test is disabled only in rounding
+   modes other than round-to-nearest.  Otherwise, test flags are of
+   the form "spurious-<exception>" and "missing-<exception>", for any
+   exception ("overflow", "underflow", "inexact", "invalid",
+   "divbyzero"), "spurious-errno" and "missing-errno", to indicate
+   when tests are expected to deviate from the exception and errno
+   settings corresponding to the mathematical results.  "xfail",
    "xfail-rounding", "spurious-" and "missing-" flags should be
    accompanied by a comment referring to an open bug in glibc
    Bugzilla.
@@ -109,17 +110,17 @@
    plus_infty or minus_infty for infinite expected results, or as
    integer constant expressions (not necessarily with the right type)
    or IGNORE for integer inputs and outputs.  Flags are
-   "no-test-inline", "xfail", "<exception>", "<exception>-ok",
-   "errno-<value>", "errno-<value>-ok", which may be unconditional or
-   conditional.  "<exception>" indicates that a correct result means
-   the given exception should be raised.  "errno-<value>" indicates
-   that a correct result means errno should be set to the given value.
-   "-ok" means not to test for the given exception or errno value
-   (whether because it was marked as possibly missing or spurious, or
-   because the calculation of correct results indicated it was
-   optional).  Conditions "before-rounding" and "after-rounding"
-   indicate tests where expectations for underflow exceptions depend
-   on how the architecture detects tininess.  */
+   "no-test-inline", "ignore-zero-info-sign", "xfail", "<exception>",
+   "<exception>-ok", "errno-<value>", "errno-<value>-ok", which may be
+   unconditional or conditional.  "<exception>" indicates that a
+   correct result means the given exception should be raised.
+   "errno-<value>" indicates that a correct result means errno should
+   be set to the given value.  "-ok" means not to test for the given
+   exception or errno value (whether because it was marked as possibly
+   missing or spurious, or because the calculation of correct results
+   indicated it was optional).  Conditions "before-rounding" and
+   "after-rounding" indicate tests where expectations for underflow
+   exceptions depend on how the architecture detects tininess.  */
 
 #define _GNU_SOURCE
 
@@ -315,6 +316,7 @@ typedef struct
 typedef enum
   {
     flag_no_test_inline,
+    flag_ignore_zero_inf_sign,
     flag_xfail,
     flag_xfail_rounding,
     /* The "spurious" and "missing" flags must be in the same order as
@@ -342,6 +344,7 @@ typedef enum
 static const char *const input_flags[num_input_flag_types] =
   {
     "no-test-inline",
+    "ignore-zero-inf-sign",
     "xfail",
     "xfail-rounding",
     "spurious-divbyzero",
@@ -1950,6 +1953,7 @@ output_for_one_input_case (FILE *fp, const char *filename, test_function *tf,
 		switch (it->flags[i].type)
 		  {
 		  case flag_no_test_inline:
+		  case flag_ignore_zero_inf_sign:
 		  case flag_xfail:
 		    if (fprintf (fp, " %s%s",
 				 input_flags[it->flags[i].type],