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 $sincosxlim<>+0(SB), R1
77 FMOVD 0(R1), F1
78 FCMPU F5, F1
79 BGT L16
80 MOVD $sincoss7<>+0(SB), R1
81 FMOVD 0(R1), F4
82 MOVD $sincoss6<>+0(SB), R1
83 FMOVD 0(R1), F1
84 MOVD $sincoss5<>+0(SB), R1
85 VLEG $0, 0(R1), V18
86 MOVD $sincoss4<>+0(SB), R1
87 FMOVD 0(R1), F6
88 MOVD $sincoss2<>+0(SB), R1
89 VLEG $0, 0(R1), V16
90 MOVD $sincoss3<>+0(SB), R1
91 FMOVD 0(R1), F7
92 MOVD $sincoss1<>+0(SB), R1
93 FMOVD 0(R1), F3
94 MOVD $sincoss0<>+0(SB), R1
95 FMOVD 0(R1), F2
96 WFCHDBS V2, V5, V2
97 BEQ L18
98 MOVD $sincosrpi2<>+0(SB), R1
99 FMOVD 0(R1), F3
100 MOVD $sincosxadd<>+0(SB), R1
101 FMOVD 0(R1), F2
102 WFMSDB V0, V3, V2, V3
103 FMOVD 0(R1), F6
104 FADD F3, F6
105 MOVD $sincosxpi2h<>+0(SB), R1
106 FMOVD 0(R1), F2
107 FMSUB F2, F6, F0
108 MOVD $sincosxpi2m<>+0(SB), R1
109 FMOVD 0(R1), F4
110 FMADD F4, F6, F0
111 MOVD $sincosxpi2l<>+0(SB), R1
112 WFMDB V0, V0, V1
113 FMOVD 0(R1), F7
114 WFMDB V1, V1, V2
115 LGDR F3, R1
116 MOVD $sincosxlim<>+0(SB), R2
117 TMLL R1, $1
118 BEQ L6
119 FMOVD 0(R2), F0
120 WFCHDBS V0, V5, V0
121 BNE L14
122 MOVD $sincosc7<>+0(SB), R2
123 FMOVD 0(R2), F0
124 MOVD $sincosc6<>+0(SB), R2
125 FMOVD 0(R2), F4
126 MOVD $sincosc5<>+0(SB), R2
127 WFMADB V1, V0, V4, V0
128 FMOVD 0(R2), F6
129 MOVD $sincosc4<>+0(SB), R2
130 WFMADB V1, V0, V6, V0
131 FMOVD 0(R2), F4
132 MOVD $sincosc2<>+0(SB), R2
133 FMOVD 0(R2), F6
134 WFMADB V2, V4, V6, V4
135 MOVD $sincosc3<>+0(SB), R2
136 FMOVD 0(R2), F3
137 MOVD $sincosc1<>+0(SB), R2
138 WFMADB V2, V0, V3, V0
139 FMOVD 0(R2), F6
140 WFMADB V1, V4, V6, V4
141 TMLL R1, $2
142 WFMADB V2, V0, V4, V0
143 MOVD $sincosc0<>+0(SB), R1
144 FMOVD 0(R1), F2
145 WFMADB V1, V0, V2, V0
146 BNE L15
147 FMOVD F0, ret+8(FP)
148 RET
149
150 L6:
151 FMOVD 0(R2), F4
152 WFCHDBS V4, V5, V4
153 BNE L14
154 MOVD $sincoss7<>+0(SB), R2
155 FMOVD 0(R2), F4
156 MOVD $sincoss6<>+0(SB), R2
157 FMOVD 0(R2), F3
158 MOVD $sincoss5<>+0(SB), R2
159 WFMADB V1, V4, V3, V4
160 WFMADB V6, V7, V0, V6
161 FMOVD 0(R2), F0
162 MOVD $sincoss4<>+0(SB), R2
163 FMADD F4, F1, F0
164 FMOVD 0(R2), F3
165 MOVD $sincoss2<>+0(SB), R2
166 FMOVD 0(R2), F4
167 MOVD $sincoss3<>+0(SB), R2
168 WFMADB V2, V3, V4, V3
169 FMOVD 0(R2), F4
170 MOVD $sincoss1<>+0(SB), R2
171 WFMADB V2, V0, V4, V0
172 FMOVD 0(R2), F4
173 WFMADB V1, V3, V4, V3
174 FNEG F6, F4
175 WFMADB V2, V0, V3, V2
176 WFMDB V4, V1, V0
177 TMLL R1, $2
178 WFMSDB V0, V2, V6, V0
179 BNE L15
180 FMOVD F0, ret+8(FP)
181 RET
182
183 L14:
184 MOVD $sincosxnan<>+0(SB), R1
185 FMOVD 0(R1), F0
186 FMOVD F0, ret+8(FP)
187 RET
188
189 L18:
190 WFMDB V0, V0, V2
191 WFMADB V2, V4, V1, V4
192 WFMDB V2, V2, V1
193 WFMADB V2, V4, V18, V4
194 WFMADB V1, V6, V16, V6
195 WFMADB V1, V4, V7, V4
196 WFMADB V2, V6, V3, V6
197 FMUL F0, F2
198 WFMADB V1, V4, V6, V4
199 FMADD F4, F2, F0
200 FMOVD F0, ret+8(FP)
201 RET
202
203 L17:
204 FNEG F0, F5
205 BR L2
206 L15:
207 FNEG F0, F0
208 FMOVD F0, ret+8(FP)
209 RET
210
211
212 L16:
213 BR ·sin(SB) //tail call
214 sinIsZero:
215 FMOVD F0, ret+8(FP)
216 RET
217
218 // Cos returns the cosine of the radian argument.
219 //
220 // Special cases are:
221 // Cos(±Inf) = NaN
222 // Cos(NaN) = NaN
223 // The algorithm used is minimax polynomial approximation.
224 // with coefficients determined with a Remez exchange algorithm.
225
226 TEXT ·cosAsm(SB),NOSPLIT,$0-16
227 FMOVD x+0(FP), F0
228 LTDBR F0, F0
229 BLTU L35
230 FMOVD F0, F1
231 L21:
232 MOVD $sincosxlim<>+0(SB), R1
233 FMOVD 0(R1), F2
234 FCMPU F1, F2
235 BGT L30
236 MOVD $sincosc7<>+0(SB), R1
237 FMOVD 0(R1), F4
238 MOVD $sincosc6<>+0(SB), R1
239 VLEG $0, 0(R1), V20
240 MOVD $sincosc5<>+0(SB), R1
241 VLEG $0, 0(R1), V18
242 MOVD $sincosc4<>+0(SB), R1
243 FMOVD 0(R1), F6
244 MOVD $sincosc2<>+0(SB), R1
245 VLEG $0, 0(R1), V16
246 MOVD $sincosc3<>+0(SB), R1
247 FMOVD 0(R1), F7
248 MOVD $sincosc1<>+0(SB), R1
249 FMOVD 0(R1), F5
250 MOVD $sincosrpi2<>+0(SB), R1
251 FMOVD 0(R1), F2
252 MOVD $sincosxadd<>+0(SB), R1
253 FMOVD 0(R1), F3
254 MOVD $sincoss0<>+0(SB), R1
255 WFMSDB V0, V2, V3, V2
256 FMOVD 0(R1), F3
257 WFCHDBS V3, V1, V3
258 LGDR F2, R1
259 BEQ L36
260 MOVD $sincosxadd<>+0(SB), R2
261 FMOVD 0(R2), F4
262 FADD F2, F4
263 MOVD $sincosxpi2h<>+0(SB), R2
264 FMOVD 0(R2), F2
265 WFMSDB V4, V2, V0, V2
266 MOVD $sincosxpi2m<>+0(SB), R2
267 FMOVD 0(R2), F0
268 WFMADB V4, V0, V2, V0
269 MOVD $sincosxpi2l<>+0(SB), R2
270 WFMDB V0, V0, V2
271 FMOVD 0(R2), F5
272 WFMDB V2, V2, V6
273 MOVD $sincosxlim<>+0(SB), R2
274 TMLL R1, $1
275 BNE L25
276 FMOVD 0(R2), F0
277 WFCHDBS V0, V1, V0
278 BNE L33
279 MOVD $sincosc7<>+0(SB), R2
280 FMOVD 0(R2), F0
281 MOVD $sincosc6<>+0(SB), R2
282 FMOVD 0(R2), F4
283 MOVD $sincosc5<>+0(SB), R2
284 WFMADB V2, V0, V4, V0
285 FMOVD 0(R2), F1
286 MOVD $sincosc4<>+0(SB), R2
287 WFMADB V2, V0, V1, V0
288 FMOVD 0(R2), F4
289 MOVD $sincosc2<>+0(SB), R2
290 FMOVD 0(R2), F1
291 WFMADB V6, V4, V1, V4
292 MOVD $sincosc3<>+0(SB), R2
293 FMOVD 0(R2), F3
294 MOVD $sincosc1<>+0(SB), R2
295 WFMADB V6, V0, V3, V0
296 FMOVD 0(R2), F1
297 WFMADB V2, V4, V1, V4
298 TMLL R1, $2
299 WFMADB V6, V0, V4, V0
300 MOVD $sincosc0<>+0(SB), R1
301 FMOVD 0(R1), F4
302 WFMADB V2, V0, V4, V0
303 BNE L34
304 FMOVD F0, ret+8(FP)
305 RET
306
307 L25:
308 FMOVD 0(R2), F3
309 WFCHDBS V3, V1, V1
310 BNE L33
311 MOVD $sincoss7<>+0(SB), R2
312 FMOVD 0(R2), F1
313 MOVD $sincoss6<>+0(SB), R2
314 FMOVD 0(R2), F3
315 MOVD $sincoss5<>+0(SB), R2
316 WFMADB V2, V1, V3, V1
317 FMOVD 0(R2), F3
318 MOVD $sincoss4<>+0(SB), R2
319 WFMADB V2, V1, V3, V1
320 FMOVD 0(R2), F3
321 MOVD $sincoss2<>+0(SB), R2
322 FMOVD 0(R2), F7
323 WFMADB V6, V3, V7, V3
324 MOVD $sincoss3<>+0(SB), R2
325 FMADD F5, F4, F0
326 FMOVD 0(R2), F4
327 MOVD $sincoss1<>+0(SB), R2
328 FMADD F1, F6, F4
329 FMOVD 0(R2), F1
330 FMADD F3, F2, F1
331 FMUL F0, F2
332 WFMADB V6, V4, V1, V6
333 TMLL R1, $2
334 FMADD F6, F2, F0
335 BNE L34
336 FMOVD F0, ret+8(FP)
337 RET
338
339 L33:
340 MOVD $sincosxnan<>+0(SB), R1
341 FMOVD 0(R1), F0
342 FMOVD F0, ret+8(FP)
343 RET
344
345 L36:
346 FMUL F0, F0
347 MOVD $sincosc0<>+0(SB), R1
348 WFMDB V0, V0, V1
349 WFMADB V0, V4, V20, V4
350 WFMADB V1, V6, V16, V6
351 WFMADB V0, V4, V18, V4
352 WFMADB V0, V6, V5, V6
353 WFMADB V1, V4, V7, V4
354 FMOVD 0(R1), F2
355 WFMADB V1, V4, V6, V4
356 WFMADB V0, V4, V2, V0
357 FMOVD F0, ret+8(FP)
358 RET
359
360 L35:
361 FNEG F0, F1
362 BR L21
363 L34:
364 FNEG F0, F0
365 FMOVD F0, ret+8(FP)
366 RET
367
368 L30:
369 BR ·cos(SB) //tail call
370
View as plain text