1 !sum
2 - go: SetElem
3 asm: "VPINSRB"
4 in:
5 - &t
6 class: vreg
7 base: $b
8 - class: greg
9 base: $b
10 lanes: 1 # Scalar, darn it!
11 - class: immediate
12 immOffset: 0
13 immMax: 15
14 name: index
15 out:
16 - *t
17 - go: SetElem
18 asm: "VPINSRW"
19 in:
20 - &t
21 class: vreg
22 base: $b
23 - class: greg
24 base: $b
25 lanes: 1 # Scalar, darn it!
26 - class: immediate
27 immOffset: 0
28 immMax: 7
29 name: index
30 out:
31 - *t
32 - go: SetElem
33 asm: "VPINSRD"
34 in:
35 - &t
36 class: vreg
37 base: $b
38 - class: greg
39 base: $b
40 lanes: 1 # Scalar, darn it!
41 - class: immediate
42 immOffset: 0
43 immMax: 3
44 name: index
45 out:
46 - *t
47 - go: SetElem
48 asm: "VPINSRQ"
49 in:
50 - &t
51 class: vreg
52 base: $b
53 - class: greg
54 base: $b
55 lanes: 1 # Scalar, darn it!
56 - class: immediate
57 immOffset: 0
58 immMax: 1
59 name: index
60 out:
61 - *t
62
63 - go: SetElem
64 asm: "VPINSRD"
65 in:
66 - &t
67 class: vreg
68 base: int
69 OverwriteBase: float
70 - class: greg
71 base: int
72 OverwriteBase: float
73 lanes: 1 # Scalar, darn it!
74 - class: immediate
75 immOffset: 0
76 immMax: 3
77 name: index
78 out:
79 - *t
80 - go: SetElem
81 asm: "VPINSRQ"
82 in:
83 - &t
84 class: vreg
85 base: int
86 OverwriteBase: float
87 - class: greg
88 base: int
89 OverwriteBase: float
90 lanes: 1 # Scalar, darn it!
91 - class: immediate
92 immOffset: 0
93 immMax: 1
94 name: index
95 out:
96 - *t
97
98 - go: GetElem # VPEXTRB 128 bit
99 asm: VPEXTRB
100 in:
101 - bits: 128
102 base: $b
103 class: vreg
104 elemBits: 8
105 - class: immediate
106 immOffset: 0
107 immMax: 15
108 name: index
109 out:
110 - bits: 32
111 base: $b
112 class: greg
113 overwriteBits: 8 # The XED data specification is wrong, correct it to the right bits
114
115 - go: GetElem # VPEXTRW 128 bit
116 asm: VPEXTRW
117 in:
118 - bits: 128
119 base: $b
120 class: vreg
121 elemBits: 16
122 - class: immediate
123 immOffset: 0
124 immMax: 7
125 name: index
126 out:
127 - bits: 32
128 base: $b
129 class: greg
130 overwriteBits: 16 # The XED data specification is wrong, correct it to the right bits
131
132 - go: GetElem
133 asm: "VPEXTRD"
134 in:
135 - class: vreg
136 base: $b
137 elemBits: $e
138 - class: immediate
139 immOffset: 0
140 immMax: 3
141 name: index
142 out:
143 - class: greg
144 base: $b
145 bits: $e
146
147 - go: GetElem
148 asm: "VPEXTRQ"
149 in:
150 - class: vreg
151 base: $b
152 elemBits: $e
153 - class: immediate
154 immOffset: 0
155 immMax: 1
156 name: index
157 out:
158 - class: greg
159 base: $b
160 bits: $e
161
162 - go: GetElem
163 asm: "VPEXTRD"
164 in:
165 - class: vreg
166 base: int
167 elemBits: $e
168 OverwriteBase: float
169 - class: immediate
170 immOffset: 0
171 immMax: 3
172 name: index
173 out:
174 - class: greg
175 base: int
176 bits: $e
177 OverwriteBase: float
178
179 - go: GetElem
180 asm: "VPEXTRQ"
181 in:
182 - class: vreg
183 base: int
184 elemBits: $e
185 OverwriteBase: float
186 - class: immediate
187 immOffset: 0
188 immMax: 1
189 name: index
190 out:
191 - class: greg
192 base: int
193 bits: $e
194 OverwriteBase: float
195
196 - go: "SetHi|SetLo"
197 regexpTag: "move"
198 asm: "VINSERTI128|VINSERTI64X4"
199 inVariant: []
200 in:
201 - &i8x2N
202 class: vreg
203 base: $t
204 OverwriteElementBits: 8
205 - &i8xN
206 class: vreg
207 base: $t
208 OverwriteElementBits: 8
209 - &imm01 # This immediate should be only 0 or 1
210 class: immediate
211 const: 0 # place holder
212 name: index
213 out:
214 - *i8x2N
215
216 - go: "GetHi|GetLo"
217 asm: "VEXTRACTI128|VEXTRACTI64X4"
218 regexpTag: "move"
219 inVariant: []
220 in:
221 - *i8x2N
222 - *imm01
223 out:
224 - *i8xN
225
226 - go: "SetHi|SetLo"
227 asm: "VINSERTI128|VINSERTI64X4"
228 regexpTag: "move"
229 inVariant: []
230 in:
231 - &i16x2N
232 class: vreg
233 base: $t
234 OverwriteElementBits: 16
235 - &i16xN
236 class: vreg
237 base: $t
238 OverwriteElementBits: 16
239 - *imm01
240 out:
241 - *i16x2N
242
243 - go: "GetHi|GetLo"
244 regexpTag: "move"
245 asm: "VEXTRACTI128|VEXTRACTI64X4"
246 inVariant: []
247 in:
248 - *i16x2N
249 - *imm01
250 out:
251 - *i16xN
252
253 - go: "SetHi|SetLo"
254 regexpTag: "move"
255 asm: "VINSERTI128|VINSERTI64X4"
256 inVariant: []
257 in:
258 - &i32x2N
259 class: vreg
260 base: $t
261 OverwriteElementBits: 32
262 - &i32xN
263 class: vreg
264 base: $t
265 OverwriteElementBits: 32
266 - *imm01
267 out:
268 - *i32x2N
269
270 - go: "GetHi|GetLo"
271 regexpTag: "move"
272 asm: "VEXTRACTI128|VEXTRACTI64X4"
273 inVariant: []
274 in:
275 - *i32x2N
276 - *imm01
277 out:
278 - *i32xN
279
280 - go: "SetHi|SetLo"
281 regexpTag: "move"
282 asm: "VINSERTI128|VINSERTI64X4"
283 inVariant: []
284 in:
285 - &i64x2N
286 class: vreg
287 base: $t
288 OverwriteElementBits: 64
289 - &i64xN
290 class: vreg
291 base: $t
292 OverwriteElementBits: 64
293 - *imm01
294 out:
295 - *i64x2N
296
297 - go: "GetHi|GetLo"
298 regexpTag: "move"
299 asm: "VEXTRACTI128|VEXTRACTI64X4"
300 inVariant: []
301 in:
302 - *i64x2N
303 - *imm01
304 out:
305 - *i64xN
306
307 - go: "SetHi|SetLo"
308 regexpTag: "move"
309 asm: "VINSERTF128|VINSERTF64X4"
310 inVariant: []
311 in:
312 - &f32x2N
313 class: vreg
314 base: $t
315 OverwriteElementBits: 32
316 - &f32xN
317 class: vreg
318 base: $t
319 OverwriteElementBits: 32
320 - *imm01
321 out:
322 - *f32x2N
323
324 - go: "GetHi|GetLo"
325 regexpTag: "move"
326 asm: "VEXTRACTF128|VEXTRACTF64X4"
327 inVariant: []
328 in:
329 - *f32x2N
330 - *imm01
331 out:
332 - *f32xN
333
334 - go: "SetHi|SetLo"
335 regexpTag: "move"
336 asm: "VINSERTF128|VINSERTF64X4"
337 inVariant: []
338 in:
339 - &f64x2N
340 class: vreg
341 base: $t
342 OverwriteElementBits: 64
343 - &f64xN
344 class: vreg
345 base: $t
346 OverwriteElementBits: 64
347 - *imm01
348 out:
349 - *f64x2N
350
351 - go: "GetHi|GetLo"
352 regexpTag: "move"
353 asm: "VEXTRACTF128|VEXTRACTF64X4"
354 inVariant: []
355 in:
356 - *f64x2N
357 - *imm01
358 out:
359 - *f64xN
360
361 - go: Permute
362 asm: "VPERM[BWDQ]|VPERMP[SD]"
363 operandOrder: "21Type1"
364 in:
365 - &anyindices
366 class: vreg
367 name: indices
368 overwriteBase: uint
369 - go: $t
370 out:
371 - go: $t
372
373 - go: ConcatPermute
374 asm: "VPERMI2[BWDQ]|VPERMI2P[SD]"
375 # Because we are overwriting the receiver's type, we
376 # have to move the receiver to be a parameter so that
377 # we can have no duplication.
378 operandOrder: "231Type1"
379 in:
380 - *anyindices # result in arg 0
381 - go: $t
382 - go: $t
383 out:
384 - go: $t
385
386 - go: Compress
387 asm: "VPCOMPRESS[BWDQ]|VCOMPRESSP[SD]"
388 in:
389 # The mask in Compress is a control mask rather than a write mask, so it's not optional.
390 - class: mask
391 - go: $t
392 out:
393 - go: $t
394
395 # For now a non-public method because
396 # (1) [OverwriteClass] must be set together with [OverwriteBase]
397 # (2) "simdgen does not support [OverwriteClass] in inputs".
398 # That means the signature is wrong.
399 - go: blend
400 asm: VPBLENDVB
401 zeroing: false
402 in:
403 - &v
404 go: $t
405 class: vreg
406 base: int
407 - *v
408 -
409 class: vreg
410 base: int
411 name: mask
412 out:
413 - *v
414
415 # For AVX512
416 - go: blend
417 asm: VPBLENDM[BWDQ]
418 zeroing: false
419 in:
420 - &v
421 go: $t
422 bits: 512
423 class: vreg
424 base: int
425 - *v
426 inVariant:
427 -
428 class: mask
429 out:
430 - *v
431
432 # For AVX512
433 - go: move
434 asm: VMOVDQU(8|16|32|64)
435 zeroing: true
436 in:
437 - &v
438 go: $t
439 class: vreg
440 base: int|uint
441 inVariant:
442 -
443 class: mask
444 out:
445 - *v
446
447 - go: Expand
448 asm: "VPEXPAND[BWDQ]|VEXPANDP[SD]"
449 in:
450 # The mask in Expand is a control mask rather than a write mask, so it's not optional.
451 - class: mask
452 - go: $t
453 out:
454 - go: $t
455
456 - go: broadcast1To2
457 asm: VPBROADCASTQ
458 in:
459 - class: vreg
460 bits: 128
461 elemBits: 64
462 base: $b
463 out:
464 - class: vreg
465 bits: 128
466 elemBits: 64
467 base: $b
468
469 # weirdly, this one case on AVX2 is memory-operand-only
470 - go: broadcast1To2
471 asm: VPBROADCASTQ
472 in:
473 - class: vreg
474 bits: 128
475 elemBits: 64
476 base: int
477 OverwriteBase: float
478 out:
479 - class: vreg
480 bits: 128
481 elemBits: 64
482 base: int
483 OverwriteBase: float
484
485 - go: broadcast1To4
486 asm: VPBROADCAST[BWDQ]
487 in:
488 - class: vreg
489 bits: 128
490 base: $b
491 out:
492 - class: vreg
493 lanes: 4
494 base: $b
495
496 - go: broadcast1To8
497 asm: VPBROADCAST[BWDQ]
498 in:
499 - class: vreg
500 bits: 128
501 base: $b
502 out:
503 - class: vreg
504 lanes: 8
505 base: $b
506
507 - go: broadcast1To16
508 asm: VPBROADCAST[BWDQ]
509 in:
510 - class: vreg
511 bits: 128
512 base: $b
513 out:
514 - class: vreg
515 lanes: 16
516 base: $b
517
518 - go: broadcast1To32
519 asm: VPBROADCAST[BWDQ]
520 in:
521 - class: vreg
522 bits: 128
523 base: $b
524 out:
525 - class: vreg
526 lanes: 32
527 base: $b
528
529 - go: broadcast1To64
530 asm: VPBROADCASTB
531 in:
532 - class: vreg
533 bits: 128
534 base: $b
535 out:
536 - class: vreg
537 lanes: 64
538 base: $b
539
540 - go: broadcast1To4
541 asm: VBROADCASTS[SD]
542 in:
543 - class: vreg
544 bits: 128
545 base: float
546 out:
547 - class: vreg
548 lanes: 4
549 base: float
550
551 - go: broadcast1To8
552 asm: VBROADCASTS[SD]
553 in:
554 - class: vreg
555 bits: 128
556 base: float
557 out:
558 - class: vreg
559 lanes: 8
560 base: float
561
562 - go: broadcast1To16
563 asm: VBROADCASTS[SD]
564 in:
565 - class: vreg
566 bits: 128
567 base: float
568 out:
569 - class: vreg
570 lanes: 16
571 base: float
572
573 # VPSHUFB for 128-bit byte shuffles will be picked with higher priority than VPERMB, given its lower CPU feature requirement. (It's AVX)
574 - go: PermuteOrZero
575 asm: VPSHUFB
576 in:
577 - &128any
578 bits: 128
579 go: $t
580 - bits: 128
581 name: indices
582 base: int # always signed
583 out:
584 - *128any
585
586 - go: PermuteOrZeroGrouped
587 asm: VPSHUFB
588 in:
589 - &256Or512any
590 bits: "256|512"
591 go: $t
592 - bits: "256|512"
593 base: int
594 name: indices
595 out:
596 - *256Or512any
597
598 - go: permuteScalars
599 asm: VPSHUFD
600 addDoc: !string |-
601 //
602 // result = {x[indices[0:2]], x[indices[2:4]], x[indices[4:6]], x[indices[6:8]]}
603 //
604 // Indices is four 2-bit values packed into a byte, thus indices[0:2] is the first index.
605 in:
606 - *128any
607 - class: immediate
608 immOffset: 0
609 name: indices
610 hideMaskMethods: true
611 out:
612 - *128any
613
614 - go: permuteScalarsGrouped
615 asm: VPSHUFD
616 addDoc: !string |-
617 //
618 // result = {x_group0[indices[0:2]], x_group0[indices[2:4]], x_group0[indices[4:6]], x_group0[indices[6:8]], x_group1[indices[0:2]], ...}
619 //
620 // Indices is four 2-bit values packed into a byte, thus indices[0:2] is the first index.
621 // Each group is of size 128-bit.
622 in:
623 - *256Or512any
624 - class: immediate
625 immOffset: 0
626 name: indices
627 hideMaskMethods: true
628 out:
629 - *256Or512any
630
631 - go: permuteScalarsLo # For AVX
632 asm: VPSHUFLW
633 addDoc: !string |-
634 //
635 // result = {x[indices[0:2]], x[indices[2:4]], x[indices[4:6]], x[indices[6:8]], x[4], x[5], x[6], x[7]}
636 //
637 // Indices is four 2-bit values packed into a byte, thus indices[0:2] is the first index.
638 in:
639 - &32x4To16x8
640 bits: 128
641 go: $t
642 elemBits: 32
643 OverwriteElementBits: 16 # XED data incorrectly specified this as 32-bit, we need to fix it.
644 - class: immediate
645 immOffset: 0
646 name: indices
647 hideMaskMethods: true
648 out:
649 - *32x4To16x8
650
651 - go: permuteScalarsLo
652 asm: VPSHUFLW
653 addDoc: !string |-
654 //
655 // result = {x[indices[0:2]], x[indices[2:4]], x[indices[4:6]], x[indices[6:8]], x[4], x[5], x[6], x[7]}
656 //
657 // Indices is four 2-bit values packed into a byte, thus indices[0:2] is the first index.
658 in:
659 - &128lanes8
660 bits: 128
661 go: $t
662 elemBits: 16
663 - class: immediate
664 immOffset: 0
665 name: indices
666 hideMaskMethods: true
667 out:
668 - *128lanes8
669
670 - go: permuteScalarsLoGrouped
671 asm: VPSHUFLW
672 addDoc: !string |-
673 //
674 // result = {x_group0[indices[0:2]], x_group0[indices[2:4]], x_group0[indices[4:6]], x_group0[indices[6:8]], x[4], x[5], x[6], x[7],
675 // x_group1[indices[0:2]], ...}
676 //
677 // Indices is four 2-bit values packed into a byte, thus indices[0:2] is the first index.
678 // Each group is of size 128-bit.
679 in:
680 - &256Or512lanes8
681 bits: "256|512"
682 go: $t
683 elemBits: 16
684 - class: immediate
685 immOffset: 0
686 name: indices
687 hideMaskMethods: true
688 out:
689 - *256Or512lanes8
690
691 - go: permuteScalarsHi
692 asm: VPSHUFHW
693 addDoc: !string |-
694 //
695 // result = {x[0], x[1], x[2], x[3], x[indices[0:2]+4], x[indices[2:4]+4], x[indices[4:6]+4], x[indices[6:8]+4]}
696 //
697 // Indices is four 2-bit values packed into a byte, thus indices[0:2] is the first index.
698 in:
699 - *128lanes8
700 - class: immediate
701 immOffset: 0
702 name: indices
703 hideMaskMethods: true
704 out:
705 - *128lanes8
706
707 - go: permuteScalarsHi # For AVX
708 asm: VPSHUFHW
709 addDoc: !string |-
710 //
711 // result = {x[0], x[1], x[2], x[3], x[indices[0:2]+4], x[indices[2:4]+4], x[indices[4:6]+4], x[indices[6:8]+4]}
712 //
713 // Indices is four 2-bit values packed into a byte, thus indices[0:2] is the first index.
714 in:
715 - &32x4To16x8
716 bits: 128
717 go: $t
718 elemBits: 32
719 OverwriteElementBits: 16 # XED data incorrectly specified this as 32-bit, we need to fix it.
720 - class: immediate
721 immOffset: 0
722 name: indices
723 hideMaskMethods: true
724 out:
725 - *32x4To16x8
726
727 - go: permuteScalarsHiGrouped
728 asm: VPSHUFHW
729 addDoc: !string |-
730 // result =
731 //
732 // {x_group0[0], x_group0[1], x_group0[2], x_group0[3], x_group0[indices[0:2]+4], x_group0[indices[2:4]+4], x_group0[indices[4:6]+4], x_group0[indices[6:8]+4],
733 // x_group1[0], x_group1[1], x_group1[2], x_group1[3], x_group1[indices[0:2]+4], ...}
734 //
735 // Indices is four 2-bit values packed into a byte, thus indices[0:2] is the first index.
736 // Each group is of size 128-bit.
737 in:
738 - *256Or512lanes8
739 - class: immediate
740 immOffset: 0
741 name: indices
742 hideMaskMethods: true
743 out:
744 - *256Or512lanes8
745
746 - go: InterleaveHi
747 asm: VPUNPCKH(QDQ|DQ|WD|WB)
748 in:
749 - *128any
750 - *128any
751 inVariant: []
752 out:
753 - *128any
754
755 - go: InterleaveLo
756 asm: VPUNPCKL(QDQ|DQ|WD|WB)
757 in:
758 - *128any
759 - *128any
760 inVariant: []
761 out:
762 - *128any
763
764 - go: InterleaveHiGrouped
765 asm: VPUNPCKH(QDQ|DQ|WD|WB)
766 in:
767 - *256Or512any
768 - *256Or512any
769 inVariant: []
770 out:
771 - *256Or512any
772
773 - go: InterleaveLoGrouped
774 asm: VPUNPCKL(QDQ|DQ|WD|WB)
775 in:
776 - *256Or512any
777 - *256Or512any
778 inVariant: []
779 out:
780 - *256Or512any
781
782 # These are all described separately to carry the name of the constant parameter
783
784 - go: concatSelectedConstant
785 asm: VSHUFPS
786 width: 32
787 in:
788 - &v
789 go: $t
790 class: vreg
791 base: float
792 bits: 128
793 - *v
794 - class: immediate
795 immOffset: 0
796 name: h1h0l1l0
797 inVariant: []
798 out:
799 - *v
800
801 - go: concatSelectedConstant
802 asm: VSHUFPS
803 in:
804 - &v
805 go: $t
806 class: vreg
807 base: float
808 bits: 128
809 OverwriteBase: int
810 - *v
811 - class: immediate
812 immOffset: 0
813 name: h1h0l1l0
814 inVariant: []
815 out:
816 - *v
817
818 - go: concatSelectedConstant
819 asm: VSHUFPS
820 in:
821 - &v
822 go: $t
823 class: vreg
824 base: float
825 bits: 128
826 OverwriteBase: uint
827 - *v
828 - class: immediate
829 immOffset: 0
830 name: h1h0l1l0
831 inVariant: []
832 out:
833 - *v
834
835
836 - go: concatSelectedConstantGrouped
837 asm: VSHUFPS
838 in:
839 - &v
840 go: $t
841 class: vreg
842 base: float
843 bits: "256|512"
844 - *v
845 - class: immediate
846 immOffset: 0
847 name: h1h0l1l0
848 inVariant: []
849 out:
850 - *v
851
852 - go: concatSelectedConstantGrouped
853 asm: VSHUFPS
854 in:
855 - &v
856 go: $t
857 class: vreg
858 base: float
859 bits: "256|512"
860 OverwriteBase: int
861 - *v
862 - class: immediate
863 immOffset: 0
864 name: h1h0l1l0
865 inVariant: []
866 out:
867 - *v
868
869 - go: concatSelectedConstantGrouped
870 asm: VSHUFPS
871 in:
872 - &v
873 go: $t
874 class: vreg
875 base: float
876 bits: "256|512"
877 OverwriteBase: uint
878 - *v
879 - class: immediate
880 immOffset: 0
881 name: h1h0l1l0
882 inVariant: []
883 out:
884 - *v
885
886
887 # 64 bit versions
888
889 - go: concatSelectedConstant
890 asm: VSHUFPD
891 in:
892 - &v
893 go: $t
894 class: vreg
895 base: float
896 bits: 128
897 - *v
898 - class: immediate
899 immOffset: 0
900 name: hilo
901 inVariant: []
902 out:
903 - *v
904
905 - go: concatSelectedConstant
906 asm: VSHUFPD
907 in:
908 - &v
909 go: $t
910 class: vreg
911 base: float
912 bits: 128
913 OverwriteBase: int
914 - *v
915 - class: immediate
916 immOffset: 0
917 name: hilo
918 inVariant: []
919 out:
920 - *v
921
922 - go: concatSelectedConstant
923 asm: VSHUFPD
924 in:
925 - &v
926 go: $t
927 class: vreg
928 base: float
929 bits: 128
930 OverwriteBase: uint
931 - *v
932 - class: immediate
933 immOffset: 0
934 name: hilo
935 inVariant: []
936 out:
937 - *v
938
939 - go: concatSelectedConstantGrouped
940 asm: VSHUFPD
941 in:
942 - &v
943 go: $t
944 class: vreg
945 base: float
946 bits: "256|512"
947 - *v
948 - class: immediate
949 immOffset: 0
950 name: hilos
951 inVariant: []
952 out:
953 - *v
954
955 - go: concatSelectedConstantGrouped
956 asm: VSHUFPD
957 in:
958 - &v
959 go: $t
960 class: vreg
961 base: float
962 bits: "256|512"
963 OverwriteBase: int
964 - *v
965 - class: immediate
966 immOffset: 0
967 name: hilos
968 inVariant: []
969 out:
970 - *v
971
972 - go: concatSelectedConstantGrouped
973 asm: VSHUFPD
974 in:
975 - &v
976 go: $t
977 class: vreg
978 base: float
979 bits: "256|512"
980 OverwriteBase: uint
981 - *v
982 - class: immediate
983 immOffset: 0
984 name: hilos
985 inVariant: []
986 out:
987 - *v
988
989 - go: ConcatPermute128Scalars
990 asm: VPERM2F128
991 operandOrder: II
992 addDoc: !string |-
993 // For example,
994 //
995 // {40, 41, 50, 51}.NAME(3, 0, {60, 61, 70, 71})
996 //
997 // returns {70, 71, 40, 41}.
998 in:
999 - &v
1000 go: $t
1001 class: vreg
1002 base: float
1003 bits: 256
1004 - *v
1005 - class: immediate
1006 immOffset: 0
1007 name: "lo, hi"
1008 inVariant: []
1009 out:
1010 - *v
1011
1012 - go: ConcatPermute128Scalars
1013 asm: VPERM2F128
1014 operandOrder: II
1015 addDoc: !string |-
1016 // For example,
1017 //
1018 // {40, 41, 42, 43, 50, 51, 52, 53}.NAME(3, 0, {60, 61, 62, 63, 70, 71, 72, 73})
1019 //
1020 // returns {70, 71, 72, 73, 40, 41, 42, 43}.
1021 in:
1022 - &v
1023 go: $t
1024 class: vreg
1025 base: float
1026 bits: 256
1027 OverwriteElementBits: 32
1028 - *v
1029 - class: immediate
1030 immOffset: 0
1031 name: "lo, hi"
1032 inVariant: []
1033 out:
1034 - *v
1035
1036 - go: ConcatPermute128Scalars
1037 asm: VPERM2I128
1038 operandOrder: II
1039 addDoc: !string |-
1040 // For example,
1041 //
1042 // {40, 41, 50, 51}.NAME(3, 0, {60, 61, 70, 71})
1043 //
1044 // returns {70, 71, 40, 41}.
1045 in:
1046 - &v
1047 go: $t
1048 class: vreg
1049 base: int|uint
1050 bits: 256
1051 OverwriteElementBits: 64
1052 - *v
1053 - class: immediate
1054 immOffset: 0
1055 name: "lo, hi"
1056 inVariant: []
1057 out:
1058 - *v
1059
1060 - go: ConcatPermute128Scalars
1061 asm: VPERM2I128
1062 operandOrder: II
1063 addDoc: !string |-
1064 // For example,
1065 //
1066 // {40, 41, 42, 43, 50, 51, 52, 53}.NAME(3, 0, {60, 61, 62, 63, 70, 71, 72, 73})
1067 //
1068 // returns {70, 71, 72, 73, 40, 41, 42, 43}.
1069 in:
1070 - &v
1071 go: $t
1072 class: vreg
1073 base: int|uint
1074 bits: 256
1075 OverwriteElementBits: 32
1076 - *v
1077 - class: immediate
1078 immOffset: 0
1079 name: "lo, hi"
1080 inVariant: []
1081 out:
1082 - *v
1083
1084 - go: ConcatPermute128Scalars
1085 asm: VPERM2I128
1086 operandOrder: II
1087 addDoc: !string |-
1088 // For example,
1089 //
1090 // {40, 41, 42, 43, 44, 45, 46, 47, 50, 51, 52, 53, 54, 55, 56, 57}.NAME(3, 0,
1091 // {60, 61, 62, 63, 64, 65, 66, 67, 70, 71, 72, 73, 74, 75, 76, 77})
1092 //
1093 // returns {70, 71, 72, 73, 74, 75, 76, 77, 40, 41, 42, 43, 44, 45, 46, 47}.
1094 in:
1095 - &v
1096 go: $t
1097 class: vreg
1098 base: int|uint
1099 bits: 256
1100 OverwriteElementBits: 16
1101 - *v
1102 - class: immediate
1103 immOffset: 0
1104 name: "lo, hi"
1105 inVariant: []
1106 out:
1107 - *v
1108
1109 - go: ConcatPermute128Scalars
1110 asm: VPERM2I128
1111 operandOrder: II
1112 addDoc: !string |-
1113 // For example,
1114 //
1115 // {0x40, 0x41, ..., 0x4f, 0x50, 0x51, ..., 0x5f}.NAME(3, 0,
1116 // {0x60, 0x61, ..., 0x6f, 0x70, 0x71, ..., 0x7f})
1117 //
1118 // returns {0x70, 0x71, ..., 0x7f, 0x40, 0x41, ..., 0x4f}.
1119 in:
1120 - &v
1121 go: $t
1122 class: vreg
1123 base: int|uint
1124 bits: 256
1125 OverwriteElementBits: 8
1126 - *v
1127 - class: immediate
1128 immOffset: 0
1129 name: "lo, hi"
1130 inVariant: []
1131 out:
1132 - *v
1133
1134 - go: ConcatShiftBytesRight
1135 asm: VPALIGNR
1136 operandOrder: 2I
1137 in:
1138 - &uint128
1139 go: $t
1140 base: uint
1141 bits: 128
1142 - *uint128
1143 - class: immediate
1144 immOffset: 0
1145 name: shift
1146 out:
1147 - *uint128
1148
1149 - go: ConcatShiftBytesRightGrouped
1150 asm: VPALIGNR
1151 operandOrder: 2I
1152 in:
1153 - &uint256512
1154 go: $t
1155 base: uint
1156 bits: 256|512
1157 - *uint256512
1158 - class: immediate
1159 immOffset: 0
1160 name: shift
1161 out:
1162 - *uint256512
1163
View as plain text