diff options
author | Andrew Waterman <andrew@sifive.com> | 2018-02-22 14:31:54 -0500 |
---|---|---|
committer | DJ Delorie <dj@redhat.com> | 2018-02-22 14:31:54 -0500 |
commit | fdcc625376505eacb1125a6aeba57501407a30ec (patch) | |
tree | 1989bd343846d9a14b1921ca9bcbe6930892ba6a /sysdeps/riscv/rvd/s_fmin.c | |
parent | 8090720a87e42fddc31396f6126112d4b8014d8e (diff) | |
download | glibc-fdcc625376505eacb1125a6aeba57501407a30ec.tar.gz glibc-fdcc625376505eacb1125a6aeba57501407a30ec.tar.xz glibc-fdcc625376505eacb1125a6aeba57501407a30ec.zip |
RISC-V: fmax/fmin: Handle signalling NaNs correctly.
RISC-V's fmax(sNAN,4) returns 4 but glibc expects it to return qNAN. * sysdeps/riscv/rvd/s_fmax.c (__fmax): Handle sNaNs correctly. * sysdeps/riscv/rvd/s_fmin.c (__fmin): Likewise. * sysdeps/riscv/rvf/s_fmaxf.c (__fmaxf): Likewise. * sysdeps/riscv/rvf/s_fminf.c (__fminf): Likewise.
Diffstat (limited to 'sysdeps/riscv/rvd/s_fmin.c')
-rw-r--r-- | sysdeps/riscv/rvd/s_fmin.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/sysdeps/riscv/rvd/s_fmin.c b/sysdeps/riscv/rvd/s_fmin.c index c6ff24cefb..7b35230cac 100644 --- a/sysdeps/riscv/rvd/s_fmin.c +++ b/sysdeps/riscv/rvd/s_fmin.c @@ -17,12 +17,19 @@ <http://www.gnu.org/licenses/>. */ #include <math.h> +#include <math_private.h> #include <libm-alias-double.h> double __fmin (double x, double y) { - asm ("fmin.d %0, %1, %2" : "=f" (x) : "f" (x), "f" (y)); - return x; + double res; + + if (__glibc_unlikely ((_FCLASS (x) | _FCLASS (y)) & _FCLASS_SNAN)) + return x + y; + else + asm ("fmin.d %0, %1, %2" : "=f" (res) : "f" (x), "f" (y)); + + return res; } libm_alias_double (__fmin, fmin) |