aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/riscv/rvd
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2018-02-22 14:31:54 -0500
committerDJ Delorie <dj@redhat.com>2018-02-22 14:31:54 -0500
commitfdcc625376505eacb1125a6aeba57501407a30ec (patch)
tree1989bd343846d9a14b1921ca9bcbe6930892ba6a /sysdeps/riscv/rvd
parent8090720a87e42fddc31396f6126112d4b8014d8e (diff)
downloadglibc-fdcc625376505eacb1125a6aeba57501407a30ec.zip
glibc-fdcc625376505eacb1125a6aeba57501407a30ec.tar.gz
glibc-fdcc625376505eacb1125a6aeba57501407a30ec.tar.bz2
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')
-rw-r--r--sysdeps/riscv/rvd/s_fmax.c11
-rw-r--r--sysdeps/riscv/rvd/s_fmin.c11
2 files changed, 18 insertions, 4 deletions
diff --git a/sysdeps/riscv/rvd/s_fmax.c b/sysdeps/riscv/rvd/s_fmax.c
index ef8f134..22e91bf 100644
--- a/sysdeps/riscv/rvd/s_fmax.c
+++ b/sysdeps/riscv/rvd/s_fmax.c
@@ -17,12 +17,19 @@
<http://www.gnu.org/licenses/>. */
#include <math.h>
+#include <math_private.h>
#include <libm-alias-double.h>
double
__fmax (double x, double y)
{
- asm ("fmax.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 ("fmax.d %0, %1, %2" : "=f" (res) : "f" (x), "f" (y));
+
+ return res;
}
libm_alias_double (__fmax, fmax)
diff --git a/sysdeps/riscv/rvd/s_fmin.c b/sysdeps/riscv/rvd/s_fmin.c
index c6ff24c..7b35230 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)