]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/i386/fpu/s_fmaxl.S
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / i386 / fpu / s_fmaxl.S
index cef0fdbb5841fadca6299854d3b3c4d168c0402f..26abf84ade82ad932bc24b109220d857b24bd6a4 100644 (file)
@@ -1,5 +1,5 @@
 /* Compute maximum of two numbers, regarding NaN as missing argument.
-   Copyright (C) 1997 Free Software Foundation, Inc.
+   Copyright (C) 1997-2020 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
 
@@ -15,8 +15,9 @@
 
    You should have received a copy of the GNU Lesser General Public
    License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
+   <https://www.gnu.org/licenses/>.  */
 
+#include <libm-alias-ldouble.h>
 #include <sysdep.h>
 
        .text
@@ -28,7 +29,13 @@ ENTRY(__fmaxl)
 
        andb    $0x45, %ah
        cmpb    $0x01, %ah
-       je      1f              // y == NaN
+       je      2f              // y == NaN
+
+       fxam
+       fnstsw
+       andb    $0x45, %ah
+       cmpb    $0x01, %ah
+       je      3f              // x == NaN
 
        fucom   %st(1)
        fnstsw
@@ -39,5 +46,27 @@ ENTRY(__fmaxl)
 1:     fstp    %st(1)
 
        ret
+
+2:     // st(1) is a NaN; st(0) may or may not be.
+       fxam
+       fnstsw
+       andb    $0x45, %ah
+       cmpb    $0x01, %ah
+       je      4f
+       // st(1) is a NaN; st(0) is not.  Test if st(1) is signaling.
+       testb   $0x40, 23(%esp)
+       jz      4f
+       fstp    %st(1)
+       ret
+
+3:     // st(0) is a NaN; st(1) is not.  Test if st(0) is signaling.
+       testb   $0x40, 11(%esp)
+       jz      4f
+       fstp    %st(0)
+       ret
+
+4:     // Both arguments are NaNs, or one is a signaling NaN.
+       faddp
+       ret
 END(__fmaxl)
-weak_alias (__fmaxl, fmaxl)
+libm_alias_ldouble (__fmax, fmax)