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 ·atanhrodataL10<> + 0(SB)/8, $.41375273347623353626
9 DATA ·atanhrodataL10<> + 8(SB)/8, $.51487302528619766235E+04
10 DATA ·atanhrodataL10<> + 16(SB)/8, $-1.67526912689208984375
11 DATA ·atanhrodataL10<> + 24(SB)/8, $0.181818181818181826E+00
12 DATA ·atanhrodataL10<> + 32(SB)/8, $-.165289256198351540E-01
13 DATA ·atanhrodataL10<> + 40(SB)/8, $0.200350613573012186E-02
14 DATA ·atanhrodataL10<> + 48(SB)/8, $0.397389654305194527E-04
15 DATA ·atanhrodataL10<> + 56(SB)/8, $-.273205381970859341E-03
16 DATA ·atanhrodataL10<> + 64(SB)/8, $0.938370938292558173E-06
17 DATA ·atanhrodataL10<> + 72(SB)/8, $-.148682720127920854E-06
18 DATA ·atanhrodataL10<> + 80(SB)/8, $ 0.212881813645679599E-07
19 DATA ·atanhrodataL10<> + 88(SB)/8, $-.602107458843052029E-05
20 DATA ·atanhrodataL10<> + 96(SB)/8, $-5.5
21 DATA ·atanhrodataL10<> + 104(SB)/8, $-0.5
22 DATA ·atanhrodataL10<> + 112(SB)/8, $0.0
23 DATA ·atanhrodataL10<> + 120(SB)/8, $0x7ff8000000000000 //Nan
24 DATA ·atanhrodataL10<> + 128(SB)/8, $-1.0
25 DATA ·atanhrodataL10<> + 136(SB)/8, $1.0
26 DATA ·atanhrodataL10<> + 144(SB)/8, $1.0E-20
27 GLOBL ·atanhrodataL10<> + 0(SB), RODATA, $152
29 // Table of log correction terms
30 DATA ·atanhtab2076<> + 0(SB)/8, $0.585235384085551248E-01
31 DATA ·atanhtab2076<> + 8(SB)/8, $0.412206153771168640E-01
32 DATA ·atanhtab2076<> + 16(SB)/8, $0.273839003221648339E-01
33 DATA ·atanhtab2076<> + 24(SB)/8, $0.166383778368856480E-01
34 DATA ·atanhtab2076<> + 32(SB)/8, $0.866678223433169637E-02
35 DATA ·atanhtab2076<> + 40(SB)/8, $0.319831684989627514E-02
36 DATA ·atanhtab2076<> + 48(SB)/8, $0.000000000000000000E+00
37 DATA ·atanhtab2076<> + 56(SB)/8, $-.113006378583725549E-02
38 DATA ·atanhtab2076<> + 64(SB)/8, $-.367979419636602491E-03
39 DATA ·atanhtab2076<> + 72(SB)/8, $0.213172484510484979E-02
40 DATA ·atanhtab2076<> + 80(SB)/8, $0.623271047682013536E-02
41 DATA ·atanhtab2076<> + 88(SB)/8, $0.118140812789696885E-01
42 DATA ·atanhtab2076<> + 96(SB)/8, $0.187681358930914206E-01
43 DATA ·atanhtab2076<> + 104(SB)/8, $0.269985148668178992E-01
44 DATA ·atanhtab2076<> + 112(SB)/8, $0.364186619761331328E-01
45 DATA ·atanhtab2076<> + 120(SB)/8, $0.469505379381388441E-01
46 GLOBL ·atanhtab2076<> + 0(SB), RODATA, $128
49 DATA ·atanhtabh2075<> + 0(SB)/8, $0.5
50 DATA ·atanhtabh2075<> + 8(SB)/8, $-.5
51 GLOBL ·atanhtabh2075<> + 0(SB), RODATA, $16
53 // Atanh returns the inverse hyperbolic tangent of the argument.
59 // Atanh(x) = NaN if x < -1 or x > 1
61 // The algorithm used is minimax polynomial approximation
62 // with coefficients determined with a Remez exchange algorithm.
64 TEXT ·atanhAsm(SB), NOSPLIT, $0-16
66 MOVD $·atanhrodataL10<>+0(SB), R5
68 WORD $0xC0393FEF //iilf %r3,1072693247
72 WORD $0xB9170021 //llgtr %r2,%r1
76 WORD $0xC0392FFF //iilf %r3,805306367
90 WORD $0xED005088 //cdb %f0,.L12-.L10(%r5)
94 WORD $0xED005080 //cdb %f0,.L13-.L10(%r5)
103 WORD $0xED005070 //ddb %f0,.L15-.L10(%r5)
111 MOVD $·atanhtabh2075<>+0(SB), R2
116 WORD $0x68012000 //ld %f0,0(%r1,%r2)
117 WFMADB V2, V4, V0, V4
120 WORD $0xC0298006 //iilf %r2,2147909631
128 WORD $0xED405088 //adb %f4,.L12-.L10(%r5)
134 WORD $0xED305088 //sdb %f3,.L12-.L10(%r5)
139 RISBGZ $32, $47, $0, R2, R1
142 WFMADB V4, V2, V16, V4
144 WFMADB V4, V5, V6, V5
146 WFMADB V4, V1, V7, V1
147 WFMADB V2, V3, V4, V2
148 WFMADB V1, V6, V5, V1
151 WFMADB V4, V5, V3, V4
157 WFMADB V6, V4, V1, V6
160 WFMADB V2, V6, V3, V6
163 RISBGZ $57, $60, $51, R2, R2
164 MOVD $·atanhtab2076<>+0(SB), R1
166 WORD $0x68521000 //ld %f5,0(%r2,%r1)
168 WFMADB V2, V6, V5, V2
169 WFMADB V4, V3, V1, V4