mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-23 17:53:37 +08:00
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.
(cherry picked from commit fdcc625376
)
This commit is contained in:
parent
94145309f5
commit
aab08776cc
@ -1,3 +1,10 @@
|
||||
2018-02-22 Andrew Waterman <andrew@sifive.com>
|
||||
|
||||
* 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.
|
||||
|
||||
2018-02-22 DJ Delorie <dj@delorie.com>
|
||||
|
||||
* sysdeps/riscv/tls-macros.h: Do not initialize $gp.
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -17,12 +17,19 @@
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <math.h>
|
||||
#include <math_private.h>
|
||||
#include <libm-alias-float.h>
|
||||
|
||||
float
|
||||
__fmaxf (float x, float y)
|
||||
{
|
||||
asm ("fmax.s %0, %1, %2" : "=f" (x) : "f" (x), "f" (y));
|
||||
return x;
|
||||
float res;
|
||||
|
||||
if (__glibc_unlikely ((_FCLASS (x) | _FCLASS (y)) & _FCLASS_SNAN))
|
||||
return x + y;
|
||||
else
|
||||
asm ("fmax.s %0, %1, %2" : "=f" (res) : "f" (x), "f" (y));
|
||||
|
||||
return res;
|
||||
}
|
||||
libm_alias_float (__fmax, fmax)
|
||||
|
@ -17,12 +17,19 @@
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <math.h>
|
||||
#include <math_private.h>
|
||||
#include <libm-alias-float.h>
|
||||
|
||||
float
|
||||
__fminf (float x, float y)
|
||||
{
|
||||
asm ("fmin.s %0, %1, %2" : "=f" (x) : "f" (x), "f" (y));
|
||||
return x;
|
||||
float res;
|
||||
|
||||
if (__glibc_unlikely ((_FCLASS (x) | _FCLASS (y)) & _FCLASS_SNAN))
|
||||
return x + y;
|
||||
else
|
||||
asm ("fmin.s %0, %1, %2" : "=f" (res) : "f" (x), "f" (y));
|
||||
|
||||
return res;
|
||||
}
|
||||
libm_alias_float (__fmin, fmin)
|
||||
|
Loading…
Reference in New Issue
Block a user