Get rid of ASM_TYPE_DIRECTIVE{,_PREFIX}.
[platform/upstream/glibc.git] / sysdeps / i386 / fpu / e_expf.S
1 /*
2  * Written by J.T. Conklin <jtc@netbsd.org>.
3  * Public domain.
4  * Adapted for float type by Ulrich Drepper <drepper@cygnus.com>.
5  */
6
7 #include <machine/asm.h>
8
9
10 /* e^x = 2^(x * log2(e)) */
11 ENTRY(__ieee754_expf)
12         flds    4(%esp)
13 /* I added the following ugly construct because exp(+-Inf) resulted
14    in NaN.  The ugliness results from the bright minds at Intel.
15    For the i686 the code can be written better.
16    -- drepper@cygnus.com.  */
17         fxam                            /* Is NaN or +-Inf?  */
18         fstsw   %ax
19         movb    $0x45, %dh
20         andb    %ah, %dh
21         cmpb    $0x05, %dh
22         je      1f                      /* Is +-Inf, jump.  */
23         fldl2e
24         fmulp                           /* x * log2(e) */
25         fld     %st
26         frndint                         /* int(x * log2(e)) */
27         fsubr   %st,%st(1)              /* fract(x * log2(e)) */
28         fxch
29         f2xm1                           /* 2^(fract(x * log2(e))) - 1 */
30         fld1
31         faddp                           /* 2^(fract(x * log2(e))) */
32         fscale                          /* e^x */
33         fstp    %st(1)
34         ret
35
36 1:      testl   $0x200, %eax            /* Test sign.  */
37         jz      2f                      /* If positive, jump.  */
38         fstp    %st
39         fldz                            /* Set result to 0.  */
40 2:      ret
41 END (__ieee754_expf)
42
43
44 ENTRY(__expf_finite)
45         fldl2e
46         fmuls   4(%esp)                 /* x * log2(e) */
47         fld     %st
48         frndint                         /* int(x * log2(e)) */
49         fsubr   %st,%st(1)              /* fract(x * log2(e)) */
50         fxch
51         f2xm1                           /* 2^(fract(x * log2(e))) - 1 */
52         fld1
53         faddp                           /* 2^(fract(x * log2(e))) */
54         fscale                          /* e^x */
55         fstp    %st(1)
56         ret
57 END(__expf_finite)