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