this repo has no description
1/*
2 * e_minmax.s
3 * LibmV5
4 *
5 * Created by Ian Ollmann on 8/19/05.
6 * Copyright 2005 Apple Computer. All rights reserved.
7 *
8 */
9
10#include <machine/asm.h>
11#include "abi.h"
12
13// long double fminl( long double a, long double b )
14ENTRY( fminl )
15 fldt FIRST_ARG_OFFSET(STACKP) // {a}
16 fldt SECOND_ARG_OFFSET(STACKP) // {b,a}
17 fucomi %ST(0), %ST // test b is NaN
18 fcmovu %ST(1), %ST(0) // if( b is NaN) b = a
19 fucomi %ST(1), %ST // b > a
20 fcmovnb %ST(1), %ST(0)
21 fstp %ST(1)
22 ret
23
24// long double fmaxl( long double a, long double b )
25ENTRY( fmaxl )
26 fldt FIRST_ARG_OFFSET(STACKP) // {a}
27 fldt SECOND_ARG_OFFSET(STACKP) // {b,a}
28 fucomi %ST(0), %ST // test b is NaN
29 fcmovu %ST(1), %ST(0) // if( b is NaN) b = a
30 fld %ST(1) // {a, b, a}
31 fucomip %ST(1), %ST // a >= b
32 fcmovnb %ST(1), %ST(0)
33 fstp %ST(1)
34 ret
35
36// long double fdiml( long double a, long double b )
37ENTRY( fdiml )
38 fldz // {0}
39 fldt FIRST_ARG_OFFSET(STACKP) // {a, 0}
40 fldt SECOND_ARG_OFFSET(STACKP) // {b, a, 0}
41 fucomi %ST(1), %ST // {b, a, 0} b >= a and not NaN
42 fcmovnb %ST(2), %ST(0) // {b or 0, a, 0 }
43 fxch // {a, b or 0, 0 }
44 fcmovnb %ST(2), %ST(0) // {a or 0, b or 0, 0 }
45 fsubp // {result, 0 }
46 fstp %ST(1) // {result}
47 ret