e_exp.S revision 1.10 1 1.1 jtc /*
2 1.3 jtc * Written by J.T. Conklin <jtc (at) netbsd.org>.
3 1.3 jtc * Public domain.
4 1.1 jtc */
5 1.1 jtc
6 1.1 jtc #include <machine/asm.h>
7 1.1 jtc
8 1.10 fvdl #include "abi.h"
9 1.10 fvdl
10 1.10 fvdl RCSID("$NetBSD: e_exp.S,v 1.10 2001/06/19 00:26:30 fvdl Exp $")
11 1.2 jtc
12 1.1 jtc /* e^x = 2^(x * log2(e)) */
13 1.1 jtc ENTRY(__ieee754_exp)
14 1.10 fvdl #ifdef __i386__
15 1.6 jtc pushl %ebp
16 1.6 jtc movl %esp,%ebp
17 1.6 jtc subl $8,%esp
18 1.6 jtc
19 1.6 jtc fstcw -12(%ebp) /* store fpu control word */
20 1.6 jtc movw -12(%ebp),%dx
21 1.6 jtc orw $0x0180,%dx
22 1.6 jtc movw %dx,-16(%ebp)
23 1.6 jtc fldcw -16(%ebp) /* load modfied control word */
24 1.10 fvdl fldl 8(%ebp)
25 1.10 fvdl #else
26 1.10 fvdl fstcw -12(%rsp)
27 1.10 fvdl movw -12(%rsp),%dx
28 1.10 fvdl orw $0x0180,%dx
29 1.10 fvdl movw %dx,-16(%rsp)
30 1.10 fvdl fldcw -16(%rsp)
31 1.10 fvdl movsd %xmm0,-8(%rsp)
32 1.10 fvdl fldl -8(%rsp)
33 1.10 fvdl #endif
34 1.6 jtc
35 1.1 jtc fldl2e
36 1.1 jtc fmulp /* x * log2(e) */
37 1.10 fvdl fld %st(0)
38 1.1 jtc frndint /* int(x * log2(e)) */
39 1.7 jtc fxch %st(1)
40 1.7 jtc fsub %st(1),%st /* fract(x * log2(e)) */
41 1.8 simonb f2xm1 /* 2^(fract(x * log2(e))) - 1 */
42 1.1 jtc fld1
43 1.1 jtc faddp /* 2^(fract(x * log2(e))) */
44 1.1 jtc fscale /* e^x */
45 1.10 fvdl fstp %st(1)
46 1.6 jtc
47 1.10 fvdl #ifdef __i386__
48 1.6 jtc fldcw -12(%ebp) /* restore original control word */
49 1.6 jtc leave
50 1.10 fvdl #else
51 1.10 fvdl fstpl -8(%rsp)
52 1.10 fvdl movsd -8(%rsp),%xmm0
53 1.10 fvdl fldcw -12(%rbp)
54 1.10 fvdl #endif
55 1.1 jtc ret
56