Home | History | Annotate | Line # | Download | only in i387
e_exp.S revision 1.6
      1 /*
      2  * Written by J.T. Conklin <jtc (at) netbsd.org>.
      3  * Public domain.
      4  */
      5 
      6 #include <machine/asm.h>
      7 
      8 RCSID("$NetBSD: e_exp.S,v 1.6 1996/07/03 17:27:34 jtc Exp $")
      9 
     10 /* e^x = 2^(x * log2(e)) */
     11 ENTRY(__ieee754_exp)
     12 	pushl	%ebp
     13 	movl	%esp,%ebp
     14 	subl	$8,%esp
     15 
     16 	fstcw	-12(%ebp)		/* store fpu control word */
     17 	movw	-12(%ebp),%dx
     18 	orw	$0x0180,%dx
     19 	movw	%dx,-16(%ebp)
     20 	fldcw	-16(%ebp)		/* load modfied control word */
     21 
     22 	fldl	8(%ebp)
     23 	fldl2e
     24 	fmulp				/* x * log2(e) */
     25 	fstl	%st(1)
     26 	frndint				/* int(x * log2(e)) */
     27 	fstl	%st(2)
     28 	fsubrp				/* fract(x * log2(e)) */
     29 	f2xm1				/* 2^(fract(x * log2(e))) - 1 */
     30 	fld1
     31 	faddp				/* 2^(fract(x * log2(e))) */
     32 	fscale				/* e^x */
     33 	fstpl	%st(1)
     34 
     35 	fldcw	-12(%ebp)		/* restore original control word */
     36 
     37 	leave
     38 	ret
     39