1
2
3
4
5 package sys
6
7
8
9 var deBruijn32tab = [32]byte{
10 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
11 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9,
12 }
13
14 const deBruijn32 = 0x077CB531
15
16 var deBruijn64tab = [64]byte{
17 0, 1, 56, 2, 57, 49, 28, 3, 61, 58, 42, 50, 38, 29, 17, 4,
18 62, 47, 59, 36, 45, 43, 51, 22, 53, 39, 33, 30, 24, 18, 12, 5,
19 63, 55, 48, 27, 60, 41, 37, 16, 46, 35, 44, 21, 52, 32, 23, 11,
20 54, 26, 40, 15, 34, 20, 31, 10, 25, 14, 19, 9, 13, 8, 7, 6,
21 }
22
23 const deBruijn64 = 0x03f79d71b4ca8b09
24
25 const ntz8tab = "" +
26 "\x08\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" +
27 "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" +
28 "\x05\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" +
29 "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" +
30 "\x06\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" +
31 "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" +
32 "\x05\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" +
33 "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" +
34 "\x07\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" +
35 "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" +
36 "\x05\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" +
37 "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" +
38 "\x06\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" +
39 "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" +
40 "\x05\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" +
41 "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00"
42
43
44 func TrailingZeros32(x uint32) int {
45 if x == 0 {
46 return 32
47 }
48
49 return int(deBruijn32tab[(x&-x)*deBruijn32>>(32-5)])
50 }
51
52
53 func TrailingZeros64(x uint64) int {
54 if x == 0 {
55 return 64
56 }
57
58
59
60
61
62
63
64
65
66
67
68 return int(deBruijn64tab[(x&-x)*deBruijn64>>(64-6)])
69 }
70
71
72 func TrailingZeros8(x uint8) int {
73 return int(ntz8tab[x])
74 }
75
76 const len8tab = "" +
77 "\x00\x01\x02\x02\x03\x03\x03\x03\x04\x04\x04\x04\x04\x04\x04\x04" +
78 "\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05" +
79 "\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06" +
80 "\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06" +
81 "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" +
82 "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" +
83 "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" +
84 "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" +
85 "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" +
86 "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" +
87 "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" +
88 "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" +
89 "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" +
90 "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" +
91 "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" +
92 "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08"
93
94
95
96
97
98
99 func Len64(x uint64) (n int) {
100 if x >= 1<<32 {
101 x >>= 32
102 n = 32
103 }
104 if x >= 1<<16 {
105 x >>= 16
106 n += 16
107 }
108 if x >= 1<<8 {
109 x >>= 8
110 n += 8
111 }
112 return n + int(len8tab[x])
113 }
114
115
116
117 const m0 = 0x5555555555555555
118 const m1 = 0x3333333333333333
119 const m2 = 0x0f0f0f0f0f0f0f0f
120
121
122 func OnesCount64(x uint64) int {
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142 const m = 1<<64 - 1
143 x = x>>1&(m0&m) + x&(m0&m)
144 x = x>>2&(m1&m) + x&(m1&m)
145 x = (x>>4 + x) & (m2 & m)
146 x += x >> 8
147 x += x >> 16
148 x += x >> 32
149 return int(x) & (1<<7 - 1)
150 }
151
152
153 func LeadingZeros64(x uint64) int { return 64 - Len64(x) }
154
155
156 func LeadingZeros8(x uint8) int { return 8 - Len8(x) }
157
158
159 func Len8(x uint8) int {
160 return int(len8tab[x])
161 }
162
163
164
165 func Bswap64(x uint64) uint64 {
166 c8 := uint64(0x00ff00ff00ff00ff)
167 a := x >> 8 & c8
168 b := (x & c8) << 8
169 x = a | b
170 c16 := uint64(0x0000ffff0000ffff)
171 a = x >> 16 & c16
172 b = (x & c16) << 16
173 x = a | b
174 c32 := uint64(0x00000000ffffffff)
175 a = x >> 32 & c32
176 b = (x & c32) << 32
177 x = a | b
178 return x
179 }
180
181
182
183 func Bswap32(x uint32) uint32 {
184 c8 := uint32(0x00ff00ff)
185 a := x >> 8 & c8
186 b := (x & c8) << 8
187 x = a | b
188 c16 := uint32(0x0000ffff)
189 a = x >> 16 & c16
190 b = (x & c16) << 16
191 x = a | b
192 return x
193 }
194
195
196
197
198
199
200 func Prefetch(addr uintptr) {}
201
202
203
204
205
206
207
208 func PrefetchStreamed(addr uintptr) {}
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233 func GetCallerPC() uintptr
234
235 func GetCallerSP() uintptr
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256 func GetClosurePtr() uintptr
257
View as plain text