1 | |
2 | #include <machine/asm.h> |
3 | #include <i386-math-asm.h> |
4 | #include <libm-alias-finite.h> |
5 | |
6 | DEFINE_DBL_MIN |
7 | |
8 | #ifdef PIC |
9 | # define MO(op) op##@GOTOFF(%ecx) |
10 | #else |
11 | # define MO(op) op |
12 | #endif |
13 | |
14 | .text |
15 | /* 10^x = 2^(x * log2(10)) */ |
16 | ENTRY(__ieee754_exp10) |
17 | #ifdef PIC |
18 | LOAD_PIC_REG (cx) |
19 | #endif |
20 | fldl 4(%esp) |
21 | /* I added the following ugly construct because exp(+-Inf) resulted |
22 | in NaN. The ugliness results from the bright minds at Intel. |
23 | For the i686 the code can be written better. |
24 | -- drepper@cygnus.com. */ |
25 | fxam /* Is NaN or +-Inf? */ |
26 | fstsw %ax |
27 | movb $0x45, %dh |
28 | andb %ah, %dh |
29 | cmpb $0x05, %dh |
30 | je 1f /* Is +-Inf, jump. */ |
31 | fldl2t |
32 | fmulp /* x * log2(10) */ |
33 | fld %st |
34 | frndint /* int(x * log2(10)) */ |
35 | fsubr %st,%st(1) /* fract(x * log2(10)) */ |
36 | fxch |
37 | f2xm1 /* 2^(fract(x * log2(10))) - 1 */ |
38 | fld1 |
39 | faddp /* 2^(fract(x * log2(10))) */ |
40 | fscale /* e^x */ |
41 | fstp %st(1) |
42 | DBL_NARROW_EVAL_UFLOW_NONNEG_NAN |
43 | ret |
44 | |
45 | 1: testl $0x200, %eax /* Test sign. */ |
46 | jz 2f /* If positive, jump. */ |
47 | fstp %st |
48 | fldz /* Set result to 0. */ |
49 | 2: ret |
50 | END (__ieee754_exp10) |
51 | libm_alias_finite (__ieee754_exp10, __exp10) |
52 | |