diff options
author | Stefan Liebler <stli@de.ibm.com> | 2016-01-18 12:48:06 +0100 |
---|---|---|
committer | Stefan Liebler <stli@de.ibm.com> | 2016-01-18 12:48:06 +0100 |
commit | c4d17461e062e730fca4076dd47a2733b3914c51 (patch) | |
tree | 89346046c4bad9bad11d8e8cbbc17c89856c5b2c /sysdeps/mips | |
parent | 4e58b6485989a9462e88d5f683e2100902afd574 (diff) | |
download | glibc-c4d17461e062e730fca4076dd47a2733b3914c51.tar glibc-c4d17461e062e730fca4076dd47a2733b3914c51.tar.gz glibc-c4d17461e062e730fca4076dd47a2733b3914c51.tar.bz2 glibc-c4d17461e062e730fca4076dd47a2733b3914c51.zip |
S/390: Do not raise inexact exception in lrint/lround. [BZ #19486]
I get some math test-failures on s390 for float/double/ldouble for
various lrint/lround functions like:
lrint (0x1p64): Exception "Inexact" set
lrint (-0x1p64): Exception "Inexact" set
lround (0x1p64): Exception "Inexact" set
lround (-0x1p64): Exception "Inexact" set
...
GCC emits "convert to fixed" instructions for casting floating point
values to integer values. These instructions raise invalid and inexact
exceptions if the floating point value exceeds the integer type ranges.
This patch enables the various FIX_DBL_LONG_CONVERT_OVERFLOW macros in
order to avoid a cast from floating point to integer type and raise the
invalid exception with feraiseexcept.
The ldbl-128 rint/round functions are now using the same logic.
ChangeLog:
[BZ #19486]
* sysdeps/s390/fix-fp-int-convert-overflow.h: New File.
* sysdeps/generic/fix-fp-int-convert-overflow.h
(FIX_LDBL_LONG_CONVERT_OVERFLOW,
FIX_LDBL_LLONG_CONVERT_OVERFLOW): New define.
* sysdeps/arm/fix-fp-int-convert-overflow.h: Likewise.
* sysdeps/mips/mips32/fpu/fix-fp-int-convert-overflow.h:
Likewise.
* sysdeps/ieee754/ldbl-128/s_lrintl.c (__lrintl):
Avoid conversions to long int where inexact exceptions
could be raised.
* sysdeps/ieee754/ldbl-128/s_lroundl.c (__lroundl):
Likewise.
* sysdeps/ieee754/ldbl-128/s_llrintl.c (__llrintl):
Avoid conversions to long long int where inexact exceptions
could be raised.
* sysdeps/ieee754/ldbl-128/s_llroundl.c (__llroundl):
Likewise.
Diffstat (limited to 'sysdeps/mips')
-rw-r--r-- | sysdeps/mips/mips32/fpu/fix-fp-int-convert-overflow.h | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/sysdeps/mips/mips32/fpu/fix-fp-int-convert-overflow.h b/sysdeps/mips/mips32/fpu/fix-fp-int-convert-overflow.h index fb2ec69b2c..b9f4aea488 100644 --- a/sysdeps/mips/mips32/fpu/fix-fp-int-convert-overflow.h +++ b/sysdeps/mips/mips32/fpu/fix-fp-int-convert-overflow.h @@ -25,6 +25,7 @@ see <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59412>). */ #define FIX_FLT_LLONG_CONVERT_OVERFLOW 1 #define FIX_DBL_LLONG_CONVERT_OVERFLOW 1 +#define FIX_LDBL_LLONG_CONVERT_OVERFLOW 0 /* As of GCC 5 and binutils 2.25, for MIPS I GCC generates calls to assembler macros for conversions from floating point to integer @@ -32,5 +33,6 @@ lose exceptions. */ #define FIX_FLT_LONG_CONVERT_OVERFLOW (__mips == 1) #define FIX_DBL_LONG_CONVERT_OVERFLOW (__mips == 1) +#define FIX_LDBL_LONG_CONVERT_OVERFLOW 0 #endif /* fix-fp-int-convert-overflow.h */ |