From: Adhemerval Zanella Date: Fri, 23 Jan 2026 13:02:18 +0000 (-0300) Subject: x86_64: Remove f{max,min} assembly implementations X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cef254944c5e59f24a53c00dd2cabae59099fa7d;p=thirdparty%2Fglibc.git x86_64: Remove f{max,min} assembly implementations Using recent gcc, the generic implementation generates the same code for normal and subnormal numbers for float/double. For long double, the generic implementations generates slight worse code for the fast-path. With gcc-15: * sysdeps/x86_64/fpu/s_fmaxl.S fldt 8(%rsp) fldt 24(%rsp) fucomi %st(1), %st jp 2f fcmovb %st(1), %st fstp %st(1) ret * generic fldt 0x8(%rsp) fldt 0x18(%rsp) fucomi %st(1),%st jp 18 <__fmaxl+0x18> fxch %st(1) fcomi %st(1),%st fcmovbe %st(1),%st fstp %st(1) ret It could be optimized by using isgreater instead of a direct comparison for the non unordered, but this prevents x86 to issue maxsd. Checked on x86_64-linux-gnu. Reviewed-by: Wilco Dijkstra --- diff --git a/sysdeps/x86_64/fpu/s_fmax.S b/sysdeps/x86_64/fpu/s_fmax.S deleted file mode 100644 index e86701c86a..0000000000 --- a/sysdeps/x86_64/fpu/s_fmax.S +++ /dev/null @@ -1,52 +0,0 @@ -/* Compute maximum of two numbers, regarding NaN as missing argument. - Copyright (C) 2002-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 - . */ - -#include -#include - - .text -ENTRY(__fmax) - ucomisd %xmm0, %xmm1 - jp 1f // jump if unordered - maxsd %xmm1, %xmm0 - jmp 2f - -1: ucomisd %xmm1, %xmm1 // Is xmm1 a NaN? - jp 3f - // xmm0 is a NaN; xmm1 is not. Test if xmm0 is signaling. - movsd %xmm0, -8(%rsp) - testb $0x8, -2(%rsp) - jz 4f - movsd %xmm1, %xmm0 // otherwise return xmm1 - ret - -3: // xmm1 is a NaN; xmm0 may or may not be. - ucomisd %xmm0, %xmm0 - jp 4f - // xmm1 is a NaN; xmm0 is not. Test if xmm1 is signaling. - movsd %xmm1, -8(%rsp) - testb $0x8, -2(%rsp) - jz 4f - ret - -4: // Both arguments are NaNs, or one is a signaling NaN. - addsd %xmm1, %xmm0 - -2: ret -END(__fmax) -libm_alias_double (__fmax, fmax) diff --git a/sysdeps/x86_64/fpu/s_fmaxf.S b/sysdeps/x86_64/fpu/s_fmaxf.S deleted file mode 100644 index ebb61a922e..0000000000 --- a/sysdeps/x86_64/fpu/s_fmaxf.S +++ /dev/null @@ -1,52 +0,0 @@ -/* Compute maximum of two numbers, regarding NaN as missing argument. - Copyright (C) 2002-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 - . */ - -#include -#include - - .text -ENTRY(__fmaxf) - ucomiss %xmm0, %xmm1 - jp 1f // jump if unordered - maxss %xmm1, %xmm0 - jmp 2f - -1: ucomiss %xmm1, %xmm1 // Is xmm1 a NaN? - jp 3f - // xmm0 is a NaN; xmm1 is not. Test if xmm0 is signaling. - movss %xmm0, -4(%rsp) - testb $0x40, -2(%rsp) - jz 4f - movss %xmm1, %xmm0 // otherwise return xmm1 - ret - -3: // xmm1 is a NaN; xmm0 may or may not be. - ucomiss %xmm0, %xmm0 - jp 4f - // xmm1 is a NaN; xmm0 is not. Test if xmm1 is signaling. - movss %xmm1, -4(%rsp) - testb $0x40, -2(%rsp) - jz 4f - ret - -4: // Both arguments are NaNs, or one is a signaling NaN. - addss %xmm1, %xmm0 - -2: ret -END(__fmaxf) -libm_alias_float (__fmax, fmax) diff --git a/sysdeps/x86_64/fpu/s_fmaxl.S b/sysdeps/x86_64/fpu/s_fmaxl.S deleted file mode 100644 index 2bba9d24c1..0000000000 --- a/sysdeps/x86_64/fpu/s_fmaxl.S +++ /dev/null @@ -1,58 +0,0 @@ -/* Compute maximum of two numbers, regarding NaN as missing argument. - Copyright (C) 1997-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 - . */ - -#include -#include - - .text -ENTRY(__fmaxl) - fldt 8(%rsp) // x - fldt 24(%rsp) // x : y - - fucomi %st(1), %st - jp 2f - fcmovb %st(1), %st - - fstp %st(1) - - ret - -2: // Unordered. - fucomi %st(0), %st - jp 3f - // st(1) is a NaN; st(0) is not. Test if st(1) is signaling. - testb $0x40, 15(%rsp) - jz 4f - fstp %st(1) - ret - -3: // st(0) is a NaN; st(1) may or may not be. - fxch - fucomi %st(0), %st - jp 4f - // st(1) is a NaN; st(0) is not. Test if st(1) is signaling. - testb $0x40, 31(%rsp) - jz 4f - fstp %st(1) - ret - -4: // Both arguments are NaNs, or one is a signaling NaN. - faddp - ret -END(__fmaxl) -libm_alias_ldouble (__fmax, fmax) diff --git a/sysdeps/x86_64/fpu/s_fmin.S b/sysdeps/x86_64/fpu/s_fmin.S deleted file mode 100644 index 27409767cc..0000000000 --- a/sysdeps/x86_64/fpu/s_fmin.S +++ /dev/null @@ -1,52 +0,0 @@ -/* Compute minimum of two numbers, regarding NaN as missing argument. - Copyright (C) 2002-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 - . */ - -#include -#include - - .text -ENTRY(__fmin) - ucomisd %xmm0, %xmm1 - jp 1f // jump if unordered - minsd %xmm1, %xmm0 - jmp 2f - -1: ucomisd %xmm1, %xmm1 // Is xmm1 a NaN? - jp 3f - // xmm0 is a NaN; xmm1 is not. Test if xmm0 is signaling. - movsd %xmm0, -8(%rsp) - testb $0x8, -2(%rsp) - jz 4f - movsd %xmm1, %xmm0 // otherwise return xmm1 - ret - -3: // xmm1 is a NaN; xmm0 may or may not be. - ucomisd %xmm0, %xmm0 - jp 4f - // xmm1 is a NaN; xmm0 is not. Test if xmm1 is signaling. - movsd %xmm1, -8(%rsp) - testb $0x8, -2(%rsp) - jz 4f - ret - -4: // Both arguments are NaNs, or one is a signaling NaN. - addsd %xmm1, %xmm0 - -2: ret -END(__fmin) -libm_alias_double (__fmin, fmin) diff --git a/sysdeps/x86_64/fpu/s_fminf.S b/sysdeps/x86_64/fpu/s_fminf.S deleted file mode 100644 index f0c58b78a0..0000000000 --- a/sysdeps/x86_64/fpu/s_fminf.S +++ /dev/null @@ -1,52 +0,0 @@ -/* Compute minimum of two numbers, regarding NaN as missing argument. - Copyright (C) 2002-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 - . */ - -#include -#include - - .text -ENTRY(__fminf) - ucomiss %xmm0, %xmm1 - jp 1f // jump if unordered - minss %xmm1, %xmm0 - jmp 2f - -1: ucomiss %xmm1, %xmm1 // Is xmm1 a NaN? - jp 3f - // xmm0 is a NaN; xmm1 is not. Test if xmm0 is signaling. - movss %xmm0, -4(%rsp) - testb $0x40, -2(%rsp) - jz 4f - movss %xmm1, %xmm0 // otherwise return xmm1 - ret - -3: // xmm1 is a NaN; xmm0 may or may not be. - ucomiss %xmm0, %xmm0 - jp 4f - // xmm1 is a NaN; xmm0 is not. Test if xmm1 is signaling. - movss %xmm1, -4(%rsp) - testb $0x40, -2(%rsp) - jz 4f - ret - -4: // Both arguments are NaNs, or one is a signaling NaN. - addss %xmm1, %xmm0 - -2: ret -END(__fminf) -libm_alias_float (__fmin, fmin) diff --git a/sysdeps/x86_64/fpu/s_fminl.S b/sysdeps/x86_64/fpu/s_fminl.S deleted file mode 100644 index 4712417f39..0000000000 --- a/sysdeps/x86_64/fpu/s_fminl.S +++ /dev/null @@ -1,58 +0,0 @@ -/* Compute minimum of two numbers, regarding NaN as missing argument. - Copyright (C) 1997-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 - . */ - -#include -#include - - .text -ENTRY(__fminl) - fldt 8(%rsp) // x - fldt 24(%rsp) // x : y - - fucomi %st(1), %st - jp 2f - fcmovnb %st(1), %st - - fstp %st(1) - - ret - -2: // Unordered. - fucomi %st(0), %st - jp 3f - // st(1) is a NaN; st(0) is not. Test if st(1) is signaling. - testb $0x40, 15(%rsp) - jz 4f - fstp %st(1) - ret - -3: // st(0) is a NaN; st(1) may or may not be. - fxch - fucomi %st(0), %st - jp 4f - // st(1) is a NaN; st(0) is not. Test if st(1) is signaling. - testb $0x40, 31(%rsp) - jz 4f - fstp %st(1) - ret - -4: // Both arguments are NaNs, or one is a signaling NaN. - faddp - ret -END(__fminl) -libm_alias_ldouble (__fmin, fmin)