summaryrefslogtreecommitdiffstats
path: root/src/math/atanh_s390x.s
blob: ba0e92696720b3c95c1ebfd5a99594b42c17afe8 (plain)
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
// 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 ·atanhrodataL10<> + 0(SB)/8, $.41375273347623353626
DATA ·atanhrodataL10<> + 8(SB)/8, $.51487302528619766235E+04
DATA ·atanhrodataL10<> + 16(SB)/8, $-1.67526912689208984375
DATA ·atanhrodataL10<> + 24(SB)/8, $0.181818181818181826E+00
DATA ·atanhrodataL10<> + 32(SB)/8, $-.165289256198351540E-01
DATA ·atanhrodataL10<> + 40(SB)/8, $0.200350613573012186E-02
DATA ·atanhrodataL10<> + 48(SB)/8, $0.397389654305194527E-04
DATA ·atanhrodataL10<> + 56(SB)/8, $-.273205381970859341E-03
DATA ·atanhrodataL10<> + 64(SB)/8, $0.938370938292558173E-06
DATA ·atanhrodataL10<> + 72(SB)/8, $-.148682720127920854E-06
DATA ·atanhrodataL10<> + 80(SB)/8, $ 0.212881813645679599E-07
DATA ·atanhrodataL10<> + 88(SB)/8, $-.602107458843052029E-05
DATA ·atanhrodataL10<> + 96(SB)/8, $-5.5
DATA ·atanhrodataL10<> + 104(SB)/8, $-0.5
DATA ·atanhrodataL10<> + 112(SB)/8, $0.0
DATA ·atanhrodataL10<> + 120(SB)/8, $0x7ff8000000000000      //Nan
DATA ·atanhrodataL10<> + 128(SB)/8, $-1.0
DATA ·atanhrodataL10<> + 136(SB)/8, $1.0
DATA ·atanhrodataL10<> + 144(SB)/8, $1.0E-20
GLOBL ·atanhrodataL10<> + 0(SB), RODATA, $152

// Table of log correction terms
DATA ·atanhtab2076<> + 0(SB)/8, $0.585235384085551248E-01
DATA ·atanhtab2076<> + 8(SB)/8, $0.412206153771168640E-01
DATA ·atanhtab2076<> + 16(SB)/8, $0.273839003221648339E-01
DATA ·atanhtab2076<> + 24(SB)/8, $0.166383778368856480E-01
DATA ·atanhtab2076<> + 32(SB)/8, $0.866678223433169637E-02
DATA ·atanhtab2076<> + 40(SB)/8, $0.319831684989627514E-02
DATA ·atanhtab2076<> + 48(SB)/8, $0.000000000000000000E+00
DATA ·atanhtab2076<> + 56(SB)/8, $-.113006378583725549E-02
DATA ·atanhtab2076<> + 64(SB)/8, $-.367979419636602491E-03
DATA ·atanhtab2076<> + 72(SB)/8, $0.213172484510484979E-02
DATA ·atanhtab2076<> + 80(SB)/8, $0.623271047682013536E-02
DATA ·atanhtab2076<> + 88(SB)/8, $0.118140812789696885E-01
DATA ·atanhtab2076<> + 96(SB)/8, $0.187681358930914206E-01
DATA ·atanhtab2076<> + 104(SB)/8, $0.269985148668178992E-01
DATA ·atanhtab2076<> + 112(SB)/8, $0.364186619761331328E-01
DATA ·atanhtab2076<> + 120(SB)/8, $0.469505379381388441E-01
GLOBL ·atanhtab2076<> + 0(SB), RODATA, $128

// Table of +/- .5
DATA ·atanhtabh2075<> + 0(SB)/8, $0.5
DATA ·atanhtabh2075<> + 8(SB)/8, $-.5
GLOBL ·atanhtabh2075<> + 0(SB), RODATA, $16

// Atanh returns the inverse hyperbolic tangent of the argument.
//
// Special cases are:
//      Atanh(1) = +Inf
//      Atanh(±0) = ±0
//      Atanh(-1) = -Inf
//      Atanh(x) = NaN if x < -1 or x > 1
//      Atanh(NaN) = NaN
// The algorithm used is minimax polynomial approximation
// with coefficients determined with a Remez exchange algorithm.

