1/* Compute minimum of two numbers, regarding NaN as missing argument.
2   Copyright (C) 1997-2021 Free Software Foundation, Inc.
3   This file is part of the GNU C Library.
4
5   The GNU C Library is free software; you can redistribute it and/or
6   modify it under the terms of the GNU Lesser General Public
7   License as published by the Free Software Foundation; either
8   version 2.1 of the License, or (at your option) any later version.
9
10   The GNU C Library is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13   Lesser General Public License for more details.
14
15   You should have received a copy of the GNU Lesser General Public
16   License along with the GNU C Library; if not, see
17   <https://www.gnu.org/licenses/>.  */
18
19#include <libm-alias-ldouble.h>
20#include <sysdep.h>
21
22	.text
23ENTRY(__fminl)
24	fldt	16(%esp)	// y
25	fxam
26	fnstsw
27	fldt	4(%esp)		// y : x
28
29	andb	$0x45, %ah
30	cmpb	$0x01, %ah
31	je	2f		// y == NaN
32
33	fxam
34	fnstsw
35	andb	$0x45, %ah
36	cmpb	$0x01, %ah
37	je	3f		// x == NaN
38
39	fucom	%st(1)
40	fnstsw
41	sahf
42	jc	1f
43
44	fxch	%st(1)
451:	fstp	%st(1)
46
47	ret
48
492:	// st(1) is a NaN; st(0) may or may not be.
50	fxam
51	fnstsw
52	andb	$0x45, %ah
53	cmpb	$0x01, %ah
54	je	4f
55	// st(1) is a NaN; st(0) is not.  Test if st(1) is signaling.
56	testb	$0x40, 23(%esp)
57	jz	4f
58	fstp	%st(1)
59	ret
60
613:	// st(0) is a NaN; st(1) is not.  Test if st(0) is signaling.
62	testb	$0x40, 11(%esp)
63	jz	4f
64	fstp	%st(0)
65	ret
66
674:	// Both arguments are NaNs, or one is a signaling NaN.
68	faddp
69	ret
70END(__fminl)
71libm_alias_ldouble (__fmin, fmin)
72