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
// 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 approximation and other constants
DATA ·exprodataL22<> + 0(SB)/8, $800.0E+00
DATA ·exprodataL22<> + 8(SB)/8, $1.0000000000000022e+00
DATA ·exprodataL22<> + 16(SB)/8, $0.500000000000004237e+00
DATA ·exprodataL22<> + 24(SB)/8, $0.166666666630345592e+00
DATA ·exprodataL22<> + 32(SB)/8, $0.138926439368309441e-02
DATA ·exprodataL22<> + 40(SB)/8, $0.833349307718286047e-02
DATA ·exprodataL22<> + 48(SB)/8, $0.416666664838056960e-01
DATA ·exprodataL22<> + 56(SB)/8, $-.231904681384629956E-16
DATA ·exprodataL22<> + 64(SB)/8, $-.693147180559945286E+00
DATA ·exprodataL22<> + 72(SB)/8, $0.144269504088896339E+01
DATA ·exprodataL22<> + 80(SB)/8, $704.0E+00
GLOBL ·exprodataL22<> + 0(SB), RODATA, $88
 
DATA ·expxinf<> + 0(SB)/8, $0x7ff0000000000000
GLOBL ·expxinf<> + 0(SB), RODATA, $8
DATA ·expx4ff<> + 0(SB)/8, $0x4ff0000000000000
GLOBL ·expx4ff<> + 0(SB), RODATA, $8
DATA ·expx2ff<> + 0(SB)/8, $0x2ff0000000000000
GLOBL ·expx2ff<> + 0(SB), RODATA, $8
DATA ·expxaddexp<> + 0(SB)/8, $0xc2f0000100003fef
GLOBL ·expxaddexp<> + 0(SB), RODATA, $8
 
// Log multipliers table
DATA ·exptexp<> + 0(SB)/8, $0.442737824274138381E-01
DATA ·exptexp<> + 8(SB)/8, $0.263602189790660309E-01
DATA ·exptexp<> + 16(SB)/8, $0.122565642281703586E-01
DATA ·exptexp<> + 24(SB)/8, $0.143757052860721398E-02
DATA ·exptexp<> + 32(SB)/8, $-.651375034121276075E-02
DATA ·exptexp<> + 40(SB)/8, $-.119317678849450159E-01
DATA ·exptexp<> + 48(SB)/8, $-.150868749549871069E-01
DATA ·exptexp<> + 56(SB)/8, $-.161992609578469234E-01
DATA ·exptexp<> + 64(SB)/8, $-.154492360403337917E-01
DATA ·exptexp<> + 72(SB)/8, $-.129850717389178721E-01
DATA ·exptexp<> + 80(SB)/8, $-.892902649276657891E-02
DATA ·exptexp<> + 88(SB)/8, $-.338202636596794887E-02
DATA ·exptexp<> + 96(SB)/8, $0.357266307045684762E-02
DATA ·exptexp<> + 104(SB)/8, $0.118665304327406698E-01
DATA ·exptexp<> + 112(SB)/8, $0.214434994118118914E-01
DATA ·exptexp<> + 120(SB)/8, $0.322580645161290314E-01
GLOBL ·exptexp<> + 0(SB), RODATA, $128
 
// Exp returns e**x, the base-e exponential of x.
//
// Special cases are:
//      Exp(+Inf) = +Inf
//      Exp(NaN) = NaN
// Very large values overflow to 0 or +Inf.
// Very small values underflow to 1.
// The algorithm used is minimax polynomial approximation using a table of
// polynomial coefficients determined with a Remez exchange algorithm.
 
TEXT    ·expAsm(SB), NOSPLIT, $0-16
   FMOVD    x+0(FP), F0
   MOVD    $·exprodataL22<>+0(SB), R5
   LTDBR    F0, F0
   BLTU    L20
   FMOVD    F0, F2
