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.
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
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
57 // Sin returns the sine of the radian argument x.
63 // The algorithm used is minimax polynomial approximation.
64 // with coefficients determined with a Remez exchange algorithm.
66 TEXT ·sinAsm(SB),NOSPLIT,$0-16
68 //special case Sin(±0) = ±0
76 MOVD $sincosxlim<>+0(SB), R1
80 MOVD $sincoss7<>+0(SB), R1
82 MOVD $sincoss6<>+0(SB), R1
84 MOVD $sincoss5<>+0(SB), R1
86 MOVD $sincoss4<>+0(SB), R1
88 MOVD $sincoss2<>+0(SB), R1
90 MOVD $sincoss3<>+0(SB), R1
92 MOVD $sincoss1<>+0(SB), R1
94 MOVD $sincoss0<>+0(SB), R1
98 MOVD $sincosrpi2<>+0(SB), R1
100 MOVD $sincosxadd<>+0(SB), R1
102 WFMSDB V0, V3, V2, V3
105 MOVD $sincosxpi2h<>+0(SB), R1
108 MOVD $sincosxpi2m<>+0(SB), R1
111 MOVD $sincosxpi2l<>+0(SB), R1
116 MOVD $sincosxlim<>+0(SB), R2
122 MOVD $sincosc7<>+0(SB), R2
124 MOVD $sincosc6<>+0(SB), R2
126 MOVD $sincosc5<>+0(SB), R2
127 WFMADB V1, V0, V4, V0
129 MOVD $sincosc4<>+0(SB), R2
130 WFMADB V1, V0, V6, V0
132 MOVD $sincosc2<>+0(SB), R2
134 WFMADB V2, V4, V6, V4
135 MOVD $sincosc3<>+0(SB), R2
137 MOVD $sincosc1<>+0(SB), R2
138 WFMADB V2, V0, V3, V0
140 WFMADB V1, V4, V6, V4
142 WFMADB V2, V0, V4, V0
143 MOVD $sincosc0<>+0(SB), R1
145 WFMADB V1, V0, V2, V0
154 MOVD $sincoss7<>+0(SB), R2
156 MOVD $sincoss6<>+0(SB), R2
158 MOVD $sincoss5<>+0(SB), R2
159 WFMADB V1, V4, V3, V4
160 WFMADB V6, V7, V0, V6
162 MOVD $sincoss4<>+0(SB), R2
165 MOVD $sincoss2<>+0(SB), R2
167 MOVD $sincoss3<>+0(SB), R2
168 WFMADB V2, V3, V4, V3
170 MOVD $sincoss1<>+0(SB), R2
171 WFMADB V2, V0, V4, V0
173 WFMADB V1, V3, V4, V3
175 WFMADB V2, V0, V3, V2
178 WFMSDB V0, V2, V6, V0
184 MOVD $sincosxnan<>+0(SB), R1
191 WFMADB V2, V4, V1, V4
193 WFMADB V2, V4, V18, V4
194 WFMADB V1, V6, V16, V6
195 WFMADB V1, V4, V7, V4
196 WFMADB V2, V6, V3, V6
198 WFMADB V1, V4, V6, V4
213 BR ·sin(SB) //tail call
218 // Cos returns the cosine of the radian argument.
220 // Special cases are:
223 // The algorithm used is minimax polynomial approximation.
224 // with coefficients determined with a Remez exchange algorithm.
226 TEXT ·cosAsm(SB),NOSPLIT,$0-16
232 MOVD $sincosxlim<>+0(SB), R1
236 MOVD $sincosc7<>+0(SB), R1
238 MOVD $sincosc6<>+0(SB), R1
240 MOVD $sincosc5<>+0(SB), R1
242 MOVD $sincosc4<>+0(SB), R1
244 MOVD $sincosc2<>+0(SB), R1
246 MOVD $sincosc3<>+0(SB), R1
248 MOVD $sincosc1<>+0(SB), R1
250 MOVD $sincosrpi2<>+0(SB), R1
252 MOVD $sincosxadd<>+0(SB), R1
254 MOVD $sincoss0<>+0(SB), R1
255 WFMSDB V0, V2, V3, V2
260 MOVD $sincosxadd<>+0(SB), R2
263 MOVD $sincosxpi2h<>+0(SB), R2
265 WFMSDB V4, V2, V0, V2
266 MOVD $sincosxpi2m<>+0(SB), R2
268 WFMADB V4, V0, V2, V0
269 MOVD $sincosxpi2l<>+0(SB), R2
273 MOVD $sincosxlim<>+0(SB), R2
279 MOVD $sincosc7<>+0(SB), R2
281 MOVD $sincosc6<>+0(SB), R2
283 MOVD $sincosc5<>+0(SB), R2
284 WFMADB V2, V0, V4, V0
286 MOVD $sincosc4<>+0(SB), R2
287 WFMADB V2, V0, V1, V0
289 MOVD $sincosc2<>+0(SB), R2
291 WFMADB V6, V4, V1, V4
292 MOVD $sincosc3<>+0(SB), R2
294 MOVD $sincosc1<>+0(SB), R2
295 WFMADB V6, V0, V3, V0
297 WFMADB V2, V4, V1, V4
299 WFMADB V6, V0, V4, V0
300 MOVD $sincosc0<>+0(SB), R1
302 WFMADB V2, V0, V4, V0
311 MOVD $sincoss7<>+0(SB), R2
313 MOVD $sincoss6<>+0(SB), R2
315 MOVD $sincoss5<>+0(SB), R2
316 WFMADB V2, V1, V3, V1
318 MOVD $sincoss4<>+0(SB), R2
319 WFMADB V2, V1, V3, V1
321 MOVD $sincoss2<>+0(SB), R2
323 WFMADB V6, V3, V7, V3
324 MOVD $sincoss3<>+0(SB), R2
327 MOVD $sincoss1<>+0(SB), R2
332 WFMADB V6, V4, V1, V6
340 MOVD $sincosxnan<>+0(SB), R1
347 MOVD $sincosc0<>+0(SB), R1
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
355 WFMADB V1, V4, V6, V4
356 WFMADB V0, V4, V2, V0
369 BR ·cos(SB) //tail call