From 90f0ac10a74b2d43b5a65aab4be40565e359be43 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Tue, 28 Sep 2021 23:31:35 +0000 Subject: Add fmaximum, fminimum functions C2X adds new functions for floating-point maximum and minimum, corresponding to the new operations that were added in IEEE 754-2019 because of concerns about the old operations not being associative in the presence of signaling NaNs. fmaximum and fminimum handle NaNs like most functions (any NaN argument means the result is a quiet NaN). fmaximum_num and fminimum_num handle both quiet and signaling NaNs the way fmax and fmin handle quiet NaNs (if one argument is a number and the other is a NaN, return the number), but still raise "invalid" for a signaling NaN argument, making them exceptions to the normal rule that a function with a floating-point result raising "invalid" also returns a quiet NaN. fmaximum_mag, fminimum_mag, fmaximum_mag_num and fminimum_mag_num are corresponding functions returning the argument with greatest or least absolute value. All these functions also treat +0 as greater than -0. There are also corresponding type-generic macros. Add these functions to glibc. The implementations use type-generic templates based on those for fmax, fmin, fmaxmag and fminmag, and test inputs are based on those for those functions with appropriate adjustments to the expected results. The RISC-V maintainers might wish to add optimized versions of fmaximum_num and fminimum_num (for float and double), since RISC-V (F extension version 2.2 and later) provides instructions corresponding to those functions - though it might be at least as useful to add architecture-independent built-in functions to GCC and teach the RISC-V back end to expand those functions inline, which is what you generally want for functions that can be implemented with a single instruction. Tested for x86_64 and x86, and with build-many-glibcs.py. --- sysdeps/ieee754/ldbl-opt/Makefile | 12 ++++++++++- sysdeps/ieee754/ldbl-opt/nldbl-fmaximum.c | 26 +++++++++++++++++++++++ sysdeps/ieee754/ldbl-opt/nldbl-fmaximum_mag.c | 26 +++++++++++++++++++++++ sysdeps/ieee754/ldbl-opt/nldbl-fmaximum_mag_num.c | 26 +++++++++++++++++++++++ sysdeps/ieee754/ldbl-opt/nldbl-fmaximum_num.c | 26 +++++++++++++++++++++++ sysdeps/ieee754/ldbl-opt/nldbl-fminimum.c | 26 +++++++++++++++++++++++ sysdeps/ieee754/ldbl-opt/nldbl-fminimum_mag.c | 26 +++++++++++++++++++++++ sysdeps/ieee754/ldbl-opt/nldbl-fminimum_mag_num.c | 26 +++++++++++++++++++++++ sysdeps/ieee754/ldbl-opt/nldbl-fminimum_num.c | 26 +++++++++++++++++++++++ 9 files changed, 219 insertions(+), 1 deletion(-) create mode 100644 sysdeps/ieee754/ldbl-opt/nldbl-fmaximum.c create mode 100644 sysdeps/ieee754/ldbl-opt/nldbl-fmaximum_mag.c create mode 100644 sysdeps/ieee754/ldbl-opt/nldbl-fmaximum_mag_num.c create mode 100644 sysdeps/ieee754/ldbl-opt/nldbl-fmaximum_num.c create mode 100644 sysdeps/ieee754/ldbl-opt/nldbl-fminimum.c create mode 100644 sysdeps/ieee754/ldbl-opt/nldbl-fminimum_mag.c create mode 100644 sysdeps/ieee754/ldbl-opt/nldbl-fminimum_mag_num.c create mode 100644 sysdeps/ieee754/ldbl-opt/nldbl-fminimum_num.c (limited to 'sysdeps/ieee754/ldbl-opt') diff --git a/sysdeps/ieee754/ldbl-opt/Makefile b/sysdeps/ieee754/ldbl-opt/Makefile index 6b21680033..1d01846476 100644 --- a/sysdeps/ieee754/ldbl-opt/Makefile +++ b/sysdeps/ieee754/ldbl-opt/Makefile @@ -45,7 +45,9 @@ libnldbl-calls = asprintf dprintf fprintf fscanf fwprintf fwscanf iovfscanf \ nextup nextdown totalorder totalordermag getpayload \ canonicalize setpayload setpayloadsig llogb fmaxmag fminmag \ roundeven fromfp ufromfp fromfpx ufromfpx fadd dadd \ - fdiv ddiv ffma dfma fmul dmul fsqrt dsqrt fsub dsub + fdiv ddiv ffma dfma fmul dmul fsqrt dsqrt fsub dsub \ + fmaximum fmaximum_mag fmaximum_num fmaximum_mag_num \ + fminimum fminimum_mag fminimum_num fminimum_mag_num libnldbl-routines = $(libnldbl-calls:%=nldbl-%) libnldbl-inhibit-o = $(object-suffixes) libnldbl-static-only-routines = $(libnldbl-routines) @@ -108,8 +110,16 @@ CFLAGS-nldbl-finite.c = -fno-builtin-finitel CFLAGS-nldbl-floor.c = -fno-builtin-floorl CFLAGS-nldbl-fma.c = -fno-builtin-fmal CFLAGS-nldbl-fmax.c = -fno-builtin-fmaxl +CFLAGS-nldbl-fmaximum.c += -fno-builtin-fmaximuml +CFLAGS-nldbl-fmaximum_mag.c += -fno-builtin-fmaximum_magl +CFLAGS-nldbl-fmaximum_mag_num.c += -fno-builtin-fmaximum_mag_numl +CFLAGS-nldbl-fmaximum_num.c += -fno-builtin-fmaximum_numl CFLAGS-nldbl-fmaxmag.c = -fno-builtin-fmaxmagl CFLAGS-nldbl-fmin.c = -fno-builtin-fminl +CFLAGS-nldbl-fminimum.c += -fno-builtin-fminimuml +CFLAGS-nldbl-fminimum_mag.c += -fno-builtin-fminimum_magl +CFLAGS-nldbl-fminimum_mag_num.c += -fno-builtin-fminimum_mag_numl +CFLAGS-nldbl-fminimum_num.c += -fno-builtin-fminimum_numl CFLAGS-nldbl-fminmag.c = -fno-builtin-fminmagl CFLAGS-nldbl-fmod.c = -fno-builtin-fmodl CFLAGS-nldbl-fmul.c = -fno-builtin-fmull diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-fmaximum.c b/sysdeps/ieee754/ldbl-opt/nldbl-fmaximum.c new file mode 100644 index 0000000000..f26de00184 --- /dev/null +++ b/sysdeps/ieee754/ldbl-opt/nldbl-fmaximum.c @@ -0,0 +1,26 @@ +/* Compatibility routine for IEEE double as long double for fmaximum. + Copyright (C) 2021 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 + . */ + +#include "nldbl-compat.h" + +double +attribute_hidden +fmaximuml (double x, double y) +{ + return fmaximum (x, y); +} diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-fmaximum_mag.c b/sysdeps/ieee754/ldbl-opt/nldbl-fmaximum_mag.c new file mode 100644 index 0000000000..5c6f9e6fbb --- /dev/null +++ b/sysdeps/ieee754/ldbl-opt/nldbl-fmaximum_mag.c @@ -0,0 +1,26 @@ +/* Compatibility routine for IEEE double as long double for fmaximum_mag. + Copyright (C) 2021 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 + . */ + +#include "nldbl-compat.h" + +double +attribute_hidden +fmaximum_magl (double x, double y) +{ + return fmaximum_mag (x, y); +} diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-fmaximum_mag_num.c b/sysdeps/ieee754/ldbl-opt/nldbl-fmaximum_mag_num.c new file mode 100644 index 0000000000..66c84e3ec0 --- /dev/null +++ b/sysdeps/ieee754/ldbl-opt/nldbl-fmaximum_mag_num.c @@ -0,0 +1,26 @@ +/* Compatibility routine for IEEE double as long double for fmaximum_mag_num. + Copyright (C) 2021 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 + . */ + +#include "nldbl-compat.h" + +double +attribute_hidden +fmaximum_mag_numl (double x, double y) +{ + return fmaximum_mag_num (x, y); +} diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-fmaximum_num.c b/sysdeps/ieee754/ldbl-opt/nldbl-fmaximum_num.c new file mode 100644 index 0000000000..72fba4a477 --- /dev/null +++ b/sysdeps/ieee754/ldbl-opt/nldbl-fmaximum_num.c @@ -0,0 +1,26 @@ +/* Compatibility routine for IEEE double as long double for fmaximum_num. + Copyright (C) 2021 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 + . */ + +#include "nldbl-compat.h" + +double +attribute_hidden +fmaximum_numl (double x, double y) +{ + return fmaximum_num (x, y); +} diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-fminimum.c b/sysdeps/ieee754/ldbl-opt/nldbl-fminimum.c new file mode 100644 index 0000000000..9247a814fe --- /dev/null +++ b/sysdeps/ieee754/ldbl-opt/nldbl-fminimum.c @@ -0,0 +1,26 @@ +/* Compatibility routine for IEEE double as long double for fminimum. + Copyright (C) 2021 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 + . */ + +#include "nldbl-compat.h" + +double +attribute_hidden +fminimuml (double x, double y) +{ + return fminimum (x, y); +} diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-fminimum_mag.c b/sysdeps/ieee754/ldbl-opt/nldbl-fminimum_mag.c new file mode 100644 index 0000000000..175f6d7d92 --- /dev/null +++ b/sysdeps/ieee754/ldbl-opt/nldbl-fminimum_mag.c @@ -0,0 +1,26 @@ +/* Compatibility routine for IEEE double as long double for fminimum_mag. + Copyright (C) 2021 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 + . */ + +#include "nldbl-compat.h" + +double +attribute_hidden +fminimum_magl (double x, double y) +{ + return fminimum_mag (x, y); +} diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-fminimum_mag_num.c b/sysdeps/ieee754/ldbl-opt/nldbl-fminimum_mag_num.c new file mode 100644 index 0000000000..b37b4a5e68 --- /dev/null +++ b/sysdeps/ieee754/ldbl-opt/nldbl-fminimum_mag_num.c @@ -0,0 +1,26 @@ +/* Compatibility routine for IEEE double as long double for fminimum_mag_num. + Copyright (C) 2021 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 + . */ + +#include "nldbl-compat.h" + +double +attribute_hidden +fminimum_mag_numl (double x, double y) +{ + return fminimum_mag_num (x, y); +} diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-fminimum_num.c b/sysdeps/ieee754/ldbl-opt/nldbl-fminimum_num.c new file mode 100644 index 0000000000..2cbd5a8188 --- /dev/null +++ b/sysdeps/ieee754/ldbl-opt/nldbl-fminimum_num.c @@ -0,0 +1,26 @@ +/* Compatibility routine for IEEE double as long double for fminimum_num. + Copyright (C) 2021 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 + . */ + +#include "nldbl-compat.h" + +double +attribute_hidden +fminimum_numl (double x, double y) +{ + return fminimum_num (x, y); +} -- cgit 1.4.1