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.
7 // Minimax polynomial coefficients and other constants
8 DATA ·atanrodataL8<> + 0(SB)/8, $0.199999999999554423E+00
9 DATA ·atanrodataL8<> + 8(SB)/8, $0.111111110136634272E+00
10 DATA ·atanrodataL8<> + 16(SB)/8, $-.142857142828026806E+00
11 DATA ·atanrodataL8<> + 24(SB)/8, $-.333333333333330928E+00
12 DATA ·atanrodataL8<> + 32(SB)/8, $0.769228118888682505E-01
13 DATA ·atanrodataL8<> + 40(SB)/8, $0.588059263575587687E-01
14 DATA ·atanrodataL8<> + 48(SB)/8, $-.666641501287528609E-01
15 DATA ·atanrodataL8<> + 56(SB)/8, $-.909090711945939878E-01
16 DATA ·atanrodataL8<> + 64(SB)/8, $0.472329433805024762E-01
17 DATA ·atanrodataL8<> + 72(SB)/8, $0.366935664549587481E-01
18 DATA ·atanrodataL8<> + 80(SB)/8, $-.422172007412067035E-01
19 DATA ·atanrodataL8<> + 88(SB)/8, $-.299856214685512712E-01
20 DATA ·atanrodataL8<> + 96(SB)/8, $0.220852012160300086E-01
21 DATA ·atanrodataL8<> + 104(SB)/8, $0.726338160757602439E-02
22 DATA ·atanrodataL8<> + 112(SB)/8, $0.843488472994227321E-03
23 DATA ·atanrodataL8<> + 120(SB)/8, $0.134893651284712515E-04
24 DATA ·atanrodataL8<> + 128(SB)/8, $-.525380587584426406E-01
25 DATA ·atanrodataL8<> + 136(SB)/8, $-.139950258898989925E-01
26 DATA ·atanrodataL8<> + 144(SB)/8, $-.291935324869629616E-02
27 DATA ·atanrodataL8<> + 152(SB)/8, $-.154797890856877418E-03
28 GLOBL ·atanrodataL8<> + 0(SB), RODATA, $160
30 DATA ·atanxpi2h<> + 0(SB)/8, $0x3ff330e4e4fa7b1b
31 DATA ·atanxpi2h<> + 8(SB)/8, $0xbff330e4e4fa7b1b
32 DATA ·atanxpi2h<> + 16(SB)/8, $0x400330e4e4fa7b1b
33 DATA ·atanxpi2h<> + 24(SB)/4, $0xc00330e4e4fa7b1b
34 GLOBL ·atanxpi2h<> + 0(SB), RODATA, $32
35 DATA ·atanxpim<> + 0(SB)/8, $0x3ff4f42b00000000
36 GLOBL ·atanxpim<> + 0(SB), RODATA, $8
37 DATA ·atanxmone<> + 0(SB)/8, $-1.0
38 GLOBL ·atanxmone<> + 0(SB), RODATA, $8
40 // Atan returns the arctangent, in radians, of the argument.
44 // Atan(±Inf) = ±Pi/2Pi
45 // The algorithm used is minimax polynomial approximation
46 // with coefficients determined with a Remez exchange algorithm.
48 TEXT ·atanAsm(SB), NOSPLIT, $0-16
50 //special case Atan(±0) = ±0
55 MOVD $·atanrodataL8<>+0(SB), R5
58 RISBGNZ $32, $63, $32, R1, R1
64 MOVD $·atanxmone<>+0(SB), R3
67 RISBGZ $63, $63, $33, R1, R1
68 MOVD $·atanxpi2h<>+0(SB), R3
71 WORD $0x68813000 //ld %f8,0(%r1,%r3)
96 WFMADB V2, V7, V16, V7
102 WFMADB V2, V3, V7, V3
104 WFMADB V2, V7, V16, V7
106 WFMADB V1, V4, V5, V4
108 WFMADB V6, V3, V7, V3
110 WFMADB V2, V7, V5, V7
112 WFMADB V2, V5, V16, V5
113 WFMADB V1, V4, V3, V4
114 WFMADB V6, V7, V5, V6
121 MOVD $·atanxpim<>+0(SB), R1
122 WORD $0xED801000 //madb %f0,%f8,0(%r1)