diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2024-04-03 16:39:18 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2024-04-04 14:29:28 -0300 |
commit | 932544efa469568525455bcb53d4eabeba0eb295 (patch) | |
tree | b3e510754dcce550451bc5dac1fec6c5a55a4958 /sysdeps/x86_64/fpu | |
parent | 637bfc392f406c6c77f59494ed34949a6161bceb (diff) | |
download | glibc-932544efa469568525455bcb53d4eabeba0eb295.zip glibc-932544efa469568525455bcb53d4eabeba0eb295.tar.gz glibc-932544efa469568525455bcb53d4eabeba0eb295.tar.bz2 |
math: x86 floor traps when FE_INEXACT is enabled (BZ 31601)
The implementations of floor functions using x87 floating point (i386 and
86_64 long double only) traps when FE_INEXACT is enabled. Although
this is a GNU extension outside the scope of the C standard, other
architectures that also support traps do not show this behavior.
The fix moves the implementation to a common one that holds any
exceptions with a 'fnclex' (libc_feholdexcept_setround_387).
Checked on x86_64-linux-gnu and i686-linux-gnu.
Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
Diffstat (limited to 'sysdeps/x86_64/fpu')
-rw-r--r-- | sysdeps/x86_64/fpu/s_floorl.S | 33 |
1 files changed, 0 insertions, 33 deletions
diff --git a/sysdeps/x86_64/fpu/s_floorl.S b/sysdeps/x86_64/fpu/s_floorl.S deleted file mode 100644 index b74d1a4..0000000 --- a/sysdeps/x86_64/fpu/s_floorl.S +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Public domain. - */ - -#include <libm-alias-ldouble.h> -#include <machine/asm.h> - -ENTRY(__floorl) - fldt 8(%rsp) - - fnstenv -28(%rsp) /* store fpu environment */ - - /* We use here %edx although only the low 1 bits are defined. - But none of the operations should care and they are faster - than the 16 bit operations. */ - movl $0x400,%edx /* round towards -oo */ - orl -28(%rsp),%edx - andl $0xf7ff,%edx - movl %edx,-32(%rsp) - fldcw -32(%rsp) /* load modified control word */ - - frndint /* round */ - - /* Preserve "invalid" exceptions from sNaN input. */ - fnstsw - andl $0x1, %eax - orl %eax, -24(%rsp) - - fldenv -28(%rsp) /* restore original environment */ - - ret -END (__floorl) -libm_alias_ldouble (__floor, floor) |