[Bug target/37581] IEEE inexact-flag not working on the Alpha
--- Comment #7 from ubizjak at gmail dot com 2009-02-03 11:10 --- Not a GCC bug. -- ubizjak at gmail dot com changed: What|Removed |Added Status|UNCONFIRMED |RESOLVED Resolution||INVALID http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37581
[Bug target/37581] IEEE inexact-flag not working on the Alpha
--- Comment #4 from bagnara at cs dot unipr dot it 2009-01-24 08:08 --- I don't know why the bug was closed: I can confirm the erroneous behavior is present also in GCC 4.3.2. -- bagnara at cs dot unipr dot it changed: What|Removed |Added Status|RESOLVED|UNCONFIRMED Resolution|INVALID | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37581
[Bug target/37581] IEEE inexact-flag not working on the Alpha
--- Comment #5 from ubizjak at gmail dot com 2009-01-24 10:17 --- (In reply to comment #4) I don't know why the bug was closed: I can confirm the erroneous behavior is present also in GCC 4.3.2. Because it looks to me that this is libc problem with fetestexcept. As far as the compiler is concerned, GCC correctly decorates trapping instructions with /sui and puts trap barrier to expected place: ... jsr $26,($27),__nldbl_printf!lituse_jsr!5 ldah $29,0($26) !gpdisp!6 divs/sui $f3,$f2,$f0 trapb ... -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37581
[Bug target/37581] IEEE inexact-flag not working on the Alpha
--- Comment #6 from abramobagnara at tin dot it 2009-01-24 15:41 --- (In reply to comment #5) Because it looks to me that this is libc problem with fetestexcept. As far as the compiler is concerned, GCC correctly decorates trapping instructions with /sui and puts trap barrier to expected place: ... jsr $26,($27),__nldbl_printf!lituse_jsr!5 ldah $29,0($26) !gpdisp!6 divs/sui $f3,$f2,$f0 trapb ... I've reported a bug according to the valuable info you provide. http://sourceware.org/bugzilla/show_bug.cgi?id=9783 -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37581
[Bug target/37581] IEEE inexact-flag not working on the Alpha
--- Comment #2 from ubizjak at gmail dot com 2009-01-23 08:47 --- Works for me with: --cut here-- #define _GNU_SOURCE #include fenv.h #include signal.h #include stdlib.h static void foo (int sig) { exit (0); } float __attribute__((noinline)) test (float x) { return 2.0f / x; }; int main() { volatile float x; signal (SIGFPE, foo); feclearexcept (FE_ALL_EXCEPT); feenableexcept (FE_INEXACT); x = test (3.0f); abort (); } --cut here-- $ gcc -O2 -lm -mieee-with-inexact sf.c $ ./a.out $ -- ubizjak at gmail dot com changed: What|Removed |Added Status|UNCONFIRMED |RESOLVED Resolution||INVALID http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37581
[Bug target/37581] IEEE inexact-flag not working on the Alpha
--- Comment #3 from abramobagnara at tin dot it 2009-01-24 05:43 --- The test case you have used it's different from the original that showed the bug. Nevertheless it's useful to understand the possible nature of the bug. It seems that if feenableexcept(FE_INEXACT) is not called fetestexcept(FE_INEXACT) doesn't work as expected (and as C99 standard provides). Please note that according to documentation GNU extension feenableexcept/fedisablexcept does not enable/disable inexact detection, but does enable/disable inexact *trapping* via SIGFPE signal. Here below there is a new test case that shows the wrong behaviour. $ cat sf2.c #define _GNU_SOURCE #include fenv.h #include signal.h #include stdio.h static void foo (int sig) { printf(inexact\n); } float __attribute__((noinline)) test (float x) { printf(%f / %f\n, 2.0f, x); return 2.0f / x; } void t() { volatile float x; feclearexcept (FE_ALL_EXCEPT); x = test (3.0f); printf(fetestexcept(FE_INEXACT) = %d\n, fetestexcept(FE_INEXACT)); feclearexcept (FE_ALL_EXCEPT); x = test (2.0f); printf(fetestexcept(FE_INEXACT) = %d\n, fetestexcept(FE_INEXACT)); } int main() { printf(\nWith FE_INEXACT SIGFPE disabled\n); t(); printf(\nWith FE_INEXACT SIGFPE enabled\n); signal (SIGFPE, foo); feenableexcept (FE_INEXACT); t(); } $ gcc -O2 -lm -mieee-with-inexact sf2.c $ ./a.out With FE_INEXACT SIGFPE disabled 2.00 / 3.00 fetestexcept(FE_INEXACT) = 0 2.00 / 2.00 fetestexcept(FE_INEXACT) = 0 With FE_INEXACT SIGFPE enabled 2.00 / 3.00 inexact fetestexcept(FE_INEXACT) = 2097152 2.00 / 2.00 fetestexcept(FE_INEXACT) = 0 $ -- abramobagnara at tin dot it changed: What|Removed |Added CC||abramobagnara at tin dot it http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37581
[Bug target/37581] IEEE inexact-flag not working on the Alpha
--- Comment #1 from bagnara at cs dot unipr dot it 2008-09-19 07:04 --- Created an attachment (id=16359) -- (http://gcc.gnu.org/bugzilla/attachment.cgi?id=16359action=view) Assembly code generated with g++ -S -mieee-with-inexact sf.cc -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37581