23
23
.section .rodata.cst8,"aM",@progbits,8
26
ASM_TYPE_DIRECTIVE(one,@object)
28
28
ASM_SIZE_DIRECTIVE(one)
29
ASM_TYPE_DIRECTIVE(limit,@object)
31
ASM_SIZE_DIRECTIVE(limit)
32
ASM_TYPE_DIRECTIVE(p63,@object)
30
p3: .byte 0, 0, 0, 0, 0, 0, 0x20, 0x40
31
ASM_SIZE_DIRECTIVE(p3)
33
33
p63: .byte 0, 0, 0, 0, 0, 0, 0xe0, 0x43
34
34
ASM_SIZE_DIRECTIVE(p63)
35
ASM_TYPE_DIRECTIVE(p64,@object)
36
36
p64: .byte 0, 0, 0, 0, 0, 0, 0xf0, 0x43
37
37
ASM_SIZE_DIRECTIVE(p64)
38
ASM_TYPE_DIRECTIVE(p78,@object)
39
39
p78: .byte 0, 0, 0, 0, 0, 0, 0xd0, 0x44
40
40
ASM_SIZE_DIRECTIVE(p78)
42
pm79: .byte 0, 0, 0, 0, 0, 0, 0, 0x3b
43
ASM_SIZE_DIRECTIVE(pm79)
42
45
.section .rodata.cst16,"aM",@progbits,16
45
ASM_TYPE_DIRECTIVE(infinity,@object)
48
.type infinity,@object
48
51
.byte 0, 0, 0, 0, 0, 0, 0xf0, 0x7f
49
52
ASM_SIZE_DIRECTIVE(infinity)
50
ASM_TYPE_DIRECTIVE(zero,@object)
52
55
ASM_SIZE_DIRECTIVE(zero)
53
ASM_TYPE_DIRECTIVE(minf_mzero,@object)
56
.type minf_mzero,@object
56
59
.byte 0, 0, 0, 0, 0, 0, 0xf0, 0xff
110
113
fistpll -8(%rsp) // y : x
111
114
fildll -8(%rsp) // int(y) : y : x
112
115
fucomip %st(1),%st // y : x
115
/* OK, we have an integer value for y. */
118
// If y has absolute value at most 0x1p-79, then any finite
119
// nonzero x will result in 1. Saturate y to those bounds to
120
// avoid underflow in the calculation of y*log2(x).
121
fldl MO(pm79) // 0x1p-79 : y : x
122
fld %st(1) // y : 0x1p-79 : y : x
123
fabs // |y| : 0x1p-79 : y : x
124
fcomip %st(1), %st // 0x1p-79 : y : x
128
fldl MO(pm79) // 0x1p-79 : x
134
9: /* OK, we have an integer value for y. Unless very small
135
(we use < 8), use the algorithm for real exponent to avoid
136
accumulation of errors. */
137
fldl MO(p3) // 8 : y : x
138
fld %st(1) // y : 8 : y : x
139
fabs // |y| : 8 : y : x
140
fcomip %st(1), %st // 8 : y : x
116
143
mov -8(%rsp),%eax
117
144
mov -4(%rsp),%edx
171
198
fchs // -(1L<<78) : |x|
172
199
.align ALIGNARG(4)
173
200
3: /* y is a real number. */
175
fldl MO(one) // 1.0 : x : y
176
fldl MO(limit) // 0.29 : 1.0 : x : y
177
fld %st(2) // x : 0.29 : 1.0 : x : y
178
fsub %st(2) // x-1 : 0.29 : 1.0 : x : y
179
fabs // |x-1| : 0.29 : 1.0 : x : y
180
fucompp // 1.0 : x : y
185
fsub %st(1) // x-1 : 1.0 : y
186
fyl2xp1 // log2(x) : y
189
7: fyl2x // log2(x) : y
190
8: fmul %st(1) // y*log2(x) : y
191
fst %st(1) // y*log2(x) : y*log2(x)
192
frndint // int(y*log2(x)) : y*log2(x)
193
fsubr %st, %st(1) // int(y*log2(x)) : fract(y*log2(x))
194
fxch // fract(y*log2(x)) : int(y*log2(x))
195
f2xm1 // 2^fract(y*log2(x))-1 : int(y*log2(x))
196
faddl MO(one) // 2^fract(y*log2(x)) : int(y*log2(x))
197
fscale // 2^fract(y*log2(x))*2^int(y*log2(x)) : int(y*log2(x))
198
fstp %st(1) // 2^fract(y*log2(x))*2^int(y*log2(x))
202
cfi_adjust_cfa_offset (40)
204
fstpt (%rsp) // <empty>
206
call HIDDEN_JUMPTARGET (__powl_helper) // <result>
209
cfi_adjust_cfa_offset (-40)
201
212
// x is negative. If y is an odd integer, negate the result.