Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / vector-shuffle-avx512.ll
blob8cc20ec3c1a7e8521eb3825f20ebb031505a1b78
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i386-pc-linux-gnu -mattr=+avx512f,+avx512vl,+avx512bw,+avx512dq | FileCheck %s --check-prefixes=CHECK,AVX512,X86-AVX512,AVX512-SLOW,X86-AVX512-SLOW
3 ; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu -mattr=+avx512f,+avx512vl,+avx512bw,+avx512dq | FileCheck %s --check-prefixes=CHECK,AVX512,X64-AVX512,AVX512-SLOW,X64-AVX512-SLOW
4 ; RUN: llc < %s -mtriple=i386-pc-linux-gnu -mattr=+avx512f,+avx512vl,+avx512bw,+avx512dq,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=CHECK,AVX512,X86-AVX512,AVX512-FAST,X86-AVX512-FAST
5 ; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu -mattr=+avx512f,+avx512vl,+avx512bw,+avx512dq,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=CHECK,AVX512,X64-AVX512,AVX512-FAST,X64-AVX512-FAST
6 ; RUN: llc < %s -mtriple=i386-pc-linux-gnu -mattr=+avx512f | FileCheck %s --check-prefixes=CHECK,AVX512F,X86-AVX512F
7 ; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu -mattr=+avx512f | FileCheck %s --check-prefixes=CHECK,AVX512F,X64-AVX512F
9 ;expand 128 -> 256 include <4 x float> <2 x double>
10 define <8 x float> @expand(<4 x float> %a) {
11 ; AVX512-LABEL: expand:
12 ; AVX512:       # %bb.0:
13 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
14 ; AVX512-NEXT:    movb $5, %al
15 ; AVX512-NEXT:    kmovd %eax, %k1
16 ; AVX512-NEXT:    vexpandps %ymm0, %ymm0 {%k1} {z}
17 ; AVX512-NEXT:    ret{{[l|q]}}
19 ; AVX512F-LABEL: expand:
20 ; AVX512F:       # %bb.0:
21 ; AVX512F-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1,1,3]
22 ; AVX512F-NEXT:    vxorps %xmm1, %xmm1, %xmm1
23 ; AVX512F-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3,4,5,6,7]
24 ; AVX512F-NEXT:    ret{{[l|q]}}
25    %res = shufflevector <4 x float> %a, <4 x float> zeroinitializer, <8 x i32> <i32 0, i32 5, i32 1, i32 5, i32 5, i32 5, i32 5, i32 5>
26    ret <8 x float> %res
29 define <8 x float> @expand1(<4 x float> %a ) {
30 ; AVX512-LABEL: expand1:
31 ; AVX512:       # %bb.0:
32 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
33 ; AVX512-NEXT:    movb $-86, %al
34 ; AVX512-NEXT:    kmovd %eax, %k1
35 ; AVX512-NEXT:    vexpandps %ymm0, %ymm0 {%k1} {z}
36 ; AVX512-NEXT:    ret{{[l|q]}}
38 ; AVX512F-LABEL: expand1:
39 ; AVX512F:       # %bb.0:
40 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
41 ; AVX512F-NEXT:    vmovaps {{.*#+}} ymm1 = [16,0,18,1,20,2,22,3]
42 ; AVX512F-NEXT:    vxorps %xmm2, %xmm2, %xmm2
43 ; AVX512F-NEXT:    vpermt2ps %zmm2, %zmm1, %zmm0
44 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
45 ; AVX512F-NEXT:    ret{{[l|q]}}
46    %res = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
47    ret <8 x float> %res
50 ;Expand 128 -> 256 test <2 x double> -> <4 x double>
51 define <4 x double> @expand2(<2 x double> %a) {
52 ; CHECK-LABEL: expand2:
53 ; CHECK:       # %bb.0:
54 ; CHECK-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
55 ; CHECK-NEXT:    vperm2f128 {{.*#+}} ymm1 = zero,zero,ymm0[0,1]
56 ; CHECK-NEXT:    vmovaps %xmm0, %xmm0
57 ; CHECK-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5],ymm1[6,7]
58 ; CHECK-NEXT:    ret{{[l|q]}}
59    %res = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <4 x i32> <i32 0, i32 2, i32 2, i32 1>
60    ret <4 x double> %res
63 ;expand 128 -> 256 include case <4 x i32> <8 x i32>
64 define <8 x i32> @expand3(<4 x i32> %a ) {
65 ; AVX512-LABEL: expand3:
66 ; AVX512:       # %bb.0:
67 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
68 ; AVX512-NEXT:    movb $-127, %al
69 ; AVX512-NEXT:    kmovd %eax, %k1
70 ; AVX512-NEXT:    vpexpandd %ymm0, %ymm0 {%k1} {z}
71 ; AVX512-NEXT:    ret{{[l|q]}}
73 ; AVX512F-LABEL: expand3:
74 ; AVX512F:       # %bb.0:
75 ; AVX512F-NEXT:    vbroadcastsd %xmm0, %ymm0
76 ; AVX512F-NEXT:    vxorps %xmm1, %xmm1, %xmm1
77 ; AVX512F-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6],ymm0[7]
78 ; AVX512F-NEXT:    ret{{[l|q]}}
79    %res = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <8 x i32> <i32 4, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0,i32 5>
80    ret <8 x i32> %res
83 ;expand 128 -> 256 include case <2 x i64> <4 x i64>
84 define <4 x i64> @expand4(<2 x i64> %a ) {
85 ; AVX512-LABEL: expand4:
86 ; AVX512:       # %bb.0:
87 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
88 ; AVX512-NEXT:    movb $9, %al
89 ; AVX512-NEXT:    kmovd %eax, %k1
90 ; AVX512-NEXT:    vpexpandq %ymm0, %ymm0 {%k1} {z}
91 ; AVX512-NEXT:    ret{{[l|q]}}
93 ; AVX512F-LABEL: expand4:
94 ; AVX512F:       # %bb.0:
95 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
96 ; AVX512F-NEXT:    vperm2f128 {{.*#+}} ymm1 = zero,zero,ymm0[0,1]
97 ; AVX512F-NEXT:    vmovaps %xmm0, %xmm0
98 ; AVX512F-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5],ymm1[6,7]
99 ; AVX512F-NEXT:    ret{{[l|q]}}
100    %res = shufflevector <2 x i64> zeroinitializer, <2 x i64> %a, <4 x i32> <i32 2, i32 0, i32 0, i32 3>
101    ret <4 x i64> %res
104 ;Negative test for 128-> 256
105 define <8 x float> @expand5(<4 x float> %a ) {
106 ; AVX512-SLOW-LABEL: expand5:
107 ; AVX512-SLOW:       # %bb.0:
108 ; AVX512-SLOW-NEXT:    vbroadcastss %xmm0, %ymm0
109 ; AVX512-SLOW-NEXT:    vxorps %xmm1, %xmm1, %xmm1
110 ; AVX512-SLOW-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3],ymm1[4],ymm0[5],ymm1[6],ymm0[7]
111 ; AVX512-SLOW-NEXT:    ret{{[l|q]}}
113 ; AVX512-FAST-LABEL: expand5:
114 ; AVX512-FAST:       # %bb.0:
115 ; AVX512-FAST-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
116 ; AVX512-FAST-NEXT:    vxorps %xmm1, %xmm1, %xmm1
117 ; AVX512-FAST-NEXT:    vmovaps {{.*#+}} ymm2 = [8,0,10,0,12,0,14,0]
118 ; AVX512-FAST-NEXT:    vpermt2ps %ymm1, %ymm2, %ymm0
119 ; AVX512-FAST-NEXT:    ret{{[l|q]}}
121 ; AVX512F-LABEL: expand5:
122 ; AVX512F:       # %bb.0:
123 ; AVX512F-NEXT:    vbroadcastss %xmm0, %ymm0
124 ; AVX512F-NEXT:    vxorps %xmm1, %xmm1, %xmm1
125 ; AVX512F-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3],ymm1[4],ymm0[5],ymm1[6],ymm0[7]
126 ; AVX512F-NEXT:    ret{{[l|q]}}
127    %res = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <8 x i32> <i32 0, i32 4, i32 1, i32 4, i32 2, i32 4, i32 3, i32 4>
128    ret <8 x float> %res
131 ;expand 256 -> 512 include <8 x float> <16 x float>
132 define <8 x float> @expand6(<4 x float> %a ) {
133 ; CHECK-LABEL: expand6:
134 ; CHECK:       # %bb.0:
135 ; CHECK-NEXT:    vxorps %xmm1, %xmm1, %xmm1
136 ; CHECK-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
137 ; CHECK-NEXT:    ret{{[l|q]}}
138    %res = shufflevector <4 x float> zeroinitializer, <4 x float> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
139    ret <8 x float> %res
142 define <16 x float> @expand7(<8 x float> %a) {
143 ; AVX512-LABEL: expand7:
144 ; AVX512:       # %bb.0:
145 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
146 ; AVX512-NEXT:    movw $1285, %ax # imm = 0x505
147 ; AVX512-NEXT:    kmovd %eax, %k1
148 ; AVX512-NEXT:    vexpandps %zmm0, %zmm0 {%k1} {z}
149 ; AVX512-NEXT:    ret{{[l|q]}}
151 ; AVX512F-LABEL: expand7:
152 ; AVX512F:       # %bb.0:
153 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
154 ; AVX512F-NEXT:    movw $1285, %ax # imm = 0x505
155 ; AVX512F-NEXT:    kmovw %eax, %k1
156 ; AVX512F-NEXT:    vexpandps %zmm0, %zmm0 {%k1} {z}
157 ; AVX512F-NEXT:    ret{{[l|q]}}
158    %res = shufflevector <8 x float> %a, <8 x float> zeroinitializer, <16 x i32> <i32 0, i32 8, i32 1, i32 8, i32 8, i32 8, i32 8, i32 8, i32 2, i32 8, i32 3, i32 8, i32 8, i32 8, i32 8, i32 8>
159    ret <16 x float> %res
162 define <16 x float> @expand8(<8 x float> %a ) {
163 ; AVX512-LABEL: expand8:
164 ; AVX512:       # %bb.0:
165 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
166 ; AVX512-NEXT:    movw $-21846, %ax # imm = 0xAAAA
167 ; AVX512-NEXT:    kmovd %eax, %k1
168 ; AVX512-NEXT:    vexpandps %zmm0, %zmm0 {%k1} {z}
169 ; AVX512-NEXT:    ret{{[l|q]}}
171 ; AVX512F-LABEL: expand8:
172 ; AVX512F:       # %bb.0:
173 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
174 ; AVX512F-NEXT:    movw $-21846, %ax # imm = 0xAAAA
175 ; AVX512F-NEXT:    kmovw %eax, %k1
176 ; AVX512F-NEXT:    vexpandps %zmm0, %zmm0 {%k1} {z}
177 ; AVX512F-NEXT:    ret{{[l|q]}}
178    %res = shufflevector <8 x float> zeroinitializer, <8 x float> %a, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
179    ret <16 x float> %res
182 ;expand 256 -> 512 include <4 x double> <8 x double>
183 define <8 x double> @expand9(<4 x double> %a) {
184 ; AVX512-LABEL: expand9:
185 ; AVX512:       # %bb.0:
186 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
187 ; AVX512-NEXT:    movb $-127, %al
188 ; AVX512-NEXT:    kmovd %eax, %k1
189 ; AVX512-NEXT:    vexpandpd %zmm0, %zmm0 {%k1} {z}
190 ; AVX512-NEXT:    ret{{[l|q]}}
192 ; AVX512F-LABEL: expand9:
193 ; AVX512F:       # %bb.0:
194 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
195 ; AVX512F-NEXT:    movb $-127, %al
196 ; AVX512F-NEXT:    kmovw %eax, %k1
197 ; AVX512F-NEXT:    vexpandpd %zmm0, %zmm0 {%k1} {z}
198 ; AVX512F-NEXT:    ret{{[l|q]}}
199    %res = shufflevector <4 x double> %a, <4 x double> zeroinitializer, <8 x i32> <i32 0, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 1>
200    ret <8 x double> %res
203 define <16 x i32> @expand10(<8 x i32> %a ) {
204 ; AVX512-LABEL: expand10:
205 ; AVX512:       # %bb.0:
206 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
207 ; AVX512-NEXT:    movw $-21846, %ax # imm = 0xAAAA
208 ; AVX512-NEXT:    kmovd %eax, %k1
209 ; AVX512-NEXT:    vpexpandd %zmm0, %zmm0 {%k1} {z}
210 ; AVX512-NEXT:    ret{{[l|q]}}
212 ; AVX512F-LABEL: expand10:
213 ; AVX512F:       # %bb.0:
214 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
215 ; AVX512F-NEXT:    movw $-21846, %ax # imm = 0xAAAA
216 ; AVX512F-NEXT:    kmovw %eax, %k1
217 ; AVX512F-NEXT:    vpexpandd %zmm0, %zmm0 {%k1} {z}
218 ; AVX512F-NEXT:    ret{{[l|q]}}
219    %res = shufflevector <8 x i32> zeroinitializer, <8 x i32> %a, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
220    ret <16 x i32> %res
223 define <8 x i64> @expand11(<4 x i64> %a) {
224 ; AVX512-LABEL: expand11:
225 ; AVX512:       # %bb.0:
226 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
227 ; AVX512-NEXT:    movb $-127, %al
228 ; AVX512-NEXT:    kmovd %eax, %k1
229 ; AVX512-NEXT:    vpexpandq %zmm0, %zmm0 {%k1} {z}
230 ; AVX512-NEXT:    ret{{[l|q]}}
232 ; AVX512F-LABEL: expand11:
233 ; AVX512F:       # %bb.0:
234 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
235 ; AVX512F-NEXT:    movb $-127, %al
236 ; AVX512F-NEXT:    kmovw %eax, %k1
237 ; AVX512F-NEXT:    vpexpandq %zmm0, %zmm0 {%k1} {z}
238 ; AVX512F-NEXT:    ret{{[l|q]}}
239    %res = shufflevector <4 x i64> %a, <4 x i64> zeroinitializer, <8 x i32> <i32 0, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 1>
240    ret <8 x i64> %res
243 ;Negative test for 256-> 512
244 define <16 x float> @expand12(<8 x float> %a) {
245 ; CHECK-LABEL: expand12:
246 ; CHECK:       # %bb.0:
247 ; CHECK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
248 ; CHECK-NEXT:    vmovaps {{.*#+}} zmm2 = [0,16,2,16,4,16,6,16,0,16,1,16,2,16,3,16]
249 ; CHECK-NEXT:    vxorps %xmm1, %xmm1, %xmm1
250 ; CHECK-NEXT:    vpermt2ps %zmm0, %zmm2, %zmm1
251 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
252 ; CHECK-NEXT:    ret{{[l|q]}}
253    %res = shufflevector <8 x float> zeroinitializer, <8 x float> %a, <16 x i32> <i32 0, i32 8, i32 1, i32 8, i32 2, i32 8, i32 3, i32 8,i32 0, i32 8, i32 1, i32 8, i32 2, i32 8, i32 3, i32 8>
254    ret <16 x float> %res
257 define <16 x float> @expand13(<8 x float> %a ) {
258 ; CHECK-LABEL: expand13:
259 ; CHECK:       # %bb.0:
260 ; CHECK-NEXT:    vxorps %xmm1, %xmm1, %xmm1
261 ; CHECK-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
262 ; CHECK-NEXT:    ret{{[l|q]}}
263    %res = shufflevector <8 x float> zeroinitializer, <8 x float> %a, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7,i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
264    ret <16 x float> %res
267 ; The function checks for a case where the vector is mixed values vector ,and the mask points on zero elements from this vector.
269 define <8 x float> @expand14(<4 x float> %a) {
270 ; AVX512-LABEL: expand14:
271 ; AVX512:       # %bb.0:
272 ; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
273 ; AVX512-NEXT:    movb $20, %al
274 ; AVX512-NEXT:    kmovd %eax, %k1
275 ; AVX512-NEXT:    vexpandps %ymm0, %ymm0 {%k1} {z}
276 ; AVX512-NEXT:    ret{{[l|q]}}
278 ; AVX512F-LABEL: expand14:
279 ; AVX512F:       # %bb.0:
280 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
281 ; AVX512F-NEXT:    vmovaps {{.*#+}} ymm1 = [16,17,0,19,1,21,22,23]
282 ; AVX512F-NEXT:    vxorps %xmm2, %xmm2, %xmm2
283 ; AVX512F-NEXT:    vpermt2ps %zmm2, %zmm1, %zmm0
284 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
285 ; AVX512F-NEXT:    ret{{[l|q]}}
286    %addV = fadd <4 x float> <float 0.0,float 1.0,float 2.0,float 0.0> , <float 0.0,float 1.0,float 2.0,float 0.0>
287    %res = shufflevector <4 x float> %addV, <4 x float> %a, <8 x i32> <i32 3, i32 3, i32 4, i32 0, i32 5, i32 0, i32 0, i32 0>
288    ret <8 x float> %res
291 ;Negative test.
292 define <8 x float> @expand15(<4 x float> %a) {
293 ; AVX512-SLOW-LABEL: expand15:
294 ; AVX512-SLOW:       # %bb.0:
295 ; AVX512-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1,1,3]
296 ; AVX512-SLOW-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,0,1,3]
297 ; AVX512-SLOW-NEXT:    vblendps {{.*#+}} ymm0 = mem[0,1],ymm0[2],mem[3],ymm0[4],mem[5,6,7]
298 ; AVX512-SLOW-NEXT:    ret{{[l|q]}}
300 ; AVX512-FAST-LABEL: expand15:
301 ; AVX512-FAST:       # %bb.0:
302 ; AVX512-FAST-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
303 ; AVX512-FAST-NEXT:    vbroadcastf128 {{.*#+}} ymm1 = [1,0,0,0,1,0,0,0]
304 ; AVX512-FAST-NEXT:    # ymm1 = mem[0,1,0,1]
305 ; AVX512-FAST-NEXT:    vpermps %ymm0, %ymm1, %ymm0
306 ; AVX512-FAST-NEXT:    vblendps {{.*#+}} ymm0 = mem[0,1],ymm0[2],mem[3],ymm0[4],mem[5,6,7]
307 ; AVX512-FAST-NEXT:    ret{{[l|q]}}
309 ; AVX512F-LABEL: expand15:
310 ; AVX512F:       # %bb.0:
311 ; AVX512F-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,1,1,3]
312 ; AVX512F-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,0,1,3]
313 ; AVX512F-NEXT:    vblendps {{.*#+}} ymm0 = mem[0,1],ymm0[2],mem[3],ymm0[4],mem[5,6,7]
314 ; AVX512F-NEXT:    ret{{[l|q]}}
315    %addV = fadd <4 x float> <float 0.0,float 1.0,float 2.0,float 0.0> , <float 0.0,float 1.0,float 2.0,float 0.0>
316    %res = shufflevector <4 x float> %addV, <4 x float> %a, <8 x i32> <i32 0, i32 1, i32 4, i32 0, i32 5, i32 0, i32 0, i32 0>
317    ret <8 x float> %res
320 ; Shuffle to blend test
322 define <64 x i8> @test_mm512_mask_blend_epi8(<64 x i8> %A, <64 x i8> %W){
323 ; X86-AVX512-LABEL: test_mm512_mask_blend_epi8:
324 ; X86-AVX512:       # %bb.0: # %entry
325 ; X86-AVX512-NEXT:    movl $-1431655766, %eax # imm = 0xAAAAAAAA
326 ; X86-AVX512-NEXT:    kmovd %eax, %k0
327 ; X86-AVX512-NEXT:    kunpckdq %k0, %k0, %k1
328 ; X86-AVX512-NEXT:    vpblendmb %zmm0, %zmm1, %zmm0 {%k1}
329 ; X86-AVX512-NEXT:    retl
331 ; X64-AVX512-LABEL: test_mm512_mask_blend_epi8:
332 ; X64-AVX512:       # %bb.0: # %entry
333 ; X64-AVX512-NEXT:    movabsq $-6148914691236517206, %rax # imm = 0xAAAAAAAAAAAAAAAA
334 ; X64-AVX512-NEXT:    kmovq %rax, %k1
335 ; X64-AVX512-NEXT:    vpblendmb %zmm0, %zmm1, %zmm0 {%k1}
336 ; X64-AVX512-NEXT:    retq
338 ; AVX512F-LABEL: test_mm512_mask_blend_epi8:
339 ; AVX512F:       # %bb.0: # %entry
340 ; AVX512F-NEXT:    vpbroadcastw {{.*#+}} ymm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
341 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm2, %zmm2
342 ; AVX512F-NEXT:    vpternlogq $216, %zmm2, %zmm1, %zmm0
343 ; AVX512F-NEXT:    ret{{[l|q]}}
344 entry:
345   %0 = shufflevector <64 x i8> %A, <64 x i8> %W, <64 x i32>  <i32 64, i32 1, i32 66, i32 3, i32 68, i32 5, i32 70, i32 7, i32 72, i32 9, i32 74, i32 11, i32 76, i32 13, i32 78, i32 15, i32 80, i32 17, i32 82, i32 19, i32 84, i32 21, i32 86, i32 23, i32 88, i32 25, i32 90, i32 27, i32 92, i32 29, i32 94, i32 31, i32 96, i32 33, i32 98, i32 35, i32 100, i32 37, i32 102, i32 39, i32 104, i32 41, i32 106, i32 43, i32 108, i32 45, i32 110, i32 47, i32 112, i32 49, i32 114, i32 51, i32 116, i32 53, i32 118, i32 55, i32 120, i32 57, i32 122, i32 59, i32 124, i32 61, i32 126, i32 63>
346   ret <64 x i8> %0
349 define <32 x i16> @test_mm512_mask_blend_epi16(<32 x i16> %A, <32 x i16> %W){
350 ; AVX512-LABEL: test_mm512_mask_blend_epi16:
351 ; AVX512:       # %bb.0: # %entry
352 ; AVX512-NEXT:    movl $-1431655766, %eax # imm = 0xAAAAAAAA
353 ; AVX512-NEXT:    kmovd %eax, %k1
354 ; AVX512-NEXT:    vpblendmw %zmm0, %zmm1, %zmm0 {%k1}
355 ; AVX512-NEXT:    ret{{[l|q]}}
357 ; X86-AVX512F-LABEL: test_mm512_mask_blend_epi16:
358 ; X86-AVX512F:       # %bb.0: # %entry
359 ; X86-AVX512F-NEXT:    vpternlogd $216, {{\.?LCPI[0-9]+_[0-9]+}}{1to16}, %zmm1, %zmm0
360 ; X86-AVX512F-NEXT:    retl
362 ; X64-AVX512F-LABEL: test_mm512_mask_blend_epi16:
363 ; X64-AVX512F:       # %bb.0: # %entry
364 ; X64-AVX512F-NEXT:    vpternlogd $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm1, %zmm0
365 ; X64-AVX512F-NEXT:    retq
366 entry:
367   %0 = shufflevector <32 x i16> %A, <32 x i16> %W, <32 x i32>  <i32 32, i32 1, i32 34, i32 3, i32 36, i32 5, i32 38, i32 7, i32 40, i32 9, i32 42, i32 11, i32 44, i32 13, i32 46, i32 15, i32 48, i32 17, i32 50, i32 19, i32 52, i32 21, i32 54, i32 23, i32 56, i32 25, i32 58, i32 27, i32 60, i32 29, i32 62, i32 31>
368   ret <32 x i16> %0
371 define <16 x i32> @test_mm512_mask_blend_epi32(<16 x i32> %A, <16 x i32> %W){
372 ; AVX512-LABEL: test_mm512_mask_blend_epi32:
373 ; AVX512:       # %bb.0: # %entry
374 ; AVX512-NEXT:    movw $-21846, %ax # imm = 0xAAAA
375 ; AVX512-NEXT:    kmovd %eax, %k1
376 ; AVX512-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
377 ; AVX512-NEXT:    ret{{[l|q]}}
379 ; AVX512F-LABEL: test_mm512_mask_blend_epi32:
380 ; AVX512F:       # %bb.0: # %entry
381 ; AVX512F-NEXT:    movw $-21846, %ax # imm = 0xAAAA
382 ; AVX512F-NEXT:    kmovw %eax, %k1
383 ; AVX512F-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
384 ; AVX512F-NEXT:    ret{{[l|q]}}
385 entry:
386   %0 = shufflevector <16 x i32> %A, <16 x i32> %W, <16 x i32>  <i32 16, i32 1, i32 18, i32 3, i32 20, i32 5, i32 22, i32 7, i32 24, i32 9, i32 26, i32 11, i32 28, i32 13, i32 30, i32 15>
387   ret <16 x i32> %0
390 define <8 x i64> @test_mm512_mask_blend_epi64(<8 x i64> %A, <8 x i64> %W){
391 ; AVX512-LABEL: test_mm512_mask_blend_epi64:
392 ; AVX512:       # %bb.0: # %entry
393 ; AVX512-NEXT:    movb $-86, %al
394 ; AVX512-NEXT:    kmovd %eax, %k1
395 ; AVX512-NEXT:    vpblendmq %zmm0, %zmm1, %zmm0 {%k1}
396 ; AVX512-NEXT:    ret{{[l|q]}}
398 ; AVX512F-LABEL: test_mm512_mask_blend_epi64:
399 ; AVX512F:       # %bb.0: # %entry
400 ; AVX512F-NEXT:    movb $-86, %al
401 ; AVX512F-NEXT:    kmovw %eax, %k1
402 ; AVX512F-NEXT:    vpblendmq %zmm0, %zmm1, %zmm0 {%k1}
403 ; AVX512F-NEXT:    ret{{[l|q]}}
404 entry:
405   %0 = shufflevector <8 x i64> %A, <8 x i64> %W, <8 x i32>  <i32 8, i32 1, i32 10, i32 3, i32 12, i32 5, i32 14, i32 7>
406   ret <8 x i64> %0
409 define <16 x float> @test_mm512_mask_blend_ps(<16 x float> %A, <16 x float> %W){
410 ; AVX512-LABEL: test_mm512_mask_blend_ps:
411 ; AVX512:       # %bb.0: # %entry
412 ; AVX512-NEXT:    movw $-21846, %ax # imm = 0xAAAA
413 ; AVX512-NEXT:    kmovd %eax, %k1
414 ; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1}
415 ; AVX512-NEXT:    ret{{[l|q]}}
417 ; AVX512F-LABEL: test_mm512_mask_blend_ps:
418 ; AVX512F:       # %bb.0: # %entry
419 ; AVX512F-NEXT:    movw $-21846, %ax # imm = 0xAAAA
420 ; AVX512F-NEXT:    kmovw %eax, %k1
421 ; AVX512F-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1}
422 ; AVX512F-NEXT:    ret{{[l|q]}}
423 entry:
424   %0 = shufflevector <16 x float> %A, <16 x float> %W, <16 x i32>  <i32 16, i32 1, i32 18, i32 3, i32 20, i32 5, i32 22, i32 7, i32 24, i32 9, i32 26, i32 11, i32 28, i32 13, i32 30, i32 15>
425   ret <16 x float> %0
428 define <8 x double> @test_mm512_mask_blend_pd(<8 x double> %A, <8 x double> %W){
429 ; AVX512-LABEL: test_mm512_mask_blend_pd:
430 ; AVX512:       # %bb.0: # %entry
431 ; AVX512-NEXT:    movb $-88, %al
432 ; AVX512-NEXT:    kmovd %eax, %k1
433 ; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
434 ; AVX512-NEXT:    ret{{[l|q]}}
436 ; AVX512F-LABEL: test_mm512_mask_blend_pd:
437 ; AVX512F:       # %bb.0: # %entry
438 ; AVX512F-NEXT:    movb $-88, %al
439 ; AVX512F-NEXT:    kmovw %eax, %k1
440 ; AVX512F-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
441 ; AVX512F-NEXT:    ret{{[l|q]}}
442 entry:
443   %0 = shufflevector <8 x double> %A, <8 x double> %W, <8 x i32>  <i32 8, i32 9, i32 10, i32 3, i32 12, i32 5, i32 14, i32 7>
444   ret <8 x double> %0
448 define <32 x i8> @test_mm256_mask_blend_epi8(<32 x i8> %A, <32 x i8> %W){
449 ; AVX512-LABEL: test_mm256_mask_blend_epi8:
450 ; AVX512:       # %bb.0: # %entry
451 ; AVX512-NEXT:    movl $-1431655766, %eax # imm = 0xAAAAAAAA
452 ; AVX512-NEXT:    kmovd %eax, %k1
453 ; AVX512-NEXT:    vpblendmb %ymm0, %ymm1, %ymm0 {%k1}
454 ; AVX512-NEXT:    ret{{[l|q]}}
456 ; AVX512F-LABEL: test_mm256_mask_blend_epi8:
457 ; AVX512F:       # %bb.0: # %entry
458 ; AVX512F-NEXT:    vpbroadcastw {{.*#+}} ymm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
459 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
460 ; AVX512F-NEXT:    ret{{[l|q]}}
461 entry:
462   %0 = shufflevector <32 x i8> %A, <32 x i8> %W, <32 x i32>  <i32 32, i32 1, i32 34, i32 3, i32 36, i32 5, i32 38, i32 7, i32 40, i32 9, i32 42, i32 11, i32 44, i32 13, i32 46, i32 15, i32 48, i32 17, i32 50, i32 19, i32 52, i32 21, i32 54, i32 23, i32 56, i32 25, i32 58, i32 27, i32 60, i32 29, i32 62, i32 31>
463   ret <32 x i8> %0
466 define <16 x i8> @test_mm_mask_blend_epi8(<16 x i8> %A, <16 x i8> %W){
467 ; AVX512-LABEL: test_mm_mask_blend_epi8:
468 ; AVX512:       # %bb.0: # %entry
469 ; AVX512-NEXT:    movw $-21846, %ax # imm = 0xAAAA
470 ; AVX512-NEXT:    kmovd %eax, %k1
471 ; AVX512-NEXT:    vpblendmb %xmm0, %xmm1, %xmm0 {%k1}
472 ; AVX512-NEXT:    ret{{[l|q]}}
474 ; AVX512F-LABEL: test_mm_mask_blend_epi8:
475 ; AVX512F:       # %bb.0: # %entry
476 ; AVX512F-NEXT:    vpbroadcastw {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
477 ; AVX512F-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
478 ; AVX512F-NEXT:    ret{{[l|q]}}
479 entry:
480   %0 = shufflevector <16 x i8> %A, <16 x i8> %W, <16 x i32>  <i32 16, i32 1, i32 18, i32 3, i32 20, i32 5, i32 22, i32 7, i32 24, i32 9, i32 26, i32 11, i32 28, i32 13, i32 30, i32 15>
481   ret <16 x i8> %0
484 ; PR34370
485 define <8 x float> @test_masked_permps_v8f32(ptr %vp, <8 x float> %vec2) {
486 ; X86-AVX512-LABEL: test_masked_permps_v8f32:
487 ; X86-AVX512:       # %bb.0:
488 ; X86-AVX512-NEXT:    movl {{[0-9]+}}(%esp), %eax
489 ; X86-AVX512-NEXT:    vmovaps (%eax), %ymm2
490 ; X86-AVX512-NEXT:    vmovaps {{.*#+}} ymm1 = [7,6,3,11,7,6,14,15]
491 ; X86-AVX512-NEXT:    vpermi2ps %ymm0, %ymm2, %ymm1
492 ; X86-AVX512-NEXT:    vmovaps %ymm1, %ymm0
493 ; X86-AVX512-NEXT:    retl
495 ; X64-AVX512-LABEL: test_masked_permps_v8f32:
496 ; X64-AVX512:       # %bb.0:
497 ; X64-AVX512-NEXT:    vmovaps (%rdi), %ymm2
498 ; X64-AVX512-NEXT:    vmovaps {{.*#+}} ymm1 = [7,6,3,11,7,6,14,15]
499 ; X64-AVX512-NEXT:    vpermi2ps %ymm0, %ymm2, %ymm1
500 ; X64-AVX512-NEXT:    vmovaps %ymm1, %ymm0
501 ; X64-AVX512-NEXT:    retq
503 ; X86-AVX512F-LABEL: test_masked_permps_v8f32:
504 ; X86-AVX512F:       # %bb.0:
505 ; X86-AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
506 ; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax
507 ; X86-AVX512F-NEXT:    vmovaps (%eax), %ymm1
508 ; X86-AVX512F-NEXT:    vmovaps {{.*#+}} ymm2 = [7,6,3,19,7,6,22,23]
509 ; X86-AVX512F-NEXT:    vpermt2ps %zmm0, %zmm2, %zmm1
510 ; X86-AVX512F-NEXT:    vmovaps %ymm1, %ymm0
511 ; X86-AVX512F-NEXT:    retl
513 ; X64-AVX512F-LABEL: test_masked_permps_v8f32:
514 ; X64-AVX512F:       # %bb.0:
515 ; X64-AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
516 ; X64-AVX512F-NEXT:    vmovaps (%rdi), %ymm1
517 ; X64-AVX512F-NEXT:    vmovaps {{.*#+}} ymm2 = [7,6,3,19,7,6,22,23]
518 ; X64-AVX512F-NEXT:    vpermt2ps %zmm0, %zmm2, %zmm1
519 ; X64-AVX512F-NEXT:    vmovaps %ymm1, %ymm0
520 ; X64-AVX512F-NEXT:    retq
521   %vec = load <8 x float>, ptr %vp
522   %shuf = shufflevector <8 x float> %vec, <8 x float> undef, <8 x i32> <i32 7, i32 6, i32 3, i32 0, i32 7, i32 6, i32 3, i32 0>
523   %res = select <8 x i1> <i1 1, i1 1, i1 1, i1 0, i1 1, i1 1, i1 0, i1 0>, <8 x float> %shuf, <8 x float> %vec2
524   ret <8 x float> %res
527 define <16 x float> @test_masked_permps_v16f32(ptr %vp, <16 x float> %vec2) {
528 ; X86-AVX512-LABEL: test_masked_permps_v16f32:
529 ; X86-AVX512:       # %bb.0:
530 ; X86-AVX512-NEXT:    movl {{[0-9]+}}(%esp), %eax
531 ; X86-AVX512-NEXT:    vmovaps (%eax), %zmm2
532 ; X86-AVX512-NEXT:    vmovaps {{.*#+}} zmm1 = [15,13,11,19,14,12,22,23,7,6,3,27,7,29,3,31]
533 ; X86-AVX512-NEXT:    vpermi2ps %zmm0, %zmm2, %zmm1
534 ; X86-AVX512-NEXT:    vmovaps %zmm1, %zmm0
535 ; X86-AVX512-NEXT:    retl
537 ; X64-AVX512-LABEL: test_masked_permps_v16f32:
538 ; X64-AVX512:       # %bb.0:
539 ; X64-AVX512-NEXT:    vmovaps (%rdi), %zmm2
540 ; X64-AVX512-NEXT:    vmovaps {{.*#+}} zmm1 = [15,13,11,19,14,12,22,23,7,6,3,27,7,29,3,31]
541 ; X64-AVX512-NEXT:    vpermi2ps %zmm0, %zmm2, %zmm1
542 ; X64-AVX512-NEXT:    vmovaps %zmm1, %zmm0
543 ; X64-AVX512-NEXT:    retq
545 ; X86-AVX512F-LABEL: test_masked_permps_v16f32:
546 ; X86-AVX512F:       # %bb.0:
547 ; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax
548 ; X86-AVX512F-NEXT:    vmovaps (%eax), %zmm2
549 ; X86-AVX512F-NEXT:    vmovaps {{.*#+}} zmm1 = [15,13,11,19,14,12,22,23,7,6,3,27,7,29,3,31]
550 ; X86-AVX512F-NEXT:    vpermi2ps %zmm0, %zmm2, %zmm1
551 ; X86-AVX512F-NEXT:    vmovaps %zmm1, %zmm0
552 ; X86-AVX512F-NEXT:    retl
554 ; X64-AVX512F-LABEL: test_masked_permps_v16f32:
555 ; X64-AVX512F:       # %bb.0:
556 ; X64-AVX512F-NEXT:    vmovaps (%rdi), %zmm2
557 ; X64-AVX512F-NEXT:    vmovaps {{.*#+}} zmm1 = [15,13,11,19,14,12,22,23,7,6,3,27,7,29,3,31]
558 ; X64-AVX512F-NEXT:    vpermi2ps %zmm0, %zmm2, %zmm1
559 ; X64-AVX512F-NEXT:    vmovaps %zmm1, %zmm0
560 ; X64-AVX512F-NEXT:    retq
561   %vec = load <16 x float>, ptr %vp
562   %shuf = shufflevector <16 x float> %vec, <16 x float> undef, <16 x i32> <i32 15, i32 13, i32 11, i32 9, i32 14, i32 12, i32 10, i32 8, i32 7, i32 6, i32 3, i32 0, i32 7, i32 6, i32 3, i32 0>
563   %res = select <16 x i1> <i1 1, i1 1, i1 1, i1 0, i1 1, i1 1, i1 0, i1 0, i1 1, i1 1, i1 1, i1 0, i1 1, i1 0, i1 1, i1 0>, <16 x float> %shuf, <16 x float> %vec2
564   ret <16 x float> %res
567 define void @test_demandedelts_pshufb_v32i8_v16i8(ptr %src, ptr %dst) {
568 ; X86-AVX512-SLOW-LABEL: test_demandedelts_pshufb_v32i8_v16i8:
569 ; X86-AVX512-SLOW:       # %bb.0:
570 ; X86-AVX512-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %eax
571 ; X86-AVX512-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %ecx
572 ; X86-AVX512-SLOW-NEXT:    vpbroadcastd 44(%ecx), %xmm0
573 ; X86-AVX512-SLOW-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
574 ; X86-AVX512-SLOW-NEXT:    vmovdqa %ymm0, 672(%eax)
575 ; X86-AVX512-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = mem[1,0,2,3]
576 ; X86-AVX512-SLOW-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
577 ; X86-AVX512-SLOW-NEXT:    vmovdqa %ymm0, 832(%eax)
578 ; X86-AVX512-SLOW-NEXT:    vzeroupper
579 ; X86-AVX512-SLOW-NEXT:    retl
581 ; X64-AVX512-SLOW-LABEL: test_demandedelts_pshufb_v32i8_v16i8:
582 ; X64-AVX512-SLOW:       # %bb.0:
583 ; X64-AVX512-SLOW-NEXT:    vpbroadcastd 44(%rdi), %xmm0
584 ; X64-AVX512-SLOW-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
585 ; X64-AVX512-SLOW-NEXT:    vmovdqa %ymm0, 672(%rsi)
586 ; X64-AVX512-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = mem[1,0,2,3]
587 ; X64-AVX512-SLOW-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
588 ; X64-AVX512-SLOW-NEXT:    vmovdqa %ymm0, 832(%rsi)
589 ; X64-AVX512-SLOW-NEXT:    vzeroupper
590 ; X64-AVX512-SLOW-NEXT:    retq
592 ; X86-AVX512-FAST-LABEL: test_demandedelts_pshufb_v32i8_v16i8:
593 ; X86-AVX512-FAST:       # %bb.0:
594 ; X86-AVX512-FAST-NEXT:    movl {{[0-9]+}}(%esp), %eax
595 ; X86-AVX512-FAST-NEXT:    movl {{[0-9]+}}(%esp), %ecx
596 ; X86-AVX512-FAST-NEXT:    vpbroadcastd 44(%ecx), %xmm0
597 ; X86-AVX512-FAST-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
598 ; X86-AVX512-FAST-NEXT:    vmovdqa %ymm0, 672(%eax)
599 ; X86-AVX512-FAST-NEXT:    vmovdqa 208(%ecx), %xmm0
600 ; X86-AVX512-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,6,7,0,1,2,3],zero,zero,zero,zero,zero,zero,zero,zero
601 ; X86-AVX512-FAST-NEXT:    vmovdqa %ymm0, 832(%eax)
602 ; X86-AVX512-FAST-NEXT:    vzeroupper
603 ; X86-AVX512-FAST-NEXT:    retl
605 ; X64-AVX512-FAST-LABEL: test_demandedelts_pshufb_v32i8_v16i8:
606 ; X64-AVX512-FAST:       # %bb.0:
607 ; X64-AVX512-FAST-NEXT:    vpbroadcastd 44(%rdi), %xmm0
608 ; X64-AVX512-FAST-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
609 ; X64-AVX512-FAST-NEXT:    vmovdqa %ymm0, 672(%rsi)
610 ; X64-AVX512-FAST-NEXT:    vmovdqa 208(%rdi), %xmm0
611 ; X64-AVX512-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,6,7,0,1,2,3],zero,zero,zero,zero,zero,zero,zero,zero
612 ; X64-AVX512-FAST-NEXT:    vmovdqa %ymm0, 832(%rsi)
613 ; X64-AVX512-FAST-NEXT:    vzeroupper
614 ; X64-AVX512-FAST-NEXT:    retq
616 ; X86-AVX512F-LABEL: test_demandedelts_pshufb_v32i8_v16i8:
617 ; X86-AVX512F:       # %bb.0:
618 ; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax
619 ; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %ecx
620 ; X86-AVX512F-NEXT:    vpbroadcastd 44(%ecx), %xmm0
621 ; X86-AVX512F-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
622 ; X86-AVX512F-NEXT:    vmovdqa %ymm0, 672(%eax)
623 ; X86-AVX512F-NEXT:    vpshufd {{.*#+}} xmm0 = mem[1,0,2,3]
624 ; X86-AVX512F-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
625 ; X86-AVX512F-NEXT:    vmovdqa %ymm0, 832(%eax)
626 ; X86-AVX512F-NEXT:    vzeroupper
627 ; X86-AVX512F-NEXT:    retl
629 ; X64-AVX512F-LABEL: test_demandedelts_pshufb_v32i8_v16i8:
630 ; X64-AVX512F:       # %bb.0:
631 ; X64-AVX512F-NEXT:    vpbroadcastd 44(%rdi), %xmm0
632 ; X64-AVX512F-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
633 ; X64-AVX512F-NEXT:    vmovdqa %ymm0, 672(%rsi)
634 ; X64-AVX512F-NEXT:    vpshufd {{.*#+}} xmm0 = mem[1,0,2,3]
635 ; X64-AVX512F-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
636 ; X64-AVX512F-NEXT:    vmovdqa %ymm0, 832(%rsi)
637 ; X64-AVX512F-NEXT:    vzeroupper
638 ; X64-AVX512F-NEXT:    retq
639   %t87 = load <16 x i32>, ptr %src, align 64
640   %t88 = extractelement <16 x i32> %t87, i64 11
641   %t89 = insertelement <8 x i32> <i32 undef, i32 undef, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>, i32 %t88, i64 0
642   %t90 = insertelement <8 x i32> %t89, i32 %t88, i64 1
643   %ptridx49.i = getelementptr inbounds <8 x i32>, ptr %dst, i64 21
644   store <8 x i32> %t90, ptr %ptridx49.i, align 32
645   %ptridx56.i = getelementptr inbounds <2 x i32>, ptr %src, i64 24
646   %t09 = load <16 x i32>, ptr %ptridx56.i, align 64
647   %t10 = extractelement <16 x i32> %t09, i64 5
648   %t11 = insertelement <8 x i32> <i32 undef, i32 undef, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>, i32 %t10, i64 0
649   %t12 = extractelement <16 x i32> %t09, i64 4
650   %t13 = insertelement <8 x i32> %t11, i32 %t12, i64 1
651   %ptridx64.i = getelementptr inbounds <8 x i32>, ptr %dst, i64 26
652   store <8 x i32> %t13, ptr %ptridx64.i, align 32
653   ret void
656 define <32 x float> @PR47534(<8 x float> %tmp) {
657 ; CHECK-LABEL: PR47534:
658 ; CHECK:       # %bb.0:
659 ; CHECK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
660 ; CHECK-NEXT:    vxorps %xmm2, %xmm2, %xmm2
661 ; CHECK-NEXT:    vbroadcasti64x4 {{.*#+}} zmm1 = [7,25,26,27,7,29,30,31,7,25,26,27,7,29,30,31]
662 ; CHECK-NEXT:    # zmm1 = mem[0,1,2,3,0,1,2,3]
663 ; CHECK-NEXT:    vpermi2ps %zmm2, %zmm0, %zmm1
664 ; CHECK-NEXT:    ret{{[l|q]}}
665   %tmp1 = shufflevector <8 x float> %tmp, <8 x float> undef, <32 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, 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>
666   %tmp2 = shufflevector <32 x float> <float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float undef, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>, <32 x float> undef, <32 x i32> <i32 39, 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 undef, i32 undef, i32 undef, i32 undef, i32 29, i32 30, i32 31>
667   %tmp18 = shufflevector <32 x float> %tmp2, <32 x float> %tmp1, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 39, 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 29, i32 30, i32 31>
668   ret <32 x float> %tmp18
671 %union1= type { <16 x float> }
672 @src1 = external dso_local local_unnamed_addr global %union1, align 64
674 define void @PR43170(ptr %a0) {
675 ; X86-AVX512-LABEL: PR43170:
676 ; X86-AVX512:       # %bb.0: # %entry
677 ; X86-AVX512-NEXT:    movl {{[0-9]+}}(%esp), %eax
678 ; X86-AVX512-NEXT:    vmovaps src1, %ymm0
679 ; X86-AVX512-NEXT:    vmovaps %zmm0, (%eax)
680 ; X86-AVX512-NEXT:    vzeroupper
681 ; X86-AVX512-NEXT:    retl
683 ; X64-AVX512-LABEL: PR43170:
684 ; X64-AVX512:       # %bb.0: # %entry
685 ; X64-AVX512-NEXT:    vmovaps src1(%rip), %ymm0
686 ; X64-AVX512-NEXT:    vmovaps %zmm0, (%rdi)
687 ; X64-AVX512-NEXT:    vzeroupper
688 ; X64-AVX512-NEXT:    retq
690 ; X86-AVX512F-LABEL: PR43170:
691 ; X86-AVX512F:       # %bb.0: # %entry
692 ; X86-AVX512F-NEXT:    movl {{[0-9]+}}(%esp), %eax
693 ; X86-AVX512F-NEXT:    vmovaps src1, %ymm0
694 ; X86-AVX512F-NEXT:    vmovaps %zmm0, (%eax)
695 ; X86-AVX512F-NEXT:    vzeroupper
696 ; X86-AVX512F-NEXT:    retl
698 ; X64-AVX512F-LABEL: PR43170:
699 ; X64-AVX512F:       # %bb.0: # %entry
700 ; X64-AVX512F-NEXT:    vmovaps src1(%rip), %ymm0
701 ; X64-AVX512F-NEXT:    vmovaps %zmm0, (%rdi)
702 ; X64-AVX512F-NEXT:    vzeroupper
703 ; X64-AVX512F-NEXT:    retq
704 entry:
705   %0 = load <8 x float>, ptr @src1, align 64
706   %1 = shufflevector <8 x float> %0, <8 x float> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
707   store <16 x float> %1, ptr %a0, align 64
708   ret void