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