Text file
src/math/sin_s390x.s
1 // Copyright 2016 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 // Various constants
8 DATA sincosxnan<>+0(SB)/8, $0x7ff8000000000000
9 GLOBL sincosxnan<>+0(SB), RODATA, $8
10 DATA sincosxlim<>+0(SB)/8, $0x432921fb54442d19
11 GLOBL sincosxlim<>+0(SB), RODATA, $8
12 DATA sincosxadd<>+0(SB)/8, $0xc338000000000000
13 GLOBL sincosxadd<>+0(SB), RODATA, $8
14 DATA sincosxpi2l<>+0(SB)/8, $0.108285667392191389e-31
15 GLOBL sincosxpi2l<>+0(SB), RODATA, $8
16 DATA sincosxpi2m<>+0(SB)/8, $0.612323399573676480e-16
17 GLOBL sincosxpi2m<>+0(SB), RODATA, $8
18 DATA sincosxpi2h<>+0(SB)/8, $0.157079632679489656e+01
19 GLOBL sincosxpi2h<>+0(SB), RODATA, $8
20 DATA sincosrpi2<>+0(SB)/8, $0.636619772367581341e+00
21 GLOBL sincosrpi2<>+0(SB), RODATA, $8
22
23 // Minimax polynomial approximations
24 DATA sincosc0<>+0(SB)/8, $0.100000000000000000E+01
25 GLOBL sincosc0<>+0(SB), RODATA, $8
26 DATA sincosc1<>+0(SB)/8, $-.499999999999999833E+00
27 GLOBL sincosc1<>+0(SB), RODATA, $8
28 DATA sincosc2<>+0(SB)/8, $0.416666666666625843E-01
29 GLOBL sincosc2<>+0(SB), RODATA, $8
30 DATA sincosc3<>+0(SB)/8, $-.138888888885498984E-02
31 GLOBL sincosc3<>+0(SB), RODATA, $8
32 DATA sincosc4<>+0(SB)/8, $0.248015871681607202E-04
33 GLOBL sincosc4<>+0(SB), RODATA, $8
34 DATA sincosc5<>+0(SB)/8, $-.275572911309937875E-06
35 GLOBL sincosc5<>+0(SB), RODATA, $8
36 DATA sincosc6<>+0(SB)/8, $0.208735047247632818E-08
37 GLOBL sincosc6<>+0(SB), RODATA, $8
38 DATA sincosc7<>+0(SB)/8, $-.112753632738365317E-10
39 GLOBL sincosc7<>+0(SB), RODATA, $8
40 DATA sincoss0<>+0(SB)/8, $0.100000000000000000E+01
41 GLOBL sincoss0<>+0(SB), RODATA, $8
42 DATA sincoss1<>+0(SB)/8, $-.166666666666666657E+00
43 GLOBL sincoss1<>+0(SB), RODATA, $8
44 DATA sincoss2<>+0(SB)/8, $0.833333333333309209E-02
45 GLOBL sincoss2<>+0(SB), RODATA, $8
46 DATA sincoss3<>+0(SB)/8, $-.198412698410701448E-03
47 GLOBL sincoss3<>+0(SB), RODATA, $8
48 DATA sincoss4<>+0(SB)/8, $0.275573191453906794E-05
49 GLOBL sincoss4<>+0(SB), RODATA, $8
50 DATA sincoss5<>+0(SB)/8, $-.250520918387633290E-07
51 GLOBL sincoss5<>+0(SB), RODATA, $8
52 DATA sincoss6<>+0(SB)/8, $0.160571285514715856E-09
53 GLOBL sincoss6<>+0(SB), RODATA, $8
54 DATA sincoss7<>+0(SB)/8, $-.753213484933210972E-12
55 GLOBL sincoss7<>+0(SB), RODATA, $8
56
57 // Sin returns the sine of the radian argument x.
58 //
59 // Special cases are:
60 // Sin(±0) = ±0
61 // Sin(±Inf) = NaN
62 // Sin(NaN) = NaN
63 // The algorithm used is minimax polynomial approximation.
64 // with coefficients determined with a Remez exchange algorithm.
65
66 TEXT ·sinAsm(SB),NOSPLIT,$0-16
67 FMOVD x+0(FP), F0
68 //special case Sin(±0) = ±0
69 FMOVD $(0.0), F1
70 FCMPU F0, F1
71 BEQ sinIsZero
72 LTDBR F0, F0
73 BLTU L17
74 FMOVD F0, F5
75 L2:
76 MOVD $sincoss7<>+0(SB), R1
77 FMOVD 0(R1), F4
78 MOVD $sincoss6<>+0(SB), R1
79 FMOVD 0(R1), F1
80 MOVD $sincoss5<>+0(SB), R1
81 VLEG $0, 0(R1), V18
82 MOVD $sincoss4<>+0(SB), R1
83 FMOVD 0(R1), F6
84 MOVD $sincoss2<>+0(SB), R1
85 VLEG $0, 0(R1), V16
86 MOVD $sincoss3<>+0(SB), R1
87 FMOVD 0(R1), F7
88 MOVD $sincoss1<>+0(SB), R1
89 FMOVD 0(R1), F3
90 MOVD $sincoss0<>+0(SB), R1
91 FMOVD 0(R1), F2
92 WFCHDBS V2, V5, V2
93 BEQ L18
94 MOVD $sincosrpi2<>+0(SB), R1
95 FMOVD 0(R1), F3
96 MOVD $sincosxadd<>+0(SB), R1
97 FMOVD 0(R1), F2
98 WFMSDB V0, V3, V2, V3
99 FMOVD 0(R1), F6
100 FADD F3, F6
101 MOVD $sincosxpi2h<>+0(SB), R1
102 FMOVD 0(R1), F2
103 FMSUB F2, F6, F0
104 MOVD $sincosxpi2m<>+0(SB), R1
105 FMOVD 0(R1), F4
106 FMADD F4, F6, F0
107 MOVD $sincosxpi2l<>+0(SB), R1
108 WFMDB V0, V0, V1
109 FMOVD 0(R1), F7
110 WFMDB V1, V1, V2
111 LGDR F3, R1
112 MOVD $sincosxlim<>+0(SB), R2
113 TMLL R1, $1
114 BEQ L6
115 FMOVD 0(R2), F0
116 WFCHDBS V0, V5, V0
117 BNE L14
118 MOVD $sincosc7<>+0(SB), R2
119 FMOVD 0(R2), F0
120 MOVD $sincosc6<>+0(SB), R2
121 FMOVD 0(R2), F4
122 MOVD $sincosc5<>+0(SB), R2
123 WFMADB V1, V0, V4, V0
124 FMOVD 0(R2), F6
125 MOVD $sincosc4<>+0(SB), R2
126 WFMADB V1, V0, V6, V0
127 FMOVD 0(R2), F4
128 MOVD $sincosc2<>+0(SB), R2
129 FMOVD 0(R2), F6
130 WFMADB V2, V4, V6, V4
131 MOVD $sincosc3<>+0(SB), R2
132 FMOVD 0(R2), F3
133 MOVD $sincosc1<>+0(SB), R2
134 WFMADB V2, V0, V3, V0
135 FMOVD 0(R2), F6
136 WFMADB V1, V4, V6, V4
137 TMLL R1, $2
138 WFMADB V2, V0, V4, V0
139 MOVD $sincosc0<>+0(SB), R1
140 FMOVD 0(R1), F2
141 WFMADB V1, V0, V2, V0
142 BNE L15
143 FMOVD F0, ret+8(FP)
144 RET
145
146 L6:
147 FMOVD 0(R2), F4
148 WFCHDBS V4, V5, V4
149 BNE L14
150 MOVD $sincoss7<>+0(SB), R2
151 FMOVD 0(R2), F4
152 MOVD $sincoss6<>+0(SB), R2
153 FMOVD 0(R2), F3
154 MOVD $sincoss5<>+0(SB), R2
155 WFMADB V1, V4, V3, V4
156 WFMADB V6, V7, V0, V6
157 FMOVD 0(R2), F0
158 MOVD $sincoss4<>+0(SB), R2
159 FMADD F4, F1, F0
160 FMOVD 0(R2), F3
161 MOVD $sincoss2<>+0(SB), R2
162 FMOVD 0(R2), F4
163 MOVD $sincoss3<>+0(SB), R2
164 WFMADB V2, V3, V4, V3
165 FMOVD 0(R2), F4
166 MOVD $sincoss1<>+0(SB), R2
167 WFMADB V2, V0, V4, V0
168 FMOVD 0(R2), F4
169 WFMADB V1, V3, V4, V3
170 FNEG F6, F4
171 WFMADB V2, V0, V3, V2
172 WFMDB V4, V1, V0
173 TMLL R1, $2
174 WFMSDB V0, V2, V6, V0
175 BNE L15
176 FMOVD F0, ret+8(FP)
177 RET
178
179 L14:
180 MOVD $sincosxnan<>+0(SB), R1
181 FMOVD 0(R1), F0
182 FMOVD F0, ret+8(FP)
183 RET
184
185 L18:
186 WFMDB V0, V0, V2
187 WFMADB V2, V4, V1, V4
188 WFMDB V2, V2, V1
189 WFMADB V2, V4, V18, V4
190 WFMADB V1, V6, V16, V6
191 WFMADB V1, V4, V7, V4
192 WFMADB V2, V6, V3, V6
193 FMUL F0, F2
194 WFMADB V1, V4, V6, V4
195 FMADD F4, F2, F0
196 FMOVD F0, ret+8(FP)
197 RET
198
199 L17:
200 FNEG F0, F5
201 BR L2
202 L15:
203 FNEG F0, F0
204 FMOVD F0, ret+8(FP)
205 RET
206
207
208 sinIsZero:
209 FMOVD F0, ret+8(FP)
210 RET
211
212 // Cos returns the cosine of the radian argument.
213 //
214 // Special cases are:
215 // Cos(±Inf) = NaN
216 // Cos(NaN) = NaN
217 // The algorithm used is minimax polynomial approximation.
218 // with coefficients determined with a Remez exchange algorithm.
219
220 TEXT ·cosAsm(SB),NOSPLIT,$0-16
221 FMOVD x+0(FP), F0
222 LTDBR F0, F0
223 BLTU L35
224 FMOVD F0, F1
225 L21:
226 MOVD $sincosc7<>+0(SB), R1
227 FMOVD 0(R1), F4
228 MOVD $sincosc6<>+0(SB), R1
229 VLEG $0, 0(R1), V20
230 MOVD $sincosc5<>+0(SB), R1
231 VLEG $0, 0(R1), V18
232 MOVD $sincosc4<>+0(SB), R1
233 FMOVD 0(R1), F6
234 MOVD $sincosc2<>+0(SB), R1
235 VLEG $0, 0(R1), V16
236 MOVD $sincosc3<>+0(SB), R1
237 FMOVD 0(R1), F7
238 MOVD $sincosc1<>+0(SB), R1
239 FMOVD 0(R1), F5
240 MOVD $sincosrpi2<>+0(SB), R1
241 FMOVD 0(R1), F2
242 MOVD $sincosxadd<>+0(SB), R1
243 FMOVD 0(R1), F3
244 MOVD $sincoss0<>+0(SB), R1
245 WFMSDB V0, V2, V3, V2
246 FMOVD 0(R1), F3
247 WFCHDBS V3, V1, V3
248 LGDR F2, R1
249 BEQ L36
250 MOVD $sincosxadd<>+0(SB), R2
251 FMOVD 0(R2), F4
252 FADD F2, F4
253 MOVD $sincosxpi2h<>+0(SB), R2
254 FMOVD 0(R2), F2
255 WFMSDB V4, V2, V0, V2
256 MOVD $sincosxpi2m<>+0(SB), R2
257 FMOVD 0(R2), F0
258 WFMADB V4, V0, V2, V0
259 MOVD $sincosxpi2l<>+0(SB), R2
260 WFMDB V0, V0, V2
261 FMOVD 0(R2), F5
262 WFMDB V2, V2, V6
263 MOVD $sincosxlim<>+0(SB), R2
264 TMLL R1, $1
265 BNE L25
266 FMOVD 0(R2), F0
267 WFCHDBS V0, V1, V0
268 BNE L33
269 MOVD $sincosc7<>+0(SB), R2
270 FMOVD 0(R2), F0
271 MOVD $sincosc6<>+0(SB), R2
272 FMOVD 0(R2), F4
273 MOVD $sincosc5<>+0(SB), R2
274 WFMADB V2, V0, V4, V0
275 FMOVD 0(R2), F1
276 MOVD $sincosc4<>+0(SB), R2
277 WFMADB V2, V0, V1, V0
278 FMOVD 0(R2), F4
279 MOVD $sincosc2<>+0(SB), R2
280 FMOVD 0(R2), F1
281 WFMADB V6, V4, V1, V4
282 MOVD $sincosc3<>+0(SB), R2
283 FMOVD 0(R2), F3
284 MOVD $sincosc1<>+0(SB), R2
285 WFMADB V6, V0, V3, V0
286 FMOVD 0(R2), F1
287 WFMADB V2, V4, V1, V4
288 TMLL R1, $2
289 WFMADB V6, V0, V4, V0
290 MOVD $sincosc0<>+0(SB), R1
291 FMOVD 0(R1), F4
292 WFMADB V2, V0, V4, V0
293 BNE L34
294 FMOVD F0, ret+8(FP)
295 RET
296
297 L25:
298 FMOVD 0(R2), F3
299 WFCHDBS V3, V1, V1
300 BNE L33
301 MOVD $sincoss7<>+0(SB), R2
302 FMOVD 0(R2), F1
303 MOVD $sincoss6<>+0(SB), R2
304 FMOVD 0(R2), F3
305 MOVD $sincoss5<>+0(SB), R2
306 WFMADB V2, V1, V3, V1
307 FMOVD 0(R2), F3
308 MOVD $sincoss4<>+0(SB), R2
309 WFMADB V2, V1, V3, V1
310 FMOVD 0(R2), F3
311 MOVD $sincoss2<>+0(SB), R2
312 FMOVD 0(R2), F7
313 WFMADB V6, V3, V7, V3
314 MOVD $sincoss3<>+0(SB), R2
315 FMADD F5, F4, F0
316 FMOVD 0(R2), F4
317 MOVD $sincoss1<>+0(SB), R2
318 FMADD F1, F6, F4
319 FMOVD 0(R2), F1
320 FMADD F3, F2, F1
321 FMUL F0, F2
322 WFMADB V6, V4, V1, V6
323 TMLL R1, $2
324 FMADD F6, F2, F0
325 BNE L34
326 FMOVD F0, ret+8(FP)
327 RET
328
329 L33:
330 MOVD $sincosxnan<>+0(SB), R1
331 FMOVD 0(R1), F0
332 FMOVD F0, ret+8(FP)
333 RET
334
335 L36:
336 FMUL F0, F0
337 MOVD $sincosc0<>+0(SB), R1
338 WFMDB V0, V0, V1
339 WFMADB V0, V4, V20, V4
340 WFMADB V1, V6, V16, V6
341 WFMADB V0, V4, V18, V4
342 WFMADB V0, V6, V5, V6
343 WFMADB V1, V4, V7, V4
344 FMOVD 0(R1), F2
345 WFMADB V1, V4, V6, V4
346 WFMADB V0, V4, V2, V0
347 FMOVD F0, ret+8(FP)
348 RET
349
350 L35:
351 FNEG F0, F1
352 BR L21
353 L34:
354 FNEG F0, F0
355 FMOVD F0, ret+8(FP)
356 RET
357
View as plain text