[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / vector-shuffle-avx512.ll
blobc669562dcac2dc679e0ecd318b2734a733b1e2e9
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu -mcpu=skx | FileCheck %s --check-prefixes=CHECK,SKX,X64,SKX64
3 ; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu -mcpu=knl | FileCheck %s --check-prefixes=CHECK,KNL,X64,KNL64
4 ; RUN: llc < %s -mtriple=i386-pc-linux-gnu -mcpu=skx | FileCheck %s --check-prefixes=CHECK,SKX,X86,SKX32
5 ; RUN: llc < %s -mtriple=i386-pc-linux-gnu -mcpu=knl | FileCheck %s --check-prefixes=CHECK,KNL,X86,KNL32
7 ;expand 128 -> 256 include <4 x float> <2 x double>
8 define <8 x float> @expand(<4 x float> %a) {
9 ; SKX-LABEL: expand:
10 ; SKX:       # %bb.0:
11 ; SKX-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
12 ; SKX-NEXT:    movb $5, %al
13 ; SKX-NEXT:    kmovd %eax, %k1
14 ; SKX-NEXT:    vexpandps %ymm0, %ymm0 {%k1} {z}
15 ; SKX-NEXT:    ret{{[l|q]}}
17 ; KNL-LABEL: expand:
18 ; KNL:       # %bb.0:
19 ; KNL-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,1,1,3]
20 ; KNL-NEXT:    vxorps %xmm1, %xmm1, %xmm1
21 ; KNL-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3,4,5,6,7]
22 ; KNL-NEXT:    ret{{[l|q]}}
23    %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>
24    ret <8 x float> %res
27 define <8 x float> @expand1(<4 x float> %a ) {
28 ; SKX-LABEL: expand1:
29 ; SKX:       # %bb.0:
30 ; SKX-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
31 ; SKX-NEXT:    movb $-86, %al
32 ; SKX-NEXT:    kmovd %eax, %k1
33 ; SKX-NEXT:    vexpandps %ymm0, %ymm0 {%k1} {z}
34 ; SKX-NEXT:    ret{{[l|q]}}
36 ; KNL-LABEL: expand1:
37 ; KNL:       # %bb.0:
38 ; KNL-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
39 ; KNL-NEXT:    vmovaps {{.*#+}} ymm1 = <u,0,u,1,u,2,u,3>
40 ; KNL-NEXT:    vpermps %ymm0, %ymm1, %ymm0
41 ; KNL-NEXT:    vxorps %xmm1, %xmm1, %xmm1
42 ; KNL-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3],ymm1[4],ymm0[5],ymm1[6],ymm0[7]
43 ; KNL-NEXT:    ret{{[l|q]}}
44    %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>
45    ret <8 x float> %res
48 ;Expand 128 -> 256 test <2 x double> -> <4 x double>
49 define <4 x double> @expand2(<2 x double> %a) {
50 ; CHECK-LABEL: expand2:
51 ; CHECK:       # %bb.0:
52 ; CHECK-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
53 ; CHECK-NEXT:    vperm2f128 {{.*#+}} ymm1 = zero,zero,ymm0[0,1]
54 ; CHECK-NEXT:    vmovaps %xmm0, %xmm0
55 ; CHECK-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5],ymm1[6,7]
56 ; CHECK-NEXT:    ret{{[l|q]}}
57    %res = shufflevector <2 x double> %a, <2 x double> zeroinitializer, <4 x i32> <i32 0, i32 2, i32 2, i32 1>
58    ret <4 x double> %res
61 ;expand 128 -> 256 include case <4 x i32> <8 x i32>
62 define <8 x i32> @expand3(<4 x i32> %a ) {
63 ; SKX-LABEL: expand3:
64 ; SKX:       # %bb.0:
65 ; SKX-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
66 ; SKX-NEXT:    movb $-127, %al
67 ; SKX-NEXT:    kmovd %eax, %k1
68 ; SKX-NEXT:    vpexpandd %ymm0, %ymm0 {%k1} {z}
69 ; SKX-NEXT:    ret{{[l|q]}}
71 ; KNL-LABEL: expand3:
72 ; KNL:       # %bb.0:
73 ; KNL-NEXT:    vbroadcastsd %xmm0, %ymm0
74 ; KNL-NEXT:    vxorps %xmm1, %xmm1, %xmm1
75 ; KNL-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6],ymm0[7]
76 ; KNL-NEXT:    ret{{[l|q]}}
77    %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>
78    ret <8 x i32> %res
81 ;expand 128 -> 256 include case <2 x i64> <4 x i64>
82 define <4 x i64> @expand4(<2 x i64> %a ) {
83 ; SKX-LABEL: expand4:
84 ; SKX:       # %bb.0:
85 ; SKX-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
86 ; SKX-NEXT:    movb $9, %al
87 ; SKX-NEXT:    kmovd %eax, %k1
88 ; SKX-NEXT:    vpexpandq %ymm0, %ymm0 {%k1} {z}
89 ; SKX-NEXT:    ret{{[l|q]}}
91 ; KNL-LABEL: expand4:
92 ; KNL:       # %bb.0:
93 ; KNL-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
94 ; KNL-NEXT:    vperm2f128 {{.*#+}} ymm1 = zero,zero,ymm0[0,1]
95 ; KNL-NEXT:    vmovaps %xmm0, %xmm0
96 ; KNL-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1],ymm1[2,3],ymm0[4,5],ymm1[6,7]
97 ; KNL-NEXT:    ret{{[l|q]}}
98    %res = shufflevector <2 x i64> zeroinitializer, <2 x i64> %a, <4 x i32> <i32 2, i32 0, i32 0, i32 3>
99    ret <4 x i64> %res
102 ;Negative test for 128-> 256
103 define <8 x float> @expand5(<4 x float> %a ) {
104 ; SKX-LABEL: expand5:
105 ; SKX:       # %bb.0:
106 ; SKX-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
107 ; SKX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
108 ; SKX-NEXT:    vmovaps {{.*#+}} ymm2 = [8,0,10,0,12,0,14,0]
109 ; SKX-NEXT:    vpermt2ps %ymm1, %ymm2, %ymm0
110 ; SKX-NEXT:    ret{{[l|q]}}
112 ; KNL-LABEL: expand5:
113 ; KNL:       # %bb.0:
114 ; KNL-NEXT:    vbroadcastss %xmm0, %ymm0
115 ; KNL-NEXT:    vxorps %xmm1, %xmm1, %xmm1
116 ; KNL-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3],ymm1[4],ymm0[5],ymm1[6],ymm0[7]
117 ; KNL-NEXT:    ret{{[l|q]}}
118    %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>
119    ret <8 x float> %res
122 ;expand 256 -> 512 include <8 x float> <16 x float>
123 define <8 x float> @expand6(<4 x float> %a ) {
124 ; CHECK-LABEL: expand6:
125 ; CHECK:       # %bb.0:
126 ; CHECK-NEXT:    vxorps %xmm1, %xmm1, %xmm1
127 ; CHECK-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
128 ; CHECK-NEXT:    ret{{[l|q]}}
129    %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>
130    ret <8 x float> %res
133 define <16 x float> @expand7(<8 x float> %a) {
134 ; SKX-LABEL: expand7:
135 ; SKX:       # %bb.0:
136 ; SKX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
137 ; SKX-NEXT:    movw $1285, %ax # imm = 0x505
138 ; SKX-NEXT:    kmovd %eax, %k1
139 ; SKX-NEXT:    vexpandps %zmm0, %zmm0 {%k1} {z}
140 ; SKX-NEXT:    ret{{[l|q]}}
142 ; KNL-LABEL: expand7:
143 ; KNL:       # %bb.0:
144 ; KNL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
145 ; KNL-NEXT:    movw $1285, %ax # imm = 0x505
146 ; KNL-NEXT:    kmovw %eax, %k1
147 ; KNL-NEXT:    vexpandps %zmm0, %zmm0 {%k1} {z}
148 ; KNL-NEXT:    ret{{[l|q]}}
149    %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>
150    ret <16 x float> %res
153 define <16 x float> @expand8(<8 x float> %a ) {
154 ; SKX-LABEL: expand8:
155 ; SKX:       # %bb.0:
156 ; SKX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
157 ; SKX-NEXT:    movw $-21846, %ax # imm = 0xAAAA
158 ; SKX-NEXT:    kmovd %eax, %k1
159 ; SKX-NEXT:    vexpandps %zmm0, %zmm0 {%k1} {z}
160 ; SKX-NEXT:    ret{{[l|q]}}
162 ; KNL-LABEL: expand8:
163 ; KNL:       # %bb.0:
164 ; KNL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
165 ; KNL-NEXT:    movw $-21846, %ax # imm = 0xAAAA
166 ; KNL-NEXT:    kmovw %eax, %k1
167 ; KNL-NEXT:    vexpandps %zmm0, %zmm0 {%k1} {z}
168 ; KNL-NEXT:    ret{{[l|q]}}
169    %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>
170    ret <16 x float> %res
173 ;expand 256 -> 512 include <4 x double> <8 x double>
174 define <8 x double> @expand9(<4 x double> %a) {
175 ; SKX-LABEL: expand9:
176 ; SKX:       # %bb.0:
177 ; SKX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
178 ; SKX-NEXT:    movb $-127, %al
179 ; SKX-NEXT:    kmovd %eax, %k1
180 ; SKX-NEXT:    vexpandpd %zmm0, %zmm0 {%k1} {z}
181 ; SKX-NEXT:    ret{{[l|q]}}
183 ; KNL-LABEL: expand9:
184 ; KNL:       # %bb.0:
185 ; KNL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
186 ; KNL-NEXT:    movb $-127, %al
187 ; KNL-NEXT:    kmovw %eax, %k1
188 ; KNL-NEXT:    vexpandpd %zmm0, %zmm0 {%k1} {z}
189 ; KNL-NEXT:    ret{{[l|q]}}
190    %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>
191    ret <8 x double> %res
194 define <16 x i32> @expand10(<8 x i32> %a ) {
195 ; SKX-LABEL: expand10:
196 ; SKX:       # %bb.0:
197 ; SKX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
198 ; SKX-NEXT:    movw $-21846, %ax # imm = 0xAAAA
199 ; SKX-NEXT:    kmovd %eax, %k1
200 ; SKX-NEXT:    vpexpandd %zmm0, %zmm0 {%k1} {z}
201 ; SKX-NEXT:    ret{{[l|q]}}
203 ; KNL-LABEL: expand10:
204 ; KNL:       # %bb.0:
205 ; KNL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
206 ; KNL-NEXT:    movw $-21846, %ax # imm = 0xAAAA
207 ; KNL-NEXT:    kmovw %eax, %k1
208 ; KNL-NEXT:    vpexpandd %zmm0, %zmm0 {%k1} {z}
209 ; KNL-NEXT:    ret{{[l|q]}}
210    %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>
211    ret <16 x i32> %res
214 define <8 x i64> @expand11(<4 x i64> %a) {
215 ; SKX-LABEL: expand11:
216 ; SKX:       # %bb.0:
217 ; SKX-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
218 ; SKX-NEXT:    movb $-127, %al
219 ; SKX-NEXT:    kmovd %eax, %k1
220 ; SKX-NEXT:    vpexpandq %zmm0, %zmm0 {%k1} {z}
221 ; SKX-NEXT:    ret{{[l|q]}}
223 ; KNL-LABEL: expand11:
224 ; KNL:       # %bb.0:
225 ; KNL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
226 ; KNL-NEXT:    movb $-127, %al
227 ; KNL-NEXT:    kmovw %eax, %k1
228 ; KNL-NEXT:    vpexpandq %zmm0, %zmm0 {%k1} {z}
229 ; KNL-NEXT:    ret{{[l|q]}}
230    %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>
231    ret <8 x i64> %res
234 ;Negative test for 256-> 512
235 define <16 x float> @expand12(<8 x float> %a) {
236 ; CHECK-LABEL: expand12:
237 ; CHECK:       # %bb.0:
238 ; CHECK-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
239 ; CHECK-NEXT:    vmovaps {{.*#+}} zmm2 = [0,16,2,16,4,16,6,16,0,16,1,16,2,16,3,16]
240 ; CHECK-NEXT:    vxorps %xmm1, %xmm1, %xmm1
241 ; CHECK-NEXT:    vpermt2ps %zmm0, %zmm2, %zmm1
242 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
243 ; CHECK-NEXT:    ret{{[l|q]}}
244    %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>
245    ret <16 x float> %res
248 define <16 x float> @expand13(<8 x float> %a ) {
249 ; CHECK-LABEL: expand13:
250 ; CHECK:       # %bb.0:
251 ; CHECK-NEXT:    vxorps %xmm1, %xmm1, %xmm1
252 ; CHECK-NEXT:    vinsertf64x4 $1, %ymm0, %zmm1, %zmm0
253 ; CHECK-NEXT:    ret{{[l|q]}}
254    %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>
255    ret <16 x float> %res
258 ; The function checks for a case where the vector is mixed values vector ,and the mask points on zero elements from this vector.
260 define <8 x float> @expand14(<4 x float> %a) {
261 ; SKX-LABEL: expand14:
262 ; SKX:       # %bb.0:
263 ; SKX-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
264 ; SKX-NEXT:    movb $20, %al
265 ; SKX-NEXT:    kmovd %eax, %k1
266 ; SKX-NEXT:    vexpandps %ymm0, %ymm0 {%k1} {z}
267 ; SKX-NEXT:    ret{{[l|q]}}
269 ; KNL-LABEL: expand14:
270 ; KNL:       # %bb.0:
271 ; KNL-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,1,1,3]
272 ; KNL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,0,1,3]
273 ; KNL-NEXT:    vxorps %xmm1, %xmm1, %xmm1
274 ; KNL-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1],ymm0[2],ymm1[3],ymm0[4],ymm1[5,6,7]
275 ; KNL-NEXT:    ret{{[l|q]}}
276    %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>
277    %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>
278    ret <8 x float> %res
281 ;Negative test.
282 define <8 x float> @expand15(<4 x float> %a) {
283 ; SKX-LABEL: expand15:
284 ; SKX:       # %bb.0:
285 ; SKX-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
286 ; SKX-NEXT:    vmovaps {{.*#+}} ymm1 = <0,1,0,1,1,3,u,u>
287 ; SKX-NEXT:    vpermps %ymm0, %ymm1, %ymm0
288 ; SKX-NEXT:    vblendps {{.*#+}} ymm0 = mem[0,1],ymm0[2],mem[3],ymm0[4],mem[5,6,7]
289 ; SKX-NEXT:    ret{{[l|q]}}
291 ; KNL-LABEL: expand15:
292 ; KNL:       # %bb.0:
293 ; KNL-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,1,1,3]
294 ; KNL-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,0,1,3]
295 ; KNL-NEXT:    vblendps {{.*#+}} ymm0 = mem[0,1],ymm0[2],mem[3],ymm0[4],mem[5,6,7]
296 ; KNL-NEXT:    ret{{[l|q]}}
297    %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>
298    %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>
299    ret <8 x float> %res
303 ; Shuffle to blend test
305 define <64 x i8> @test_mm512_mask_blend_epi8(<64 x i8> %A, <64 x i8> %W){
306 ; SKX64-LABEL: test_mm512_mask_blend_epi8:
307 ; SKX64:       # %bb.0: # %entry
308 ; SKX64-NEXT:    movabsq $-6148914691236517206, %rax # imm = 0xAAAAAAAAAAAAAAAA
309 ; SKX64-NEXT:    kmovq %rax, %k1
310 ; SKX64-NEXT:    vpblendmb %zmm0, %zmm1, %zmm0 {%k1}
311 ; SKX64-NEXT:    retq
313 ; KNL-LABEL: test_mm512_mask_blend_epi8:
314 ; KNL:       # %bb.0: # %entry
315 ; KNL-NEXT:    vpbroadcastw {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
316 ; KNL-NEXT:    vextracti64x4 $1, %zmm1, %ymm3
317 ; KNL-NEXT:    vextracti64x4 $1, %zmm0, %ymm4
318 ; KNL-NEXT:    vpblendvb %ymm2, %ymm3, %ymm4, %ymm3
319 ; KNL-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
320 ; KNL-NEXT:    vinserti64x4 $1, %ymm3, %zmm0, %zmm0
321 ; KNL-NEXT:    ret{{[l|q]}}
323 ; SKX32-LABEL: test_mm512_mask_blend_epi8:
324 ; SKX32:       # %bb.0: # %entry
325 ; SKX32-NEXT:    movl $-1431655766, %eax # imm = 0xAAAAAAAA
326 ; SKX32-NEXT:    kmovd %eax, %k0
327 ; SKX32-NEXT:    kunpckdq %k0, %k0, %k1
328 ; SKX32-NEXT:    vpblendmb %zmm0, %zmm1, %zmm0 {%k1}
329 ; SKX32-NEXT:    retl
330 entry:
331   %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>
332   ret <64 x i8> %0
335 define <32 x i16> @test_mm512_mask_blend_epi16(<32 x i16> %A, <32 x i16> %W){
336 ; SKX-LABEL: test_mm512_mask_blend_epi16:
337 ; SKX:       # %bb.0: # %entry
338 ; SKX-NEXT:    movl $-1431655766, %eax # imm = 0xAAAAAAAA
339 ; SKX-NEXT:    kmovd %eax, %k1
340 ; SKX-NEXT:    vpblendmw %zmm0, %zmm1, %zmm0 {%k1}
341 ; SKX-NEXT:    ret{{[l|q]}}
343 ; KNL-LABEL: test_mm512_mask_blend_epi16:
344 ; KNL:       # %bb.0: # %entry
345 ; KNL-NEXT:    vextracti64x4 $1, %zmm0, %ymm2
346 ; KNL-NEXT:    vextracti64x4 $1, %zmm1, %ymm3
347 ; KNL-NEXT:    vpblendw {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2],ymm2[3],ymm3[4],ymm2[5],ymm3[6],ymm2[7],ymm3[8],ymm2[9],ymm3[10],ymm2[11],ymm3[12],ymm2[13],ymm3[14],ymm2[15]
348 ; KNL-NEXT:    vpblendw {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2],ymm0[3],ymm1[4],ymm0[5],ymm1[6],ymm0[7],ymm1[8],ymm0[9],ymm1[10],ymm0[11],ymm1[12],ymm0[13],ymm1[14],ymm0[15]
349 ; KNL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
350 ; KNL-NEXT:    ret{{[l|q]}}
351 entry:
352   %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>
353   ret <32 x i16> %0
356 define <16 x i32> @test_mm512_mask_blend_epi32(<16 x i32> %A, <16 x i32> %W){
357 ; SKX-LABEL: test_mm512_mask_blend_epi32:
358 ; SKX:       # %bb.0: # %entry
359 ; SKX-NEXT:    movw $-21846, %ax # imm = 0xAAAA
360 ; SKX-NEXT:    kmovd %eax, %k1
361 ; SKX-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
362 ; SKX-NEXT:    ret{{[l|q]}}
364 ; KNL-LABEL: test_mm512_mask_blend_epi32:
365 ; KNL:       # %bb.0: # %entry
366 ; KNL-NEXT:    movw $-21846, %ax # imm = 0xAAAA
367 ; KNL-NEXT:    kmovw %eax, %k1
368 ; KNL-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
369 ; KNL-NEXT:    ret{{[l|q]}}
370 entry:
371   %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>
372   ret <16 x i32> %0
375 define <8 x i64> @test_mm512_mask_blend_epi64(<8 x i64> %A, <8 x i64> %W){
376 ; SKX-LABEL: test_mm512_mask_blend_epi64:
377 ; SKX:       # %bb.0: # %entry
378 ; SKX-NEXT:    movb $-86, %al
379 ; SKX-NEXT:    kmovd %eax, %k1
380 ; SKX-NEXT:    vpblendmq %zmm0, %zmm1, %zmm0 {%k1}
381 ; SKX-NEXT:    ret{{[l|q]}}
383 ; KNL-LABEL: test_mm512_mask_blend_epi64:
384 ; KNL:       # %bb.0: # %entry
385 ; KNL-NEXT:    movb $-86, %al
386 ; KNL-NEXT:    kmovw %eax, %k1
387 ; KNL-NEXT:    vpblendmq %zmm0, %zmm1, %zmm0 {%k1}
388 ; KNL-NEXT:    ret{{[l|q]}}
389 entry:
390   %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>
391   ret <8 x i64> %0
394 define <16 x float> @test_mm512_mask_blend_ps(<16 x float> %A, <16 x float> %W){
395 ; SKX-LABEL: test_mm512_mask_blend_ps:
396 ; SKX:       # %bb.0: # %entry
397 ; SKX-NEXT:    movw $-21846, %ax # imm = 0xAAAA
398 ; SKX-NEXT:    kmovd %eax, %k1
399 ; SKX-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1}
400 ; SKX-NEXT:    ret{{[l|q]}}
402 ; KNL-LABEL: test_mm512_mask_blend_ps:
403 ; KNL:       # %bb.0: # %entry
404 ; KNL-NEXT:    movw $-21846, %ax # imm = 0xAAAA
405 ; KNL-NEXT:    kmovw %eax, %k1
406 ; KNL-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1}
407 ; KNL-NEXT:    ret{{[l|q]}}
408 entry:
409   %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>
410   ret <16 x float> %0
413 define <8 x double> @test_mm512_mask_blend_pd(<8 x double> %A, <8 x double> %W){
414 ; SKX-LABEL: test_mm512_mask_blend_pd:
415 ; SKX:       # %bb.0: # %entry
416 ; SKX-NEXT:    movb $-88, %al
417 ; SKX-NEXT:    kmovd %eax, %k1
418 ; SKX-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
419 ; SKX-NEXT:    ret{{[l|q]}}
421 ; KNL-LABEL: test_mm512_mask_blend_pd:
422 ; KNL:       # %bb.0: # %entry
423 ; KNL-NEXT:    movb $-88, %al
424 ; KNL-NEXT:    kmovw %eax, %k1
425 ; KNL-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
426 ; KNL-NEXT:    ret{{[l|q]}}
427 entry:
428   %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>
429   ret <8 x double> %0
433 define <32 x i8> @test_mm256_mask_blend_epi8(<32 x i8> %A, <32 x i8> %W){
434 ; SKX-LABEL: test_mm256_mask_blend_epi8:
435 ; SKX:       # %bb.0: # %entry
436 ; SKX-NEXT:    movl $-1431655766, %eax # imm = 0xAAAAAAAA
437 ; SKX-NEXT:    kmovd %eax, %k1
438 ; SKX-NEXT:    vpblendmb %ymm0, %ymm1, %ymm0 {%k1}
439 ; SKX-NEXT:    ret{{[l|q]}}
441 ; KNL-LABEL: test_mm256_mask_blend_epi8:
442 ; KNL:       # %bb.0: # %entry
443 ; KNL-NEXT:    vmovdqa {{.*#+}} 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]
444 ; KNL-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
445 ; KNL-NEXT:    ret{{[l|q]}}
446 entry:
447   %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>
448   ret <32 x i8> %0
451 define <16 x i8> @test_mm_mask_blend_epi8(<16 x i8> %A, <16 x i8> %W){
452 ; SKX-LABEL: test_mm_mask_blend_epi8:
453 ; SKX:       # %bb.0: # %entry
454 ; SKX-NEXT:    movw $-21846, %ax # imm = 0xAAAA
455 ; SKX-NEXT:    kmovd %eax, %k1
456 ; SKX-NEXT:    vpblendmb %xmm0, %xmm1, %xmm0 {%k1}
457 ; SKX-NEXT:    ret{{[l|q]}}
459 ; KNL-LABEL: test_mm_mask_blend_epi8:
460 ; KNL:       # %bb.0: # %entry
461 ; KNL-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
462 ; KNL-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
463 ; KNL-NEXT:    ret{{[l|q]}}
464 entry:
465   %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>
466   ret <16 x i8> %0
469 ; PR34370
470 define <8 x float> @test_masked_permps_v8f32(<8 x float>* %vp, <8 x float> %vec2) {
471 ; SKX64-LABEL: test_masked_permps_v8f32:
472 ; SKX64:       # %bb.0:
473 ; SKX64-NEXT:    vmovaps (%rdi), %ymm2
474 ; SKX64-NEXT:    vmovaps {{.*#+}} ymm1 = [7,6,3,11,7,6,14,15]
475 ; SKX64-NEXT:    vpermi2ps %ymm0, %ymm2, %ymm1
476 ; SKX64-NEXT:    vmovaps %ymm1, %ymm0
477 ; SKX64-NEXT:    retq
479 ; KNL64-LABEL: test_masked_permps_v8f32:
480 ; KNL64:       # %bb.0:
481 ; KNL64-NEXT:    vpermilps {{.*#+}} ymm1 = mem[3,2,2,3,7,6,6,7]
482 ; KNL64-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[2,0,2,3]
483 ; KNL64-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2],ymm0[3],ymm1[4,5],ymm0[6,7]
484 ; KNL64-NEXT:    retq
486 ; SKX32-LABEL: test_masked_permps_v8f32:
487 ; SKX32:       # %bb.0:
488 ; SKX32-NEXT:    movl {{[0-9]+}}(%esp), %eax
489 ; SKX32-NEXT:    vmovaps (%eax), %ymm2
490 ; SKX32-NEXT:    vmovaps {{.*#+}} ymm1 = [7,6,3,11,7,6,14,15]
491 ; SKX32-NEXT:    vpermi2ps %ymm0, %ymm2, %ymm1
492 ; SKX32-NEXT:    vmovaps %ymm1, %ymm0
493 ; SKX32-NEXT:    retl
495 ; KNL32-LABEL: test_masked_permps_v8f32:
496 ; KNL32:       # %bb.0:
497 ; KNL32-NEXT:    movl {{[0-9]+}}(%esp), %eax
498 ; KNL32-NEXT:    vpermilps {{.*#+}} ymm1 = mem[3,2,2,3,7,6,6,7]
499 ; KNL32-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[2,0,2,3]
500 ; KNL32-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2],ymm0[3],ymm1[4,5],ymm0[6,7]
501 ; KNL32-NEXT:    retl
502   %vec = load <8 x float>, <8 x float>* %vp
503   %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>
504   %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
505   ret <8 x float> %res
508 define <16 x float> @test_masked_permps_v16f32(<16 x float>* %vp, <16 x float> %vec2) {
509 ; X64-LABEL: test_masked_permps_v16f32:
510 ; X64:       # %bb.0:
511 ; X64-NEXT:    vmovaps (%rdi), %zmm2
512 ; X64-NEXT:    vmovaps {{.*#+}} zmm1 = [15,13,11,19,14,12,22,23,7,6,3,27,7,29,3,31]
513 ; X64-NEXT:    vpermi2ps %zmm0, %zmm2, %zmm1
514 ; X64-NEXT:    vmovaps %zmm1, %zmm0
515 ; X64-NEXT:    retq
517 ; X86-LABEL: test_masked_permps_v16f32:
518 ; X86:       # %bb.0:
519 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
520 ; X86-NEXT:    vmovaps (%eax), %zmm2
521 ; X86-NEXT:    vmovaps {{.*#+}} zmm1 = [15,13,11,19,14,12,22,23,7,6,3,27,7,29,3,31]
522 ; X86-NEXT:    vpermi2ps %zmm0, %zmm2, %zmm1
523 ; X86-NEXT:    vmovaps %zmm1, %zmm0
524 ; X86-NEXT:    retl
525   %vec = load <16 x float>, <16 x float>* %vp
526   %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>
527   %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
528   ret <16 x float> %res
531 %union1= type { <16 x float> }
532 @src1 = external dso_local local_unnamed_addr global %union1, align 64
534 define void @PR43170(<16 x float>* %a0) {
535 ; SKX64-LABEL: PR43170:
536 ; SKX64:       # %bb.0: # %entry
537 ; SKX64-NEXT:    vmovaps {{.*}}(%rip), %ymm0
538 ; SKX64-NEXT:    vmovaps %zmm0, (%rdi)
539 ; SKX64-NEXT:    vzeroupper
540 ; SKX64-NEXT:    retq
542 ; KNL64-LABEL: PR43170:
543 ; KNL64:       # %bb.0: # %entry
544 ; KNL64-NEXT:    vmovaps {{.*}}(%rip), %ymm0
545 ; KNL64-NEXT:    vmovaps %zmm0, (%rdi)
546 ; KNL64-NEXT:    retq
548 ; SKX32-LABEL: PR43170:
549 ; SKX32:       # %bb.0: # %entry
550 ; SKX32-NEXT:    movl {{[0-9]+}}(%esp), %eax
551 ; SKX32-NEXT:    vmovaps src1, %ymm0
552 ; SKX32-NEXT:    vmovaps %zmm0, (%eax)
553 ; SKX32-NEXT:    vzeroupper
554 ; SKX32-NEXT:    retl
556 ; KNL32-LABEL: PR43170:
557 ; KNL32:       # %bb.0: # %entry
558 ; KNL32-NEXT:    movl {{[0-9]+}}(%esp), %eax
559 ; KNL32-NEXT:    vmovaps src1, %ymm0
560 ; KNL32-NEXT:    vmovaps %zmm0, (%eax)
561 ; KNL32-NEXT:    retl
562 entry:
563   %0 = load <8 x float>, <8 x float>* bitcast (%union1* @src1 to <8 x float>*), align 64
564   %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>
565   store <16 x float> %1, <16 x float>* %a0, align 64
566   ret void