1/** 2 * This file has no copyright assigned and is placed in the Public Domain. 3 * This file is part of the mingw-w64 runtime package. 4 * No warranty is given; refer to the file DISCLAIMER.PD within this package. 5 */ 6#include <_mingw_mac.h> 7 8 .file "exp2l.S" 9 .text 10#ifdef __x86_64__ 11 .align 8 12#else 13 .align 4 14#endif 15.globl __MINGW_USYMBOL(exp2l) 16 .def __MINGW_USYMBOL(exp2l); .scl 2; .type 32; .endef 17__MINGW_USYMBOL(exp2l): 18#ifdef __x86_64__ 19 fldt (%rdx) 20 fxam /* Is NaN or +-Inf? */ 21 fstsw %ax 22 movb $0x45, %dh 23 andb %ah, %dh 24 cmpb $0x05, %dh 25 je 1f /* Is +-Inf, jump. */ 26 fld %st 27 subq $8, %rsp /* int(x) */ 28 fnstcw 4(%rsp) 29 movzwl 4(%rsp), %eax 30 orb $12, %ah 31 movw %ax, (%rsp) 32 fldcw (%rsp) 33 frndint 34 fldcw 4(%rsp) 35 addq $8, %rsp 36 fsubr %st,%st(1) /* fract(x) */ 37 fxch 38 f2xm1 /* 2^(fract(x)) - 1 */ 39 fld1 40 faddp /* 2^(fract(x)) */ 41 fscale /* e^x */ 42 fstp %st(1) 43 movq %rcx,%rax 44 movq $0,8(%rcx) 45 fstpt (%rcx) 46 ret 47 481: testl $0x200, %eax /* Test sign. */ 49 jz 2f /* If positive, jump. */ 50 fstp %st 51 fldz /* Set result to 0. */ 522: movq %rcx,%rax 53 movq $0,8(%rcx) 54 fstpt (%rcx) 55 ret 56#else 57 fldt 4(%esp) 58/* I added the following ugly construct because exp(+-Inf) resulted 59 in NaN. The ugliness results from the bright minds at Intel. 60 For the i686 the code can be written better. 61 -- drepper@cygnus.com. */ 62 fxam /* Is NaN or +-Inf? */ 63 fstsw %ax 64 movb $0x45, %dh 65 andb %ah, %dh 66 cmpb $0x05, %dh 67 je 1f /* Is +-Inf, jump. */ 68 fld %st 69 subl $8, %esp /* int(x) */ 70 fnstcw 4(%esp) 71 movzwl 4(%esp), %eax 72 orb $12, %ah 73 movw %ax, (%esp) 74 fldcw (%esp) 75 frndint 76 fldcw 4(%esp) 77 addl $8, %esp 78 fsubr %st,%st(1) /* fract(x) */ 79 fxch 80 f2xm1 /* 2^(fract(x)) - 1 */ 81 fld1 82 faddp /* 2^(fract(x)) */ 83 fscale /* e^x */ 84 fstp %st(1) 85 ret 86 871: testl $0x200, %eax /* Test sign. */ 88 jz 2f /* If positive, jump. */ 89 fstp %st 90 fldz /* Set result to 0. */ 912: ret 92#endif 93