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