Blame sysdeps/i386/fpu/e_exp10.S

Packit 6c4009
/*
Packit 6c4009
 * Written by Ulrich Drepper <drepper@cygnus.com>.
Packit 6c4009
 */
Packit 6c4009
Packit 6c4009
#include <machine/asm.h>
Packit 6c4009
#include <i386-math-asm.h>
Packit 6c4009
Packit 6c4009
DEFINE_DBL_MIN
Packit 6c4009
Packit 6c4009
#ifdef PIC
Packit 6c4009
# define MO(op) op##@GOTOFF(%ecx)
Packit 6c4009
#else
Packit 6c4009
# define MO(op) op
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
	.text
Packit 6c4009
/* 10^x = 2^(x * log2(10)) */
Packit 6c4009
ENTRY(__ieee754_exp10)
Packit 6c4009
#ifdef  PIC
Packit 6c4009
	LOAD_PIC_REG (cx)
Packit 6c4009
#endif
Packit 6c4009
	fldl	4(%esp)
Packit 6c4009
/* I added the following ugly construct because exp(+-Inf) resulted
Packit 6c4009
   in NaN.  The ugliness results from the bright minds at Intel.
Packit 6c4009
   For the i686 the code can be written better.
Packit 6c4009
   -- drepper@cygnus.com.  */
Packit 6c4009
	fxam				/* Is NaN or +-Inf?  */
Packit 6c4009
	fstsw	%ax
Packit 6c4009
	movb	$0x45, %dh
Packit 6c4009
	andb	%ah, %dh
Packit 6c4009
	cmpb	$0x05, %dh
Packit 6c4009
	je	1f			/* Is +-Inf, jump.  */
Packit 6c4009
	fldl2t
Packit 6c4009
	fmulp				/* x * log2(10) */
Packit 6c4009
	fld	%st
Packit 6c4009
	frndint				/* int(x * log2(10)) */
Packit 6c4009
	fsubr	%st,%st(1)		/* fract(x * log2(10)) */
Packit 6c4009
	fxch
Packit 6c4009
	f2xm1				/* 2^(fract(x * log2(10))) - 1 */
Packit 6c4009
	fld1
Packit 6c4009
	faddp				/* 2^(fract(x * log2(10))) */
Packit 6c4009
	fscale				/* e^x */
Packit 6c4009
	fstp	%st(1)
Packit 6c4009
	DBL_NARROW_EVAL_UFLOW_NONNEG_NAN
Packit 6c4009
	ret
Packit 6c4009
Packit 6c4009
1:	testl	$0x200, %eax		/* Test sign.  */
Packit 6c4009
	jz	2f			/* If positive, jump.  */
Packit 6c4009
	fstp	%st
Packit 6c4009
	fldz				/* Set result to 0.  */
Packit 6c4009
2:	ret
Packit 6c4009
END (__ieee754_exp10)
Packit 6c4009
strong_alias (__ieee754_exp10, __exp10_finite)