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