1/* 2 * Public domain. 3 */ 4 5#include <machine/asm.h> 6#include <x86_64-math-asm.h> 7#include <libm-alias-finite.h> 8 9DEFINE_LDBL_MIN 10 11#ifdef PIC 12# define MO(op) op##(%rip) 13#else 14# define MO(op) op 15#endif 16 17 .text 18ENTRY(__ieee754_exp2l) 19 fldt 8(%rsp) 20/* I added the following ugly construct because exp(+-Inf) resulted 21 in NaN. The ugliness results from the bright minds at Intel. 22 For the i686 the code can be written better. 23 -- drepper@cygnus.com. */ 24 fxam /* Is NaN or +-Inf? */ 25 fstsw %ax 26 movb $0x45, %dh 27 andb %ah, %dh 28 cmpb $0x05, %dh 29 je 1f /* Is +-Inf, jump. */ 30 movzwl 8+8(%rsp), %eax 31 andl $0x7fff, %eax 32 cmpl $0x3fbe, %eax 33 jge 3f 34 /* Argument's exponent below -65, result rounds to 1. */ 35 fld1 36 faddp 37 ret 383: fld %st 39 frndint /* int(x) */ 40 fsubr %st,%st(1) /* fract(x) */ 41 fxch 42 f2xm1 /* 2^(fract(x)) - 1 */ 43 fld1 44 faddp /* 2^(fract(x)) */ 45 fscale /* e^x */ 46 fstp %st(1) 47 LDBL_CHECK_FORCE_UFLOW_NONNEG_NAN 48 ret 49 501: testl $0x200, %eax /* Test sign. */ 51 jz 2f /* If positive, jump. */ 52 fstp %st 53 fldz /* Set result to 0. */ 542: ret 55END (__ieee754_exp2l) 56libm_alias_finite (__ieee754_exp2l, __exp2l) 57