1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw -mattr=+avx512dq -mattr=+avx512vl| FileCheck %s
4 define <8 x i1> @test(<2 x i1> %a) {
7 ; CHECK-NEXT: vpsllq $63, %xmm0, %xmm0
8 ; CHECK-NEXT: vptestmq %xmm0, %xmm0, %k0
9 ; CHECK-NEXT: kshiftlb $2, %k0, %k0
10 ; CHECK-NEXT: vpmovm2w %k0, %xmm0
12 %res = shufflevector <2 x i1> %a, <2 x i1> undef, <8 x i32> <i32 undef, i32 undef, i32 0, i32 1, i32 undef, i32 undef, i32 undef, i32 undef>
16 define <8 x i1> @test1(<2 x i1> %a) {
19 ; CHECK-NEXT: vpsllq $63, %xmm0, %xmm0
20 ; CHECK-NEXT: vptestmq %xmm0, %xmm0, %k0
21 ; CHECK-NEXT: kshiftlb $4, %k0, %k0
22 ; CHECK-NEXT: vpmovm2w %k0, %xmm0
24 %res = shufflevector <2 x i1> %a, <2 x i1> undef, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 0, i32 1, i32 undef, i32 undef>
28 define <8 x i1> @test2(<2 x i1> %a) {
31 ; CHECK-NEXT: vpsllq $63, %xmm0, %xmm0
32 ; CHECK-NEXT: vptestmq %xmm0, %xmm0, %k0
33 ; CHECK-NEXT: vpmovm2d %k0, %ymm0
34 ; CHECK-NEXT: vperm2i128 {{.*#+}} ymm0 = zero,zero,ymm0[0,1]
35 ; CHECK-NEXT: vpmovd2m %ymm0, %k0
36 ; CHECK-NEXT: vpmovm2w %k0, %xmm0
37 ; CHECK-NEXT: vzeroupper
39 %res = shufflevector <2 x i1> %a, <2 x i1> zeroinitializer, <8 x i32> <i32 3, i32 3, i32 undef, i32 undef, i32 0, i32 1, i32 undef, i32 undef>
43 define <8 x i1> @test3(<4 x i1> %a) {
46 ; CHECK-NEXT: vpslld $31, %xmm0, %xmm0
47 ; CHECK-NEXT: vptestmd %xmm0, %xmm0, %k0
48 ; CHECK-NEXT: vpmovm2w %k0, %xmm0
51 %res = shufflevector <4 x i1> %a, <4 x i1> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
55 define <8 x i1> @test4(<4 x i1> %a, <4 x i1>%b) {
58 ; CHECK-NEXT: vpslld $31, %xmm1, %xmm1
59 ; CHECK-NEXT: vptestmd %xmm1, %xmm1, %k0
60 ; CHECK-NEXT: vpslld $31, %xmm0, %xmm0
61 ; CHECK-NEXT: vptestmd %xmm0, %xmm0, %k1
62 ; CHECK-NEXT: kshiftlb $4, %k0, %k0
63 ; CHECK-NEXT: korb %k0, %k1, %k0
64 ; CHECK-NEXT: vpmovm2w %k0, %xmm0
67 %res = shufflevector <4 x i1> %a, <4 x i1> %b, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
71 define <4 x i1> @test5(<2 x i1> %a, <2 x i1>%b) {
74 ; CHECK-NEXT: vpsllq $63, %xmm1, %xmm1
75 ; CHECK-NEXT: vptestmq %xmm1, %xmm1, %k0
76 ; CHECK-NEXT: vpsllq $63, %xmm0, %xmm0
77 ; CHECK-NEXT: vptestmq %xmm0, %xmm0, %k1
78 ; CHECK-NEXT: kshiftlb $2, %k0, %k0
79 ; CHECK-NEXT: korb %k0, %k1, %k0
80 ; CHECK-NEXT: vpmovm2d %k0, %xmm0
83 %res = shufflevector <2 x i1> %a, <2 x i1> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
87 define <16 x i1> @test6(<2 x i1> %a, <2 x i1>%b) {
90 ; CHECK-NEXT: vpsllq $63, %xmm1, %xmm1
91 ; CHECK-NEXT: vptestmq %xmm1, %xmm1, %k0
92 ; CHECK-NEXT: vpsllq $63, %xmm0, %xmm0
93 ; CHECK-NEXT: vptestmq %xmm0, %xmm0, %k1
94 ; CHECK-NEXT: kshiftlb $2, %k0, %k0
95 ; CHECK-NEXT: korb %k0, %k1, %k0
96 ; CHECK-NEXT: vpmovm2b %k0, %xmm0
99 %res = shufflevector <2 x i1> %a, <2 x i1> %b, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
103 define <32 x i1> @test7(<4 x i1> %a, <4 x i1>%b) {
104 ; CHECK-LABEL: test7:
106 ; CHECK-NEXT: vpslld $31, %xmm1, %xmm1
107 ; CHECK-NEXT: vptestmd %xmm1, %xmm1, %k0
108 ; CHECK-NEXT: vpslld $31, %xmm0, %xmm0
109 ; CHECK-NEXT: vptestmd %xmm0, %xmm0, %k1
110 ; CHECK-NEXT: kshiftlb $4, %k0, %k0
111 ; CHECK-NEXT: korb %k0, %k1, %k0
112 ; CHECK-NEXT: vpmovm2b %k0, %ymm0
115 %res = shufflevector <4 x i1> %a, <4 x i1> %b, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
119 define <64 x i1> @test8(<8 x i1> %a, <8 x i1>%b) {
120 ; CHECK-LABEL: test8:
122 ; CHECK-NEXT: vpsllw $15, %xmm1, %xmm1
123 ; CHECK-NEXT: vpmovw2m %xmm1, %k0
124 ; CHECK-NEXT: vpsllw $15, %xmm0, %xmm0
125 ; CHECK-NEXT: vpmovw2m %xmm0, %k1
126 ; CHECK-NEXT: kunpckdq %k1, %k0, %k0
127 ; CHECK-NEXT: vpmovm2b %k0, %zmm0
130 %res = shufflevector <8 x i1> %a, <8 x i1> %b, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
134 define <4 x i1> @test9(<8 x i1> %a, <8 x i1> %b) {
135 ; CHECK-LABEL: test9:
137 ; CHECK-NEXT: vpsllw $15, %xmm0, %xmm0
138 ; CHECK-NEXT: vpmovw2m %xmm0, %k0
139 ; CHECK-NEXT: kshiftrw $4, %k0, %k0
140 ; CHECK-NEXT: vpmovm2d %k0, %xmm0
142 %res = shufflevector <8 x i1> %a, <8 x i1> %b, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
146 define <2 x i1> @test10(<4 x i1> %a, <4 x i1> %b) {
147 ; CHECK-LABEL: test10:
149 ; CHECK-NEXT: vpslld $31, %xmm0, %xmm0
150 ; CHECK-NEXT: vptestmd %xmm0, %xmm0, %k0
151 ; CHECK-NEXT: kshiftrw $2, %k0, %k0
152 ; CHECK-NEXT: vpmovm2q %k0, %xmm0
154 %res = shufflevector <4 x i1> %a, <4 x i1> %b, <2 x i32> <i32 2, i32 3>
158 define <8 x i1> @test11(<4 x i1> %a, <4 x i1>%b) {
159 ; CHECK-LABEL: test11:
161 ; CHECK-NEXT: vpslld $31, %xmm0, %xmm0
162 ; CHECK-NEXT: vptestmd %xmm0, %xmm0, %k0
163 ; CHECK-NEXT: kshiftlb $4, %k0, %k0
164 ; CHECK-NEXT: vpmovm2w %k0, %xmm0
166 %res = shufflevector <4 x i1> %a, <4 x i1> undef, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 0, i32 1, i32 2, i32 3>