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