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