L2:
   WORD    $0xED205050    //cdb    %f2,.L23-.L22(%r5)
   BYTE    $0x00
   BYTE    $0x19
   BGE    L16
   BVS    L16
   WFCEDBS    V2, V2, V2
   BVS    LEXITTAGexp
   MOVD    $·expxaddexp<>+0(SB), R1
   FMOVD    72(R5), F6
   FMOVD    0(R1), F2
   WFMSDB    V0, V6, V2, V6
   FMOVD    64(R5), F4
   FADD    F6, F2
   FMOVD    56(R5), F1
   FMADD    F4, F2, F0
   FMOVD    48(R5), F3
   WFMADB    V2, V1, V0, V2
   FMOVD    40(R5), F1
   FMOVD    32(R5), F4
   FMUL    F0, F0
   WFMADB    V2, V4, V1, V4
   LGDR    F6, R1
   FMOVD    24(R5), F1
   WFMADB    V2, V3, V1, V3
   FMOVD    16(R5), F1
   WFMADB    V0, V4, V3, V4
   FMOVD    8(R5), F3
   WFMADB    V2, V1, V3, V1
   WORD    $0xEC3139BC    //risbg    %r3,%r1,57,128+60,3
   BYTE    $0x03
   BYTE    $0x55
   WFMADB    V0, V4, V1, V0
   MOVD    $·exptexp<>+0(SB), R2
   WORD    $0x68432000    //ld    %f4,0(%r3,%r2)
   FMADD    F4, F2, F2
   SLD    $48, R1, R2
   WFMADB    V2, V0, V4, V2
   LDGR    R2, F0
   FMADD    F0, F2, F0
   FMOVD    F0, ret+8(FP)
   RET
L16:
   WFCEDBS    V2, V2, V4
   BVS    LEXITTAGexp
   WORD    $0xED205000    //cdb    %f2,.L33-.L22(%r5)
   BYTE    $0x00
   BYTE    $0x19
   BLT    L6
   WFCEDBS    V2, V0, V0
   BVS    L13
   MOVD    $·expxinf<>+0(SB), R1
   FMOVD    0(R1), F0
   FMOVD    F0, ret+8(FP)
   RET
L20:
   WORD    $0xB3130020    //lcdbr    %f2,%f0
   BR    L2
L6:
   MOVD    $·expxaddexp<>+0(SB), R1
   FMOVD    72(R5), F3
   FMOVD    0(R1), F4
   WFMSDB    V0, V3, V4, V3
   FMOVD    64(R5), F6
   FADD    F3, F4
   FMOVD    56(R5), F5
   WFMADB    V4, V6, V0, V6
   FMOVD    32(R5), F1
   WFMADB    V4, V5, V6, V4
   FMOVD    40(R5), F5
   FMUL    F6, F6
   WFMADB    V4, V1, V5, V1
   FMOVD    48(R5), F7
   LGDR    F3, R1
   FMOVD    24(R5), F5
   WFMADB    V4, V7, V5, V7
   FMOVD    16(R5), F5
   WFMADB    V6, V1, V7, V1
   FMOVD    8(R5), F7
   WFMADB    V4, V5, V7, V5
   WORD    $0xEC3139BC    //risbg    %r3,%r1,57,128+60,3
   BYTE    $0x03
   BYTE    $0x55
   WFMADB    V6, V1, V5, V6
   MOVD    $·exptexp<>+0(SB), R2
   WFCHDBS    V2, V0, V0
   WORD    $0x68132000    //ld    %f1,0(%r3,%r2)
   FMADD    F1, F4, F4
   MOVD    $0x4086000000000000, R2
   WFMADB    V4, V6, V1, V4
   BEQ    L21
   ADDW    $0xF000, R1
   WORD    $0xEC21000F    //risbgn    %r2,%r1,64-64+0,64-64+0+16-1,64-0-16
   BYTE    $0x30
   BYTE    $0x59
   LDGR    R2, F0
   FMADD    F0, F4, F0
   MOVD    $·expx4ff<>+0(SB), R3
   FMOVD    0(R3), F2
   FMUL    F2, F0
   FMOVD    F0, ret+8(FP)
   RET
L13:
   FMOVD    $0, F0
   FMOVD    F0, ret+8(FP)
   RET
L21:
   ADDW    $0x1000, R1
   WORD    $0xEC21000F    //risbgn    %r2,%r1,64-64+0,64-64+0+16-1,64-0-16
   BYTE    $0x30
   BYTE    $0x59
   LDGR    R2, F0
   FMADD    F0, F4, F0
   MOVD    $·expx2ff<>+0(SB), R3
   FMOVD    0(R3), F2
   FMUL    F2, F0
   FMOVD    F0, ret+8(FP)
   RET
LEXITTAGexp:
   FMOVD    F0, ret+8(FP)
   RET