Home | History | Annotate | Line # | Download | only in i387
e_expf.S revision 1.5.32.1
      1       1.1       jtc /*
      2       1.5      salo  * Written by J.T. Conklin <jtc (at) NetBSD.org>.
      3       1.1       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.4      fvdl #include "abi.h"
      9       1.4      fvdl 
     10       1.4      fvdl 
     11  1.5.32.1  wrstuden RCSID("$NetBSD: e_expf.S,v 1.5.32.1 2008/09/18 04:39:23 wrstuden Exp $")
     12       1.1       jtc 
     13       1.1       jtc /* e^x = 2^(x * log2(e)) */
     14       1.1       jtc ENTRY(__ieee754_expf)
     15       1.4      fvdl 	XMM_ONE_ARG_FLOAT_PROLOGUE
     16  1.5.32.1  wrstuden 
     17  1.5.32.1  wrstuden 	/*
     18  1.5.32.1  wrstuden 	 * catch +/-Inf and NaN arguments
     19  1.5.32.1  wrstuden 	 */
     20  1.5.32.1  wrstuden 	movl	ARG_FLOAT_ONE,%eax
     21  1.5.32.1  wrstuden 	andl	$0x7fffffff,%eax
     22  1.5.32.1  wrstuden 	cmpl	$0x7f800000,%eax
     23  1.5.32.1  wrstuden 	jae	x_Inf_or_NaN
     24  1.5.32.1  wrstuden 
     25       1.4      fvdl 	flds	ARG_FLOAT_ONE
     26       1.1       jtc 	fldl2e
     27       1.1       jtc 	fmulp				/* x * log2(e) */
     28       1.4      fvdl 	fld	%st(0)
     29       1.1       jtc 	frndint				/* int(x * log2(e)) */
     30       1.3    kleink 	fsubr	%st(0),%st(1)		/* fract(x * log2(e)) */
     31       1.3    kleink 	fxch
     32       1.2    simonb 	f2xm1				/* 2^(fract(x * log2(e))) - 1 */
     33       1.1       jtc 	fld1
     34       1.1       jtc 	faddp				/* 2^(fract(x * log2(e))) */
     35       1.1       jtc 	fscale				/* e^x */
     36       1.4      fvdl 	fstp	%st(1)
     37       1.4      fvdl 	XMM_FLOAT_EPILOGUE
     38       1.1       jtc 	ret
     39  1.5.32.1  wrstuden 
     40  1.5.32.1  wrstuden x_Inf_or_NaN:
     41  1.5.32.1  wrstuden 	/*
     42  1.5.32.1  wrstuden 	 * Return 0 if x is -Inf.  Otherwise just return x, although the
     43  1.5.32.1  wrstuden 	 * C version would return (x + x) (Real Indefinite) if x is a NaN.
     44  1.5.32.1  wrstuden 	 */
     45  1.5.32.1  wrstuden 	movl	ARG_FLOAT_ONE,%eax
     46  1.5.32.1  wrstuden 	cmpl	$0xff800000,%eax
     47  1.5.32.1  wrstuden 	jne	x_not_minus_Inf
     48  1.5.32.1  wrstuden 	fldz
     49  1.5.32.1  wrstuden 	XMM_FLOAT_EPILOGUE
     50  1.5.32.1  wrstuden 	ret
     51  1.5.32.1  wrstuden 
     52  1.5.32.1  wrstuden x_not_minus_Inf:
     53  1.5.32.1  wrstuden 	flds	ARG_FLOAT_ONE
     54  1.5.32.1  wrstuden 	XMM_FLOAT_EPILOGUE
     55  1.5.32.1  wrstuden 	ret
     56