Update.
[glibc.git] / sysdeps / libm-i387 / s_exp2.S
blob778c0c0eb6538f4595d2df15cf7eac45a6400124
1 /*
2  * Written by J.T. Conklin <jtc@netbsd.org>.
3  * Adapted for exp2 by Ulrich Drepper <drepper@cygnus.com>.
4  * Public domain.
5  */
7 #include <machine/asm.h>
9 ENTRY(__ieee754_exp2)
10         fldl    4(%esp)
11 /* I added the following ugly construct because exp(+-Inf) resulted
12    in NaN.  The ugliness results from the bright minds at Intel.
13    For the i686 the code can be written better.
14    -- drepper@cygnus.com.  */
15         fxam                            /* Is NaN or +-Inf?  */
16         fstsw   %ax
17         movb    $0x45, %dh
18         andb    %ah, %dh
19         cmpb    $0x05, %dh
20         je      1f                      /* Is +-Inf, jump.  */
21         fld     %st
22         frndint                         /* int(x) */
23         fsubr   %st,%st(1)              /* fract(x) */
24         fxch
25         f2xm1                           /* 2^(fract(x)) - 1 */
26         fld1
27         faddp                           /* 2^(fract(x)) */
28         fscale                          /* e^x */
29         fstp    %st(1)
30         ret
32 1:      testl   $0x200, %eax            /* Test sign.  */
33         jz      2f                      /* If positive, jump.  */
34         fstp    %st
35         fldz                            /* Set result to 0.  */
36 2:      ret
37 END (__ieee754_exp2)