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
// 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 approximations
DATA ·logrodataL21<> + 0(SB)/8, $-.499999999999999778E+00
DATA ·logrodataL21<> + 8(SB)/8, $0.333333333333343751E+00
DATA ·logrodataL21<> + 16(SB)/8, $-.250000000001606881E+00
DATA ·logrodataL21<> + 24(SB)/8, $0.199999999971603032E+00
DATA ·logrodataL21<> + 32(SB)/8, $-.166666663114122038E+00
DATA ·logrodataL21<> + 40(SB)/8, $-.125002923782692399E+00
DATA ·logrodataL21<> + 48(SB)/8, $0.111142014580396256E+00
DATA ·logrodataL21<> + 56(SB)/8, $0.759438932618934220E-01
DATA ·logrodataL21<> + 64(SB)/8, $0.142857144267212549E+00
DATA ·logrodataL21<> + 72(SB)/8, $-.993038938793590759E-01
DATA ·logrodataL21<> + 80(SB)/8, $-1.0
GLOBL ·logrodataL21<> + 0(SB), RODATA, $88
 
// Constants
DATA ·logxminf<> + 0(SB)/8, $0xfff0000000000000
GLOBL ·logxminf<> + 0(SB), RODATA, $8
DATA ·logxnan<> + 0(SB)/8, $0x7ff8000000000000
GLOBL ·logxnan<> + 0(SB), RODATA, $8
DATA ·logx43f<> + 0(SB)/8, $0x43f0000000000000
GLOBL ·logx43f<> + 0(SB), RODATA, $8
DATA ·logxl2<> + 0(SB)/8, $0x3fda7aecbeba4e46
GLOBL ·logxl2<> + 0(SB), RODATA, $8
DATA ·logxl1<> + 0(SB)/8, $0x3ffacde700000000
GLOBL ·logxl1<> + 0(SB), RODATA, $8
 
/* Input transform scale and add constants */
DATA ·logxm<> + 0(SB)/8, $0x3fc77604e63c84b1
DATA ·logxm<> + 8(SB)/8, $0x40fb39456ab53250
DATA ·logxm<> + 16(SB)/8, $0x3fc9ee358b945f3f
DATA ·logxm<> + 24(SB)/8, $0x40fb39418bf3b137
DATA ·logxm<> + 32(SB)/8, $0x3fccfb2e1304f4b6
DATA ·logxm<> + 40(SB)/8, $0x40fb393d3eda3022
DATA ·logxm<> + 48(SB)/8, $0x3fd0000000000000
DATA ·logxm<> + 56(SB)/8, $0x40fb393969e70000
DATA ·logxm<> + 64(SB)/8, $0x3fd11117aafbfe04
DATA ·logxm<> + 72(SB)/8, $0x40fb3936eaefafcf
DATA ·logxm<> + 80(SB)/8, $0x3fd2492af5e658b2
DATA ·logxm<> + 88(SB)/8, $0x40fb39343ff01715
DATA ·logxm<> + 96(SB)/8, $0x3fd3b50c622a43dd
DATA ·logxm<> + 104(SB)/8, $0x40fb39315adae2f3
DATA ·logxm<> + 112(SB)/8, $0x3fd56bbeea918777
DATA ·logxm<> + 120(SB)/8, $0x40fb392e21698552
GLOBL ·logxm<> + 0(SB), RODATA, $128
 
// Log returns the natural logarithm of the argument.
//
// Special cases are:
//      Log(+Inf) = +Inf
//      Log(0) = -Inf
//      Log(x < 0) = NaN
//      Log(NaN) = NaN
// The algorithm used is minimax polynomial approximation using a table of
// polynomial coefficients determined with a Remez exchange algorithm.
 
