]> Cypherpunks.ru repositories - gostls13.git/blob - test/codegen/mathbits.go
cmd/compile: eliminate unnecessary type conversions in TrailingZeros(16|8) for arm
[gostls13.git] / test / codegen / mathbits.go
1 // asmcheck
2
3 // Copyright 2018 The Go Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
6
7 package codegen
8
9 import "math/bits"
10
11 // ----------------------- //
12 //    bits.LeadingZeros    //
13 // ----------------------- //
14
15 func LeadingZeros(n uint) int {
16         // amd64:"BSRQ"
17         // s390x:"FLOGR"
18         // arm:"CLZ" arm64:"CLZ"
19         // mips:"CLZ"
20         // wasm:"I64Clz"
21         return bits.LeadingZeros(n)
22 }
23
24 func LeadingZeros64(n uint64) int {
25         // amd64:"BSRQ"
26         // s390x:"FLOGR"
27         // arm:"CLZ" arm64:"CLZ"
28         // mips:"CLZ"
29         // wasm:"I64Clz"
30         return bits.LeadingZeros64(n)
31 }
32
33 func LeadingZeros32(n uint32) int {
34         // amd64:"BSRQ","LEAQ",-"CMOVQEQ"
35         // s390x:"FLOGR"
36         // arm:"CLZ" arm64:"CLZW"
37         // mips:"CLZ"
38         // wasm:"I64Clz"
39         return bits.LeadingZeros32(n)
40 }
41
42 func LeadingZeros16(n uint16) int {
43         // amd64:"BSRL","LEAL",-"CMOVQEQ"
44         // s390x:"FLOGR"
45         // arm:"CLZ" arm64:"CLZ"
46         // mips:"CLZ"
47         // wasm:"I64Clz"
48         return bits.LeadingZeros16(n)
49 }
50
51 func LeadingZeros8(n uint8) int {
52         // amd64:"BSRL","LEAL",-"CMOVQEQ"
53         // s390x:"FLOGR"
54         // arm:"CLZ" arm64:"CLZ"
55         // mips:"CLZ"
56         // wasm:"I64Clz"
57         return bits.LeadingZeros8(n)
58 }
59
60 // --------------- //
61 //    bits.Len*    //
62 // --------------- //
63
64 func Len(n uint) int {
65         // amd64:"BSRQ"
66         // s390x:"FLOGR"
67         // arm:"CLZ" arm64:"CLZ"
68         // mips:"CLZ"
69         // wasm:"I64Clz"
70         return bits.Len(n)
71 }
72
73 func Len64(n uint64) int {
74         // amd64:"BSRQ"
75         // s390x:"FLOGR"
76         // arm:"CLZ" arm64:"CLZ"
77         // mips:"CLZ"
78         // wasm:"I64Clz"
79         return bits.Len64(n)
80 }
81
82 func Len32(n uint32) int {
83         // amd64:"BSRQ","LEAQ",-"CMOVQEQ"
84         // s390x:"FLOGR"
85         // arm:"CLZ" arm64:"CLZ"
86         // mips:"CLZ"
87         // wasm:"I64Clz"
88         return bits.Len32(n)
89 }
90
91 func Len16(n uint16) int {
92         // amd64:"BSRL","LEAL",-"CMOVQEQ"
93         // s390x:"FLOGR"
94         // arm:"CLZ" arm64:"CLZ"
95         // mips:"CLZ"
96         // wasm:"I64Clz"
97         return bits.Len16(n)
98 }
99
100 func Len8(n uint8) int {
101         // amd64:"BSRL","LEAL",-"CMOVQEQ"
102         // s390x:"FLOGR"
103         // arm:"CLZ" arm64:"CLZ"
104         // mips:"CLZ"
105         // wasm:"I64Clz"
106         return bits.Len8(n)
107 }
108
109 // -------------------- //
110 //    bits.OnesCount    //
111 // -------------------- //
112
113 func OnesCount(n uint) int {
114         // amd64:"POPCNTQ",".*x86HasPOPCNT"
115         // arm64:"VCNT","VUADDLV"
116         // s390x:"POPCNT"
117         // ppc64:"POPCNTD"
118         // ppc64le:"POPCNTD"
119         // wasm:"I64Popcnt"
120         return bits.OnesCount(n)
121 }
122
123 func OnesCount64(n uint64) int {
124         // amd64:"POPCNTQ",".*x86HasPOPCNT"
125         // arm64:"VCNT","VUADDLV"
126         // s390x:"POPCNT"
127         // ppc64:"POPCNTD"
128         // ppc64le:"POPCNTD"
129         // wasm:"I64Popcnt"
130         return bits.OnesCount64(n)
131 }
132
133 func OnesCount32(n uint32) int {
134         // amd64:"POPCNTL",".*x86HasPOPCNT"
135         // arm64:"VCNT","VUADDLV"
136         // s390x:"POPCNT"
137         // ppc64:"POPCNTW"
138         // ppc64le:"POPCNTW"
139         // wasm:"I64Popcnt"
140         return bits.OnesCount32(n)
141 }
142
143 func OnesCount16(n uint16) int {
144         // amd64:"POPCNTL",".*x86HasPOPCNT"
145         // arm64:"VCNT","VUADDLV"
146         // s390x:"POPCNT"
147         // ppc64:"POPCNTW"
148         // ppc64le:"POPCNTW"
149         // wasm:"I64Popcnt"
150         return bits.OnesCount16(n)
151 }
152
153 func OnesCount8(n uint8) int {
154         // s390x:"POPCNT"
155         // ppc64:"POPCNTB"
156         // ppc64le:"POPCNTB"
157         // wasm:"I64Popcnt"
158         return bits.OnesCount8(n)
159 }
160
161 // ----------------------- //
162 //    bits.ReverseBytes    //
163 // ----------------------- //
164
165 func ReverseBytes(n uint) uint {
166         // amd64:"BSWAPQ"
167         // s390x:"MOVDBR"
168         // arm64:"REV"
169         return bits.ReverseBytes(n)
170 }
171
172 func ReverseBytes64(n uint64) uint64 {
173         // amd64:"BSWAPQ"
174         // s390x:"MOVDBR"
175         // arm64:"REV"
176         return bits.ReverseBytes64(n)
177 }
178
179 func ReverseBytes32(n uint32) uint32 {
180         // amd64:"BSWAPL"
181         // s390x:"MOVWBR"
182         // arm64:"REVW"
183         return bits.ReverseBytes32(n)
184 }
185
186 func ReverseBytes16(n uint16) uint16 {
187         // amd64:"ROLW"
188         // arm64:"REV16W",-"UBFX",-"ORR"
189         // arm/5:"SLL","SRL","ORR"
190         // arm/6:"REV16"
191         // arm/7:"REV16"
192         return bits.ReverseBytes16(n)
193 }
194
195 // --------------------- //
196 //    bits.RotateLeft    //
197 // --------------------- //
198
199 func RotateLeft64(n uint64) uint64 {
200         // amd64:"ROLQ"
201         // arm64:"ROR"
202         // ppc64:"ROTL"
203         // ppc64le:"ROTL"
204         // s390x:"RLLG"
205         // wasm:"I64Rotl"
206         return bits.RotateLeft64(n, 37)
207 }
208
209 func RotateLeft32(n uint32) uint32 {
210         // amd64:"ROLL" 386:"ROLL"
211         // arm64:"RORW"
212         // ppc64:"ROTLW"
213         // ppc64le:"ROTLW"
214         // s390x:"RLL"
215         return bits.RotateLeft32(n, 9)
216 }
217
218 func RotateLeft16(n uint16) uint16 {
219         // amd64:"ROLW" 386:"ROLW"
220         return bits.RotateLeft16(n, 5)
221 }
222
223 func RotateLeft8(n uint8) uint8 {
224         // amd64:"ROLB" 386:"ROLB"
225         return bits.RotateLeft8(n, 5)
226 }
227
228 func RotateLeftVariable(n uint, m int) uint {
229         // amd64:"ROLQ"
230         // arm64:"ROR"
231         // ppc64:"ROTL"
232         // ppc64le:"ROTL"
233         // s390x:"RLLG"
234         return bits.RotateLeft(n, m)
235 }
236
237 func RotateLeftVariable64(n uint64, m int) uint64 {
238         // amd64:"ROLQ"
239         // arm64:"ROR"
240         // ppc64:"ROTL"
241         // ppc64le:"ROTL"
242         // s390x:"RLLG"
243         return bits.RotateLeft64(n, m)
244 }
245
246 func RotateLeftVariable32(n uint32, m int) uint32 {
247         // amd64:"ROLL"
248         // arm64:"RORW"
249         // ppc64:"ROTLW"
250         // ppc64le:"ROTLW"
251         // s390x:"RLL"
252         return bits.RotateLeft32(n, m)
253 }
254
255 // ------------------------ //
256 //    bits.TrailingZeros    //
257 // ------------------------ //
258
259 func TrailingZeros(n uint) int {
260         // amd64:"BSFQ","MOVL\t\\$64","CMOVQEQ"
261         // arm:"CLZ"
262         // arm64:"RBIT","CLZ"
263         // s390x:"FLOGR"
264         // ppc64:"ANDN","POPCNTD"
265         // ppc64le:"ANDN","POPCNTD"
266         // wasm:"I64Ctz"
267         return bits.TrailingZeros(n)
268 }
269
270 func TrailingZeros64(n uint64) int {
271         // amd64:"BSFQ","MOVL\t\\$64","CMOVQEQ"
272         // arm64:"RBIT","CLZ"
273         // s390x:"FLOGR"
274         // ppc64:"ANDN","POPCNTD"
275         // ppc64le:"ANDN","POPCNTD"
276         // wasm:"I64Ctz"
277         return bits.TrailingZeros64(n)
278 }
279
280 func TrailingZeros32(n uint32) int {
281         // amd64:"BTSQ\\t\\$32","BSFQ"
282         // arm:"CLZ"
283         // arm64:"RBITW","CLZW"
284         // s390x:"FLOGR","MOVWZ"
285         // ppc64:"ANDN","POPCNTW"
286         // ppc64le:"ANDN","POPCNTW"
287         // wasm:"I64Ctz"
288         return bits.TrailingZeros32(n)
289 }
290
291 func TrailingZeros16(n uint16) int {
292         // amd64:"BSFL","BTSL\\t\\$16"
293         // arm:"ORR\t\\$65536","CLZ",-"MOVHU\tR"
294         // arm64:"ORR\t\\$65536","RBITW","CLZW",-"MOVHU\tR",-"RBIT\t",-"CLZ\t"
295         // s390x:"FLOGR","OR\t\\$65536"
296         // ppc64:"POPCNTD","OR\\t\\$65536"
297         // ppc64le:"POPCNTD","OR\\t\\$65536"
298         // wasm:"I64Ctz"
299         return bits.TrailingZeros16(n)
300 }
301
302 func TrailingZeros8(n uint8) int {
303         // amd64:"BSFL","BTSL\\t\\$8"
304         // arm:"ORR\t\\$256","CLZ",-"MOVBU\tR"
305         // arm64:"ORR\t\\$256","RBITW","CLZW",-"MOVBU\tR",-"RBIT\t",-"CLZ\t"
306         // s390x:"FLOGR","OR\t\\$256"
307         // wasm:"I64Ctz"
308         return bits.TrailingZeros8(n)
309 }
310
311 // IterateBitsNN checks special handling of TrailingZerosNN when the input is known to be non-zero.
312
313 func IterateBits(n uint) int {
314         i := 0
315         for n != 0 {
316                 // amd64:"BSFQ",-"CMOVEQ"
317                 i += bits.TrailingZeros(n)
318                 n &= n - 1
319         }
320         return i
321 }
322
323 func IterateBits64(n uint64) int {
324         i := 0
325         for n != 0 {
326                 // amd64:"BSFQ",-"CMOVEQ"
327                 i += bits.TrailingZeros64(n)
328                 n &= n - 1
329         }
330         return i
331 }
332
333 func IterateBits32(n uint32) int {
334         i := 0
335         for n != 0 {
336                 // amd64:"BSFL",-"BTSQ"
337                 i += bits.TrailingZeros32(n)
338                 n &= n - 1
339         }
340         return i
341 }
342
343 func IterateBits16(n uint16) int {
344         i := 0
345         for n != 0 {
346                 // amd64:"BSFL",-"BTSL"
347                 // arm64:"RBITW","CLZW",-"ORR"
348                 i += bits.TrailingZeros16(n)
349                 n &= n - 1
350         }
351         return i
352 }
353
354 func IterateBits8(n uint8) int {
355         i := 0
356         for n != 0 {
357                 // amd64:"BSFL",-"BTSL"
358                 // arm64:"RBITW","CLZW",-"ORR"
359                 i += bits.TrailingZeros8(n)
360                 n &= n - 1
361         }
362         return i
363 }
364
365 // --------------- //
366 //    bits.Add*    //
367 // --------------- //
368
369 func Add(x, y, ci uint) (r, co uint) {
370         // amd64:"NEGL","ADCQ","SBBQ","NEGQ"
371         return bits.Add(x, y, ci)
372 }
373
374 func AddC(x, ci uint) (r, co uint) {
375         // amd64:"NEGL","ADCQ","SBBQ","NEGQ"
376         return bits.Add(x, 7, ci)
377 }
378
379 func AddZ(x, y uint) (r, co uint) {
380         // amd64:"ADDQ","SBBQ","NEGQ",-"NEGL",-"ADCQ"
381         return bits.Add(x, y, 0)
382 }
383
384 func AddR(x, y, ci uint) uint {
385         // amd64:"NEGL","ADCQ",-"SBBQ",-"NEGQ"
386         r, _ := bits.Add(x, y, ci)
387         return r
388 }
389 func AddM(p, q, r *[3]uint) {
390         var c uint
391         r[0], c = bits.Add(p[0], q[0], c)
392         // amd64:"ADCQ",-"NEGL",-"SBBQ",-"NEGQ"
393         r[1], c = bits.Add(p[1], q[1], c)
394         r[2], c = bits.Add(p[2], q[2], c)
395 }
396
397 func Add64(x, y, ci uint64) (r, co uint64) {
398         // amd64:"NEGL","ADCQ","SBBQ","NEGQ"
399         return bits.Add64(x, y, ci)
400 }
401
402 func Add64C(x, ci uint64) (r, co uint64) {
403         // amd64:"NEGL","ADCQ","SBBQ","NEGQ"
404         return bits.Add64(x, 7, ci)
405 }
406
407 func Add64Z(x, y uint64) (r, co uint64) {
408         // amd64:"ADDQ","SBBQ","NEGQ",-"NEGL",-"ADCQ"
409         return bits.Add64(x, y, 0)
410 }
411
412 func Add64R(x, y, ci uint64) uint64 {
413         // amd64:"NEGL","ADCQ",-"SBBQ",-"NEGQ"
414         r, _ := bits.Add64(x, y, ci)
415         return r
416 }
417 func Add64M(p, q, r *[3]uint64) {
418         var c uint64
419         r[0], c = bits.Add64(p[0], q[0], c)
420         // amd64:"ADCQ",-"NEGL",-"SBBQ",-"NEGQ"
421         r[1], c = bits.Add64(p[1], q[1], c)
422         r[2], c = bits.Add64(p[2], q[2], c)
423 }
424
425 // --------------- //
426 //    bits.Sub*    //
427 // --------------- //
428
429 func Sub(x, y, ci uint) (r, co uint) {
430         // amd64:"NEGL","SBBQ","NEGQ"
431         return bits.Sub(x, y, ci)
432 }
433
434 func SubC(x, ci uint) (r, co uint) {
435         // amd64:"NEGL","SBBQ","NEGQ"
436         return bits.Sub(x, 7, ci)
437 }
438
439 func SubZ(x, y uint) (r, co uint) {
440         // amd64:"SUBQ","SBBQ","NEGQ",-"NEGL"
441         return bits.Sub(x, y, 0)
442 }
443
444 func SubR(x, y, ci uint) uint {
445         // amd64:"NEGL","SBBQ",-"NEGQ"
446         r, _ := bits.Sub(x, y, ci)
447         return r
448 }
449 func SubM(p, q, r *[3]uint) {
450         var c uint
451         r[0], c = bits.Sub(p[0], q[0], c)
452         // amd64:"SBBQ",-"NEGL",-"NEGQ"
453         r[1], c = bits.Sub(p[1], q[1], c)
454         r[2], c = bits.Sub(p[2], q[2], c)
455 }
456
457 func Sub64(x, y, ci uint64) (r, co uint64) {
458         // amd64:"NEGL","SBBQ","NEGQ"
459         return bits.Sub64(x, y, ci)
460 }
461
462 func Sub64C(x, ci uint64) (r, co uint64) {
463         // amd64:"NEGL","SBBQ","NEGQ"
464         return bits.Sub64(x, 7, ci)
465 }
466
467 func Sub64Z(x, y uint64) (r, co uint64) {
468         // amd64:"SUBQ","SBBQ","NEGQ",-"NEGL"
469         return bits.Sub64(x, y, 0)
470 }
471
472 func Sub64R(x, y, ci uint64) uint64 {
473         // amd64:"NEGL","SBBQ",-"NEGQ"
474         r, _ := bits.Sub64(x, y, ci)
475         return r
476 }
477 func Sub64M(p, q, r *[3]uint64) {
478         var c uint64
479         r[0], c = bits.Sub64(p[0], q[0], c)
480         // amd64:"SBBQ",-"NEGL",-"NEGQ"
481         r[1], c = bits.Sub64(p[1], q[1], c)
482         r[2], c = bits.Sub64(p[2], q[2], c)
483 }
484
485 // --------------- //
486 //    bits.Mul*    //
487 // --------------- //
488
489 func Mul(x, y uint) (hi, lo uint) {
490         // amd64:"MULQ"
491         // arm64:"UMULH","MUL"
492         // ppc64:"MULHDU","MULLD"
493         // ppc64le:"MULHDU","MULLD"
494         return bits.Mul(x, y)
495 }
496
497 func Mul64(x, y uint64) (hi, lo uint64) {
498         // amd64:"MULQ"
499         // arm64:"UMULH","MUL"
500         // ppc64:"MULHDU","MULLD"
501         // ppc64le:"MULHDU","MULLD"
502         return bits.Mul64(x, y)
503 }
504
505 // --------------- //
506 //    bits.Div*    //
507 // --------------- //
508
509 func Div(hi, lo, x uint) (q, r uint) {
510         // amd64:"DIVQ"
511         return bits.Div(hi, lo, x)
512 }
513
514 func Div32(hi, lo, x uint32) (q, r uint32) {
515         // arm64:"ORR","UDIV","MSUB",-"UREM"
516         return bits.Div32(hi, lo, x)
517 }
518
519 func Div64(hi, lo, x uint64) (q, r uint64) {
520         // amd64:"DIVQ"
521         return bits.Div64(hi, lo, x)
522 }