Source file
test/codegen/condmove.go
1
2
3
4
5
6
7 package codegen
8
9 import (
10 "crypto/subtle"
11 "math/bits"
12 )
13
14 func cmovint(c int) int {
15 x := c + 4
16 if x < 0 {
17 x = 182
18 }
19
20
21
22
23 return x
24 }
25
26 func cmovchan(x, y chan int) chan int {
27 if x != y {
28 x = y
29 }
30
31
32
33
34 return x
35 }
36
37 func cmovuintptr(x, y uintptr) uintptr {
38 if x < y {
39 x = -y
40 }
41
42
43
44
45 return x
46 }
47
48 func cmov32bit(x, y uint32) uint32 {
49 if x < y {
50 x = -y
51 }
52
53
54
55
56 return x
57 }
58
59 func cmov16bit(x, y uint16) uint16 {
60 if x < y {
61 x = -y
62 }
63
64
65
66
67 return x
68 }
69
70
71
72 func cmovfloateq(x, y float64) int {
73 a := 128
74 if x == y {
75 a = 256
76 }
77
78
79
80
81 return a
82 }
83
84 func cmovfloatne(x, y float64) int {
85 a := 128
86 if x != y {
87 a = 256
88 }
89
90
91
92
93 return a
94 }
95
96
97 func frexp(f float64) (frac float64, exp int) {
98 return 1.0, 4
99 }
100
101
102 func ldexp(frac float64, exp int) float64 {
103 return 1.0
104 }
105
106
107 func cmovfloatint2(x, y float64) float64 {
108 yfr, yexp := 4.0, 5
109
110 r := x
111 for r >= y {
112 rfr, rexp := frexp(r)
113 if rfr < yfr {
114 rexp = rexp - 42
115 }
116
117
118
119
120 r = r - ldexp(y, rexp-yexp)
121 }
122 return r
123 }
124
125 func cmovloaded(x [4]int, y int) int {
126 if x[2] != 0 {
127 y = x[2]
128 } else {
129 y = y >> 2
130 }
131
132
133
134
135 return y
136 }
137
138 func cmovuintptr2(x, y uintptr) uintptr {
139 a := x * 2
140 if a == 0 {
141 a = 256
142 }
143
144
145
146
147 return a
148 }
149
150
151 func cmovfloatmove(x, y int) float64 {
152 a := 1.0
153 if x <= y {
154 a = 2.0
155 }
156
157
158
159
160 return a
161 }
162
163
164
165 var gsink int64
166 var gusink uint64
167
168 func cmovinvert1(x, y int64) int64 {
169 if x < gsink {
170 y = -y
171 }
172
173 return y
174 }
175 func cmovinvert2(x, y int64) int64 {
176 if x <= gsink {
177 y = -y
178 }
179
180 return y
181 }
182 func cmovinvert3(x, y int64) int64 {
183 if x == gsink {
184 y = -y
185 }
186
187 return y
188 }
189 func cmovinvert4(x, y int64) int64 {
190 if x != gsink {
191 y = -y
192 }
193
194 return y
195 }
196 func cmovinvert5(x, y uint64) uint64 {
197 if x > gusink {
198 y = -y
199 }
200
201 return y
202 }
203 func cmovinvert6(x, y uint64) uint64 {
204 if x >= gusink {
205 y = -y
206 }
207
208 return y
209 }
210
211 func cmovload(a []int, i int, b bool) int {
212 if b {
213 i += 42
214 }
215
216
217 return a[i]
218 }
219
220 func cmovstore(a []int, i int, b bool) {
221 if b {
222 i += 42
223 }
224
225 a[i] = 7
226 }
227
228 var r0, r1, r2, r3, r4, r5 int
229
230 func cmovinc(cond bool, a, b, c int) {
231 var x0, x1 int
232
233 if cond {
234 x0 = a
235 } else {
236 x0 = b + 1
237 }
238
239 r0 = x0
240
241 if cond {
242 x1 = b + 1
243 } else {
244 x1 = a
245 }
246
247 r1 = x1
248
249 if cond {
250 c++
251 }
252
253 r2 = c
254 }
255
256 func cmovinv(cond bool, a, b int) {
257 var x0, x1 int
258
259 if cond {
260 x0 = a
261 } else {
262 x0 = ^b
263 }
264
265 r0 = x0
266
267 if cond {
268 x1 = ^b
269 } else {
270 x1 = a
271 }
272
273 r1 = x1
274 }
275
276 func cmovneg(cond bool, a, b, c int) {
277 var x0, x1 int
278
279 if cond {
280 x0 = a
281 } else {
282 x0 = -b
283 }
284
285 r0 = x0
286
287 if cond {
288 x1 = -b
289 } else {
290 x1 = a
291 }
292
293 r1 = x1
294 }
295
296 func cmovsetm(cond bool, x int) {
297 var x0, x1 int
298
299 if cond {
300 x0 = -1
301 } else {
302 x0 = 0
303 }
304
305 r0 = x0
306
307 if cond {
308 x1 = 0
309 } else {
310 x1 = -1
311 }
312
313 r1 = x1
314 }
315
316 func cmovFcmp0(s, t float64, a, b int) {
317 var x0, x1, x2, x3, x4, x5 int
318
319 if s < t {
320 x0 = a
321 } else {
322 x0 = b + 1
323 }
324
325 r0 = x0
326
327 if s <= t {
328 x1 = a
329 } else {
330 x1 = ^b
331 }
332
333 r1 = x1
334
335 if s > t {
336 x2 = a
337 } else {
338 x2 = -b
339 }
340
341 r2 = x2
342
343 if s >= t {
344 x3 = -1
345 } else {
346 x3 = 0
347 }
348
349 r3 = x3
350
351 if s == t {
352 x4 = a
353 } else {
354 x4 = b + 1
355 }
356
357 r4 = x4
358
359 if s != t {
360 x5 = a
361 } else {
362 x5 = b + 1
363 }
364
365 r5 = x5
366 }
367
368 func cmovFcmp1(s, t float64, a, b int) {
369 var x0, x1, x2, x3, x4, x5 int
370
371 if s < t {
372 x0 = b + 1
373 } else {
374 x0 = a
375 }
376
377 r0 = x0
378
379 if s <= t {
380 x1 = ^b
381 } else {
382 x1 = a
383 }
384
385 r1 = x1
386
387 if s > t {
388 x2 = -b
389 } else {
390 x2 = a
391 }
392
393 r2 = x2
394
395 if s >= t {
396 x3 = 0
397 } else {
398 x3 = -1
399 }
400
401 r3 = x3
402
403 if s == t {
404 x4 = b + 1
405 } else {
406 x4 = a
407 }
408
409 r4 = x4
410
411 if s != t {
412 x5 = b + 1
413 } else {
414 x5 = a
415 }
416
417 r5 = x5
418 }
419
420 func cmovzero1(c bool) int {
421 var x int
422 if c {
423 x = 182
424 }
425
426 return x
427 }
428
429 func cmovzero2(c bool) int {
430 var x int
431 if !c {
432 x = 182
433 }
434
435 return x
436 }
437
438
439
440
441
442 func cmovzeroreg0(a, b int) int {
443 x := 0
444 if a == b {
445 x = a
446 }
447
448 return x
449 }
450
451 func cmovzeroreg1(a, b int) int {
452 x := a
453 if a == b {
454 x = 0
455 }
456
457 return x
458 }
459
460 func cmovmathadd(a uint, b bool) uint {
461 if b {
462 a++
463 }
464
465
466
467
468 return a
469 }
470 func cmovmathaddelse(a uint, b bool) uint {
471 if !b {
472 a++
473 }
474
475
476
477
478 return a
479 }
480
481 func cmovmathadd2(a uint, b bool) uint {
482 if b {
483 a += 2
484 }
485
486
487
488 return a
489 }
490 func cmovmathadd2else(a uint, b bool) uint {
491 if !b {
492 a += 2
493 }
494
495
496
497 return a
498 }
499
500 func cmovmathadd4(a uint, b bool) uint {
501 if b {
502 a += 4
503 }
504
505
506
507 return a
508 }
509 func cmovmathadd4else(a uint, b bool) uint {
510 if !b {
511 a += 4
512 }
513
514
515
516 return a
517 }
518
519 func cmovmathadd8(a uint, b bool) uint {
520 if b {
521 a += 8
522 }
523
524
525
526 return a
527 }
528 func cmovmathadd8else(a uint, b bool) uint {
529 if !b {
530 a += 8
531 }
532
533
534
535 return a
536 }
537
538 func cmovmathadd9223372036854775808(a uint, b bool) uint {
539 if b {
540 a += 1 << 63
541 }
542
543
544 return a
545 }
546 func cmovmathadd9223372036854775808else(a uint, b bool) uint {
547 if !b {
548 a += 1 << 63
549 }
550
551
552 return a
553 }
554
555 func cmovmathsub(a uint, b bool) uint {
556 if b {
557 a--
558 }
559
560
561
562
563 return a
564 }
565 func cmovmathsubelse(a uint, b bool) uint {
566 if !b {
567 a--
568 }
569
570
571
572
573 return a
574 }
575
576 func cmovmathsub2(a uint, b bool) uint {
577 if b {
578 a -= 2
579 }
580
581
582 return a
583 }
584 func cmovmathsub2else(a uint, b bool) uint {
585 if !b {
586 a -= 2
587 }
588
589
590 return a
591 }
592
593
594
595 func cmovmathsub9223372036854775808(a uint, b bool) uint {
596 if b {
597 a -= 1 << 63
598 }
599
600
601 return a
602 }
603 func cmovmathsub9223372036854775808else(a uint, b bool) uint {
604 if !b {
605 a -= 1 << 63
606 }
607
608
609 return a
610 }
611
612 func cmovmathdouble(a uint, b bool) uint {
613 if b {
614 a *= 2
615 }
616
617
618
619
620 return a
621 }
622 func cmovmathdoubleelse(a uint, b bool) uint {
623 if !b {
624 a *= 2
625 }
626
627
628
629
630 return a
631 }
632
633 func cmovmathhalvei(a int, b bool) int {
634 if b {
635
636
637
638 a /= 2
639 }
640
641
642 return a
643 }
644 func cmovmathhalveielse(a int, b bool) int {
645 if !b {
646
647
648
649 a /= 2
650 }
651
652
653 return a
654 }
655
656 func cmovmathhalveu(a uint, b bool) uint {
657 if b {
658 a /= 2
659 }
660
661
662
663
664 return a
665 }
666 func cmovmathhalveuelse(a uint, b bool) uint {
667 if !b {
668 a /= 2
669 }
670
671
672
673
674 return a
675 }
676
677 func cmovmathor(a uint, b bool) uint {
678 if b {
679 a |= 1
680 }
681
682
683
684
685 return a
686 }
687 func cmovmathorelse(a uint, b bool) uint {
688 if !b {
689 a |= 1
690 }
691
692
693
694
695 return a
696 }
697
698 func cmovmathor2(a uint, b bool) uint {
699 if b {
700 a |= 2
701 }
702
703
704 return a
705 }
706 func cmovmathor2else(a uint, b bool) uint {
707 if !b {
708 a |= 2
709 }
710
711
712 return a
713 }
714
715 func cmovmathor9223372036854775808(a uint, b bool) uint {
716 if b {
717 a |= 1 << 63
718 }
719
720
721 return a
722 }
723 func cmovmathor9223372036854775808else(a uint, b bool) uint {
724 if !b {
725 a |= 1 << 63
726 }
727
728
729 return a
730 }
731
732 func cmovmathxor(a uint, b bool) uint {
733 if b {
734 a ^= 1
735 }
736
737
738
739
740 return a
741 }
742 func cmovmathxorelse(a uint, b bool) uint {
743 if !b {
744 a ^= 1
745 }
746
747
748
749
750 return a
751 }
752
753 func cmovmathxor2(a uint, b bool) uint {
754 if b {
755 a ^= 2
756 }
757
758
759 return a
760 }
761 func cmovmathxor2else(a uint, b bool) uint {
762 if !b {
763 a ^= 2
764 }
765
766
767 return a
768 }
769
770 func cmovmathxor9223372036854775808(a uint, b bool) uint {
771 if b {
772 a ^= 1 << 63
773 }
774
775
776 return a
777 }
778 func cmovmathxor9223372036854775808else(a uint, b bool) uint {
779 if !b {
780 a ^= 1 << 63
781 }
782
783
784 return a
785 }
786
787 func branchlessBoolToUint8(b bool) (r uint8) {
788 if b {
789 r = 1
790 }
791 return
792 }
793
794 func cmovFromMulFromFlags64(x uint64, b bool) uint64 {
795
796 r := uint64(branchlessBoolToUint8(b))
797
798 return x * r
799 }
800 func cmovFromMulFromFlags64sext(x int64, b bool) int64 {
801
802 r := int64(int8(branchlessBoolToUint8(b)))
803
804 return x * r
805 }
806
807 func constantTimeSelect(v, x, y int) int {
808
809
810
811
812 return subtle.ConstantTimeSelect(v, x, y)
813 }
814
815 func issue76056fieldReduceOnceSub32(a uint32) uint32 {
816 const q = 8380417
817
818 x, b := bits.Sub32(a, q, 0)
819
820 return x + b*q
821 }
822
823 func issue76056fieldReduceOnce2Sub32(a uint32) uint32 {
824 const q = 8380417
825
826 x, b := bits.Sub32(a, q, 0)
827 return uint32(subtle.ConstantTimeSelect(int(b), int(a), int(x)))
828 }
829
830 func issue76056fieldReduceOnceSub64(a uint32) uint32 {
831 const q = 8380417
832 x, b := bits.Sub64(uint64(a), q, 0)
833
834 return uint32(x) + uint32(b)*q
835 }
836
837 func issue76056fieldReduceOnce2Sub64(a uint32) uint32 {
838 const q = 8380417
839
840 x, b := bits.Sub64(uint64(a), q, 0)
841
842 return uint32(subtle.ConstantTimeSelect(int(b), int(a), int(x)))
843 }
844
View as plain text