Text file
src/math/expm1_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 // Minimax polynomial approximation and other constants
8 DATA ·expm1rodataL22<> + 0(SB)/8, $-1.0
9 DATA ·expm1rodataL22<> + 8(SB)/8, $800.0E+00
10 DATA ·expm1rodataL22<> + 16(SB)/8, $1.0
11 DATA ·expm1rodataL22<> + 24(SB)/8, $-.231904681384629956E-16
12 DATA ·expm1rodataL22<> + 32(SB)/8, $0.50000000000000029671E+00
13 DATA ·expm1rodataL22<> + 40(SB)/8, $0.16666666666666676570E+00
14 DATA ·expm1rodataL22<> + 48(SB)/8, $0.83333333323590973444E-02
15 DATA ·expm1rodataL22<> + 56(SB)/8, $0.13889096526400683566E-02
16 DATA ·expm1rodataL22<> + 64(SB)/8, $0.41666666661701152924E-01
17 DATA ·expm1rodataL22<> + 72(SB)/8, $0.19841562053987360264E-03
18 DATA ·expm1rodataL22<> + 80(SB)/8, $-.693147180559945286E+00
19 DATA ·expm1rodataL22<> + 88(SB)/8, $0.144269504088896339E+01
20 DATA ·expm1rodataL22<> + 96(SB)/8, $704.0E+00
21 GLOBL ·expm1rodataL22<> + 0(SB), RODATA, $104
22
23 DATA ·expm1xmone<> + 0(SB)/8, $0xbff0000000000000
24 GLOBL ·expm1xmone<> + 0(SB), RODATA, $8
25 DATA ·expm1xinf<> + 0(SB)/8, $0x7ff0000000000000
26 GLOBL ·expm1xinf<> + 0(SB), RODATA, $8
27 DATA ·expm1x4ff<> + 0(SB)/8, $0x4ff0000000000000
28 GLOBL ·expm1x4ff<> + 0(SB), RODATA, $8
29 DATA ·expm1x2ff<> + 0(SB)/8, $0x2ff0000000000000
30 GLOBL ·expm1x2ff<> + 0(SB), RODATA, $8
31 DATA ·expm1xaddexp<> + 0(SB)/8, $0xc2f0000100003ff0
32 GLOBL ·expm1xaddexp<> + 0(SB), RODATA, $8
33
34 // Log multipliers table
35 DATA ·expm1tab<> + 0(SB)/8, $0.0
36 DATA ·expm1tab<> + 8(SB)/8, $-.171540871271399150E-01
37 DATA ·expm1tab<> + 16(SB)/8, $-.306597931864376363E-01
38 DATA ·expm1tab<> + 24(SB)/8, $-.410200970469965021E-01
39 DATA ·expm1tab<> + 32(SB)/8, $-.486343079978231466E-01
40 DATA ·expm1tab<> + 40(SB)/8, $-.538226193725835820E-01
41 DATA ·expm1tab<> + 48(SB)/8, $-.568439602538111520E-01
42 DATA ·expm1tab<> + 56(SB)/8, $-.579091847395528847E-01
43 DATA ·expm1tab<> + 64(SB)/8, $-.571909584179366341E-01
44 DATA ·expm1tab<> + 72(SB)/8, $-.548312665987204407E-01
45 DATA ·expm1tab<> + 80(SB)/8, $-.509471843643441085E-01
46 DATA ·expm1tab<> + 88(SB)/8, $-.456353588448863359E-01
47 DATA ·expm1tab<> + 96(SB)/8, $-.389755254243262365E-01
48 DATA ·expm1tab<> + 104(SB)/8, $-.310332908285244231E-01
49 DATA ·expm1tab<> + 112(SB)/8, $-.218623539150173528E-01
50 DATA ·expm1tab<> + 120(SB)/8, $-.115062908917949451E-01
51 GLOBL ·expm1tab<> + 0(SB), RODATA, $128
52
53 // Expm1 returns e**x - 1, the base-e exponential of x minus 1.
54 // It is more accurate than Exp(x) - 1 when x is near zero.
55 //
56 // Special cases are:
57 // Expm1(+Inf) = +Inf
58 // Expm1(-Inf) = -1
59 // Expm1(NaN) = NaN
60 // Very large values overflow to -1 or +Inf.
61 // The algorithm used is minimax polynomial approximation using a table of
62 // polynomial coefficients determined with a Remez exchange algorithm.
63
64 TEXT ·expm1Asm(SB), NOSPLIT, $0-16
65 FMOVD x+0(FP), F0
66 MOVD $·expm1rodataL22<>+0(SB), R5
67 LTDBR F0, F0
68 BLTU L20
69 FMOVD F0, F2
70 L2:
71 WORD $0xED205060 //cdb %f2,.L23-.L22(%r5)
72 BYTE $0x00
73 BYTE $0x19
74 BGE L16
75 BVS L16
76 WFCEDBS V2, V2, V2
77 BVS LEXITTAGexpm1
78 MOVD $·expm1xaddexp<>+0(SB), R1
79 FMOVD 88(R5), F1
80 FMOVD 0(R1), F2
81 WFMSDB V0, V1, V2, V1
82 FMOVD 80(R5), F6
83 WFADB V1, V2, V4
84 FMOVD 72(R5), F2
85 FMADD F6, F4, F0
86 FMOVD 64(R5), F3
87 FMOVD 56(R5), F6
88 FMOVD 48(R5), F5
89 FMADD F2, F0, F6
90 WFMADB V0, V5, V3, V5
91 WFMDB V0, V0, V2
92 LGDR F1, R1
93 WFMADB V6, V2, V5, V6
94 FMOVD 40(R5), F3
95 FMOVD 32(R5), F5
96 WFMADB V0, V3, V5, V3
97 FMOVD 24(R5), F5
98 WFMADB V2, V6, V3, V2
99 FMADD F5, F4, F0
100 FMOVD 16(R5), F6
101 WFMADB V0, V2, V6, V2
102 RISBGZ $57, $60, $3, R1, R3
103 WORD $0xB3130022 //lcdbr %f2,%f2
104 MOVD $·expm1tab<>+0(SB), R2
105 WORD $0x68432000 //ld %f4,0(%r3,%r2)
106 FMADD F4, F0, F0
107 SLD $48, R1, R2
108 WFMSDB V2, V0, V4, V0
109 LDGR R2, F4
110 WORD $0xB3130000 //lcdbr %f0,%f0
111 FSUB F4, F6
112 WFMSDB V0, V4, V6, V0
113 FMOVD F0, ret+8(FP)
114 RET
115 L16:
116 WFCEDBS V2, V2, V4
117 BVS LEXITTAGexpm1
118 WORD $0xED205008 //cdb %f2,.L34-.L22(%r5)
119 BYTE $0x00
120 BYTE $0x19
121 BLT L6
122 WFCEDBS V2, V0, V0
123 BVS L7
124 MOVD $·expm1xinf<>+0(SB), R1
125 FMOVD 0(R1), F0
126 FMOVD F0, ret+8(FP)
127 RET
128 L20:
129 WORD $0xB3130020 //lcdbr %f2,%f0
130 BR L2
131 L6:
132 MOVD $·expm1xaddexp<>+0(SB), R1
133 FMOVD 88(R5), F5
134 FMOVD 0(R1), F4
135 WFMSDB V0, V5, V4, V5
136 FMOVD 80(R5), F3
137 WFADB V5, V4, V1
138 VLEG $0, 48(R5), V16
139 WFMADB V1, V3, V0, V3
140 FMOVD 56(R5), F4
141 FMOVD 64(R5), F7
142 FMOVD 72(R5), F6
143 WFMADB V3, V16, V7, V16
144 WFMADB V3, V6, V4, V6
145 WFMDB V3, V3, V4
146 MOVD $·expm1tab<>+0(SB), R2
147 WFMADB V6, V4, V16, V6
148 VLEG $0, 32(R5), V16
149 FMOVD 40(R5), F7
150 WFMADB V3, V7, V16, V7
151 VLEG $0, 24(R5), V16
152 WFMADB V4, V6, V7, V4
153 WFMADB V1, V16, V3, V1
154 FMOVD 16(R5), F6
155 FMADD F4, F1, F6
156 LGDR F5, R1
157 WORD $0xB3130066 //lcdbr %f6,%f6
158 RISBGZ $57, $60, $3, R1, R3
159 WORD $0x68432000 //ld %f4,0(%r3,%r2)
160 FMADD F4, F1, F1
161 MOVD $0x4086000000000000, R2
162 FMSUB F1, F6, F4
163 WORD $0xB3130044 //lcdbr %f4,%f4
164 WFCHDBS V2, V0, V0
165 BEQ L21
166 ADDW $0xF000, R1
167 RISBGN $0, $15, $48, R1, R2
168 LDGR R2, F0
169 FMADD F0, F4, F0
170 MOVD $·expm1x4ff<>+0(SB), R3
171 FMOVD 0(R5), F4
172 FMOVD 0(R3), F2
173 WFMADB V2, V0, V4, V0
174 FMOVD F0, ret+8(FP)
175 RET
176 L7:
177 MOVD $·expm1xmone<>+0(SB), R1
178 FMOVD 0(R1), F0
179 FMOVD F0, ret+8(FP)
180 RET
181 L21:
182 ADDW $0x1000, R1
183 RISBGN $0, $15, $48, R1, R2
184 LDGR R2, F0
185 FMADD F0, F4, F0
186 MOVD $·expm1x2ff<>+0(SB), R3
187 FMOVD 0(R5), F4
188 FMOVD 0(R3), F2
189 WFMADB V2, V0, V4, V0
190 FMOVD F0, ret+8(FP)
191 RET
192 LEXITTAGexpm1:
193 FMOVD F0, ret+8(FP)
194 RET
195
View as plain text