@@ -640,3 +640,90 @@ define i32 @bitcast_v64i8_to_v2i32(<64 x i8> %a0) nounwind {
640
640
%5 = add i32 %3 , %4
641
641
ret i32 %5
642
642
}
643
+
644
+ define i64 @bitcast_v128i8_to_v2i64 (<128 x i8 > %a0 ) nounwind {
645
+ ; SSE2-SSSE3-LABEL: bitcast_v128i8_to_v2i64:
646
+ ; SSE2-SSSE3: # %bb.0:
647
+ ; SSE2-SSSE3-NEXT: pmovmskb %xmm4, %eax
648
+ ; SSE2-SSSE3-NEXT: pmovmskb %xmm5, %ecx
649
+ ; SSE2-SSSE3-NEXT: shll $16, %ecx
650
+ ; SSE2-SSSE3-NEXT: orl %eax, %ecx
651
+ ; SSE2-SSSE3-NEXT: pmovmskb %xmm6, %eax
652
+ ; SSE2-SSSE3-NEXT: pmovmskb %xmm7, %edx
653
+ ; SSE2-SSSE3-NEXT: shll $16, %edx
654
+ ; SSE2-SSSE3-NEXT: orl %eax, %edx
655
+ ; SSE2-SSSE3-NEXT: shlq $32, %rdx
656
+ ; SSE2-SSSE3-NEXT: orq %rcx, %rdx
657
+ ; SSE2-SSSE3-NEXT: pmovmskb %xmm0, %eax
658
+ ; SSE2-SSSE3-NEXT: pmovmskb %xmm1, %ecx
659
+ ; SSE2-SSSE3-NEXT: shll $16, %ecx
660
+ ; SSE2-SSSE3-NEXT: orl %eax, %ecx
661
+ ; SSE2-SSSE3-NEXT: pmovmskb %xmm2, %esi
662
+ ; SSE2-SSSE3-NEXT: pmovmskb %xmm3, %eax
663
+ ; SSE2-SSSE3-NEXT: shll $16, %eax
664
+ ; SSE2-SSSE3-NEXT: orl %esi, %eax
665
+ ; SSE2-SSSE3-NEXT: shlq $32, %rax
666
+ ; SSE2-SSSE3-NEXT: orq %rcx, %rax
667
+ ; SSE2-SSSE3-NEXT: addq %rdx, %rax
668
+ ; SSE2-SSSE3-NEXT: retq
669
+ ;
670
+ ; AVX1-LABEL: bitcast_v128i8_to_v2i64:
671
+ ; AVX1: # %bb.0:
672
+ ; AVX1-NEXT: vpmovmskb %xmm2, %eax
673
+ ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2
674
+ ; AVX1-NEXT: vpmovmskb %xmm2, %edx
675
+ ; AVX1-NEXT: shll $16, %edx
676
+ ; AVX1-NEXT: orl %eax, %edx
677
+ ; AVX1-NEXT: vpmovmskb %xmm3, %eax
678
+ ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2
679
+ ; AVX1-NEXT: vpmovmskb %xmm2, %ecx
680
+ ; AVX1-NEXT: shll $16, %ecx
681
+ ; AVX1-NEXT: orl %eax, %ecx
682
+ ; AVX1-NEXT: shlq $32, %rcx
683
+ ; AVX1-NEXT: orq %rdx, %rcx
684
+ ; AVX1-NEXT: vpmovmskb %xmm0, %eax
685
+ ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
686
+ ; AVX1-NEXT: vpmovmskb %xmm0, %edx
687
+ ; AVX1-NEXT: shll $16, %edx
688
+ ; AVX1-NEXT: orl %eax, %edx
689
+ ; AVX1-NEXT: vpmovmskb %xmm1, %esi
690
+ ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0
691
+ ; AVX1-NEXT: vpmovmskb %xmm0, %eax
692
+ ; AVX1-NEXT: shll $16, %eax
693
+ ; AVX1-NEXT: orl %esi, %eax
694
+ ; AVX1-NEXT: shlq $32, %rax
695
+ ; AVX1-NEXT: orq %rdx, %rax
696
+ ; AVX1-NEXT: addq %rcx, %rax
697
+ ; AVX1-NEXT: vzeroupper
698
+ ; AVX1-NEXT: retq
699
+ ;
700
+ ; AVX2-LABEL: bitcast_v128i8_to_v2i64:
701
+ ; AVX2: # %bb.0:
702
+ ; AVX2-NEXT: vpmovmskb %ymm3, %eax
703
+ ; AVX2-NEXT: shlq $32, %rax
704
+ ; AVX2-NEXT: vpmovmskb %ymm2, %ecx
705
+ ; AVX2-NEXT: orq %rax, %rcx
706
+ ; AVX2-NEXT: vpmovmskb %ymm1, %edx
707
+ ; AVX2-NEXT: shlq $32, %rdx
708
+ ; AVX2-NEXT: vpmovmskb %ymm0, %eax
709
+ ; AVX2-NEXT: orq %rdx, %rax
710
+ ; AVX2-NEXT: addq %rcx, %rax
711
+ ; AVX2-NEXT: vzeroupper
712
+ ; AVX2-NEXT: retq
713
+ ;
714
+ ; AVX512-LABEL: bitcast_v128i8_to_v2i64:
715
+ ; AVX512: # %bb.0:
716
+ ; AVX512-NEXT: vpmovb2m %zmm1, %k0
717
+ ; AVX512-NEXT: kmovq %k0, %rcx
718
+ ; AVX512-NEXT: vpmovb2m %zmm0, %k0
719
+ ; AVX512-NEXT: kmovq %k0, %rax
720
+ ; AVX512-NEXT: addq %rcx, %rax
721
+ ; AVX512-NEXT: vzeroupper
722
+ ; AVX512-NEXT: retq
723
+ %1 = icmp slt <128 x i8 > %a0 , zeroinitializer
724
+ %2 = bitcast <128 x i1 > %1 to <2 x i64 >
725
+ %3 = extractelement <2 x i64 > %2 , i32 0
726
+ %4 = extractelement <2 x i64 > %2 , i32 1
727
+ %5 = add i64 %3 , %4
728
+ ret i64 %5
729
+ }
0 commit comments