summary refs log tree commit diff
path: root/math
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2016-03-10 23:48:46 +0000
committerJoseph Myers <joseph@codesourcery.com>2016-03-10 23:48:46 +0000
commitb55b28e6574c215689e4656628b911788870de31 (patch)
tree1c518f634bf77f45f52d642309da0afa5b8fc3d3 /math
parent6aa3e97e2530f9917f504eb4146af119a3f27229 (diff)
downloadglibc-b55b28e6574c215689e4656628b911788870de31.tar.gz
glibc-b55b28e6574c215689e4656628b911788870de31.tar.xz
glibc-b55b28e6574c215689e4656628b911788870de31.zip
Allow spurious underflow / inexact for ldbl-128ibm.
A large number of the test-ldouble failures seen for ldbl-128ibm are
spurious "underflow" and "inexact" exceptions.  These arise from such
exceptions in the underlying arithmetic; unlike other spurious
exceptions from that arithmetic, they do not in general relate to
cases where the returned result is also substantially inaccurate, are
not so readily avoidable by appropriately conditional libgcc patches,
and are widespread enough to be hard to handle through individual
XFAILing of the affected tests.

Thus, this patch documents relaxed accuracy goals for libm functions
for IBM long double and makes libm-test.inc reflect these spurious
exceptions in ldbl-128ibm arithmetic and always allow them in
ldbl-128ibm testing (while still not allowing these exceptions to be
missing where required to be present).  Tested for powerpc.

	* manual/math.texi (Errors in Math Functions): Document relaxed
	accuracy goals for IBM long double.
	* math/libm-test.inc (test_exceptions): Always allow spurious
	"underflow" and "inexact" exceptions for IBM long double.
Diffstat (limited to 'math')
-rw-r--r--math/libm-test.inc11
1 files changed, 9 insertions, 2 deletions
diff --git a/math/libm-test.inc b/math/libm-test.inc
index c9925fddb7..f1ba7dda99 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -672,13 +672,20 @@ test_exceptions (const char *test_name, int exception)
 	test_single_exception (test_name, exception, OVERFLOW_EXCEPTION,
 			       FE_OVERFLOW, "Overflow");
 #endif
+      /* Spurious "underflow" and "inexact" exceptions are always
+	 allowed for IBM long double, in line with the underlying
+	 arithmetic.  */
 #ifdef FE_UNDERFLOW
-      if ((exception & UNDERFLOW_EXCEPTION_OK) == 0)
+      if ((exception & UNDERFLOW_EXCEPTION_OK) == 0
+	  && !(TEST_COND_ldbl_128ibm
+	       && (exception & UNDERFLOW_EXCEPTION) == 0))
 	test_single_exception (test_name, exception, UNDERFLOW_EXCEPTION,
 			       FE_UNDERFLOW, "Underflow");
 #endif
 #ifdef FE_INEXACT
-      if ((exception & (INEXACT_EXCEPTION | NO_INEXACT_EXCEPTION)) != 0)
+      if ((exception & (INEXACT_EXCEPTION | NO_INEXACT_EXCEPTION)) != 0
+	  && !(TEST_COND_ldbl_128ibm
+	       && (exception & NO_INEXACT_EXCEPTION) != 0))
 	test_single_exception (test_name, exception, INEXACT_EXCEPTION,
 			       FE_INEXACT, "Inexact");
 #endif