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.
4
5#include "textflag.h"
6
7// Minimax polynomial coefficients and other constants
8DATA ·atanhrodataL10<> + 0(SB)/8, $.41375273347623353626
9DATA ·atanhrodataL10<> + 8(SB)/8, $.51487302528619766235E+04
10DATA ·atanhrodataL10<> + 16(SB)/8, $-1.67526912689208984375
11DATA ·atanhrodataL10<> + 24(SB)/8, $0.181818181818181826E+00
12DATA ·atanhrodataL10<> + 32(SB)/8, $-.165289256198351540E-01
13DATA ·atanhrodataL10<> + 40(SB)/8, $0.200350613573012186E-02
14DATA ·atanhrodataL10<> + 48(SB)/8, $0.397389654305194527E-04
15DATA ·atanhrodataL10<> + 56(SB)/8, $-.273205381970859341E-03
16DATA ·atanhrodataL10<> + 64(SB)/8, $0.938370938292558173E-06
17DATA ·atanhrodataL10<> + 72(SB)/8, $-.148682720127920854E-06
18DATA ·atanhrodataL10<> + 80(SB)/8, $ 0.212881813645679599E-07
19DATA ·atanhrodataL10<> + 88(SB)/8, $-.602107458843052029E-05
20DATA ·atanhrodataL10<> + 96(SB)/8, $-5.5
21DATA ·atanhrodataL10<> + 104(SB)/8, $-0.5
22DATA ·atanhrodataL10<> + 112(SB)/8, $0.0
23DATA ·atanhrodataL10<> + 120(SB)/8, $0x7ff8000000000000      //Nan
24DATA ·atanhrodataL10<> + 128(SB)/8, $-1.0
25DATA ·atanhrodataL10<> + 136(SB)/8, $1.0
26DATA ·atanhrodataL10<> + 144(SB)/8, $1.0E-20
27GLOBL ·atanhrodataL10<> + 0(SB), RODATA, $152
28
29// Table of log correction terms
30DATA ·atanhtab2076<> + 0(SB)/8, $0.585235384085551248E-01
31DATA ·atanhtab2076<> + 8(SB)/8, $0.412206153771168640E-01
32DATA ·atanhtab2076<> + 16(SB)/8, $0.273839003221648339E-01
33DATA ·atanhtab2076<> + 24(SB)/8, $0.166383778368856480E-01
34DATA ·atanhtab2076<> + 32(SB)/8, $0.866678223433169637E-02
35DATA ·atanhtab2076<> + 40(SB)/8, $0.319831684989627514E-02
36DATA ·atanhtab2076<> + 48(SB)/8, $0.000000000000000000E+00
37DATA ·atanhtab2076<> + 56(SB)/8, $-.113006378583725549E-02
38DATA ·atanhtab2076<> + 64(SB)/8, $-.367979419636602491E-03
39DATA ·atanhtab2076<> + 72(SB)/8, $0.213172484510484979E-02
40DATA ·atanhtab2076<> + 80(SB)/8, $0.623271047682013536E-02
41DATA ·atanhtab2076<> + 88(SB)/8, $0.118140812789696885E-01
42DATA ·atanhtab2076<> + 96(SB)/8, $0.187681358930914206E-01
43DATA ·atanhtab2076<> + 104(SB)/8, $0.269985148668178992E-01
44DATA ·atanhtab2076<> + 112(SB)/8, $0.364186619761331328E-01
45DATA ·atanhtab2076<> + 120(SB)/8, $0.469505379381388441E-01
46GLOBL ·atanhtab2076<> + 0(SB), RODATA, $128
47
48// Table of +/- .5
49DATA ·atanhtabh2075<> + 0(SB)/8, $0.5
50DATA ·atanhtabh2075<> + 8(SB)/8, $-.5
51GLOBL ·atanhtabh2075<> + 0(SB), RODATA, $16
52
53// Atanh returns the inverse hyperbolic tangent of the argument.
54//
55// Special cases are:
56//      Atanh(1) = +Inf
57//      Atanh(±0) = ±0
58//      Atanh(-1) = -Inf
59//      Atanh(x) = NaN if x < -1 or x > 1
60//      Atanh(NaN) = NaN
61// The algorithm used is minimax polynomial approximation
62// with coefficients determined with a Remez exchange algorithm.
63
64TEXT    ·atanhAsm(SB), NOSPLIT, $0-16
65	FMOVD   x+0(FP), F0
66	MOVDatanhrodataL10<>+0(SB), R5
67	LGDR    F0, R1
68	WORD    $0xC0393FEF //iilf  %r3,1072693247
69	BYTE    $0xFF
70	BYTE    $0xFF
71	SRAD    $32, R1
72	WORD    $0xB9170021 //llgtr %r2,%r1
73	MOVW    R2, R6
74	MOVW    R3, R7
75	CMPBGT  R6, R7, L2
76	WORD    $0xC0392FFF //iilf  %r3,805306367
77	BYTE    $0xFF
78	BYTE    $0xFF
79	MOVW    R2, R6
80	MOVW    R3, R7
81	CMPBGT  R6, R7, L9
82L3:
83	FMOVD   144(R5), F2
84	FMADD   F2, F0, F0
85L1:
86	FMOVD   F0, ret+8(FP)
87	RET
88
89L2:
90	WORD    $0xED005088 //cdb   %f0,.L12-.L10(%r5)
91	BYTE    $0x00
92	BYTE    $0x19
93	BEQ L5
94	WORD    $0xED005080 //cdb   %f0,.L13-.L10(%r5)
95	BYTE    $0x00
96	BYTE    $0x19
97	BEQ L5
98	WFCEDBS V0, V0, V2
99	BVS L1
100	FMOVD   120(R5), F0
101	BR  L1
102L5:
103	WORD    $0xED005070 //ddb   %f0,.L15-.L10(%r5)
104	BYTE    $0x00
105	BYTE    $0x1D
106	FMOVD   F0, ret+8(FP)
107	RET
108
109L9:
110	FMOVD   F0, F2
111	MOVDatanhtabh2075<>+0(SB), R2
112	SRW $31, R1, R1
113	FMOVD   104(R5), F4
114	MOVW    R1, R1
115	SLD $3, R1, R1
116	WORD    $0x68012000 //ld    %f0,0(%r1,%r2)
117	WFMADB  V2, V4, V0, V4
118	VLEG    $0, 96(R5), V16
119	FDIV    F4, F2
120	WORD    $0xC0298006 //iilf  %r2,2147909631
121	BYTE    $0x7F
122	BYTE    $0xFF
123	FMOVD   88(R5), F6
124	FMOVD   80(R5), F1
125	FMOVD   72(R5), F7
126	FMOVD   64(R5), F5
127	FMOVD   F2, F4
128	WORD    $0xED405088 //adb   %f4,.L12-.L10(%r5)
129	BYTE    $0x00
130	BYTE    $0x1A
131	LGDR    F4, R4
132	SRAD    $32, R4
133	FMOVD   F4, F3
134	WORD    $0xED305088 //sdb   %f3,.L12-.L10(%r5)
135	BYTE    $0x00
136	BYTE    $0x1B
137	SUBW    R4, R2
138	WFSDB   V3, V2, V3
139	RISBGZ  $32, $47, $0, R2, R1
140	SLD $32, R1, R1
141	LDGR    R1, F2
142	WFMADB  V4, V2, V16, V4
143	SRAW    $8, R2, R1
144	WFMADB  V4, V5, V6, V5
145	WFMDB   V4, V4, V6
146	WFMADB  V4, V1, V7, V1
147	WFMADB  V2, V3, V4, V2
148	WFMADB  V1, V6, V5, V1
149	FMOVD   56(R5), F3
150	FMOVD   48(R5), F5
151	WFMADB  V4, V5, V3, V4
152	FMOVD   40(R5), F3
153	FMADD   F1, F6, F4
154	FMOVD   32(R5), F1
155	FMADD   F3, F2, F1
156	ANDW    $0xFFFFFF00, R1
157	WFMADB  V6, V4, V1, V6
158	FMOVD   24(R5), F3
159	ORW $0x45000000, R1
160	WFMADB  V2, V6, V3, V6
161	VLVGF   $0, R1, V4
162	LDEBR   F4, F4
163	RISBGZ  $57, $60, $51, R2, R2
164	MOVDatanhtab2076<>+0(SB), R1
165	FMOVD   16(R5), F3
166	WORD    $0x68521000 //ld    %f5,0(%r2,%r1)
167	FMOVD   8(R5), F1
168	WFMADB  V2, V6, V5, V2
169	WFMADB  V4, V3, V1, V4
170	FMOVD   0(R5), F6
171	FMADD   F6, F4, F2
172	FMUL    F2, F0
173	FMOVD   F0, ret+8(FP)
174	RET
175