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.6 drochner RCSID("$NetBSD: e_expf.S,v 1.6 2008/06/24 17:27:56 drochner 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.6 drochner 17 1.6 drochner /* 18 1.6 drochner * catch +/-Inf and NaN arguments 19 1.6 drochner */ 20 1.6 drochner movl ARG_FLOAT_ONE,%eax 21 1.6 drochner andl $0x7fffffff,%eax 22 1.6 drochner cmpl $0x7f800000,%eax 23 1.6 drochner jae x_Inf_or_NaN 24 1.6 drochner 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.6 drochner 40 1.6 drochner x_Inf_or_NaN: 41 1.6 drochner /* 42 1.6 drochner * Return 0 if x is -Inf. Otherwise just return x, although the 43 1.6 drochner * C version would return (x + x) (Real Indefinite) if x is a NaN. 44 1.6 drochner */ 45 1.6 drochner movl ARG_FLOAT_ONE,%eax 46 1.6 drochner cmpl $0xff800000,%eax 47 1.6 drochner jne x_not_minus_Inf 48 1.6 drochner fldz 49 1.6 drochner XMM_FLOAT_EPILOGUE 50 1.6 drochner ret 51 1.6 drochner 52 1.6 drochner x_not_minus_Inf: 53 1.6 drochner flds ARG_FLOAT_ONE 54 1.6 drochner XMM_FLOAT_EPILOGUE 55 1.6 drochner ret 56