Home | History | Annotate | Line # | Download | only in i387
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