]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/i386/fpu/s_fminl.S
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / i386 / fpu / s_fminl.S
index fb5169b8f22e52f949bd52594de7f534f93baccb..823bdab549e478979ff4ecf0f4320566feec942e 100644 (file)
@@ -1,5 +1,5 @@
 /* Compute minimum of two numbers, regarding NaN as missing argument.
-   Copyright (C) 1997-2016 Free Software Foundation, Inc.
+   Copyright (C) 1997-2019 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#include <libm-alias-ldouble.h>
 #include <sysdep.h>
 
        .text
 ENTRY(__fminl)
-       fldt    4(%esp)         // x
-       fldt    16(%esp)        // x : y
+       fldt    16(%esp)        // y
+       fxam
+       fnstsw
+       fldt    4(%esp)         // y : x
+
+       andb    $0x45, %ah
+       cmpb    $0x01, %ah
+       je      2f              // y == NaN
 
        fxam
        fnstsw
        andb    $0x45, %ah
        cmpb    $0x01, %ah
-       je      1f              // y == NaN
+       je      3f              // x == NaN
 
        fucom   %st(1)
        fnstsw
        sahf
-       jc      2f
+       jc      1f
+
+       fxch    %st(1)
+1:     fstp    %st(1)
+
+       ret
 
-1:     fxch    %st(1)
-2:     fstp    %st(1)
+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(__fminl)
-weak_alias (__fminl, fminl)
+libm_alias_ldouble (__fmin, fmin)