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.
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
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
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
49 // Exp returns e**x, the base-e exponential of x.
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.
59 TEXT ·expAsm(SB), NOSPLIT, $0-16
61 MOVD $·exprodataL22<>+0(SB), R5
66 WORD $0xED205050 //cdb %f2,.L23-.L22(%r5)
73 MOVD $·expxaddexp<>+0(SB), R1
94 RISBGZ $57, $60, $3, R1, R3
96 MOVD $·exptexp<>+0(SB), R2
97 WORD $0x68432000 //ld %f4,0(%r3,%r2)
100 WFMADB V2, V0, V4, V2
108 WORD $0xED205000 //cdb %f2,.L33-.L22(%r5)
114 MOVD $·expxinf<>+0(SB), R1
119 WORD $0xB3130020 //lcdbr %f2,%f0
122 MOVD $·expxaddexp<>+0(SB), R1
125 WFMSDB V0, V3, V4, V3
129 WFMADB V4, V6, V0, V6
131 WFMADB V4, V5, V6, V4
134 WFMADB V4, V1, V5, V1
138 WFMADB V4, V7, V5, V7
140 WFMADB V6, V1, V7, V1
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
147 WORD $0x68132000 //ld %f1,0(%r3,%r2)
149 MOVD $0x4086000000000000, R2
150 WFMADB V4, V6, V1, V4
153 RISBGN $0, $15, $48, R1, R2
156 MOVD $·expx4ff<>+0(SB), R3
167 RISBGN $0, $15, $48, R1, R2
170 MOVD $·expx2ff<>+0(SB), R3