Text file
src/math/pow_s390x.s
1 // Copyright 2017 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 #include "textflag.h"
6
7 #define PosInf 0x7FF0000000000000
8 #define NaN 0x7FF8000000000001
9 #define NegInf 0xFFF0000000000000
10 #define PosOne 0x3FF0000000000000
11 #define NegOne 0xBFF0000000000000
12 #define NegZero 0x8000000000000000
13
14 // Minimax polynomial approximation
15 DATA ·powrodataL51<> + 0(SB)/8, $-1.0
16 DATA ·powrodataL51<> + 8(SB)/8, $1.0
17 DATA ·powrodataL51<> + 16(SB)/8, $0.24022650695910110361E+00
18 DATA ·powrodataL51<> + 24(SB)/8, $0.69314718055994686185E+00
19 DATA ·powrodataL51<> + 32(SB)/8, $0.96181291057109484809E-02
20 DATA ·powrodataL51<> + 40(SB)/8, $0.15403814778342868389E-03
21 DATA ·powrodataL51<> + 48(SB)/8, $0.55504108652095235601E-01
22 DATA ·powrodataL51<> + 56(SB)/8, $0.13333818813168698658E-02
23 DATA ·powrodataL51<> + 64(SB)/8, $0.68205322933914439200E-12
24 DATA ·powrodataL51<> + 72(SB)/8, $-.18466496523378731640E-01
25 DATA ·powrodataL51<> + 80(SB)/8, $0.19697596291603973706E-02
26 DATA ·powrodataL51<> + 88(SB)/8, $0.23083120654155209200E+00
27 DATA ·powrodataL51<> + 96(SB)/8, $0.55324356012093416771E-06
28 DATA ·powrodataL51<> + 104(SB)/8, $-.40340677224649339048E-05
29 DATA ·powrodataL51<> + 112(SB)/8, $0.30255507904062541562E-04
30 DATA ·powrodataL51<> + 120(SB)/8, $-.77453979912413008787E-07
31 DATA ·powrodataL51<> + 128(SB)/8, $-.23637115549923464737E-03
32 DATA ·powrodataL51<> + 136(SB)/8, $0.11016119077267717198E-07
33 DATA ·powrodataL51<> + 144(SB)/8, $0.22608272174486123035E-09
34 DATA ·powrodataL51<> + 152(SB)/8, $-.15895808101370190382E-08
35 DATA ·powrodataL51<> + 160(SB)/8, $0x4540190000000000
36 GLOBL ·powrodataL51<> + 0(SB), RODATA, $168
37
38 // Constants
39 DATA ·pow_x001a<> + 0(SB)/8, $0x1a000000000000
40 GLOBL ·pow_x001a<> + 0(SB), RODATA, $8
41 DATA ·pow_xinf<> + 0(SB)/8, $0x7ff0000000000000 //+Inf
42 GLOBL ·pow_xinf<> + 0(SB), RODATA, $8
43 DATA ·pow_xnan<> + 0(SB)/8, $0x7ff8000000000000 //NaN
44 GLOBL ·pow_xnan<> + 0(SB), RODATA, $8
45 DATA ·pow_x434<> + 0(SB)/8, $0x4340000000000000
46 GLOBL ·pow_x434<> + 0(SB), RODATA, $8
47 DATA ·pow_x433<> + 0(SB)/8, $0x4330000000000000
48 GLOBL ·pow_x433<> + 0(SB), RODATA, $8
49 DATA ·pow_x43f<> + 0(SB)/8, $0x43f0000000000000
50 GLOBL ·pow_x43f<> + 0(SB), RODATA, $8
51 DATA ·pow_xadd<> + 0(SB)/8, $0xc2f0000100003fef
52 GLOBL ·pow_xadd<> + 0(SB), RODATA, $8
53 DATA ·pow_xa<> + 0(SB)/8, $0x4019000000000000
54 GLOBL ·pow_xa<> + 0(SB), RODATA, $8
55
56 // Scale correction tables
57 DATA powiadd<> + 0(SB)/8, $0xf000000000000000
58 DATA powiadd<> + 8(SB)/8, $0x1000000000000000
59 GLOBL powiadd<> + 0(SB), RODATA, $16
60 DATA powxscale<> + 0(SB)/8, $0x4ff0000000000000
61 DATA powxscale<> + 8(SB)/8, $0x2ff0000000000000
62 GLOBL powxscale<> + 0(SB), RODATA, $16
63
64 // Fractional powers of 2 table
65 DATA ·powtexp<> + 0(SB)/8, $0.442737824274138381E-01
66 DATA ·powtexp<> + 8(SB)/8, $0.263602189790660309E-01
67 DATA ·powtexp<> + 16(SB)/8, $0.122565642281703586E-01
68 DATA ·powtexp<> + 24(SB)/8, $0.143757052860721398E-02
69 DATA ·powtexp<> + 32(SB)/8, $-.651375034121276075E-02
70 DATA ·powtexp<> + 40(SB)/8, $-.119317678849450159E-01
71 DATA ·powtexp<> + 48(SB)/8, $-.150868749549871069E-01
72 DATA ·powtexp<> + 56(SB)/8, $-.161992609578469234E-01
73 DATA ·powtexp<> + 64(SB)/8, $-.154492360403337917E-01
74 DATA ·powtexp<> + 72(SB)/8, $-.129850717389178721E-01
75 DATA ·powtexp<> + 80(SB)/8, $-.892902649276657891E-02
76 DATA ·powtexp<> + 88(SB)/8, $-.338202636596794887E-02
77 DATA ·powtexp<> + 96(SB)/8, $0.357266307045684762E-02
78 DATA ·powtexp<> + 104(SB)/8, $0.118665304327406698E-01
79 DATA ·powtexp<> + 112(SB)/8, $0.214434994118118914E-01
80 DATA ·powtexp<> + 120(SB)/8, $0.322580645161290314E-01
81 GLOBL ·powtexp<> + 0(SB), RODATA, $128
82
83 // Log multiplier tables
84 DATA ·powtl<> + 0(SB)/8, $0xbdf9723a80db6a05
85 DATA ·powtl<> + 8(SB)/8, $0x3e0cfe4a0babe862
86 DATA ·powtl<> + 16(SB)/8, $0xbe163b42dd33dada
87 DATA ·powtl<> + 24(SB)/8, $0xbe0cdf9de2a8429c
88 DATA ·powtl<> + 32(SB)/8, $0xbde9723a80db6a05
89 DATA ·powtl<> + 40(SB)/8, $0xbdb37fcae081745e
90 DATA ·powtl<> + 48(SB)/8, $0xbdd8b2f901ac662c
91 DATA ·powtl<> + 56(SB)/8, $0xbde867dc68c36cc9
92 DATA ·powtl<> + 64(SB)/8, $0xbdd23e36b47256b7
93 DATA ·powtl<> + 72(SB)/8, $0xbde4c9b89fcc7933
94 DATA ·powtl<> + 80(SB)/8, $0xbdd16905cad7cf66
95 DATA ·powtl<> + 88(SB)/8, $0x3ddb417414aa5529
96 DATA ·powtl<> + 96(SB)/8, $0xbdce046f2889983c
97 DATA ·powtl<> + 104(SB)/8, $0x3dc2c3865d072897
98 DATA ·powtl<> + 112(SB)/8, $0x8000000000000000
99 DATA ·powtl<> + 120(SB)/8, $0x3dc1ca48817f8afe
100 DATA ·powtl<> + 128(SB)/8, $0xbdd703518a88bfb7
101 DATA ·powtl<> + 136(SB)/8, $0x3dc64afcc46942ce
102 DATA ·powtl<> + 144(SB)/8, $0xbd9d79191389891a
103 DATA ·powtl<> + 152(SB)/8, $0x3ddd563044da4fa0
104 DATA ·powtl<> + 160(SB)/8, $0x3e0f42b5e5f8f4b6
105 DATA ·powtl<> + 168(SB)/8, $0x3e0dfa2c2cbf6ead
106 DATA ·powtl<> + 176(SB)/8, $0x3e14e25e91661293
107 DATA ·powtl<> + 184(SB)/8, $0x3e0aac461509e20c
108 GLOBL ·powtl<> + 0(SB), RODATA, $192
109
110 DATA ·powtm<> + 0(SB)/8, $0x3da69e13
111 DATA ·powtm<> + 8(SB)/8, $0x100003d66fcb6
112 DATA ·powtm<> + 16(SB)/8, $0x200003d1538df
113 DATA ·powtm<> + 24(SB)/8, $0x300003cab729e
114 DATA ·powtm<> + 32(SB)/8, $0x400003c1a784c
115 DATA ·powtm<> + 40(SB)/8, $0x500003ac9b074
116 DATA ·powtm<> + 48(SB)/8, $0x60000bb498d22
117 DATA ·powtm<> + 56(SB)/8, $0x68000bb8b29a2
118 DATA ·powtm<> + 64(SB)/8, $0x70000bb9a32d4
119 DATA ·powtm<> + 72(SB)/8, $0x74000bb9946bb
120 DATA ·powtm<> + 80(SB)/8, $0x78000bb92e34b
121 DATA ·powtm<> + 88(SB)/8, $0x80000bb6c57dc
122 DATA ·powtm<> + 96(SB)/8, $0x84000bb4020f7
123 DATA ·powtm<> + 104(SB)/8, $0x8c000ba93832d
124 DATA ·powtm<> + 112(SB)/8, $0x9000080000000
125 DATA ·powtm<> + 120(SB)/8, $0x940003aa66c4c
126 DATA ·powtm<> + 128(SB)/8, $0x980003b2fb12a
127 DATA ·powtm<> + 136(SB)/8, $0xa00003bc1def6
128 DATA ·powtm<> + 144(SB)/8, $0xa80003c1eb0eb
129 DATA ·powtm<> + 152(SB)/8, $0xb00003c64dcec
130 DATA ·powtm<> + 160(SB)/8, $0xc00003cc49e4e
131 DATA ·powtm<> + 168(SB)/8, $0xd00003d12f1de
132 DATA ·powtm<> + 176(SB)/8, $0xe00003d4a9c6f
133 DATA ·powtm<> + 184(SB)/8, $0xf00003d846c66
134 GLOBL ·powtm<> + 0(SB), RODATA, $192
135
136 // Table of indices into multiplier tables
137 // Adjusted from asm to remove offset and convert
138 DATA ·powtabi<> + 0(SB)/8, $0x1010101
139 DATA ·powtabi<> + 8(SB)/8, $0x101020202020203
140 DATA ·powtabi<> + 16(SB)/8, $0x303030404040405
141 DATA ·powtabi<> + 24(SB)/8, $0x505050606060708
142 DATA ·powtabi<> + 32(SB)/8, $0x90a0b0c0d0e0f10
143 DATA ·powtabi<> + 40(SB)/8, $0x1011111212121313
144 DATA ·powtabi<> + 48(SB)/8, $0x1314141414151515
145 DATA ·powtabi<> + 56(SB)/8, $0x1516161617171717
146 GLOBL ·powtabi<> + 0(SB), RODATA, $64
147
148 // Pow returns x**y, the base-x exponential of y.
149 //
150 // Special cases are (in order):
151 // Pow(x, ±0) = 1 for any x
152 // Pow(1, y) = 1 for any y
153 // Pow(x, 1) = x for any x
154 // Pow(NaN, y) = NaN
155 // Pow(x, NaN) = NaN
156 // Pow(±0, y) = ±Inf for y an odd integer < 0
157 // Pow(±0, -Inf) = +Inf
158 // Pow(±0, +Inf) = +0
159 // Pow(±0, y) = +Inf for finite y < 0 and not an odd integer
160 // Pow(±0, y) = ±0 for y an odd integer > 0
161 // Pow(±0, y) = +0 for finite y > 0 and not an odd integer
162 // Pow(-1, ±Inf) = 1
163 // Pow(x, +Inf) = +Inf for |x| > 1
164 // Pow(x, -Inf) = +0 for |x| > 1
165 // Pow(x, +Inf) = +0 for |x| < 1
166 // Pow(x, -Inf) = +Inf for |x| < 1
167 // Pow(+Inf, y) = +Inf for y > 0
168 // Pow(+Inf, y) = +0 for y < 0
169 // Pow(-Inf, y) = Pow(-0, -y)
170 // Pow(x, y) = NaN for finite x < 0 and finite non-integer y
171
172 TEXT ·powAsm(SB), NOSPLIT, $0-24
173 // special case
174 MOVD x+0(FP), R1
175 MOVD y+8(FP), R2
176
177 // special case Pow(1, y) = 1 for any y
178 MOVD $PosOne, R3
179 CMPUBEQ R1, R3, xIsOne
180
181 // special case Pow(x, 1) = x for any x
182 MOVD $PosOne, R4
183 CMPUBEQ R2, R4, yIsOne
184
185 // special case Pow(x, NaN) = NaN for any x
186 MOVD $~(1<<63), R5
187 AND R2, R5 // y = |y|
188 MOVD $PosInf, R4
189 CMPUBLT R4, R5, yIsNan
190
191 MOVD $NegInf, R3
192 CMPUBEQ R1, R3, xIsNegInf
193
194 MOVD $NegOne, R3
195 CMPUBEQ R1, R3, xIsNegOne
196
197 MOVD $PosInf, R3
198 CMPUBEQ R1, R3, xIsPosInf
199
200 MOVD $NegZero, R3
201 CMPUBEQ R1, R3, xIsNegZero
202
203 MOVD $PosInf, R4
204 CMPUBEQ R2, R4, yIsPosInf
205
206 MOVD $0x0, R3
207 CMPUBEQ R1, R3, xIsPosZero
208 CMPBLT R1, R3, xLtZero
209 BR Normal
210 xIsPosInf:
211 // special case Pow(+Inf, y) = +Inf for y > 0
212 MOVD $0x0, R4
213 CMPBGT R2, R4, posInfGeZero
214 BR Normal
215 xIsNegInf:
216 //Pow(-Inf, y) = Pow(-0, -y)
217 FMOVD y+8(FP), F2
218 FNEG F2, F2 // y = -y
219 BR negZeroNegY // call Pow(-0, -y)
220 xIsNegOne:
221 // special case Pow(-1, ±Inf) = 1
222 MOVD $PosInf, R4
223 CMPUBEQ R2, R4, negOnePosInf
224 MOVD $NegInf, R4
225 CMPUBEQ R2, R4, negOneNegInf
226 BR Normal
227 xIsPosZero:
228 // special case Pow(+0, -Inf) = +Inf
229 MOVD $NegInf, R4
230 CMPUBEQ R2, R4, zeroNegInf
231
232 // special case Pow(+0, y < 0) = +Inf
233 FMOVD y+8(FP), F2
234 FMOVD $(0.0), F4
235 FCMPU F2, F4
236 BLT posZeroLtZero //y < 0.0
237 BR Normal
238 xIsNegZero:
239 // special case Pow(-0, -Inf) = +Inf
240 MOVD $NegInf, R4
241 CMPUBEQ R2, R4, zeroNegInf
242 FMOVD y+8(FP), F2
243 negZeroNegY:
244 // special case Pow(x, ±0) = 1 for any x
245 FMOVD $(0.0), F4
246 FCMPU F4, F2
247 BLT negZeroGtZero // y > 0.0
248 BEQ yIsZero // y = 0.0
249
250 FMOVD $(-0.0), F4
251 FCMPU F4, F2
252 BLT negZeroGtZero // y > -0.0
253 BEQ yIsZero // y = -0.0
254
255 // special case Pow(-0, y) = -Inf for y an odd integer < 0
256 // special case Pow(-0, y) = +Inf for finite y < 0 and not an odd integer
257 FIDBR $5, F2, F4 //F2 translate to integer F4
258 FCMPU F2, F4
259 BNE zeroNotOdd // y is not an (odd) integer and y < 0
260 FMOVD $(2.0), F4
261 FDIV F4, F2 // F2 = F2 / 2.0
262 FIDBR $5, F2, F4 //F2 translate to integer F4
263 FCMPU F2, F4
264 BNE negZeroOddInt // y is an odd integer and y < 0
265 BR zeroNotOdd // y is not an (odd) integer and y < 0
266
267 negZeroGtZero:
268 // special case Pow(-0, y) = -0 for y an odd integer > 0
269 // special case Pow(±0, y) = +0 for finite y > 0 and not an odd integer
270 FIDBR $5, F2, F4 //F2 translate to integer F4
271 FCMPU F2, F4
272 BNE zeroNotOddGtZero // y is not an (odd) integer and y > 0
273 FMOVD $(2.0), F4
274 FDIV F4, F2 // F2 = F2 / 2.0
275 FIDBR $5, F2, F4 //F2 translate to integer F4
276 FCMPU F2, F4
277 BNE negZeroOddIntGtZero // y is an odd integer and y > 0
278 BR zeroNotOddGtZero // y is not an (odd) integer
279
280 xLtZero:
281 // special case Pow(x, y) = NaN for finite x < 0 and finite non-integer y
282 FMOVD y+8(FP), F2
283 FIDBR $5, F2, F4
284 FCMPU F2, F4
285 BNE ltZeroInt
286 BR Normal
287 yIsPosInf:
288 // special case Pow(x, +Inf) = +Inf for |x| > 1
289 FMOVD x+0(FP), F1
290 FMOVD $(1.0), F3
291 FCMPU F1, F3
292 BGT gtOnePosInf
293 FMOVD $(-1.0), F3
294 FCMPU F1, F3
295 BLT ltNegOnePosInf
296 Normal:
297 FMOVD x+0(FP), F0
298 FMOVD y+8(FP), F2
299 MOVD $·powrodataL51<>+0(SB), R9
300 LGDR F0, R3
301 WORD $0xC0298009 //iilf %r2,2148095317
302 BYTE $0x55
303 BYTE $0x55
304 RISBGNZ $32, $63, $32, R3, R1
305 SUBW R1, R2
306 RISBGNZ $58, $63, $50, R2, R3
307 BYTE $0x18 //lr %r5,%r1
308 BYTE $0x51
309 MOVD $·powtabi<>+0(SB), R12
310 WORD $0xE303C000 //llgc %r0,0(%r3,%r12)
311 BYTE $0x00
312 BYTE $0x90
313 SUBW $0x1A0000, R5
314 SLD $3, R0, R3
315 MOVD $·powtm<>+0(SB), R4
316 MOVH $0x0, R8
317 ANDW $0x7FF00000, R2
318 ORW R5, R1
319 WORD $0x5A234000 //a %r2,0(%r3,%r4)
320 MOVD $0x3FF0000000000000, R5
321 RISBGZ $40, $63, $56, R2, R3
322 RISBGN $0, $31, $32, R2, R8
323 ORW $0x45000000, R3
324 MOVW R1, R6
325 CMPBLT R6, $0, L42
326 FMOVD F0, F4
327 L2:
328 VLVGF $0, R3, V1
329 MOVD $·pow_xa<>+0(SB), R2
330 WORD $0xED3090A0 //lde %f3,.L52-.L51(%r9)
331 BYTE $0x00
332 BYTE $0x24
333 FMOVD 0(R2), F6
334 FSUBS F1, F3
335 LDGR R8, F1
336 WFMSDB V4, V1, V6, V4
337 FMOVD 152(R9), F6
338 WFMDB V4, V4, V7
339 FMOVD 144(R9), F1
340 FMOVD 136(R9), F5
341 WFMADB V4, V1, V6, V1
342 VLEG $0, 128(R9), V16
343 FMOVD 120(R9), F6
344 WFMADB V4, V5, V6, V5
345 FMOVD 112(R9), F6
346 WFMADB V1, V7, V5, V1
347 WFMADB V4, V6, V16, V16
348 SLD $3, R0, R2
349 FMOVD 104(R9), F5
350 WORD $0xED824004 //ldeb %f8,4(%r2,%r4)
351 BYTE $0x00
352 BYTE $0x04
353 LDEBR F3, F3
354 FMOVD 96(R9), F6
355 WFMADB V4, V6, V5, V6
356 FADD F8, F3
357 WFMADB V7, V6, V16, V6
358 FMUL F7, F7
359 FMOVD 88(R9), F5
360 FMADD F7, F1, F6
361 WFMADB V4, V5, V3, V16
362 FMOVD 80(R9), F1
363 WFSDB V16, V3, V3
364 MOVD $·powtl<>+0(SB), R3
365 WFMADB V4, V6, V1, V6
366 FMADD F5, F4, F3
367 FMOVD 72(R9), F1
368 WFMADB V4, V6, V1, V6
369 WORD $0xED323000 //adb %f3,0(%r2,%r3)
370 BYTE $0x00
371 BYTE $0x1A
372 FMOVD 64(R9), F1
373 WFMADB V4, V6, V1, V6
374 MOVD $·pow_xadd<>+0(SB), R2
375 WFMADB V4, V6, V3, V4
376 FMOVD 0(R2), F5
377 WFADB V4, V16, V3
378 VLEG $0, 56(R9), V20
379 WFMSDB V2, V3, V5, V3
380 VLEG $0, 48(R9), V18
381 WFADB V3, V5, V6
382 LGDR F3, R2
383 WFMSDB V2, V16, V6, V16
384 FMOVD 40(R9), F1
385 WFMADB V2, V4, V16, V4
386 FMOVD 32(R9), F7
387 WFMDB V4, V4, V3
388 WFMADB V4, V1, V20, V1
389 WFMADB V4, V7, V18, V7
390 VLEG $0, 24(R9), V16
391 WFMADB V1, V3, V7, V1
392 FMOVD 16(R9), F5
393 WFMADB V4, V5, V16, V5
394 RISBGZ $57, $60, $3, R2, R4
395 WFMADB V3, V1, V5, V1
396 MOVD $·powtexp<>+0(SB), R3
397 WORD $0x68343000 //ld %f3,0(%r4,%r3)
398 FMADD F3, F4, F4
399 RISBGN $0, $15, $48, R2, R5
400 WFMADB V4, V1, V3, V4
401 LGDR F6, R2
402 LDGR R5, F1
403 SRAD $48, R2, R2
404 FMADD F1, F4, F1
405 RLL $16, R2, R2
406 ANDW $0x7FFF0000, R2
407 WORD $0xC22B3F71 //alfi %r2,1064370176
408 BYTE $0x00
409 BYTE $0x00
410 ORW R2, R1, R3
411 MOVW R3, R6
412 CMPBLT R6, $0, L43
413 L1:
414 FMOVD F1, ret+16(FP)
415 RET
416 L43:
417 LTDBR F0, F0
418 BLTU L44
419 FMOVD F0, F3
420 L7:
421 MOVD $·pow_xinf<>+0(SB), R3
422 FMOVD 0(R3), F5
423 WFCEDBS V3, V5, V7
424 BVS L8
425 WFMDB V3, V2, V6
426 L8:
427 WFCEDBS V2, V2, V3
428 BVS L9
429 LTDBR F2, F2
430 BEQ L26
431 MOVW R1, R6
432 CMPBLT R6, $0, L45
433 L11:
434 WORD $0xC0190003 //iilf %r1,262143
435 BYTE $0xFF
436 BYTE $0xFF
437 MOVW R2, R7
438 MOVW R1, R6
439 CMPBLE R7, R6, L34
440 RISBGNZ $32, $63, $32, R5, R1
441 LGDR F6, R2
442 MOVD $powiadd<>+0(SB), R3
443 RISBGZ $60, $60, $4, R2, R2
444 WORD $0x5A123000 //a %r1,0(%r2,%r3)
445 RISBGN $0, $31, $32, R1, R5
446 LDGR R5, F1
447 FMADD F1, F4, F1
448 MOVD $powxscale<>+0(SB), R1
449 WORD $0xED121000 //mdb %f1,0(%r2,%r1)
450 BYTE $0x00
451 BYTE $0x1C
452 BR L1
453 L42:
454 LTDBR F0, F0
455 BLTU L46
456 FMOVD F0, F4
457 L3:
458 MOVD $·pow_x001a<>+0(SB), R2
459 WORD $0xED402000 //cdb %f4,0(%r2)
460 BYTE $0x00
461 BYTE $0x19
462 BGE L2
463 BVS L2
464 MOVD $·pow_x43f<>+0(SB), R2
465 WORD $0xED402000 //mdb %f4,0(%r2)
466 BYTE $0x00
467 BYTE $0x1C
468 WORD $0xC0298009 //iilf %r2,2148095317
469 BYTE $0x55
470 BYTE $0x55
471 LGDR F4, R3
472 RISBGNZ $32, $63, $32, R3, R3
473 SUBW R3, R2, R3
474 RISBGZ $33, $43, $0, R3, R2
475 RISBGNZ $58, $63, $50, R3, R3
476 WORD $0xE303C000 //llgc %r0,0(%r3,%r12)
477 BYTE $0x00
478 BYTE $0x90
479 SLD $3, R0, R3
480 WORD $0x5A234000 //a %r2,0(%r3,%r4)
481 BYTE $0x18 //lr %r3,%r2
482 BYTE $0x32
483 RISBGN $0, $31, $32, R3, R8
484 ADDW $0x4000000, R3
485 BLEU L5
486 RISBGZ $40, $63, $56, R3, R3
487 ORW $0x45000000, R3
488 BR L2
489 L9:
490 WFCEDBS V0, V0, V4
491 BVS L35
492 FMOVD F2, F1
493 BR L1
494 L46:
495 WORD $0xB3130040 //lcdbr %f4,%f0
496 BR L3
497 L44:
498 WORD $0xB3130030 //lcdbr %f3,%f0
499 BR L7
500 L35:
501 FMOVD F0, F1
502 BR L1
503 L26:
504 FMOVD 8(R9), F1
505 BR L1
506 L34:
507 FMOVD 8(R9), F4
508 L19:
509 LTDBR F6, F6
510 BLEU L47
511 L18:
512 WFMDB V4, V5, V1
513 BR L1
514 L5:
515 RISBGZ $33, $50, $63, R3, R3
516 WORD $0xC23B4000 //alfi %r3,1073741824
517 BYTE $0x00
518 BYTE $0x00
519 RLL $24, R3, R3
520 ORW $0x45000000, R3
521 BR L2
522 L45:
523 WFCEDBS V0, V0, V4
524 BVS L35
525 LTDBR F0, F0
526 BLEU L48
527 FMOVD 8(R9), F4
528 L12:
529 MOVW R2, R6
530 CMPBLT R6, $0, L19
531 FMUL F4, F1
532 BR L1
533 L47:
534 BLT L40
535 WFCEDBS V0, V0, V2
536 BVS L49
537 L16:
538 MOVD ·pow_xnan<>+0(SB), R1
539 LDGR R1, F0
540 WFMDB V4, V0, V1
541 BR L1
542 L48:
543 LGDR F0, R3
544 RISBGNZ $32, $63, $32, R3, R1
545 MOVW R1, R6
546 CMPBEQ R6, $0, L29
547 LTDBR F2, F2
548 BLTU L50
549 FMOVD F2, F4
550 L14:
551 MOVD $·pow_x433<>+0(SB), R1
552 FMOVD 0(R1), F7
553 WFCHDBS V4, V7, V3
554 BEQ L15
555 WFADB V7, V4, V3
556 FSUB F7, F3
557 WFCEDBS V4, V3, V3
558 BEQ L15
559 LTDBR F0, F0
560 FMOVD 8(R9), F4
561 BNE L16
562 L13:
563 LTDBR F2, F2
564 BLT L18
565 L40:
566 FMOVD $0, F0
567 WFMDB V4, V0, V1
568 BR L1
569 L49:
570 WFMDB V0, V4, V1
571 BR L1
572 L29:
573 FMOVD 8(R9), F4
574 BR L13
575 L15:
576 MOVD $·pow_x434<>+0(SB), R1
577 FMOVD 0(R1), F7
578 WFCHDBS V4, V7, V3
579 BEQ L32
580 WFADB V7, V4, V3
581 FSUB F7, F3
582 WFCEDBS V4, V3, V4
583 BEQ L32
584 FMOVD 0(R9), F4
585 L17:
586 LTDBR F0, F0
587 BNE L12
588 BR L13
589 L32:
590 FMOVD 8(R9), F4
591 BR L17
592 L50:
593 WORD $0xB3130042 //lcdbr %f4,%f2
594 BR L14
595 xIsOne: // Pow(1, y) = 1 for any y
596 yIsOne: // Pow(x, 1) = x for any x
597 posInfGeZero: // Pow(+Inf, y) = +Inf for y > 0
598 MOVD R1, ret+16(FP)
599 RET
600 yIsNan: // Pow(NaN, y) = NaN
601 ltZeroInt: // Pow(x, y) = NaN for finite x < 0 and finite non-integer y
602 MOVD $NaN, R2
603 MOVD R2, ret+16(FP)
604 RET
605 negOnePosInf: // Pow(-1, ±Inf) = 1
606 negOneNegInf:
607 MOVD $PosOne, R3
608 MOVD R3, ret+16(FP)
609 RET
610 negZeroOddInt:
611 MOVD $NegInf, R3
612 MOVD R3, ret+16(FP)
613 RET
614 zeroNotOdd: // Pow(±0, y) = +Inf for finite y < 0 and not an odd integer
615 posZeroLtZero: // special case Pow(+0, y < 0) = +Inf
616 zeroNegInf: // Pow(±0, -Inf) = +Inf
617 MOVD $PosInf, R3
618 MOVD R3, ret+16(FP)
619 RET
620 gtOnePosInf: //Pow(x, +Inf) = +Inf for |x| > 1
621 ltNegOnePosInf:
622 MOVD R2, ret+16(FP)
623 RET
624 yIsZero: //Pow(x, ±0) = 1 for any x
625 MOVD $PosOne, R4
626 MOVD R4, ret+16(FP)
627 RET
628 negZeroOddIntGtZero: // Pow(-0, y) = -0 for y an odd integer > 0
629 MOVD $NegZero, R3
630 MOVD R3, ret+16(FP)
631 RET
632 zeroNotOddGtZero: // Pow(±0, y) = +0 for finite y > 0 and not an odd integer
633 MOVD $0, ret+16(FP)
634 RET
635
View as plain text