]> sourceware.org Git - newlib-cygwin.git/blame - winsup/cygwin/math/exp2.S
powf: Fixed another precision bug in powf() (FreeBSD)
[newlib-cygwin.git] / winsup / cygwin / math / exp2.S
CommitLineData
792e51b7
CV
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 "exp2.S"
9 .text
10#ifdef __x86_64__
11 .align 8
12#else
13 .align 4
14#endif
15.globl __MINGW_USYMBOL(exp2)
16 .def __MINGW_USYMBOL(exp2); .scl 2; .type 32; .endef
17__MINGW_USYMBOL(exp2):
18#ifdef __x86_64__
19 subq $24, %rsp
20 movsd %xmm0,(%rsp)
21 fldl (%rsp)
22 fxam /* Is NaN or +-Inf? */
23 fstsw %ax
24 movb $0x45, %dh
25 andb %ah, %dh
26 cmpb $0x05, %dh
27 je 1f /* Is +-Inf, jump. */
28 fld %st
d2ef2331
CV
29 subq $8, %rsp /* int(x) */
30 fnstcw 4(%rsp)
31 movzwl 4(%rsp), %eax
32 orb $12, %ah
33 movw %ax, (%rsp)
34 fldcw (%rsp)
35 frndint
36 fldcw 4(%rsp)
37 addq $8, %rsp
792e51b7
CV
38 fsubr %st,%st(1) /* fract(x) */
39 fxch
40 f2xm1 /* 2^(fract(x)) - 1 */
41 fld1
42 faddp /* 2^(fract(x)) */
43 fscale /* e^x */
44 fstp %st(1)
45 fstpl (%rsp)
46 movsd (%rsp),%xmm0
47 addq $24, %rsp
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: fstpl (%rsp)
55 movsd (%rsp),%xmm0
56 addq $24,%rsp
57 ret
58#else
59 fldl 4(%esp)
60/* I added the following ugly construct because exp(+-Inf) resulted
61 in NaN. The ugliness results from the bright minds at Intel.
62 For the i686 the code can be written better.
63 -- drepper@cygnus.com. */
64 fxam /* Is NaN or +-Inf? */
65 fstsw %ax
66 movb $0x45, %dh
67 andb %ah, %dh
68 cmpb $0x05, %dh
69 je 1f /* Is +-Inf, jump. */
70 fld %st
71 subl $8, %esp /* int(x) */
72 fnstcw 4(%esp)
73 movzwl 4(%esp), %eax
74 orb $12, %ah
75 movw %ax, (%esp)
76 fldcw (%esp)
77 frndint
78 fldcw 4(%esp)
79 addl $8, %esp
80 fsubr %st,%st(1) /* fract(x) */
81 fxch
82 f2xm1 /* 2^(fract(x)) - 1 */
83 fld1
84 faddp /* 2^(fract(x)) */
85 fscale /* e^x */
86 fstp %st(1)
87 ret
88
891: testl $0x200, %eax /* Test sign. */
90 jz 2f /* If positive, jump. */
91 fstp %st
92 fldz /* Set result to 0. */
932: ret
94#endif
This page took 0.176794 seconds and 5 git commands to generate.