Fix i386 FP_TRAPPING_EXCEPTIONS.
The i386 sfp-machine.h defines FP_TRAPPING_EXCEPTIONS in a way that is always wrong: it treats a set bit as indicating the exception is trapping, when actually a set bit (both for 387 and SSE floating point) indicates it is masked, and a clear bit indicates it is trapping. This patch fixes this bug. Bootstrapped with no regressions on x86_64-unknown-linux-gnu. libgcc: * config/i386/sfp-machine.h (FP_TRAPPING_EXCEPTIONS): Treat clear bits not set bits as indicating trapping exceptions. gcc/testsuite: * gcc.dg/torture/float128-exact-underflow.c: New test. From-SVN: r215347
This commit is contained in:
parent
b5a2602380
commit
e770bfd997
4 changed files with 51 additions and 1 deletions
|
@ -1,3 +1,7 @@
|
|||
2014-09-18 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* gcc.dg/torture/float128-exact-underflow.c: New test.
|
||||
|
||||
2014-09-18 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/61745
|
||||
|
|
41
gcc/testsuite/gcc.dg/torture/float128-exact-underflow.c
Normal file
41
gcc/testsuite/gcc.dg/torture/float128-exact-underflow.c
Normal file
|
@ -0,0 +1,41 @@
|
|||
/* Test that exact underflow in __float128 signals the underflow
|
||||
exception if trapping is enabled, but does not raise the flag
|
||||
otherwise. */
|
||||
|
||||
/* { dg-do run { target i?86-*-*gnu* x86_64-*-*gnu* ia64-*-*gnu* } } */
|
||||
/* { dg-options "-D_GNU_SOURCE" } */
|
||||
/* { dg-require-effective-target fenv_exceptions } */
|
||||
|
||||
#include <fenv.h>
|
||||
#include <setjmp.h>
|
||||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
volatile sig_atomic_t caught_sigfpe;
|
||||
sigjmp_buf buf;
|
||||
|
||||
static void
|
||||
handle_sigfpe (int sig)
|
||||
{
|
||||
caught_sigfpe = 1;
|
||||
siglongjmp (buf, 1);
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
volatile __float128 a = 0x1p-16382q, b = 0x1p-2q;
|
||||
volatile __float128 r;
|
||||
r = a * b;
|
||||
if (fetestexcept (FE_UNDERFLOW))
|
||||
abort ();
|
||||
if (r != 0x1p-16384q)
|
||||
abort ();
|
||||
feenableexcept (FE_UNDERFLOW);
|
||||
signal (SIGFPE, handle_sigfpe);
|
||||
if (sigsetjmp (buf, 1) == 0)
|
||||
r = a * b;
|
||||
if (!caught_sigfpe)
|
||||
abort ();
|
||||
exit (0);
|
||||
}
|
|
@ -1,3 +1,8 @@
|
|||
2014-09-18 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* config/i386/sfp-machine.h (FP_TRAPPING_EXCEPTIONS): Treat clear
|
||||
bits not set bits as indicating trapping exceptions.
|
||||
|
||||
2014-09-17 Nathan sidwell <nathan@acm.org>
|
||||
|
||||
* Makefile.in (LIBGCOV_INTERFACE): Add _gcov_dump from ...
|
||||
|
|
|
@ -60,7 +60,7 @@ void __sfp_handle_exceptions (int);
|
|||
__sfp_handle_exceptions (_fex); \
|
||||
} while (0);
|
||||
|
||||
#define FP_TRAPPING_EXCEPTIONS ((_fcw >> FP_EX_SHIFT) & FP_EX_ALL)
|
||||
#define FP_TRAPPING_EXCEPTIONS ((~_fcw >> FP_EX_SHIFT) & FP_EX_ALL)
|
||||
|
||||
#define FP_ROUNDMODE (_fcw & FP_RND_MASK)
|
||||
#endif
|
||||
|
|
Loading…
Add table
Reference in a new issue