TEXT    ·atanhAsm(SB), NOSPLIT, $0-16
	FMOVD   x+0(FP), F0
	MOVD    $·atanhrodataL10<>+0(SB), R5
	LGDR    F0, R1
	WORD    $0xC0393FEF //iilf  %r3,1072693247
	BYTE    $0xFF
	BYTE    $0xFF
	SRAD    $32, R1
	WORD    $0xB9170021 //llgtr %r2,%r1
	MOVW    R2, R6
	MOVW    R3, R7
	CMPBGT  R6, R7, L2
	WORD    $0xC0392FFF //iilf  %r3,805306367
	BYTE    $0xFF
	BYTE    $0xFF
	MOVW    R2, R6
	MOVW    R3, R7
	CMPBGT  R6, R7, L9
L3:
	FMOVD   144(R5), F2
	FMADD   F2, F0, F0
L1:
	FMOVD   F0, ret+8(FP)
	RET

L2:
	WORD    $0xED005088 //cdb   %f0,.L12-.L10(%r5)
	BYTE    $0x00
	BYTE    $0x19
	BEQ L5
	WORD    $0xED005080 //cdb   %f0,.L13-.L10(%r5)
	BYTE    $0x00
	BYTE    $0x19
	BEQ L5
	WFCEDBS V0, V0, V2
	BVS L1
	FMOVD   120(R5), F0
	BR  L1
L5:
	WORD    $0xED005070 //ddb   %f0,.L15-.L10(%r5)
	BYTE    $0x00
	BYTE    $0x1D
	FMOVD   F0, ret+8(FP)
	RET

L9:
	FMOVD   F0, F2
	MOVD    $·atanhtabh2075<>+0(SB), R2
	SRW $31, R1, R1
	FMOVD   104(R5), F4
	MOVW    R1, R1
	SLD $3, R1, R1
	WORD    $0x68012000 //ld    %f0,0(%r1,%r2)
	WFMADB  V2, V4, V0, V4
	VLEG    $0, 96(R5), V16
	FDIV    F4, F2
	WORD    $0xC0298006 //iilf  %r2,2147909631
	BYTE    $0x7F
	BYTE    $0xFF
	FMOVD   88(R5), F6
	FMOVD   80(R5), F1
	FMOVD   72(R5), F7
	FMOVD   64(R5), F5
	FMOVD   F2, F4
	WORD    $0xED405088 //adb   %f4,.L12-.L10(%r5)
	BYTE    $0x00
	BYTE    $0x1A
	LGDR    F4, R4
	SRAD    $32, R4
	FMOVD   F4, F3
	WORD    $0xED305088 //sdb   %f3,.L12-.L10(%r5)
	BYTE    $0x00
	BYTE    $0x1B
	SUBW    R4, R2
	WFSDB   V3, V2, V3
	RISBGZ  $32, $47, $0, R2, R1
	SLD $32, R1, R1
	LDGR    R1, F2
	WFMADB  V4, V2, V16, V4
	SRAW    $8, R2, R1
	WFMADB  V4, V5, V6, V5
	WFMDB   V4, V4, V6
	WFMADB  V4, V1, V7, V1
	WFMADB  V2, V3, V4, V2
	WFMADB  V1, V6, V5, V1
	FMOVD   56(R5), F3
	FMOVD   48(R5), F5
	WFMADB  V4, V5, V3, V4
	FMOVD   40(R5), F3
	FMADD   F1, F6, F4
	FMOVD   32(R5), F1
	FMADD   F3, F2, F1
	ANDW    $0xFFFFFF00, R1
	WFMADB  V6, V4, V1, V6
	FMOVD   24(R5), F3
	ORW $0x45000000, R1
	WFMADB  V2, V6, V3, V6
	VLVGF   $0, R1, V4
	LDEBR   F4, F4
	RISBGZ  $57, $60, $51, R2, R2
	MOVD    $·atanhtab2076<>+0(SB), R1
	FMOVD   16(R5), F3
	WORD    $0x68521000 //ld    %f5,0(%r2,%r1)
	FMOVD   8(R5), F1
	WFMADB  V2, V6, V5, V2
	WFMADB  V4, V3, V1, V4
	FMOVD   0(R5), F6
	FMADD   F6, F4, F2
	FMUL    F2, F0
	FMOVD   F0, ret+8(FP)
	RET