Re: [PATCH 2/5] riscv: Optimize fmaximum and fminimum
Adhemerval Zanella Netto <[email protected]> Thu, 6 Aug 2026 15:58:14 -0300
| Newsgroups | gmane.comp.lib.glibc.alpha |
|---|---|
| Organization | Linaro |
| Message-ID | <[email protected]> |
On 06/08/26 07:25, Julian Zhu wrote: > Add RISC-V float and double implementations for the NaN-propagating C23 maximum and minimum operations. Handle NaN inputs explicitly, then use fmax or fmin for ordered operands. > > Signed-off-by: Julian Zhu <[email protected]> Can't you just USE_FMAX_BUILTIN/USE_FMAXF_BUILTIN on RISC-V instead? Since a95db490b5acefda5dbb2ffbb1523af6b2d47dfa and with builtin available, the code is essentially the same. It should be something like since gcc has it for some time [1]: #if __GNUC_PREREQ (13, 0) # define USE_FMAX_BUILTIN 1 # define USE_FMAXF_BUILTIN 1 #else # define USE_FMAX_BUILTIN 0 # define USE_FMAXF_BUILTIN 0 #endif #define USE_FMAXL_BUILTIN 0 #define USE_FMAXF128_BUILTIN 0 [1] https://gcc.gnu.org/pipermail/gcc-patches/2022-May/594468.html > --- > sysdeps/riscv/rvd/s_fmaximum.c | 37 +++++++++++++++++++++++++++++++++ > sysdeps/riscv/rvd/s_fminimum.c | 37 +++++++++++++++++++++++++++++++++ > sysdeps/riscv/rvf/s_fmaximumf.c | 34 ++++++++++++++++++++++++++++++ > sysdeps/riscv/rvf/s_fminimumf.c | 34 ++++++++++++++++++++++++++++++ > 4 files changed, 142 insertions(+) > create mode 100644 sysdeps/riscv/rvd/s_fmaximum.c > create mode 100644 sysdeps/riscv/rvd/s_fminimum.c > create mode 100644 sysdeps/riscv/rvf/s_fmaximumf.c > create mode 100644 sysdeps/riscv/rvf/s_fminimumf.c > > diff --git a/sysdeps/riscv/rvd/s_fmaximum.c b/sysdeps/riscv/rvd/s_fmaximum.c > new file mode 100644 > index 0000000000..d514fb17a6 > --- /dev/null > +++ b/sysdeps/riscv/rvd/s_fmaximum.c > @@ -0,0 +1,37 @@ > +/* fmaximum(). RISC-V version. > + Copyright (C) 2026 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library. If not, see > + <https://www.gnu.org/licenses/>. */ > + > +#include <math.h> > +#include <libm-alias-double.h> > + > +/* fmaximum is the IEEE 754-2019 maximum operation: like fmaximum_num but > + NaN-propagating, so a NaN operand yields a quiet NaN result (and a > + signaling NaN also raises the invalid exception). RISC-V's fmax.d gives > + the correct result whenever neither operand is NaN, so only the NaN case > + needs to be handled explicitly. */ > + > +double > +__fmaximum (double x, double y) > +{ > + double res; > + if (__glibc_unlikely (isunordered (x, y))) > + return x + y; > + asm ("fmax.d %0, %1, %2" : "=f" (res) : "f" (x), "f" (y)); > + return res; > +} > +libm_alias_double (__fmaximum, fmaximum) > diff --git a/sysdeps/riscv/rvd/s_fminimum.c b/sysdeps/riscv/rvd/s_fminimum.c > new file mode 100644 > index 0000000000..608b37bed5 > --- /dev/null > +++ b/sysdeps/riscv/rvd/s_fminimum.c > @@ -0,0 +1,37 @@ > +/* fminimum(). RISC-V version. > + Copyright (C) 2026 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library. If not, see > + <https://www.gnu.org/licenses/>. */ > + > +#include <math.h> > +#include <libm-alias-double.h> > + > +/* fminimum is the IEEE 754-2019 minimum operation: like fminimum_num but > + NaN-propagating, so a NaN operand yields a quiet NaN result (and a > + signaling NaN also raises the invalid exception). RISC-V's fmin.d gives > + the correct result whenever neither operand is NaN, so only the NaN case > + needs to be handled explicitly. */ > + > +double > +__fminimum (double x, double y) > +{ > + double res; > + if (__glibc_unlikely (isunordered (x, y))) > + return x + y; > + asm ("fmin.d %0, %1, %2" : "=f" (res) : "f" (x), "f" (y)); > + return res; > +} > +libm_alias_double (__fminimum, fminimum) > diff --git a/sysdeps/riscv/rvf/s_fmaximumf.c b/sysdeps/riscv/rvf/s_fmaximumf.c > new file mode 100644 > index 0000000000..daa71f0f34 > --- /dev/null > +++ b/sysdeps/riscv/rvf/s_fmaximumf.c > @@ -0,0 +1,34 @@ > +/* fmaximumf(). RISC-V version. > + Copyright (C) 2026 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library. If not, see > + <https://www.gnu.org/licenses/>. */ > + > +#include <math.h> > +#include <libm-alias-float.h> > + > +/* See s_fmaximum.c for a description of the semantics. RISC-V's fmax.s > + handles the ordered case, so only NaNs need explicit handling. */ > + > +float > +__fmaximumf (float x, float y) > +{ > + float res; > + if (__glibc_unlikely (isunordered (x, y))) > + return x + y; > + asm ("fmax.s %0, %1, %2" : "=f" (res) : "f" (x), "f" (y)); > + return res; > +} > +libm_alias_float (__fmaximum, fmaximum) > diff --git a/sysdeps/riscv/rvf/s_fminimumf.c b/sysdeps/riscv/rvf/s_fminimumf.c > new file mode 100644 > index 0000000000..2dba5412f8 > --- /dev/null > +++ b/sysdeps/riscv/rvf/s_fminimumf.c > @@ -0,0 +1,34 @@ > +/* fminimumf(). RISC-V version. > + Copyright (C) 2026 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library. If not, see > + <https://www.gnu.org/licenses/>. */ > + > +#include <math.h> > +#include <libm-alias-float.h> > + > +/* See s_fminimum.c for a description of the semantics. RISC-V's fmin.s > + handles the ordered case, so only NaNs need explicit handling. */ > + > +float > +__fminimumf (float x, float y) > +{ > + float res; > + if (__glibc_unlikely (isunordered (x, y))) > + return x + y; > + asm ("fmin.s %0, %1, %2" : "=f" (res) : "f" (x), "f" (y)); > + return res; > +} > +libm_alias_float (__fminimum, fminimum)