TEXT    ·logAsm(SB), NOSPLIT, $0-16
   FMOVD    x+0(FP), F0
   MOVD    $·logrodataL21<>+0(SB), R9
   MOVH    $0x8006, R4
   LGDR    F0, R1
   MOVD    $0x3FF0000000000000, R6
   SRAD    $48, R1, R1
   MOVD    $0x40F03E8000000000, R8
   SUBW    R1, R4
   WORD    $0xEC2420BB    //risbg    %r2,%r4,32,128+59,0
   BYTE    $0x00
   BYTE    $0x55
   WORD    $0xEC62000F    //risbgn    %r6,%r2,64-64+0,64-64+0+16-1,64-0-16
   BYTE    $0x30
   BYTE    $0x59
   WORD    $0xEC82101F    //risbgn    %r8,%r2,64-64+16,64-64+16+16-1,64-16-16
   BYTE    $0x20
   BYTE    $0x59
   MOVW    R1, R7
   CMPBGT    R7, $22, L17
   LTDBR    F0, F0
   MOVD    $·logx43f<>+0(SB), R1
   FMOVD    0(R1), F2
   BLEU    L3
   MOVH    $0x8005, R12
   MOVH    $0x8405, R0
   BR    L15
L7:
   LTDBR    F0, F0
   BLEU    L3
L15:
   FMUL    F2, F0
   LGDR    F0, R1
   SRAD    $48, R1, R1
   SUBW    R1, R0, R2
   SUBW    R1, R12, R3
   BYTE    $0x18    //lr    %r4,%r2
   BYTE    $0x42
   ANDW    $0xFFFFFFF0, R3
   ANDW    $0xFFFFFFF0, R2
   BYTE    $0x18    //lr    %r5,%r1
   BYTE    $0x51
   MOVW    R1, R7
   CMPBLE    R7, $22, L7
   WORD    $0xEC63000F    //risbgn    %r6,%r3,64-64+0,64-64+0+16-1,64-0-16
   BYTE    $0x30
   BYTE    $0x59
   WORD    $0xEC82101F    //risbgn    %r8,%r2,64-64+16,64-64+16+16-1,64-16-16
   BYTE    $0x20
   BYTE    $0x59
L2:
   MOVH    R5, R5
   MOVH    $0x7FEF, R1
   CMPW    R5, R1
   BGT    L1
   LDGR    R6, F2
   FMUL    F2, F0
   WORD    $0xEC4439BB    //risbg    %r4,%r4,57,128+59,3
   BYTE    $0x03
   BYTE    $0x55
   FMOVD    80(R9), F2
   MOVD    $·logxm<>+0(SB), R7
   ADD    R7, R4
   FMOVD    72(R9), F4
   WORD    $0xED004000    //madb    %f2,%f0,0(%r4)
   BYTE    $0x20
   BYTE    $0x1E
   FMOVD    64(R9), F1
   FMOVD    F2, F0
   FMOVD    56(R9), F2
   WFMADB    V0, V2, V4, V2
   WFMDB    V0, V0, V6
   FMOVD    48(R9), F4
   WFMADB    V0, V2, V4, V2
   FMOVD    40(R9), F4
   WFMADB    V2, V6, V1, V2
   FMOVD    32(R9), F1
   WFMADB    V6, V4, V1, V4
   FMOVD    24(R9), F1
   WFMADB    V6, V2, V1, V2
   FMOVD    16(R9), F1
   WFMADB    V6, V4, V1, V4
   MOVD    $·logxl1<>+0(SB), R1
   FMOVD    8(R9), F1
   WFMADB    V6, V2, V1, V2
   FMOVD    0(R9), F1
   WFMADB    V6, V4, V1, V4
   FMOVD    8(R4), F1
   WFMADB    V0, V2, V4, V2
   LDGR    R8, F4
   WFMADB    V6, V2, V0, V2
   WORD    $0xED401000    //msdb    %f1,%f4,0(%r1)
   BYTE    $0x10
   BYTE    $0x1F
   MOVD    ·logxl2<>+0(SB), R1
   WORD    $0xB3130001    //lcdbr    %f0,%f1
   LDGR    R1, F4
   WFMADB    V0, V4, V2, V0
L1:
   FMOVD    F0, ret+8(FP)
   RET
L3:
   LTDBR    F0, F0
   BEQ    L20
   BGE    L1
   BVS    L1
 
   MOVD    $·logxnan<>+0(SB), R1
   FMOVD    0(R1), F0
   BR    L1
L20:
   MOVD    $·logxminf<>+0(SB), R1
   FMOVD    0(R1), F0
   FMOVD    F0, ret+8(FP)
   RET
L17:
   BYTE    $0x18    //lr    %r5,%r1
   BYTE    $0x51
   BR    L2