1
2
3
4
5
6
7 package codegen
8
9
10
11
12
13 func lshConst64x64(v int64) int64 {
14
15
16
17 return v << uint64(33)
18 }
19
20 func rshConst64Ux64(v uint64) uint64 {
21
22
23
24 return v >> uint64(33)
25 }
26
27 func rshConst64Ux64Overflow32(v uint32) uint64 {
28
29
30 return uint64(v) >> 32
31 }
32
33 func rshConst64Ux64Overflow16(v uint16) uint64 {
34
35
36 return uint64(v) >> 16
37 }
38
39 func rshConst64Ux64Overflow8(v uint8) uint64 {
40
41
42 return uint64(v) >> 8
43 }
44
45 func rshConst64x64(v int64) int64 {
46
47
48
49 return v >> uint64(33)
50 }
51
52 func rshConst64x64Overflow32(v int32) int64 {
53
54
55 return int64(v) >> 32
56 }
57
58 func rshConst64x64Overflow16(v int16) int64 {
59
60
61 return int64(v) >> 16
62 }
63
64 func rshConst64x64Overflow8(v int8) int64 {
65
66
67 return int64(v) >> 8
68 }
69
70 func lshConst32x1(v int32) int32 {
71
72 return v << 1
73 }
74
75 func lshConst64x1(v int64) int64 {
76
77 return v << 1
78 }
79
80 func lshConst32x64(v int32) int32 {
81
82
83
84 return v << uint64(29)
85 }
86
87 func rshConst32Ux64(v uint32) uint32 {
88
89
90
91 return v >> uint64(29)
92 }
93
94 func rshConst32x64(v int32) int32 {
95
96
97
98 return v >> uint64(29)
99 }
100
101 func lshConst64x32(v int64) int64 {
102
103
104
105 return v << uint32(33)
106 }
107
108 func rshConst64Ux32(v uint64) uint64 {
109
110
111
112 return v >> uint32(33)
113 }
114
115 func rshConst64x32(v int64) int64 {
116
117
118
119 return v >> uint32(33)
120 }
121
122 func lshConst32x1Add(x int32) int32 {
123
124
125
126
127 return (x + x) << 1
128 }
129
130 func lshConst64x1Add(x int64) int64 {
131
132
133
134
135 return (x + x) << 1
136 }
137
138 func lshConst32x2Add(x int32) int32 {
139
140
141
142
143 return (x + x) << 2
144 }
145
146 func lshConst64x2Add(x int64) int64 {
147
148
149
150
151 return (x + x) << 2
152 }
153
154 func lshConst32x31Add(x int32) int32 {
155
156
157
158
159 return (x + x) << 31
160 }
161
162 func lshConst64x63Add(x int64) int64 {
163
164
165
166 return (x + x) << 63
167 }
168
169
170
171
172
173 func lshMask64x64(v int64, s uint64) int64 {
174
175
176
177
178
179 return v << (s & 63)
180 }
181
182 func rshMask64Ux64(v uint64, s uint64) uint64 {
183
184
185
186
187
188 return v >> (s & 63)
189 }
190
191 func rshMask64x64(v int64, s uint64) int64 {
192
193
194
195
196
197 return v >> (s & 63)
198 }
199
200 func lshMask32x64(v int32, s uint64) int32 {
201
202
203
204
205
206 return v << (s & 63)
207 }
208
209 func lsh5Mask32x64(v int32, s uint64) int32 {
210
211 return v << (s & 31)
212 }
213
214 func rshMask32Ux64(v uint32, s uint64) uint32 {
215
216
217
218
219
220 return v >> (s & 63)
221 }
222
223 func rsh5Mask32Ux64(v uint32, s uint64) uint32 {
224
225
226 return v >> (s & 31)
227 }
228
229 func rshMask32x64(v int32, s uint64) int32 {
230
231
232
233
234
235 return v >> (s & 63)
236 }
237
238 func rsh5Mask32x64(v int32, s uint64) int32 {
239
240
241 return v >> (s & 31)
242 }
243
244 func lshMask64x32(v int64, s uint32) int64 {
245
246
247
248
249
250 return v << (s & 63)
251 }
252
253 func rshMask64Ux32(v uint64, s uint32) uint64 {
254
255
256
257
258
259 return v >> (s & 63)
260 }
261
262 func rshMask64x32(v int64, s uint32) int64 {
263
264
265
266
267
268 return v >> (s & 63)
269 }
270
271 func lshMask64x32Ext(v int64, s int32) int64 {
272
273
274
275 return v << uint(s&63)
276 }
277
278 func rshMask64Ux32Ext(v uint64, s int32) uint64 {
279
280
281
282 return v >> uint(s&63)
283 }
284
285 func rshMask64x32Ext(v int64, s int32) int64 {
286
287
288
289 return v >> uint(s&63)
290 }
291
292
293
294
295
296
297 func lshSigned(v8 int8, v16 int16, v32 int32, v64 int64, x int) {
298
299 _ = x << v8
300
301 _ = x << v16
302
303 _ = x << v32
304
305 _ = x << v64
306 }
307
308
309 func lshSignedMasked(v8 int8, v16 int16, v32 int32, v64 int64, x int) {
310
311 _ = x << (v8 & 7)
312
313 _ = x << (v16 & 15)
314
315 _ = x << (v32 & 31)
316
317 _ = x << (v64 & 63)
318 }
319
320
321
322
323
324 func lshGuarded64(v int64, s uint) int64 {
325 if s < 64 {
326
327
328
329
330 return v << s
331 }
332 panic("shift too large")
333 }
334
335 func rshGuarded64U(v uint64, s uint) uint64 {
336 if s < 64 {
337
338
339
340
341 return v >> s
342 }
343 panic("shift too large")
344 }
345
346 func rshGuarded64(v int64, s uint) int64 {
347 if s < 64 {
348
349
350
351
352 return v >> s
353 }
354 panic("shift too large")
355 }
356
357 func provedUnsignedShiftLeft(val64 uint64, val32 uint32, val16 uint16, val8 uint8, shift int) (r1 uint64, r2 uint32, r3 uint16, r4 uint8) {
358 if shift >= 0 && shift < 64 {
359
360 r1 = val64 << shift
361 }
362 if shift >= 0 && shift < 32 {
363
364 r2 = val32 << shift
365 }
366 if shift >= 0 && shift < 16 {
367
368 r3 = val16 << shift
369 }
370 if shift >= 0 && shift < 8 {
371
372 r4 = val8 << shift
373 }
374 return r1, r2, r3, r4
375 }
376
377 func provedSignedShiftLeft(val64 int64, val32 int32, val16 int16, val8 int8, shift int) (r1 int64, r2 int32, r3 int16, r4 int8) {
378 if shift >= 0 && shift < 64 {
379
380 r1 = val64 << shift
381 }
382 if shift >= 0 && shift < 32 {
383
384 r2 = val32 << shift
385 }
386 if shift >= 0 && shift < 16 {
387
388 r3 = val16 << shift
389 }
390 if shift >= 0 && shift < 8 {
391
392 r4 = val8 << shift
393 }
394 return r1, r2, r3, r4
395 }
396
397 func provedUnsignedShiftRight(val64 uint64, val32 uint32, val16 uint16, val8 uint8, shift int) (r1 uint64, r2 uint32, r3 uint16, r4 uint8) {
398 if shift >= 0 && shift < 64 {
399
400 r1 = val64 >> shift
401 }
402 if shift >= 0 && shift < 32 {
403
404 r2 = val32 >> shift
405 }
406 if shift >= 0 && shift < 16 {
407
408 r3 = val16 >> shift
409 }
410 if shift >= 0 && shift < 8 {
411
412 r4 = val8 >> shift
413 }
414 return r1, r2, r3, r4
415 }
416
417 func provedSignedShiftRight(val64 int64, val32 int32, val16 int16, val8 int8, shift int) (r1 int64, r2 int32, r3 int16, r4 int8) {
418 if shift >= 0 && shift < 64 {
419
420 r1 = val64 >> shift
421 }
422 if shift >= 0 && shift < 32 {
423
424 r2 = val32 >> shift
425 }
426 if shift >= 0 && shift < 16 {
427
428 r3 = val16 >> shift
429 }
430 if shift >= 0 && shift < 8 {
431
432 r4 = val8 >> shift
433 }
434 return r1, r2, r3, r4
435 }
436
437 func checkUnneededTrunc(tab *[100000]uint32, d uint64, v uint32, h uint16, b byte) (uint32, uint64) {
438
439
440 f := tab[byte(v)^b]
441
442 f += tab[byte(v)&b]
443
444 f += tab[byte(v)|b]
445
446 f += tab[uint16(v)&h]
447
448 f += tab[uint16(v)^h]
449
450 f += tab[uint16(v)|h]
451
452 f += tab[v&0xff]
453
454 f += 2 * uint32(uint16(d))
455
456 g := 2 * uint64(uint32(d))
457 return f, g
458 }
459
460 func checkCombinedShifts(v8 uint8, v16 uint16, v32 uint32, x32 int32, v64 uint64) (uint8, uint16, uint32, uint64, int64) {
461
462
463 f := (v8 & 0xF) << 2
464
465 f += byte(v16) << 3
466
467 g := (v16 & 0xFF) << 3
468
469 h := (v32 & 0xFFFFF) << 2
470
471 i := (v64 & 0xFFFFFFFF) << 5
472
473 i += (v64 & 0xFFFFFFF) << 38
474
475 i += (v64 & 0xFFFF00) << 10
476
477 j := int64(x32+32) * 8
478 return f, g, h, i, j
479 }
480
481 func checkWidenAfterShift(v int64, u uint64) (int64, uint64) {
482
483
484 f := int32(v >> 32)
485
486 f += int32(v >> 31)
487
488 g := int16(v >> 48)
489
490 g += int16(v >> 30)
491
492 g += int16(f >> 16)
493
494 h := int8(v >> 56)
495
496 h += int8(v >> 28)
497
498 h += int8(f >> 24)
499
500 h += int8(f >> 16)
501 return int64(h), uint64(g)
502 }
503
504 func checkShiftAndMask32(v []uint32) {
505 i := 0
506
507
508 v[i] = (v[i] & 0xFF00000) >> 8
509 i++
510
511 v[i] = (v[i] & 0xFF00) >> 6
512 i++
513
514 v[i] = (v[i] & 0xFF) >> 8
515 i++
516
517 v[i] = (v[i] & 0xF000000) >> 28
518 i++
519
520 v[i] = (v[i] >> 6) & 0xFF
521 i++
522
523 v[i] = (v[i] >> 6) & 0xFF000
524 i++
525
526 v[i] = (v[i] >> 20) & 0xFF000
527 i++
528
529 v[i] = (v[i] >> 24) & 0xFF00
530 i++
531 }
532
533 func checkMergedShifts32(a [256]uint32, b [256]uint64, u uint32, v uint32) {
534
535 a[0] = a[uint8(v>>24)]
536
537 b[0] = b[uint8(v>>24)]
538
539 b[1] = b[(v>>20)&0xFF]
540
541 b[2] = b[v>>25]
542 }
543
544 func checkMergedShifts64(a [256]uint32, b [256]uint64, c [256]byte, v uint64) {
545
546 a[0] = a[uint8(v>>24)]
547
548 a[1] = a[uint8(v>>25)]
549
550 a[2] = a[v>>25&0x7F]
551
552 a[3] = a[(v>>31)&0x01]
553
554 b[0] = b[uint8(v>>23)]
555
556 b[1] = b[(v>>20)&0xFF]
557
558 b[2] = b[((uint64((uint32(v) >> 21)) & 0x3f) << 4)]
559
560 b[3] = (b[3] << 24) & 0xFFFFFF000000
561
562 b[4] = (b[4] << 24) & 0xFF000000
563
564 b[5] = (b[5] << 24) & 0xFF00000F
565
566 b[6] = (b[6] << 0) & 0xFF00000F
567
568 b[7] = (b[7] >> 28) & 0xF
569
570 c[0] = c[((v>>5)&0x3F)<<16]
571
572 c[1] = c[((v>>7)&0x3F)<<7]
573 }
574
575 func checkShiftMask(a uint32, b uint64, z []uint32, y []uint64) {
576 _ = y[128]
577 _ = z[128]
578
579 z[0] = uint32(uint8(a >> 5))
580
581 z[1] = uint32(uint8((a >> 4) & 0x7e))
582
583 z[2] = uint32(uint8(a>>7)) & 0x1c
584
585 y[0] = uint64((a >> 6) & 0x1c)
586
587 y[1] = uint64(uint32(b)<<6) + 1
588
589 y[2] = uint64((uint16(a) >> 9) & 0x1F)
590
591 y[3] = uint64(((uint16(a) & 0xFF0) >> 9) & 0x1F)
592 }
593
594 func checkShiftToMask(u []uint64, s []int64) {
595
596 u[0] = u[0] >> 5 << 5
597
598 s[0] = s[0] >> 5 << 5
599
600 u[1] = u[1] << 5 >> 5
601 }
602
603
604
605
606
607 func checkLeftShiftWithAddition(a int64, b int64) int64 {
608
609
610 a = a + b<<1
611
612
613 a = a + b<<2
614
615
616 a = a + b<<3
617 return a
618 }
619
620
621
622
623
624 func rsh64Uto32U(v uint64) uint32 {
625 x := uint32(v)
626
627 if x > 8 {
628
629 x >>= 2
630 }
631 return x
632 }
633
634 func rsh64Uto16U(v uint64) uint16 {
635 x := uint16(v)
636
637 if x > 8 {
638
639 x >>= 2
640 }
641 return x
642 }
643
644 func rsh64Uto8U(v uint64) uint8 {
645 x := uint8(v)
646
647 if x > 8 {
648
649 x >>= 2
650 }
651 return x
652 }
653
654 func rsh64to32(v int64) int32 {
655 x := int32(v)
656
657 if x > 8 {
658
659 x >>= 2
660 }
661 return x
662 }
663
664 func rsh64to16(v int64) int16 {
665 x := int16(v)
666
667 if x > 8 {
668
669 x >>= 2
670 }
671 return x
672 }
673
674 func rsh64to8(v int64) int8 {
675 x := int8(v)
676
677 if x > 8 {
678
679 x >>= 2
680 }
681 return x
682 }
683
684
685
686
687
688 func signedModShift(i int) int64 {
689
690 return 1 << (i % 64)
691 }
692
View as plain text