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 ·asinhrodataL18<> + 0(SB)/8, $0.749999999977387502E-01
9DATA ·asinhrodataL18<> + 8(SB)/8, $-.166666666666657082E+00
10DATA ·asinhrodataL18<> + 16(SB)/8, $0.303819368237360639E-01
11DATA ·asinhrodataL18<> + 24(SB)/8, $-.446428569571752982E-01
12DATA ·asinhrodataL18<> + 32(SB)/8, $0.173500047922695924E-01
13DATA ·asinhrodataL18<> + 40(SB)/8, $-.223719767210027185E-01
14DATA ·asinhrodataL18<> + 48(SB)/8, $0.113655037946822130E-01
15DATA ·asinhrodataL18<> + 56(SB)/8, $0.579747490622448943E-02
16DATA ·asinhrodataL18<> + 64(SB)/8, $-.139372433914359122E-01
17DATA ·asinhrodataL18<> + 72(SB)/8, $-.218674325255800840E-02
18DATA ·asinhrodataL18<> + 80(SB)/8, $-.891074277756961157E-02
19DATA ·asinhrodataL18<> + 88(SB)/8, $.41375273347623353626
20DATA ·asinhrodataL18<> + 96(SB)/8, $.51487302528619766235E+04
21DATA ·asinhrodataL18<> + 104(SB)/8, $-1.67526912689208984375
22DATA ·asinhrodataL18<> + 112(SB)/8, $0.181818181818181826E+00
23DATA ·asinhrodataL18<> + 120(SB)/8, $-.165289256198351540E-01
24DATA ·asinhrodataL18<> + 128(SB)/8, $0.200350613573012186E-02
25DATA ·asinhrodataL18<> + 136(SB)/8, $-.273205381970859341E-03
26DATA ·asinhrodataL18<> + 144(SB)/8, $0.397389654305194527E-04
27DATA ·asinhrodataL18<> + 152(SB)/8, $0.938370938292558173E-06
28DATA ·asinhrodataL18<> + 160(SB)/8, $0.212881813645679599E-07
29DATA ·asinhrodataL18<> + 168(SB)/8, $-.602107458843052029E-05
30DATA ·asinhrodataL18<> + 176(SB)/8, $-.148682720127920854E-06
31DATA ·asinhrodataL18<> + 184(SB)/8, $-5.5
32DATA ·asinhrodataL18<> + 192(SB)/8, $1.0
33DATA ·asinhrodataL18<> + 200(SB)/8, $1.0E-20
34GLOBL ·asinhrodataL18<> + 0(SB), RODATA, $208
35
36// Table of log correction terms
37DATA ·asinhtab2080<> + 0(SB)/8, $0.585235384085551248E-01
38DATA ·asinhtab2080<> + 8(SB)/8, $0.412206153771168640E-01
39DATA ·asinhtab2080<> + 16(SB)/8, $0.273839003221648339E-01
40DATA ·asinhtab2080<> + 24(SB)/8, $0.166383778368856480E-01
41DATA ·asinhtab2080<> + 32(SB)/8, $0.866678223433169637E-02
42DATA ·asinhtab2080<> + 40(SB)/8, $0.319831684989627514E-02
43DATA ·asinhtab2080<> + 48(SB)/8, $0.0
44DATA ·asinhtab2080<> + 56(SB)/8, $-.113006378583725549E-02
45DATA ·asinhtab2080<> + 64(SB)/8, $-.367979419636602491E-03
46DATA ·asinhtab2080<> + 72(SB)/8, $0.213172484510484979E-02
47DATA ·asinhtab2080<> + 80(SB)/8, $0.623271047682013536E-02
48DATA ·asinhtab2080<> + 88(SB)/8, $0.118140812789696885E-01
49DATA ·asinhtab2080<> + 96(SB)/8, $0.187681358930914206E-01
50DATA ·asinhtab2080<> + 104(SB)/8, $0.269985148668178992E-01
51DATA ·asinhtab2080<> + 112(SB)/8, $0.364186619761331328E-01
52DATA ·asinhtab2080<> + 120(SB)/8, $0.469505379381388441E-01
53GLOBL ·asinhtab2080<> + 0(SB), RODATA, $128
54
55// Asinh returns the inverse hyperbolic sine of the argument.
56//
57// Special cases are:
58//      Asinh(±0) = ±0
59//      Asinh(±Inf) = ±Inf
60//      Asinh(NaN) = NaN
61// The algorithm used is minimax polynomial approximation
62// with coefficients determined with a Remez exchange algorithm.
63
64TEXT	·asinhAsm(SB), NOSPLIT, $0-16
65	FMOVD	x+0(FP), F0
66	MOVDasinhrodataL18<>+0(SB), R9
67	LGDR	F0, R12
68	WORD	$0xC0293FDF	//iilf	%r2,1071644671
69	BYTE	$0xFF
70	BYTE	$0xFF
71	SRAD	$32, R12
72	WORD	$0xB917001C	//llgtr	%r1,%r12
73	MOVW	R1, R6
74	MOVW	R2, R7
75	CMPBLE	R6, R7, L2
76	WORD	$0xC0295FEF	//iilf	%r2,1609564159
77	BYTE	$0xFF
78	BYTE	$0xFF
79	MOVW	R2, R7
80	CMPBLE	R6, R7, L14
81L3:
82	WORD	$0xC0297FEF	//iilf	%r2,2146435071
83	BYTE	$0xFF
84	BYTE	$0xFF
85	CMPW	R1, R2
86	BGT	L1
87	LTDBR	F0, F0
88	FMOVD	F0, F10
89	BLTU	L15
90L9:
91	FMOVD	$0, F0
92	WFADB	V0, V10, V0
93	WORD	$0xC0398006	//iilf	%r3,2147909631
94	BYTE	$0x7F
95	BYTE	$0xFF
96	LGDR	F0, R5
97	SRAD	$32, R5
98	MOVH	$0x0, R2
99	SUBW	R5, R3
100	FMOVD	$0, F8
101	RISBGZ	$32, $47, $0, R3, R4
102	BYTE	$0x18	//lr	%r1,%r4
103	BYTE	$0x14
104	RISBGN	$0, $31, $32, R4, R2
105	SUBW	$0x100000, R1
106	SRAW	$8, R1, R1
107	ORW	$0x45000000, R1
108	BR	L6
109L2:
110	MOVD	$0x30000000, R2
111	CMPW	R1, R2
112	BGT	L16
113	FMOVD	200(R9), F2
114	FMADD	F2, F0, F0
115L1:
116	FMOVD	F0, ret+8(FP)
117	RET
118L14:
119	LTDBR	F0, F0
120	BLTU	L17
121	FMOVD	F0, F10
122L4:
123	FMOVD	192(R9), F2
124	WFMADB	V0, V0, V2, V0
125	LTDBR	F0, F0
126	FSQRT	F0, F8
127L5:
128	WFADB	V8, V10, V0
129	WORD	$0xC0398006	//iilf	%r3,2147909631
130	BYTE	$0x7F
131	BYTE	$0xFF
132	LGDR	F0, R5
133	SRAD	$32, R5
134	MOVH	$0x0, R2
135	SUBW	R5, R3
136	RISBGZ	$32, $47, $0, R3, R4
137	SRAW	$8, R4, R1
138	RISBGN	$0, $31, $32, R4, R2
139	ORW	$0x45000000, R1
140L6:
141	LDGR	R2, F2
142	FMOVD	184(R9), F0
143	WFMADB	V8, V2, V0, V8
144	FMOVD	176(R9), F4
145	WFMADB	V10, V2, V8, V2
146	FMOVD	168(R9), F0
147	FMOVD	160(R9), F6
148	FMOVD	152(R9), F1
149	WFMADB	V2, V6, V4, V6
150	WFMADB	V2, V1, V0, V1
151	WFMDB	V2, V2, V4
152	FMOVD	144(R9), F0
153	WFMADB	V6, V4, V1, V6
154	FMOVD	136(R9), F1
155	RISBGZ	$57, $60, $51, R3, R3
156	WFMADB	V2, V0, V1, V0
157	FMOVD	128(R9), F1
158	WFMADB	V4, V6, V0, V6
159	FMOVD	120(R9), F0
160	WFMADB	V2, V1, V0, V1
161	VLVGF	$0, R1, V0
162	WFMADB	V4, V6, V1, V4
163	LDEBR	F0, F0
164	FMOVD	112(R9), F6
165	WFMADB	V2, V4, V6, V4
166	MOVDasinhtab2080<>+0(SB), R1
167	FMOVD	104(R9), F1
168	WORD	$0x68331000	//ld	%f3,0(%r3,%r1)
169	FMOVD	96(R9), F6
170	WFMADB	V2, V4, V3, V2
171	WFMADB	V0, V1, V6, V0
172	FMOVD	88(R9), F4
173	WFMADB	V0, V4, V2, V0
174	MOVD	R12, R6
175	CMPBGT	R6, $0, L1
176
177	WORD	$0xB3130000	//lcdbr	%f0,%f0
178	FMOVD	F0, ret+8(FP)
179	RET
180L16:
181	WFMDB	V0, V0, V1
182	FMOVD	80(R9), F6
183	WFMDB	V1, V1, V4
184	FMOVD	72(R9), F2
185	WFMADB	V4, V2, V6, V2
186	FMOVD	64(R9), F3
187	FMOVD	56(R9), F6
188	WFMADB	V4, V2, V3, V2
189	FMOVD	48(R9), F3
190	WFMADB	V4, V6, V3, V6
191	FMOVD	40(R9), F5
192	FMOVD	32(R9), F3
193	WFMADB	V4, V2, V5, V2
194	WFMADB	V4, V6, V3, V6
195	FMOVD	24(R9), F5
196	FMOVD	16(R9), F3
197	WFMADB	V4, V2, V5, V2
198	WFMADB	V4, V6, V3, V6
199	FMOVD	8(R9), F5
200	FMOVD	0(R9), F3
201	WFMADB	V4, V2, V5, V2
202	WFMADB	V4, V6, V3, V4
203	WFMDB	V0, V1, V6
204	WFMADB	V1, V4, V2, V4
205	FMADD	F4, F6, F0
206	FMOVD	F0, ret+8(FP)
207	RET
208L17:
209	WORD	$0xB31300A0	//lcdbr	%f10,%f0
210	BR	L4
211L15:
212	WORD	$0xB31300A0	//lcdbr	%f10,%f0
213	BR	L9
214