Text file
src/math/exp_s390x.s
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 approximation and other constants
8 DATA ·exprodataL22<> + 0(SB)/8, $800.0E+00
9 DATA ·exprodataL22<> + 8(SB)/8, $1.0000000000000022e+00
10 DATA ·exprodataL22<> + 16(SB)/8, $0.500000000000004237e+00
11 DATA ·exprodataL22<> + 24(SB)/8, $0.166666666630345592e+00
12 DATA ·exprodataL22<> + 32(SB)/8, $0.138926439368309441e-02
13 DATA ·exprodataL22<> + 40(SB)/8, $0.833349307718286047e-02
14 DATA ·exprodataL22<> + 48(SB)/8, $0.416666664838056960e-01
15 DATA ·exprodataL22<> + 56(SB)/8, $-.231904681384629956E-16
16 DATA ·exprodataL22<> + 64(SB)/8, $-.693147180559945286E+00
17 DATA ·exprodataL22<> + 72(SB)/8, $0.144269504088896339E+01
18 DATA ·exprodataL22<> + 80(SB)/8, $704.0E+00
19 GLOBL ·exprodataL22<> + 0(SB), RODATA, $88
20
21 DATA ·expxinf<> + 0(SB)/8, $0x7ff0000000000000
22 GLOBL ·expxinf<> + 0(SB), RODATA, $8
23 DATA ·expx4ff<> + 0(SB)/8, $0x4ff0000000000000
24 GLOBL ·expx4ff<> + 0(SB), RODATA, $8
25 DATA ·expx2ff<> + 0(SB)/8, $0x2ff0000000000000
26 GLOBL ·expx2ff<> + 0(SB), RODATA, $8
27 DATA ·expxaddexp<> + 0(SB)/8, $0xc2f0000100003fef
28 GLOBL ·expxaddexp<> + 0(SB), RODATA, $8
29
30 // Log multipliers table
31 DATA ·exptexp<> + 0(SB)/8, $0.442737824274138381E-01
32 DATA ·exptexp<> + 8(SB)/8, $0.263602189790660309E-01
33 DATA ·exptexp<> + 16(SB)/8, $0.122565642281703586E-01
34 DATA ·exptexp<> + 24(SB)/8, $0.143757052860721398E-02
35 DATA ·exptexp<> + 32(SB)/8, $-.651375034121276075E-02
36 DATA ·exptexp<> + 40(SB)/8, $-.119317678849450159E-01
37 DATA ·exptexp<> + 48(SB)/8, $-.150868749549871069E-01
38 DATA ·exptexp<> + 56(SB)/8, $-.161992609578469234E-01
39 DATA ·exptexp<> + 64(SB)/8, $-.154492360403337917E-01
40 DATA ·exptexp<> + 72(SB)/8, $-.129850717389178721E-01
41 DATA ·exptexp<> + 80(SB)/8, $-.892902649276657891E-02
42 DATA ·exptexp<> + 88(SB)/8, $-.338202636596794887E-02
43 DATA ·exptexp<> + 96(SB)/8, $0.357266307045684762E-02
44 DATA ·exptexp<> + 104(SB)/8, $0.118665304327406698E-01
45 DATA ·exptexp<> + 112(SB)/8, $0.214434994118118914E-01
46 DATA ·exptexp<> + 120(SB)/8, $0.322580645161290314E-01
47 GLOBL ·exptexp<> + 0(SB), RODATA, $128
48
49 // Exp returns e**x, the base-e exponential of x.
50 //
51 // Special cases are:
52 // Exp(+Inf) = +Inf
53 // Exp(NaN) = NaN
54 // Very large values overflow to 0 or +Inf.
55 // Very small values underflow to 1.
56 // The algorithm used is minimax polynomial approximation using a table of
57 // polynomial coefficients determined with a Remez exchange algorithm.
58
59 TEXT ·expAsm(SB), NOSPLIT, $0-16
60 FMOVD x+0(FP), F0
61 MOVD $·exprodataL22<>+0(SB), R5
62 LTDBR F0, F0
63 BLTU L20
64 FMOVD F0, F2
65 L2:
66 WORD $0xED205050 //cdb %f2,.L23-.L22(%r5)
67 BYTE $0x00
68 BYTE $0x19
69 BGE L16
70 BVS L16
71 WFCEDBS V2, V2, V2
72 BVS LEXITTAGexp
73 MOVD $·expxaddexp<>+0(SB), R1
74 FMOVD 72(R5), F6
75 FMOVD 0(R1), F2
76 WFMSDB V0, V6, V2, V6
77 FMOVD 64(R5), F4
78 FADD F6, F2
79 FMOVD 56(R5), F1
80 FMADD F4, F2, F0
81 FMOVD 48(R5), F3
82 WFMADB V2, V1, V0, V2
83 FMOVD 40(R5), F1
84 FMOVD 32(R5), F4
85 FMUL F0, F0
86 WFMADB V2, V4, V1, V4
87 LGDR F6, R1
88 FMOVD 24(R5), F1
89 WFMADB V2, V3, V1, V3
90 FMOVD 16(R5), F1
91 WFMADB V0, V4, V3, V4
92 FMOVD 8(R5), F3
93 WFMADB V2, V1, V3, V1
94 RISBGZ $57, $60, $3, R1, R3
95 WFMADB V0, V4, V1, V0
96 MOVD $·exptexp<>+0(SB), R2
97 WORD $0x68432000 //ld %f4,0(%r3,%r2)
98 FMADD F4, F2, F2
99 SLD $48, R1, R2
100 WFMADB V2, V0, V4, V2
101 LDGR R2, F0
102 FMADD F0, F2, F0
103 FMOVD F0, ret+8(FP)
104 RET
105 L16:
106 WFCEDBS V2, V2, V4
107 BVS LEXITTAGexp
108 WORD $0xED205000 //cdb %f2,.L33-.L22(%r5)
109 BYTE $0x00
110 BYTE $0x19
111 BLT L6
112 WFCEDBS V2, V0, V0
113 BVS L13
114 MOVD $·expxinf<>+0(SB), R1
115 FMOVD 0(R1), F0
116 FMOVD F0, ret+8(FP)
117 RET
118 L20:
119 WORD $0xB3130020 //lcdbr %f2,%f0
120 BR L2
121 L6:
122 MOVD $·expxaddexp<>+0(SB), R1
123 FMOVD 72(R5), F3
124 FMOVD 0(R1), F4
125 WFMSDB V0, V3, V4, V3
126 FMOVD 64(R5), F6
127 FADD F3, F4
128 FMOVD 56(R5), F5
129 WFMADB V4, V6, V0, V6
130 FMOVD 32(R5), F1
131 WFMADB V4, V5, V6, V4
132 FMOVD 40(R5), F5
133 FMUL F6, F6
134 WFMADB V4, V1, V5, V1
135 FMOVD 48(R5), F7
136 LGDR F3, R1
137 FMOVD 24(R5), F5
138 WFMADB V4, V7, V5, V7
139 FMOVD 16(R5), F5
140 WFMADB V6, V1, V7, V1
141 FMOVD 8(R5), F7
142 WFMADB V4, V5, V7, V5
143 RISBGZ $57, $60, $3, R1, R3
144 WFMADB V6, V1, V5, V6
145 MOVD $·exptexp<>+0(SB), R2
146 WFCHDBS V2, V0, V0
147 WORD $0x68132000 //ld %f1,0(%r3,%r2)
148 FMADD F1, F4, F4
149 MOVD $0x4086000000000000, R2
150 WFMADB V4, V6, V1, V4
151 BEQ L21
152 ADDW $0xF000, R1
153 RISBGN $0, $15, $48, R1, R2
154 LDGR R2, F0
155 FMADD F0, F4, F0
156 MOVD $·expx4ff<>+0(SB), R3
157 FMOVD 0(R3), F2
158 FMUL F2, F0
159 FMOVD F0, ret+8(FP)
160 RET
161 L13:
162 FMOVD $0, F0
163 FMOVD F0, ret+8(FP)
164 RET
165 L21:
166 ADDW $0x1000, R1
167 RISBGN $0, $15, $48, R1, R2
168 LDGR R2, F0
169 FMADD F0, F4, F0
170 MOVD $·expx2ff<>+0(SB), R3
171 FMOVD 0(R3), F2
172 FMUL F2, F0
173 FMOVD F0, ret+8(FP)
174 RET
175 LEXITTAGexp:
176 FMOVD F0, ret+8(FP)
177 RET
178
View as plain text