xref: /netbsd-src/lib/libm/arch/i387/e_expf.S (revision 3b01aba77a7a698587faaae455bbfe740923c1f5)
1/*
2 * Written by J.T. Conklin <jtc@netbsd.org>.
3 * Public domain.
4 */
5
6#include <machine/asm.h>
7
8#include "abi.h"
9
10
11RCSID("$NetBSD: e_expf.S,v 1.4 2001/06/19 00:26:30 fvdl Exp $")
12
13/* e^x = 2^(x * log2(e)) */
14ENTRY(__ieee754_expf)
15	XMM_ONE_ARG_FLOAT_PROLOGUE
16	flds	ARG_FLOAT_ONE
17	fldl2e
18	fmulp				/* x * log2(e) */
19	fld	%st(0)
20	frndint				/* int(x * log2(e)) */
21	fsubr	%st(0),%st(1)		/* fract(x * log2(e)) */
22	fxch
23	f2xm1				/* 2^(fract(x * log2(e))) - 1 */
24	fld1
25	faddp				/* 2^(fract(x * log2(e))) */
26	fscale				/* e^x */
27	fstp	%st(1)
28	XMM_FLOAT_EPILOGUE
29	ret
30