1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f | FileCheck --check-prefixes=CHECK,KNL %s
3; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f,+avx512bw,+avx512vl,+avx512dq | FileCheck --check-prefixes=CHECK,SKX %s
4; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f,+avx512bw,+avx512vl,+avx512dq,+avx512vbmi | FileCheck --check-prefixes=CHECK,SKX %s
5
6define <16 x float> @test1(<16 x float> %x, ptr %br, float %y) nounwind {
7; CHECK-LABEL: test1:
8; CHECK:       ## %bb.0:
9; CHECK-NEXT:    vinsertps {{.*#+}} xmm2 = xmm0[0],mem[0],xmm0[2,3]
10; CHECK-NEXT:    vinsertf32x4 $0, %xmm2, %zmm0, %zmm2
11; CHECK-NEXT:    vbroadcastss %xmm1, %zmm1
12; CHECK-NEXT:    vmovaps {{.*#+}} zmm0 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,30,15]
13; CHECK-NEXT:    vpermi2ps %zmm1, %zmm2, %zmm0
14; CHECK-NEXT:    retq
15  %rrr = load float, ptr %br
16  %rrr2 = insertelement <16 x float> %x, float %rrr, i32 1
17  %rrr3 = insertelement <16 x float> %rrr2, float %y, i32 14
18  ret <16 x float> %rrr3
19}
20
21define <8 x double> @test2(<8 x double> %x, ptr %br, double %y) nounwind {
22; KNL-LABEL: test2:
23; KNL:       ## %bb.0:
24; KNL-NEXT:    vmovhpd {{.*#+}} xmm2 = xmm0[0],mem[0]
25; KNL-NEXT:    vinsertf32x4 $0, %xmm2, %zmm0, %zmm0
26; KNL-NEXT:    movb $64, %al
27; KNL-NEXT:    kmovw %eax, %k1
28; KNL-NEXT:    vbroadcastsd %xmm1, %zmm0 {%k1}
29; KNL-NEXT:    retq
30;
31; SKX-LABEL: test2:
32; SKX:       ## %bb.0:
33; SKX-NEXT:    vmovhpd {{.*#+}} xmm2 = xmm0[0],mem[0]
34; SKX-NEXT:    vinsertf32x4 $0, %xmm2, %zmm0, %zmm0
35; SKX-NEXT:    movb $64, %al
36; SKX-NEXT:    kmovd %eax, %k1
37; SKX-NEXT:    vbroadcastsd %xmm1, %zmm0 {%k1}
38; SKX-NEXT:    retq
39  %rrr = load double, ptr %br
40  %rrr2 = insertelement <8 x double> %x, double %rrr, i32 1
41  %rrr3 = insertelement <8 x double> %rrr2, double %y, i32 6
42  ret <8 x double> %rrr3
43}
44
45define <16 x float> @test3(<16 x float> %x) nounwind {
46; CHECK-LABEL: test3:
47; CHECK:       ## %bb.0:
48; CHECK-NEXT:    vextractf128 $1, %ymm0, %xmm1
49; CHECK-NEXT:    vinsertps {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[2,3]
50; CHECK-NEXT:    vinsertf32x4 $0, %xmm1, %zmm0, %zmm0
51; CHECK-NEXT:    retq
52  %eee = extractelement <16 x float> %x, i32 4
53  %rrr2 = insertelement <16 x float> %x, float %eee, i32 1
54  ret <16 x float> %rrr2
55}
56
57define <8 x i64> @test4(<8 x i64> %x) nounwind {
58; CHECK-LABEL: test4:
59; CHECK:       ## %bb.0:
60; CHECK-NEXT:    vextractf32x4 $2, %zmm0, %xmm1
61; CHECK-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm0[0],xmm1[0]
62; CHECK-NEXT:    vinsertf32x4 $0, %xmm1, %zmm0, %zmm0
63; CHECK-NEXT:    retq
64  %eee = extractelement <8 x i64> %x, i32 4
65  %rrr2 = insertelement <8 x i64> %x, i64 %eee, i32 1
66  ret <8 x i64> %rrr2
67}
68
69define i32 @test5(<4 x float> %x) nounwind {
70; CHECK-LABEL: test5:
71; CHECK:       ## %bb.0:
72; CHECK-NEXT:    vextractps $3, %xmm0, %eax
73; CHECK-NEXT:    retq
74  %ef = extractelement <4 x float> %x, i32 3
75  %ei = bitcast float %ef to i32
76  ret i32 %ei
77}
78
79define void @test6(<4 x float> %x, ptr %out) nounwind {
80; CHECK-LABEL: test6:
81; CHECK:       ## %bb.0:
82; CHECK-NEXT:    vextractps $3, %xmm0, (%rdi)
83; CHECK-NEXT:    retq
84  %ef = extractelement <4 x float> %x, i32 3
85  store float %ef, ptr %out, align 4
86  ret void
87}
88
89define float @test7(<16 x float> %x, i32 %ind) nounwind {
90; CHECK-LABEL: test7:
91; CHECK:       ## %bb.0:
92; CHECK-NEXT:    pushq %rbp
93; CHECK-NEXT:    movq %rsp, %rbp
94; CHECK-NEXT:    andq $-64, %rsp
95; CHECK-NEXT:    subq $128, %rsp
96; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
97; CHECK-NEXT:    vmovaps %zmm0, (%rsp)
98; CHECK-NEXT:    andl $15, %edi
99; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
100; CHECK-NEXT:    movq %rbp, %rsp
101; CHECK-NEXT:    popq %rbp
102; CHECK-NEXT:    vzeroupper
103; CHECK-NEXT:    retq
104  %e = extractelement <16 x float> %x, i32 %ind
105  ret float %e
106}
107
108define double @test8(<8 x double> %x, i32 %ind) nounwind {
109; CHECK-LABEL: test8:
110; CHECK:       ## %bb.0:
111; CHECK-NEXT:    pushq %rbp
112; CHECK-NEXT:    movq %rsp, %rbp
113; CHECK-NEXT:    andq $-64, %rsp
114; CHECK-NEXT:    subq $128, %rsp
115; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
116; CHECK-NEXT:    vmovaps %zmm0, (%rsp)
117; CHECK-NEXT:    andl $7, %edi
118; CHECK-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
119; CHECK-NEXT:    movq %rbp, %rsp
120; CHECK-NEXT:    popq %rbp
121; CHECK-NEXT:    vzeroupper
122; CHECK-NEXT:    retq
123  %e = extractelement <8 x double> %x, i32 %ind
124  ret double %e
125}
126
127define float @test9(<8 x float> %x, i32 %ind) nounwind {
128; CHECK-LABEL: test9:
129; CHECK:       ## %bb.0:
130; CHECK-NEXT:    pushq %rbp
131; CHECK-NEXT:    movq %rsp, %rbp
132; CHECK-NEXT:    andq $-32, %rsp
133; CHECK-NEXT:    subq $64, %rsp
134; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
135; CHECK-NEXT:    vmovaps %ymm0, (%rsp)
136; CHECK-NEXT:    andl $7, %edi
137; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
138; CHECK-NEXT:    movq %rbp, %rsp
139; CHECK-NEXT:    popq %rbp
140; CHECK-NEXT:    vzeroupper
141; CHECK-NEXT:    retq
142  %e = extractelement <8 x float> %x, i32 %ind
143  ret float %e
144}
145
146define i32 @test10(<16 x i32> %x, i32 %ind) nounwind {
147; CHECK-LABEL: test10:
148; CHECK:       ## %bb.0:
149; CHECK-NEXT:    pushq %rbp
150; CHECK-NEXT:    movq %rsp, %rbp
151; CHECK-NEXT:    andq $-64, %rsp
152; CHECK-NEXT:    subq $128, %rsp
153; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
154; CHECK-NEXT:    vmovaps %zmm0, (%rsp)
155; CHECK-NEXT:    andl $15, %edi
156; CHECK-NEXT:    movl (%rsp,%rdi,4), %eax
157; CHECK-NEXT:    movq %rbp, %rsp
158; CHECK-NEXT:    popq %rbp
159; CHECK-NEXT:    vzeroupper
160; CHECK-NEXT:    retq
161  %e = extractelement <16 x i32> %x, i32 %ind
162  ret i32 %e
163}
164
165define <16 x i32> @test11(<16 x i32>%a, <16 x i32>%b) {
166; KNL-LABEL: test11:
167; KNL:       ## %bb.0:
168; KNL-NEXT:    vpcmpltud %zmm1, %zmm0, %k0
169; KNL-NEXT:    kshiftrw $4, %k0, %k0
170; KNL-NEXT:    kmovw %k0, %eax
171; KNL-NEXT:    testb $1, %al
172; KNL-NEXT:    je LBB10_2
173; KNL-NEXT:  ## %bb.1: ## %A
174; KNL-NEXT:    vmovdqa64 %zmm1, %zmm0
175; KNL-NEXT:    retq
176; KNL-NEXT:  LBB10_2: ## %B
177; KNL-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
178; KNL-NEXT:    retq
179;
180; SKX-LABEL: test11:
181; SKX:       ## %bb.0:
182; SKX-NEXT:    vpcmpltud %zmm1, %zmm0, %k0
183; SKX-NEXT:    kshiftrw $4, %k0, %k0
184; SKX-NEXT:    kmovd %k0, %eax
185; SKX-NEXT:    testb $1, %al
186; SKX-NEXT:    je LBB10_2
187; SKX-NEXT:  ## %bb.1: ## %A
188; SKX-NEXT:    vmovdqa64 %zmm1, %zmm0
189; SKX-NEXT:    retq
190; SKX-NEXT:  LBB10_2: ## %B
191; SKX-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
192; SKX-NEXT:    retq
193  %cmp_res = icmp ult <16 x i32> %a, %b
194  %ia = extractelement <16 x i1> %cmp_res, i32 4
195  br i1 %ia, label %A, label %B
196  A:
197    ret <16 x i32>%b
198  B:
199   %c = add <16 x i32>%b, %a
200   ret <16 x i32>%c
201}
202
203define i64 @test12(<16 x i64>%a, <16 x i64>%b, i64 %a1, i64 %b1) {
204; KNL-LABEL: test12:
205; KNL:       ## %bb.0:
206; KNL-NEXT:    movq %rdi, %rax
207; KNL-NEXT:    vpcmpgtq %zmm0, %zmm2, %k0
208; KNL-NEXT:    kmovw %k0, %ecx
209; KNL-NEXT:    testb $1, %cl
210; KNL-NEXT:    cmoveq %rsi, %rax
211; KNL-NEXT:    vzeroupper
212; KNL-NEXT:    retq
213;
214; SKX-LABEL: test12:
215; SKX:       ## %bb.0:
216; SKX-NEXT:    movq %rdi, %rax
217; SKX-NEXT:    vpcmpgtq %zmm0, %zmm2, %k0
218; SKX-NEXT:    kmovd %k0, %ecx
219; SKX-NEXT:    testb $1, %cl
220; SKX-NEXT:    cmoveq %rsi, %rax
221; SKX-NEXT:    vzeroupper
222; SKX-NEXT:    retq
223  %cmpvector_func.i = icmp slt <16 x i64> %a, %b
224  %extract24vector_func.i = extractelement <16 x i1> %cmpvector_func.i, i32 0
225  %res = select i1 %extract24vector_func.i, i64 %a1, i64 %b1
226  ret i64 %res
227}
228
229define i16 @test13(i32 %a, i32 %b) {
230; KNL-LABEL: test13:
231; KNL:       ## %bb.0:
232; KNL-NEXT:    cmpl %esi, %edi
233; KNL-NEXT:    setb %al
234; KNL-NEXT:    movw $-4, %cx
235; KNL-NEXT:    kmovw %ecx, %k0
236; KNL-NEXT:    kshiftrw $1, %k0, %k0
237; KNL-NEXT:    kshiftlw $1, %k0, %k0
238; KNL-NEXT:    andl $1, %eax
239; KNL-NEXT:    kmovw %eax, %k1
240; KNL-NEXT:    korw %k1, %k0, %k0
241; KNL-NEXT:    kmovw %k0, %eax
242; KNL-NEXT:    ## kill: def $ax killed $ax killed $eax
243; KNL-NEXT:    retq
244;
245; SKX-LABEL: test13:
246; SKX:       ## %bb.0:
247; SKX-NEXT:    cmpl %esi, %edi
248; SKX-NEXT:    setb %al
249; SKX-NEXT:    movw $-4, %cx
250; SKX-NEXT:    kmovd %ecx, %k0
251; SKX-NEXT:    kshiftrw $1, %k0, %k0
252; SKX-NEXT:    kshiftlw $1, %k0, %k0
253; SKX-NEXT:    andl $1, %eax
254; SKX-NEXT:    kmovw %eax, %k1
255; SKX-NEXT:    korw %k1, %k0, %k0
256; SKX-NEXT:    kmovd %k0, %eax
257; SKX-NEXT:    ## kill: def $ax killed $ax killed $eax
258; SKX-NEXT:    retq
259  %cmp_res = icmp ult i32 %a, %b
260  %maskv = insertelement <16 x i1> <i1 true, i1 false, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, i1 %cmp_res, i32 0
261  %res = bitcast <16 x i1> %maskv to i16
262  ret i16 %res
263}
264
265define i64 @test14(<8 x i64>%a, <8 x i64>%b, i64 %a1, i64 %b1) {
266; KNL-LABEL: test14:
267; KNL:       ## %bb.0:
268; KNL-NEXT:    movq %rdi, %rax
269; KNL-NEXT:    vpcmpgtq %zmm0, %zmm1, %k0
270; KNL-NEXT:    kshiftrw $4, %k0, %k0
271; KNL-NEXT:    kmovw %k0, %ecx
272; KNL-NEXT:    testb $1, %cl
273; KNL-NEXT:    cmoveq %rsi, %rax
274; KNL-NEXT:    vzeroupper
275; KNL-NEXT:    retq
276;
277; SKX-LABEL: test14:
278; SKX:       ## %bb.0:
279; SKX-NEXT:    movq %rdi, %rax
280; SKX-NEXT:    vpcmpgtq %zmm0, %zmm1, %k0
281; SKX-NEXT:    kshiftrb $4, %k0, %k0
282; SKX-NEXT:    kmovd %k0, %ecx
283; SKX-NEXT:    testb $1, %cl
284; SKX-NEXT:    cmoveq %rsi, %rax
285; SKX-NEXT:    vzeroupper
286; SKX-NEXT:    retq
287  %cmpvector_func.i = icmp slt <8 x i64> %a, %b
288  %extract24vector_func.i = extractelement <8 x i1> %cmpvector_func.i, i32 4
289  %res = select i1 %extract24vector_func.i, i64 %a1, i64 %b1
290  ret i64 %res
291}
292
293define i16 @test15(ptr%addr) {
294; CHECK-LABEL: test15:
295; CHECK:       ## %bb.0:
296; CHECK-NEXT:    xorl %ecx, %ecx
297; CHECK-NEXT:    cmpb $0, (%rdi)
298; CHECK-NEXT:    movl $65535, %eax ## imm = 0xFFFF
299; CHECK-NEXT:    cmovel %ecx, %eax
300; CHECK-NEXT:    ## kill: def $ax killed $ax killed $eax
301; CHECK-NEXT:    retq
302  %x = load i1 , ptr %addr, align 1
303  %x1 = insertelement <16 x i1> undef, i1 %x, i32 10
304  %x2 = bitcast <16 x i1>%x1 to i16
305  ret i16 %x2
306}
307
308define i16 @test16(ptr%addr, i16 %a) {
309; KNL-LABEL: test16:
310; KNL:       ## %bb.0:
311; KNL-NEXT:    movb (%rdi), %al
312; KNL-NEXT:    kmovw %esi, %k0
313; KNL-NEXT:    movw $-1025, %cx ## imm = 0xFBFF
314; KNL-NEXT:    kmovw %ecx, %k1
315; KNL-NEXT:    kandw %k1, %k0, %k0
316; KNL-NEXT:    kmovw %eax, %k1
317; KNL-NEXT:    kshiftlw $15, %k1, %k1
318; KNL-NEXT:    kshiftrw $5, %k1, %k1
319; KNL-NEXT:    korw %k1, %k0, %k0
320; KNL-NEXT:    kmovw %k0, %eax
321; KNL-NEXT:    ## kill: def $ax killed $ax killed $eax
322; KNL-NEXT:    retq
323;
324; SKX-LABEL: test16:
325; SKX:       ## %bb.0:
326; SKX-NEXT:    kmovb (%rdi), %k0
327; SKX-NEXT:    kmovd %esi, %k1
328; SKX-NEXT:    movw $-1025, %ax ## imm = 0xFBFF
329; SKX-NEXT:    kmovd %eax, %k2
330; SKX-NEXT:    kandw %k2, %k1, %k1
331; SKX-NEXT:    kshiftlw $15, %k0, %k0
332; SKX-NEXT:    kshiftrw $5, %k0, %k0
333; SKX-NEXT:    korw %k0, %k1, %k0
334; SKX-NEXT:    kmovd %k0, %eax
335; SKX-NEXT:    ## kill: def $ax killed $ax killed $eax
336; SKX-NEXT:    retq
337  %x = load i1 , ptr %addr, align 128
338  %a1 = bitcast i16 %a to <16 x i1>
339  %x1 = insertelement <16 x i1> %a1, i1 %x, i32 10
340  %x2 = bitcast <16 x i1>%x1 to i16
341  ret i16 %x2
342}
343
344define i8 @test17(ptr%addr, i8 %a) {
345; KNL-LABEL: test17:
346; KNL:       ## %bb.0:
347; KNL-NEXT:    movb (%rdi), %al
348; KNL-NEXT:    kmovw %esi, %k0
349; KNL-NEXT:    movw $-17, %cx
350; KNL-NEXT:    kmovw %ecx, %k1
351; KNL-NEXT:    kandw %k1, %k0, %k0
352; KNL-NEXT:    kmovw %eax, %k1
353; KNL-NEXT:    kshiftlw $15, %k1, %k1
354; KNL-NEXT:    kshiftrw $11, %k1, %k1
355; KNL-NEXT:    korw %k1, %k0, %k0
356; KNL-NEXT:    kmovw %k0, %eax
357; KNL-NEXT:    ## kill: def $al killed $al killed $eax
358; KNL-NEXT:    retq
359;
360; SKX-LABEL: test17:
361; SKX:       ## %bb.0:
362; SKX-NEXT:    kmovb (%rdi), %k0
363; SKX-NEXT:    kmovd %esi, %k1
364; SKX-NEXT:    movb $-17, %al
365; SKX-NEXT:    kmovd %eax, %k2
366; SKX-NEXT:    kandb %k2, %k1, %k1
367; SKX-NEXT:    kshiftlb $7, %k0, %k0
368; SKX-NEXT:    kshiftrb $3, %k0, %k0
369; SKX-NEXT:    korb %k0, %k1, %k0
370; SKX-NEXT:    kmovd %k0, %eax
371; SKX-NEXT:    ## kill: def $al killed $al killed $eax
372; SKX-NEXT:    retq
373  %x = load i1 , ptr %addr, align 128
374  %a1 = bitcast i8 %a to <8 x i1>
375  %x1 = insertelement <8 x i1> %a1, i1 %x, i32 4
376  %x2 = bitcast <8 x i1>%x1 to i8
377  ret i8 %x2
378}
379
380define i64 @extract_v8i64(<8 x i64> %x, ptr %dst) {
381; CHECK-LABEL: extract_v8i64:
382; CHECK:       ## %bb.0:
383; CHECK-NEXT:    vpextrq $1, %xmm0, %rax
384; CHECK-NEXT:    vextracti128 $1, %ymm0, %xmm0
385; CHECK-NEXT:    vpextrq $1, %xmm0, (%rdi)
386; CHECK-NEXT:    vzeroupper
387; CHECK-NEXT:    retq
388  %r1 = extractelement <8 x i64> %x, i32 1
389  %r2 = extractelement <8 x i64> %x, i32 3
390  store i64 %r2, ptr %dst, align 1
391  ret i64 %r1
392}
393
394define i64 @extract_v4i64(<4 x i64> %x, ptr %dst) {
395; CHECK-LABEL: extract_v4i64:
396; CHECK:       ## %bb.0:
397; CHECK-NEXT:    vpextrq $1, %xmm0, %rax
398; CHECK-NEXT:    vextracti128 $1, %ymm0, %xmm0
399; CHECK-NEXT:    vpextrq $1, %xmm0, (%rdi)
400; CHECK-NEXT:    vzeroupper
401; CHECK-NEXT:    retq
402  %r1 = extractelement <4 x i64> %x, i32 1
403  %r2 = extractelement <4 x i64> %x, i32 3
404  store i64 %r2, ptr %dst, align 1
405  ret i64 %r1
406}
407
408define i64 @extract_v2i64(<2 x i64> %x, ptr %dst) {
409; CHECK-LABEL: extract_v2i64:
410; CHECK:       ## %bb.0:
411; CHECK-NEXT:    vmovq %xmm0, %rax
412; CHECK-NEXT:    vpextrq $1, %xmm0, (%rdi)
413; CHECK-NEXT:    retq
414  %r1 = extractelement <2 x i64> %x, i32 0
415  %r2 = extractelement <2 x i64> %x, i32 1
416  store i64 %r2, ptr %dst, align 1
417  ret i64 %r1
418}
419
420define i32 @extract_v16i32(<16 x i32> %x, ptr %dst) {
421; CHECK-LABEL: extract_v16i32:
422; CHECK:       ## %bb.0:
423; CHECK-NEXT:    vextractps $1, %xmm0, %eax
424; CHECK-NEXT:    vextractf128 $1, %ymm0, %xmm0
425; CHECK-NEXT:    vextractps $1, %xmm0, (%rdi)
426; CHECK-NEXT:    vzeroupper
427; CHECK-NEXT:    retq
428  %r1 = extractelement <16 x i32> %x, i32 1
429  %r2 = extractelement <16 x i32> %x, i32 5
430  store i32 %r2, ptr %dst, align 1
431  ret i32 %r1
432}
433
434define i32 @extract_v8i32(<8 x i32> %x, ptr %dst) {
435; CHECK-LABEL: extract_v8i32:
436; CHECK:       ## %bb.0:
437; CHECK-NEXT:    vextractps $1, %xmm0, %eax
438; CHECK-NEXT:    vextractf128 $1, %ymm0, %xmm0
439; CHECK-NEXT:    vextractps $1, %xmm0, (%rdi)
440; CHECK-NEXT:    vzeroupper
441; CHECK-NEXT:    retq
442  %r1 = extractelement <8 x i32> %x, i32 1
443  %r2 = extractelement <8 x i32> %x, i32 5
444  store i32 %r2, ptr %dst, align 1
445  ret i32 %r1
446}
447
448define i32 @extract_v4i32(<4 x i32> %x, ptr %dst) {
449; CHECK-LABEL: extract_v4i32:
450; CHECK:       ## %bb.0:
451; CHECK-NEXT:    vextractps $1, %xmm0, %eax
452; CHECK-NEXT:    vextractps $3, %xmm0, (%rdi)
453; CHECK-NEXT:    retq
454  %r1 = extractelement <4 x i32> %x, i32 1
455  %r2 = extractelement <4 x i32> %x, i32 3
456  store i32 %r2, ptr %dst, align 1
457  ret i32 %r1
458}
459
460define i16 @extract_v32i16(<32 x i16> %x, ptr %dst) {
461; CHECK-LABEL: extract_v32i16:
462; CHECK:       ## %bb.0:
463; CHECK-NEXT:    vpextrw $1, %xmm0, %eax
464; CHECK-NEXT:    vextracti128 $1, %ymm0, %xmm0
465; CHECK-NEXT:    vpextrw $1, %xmm0, (%rdi)
466; CHECK-NEXT:    ## kill: def $ax killed $ax killed $eax
467; CHECK-NEXT:    vzeroupper
468; CHECK-NEXT:    retq
469  %r1 = extractelement <32 x i16> %x, i32 1
470  %r2 = extractelement <32 x i16> %x, i32 9
471  store i16 %r2, ptr %dst, align 1
472  ret i16 %r1
473}
474
475define i16 @extract_v16i16(<16 x i16> %x, ptr %dst) {
476; CHECK-LABEL: extract_v16i16:
477; CHECK:       ## %bb.0:
478; CHECK-NEXT:    vpextrw $1, %xmm0, %eax
479; CHECK-NEXT:    vextracti128 $1, %ymm0, %xmm0
480; CHECK-NEXT:    vpextrw $1, %xmm0, (%rdi)
481; CHECK-NEXT:    ## kill: def $ax killed $ax killed $eax
482; CHECK-NEXT:    vzeroupper
483; CHECK-NEXT:    retq
484  %r1 = extractelement <16 x i16> %x, i32 1
485  %r2 = extractelement <16 x i16> %x, i32 9
486  store i16 %r2, ptr %dst, align 1
487  ret i16 %r1
488}
489
490define i16 @extract_v8i16(<8 x i16> %x, ptr %dst) {
491; CHECK-LABEL: extract_v8i16:
492; CHECK:       ## %bb.0:
493; CHECK-NEXT:    vpextrw $1, %xmm0, %eax
494; CHECK-NEXT:    vpextrw $3, %xmm0, (%rdi)
495; CHECK-NEXT:    ## kill: def $ax killed $ax killed $eax
496; CHECK-NEXT:    retq
497  %r1 = extractelement <8 x i16> %x, i32 1
498  %r2 = extractelement <8 x i16> %x, i32 3
499  store i16 %r2, ptr %dst, align 1
500  ret i16 %r1
501}
502
503define i8 @extract_v64i8(<64 x i8> %x, ptr %dst) {
504; CHECK-LABEL: extract_v64i8:
505; CHECK:       ## %bb.0:
506; CHECK-NEXT:    vpextrb $1, %xmm0, %eax
507; CHECK-NEXT:    vextracti128 $1, %ymm0, %xmm0
508; CHECK-NEXT:    vpextrb $1, %xmm0, (%rdi)
509; CHECK-NEXT:    ## kill: def $al killed $al killed $eax
510; CHECK-NEXT:    vzeroupper
511; CHECK-NEXT:    retq
512  %r1 = extractelement <64 x i8> %x, i32 1
513  %r2 = extractelement <64 x i8> %x, i32 17
514  store i8 %r2, ptr %dst, align 1
515  ret i8 %r1
516}
517
518define i8 @extract_v32i8(<32 x i8> %x, ptr %dst) {
519; CHECK-LABEL: extract_v32i8:
520; CHECK:       ## %bb.0:
521; CHECK-NEXT:    vpextrb $1, %xmm0, %eax
522; CHECK-NEXT:    vextracti128 $1, %ymm0, %xmm0
523; CHECK-NEXT:    vpextrb $1, %xmm0, (%rdi)
524; CHECK-NEXT:    ## kill: def $al killed $al killed $eax
525; CHECK-NEXT:    vzeroupper
526; CHECK-NEXT:    retq
527  %r1 = extractelement <32 x i8> %x, i32 1
528  %r2 = extractelement <32 x i8> %x, i32 17
529  store i8 %r2, ptr %dst, align 1
530  ret i8 %r1
531}
532
533define i8 @extract_v16i8(<16 x i8> %x, ptr %dst) {
534; CHECK-LABEL: extract_v16i8:
535; CHECK:       ## %bb.0:
536; CHECK-NEXT:    vpextrb $1, %xmm0, %eax
537; CHECK-NEXT:    vpextrb $3, %xmm0, (%rdi)
538; CHECK-NEXT:    ## kill: def $al killed $al killed $eax
539; CHECK-NEXT:    retq
540  %r1 = extractelement <16 x i8> %x, i32 1
541  %r2 = extractelement <16 x i8> %x, i32 3
542  store i8 %r2, ptr %dst, align 1
543  ret i8 %r1
544}
545
546define <8 x i64> @insert_v8i64(<8 x i64> %x, i64 %y , ptr %ptr) {
547; KNL-LABEL: insert_v8i64:
548; KNL:       ## %bb.0:
549; KNL-NEXT:    vpinsrq $1, (%rsi), %xmm0, %xmm1
550; KNL-NEXT:    vinserti32x4 $0, %xmm1, %zmm0, %zmm0
551; KNL-NEXT:    movb $8, %al
552; KNL-NEXT:    kmovw %eax, %k1
553; KNL-NEXT:    vpbroadcastq %rdi, %zmm0 {%k1}
554; KNL-NEXT:    retq
555;
556; SKX-LABEL: insert_v8i64:
557; SKX:       ## %bb.0:
558; SKX-NEXT:    vpinsrq $1, (%rsi), %xmm0, %xmm1
559; SKX-NEXT:    vinserti32x4 $0, %xmm1, %zmm0, %zmm0
560; SKX-NEXT:    movb $8, %al
561; SKX-NEXT:    kmovd %eax, %k1
562; SKX-NEXT:    vpbroadcastq %rdi, %zmm0 {%k1}
563; SKX-NEXT:    retq
564  %val = load i64, ptr %ptr
565  %r1 = insertelement <8 x i64> %x, i64 %val, i32 1
566  %r2 = insertelement <8 x i64> %r1, i64 %y, i32 3
567  ret <8 x i64> %r2
568}
569
570define <4 x i64> @insert_v4i64(<4 x i64> %x, i64 %y , ptr %ptr) {
571; KNL-LABEL: insert_v4i64:
572; KNL:       ## %bb.0:
573; KNL-NEXT:    vpinsrq $1, (%rsi), %xmm0, %xmm1
574; KNL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]
575; KNL-NEXT:    vmovq %rdi, %xmm1
576; KNL-NEXT:    vpbroadcastq %xmm1, %ymm1
577; KNL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5],ymm1[6,7]
578; KNL-NEXT:    retq
579;
580; SKX-LABEL: insert_v4i64:
581; SKX:       ## %bb.0:
582; SKX-NEXT:    vpinsrq $1, (%rsi), %xmm0, %xmm1
583; SKX-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]
584; SKX-NEXT:    vpbroadcastq %rdi, %ymm1
585; SKX-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5],ymm1[6,7]
586; SKX-NEXT:    retq
587  %val = load i64, ptr %ptr
588  %r1 = insertelement <4 x i64> %x, i64 %val, i32 1
589  %r2 = insertelement <4 x i64> %r1, i64 %y, i32 3
590  ret <4 x i64> %r2
591}
592
593define <2 x i64> @insert_v2i64(<2 x i64> %x, i64 %y , ptr %ptr) {
594; CHECK-LABEL: insert_v2i64:
595; CHECK:       ## %bb.0:
596; CHECK-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
597; CHECK-NEXT:    vmovq %rdi, %xmm1
598; CHECK-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
599; CHECK-NEXT:    retq
600  %val = load i64, ptr %ptr
601  %r1 = insertelement <2 x i64> %x, i64 %val, i32 1
602  %r2 = insertelement <2 x i64> %r1, i64 %y, i32 0
603  ret <2 x i64> %r2
604}
605
606define <16 x i32> @insert_v16i32(<16 x i32> %x, i32 %y, ptr %ptr) {
607; KNL-LABEL: insert_v16i32:
608; KNL:       ## %bb.0:
609; KNL-NEXT:    vpinsrd $1, (%rsi), %xmm0, %xmm1
610; KNL-NEXT:    vinserti32x4 $0, %xmm1, %zmm0, %zmm0
611; KNL-NEXT:    movw $32, %ax
612; KNL-NEXT:    kmovw %eax, %k1
613; KNL-NEXT:    vpbroadcastd %edi, %zmm0 {%k1}
614; KNL-NEXT:    retq
615;
616; SKX-LABEL: insert_v16i32:
617; SKX:       ## %bb.0:
618; SKX-NEXT:    vpinsrd $1, (%rsi), %xmm0, %xmm1
619; SKX-NEXT:    vinserti32x4 $0, %xmm1, %zmm0, %zmm0
620; SKX-NEXT:    movw $32, %ax
621; SKX-NEXT:    kmovd %eax, %k1
622; SKX-NEXT:    vpbroadcastd %edi, %zmm0 {%k1}
623; SKX-NEXT:    retq
624  %val = load i32, ptr %ptr
625  %r1 = insertelement <16 x i32> %x, i32 %val, i32 1
626  %r2 = insertelement <16 x i32> %r1, i32 %y, i32 5
627  ret <16 x i32> %r2
628}
629
630define <8 x i32> @insert_v8i32(<8 x i32> %x, i32 %y, ptr %ptr) {
631; KNL-LABEL: insert_v8i32:
632; KNL:       ## %bb.0:
633; KNL-NEXT:    vpinsrd $1, (%rsi), %xmm0, %xmm1
634; KNL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]
635; KNL-NEXT:    vmovd %edi, %xmm1
636; KNL-NEXT:    vpbroadcastd %xmm1, %ymm1
637; KNL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm1[5],ymm0[6,7]
638; KNL-NEXT:    retq
639;
640; SKX-LABEL: insert_v8i32:
641; SKX:       ## %bb.0:
642; SKX-NEXT:    vpinsrd $1, (%rsi), %xmm0, %xmm1
643; SKX-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]
644; SKX-NEXT:    vpbroadcastd %edi, %ymm1
645; SKX-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm1[5],ymm0[6,7]
646; SKX-NEXT:    retq
647  %val = load i32, ptr %ptr
648  %r1 = insertelement <8 x i32> %x, i32 %val, i32 1
649  %r2 = insertelement <8 x i32> %r1, i32 %y, i32 5
650  ret <8 x i32> %r2
651}
652
653define <4 x i32> @insert_v4i32(<4 x i32> %x, i32 %y, ptr %ptr) {
654; CHECK-LABEL: insert_v4i32:
655; CHECK:       ## %bb.0:
656; CHECK-NEXT:    vpinsrd $1, (%rsi), %xmm0, %xmm0
657; CHECK-NEXT:    vpinsrd $3, %edi, %xmm0, %xmm0
658; CHECK-NEXT:    retq
659  %val = load i32, ptr %ptr
660  %r1 = insertelement <4 x i32> %x, i32 %val, i32 1
661  %r2 = insertelement <4 x i32> %r1, i32 %y, i32 3
662  ret <4 x i32> %r2
663}
664
665define <32 x i16> @insert_v32i16(<32 x i16> %x, i16 %y, ptr %ptr) {
666; KNL-LABEL: insert_v32i16:
667; KNL:       ## %bb.0:
668; KNL-NEXT:    vpinsrw $1, (%rsi), %xmm0, %xmm1
669; KNL-NEXT:    vinserti32x4 $0, %xmm1, %zmm0, %zmm1
670; KNL-NEXT:    vmovd %edi, %xmm0
671; KNL-NEXT:    vpbroadcastw %xmm0, %ymm0
672; KNL-NEXT:    vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm0
673; KNL-NEXT:    retq
674;
675; SKX-LABEL: insert_v32i16:
676; SKX:       ## %bb.0:
677; SKX-NEXT:    vpinsrw $1, (%rsi), %xmm0, %xmm1
678; SKX-NEXT:    vinserti32x4 $0, %xmm1, %zmm0, %zmm0
679; SKX-NEXT:    movl $512, %eax ## imm = 0x200
680; SKX-NEXT:    kmovd %eax, %k1
681; SKX-NEXT:    vpbroadcastw %edi, %zmm0 {%k1}
682; SKX-NEXT:    retq
683  %val = load i16, ptr %ptr
684  %r1 = insertelement <32 x i16> %x, i16 %val, i32 1
685  %r2 = insertelement <32 x i16> %r1, i16 %y, i32 9
686  ret <32 x i16> %r2
687}
688
689define <16 x i16> @insert_v16i16(<16 x i16> %x, i16 %y, ptr %ptr) {
690; KNL-LABEL: insert_v16i16:
691; KNL:       ## %bb.0:
692; KNL-NEXT:    vpinsrw $1, (%rsi), %xmm0, %xmm1
693; KNL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]
694; KNL-NEXT:    vmovd %edi, %xmm1
695; KNL-NEXT:    vpbroadcastw %xmm1, %ymm1
696; KNL-NEXT:    vpblendw {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2,3,4,5,6,7,8],ymm1[9],ymm0[10,11,12,13,14,15]
697; KNL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
698; KNL-NEXT:    retq
699;
700; SKX-LABEL: insert_v16i16:
701; SKX:       ## %bb.0:
702; SKX-NEXT:    vpinsrw $1, (%rsi), %xmm0, %xmm1
703; SKX-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]
704; SKX-NEXT:    vpbroadcastw %edi, %ymm1
705; SKX-NEXT:    vpblendw {{.*#+}} ymm1 = ymm0[0],ymm1[1],ymm0[2,3,4,5,6,7,8],ymm1[9],ymm0[10,11,12,13,14,15]
706; SKX-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
707; SKX-NEXT:    retq
708  %val = load i16, ptr %ptr
709  %r1 = insertelement <16 x i16> %x, i16 %val, i32 1
710  %r2 = insertelement <16 x i16> %r1, i16 %y, i32 9
711  ret <16 x i16> %r2
712}
713
714define <8 x i16> @insert_v8i16(<8 x i16> %x, i16 %y, ptr %ptr) {
715; CHECK-LABEL: insert_v8i16:
716; CHECK:       ## %bb.0:
717; CHECK-NEXT:    vpinsrw $1, (%rsi), %xmm0, %xmm0
718; CHECK-NEXT:    vpinsrw $5, %edi, %xmm0, %xmm0
719; CHECK-NEXT:    retq
720  %val = load i16, ptr %ptr
721  %r1 = insertelement <8 x i16> %x, i16 %val, i32 1
722  %r2 = insertelement <8 x i16> %r1, i16 %y, i32 5
723  ret <8 x i16> %r2
724}
725
726define <64 x i8> @insert_v64i8(<64 x i8> %x, i8 %y, ptr %ptr) {
727; CHECK-LABEL: insert_v64i8:
728; CHECK:       ## %bb.0:
729; CHECK-NEXT:    vpinsrb $1, (%rsi), %xmm0, %xmm1
730; CHECK-NEXT:    vinserti32x4 $0, %xmm1, %zmm0, %zmm1
731; CHECK-NEXT:    vextracti32x4 $3, %zmm0, %xmm0
732; CHECK-NEXT:    vpinsrb $2, %edi, %xmm0, %xmm0
733; CHECK-NEXT:    vinserti32x4 $3, %xmm0, %zmm1, %zmm0
734; CHECK-NEXT:    retq
735  %val = load i8, ptr %ptr
736  %r1 = insertelement <64 x i8> %x, i8 %val, i32 1
737  %r2 = insertelement <64 x i8> %r1, i8 %y, i32 50
738  ret <64 x i8> %r2
739}
740
741define <32 x i8> @insert_v32i8(<32 x i8> %x, i8 %y, ptr %ptr) {
742; CHECK-LABEL: insert_v32i8:
743; CHECK:       ## %bb.0:
744; CHECK-NEXT:    vpinsrb $1, (%rsi), %xmm0, %xmm1
745; CHECK-NEXT:    vextracti128 $1, %ymm0, %xmm0
746; CHECK-NEXT:    vpinsrb $1, %edi, %xmm0, %xmm0
747; CHECK-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
748; CHECK-NEXT:    retq
749  %val = load i8, ptr %ptr
750  %r1 = insertelement <32 x i8> %x, i8 %val, i32 1
751  %r2 = insertelement <32 x i8> %r1, i8 %y, i32 17
752  ret <32 x i8> %r2
753}
754
755define <16 x i8> @insert_v16i8(<16 x i8> %x, i8 %y, ptr %ptr) {
756; CHECK-LABEL: insert_v16i8:
757; CHECK:       ## %bb.0:
758; CHECK-NEXT:    vpinsrb $3, (%rsi), %xmm0, %xmm0
759; CHECK-NEXT:    vpinsrb $10, %edi, %xmm0, %xmm0
760; CHECK-NEXT:    retq
761  %val = load i8, ptr %ptr
762  %r1 = insertelement <16 x i8> %x, i8 %val, i32 3
763  %r2 = insertelement <16 x i8> %r1, i8 %y, i32 10
764  ret <16 x i8> %r2
765}
766
767define <8 x i64> @test_insert_128_v8i64(<8 x i64> %x, i64 %y) {
768; CHECK-LABEL: test_insert_128_v8i64:
769; CHECK:       ## %bb.0:
770; CHECK-NEXT:    vpinsrq $1, %rdi, %xmm0, %xmm1
771; CHECK-NEXT:    vinserti32x4 $0, %xmm1, %zmm0, %zmm0
772; CHECK-NEXT:    retq
773  %r = insertelement <8 x i64> %x, i64 %y, i32 1
774  ret <8 x i64> %r
775}
776
777define <16 x i32> @test_insert_128_v16i32(<16 x i32> %x, i32 %y) {
778; CHECK-LABEL: test_insert_128_v16i32:
779; CHECK:       ## %bb.0:
780; CHECK-NEXT:    vpinsrd $1, %edi, %xmm0, %xmm1
781; CHECK-NEXT:    vinserti32x4 $0, %xmm1, %zmm0, %zmm0
782; CHECK-NEXT:    retq
783  %r = insertelement <16 x i32> %x, i32 %y, i32 1
784  ret <16 x i32> %r
785}
786
787define <8 x double> @test_insert_128_v8f64(<8 x double> %x, double %y) {
788; CHECK-LABEL: test_insert_128_v8f64:
789; CHECK:       ## %bb.0:
790; CHECK-NEXT:    vmovlhps {{.*#+}} xmm1 = xmm0[0],xmm1[0]
791; CHECK-NEXT:    vinsertf32x4 $0, %xmm1, %zmm0, %zmm0
792; CHECK-NEXT:    retq
793  %r = insertelement <8 x double> %x, double %y, i32 1
794  ret <8 x double> %r
795}
796
797define <16 x float> @test_insert_128_v16f32(<16 x float> %x, float %y) {
798; CHECK-LABEL: test_insert_128_v16f32:
799; CHECK:       ## %bb.0:
800; CHECK-NEXT:    vinsertps {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[2,3]
801; CHECK-NEXT:    vinsertf32x4 $0, %xmm1, %zmm0, %zmm0
802; CHECK-NEXT:    retq
803  %r = insertelement <16 x float> %x, float %y, i32 1
804  ret <16 x float> %r
805}
806
807define <16 x i16> @test_insert_128_v16i16(<16 x i16> %x, i16 %y) {
808; KNL-LABEL: test_insert_128_v16i16:
809; KNL:       ## %bb.0:
810; KNL-NEXT:    vmovd %edi, %xmm1
811; KNL-NEXT:    vpbroadcastw %xmm1, %ymm1
812; KNL-NEXT:    vpblendw {{.*#+}} ymm1 = ymm0[0,1],ymm1[2],ymm0[3,4,5,6,7,8,9],ymm1[10],ymm0[11,12,13,14,15]
813; KNL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
814; KNL-NEXT:    retq
815;
816; SKX-LABEL: test_insert_128_v16i16:
817; SKX:       ## %bb.0:
818; SKX-NEXT:    vpbroadcastw %edi, %ymm1
819; SKX-NEXT:    vpblendw {{.*#+}} ymm1 = ymm0[0,1],ymm1[2],ymm0[3,4,5,6,7,8,9],ymm1[10],ymm0[11,12,13,14,15]
820; SKX-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
821; SKX-NEXT:    retq
822  %r = insertelement <16 x i16> %x, i16 %y, i32 10
823  ret <16 x i16> %r
824}
825
826define <32 x i8> @test_insert_128_v32i8(<32 x i8> %x, i8 %y) {
827; CHECK-LABEL: test_insert_128_v32i8:
828; CHECK:       ## %bb.0:
829; CHECK-NEXT:    vextracti128 $1, %ymm0, %xmm1
830; CHECK-NEXT:    vpinsrb $4, %edi, %xmm1, %xmm1
831; CHECK-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
832; CHECK-NEXT:    retq
833  %r = insertelement <32 x i8> %x, i8 %y, i32 20
834  ret <32 x i8> %r
835}
836
837define i32 @test_insertelement_v32i1(i32 %a, i32 %b, <32 x i32> %x , <32 x i32> %y) {
838; KNL-LABEL: test_insertelement_v32i1:
839; KNL:       ## %bb.0:
840; KNL-NEXT:    cmpl %esi, %edi
841; KNL-NEXT:    setb %al
842; KNL-NEXT:    vpcmpltud %zmm3, %zmm1, %k0
843; KNL-NEXT:    kmovw %k0, %ecx
844; KNL-NEXT:    shll $16, %ecx
845; KNL-NEXT:    movw $-17, %dx
846; KNL-NEXT:    kmovw %edx, %k1
847; KNL-NEXT:    vpcmpltud %zmm2, %zmm0, %k0 {%k1}
848; KNL-NEXT:    kmovw %eax, %k1
849; KNL-NEXT:    kshiftlw $15, %k1, %k1
850; KNL-NEXT:    kshiftrw $11, %k1, %k1
851; KNL-NEXT:    korw %k1, %k0, %k0
852; KNL-NEXT:    kmovw %k0, %eax
853; KNL-NEXT:    orl %ecx, %eax
854; KNL-NEXT:    vzeroupper
855; KNL-NEXT:    retq
856;
857; SKX-LABEL: test_insertelement_v32i1:
858; SKX:       ## %bb.0:
859; SKX-NEXT:    cmpl %esi, %edi
860; SKX-NEXT:    setb %al
861; SKX-NEXT:    vpcmpltud %zmm2, %zmm0, %k0
862; SKX-NEXT:    vpcmpltud %zmm3, %zmm1, %k1
863; SKX-NEXT:    kunpckwd %k0, %k1, %k0
864; SKX-NEXT:    movl $-17, %ecx
865; SKX-NEXT:    kmovd %ecx, %k1
866; SKX-NEXT:    kandd %k1, %k0, %k0
867; SKX-NEXT:    kmovd %eax, %k1
868; SKX-NEXT:    kshiftld $31, %k1, %k1
869; SKX-NEXT:    kshiftrd $27, %k1, %k1
870; SKX-NEXT:    kord %k1, %k0, %k0
871; SKX-NEXT:    kmovd %k0, %eax
872; SKX-NEXT:    vzeroupper
873; SKX-NEXT:    retq
874  %cmp_res_i1 = icmp ult i32 %a, %b
875  %cmp_cmp_vec = icmp ult <32 x i32> %x, %y
876  %maskv = insertelement <32 x i1> %cmp_cmp_vec, i1 %cmp_res_i1, i32 4
877  %res = bitcast <32 x i1> %maskv to i32
878  ret i32 %res
879}
880
881define i8 @test_iinsertelement_v4i1(i32 %a, i32 %b, <4 x i32> %x , <4 x i32> %y) {
882; KNL-LABEL: test_iinsertelement_v4i1:
883; KNL:       ## %bb.0:
884; KNL-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
885; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
886; KNL-NEXT:    cmpl %esi, %edi
887; KNL-NEXT:    setb %al
888; KNL-NEXT:    movw $-5, %cx
889; KNL-NEXT:    kmovw %ecx, %k1
890; KNL-NEXT:    vpcmpltud %zmm1, %zmm0, %k0 {%k1}
891; KNL-NEXT:    kmovw %eax, %k1
892; KNL-NEXT:    kshiftlw $15, %k1, %k1
893; KNL-NEXT:    kshiftrw $13, %k1, %k1
894; KNL-NEXT:    korw %k1, %k0, %k0
895; KNL-NEXT:    kmovw %k0, %eax
896; KNL-NEXT:    ## kill: def $al killed $al killed $eax
897; KNL-NEXT:    vzeroupper
898; KNL-NEXT:    retq
899;
900; SKX-LABEL: test_iinsertelement_v4i1:
901; SKX:       ## %bb.0:
902; SKX-NEXT:    cmpl %esi, %edi
903; SKX-NEXT:    setb %al
904; SKX-NEXT:    movb $-5, %cl
905; SKX-NEXT:    kmovd %ecx, %k1
906; SKX-NEXT:    vpcmpltud %xmm1, %xmm0, %k0 {%k1}
907; SKX-NEXT:    kmovd %eax, %k1
908; SKX-NEXT:    kshiftlb $7, %k1, %k1
909; SKX-NEXT:    kshiftrb $5, %k1, %k1
910; SKX-NEXT:    korw %k1, %k0, %k0
911; SKX-NEXT:    kmovd %k0, %eax
912; SKX-NEXT:    ## kill: def $al killed $al killed $eax
913; SKX-NEXT:    retq
914  %cmp_res_i1 = icmp ult i32 %a, %b
915  %cmp_cmp_vec = icmp ult <4 x i32> %x, %y
916  %maskv = insertelement <4 x i1> %cmp_cmp_vec, i1 %cmp_res_i1, i32 2
917  %res0 = shufflevector <4 x i1> %maskv, <4 x i1> undef , <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 4, i32 4, i32 4>
918  %res = bitcast <8 x i1> %res0 to i8
919  ret i8 %res
920}
921
922define i8 @test_iinsertelement_v2i1(i32 %a, i32 %b, <2 x i64> %x , <2 x i64> %y) {
923; KNL-LABEL: test_iinsertelement_v2i1:
924; KNL:       ## %bb.0:
925; KNL-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
926; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
927; KNL-NEXT:    cmpl %esi, %edi
928; KNL-NEXT:    setb %al
929; KNL-NEXT:    vpcmpltuq %zmm1, %zmm0, %k0
930; KNL-NEXT:    kshiftlw $15, %k0, %k0
931; KNL-NEXT:    kshiftrw $15, %k0, %k0
932; KNL-NEXT:    kmovw %eax, %k1
933; KNL-NEXT:    kshiftlw $1, %k1, %k1
934; KNL-NEXT:    korw %k1, %k0, %k0
935; KNL-NEXT:    kmovw %k0, %eax
936; KNL-NEXT:    ## kill: def $al killed $al killed $eax
937; KNL-NEXT:    vzeroupper
938; KNL-NEXT:    retq
939;
940; SKX-LABEL: test_iinsertelement_v2i1:
941; SKX:       ## %bb.0:
942; SKX-NEXT:    cmpl %esi, %edi
943; SKX-NEXT:    setb %al
944; SKX-NEXT:    vpcmpltuq %xmm1, %xmm0, %k0
945; SKX-NEXT:    kshiftlb $7, %k0, %k0
946; SKX-NEXT:    kshiftrb $7, %k0, %k0
947; SKX-NEXT:    kmovd %eax, %k1
948; SKX-NEXT:    kshiftlb $1, %k1, %k1
949; SKX-NEXT:    korw %k1, %k0, %k0
950; SKX-NEXT:    kmovd %k0, %eax
951; SKX-NEXT:    ## kill: def $al killed $al killed $eax
952; SKX-NEXT:    retq
953  %cmp_res_i1 = icmp ult i32 %a, %b
954  %cmp_cmp_vec = icmp ult <2 x i64> %x, %y
955  %maskv = insertelement <2 x i1> %cmp_cmp_vec, i1 %cmp_res_i1, i32 1
956  %res0 = shufflevector <2 x i1> %maskv, <2 x i1> undef , <8 x i32> <i32 0, i32 1, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
957  %res = bitcast <8 x i1> %res0 to i8
958  ret i8 %res
959}
960
961define zeroext i8 @test_extractelement_v2i1(<2 x i64> %a, <2 x i64> %b) {
962; KNL-LABEL: test_extractelement_v2i1:
963; KNL:       ## %bb.0:
964; KNL-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
965; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
966; KNL-NEXT:    vpcmpnleuq %zmm1, %zmm0, %k0
967; KNL-NEXT:    kmovw %k0, %ecx
968; KNL-NEXT:    andl $1, %ecx
969; KNL-NEXT:    movl $4, %eax
970; KNL-NEXT:    subl %ecx, %eax
971; KNL-NEXT:    vzeroupper
972; KNL-NEXT:    retq
973;
974; SKX-LABEL: test_extractelement_v2i1:
975; SKX:       ## %bb.0:
976; SKX-NEXT:    vpcmpnleuq %xmm1, %xmm0, %k0
977; SKX-NEXT:    kmovd %k0, %ecx
978; SKX-NEXT:    andl $1, %ecx
979; SKX-NEXT:    movl $4, %eax
980; SKX-NEXT:    subl %ecx, %eax
981; SKX-NEXT:    retq
982  %t1 = icmp ugt <2 x i64> %a, %b
983  %t2 = extractelement <2 x i1> %t1, i32 0
984  %res = select i1 %t2, i8 3, i8 4
985  ret i8 %res
986}
987
988define zeroext i8 @extractelement_v2i1_alt(<2 x i64> %a, <2 x i64> %b) {
989; KNL-LABEL: extractelement_v2i1_alt:
990; KNL:       ## %bb.0:
991; KNL-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
992; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
993; KNL-NEXT:    vpcmpnleuq %zmm1, %zmm0, %k0
994; KNL-NEXT:    kmovw %k0, %eax
995; KNL-NEXT:    andb $1, %al
996; KNL-NEXT:    movb $4, %cl
997; KNL-NEXT:    subb %al, %cl
998; KNL-NEXT:    movzbl %cl, %eax
999; KNL-NEXT:    vzeroupper
1000; KNL-NEXT:    retq
1001;
1002; SKX-LABEL: extractelement_v2i1_alt:
1003; SKX:       ## %bb.0:
1004; SKX-NEXT:    vpcmpnleuq %xmm1, %xmm0, %k0
1005; SKX-NEXT:    kmovd %k0, %eax
1006; SKX-NEXT:    andb $1, %al
1007; SKX-NEXT:    movb $4, %cl
1008; SKX-NEXT:    subb %al, %cl
1009; SKX-NEXT:    movzbl %cl, %eax
1010; SKX-NEXT:    retq
1011  %t1 = icmp ugt <2 x i64> %a, %b
1012  %t2 = extractelement <2 x i1> %t1, i32 0
1013  %sext = sext i1 %t2 to i8
1014  %res = add i8 %sext, 4
1015  ret i8 %res
1016}
1017
1018define zeroext i8 @test_extractelement_v4i1(<4 x i32> %a, <4 x i32> %b) {
1019; KNL-LABEL: test_extractelement_v4i1:
1020; KNL:       ## %bb.0:
1021; KNL-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
1022; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
1023; KNL-NEXT:    vpcmpnleud %zmm1, %zmm0, %k0
1024; KNL-NEXT:    kshiftrw $3, %k0, %k0
1025; KNL-NEXT:    kmovw %k0, %eax
1026; KNL-NEXT:    andl $1, %eax
1027; KNL-NEXT:    vzeroupper
1028; KNL-NEXT:    retq
1029;
1030; SKX-LABEL: test_extractelement_v4i1:
1031; SKX:       ## %bb.0:
1032; SKX-NEXT:    vpcmpnleud %xmm1, %xmm0, %k0
1033; SKX-NEXT:    kshiftrb $3, %k0, %k0
1034; SKX-NEXT:    kmovd %k0, %eax
1035; SKX-NEXT:    andl $1, %eax
1036; SKX-NEXT:    retq
1037  %t1 = icmp ugt <4 x i32> %a, %b
1038  %t2 = extractelement <4 x i1> %t1, i32 3
1039  %res = zext i1 %t2 to i8
1040  ret i8 %res
1041}
1042
1043define zeroext i8 @test_extractelement_v32i1(<32 x i8> %a, <32 x i8> %b) {
1044; KNL-LABEL: test_extractelement_v32i1:
1045; KNL:       ## %bb.0:
1046; KNL-NEXT:    vpminub %xmm1, %xmm0, %xmm1
1047; KNL-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
1048; KNL-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
1049; KNL-NEXT:    vpmovsxbd %xmm0, %zmm0
1050; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
1051; KNL-NEXT:    kshiftrw $2, %k0, %k0
1052; KNL-NEXT:    kmovw %k0, %eax
1053; KNL-NEXT:    andl $1, %eax
1054; KNL-NEXT:    vzeroupper
1055; KNL-NEXT:    retq
1056;
1057; SKX-LABEL: test_extractelement_v32i1:
1058; SKX:       ## %bb.0:
1059; SKX-NEXT:    vpcmpnleub %ymm1, %ymm0, %k0
1060; SKX-NEXT:    kshiftrd $2, %k0, %k0
1061; SKX-NEXT:    kmovd %k0, %eax
1062; SKX-NEXT:    andl $1, %eax
1063; SKX-NEXT:    vzeroupper
1064; SKX-NEXT:    retq
1065  %t1 = icmp ugt <32 x i8> %a, %b
1066  %t2 = extractelement <32 x i1> %t1, i32 2
1067  %res = zext i1 %t2 to i8
1068  ret i8 %res
1069}
1070
1071define zeroext i8 @test_extractelement_v64i1(<64 x i8> %a, <64 x i8> %b) {
1072; KNL-LABEL: test_extractelement_v64i1:
1073; KNL:       ## %bb.0:
1074; KNL-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
1075; KNL-NEXT:    vextracti128 $1, %ymm1, %xmm1
1076; KNL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0
1077; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm0
1078; KNL-NEXT:    vpminub %xmm1, %xmm0, %xmm1
1079; KNL-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
1080; KNL-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
1081; KNL-NEXT:    vpmovsxbd %xmm0, %zmm0
1082; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
1083; KNL-NEXT:    kshiftrw $15, %k0, %k0
1084; KNL-NEXT:    kmovw %k0, %ecx
1085; KNL-NEXT:    andl $1, %ecx
1086; KNL-NEXT:    movl $4, %eax
1087; KNL-NEXT:    subl %ecx, %eax
1088; KNL-NEXT:    vzeroupper
1089; KNL-NEXT:    retq
1090;
1091; SKX-LABEL: test_extractelement_v64i1:
1092; SKX:       ## %bb.0:
1093; SKX-NEXT:    vpcmpnleub %zmm1, %zmm0, %k0
1094; SKX-NEXT:    kshiftrq $63, %k0, %k0
1095; SKX-NEXT:    kmovd %k0, %ecx
1096; SKX-NEXT:    andl $1, %ecx
1097; SKX-NEXT:    movl $4, %eax
1098; SKX-NEXT:    subl %ecx, %eax
1099; SKX-NEXT:    vzeroupper
1100; SKX-NEXT:    retq
1101  %t1 = icmp ugt <64 x i8> %a, %b
1102  %t2 = extractelement <64 x i1> %t1, i32 63
1103  %res = select i1 %t2, i8 3, i8 4
1104  ret i8 %res
1105}
1106
1107define zeroext i8 @extractelement_v64i1_alt(<64 x i8> %a, <64 x i8> %b) {
1108; KNL-LABEL: extractelement_v64i1_alt:
1109; KNL:       ## %bb.0:
1110; KNL-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
1111; KNL-NEXT:    vextracti128 $1, %ymm1, %xmm1
1112; KNL-NEXT:    vextracti64x4 $1, %zmm0, %ymm0
1113; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm0
1114; KNL-NEXT:    vpminub %xmm1, %xmm0, %xmm1
1115; KNL-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
1116; KNL-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
1117; KNL-NEXT:    vpmovsxbd %xmm0, %zmm0
1118; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
1119; KNL-NEXT:    kshiftrw $15, %k0, %k0
1120; KNL-NEXT:    kmovw %k0, %eax
1121; KNL-NEXT:    andb $1, %al
1122; KNL-NEXT:    movb $4, %cl
1123; KNL-NEXT:    subb %al, %cl
1124; KNL-NEXT:    movzbl %cl, %eax
1125; KNL-NEXT:    vzeroupper
1126; KNL-NEXT:    retq
1127;
1128; SKX-LABEL: extractelement_v64i1_alt:
1129; SKX:       ## %bb.0:
1130; SKX-NEXT:    vpcmpnleub %zmm1, %zmm0, %k0
1131; SKX-NEXT:    kshiftrq $63, %k0, %k0
1132; SKX-NEXT:    kmovd %k0, %eax
1133; SKX-NEXT:    andb $1, %al
1134; SKX-NEXT:    movb $4, %cl
1135; SKX-NEXT:    subb %al, %cl
1136; SKX-NEXT:    movzbl %cl, %eax
1137; SKX-NEXT:    vzeroupper
1138; SKX-NEXT:    retq
1139  %t1 = icmp ugt <64 x i8> %a, %b
1140  %t2 = extractelement <64 x i1> %t1, i32 63
1141  %sext = sext i1 %t2 to i8
1142  %res = add i8 %sext, 4
1143  ret i8 %res
1144}
1145
1146define i64 @test_extractelement_variable_v2i64(<2 x i64> %t1, i32 %index) {
1147; CHECK-LABEL: test_extractelement_variable_v2i64:
1148; CHECK:       ## %bb.0:
1149; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
1150; CHECK-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)
1151; CHECK-NEXT:    andl $1, %edi
1152; CHECK-NEXT:    movq -24(%rsp,%rdi,8), %rax
1153; CHECK-NEXT:    retq
1154  %t2 = extractelement <2 x i64> %t1, i32 %index
1155  ret i64 %t2
1156}
1157
1158define i64 @test_extractelement_variable_v4i64(<4 x i64> %t1, i32 %index) {
1159; CHECK-LABEL: test_extractelement_variable_v4i64:
1160; CHECK:       ## %bb.0:
1161; CHECK-NEXT:    pushq %rbp
1162; CHECK-NEXT:    .cfi_def_cfa_offset 16
1163; CHECK-NEXT:    .cfi_offset %rbp, -16
1164; CHECK-NEXT:    movq %rsp, %rbp
1165; CHECK-NEXT:    .cfi_def_cfa_register %rbp
1166; CHECK-NEXT:    andq $-32, %rsp
1167; CHECK-NEXT:    subq $64, %rsp
1168; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
1169; CHECK-NEXT:    vmovaps %ymm0, (%rsp)
1170; CHECK-NEXT:    andl $3, %edi
1171; CHECK-NEXT:    movq (%rsp,%rdi,8), %rax
1172; CHECK-NEXT:    movq %rbp, %rsp
1173; CHECK-NEXT:    popq %rbp
1174; CHECK-NEXT:    vzeroupper
1175; CHECK-NEXT:    retq
1176  %t2 = extractelement <4 x i64> %t1, i32 %index
1177  ret i64 %t2
1178}
1179
1180define i64 @test_extractelement_variable_v8i64(<8 x i64> %t1, i32 %index) {
1181; CHECK-LABEL: test_extractelement_variable_v8i64:
1182; CHECK:       ## %bb.0:
1183; CHECK-NEXT:    pushq %rbp
1184; CHECK-NEXT:    .cfi_def_cfa_offset 16
1185; CHECK-NEXT:    .cfi_offset %rbp, -16
1186; CHECK-NEXT:    movq %rsp, %rbp
1187; CHECK-NEXT:    .cfi_def_cfa_register %rbp
1188; CHECK-NEXT:    andq $-64, %rsp
1189; CHECK-NEXT:    subq $128, %rsp
1190; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
1191; CHECK-NEXT:    vmovaps %zmm0, (%rsp)
1192; CHECK-NEXT:    andl $7, %edi
1193; CHECK-NEXT:    movq (%rsp,%rdi,8), %rax
1194; CHECK-NEXT:    movq %rbp, %rsp
1195; CHECK-NEXT:    popq %rbp
1196; CHECK-NEXT:    vzeroupper
1197; CHECK-NEXT:    retq
1198  %t2 = extractelement <8 x i64> %t1, i32 %index
1199  ret i64 %t2
1200}
1201
1202define double @test_extractelement_variable_v2f64(<2 x double> %t1, i32 %index) {
1203; CHECK-LABEL: test_extractelement_variable_v2f64:
1204; CHECK:       ## %bb.0:
1205; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
1206; CHECK-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)
1207; CHECK-NEXT:    andl $1, %edi
1208; CHECK-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
1209; CHECK-NEXT:    retq
1210  %t2 = extractelement <2 x double> %t1, i32 %index
1211  ret double %t2
1212}
1213
1214define double @test_extractelement_variable_v4f64(<4 x double> %t1, i32 %index) {
1215; CHECK-LABEL: test_extractelement_variable_v4f64:
1216; CHECK:       ## %bb.0:
1217; CHECK-NEXT:    pushq %rbp
1218; CHECK-NEXT:    .cfi_def_cfa_offset 16
1219; CHECK-NEXT:    .cfi_offset %rbp, -16
1220; CHECK-NEXT:    movq %rsp, %rbp
1221; CHECK-NEXT:    .cfi_def_cfa_register %rbp
1222; CHECK-NEXT:    andq $-32, %rsp
1223; CHECK-NEXT:    subq $64, %rsp
1224; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
1225; CHECK-NEXT:    vmovaps %ymm0, (%rsp)
1226; CHECK-NEXT:    andl $3, %edi
1227; CHECK-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
1228; CHECK-NEXT:    movq %rbp, %rsp
1229; CHECK-NEXT:    popq %rbp
1230; CHECK-NEXT:    vzeroupper
1231; CHECK-NEXT:    retq
1232  %t2 = extractelement <4 x double> %t1, i32 %index
1233  ret double %t2
1234}
1235
1236define double @test_extractelement_variable_v8f64(<8 x double> %t1, i32 %index) {
1237; CHECK-LABEL: test_extractelement_variable_v8f64:
1238; CHECK:       ## %bb.0:
1239; CHECK-NEXT:    pushq %rbp
1240; CHECK-NEXT:    .cfi_def_cfa_offset 16
1241; CHECK-NEXT:    .cfi_offset %rbp, -16
1242; CHECK-NEXT:    movq %rsp, %rbp
1243; CHECK-NEXT:    .cfi_def_cfa_register %rbp
1244; CHECK-NEXT:    andq $-64, %rsp
1245; CHECK-NEXT:    subq $128, %rsp
1246; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
1247; CHECK-NEXT:    vmovaps %zmm0, (%rsp)
1248; CHECK-NEXT:    andl $7, %edi
1249; CHECK-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
1250; CHECK-NEXT:    movq %rbp, %rsp
1251; CHECK-NEXT:    popq %rbp
1252; CHECK-NEXT:    vzeroupper
1253; CHECK-NEXT:    retq
1254  %t2 = extractelement <8 x double> %t1, i32 %index
1255  ret double %t2
1256}
1257
1258define i32 @test_extractelement_variable_v4i32(<4 x i32> %t1, i32 %index) {
1259; CHECK-LABEL: test_extractelement_variable_v4i32:
1260; CHECK:       ## %bb.0:
1261; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
1262; CHECK-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)
1263; CHECK-NEXT:    andl $3, %edi
1264; CHECK-NEXT:    movl -24(%rsp,%rdi,4), %eax
1265; CHECK-NEXT:    retq
1266  %t2 = extractelement <4 x i32> %t1, i32 %index
1267  ret i32 %t2
1268}
1269
1270define i32 @test_extractelement_variable_v8i32(<8 x i32> %t1, i32 %index) {
1271; CHECK-LABEL: test_extractelement_variable_v8i32:
1272; CHECK:       ## %bb.0:
1273; CHECK-NEXT:    pushq %rbp
1274; CHECK-NEXT:    .cfi_def_cfa_offset 16
1275; CHECK-NEXT:    .cfi_offset %rbp, -16
1276; CHECK-NEXT:    movq %rsp, %rbp
1277; CHECK-NEXT:    .cfi_def_cfa_register %rbp
1278; CHECK-NEXT:    andq $-32, %rsp
1279; CHECK-NEXT:    subq $64, %rsp
1280; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
1281; CHECK-NEXT:    vmovaps %ymm0, (%rsp)
1282; CHECK-NEXT:    andl $7, %edi
1283; CHECK-NEXT:    movl (%rsp,%rdi,4), %eax
1284; CHECK-NEXT:    movq %rbp, %rsp
1285; CHECK-NEXT:    popq %rbp
1286; CHECK-NEXT:    vzeroupper
1287; CHECK-NEXT:    retq
1288  %t2 = extractelement <8 x i32> %t1, i32 %index
1289  ret i32 %t2
1290}
1291
1292define i32 @test_extractelement_variable_v16i32(<16 x i32> %t1, i32 %index) {
1293; CHECK-LABEL: test_extractelement_variable_v16i32:
1294; CHECK:       ## %bb.0:
1295; CHECK-NEXT:    pushq %rbp
1296; CHECK-NEXT:    .cfi_def_cfa_offset 16
1297; CHECK-NEXT:    .cfi_offset %rbp, -16
1298; CHECK-NEXT:    movq %rsp, %rbp
1299; CHECK-NEXT:    .cfi_def_cfa_register %rbp
1300; CHECK-NEXT:    andq $-64, %rsp
1301; CHECK-NEXT:    subq $128, %rsp
1302; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
1303; CHECK-NEXT:    vmovaps %zmm0, (%rsp)
1304; CHECK-NEXT:    andl $15, %edi
1305; CHECK-NEXT:    movl (%rsp,%rdi,4), %eax
1306; CHECK-NEXT:    movq %rbp, %rsp
1307; CHECK-NEXT:    popq %rbp
1308; CHECK-NEXT:    vzeroupper
1309; CHECK-NEXT:    retq
1310  %t2 = extractelement <16 x i32> %t1, i32 %index
1311  ret i32 %t2
1312}
1313
1314define float @test_extractelement_variable_v4f32(<4 x float> %t1, i32 %index) {
1315; CHECK-LABEL: test_extractelement_variable_v4f32:
1316; CHECK:       ## %bb.0:
1317; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
1318; CHECK-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)
1319; CHECK-NEXT:    andl $3, %edi
1320; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1321; CHECK-NEXT:    retq
1322  %t2 = extractelement <4 x float> %t1, i32 %index
1323  ret float %t2
1324}
1325
1326define float @test_extractelement_variable_v8f32(<8 x float> %t1, i32 %index) {
1327; CHECK-LABEL: test_extractelement_variable_v8f32:
1328; CHECK:       ## %bb.0:
1329; CHECK-NEXT:    pushq %rbp
1330; CHECK-NEXT:    .cfi_def_cfa_offset 16
1331; CHECK-NEXT:    .cfi_offset %rbp, -16
1332; CHECK-NEXT:    movq %rsp, %rbp
1333; CHECK-NEXT:    .cfi_def_cfa_register %rbp
1334; CHECK-NEXT:    andq $-32, %rsp
1335; CHECK-NEXT:    subq $64, %rsp
1336; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
1337; CHECK-NEXT:    vmovaps %ymm0, (%rsp)
1338; CHECK-NEXT:    andl $7, %edi
1339; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1340; CHECK-NEXT:    movq %rbp, %rsp
1341; CHECK-NEXT:    popq %rbp
1342; CHECK-NEXT:    vzeroupper
1343; CHECK-NEXT:    retq
1344  %t2 = extractelement <8 x float> %t1, i32 %index
1345  ret float %t2
1346}
1347
1348define float @test_extractelement_variable_v16f32(<16 x float> %t1, i32 %index) {
1349; CHECK-LABEL: test_extractelement_variable_v16f32:
1350; CHECK:       ## %bb.0:
1351; CHECK-NEXT:    pushq %rbp
1352; CHECK-NEXT:    .cfi_def_cfa_offset 16
1353; CHECK-NEXT:    .cfi_offset %rbp, -16
1354; CHECK-NEXT:    movq %rsp, %rbp
1355; CHECK-NEXT:    .cfi_def_cfa_register %rbp
1356; CHECK-NEXT:    andq $-64, %rsp
1357; CHECK-NEXT:    subq $128, %rsp
1358; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
1359; CHECK-NEXT:    vmovaps %zmm0, (%rsp)
1360; CHECK-NEXT:    andl $15, %edi
1361; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1362; CHECK-NEXT:    movq %rbp, %rsp
1363; CHECK-NEXT:    popq %rbp
1364; CHECK-NEXT:    vzeroupper
1365; CHECK-NEXT:    retq
1366  %t2 = extractelement <16 x float> %t1, i32 %index
1367  ret float %t2
1368}
1369
1370define i16 @test_extractelement_variable_v8i16(<8 x i16> %t1, i32 %index) {
1371; CHECK-LABEL: test_extractelement_variable_v8i16:
1372; CHECK:       ## %bb.0:
1373; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
1374; CHECK-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)
1375; CHECK-NEXT:    andl $7, %edi
1376; CHECK-NEXT:    movzwl -24(%rsp,%rdi,2), %eax
1377; CHECK-NEXT:    retq
1378  %t2 = extractelement <8 x i16> %t1, i32 %index
1379  ret i16 %t2
1380}
1381
1382define i16 @test_extractelement_variable_v16i16(<16 x i16> %t1, i32 %index) {
1383; CHECK-LABEL: test_extractelement_variable_v16i16:
1384; CHECK:       ## %bb.0:
1385; CHECK-NEXT:    pushq %rbp
1386; CHECK-NEXT:    .cfi_def_cfa_offset 16
1387; CHECK-NEXT:    .cfi_offset %rbp, -16
1388; CHECK-NEXT:    movq %rsp, %rbp
1389; CHECK-NEXT:    .cfi_def_cfa_register %rbp
1390; CHECK-NEXT:    andq $-32, %rsp
1391; CHECK-NEXT:    subq $64, %rsp
1392; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
1393; CHECK-NEXT:    vmovaps %ymm0, (%rsp)
1394; CHECK-NEXT:    andl $15, %edi
1395; CHECK-NEXT:    movzwl (%rsp,%rdi,2), %eax
1396; CHECK-NEXT:    movq %rbp, %rsp
1397; CHECK-NEXT:    popq %rbp
1398; CHECK-NEXT:    vzeroupper
1399; CHECK-NEXT:    retq
1400  %t2 = extractelement <16 x i16> %t1, i32 %index
1401  ret i16 %t2
1402}
1403
1404define i16 @test_extractelement_variable_v32i16(<32 x i16> %t1, i32 %index) {
1405; CHECK-LABEL: test_extractelement_variable_v32i16:
1406; CHECK:       ## %bb.0:
1407; CHECK-NEXT:    pushq %rbp
1408; CHECK-NEXT:    .cfi_def_cfa_offset 16
1409; CHECK-NEXT:    .cfi_offset %rbp, -16
1410; CHECK-NEXT:    movq %rsp, %rbp
1411; CHECK-NEXT:    .cfi_def_cfa_register %rbp
1412; CHECK-NEXT:    andq $-64, %rsp
1413; CHECK-NEXT:    subq $128, %rsp
1414; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
1415; CHECK-NEXT:    vmovaps %zmm0, (%rsp)
1416; CHECK-NEXT:    andl $31, %edi
1417; CHECK-NEXT:    movzwl (%rsp,%rdi,2), %eax
1418; CHECK-NEXT:    movq %rbp, %rsp
1419; CHECK-NEXT:    popq %rbp
1420; CHECK-NEXT:    vzeroupper
1421; CHECK-NEXT:    retq
1422  %t2 = extractelement <32 x i16> %t1, i32 %index
1423  ret i16 %t2
1424}
1425
1426define i8 @test_extractelement_variable_v16i8(<16 x i8> %t1, i32 %index) {
1427; CHECK-LABEL: test_extractelement_variable_v16i8:
1428; CHECK:       ## %bb.0:
1429; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
1430; CHECK-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)
1431; CHECK-NEXT:    andl $15, %edi
1432; CHECK-NEXT:    movb -24(%rsp,%rdi), %al
1433; CHECK-NEXT:    retq
1434  %t2 = extractelement <16 x i8> %t1, i32 %index
1435  ret i8 %t2
1436}
1437
1438define i8 @test_extractelement_variable_v32i8(<32 x i8> %t1, i32 %index) {
1439; CHECK-LABEL: test_extractelement_variable_v32i8:
1440; CHECK:       ## %bb.0:
1441; CHECK-NEXT:    pushq %rbp
1442; CHECK-NEXT:    .cfi_def_cfa_offset 16
1443; CHECK-NEXT:    .cfi_offset %rbp, -16
1444; CHECK-NEXT:    movq %rsp, %rbp
1445; CHECK-NEXT:    .cfi_def_cfa_register %rbp
1446; CHECK-NEXT:    andq $-32, %rsp
1447; CHECK-NEXT:    subq $64, %rsp
1448; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
1449; CHECK-NEXT:    vmovaps %ymm0, (%rsp)
1450; CHECK-NEXT:    andl $31, %edi
1451; CHECK-NEXT:    movb (%rsp,%rdi), %al
1452; CHECK-NEXT:    movq %rbp, %rsp
1453; CHECK-NEXT:    popq %rbp
1454; CHECK-NEXT:    vzeroupper
1455; CHECK-NEXT:    retq
1456
1457  %t2 = extractelement <32 x i8> %t1, i32 %index
1458  ret i8 %t2
1459}
1460
1461define i8 @test_extractelement_variable_v64i8(<64 x i8> %t1, i32 %index) {
1462; CHECK-LABEL: test_extractelement_variable_v64i8:
1463; CHECK:       ## %bb.0:
1464; CHECK-NEXT:    pushq %rbp
1465; CHECK-NEXT:    .cfi_def_cfa_offset 16
1466; CHECK-NEXT:    .cfi_offset %rbp, -16
1467; CHECK-NEXT:    movq %rsp, %rbp
1468; CHECK-NEXT:    .cfi_def_cfa_register %rbp
1469; CHECK-NEXT:    andq $-64, %rsp
1470; CHECK-NEXT:    subq $128, %rsp
1471; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
1472; CHECK-NEXT:    vmovaps %zmm0, (%rsp)
1473; CHECK-NEXT:    andl $63, %edi
1474; CHECK-NEXT:    movb (%rsp,%rdi), %al
1475; CHECK-NEXT:    movq %rbp, %rsp
1476; CHECK-NEXT:    popq %rbp
1477; CHECK-NEXT:    vzeroupper
1478; CHECK-NEXT:    retq
1479
1480  %t2 = extractelement <64 x i8> %t1, i32 %index
1481  ret i8 %t2
1482}
1483
1484define i8 @test_extractelement_variable_v64i8_indexi8(<64 x i8> %t1, i8 %index) {
1485; CHECK-LABEL: test_extractelement_variable_v64i8_indexi8:
1486; CHECK:       ## %bb.0:
1487; CHECK-NEXT:    pushq %rbp
1488; CHECK-NEXT:    .cfi_def_cfa_offset 16
1489; CHECK-NEXT:    .cfi_offset %rbp, -16
1490; CHECK-NEXT:    movq %rsp, %rbp
1491; CHECK-NEXT:    .cfi_def_cfa_register %rbp
1492; CHECK-NEXT:    andq $-64, %rsp
1493; CHECK-NEXT:    subq $128, %rsp
1494; CHECK-NEXT:    addb %dil, %dil
1495; CHECK-NEXT:    vmovaps %zmm0, (%rsp)
1496; CHECK-NEXT:    movzbl %dil, %eax
1497; CHECK-NEXT:    andl $63, %eax
1498; CHECK-NEXT:    movb (%rsp,%rax), %al
1499; CHECK-NEXT:    movq %rbp, %rsp
1500; CHECK-NEXT:    popq %rbp
1501; CHECK-NEXT:    vzeroupper
1502; CHECK-NEXT:    retq
1503
1504  %i  = add i8 %index, %index
1505  %t2 = extractelement <64 x i8> %t1, i8 %i
1506  ret i8 %t2
1507}
1508
1509define zeroext i8 @test_extractelement_varible_v2i1(<2 x i64> %a, <2 x i64> %b, i32 %index) {
1510; KNL-LABEL: test_extractelement_varible_v2i1:
1511; KNL:       ## %bb.0:
1512; KNL-NEXT:    ## kill: def $edi killed $edi def $rdi
1513; KNL-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
1514; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
1515; KNL-NEXT:    vpcmpnleuq %zmm1, %zmm0, %k1
1516; KNL-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1517; KNL-NEXT:    vmovdqa %xmm0, -{{[0-9]+}}(%rsp)
1518; KNL-NEXT:    andl $1, %edi
1519; KNL-NEXT:    movzbl -24(%rsp,%rdi,8), %eax
1520; KNL-NEXT:    andl $1, %eax
1521; KNL-NEXT:    vzeroupper
1522; KNL-NEXT:    retq
1523;
1524; SKX-LABEL: test_extractelement_varible_v2i1:
1525; SKX:       ## %bb.0:
1526; SKX-NEXT:    ## kill: def $edi killed $edi def $rdi
1527; SKX-NEXT:    vpcmpnleuq %xmm1, %xmm0, %k0
1528; SKX-NEXT:    vpmovm2q %k0, %xmm0
1529; SKX-NEXT:    vmovdqa %xmm0, -{{[0-9]+}}(%rsp)
1530; SKX-NEXT:    andl $1, %edi
1531; SKX-NEXT:    movzbl -24(%rsp,%rdi,8), %eax
1532; SKX-NEXT:    andl $1, %eax
1533; SKX-NEXT:    retq
1534  %t1 = icmp ugt <2 x i64> %a, %b
1535  %t2 = extractelement <2 x i1> %t1, i32 %index
1536  %res = zext i1 %t2 to i8
1537  ret i8 %res
1538}
1539
1540define zeroext i8 @test_extractelement_varible_v4i1(<4 x i32> %a, <4 x i32> %b, i32 %index) {
1541; KNL-LABEL: test_extractelement_varible_v4i1:
1542; KNL:       ## %bb.0:
1543; KNL-NEXT:    ## kill: def $edi killed $edi def $rdi
1544; KNL-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
1545; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
1546; KNL-NEXT:    vpcmpnleud %zmm1, %zmm0, %k1
1547; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1548; KNL-NEXT:    vmovdqa %xmm0, -{{[0-9]+}}(%rsp)
1549; KNL-NEXT:    andl $3, %edi
1550; KNL-NEXT:    movzbl -24(%rsp,%rdi,4), %eax
1551; KNL-NEXT:    andl $1, %eax
1552; KNL-NEXT:    vzeroupper
1553; KNL-NEXT:    retq
1554;
1555; SKX-LABEL: test_extractelement_varible_v4i1:
1556; SKX:       ## %bb.0:
1557; SKX-NEXT:    ## kill: def $edi killed $edi def $rdi
1558; SKX-NEXT:    vpcmpnleud %xmm1, %xmm0, %k0
1559; SKX-NEXT:    vpmovm2d %k0, %xmm0
1560; SKX-NEXT:    vmovdqa %xmm0, -{{[0-9]+}}(%rsp)
1561; SKX-NEXT:    andl $3, %edi
1562; SKX-NEXT:    movzbl -24(%rsp,%rdi,4), %eax
1563; SKX-NEXT:    andl $1, %eax
1564; SKX-NEXT:    retq
1565  %t1 = icmp ugt <4 x i32> %a, %b
1566  %t2 = extractelement <4 x i1> %t1, i32 %index
1567  %res = zext i1 %t2 to i8
1568  ret i8 %res
1569}
1570
1571define zeroext i8 @test_extractelement_varible_v8i1(<8 x i32> %a, <8 x i32> %b, i32 %index) {
1572; KNL-LABEL: test_extractelement_varible_v8i1:
1573; KNL:       ## %bb.0:
1574; KNL-NEXT:    ## kill: def $edi killed $edi def $rdi
1575; KNL-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
1576; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
1577; KNL-NEXT:    vpcmpnleud %zmm1, %zmm0, %k1
1578; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1579; KNL-NEXT:    vpmovdw %zmm0, %ymm0
1580; KNL-NEXT:    vmovdqa %xmm0, -{{[0-9]+}}(%rsp)
1581; KNL-NEXT:    andl $7, %edi
1582; KNL-NEXT:    movzbl -24(%rsp,%rdi,2), %eax
1583; KNL-NEXT:    andl $1, %eax
1584; KNL-NEXT:    vzeroupper
1585; KNL-NEXT:    retq
1586;
1587; SKX-LABEL: test_extractelement_varible_v8i1:
1588; SKX:       ## %bb.0:
1589; SKX-NEXT:    ## kill: def $edi killed $edi def $rdi
1590; SKX-NEXT:    vpcmpnleud %ymm1, %ymm0, %k0
1591; SKX-NEXT:    vpmovm2w %k0, %xmm0
1592; SKX-NEXT:    vmovdqa %xmm0, -{{[0-9]+}}(%rsp)
1593; SKX-NEXT:    andl $7, %edi
1594; SKX-NEXT:    movzbl -24(%rsp,%rdi,2), %eax
1595; SKX-NEXT:    andl $1, %eax
1596; SKX-NEXT:    vzeroupper
1597; SKX-NEXT:    retq
1598  %t1 = icmp ugt <8 x i32> %a, %b
1599  %t2 = extractelement <8 x i1> %t1, i32 %index
1600  %res = zext i1 %t2 to i8
1601  ret i8 %res
1602}
1603
1604define zeroext i8 @test_extractelement_varible_v16i1(<16 x i32> %a, <16 x i32> %b, i32 %index) {
1605; KNL-LABEL: test_extractelement_varible_v16i1:
1606; KNL:       ## %bb.0:
1607; KNL-NEXT:    ## kill: def $edi killed $edi def $rdi
1608; KNL-NEXT:    vpcmpnleud %zmm1, %zmm0, %k1
1609; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1610; KNL-NEXT:    vpmovdb %zmm0, -{{[0-9]+}}(%rsp)
1611; KNL-NEXT:    andl $15, %edi
1612; KNL-NEXT:    movzbl -24(%rsp,%rdi), %eax
1613; KNL-NEXT:    andl $1, %eax
1614; KNL-NEXT:    vzeroupper
1615; KNL-NEXT:    retq
1616;
1617; SKX-LABEL: test_extractelement_varible_v16i1:
1618; SKX:       ## %bb.0:
1619; SKX-NEXT:    ## kill: def $edi killed $edi def $rdi
1620; SKX-NEXT:    vpcmpnleud %zmm1, %zmm0, %k0
1621; SKX-NEXT:    vpmovm2b %k0, %xmm0
1622; SKX-NEXT:    vmovdqa %xmm0, -{{[0-9]+}}(%rsp)
1623; SKX-NEXT:    andl $15, %edi
1624; SKX-NEXT:    movzbl -24(%rsp,%rdi), %eax
1625; SKX-NEXT:    andl $1, %eax
1626; SKX-NEXT:    vzeroupper
1627; SKX-NEXT:    retq
1628  %t1 = icmp ugt <16 x i32> %a, %b
1629  %t2 = extractelement <16 x i1> %t1, i32 %index
1630  %res = zext i1 %t2 to i8
1631  ret i8 %res
1632}
1633
1634define zeroext i8 @test_extractelement_varible_v32i1(<32 x i8> %a, <32 x i8> %b, i32 %index) {
1635; KNL-LABEL: test_extractelement_varible_v32i1:
1636; KNL:       ## %bb.0:
1637; KNL-NEXT:    vpminub %ymm1, %ymm0, %ymm1
1638; KNL-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
1639; KNL-NEXT:    vpmovmskb %ymm0, %ecx
1640; KNL-NEXT:    xorl %eax, %eax
1641; KNL-NEXT:    btl %edi, %ecx
1642; KNL-NEXT:    setae %al
1643; KNL-NEXT:    vzeroupper
1644; KNL-NEXT:    retq
1645;
1646; SKX-LABEL: test_extractelement_varible_v32i1:
1647; SKX:       ## %bb.0:
1648; SKX-NEXT:    pushq %rbp
1649; SKX-NEXT:    .cfi_def_cfa_offset 16
1650; SKX-NEXT:    .cfi_offset %rbp, -16
1651; SKX-NEXT:    movq %rsp, %rbp
1652; SKX-NEXT:    .cfi_def_cfa_register %rbp
1653; SKX-NEXT:    andq $-32, %rsp
1654; SKX-NEXT:    subq $64, %rsp
1655; SKX-NEXT:    ## kill: def $edi killed $edi def $rdi
1656; SKX-NEXT:    vpcmpnleub %ymm1, %ymm0, %k0
1657; SKX-NEXT:    vpmovm2b %k0, %ymm0
1658; SKX-NEXT:    vmovdqa %ymm0, (%rsp)
1659; SKX-NEXT:    andl $31, %edi
1660; SKX-NEXT:    movzbl (%rsp,%rdi), %eax
1661; SKX-NEXT:    andl $1, %eax
1662; SKX-NEXT:    movq %rbp, %rsp
1663; SKX-NEXT:    popq %rbp
1664; SKX-NEXT:    vzeroupper
1665; SKX-NEXT:    retq
1666  %t1 = icmp ugt <32 x i8> %a, %b
1667  %t2 = extractelement <32 x i1> %t1, i32 %index
1668  %res = zext i1 %t2 to i8
1669  ret i8 %res
1670}
1671
1672define <8 x i64> @insert_double_zero(<2 x i64> %a) nounwind {
1673; CHECK-LABEL: insert_double_zero:
1674; CHECK:       ## %bb.0:
1675; CHECK-NEXT:    vxorps %xmm1, %xmm1, %xmm1
1676; CHECK-NEXT:    vinsertf32x4 $2, %xmm0, %zmm1, %zmm0
1677; CHECK-NEXT:    retq
1678  %b = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1679  %d = shufflevector <4 x i64> %b, <4 x i64> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1680  %e = shufflevector <8 x i64> %d, <8 x i64> zeroinitializer, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 0, i32 1, i32 2, i32 3>
1681  ret <8 x i64> %e
1682}
1683
1684define i32 @test_insertelement_variable_v32i1(<32 x i8> %a, i8 %b, i32 %index) {
1685; KNL-LABEL: test_insertelement_variable_v32i1:
1686; KNL:       ## %bb.0:
1687; KNL-NEXT:    pushq %rbp
1688; KNL-NEXT:    .cfi_def_cfa_offset 16
1689; KNL-NEXT:    .cfi_offset %rbp, -16
1690; KNL-NEXT:    movq %rsp, %rbp
1691; KNL-NEXT:    .cfi_def_cfa_register %rbp
1692; KNL-NEXT:    andq $-32, %rsp
1693; KNL-NEXT:    subq $64, %rsp
1694; KNL-NEXT:    ## kill: def $esi killed $esi def $rsi
1695; KNL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1696; KNL-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
1697; KNL-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
1698; KNL-NEXT:    andl $31, %esi
1699; KNL-NEXT:    testb %dil, %dil
1700; KNL-NEXT:    vmovdqa %ymm0, (%rsp)
1701; KNL-NEXT:    setne (%rsp,%rsi)
1702; KNL-NEXT:    vpmovsxbd (%rsp), %zmm0
1703; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
1704; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
1705; KNL-NEXT:    kmovw %k0, %ecx
1706; KNL-NEXT:    vpmovsxbd {{[0-9]+}}(%rsp), %zmm0
1707; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
1708; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
1709; KNL-NEXT:    kmovw %k0, %eax
1710; KNL-NEXT:    shll $16, %eax
1711; KNL-NEXT:    orl %ecx, %eax
1712; KNL-NEXT:    movq %rbp, %rsp
1713; KNL-NEXT:    popq %rbp
1714; KNL-NEXT:    vzeroupper
1715; KNL-NEXT:    retq
1716;
1717; SKX-LABEL: test_insertelement_variable_v32i1:
1718; SKX:       ## %bb.0:
1719; SKX-NEXT:    vptestmb %ymm0, %ymm0, %k0
1720; SKX-NEXT:    testb %dil, %dil
1721; SKX-NEXT:    setne %al
1722; SKX-NEXT:    vpbroadcastb %esi, %ymm0
1723; SKX-NEXT:    vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %k1
1724; SKX-NEXT:    vpmovm2b %k0, %ymm0
1725; SKX-NEXT:    vpbroadcastb %eax, %ymm0 {%k1}
1726; SKX-NEXT:    vpsllw $7, %ymm0, %ymm0
1727; SKX-NEXT:    vpmovb2m %ymm0, %k0
1728; SKX-NEXT:    kmovd %k0, %eax
1729; SKX-NEXT:    vzeroupper
1730; SKX-NEXT:    retq
1731  %t1 = icmp ugt <32 x i8> %a, zeroinitializer
1732  %t2 = icmp ugt i8 %b, 0
1733  %t3 = insertelement <32 x i1> %t1, i1 %t2, i32 %index
1734  %t4 = bitcast <32 x i1> %t3 to i32
1735  ret i32 %t4
1736}
1737
1738define i64 @test_insertelement_variable_v64i1(<64 x i8> %a, i8 %b, i32 %index) {
1739; KNL-LABEL: test_insertelement_variable_v64i1:
1740; KNL:       ## %bb.0:
1741; KNL-NEXT:    pushq %rbp
1742; KNL-NEXT:    .cfi_def_cfa_offset 16
1743; KNL-NEXT:    .cfi_offset %rbp, -16
1744; KNL-NEXT:    movq %rsp, %rbp
1745; KNL-NEXT:    .cfi_def_cfa_register %rbp
1746; KNL-NEXT:    andq $-64, %rsp
1747; KNL-NEXT:    subq $128, %rsp
1748; KNL-NEXT:    ## kill: def $esi killed $esi def $rsi
1749; KNL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1750; KNL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1751; KNL-NEXT:    vpcmpeqb %ymm2, %ymm1, %ymm1
1752; KNL-NEXT:    vpcmpeqb %ymm2, %ymm0, %ymm0
1753; KNL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
1754; KNL-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
1755; KNL-NEXT:    andl $63, %esi
1756; KNL-NEXT:    testb %dil, %dil
1757; KNL-NEXT:    vmovdqa64 %zmm0, (%rsp)
1758; KNL-NEXT:    setne (%rsp,%rsi)
1759; KNL-NEXT:    vpmovsxbd (%rsp), %zmm0
1760; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
1761; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
1762; KNL-NEXT:    kmovw %k0, %eax
1763; KNL-NEXT:    vpmovsxbd {{[0-9]+}}(%rsp), %zmm0
1764; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
1765; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
1766; KNL-NEXT:    kmovw %k0, %ecx
1767; KNL-NEXT:    shll $16, %ecx
1768; KNL-NEXT:    orl %eax, %ecx
1769; KNL-NEXT:    vpmovsxbd {{[0-9]+}}(%rsp), %zmm0
1770; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
1771; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
1772; KNL-NEXT:    kmovw %k0, %edx
1773; KNL-NEXT:    vpmovsxbd {{[0-9]+}}(%rsp), %zmm0
1774; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
1775; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
1776; KNL-NEXT:    kmovw %k0, %eax
1777; KNL-NEXT:    shll $16, %eax
1778; KNL-NEXT:    orl %edx, %eax
1779; KNL-NEXT:    shlq $32, %rax
1780; KNL-NEXT:    orq %rcx, %rax
1781; KNL-NEXT:    movq %rbp, %rsp
1782; KNL-NEXT:    popq %rbp
1783; KNL-NEXT:    vzeroupper
1784; KNL-NEXT:    retq
1785;
1786; SKX-LABEL: test_insertelement_variable_v64i1:
1787; SKX:       ## %bb.0:
1788; SKX-NEXT:    vptestmb %zmm0, %zmm0, %k0
1789; SKX-NEXT:    testb %dil, %dil
1790; SKX-NEXT:    setne %al
1791; SKX-NEXT:    vpbroadcastb %esi, %zmm0
1792; SKX-NEXT:    vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k1
1793; SKX-NEXT:    vpmovm2b %k0, %zmm0
1794; SKX-NEXT:    vpbroadcastb %eax, %zmm0 {%k1}
1795; SKX-NEXT:    vpsllw $7, %zmm0, %zmm0
1796; SKX-NEXT:    vpmovb2m %zmm0, %k0
1797; SKX-NEXT:    kmovq %k0, %rax
1798; SKX-NEXT:    vzeroupper
1799; SKX-NEXT:    retq
1800  %t1 = icmp ugt <64 x i8> %a, zeroinitializer
1801  %t2 = icmp ugt i8 %b, 0
1802  %t3 = insertelement <64 x i1> %t1, i1 %t2, i32 %index
1803  %t4 = bitcast <64 x i1> %t3 to i64
1804  ret i64 %t4
1805}
1806
1807define i96 @test_insertelement_variable_v96i1(<96 x i8> %a, i8 %b, i32 %index) {
1808; KNL-LABEL: test_insertelement_variable_v96i1:
1809; KNL:       ## %bb.0:
1810; KNL-NEXT:    pushq %rbp
1811; KNL-NEXT:    .cfi_def_cfa_offset 16
1812; KNL-NEXT:    .cfi_offset %rbp, -16
1813; KNL-NEXT:    movq %rsp, %rbp
1814; KNL-NEXT:    .cfi_def_cfa_register %rbp
1815; KNL-NEXT:    andq $-64, %rsp
1816; KNL-NEXT:    subq $192, %rsp
1817; KNL-NEXT:    movl 744(%rbp), %eax
1818; KNL-NEXT:    andl $127, %eax
1819; KNL-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1820; KNL-NEXT:    vpinsrb $1, 232(%rbp), %xmm0, %xmm0
1821; KNL-NEXT:    vpinsrb $2, 240(%rbp), %xmm0, %xmm0
1822; KNL-NEXT:    vpinsrb $3, 248(%rbp), %xmm0, %xmm0
1823; KNL-NEXT:    vpinsrb $4, 256(%rbp), %xmm0, %xmm0
1824; KNL-NEXT:    vpinsrb $5, 264(%rbp), %xmm0, %xmm0
1825; KNL-NEXT:    vpinsrb $6, 272(%rbp), %xmm0, %xmm0
1826; KNL-NEXT:    vpinsrb $7, 280(%rbp), %xmm0, %xmm0
1827; KNL-NEXT:    vpinsrb $8, 288(%rbp), %xmm0, %xmm0
1828; KNL-NEXT:    vpinsrb $9, 296(%rbp), %xmm0, %xmm0
1829; KNL-NEXT:    vpinsrb $10, 304(%rbp), %xmm0, %xmm0
1830; KNL-NEXT:    vpinsrb $11, 312(%rbp), %xmm0, %xmm0
1831; KNL-NEXT:    vpinsrb $12, 320(%rbp), %xmm0, %xmm0
1832; KNL-NEXT:    vpinsrb $13, 328(%rbp), %xmm0, %xmm0
1833; KNL-NEXT:    vpinsrb $14, 336(%rbp), %xmm0, %xmm0
1834; KNL-NEXT:    vpinsrb $15, 344(%rbp), %xmm0, %xmm0
1835; KNL-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
1836; KNL-NEXT:    vpinsrb $1, 360(%rbp), %xmm1, %xmm1
1837; KNL-NEXT:    vpinsrb $2, 368(%rbp), %xmm1, %xmm1
1838; KNL-NEXT:    vpinsrb $3, 376(%rbp), %xmm1, %xmm1
1839; KNL-NEXT:    vpinsrb $4, 384(%rbp), %xmm1, %xmm1
1840; KNL-NEXT:    vpinsrb $5, 392(%rbp), %xmm1, %xmm1
1841; KNL-NEXT:    vpinsrb $6, 400(%rbp), %xmm1, %xmm1
1842; KNL-NEXT:    vpinsrb $7, 408(%rbp), %xmm1, %xmm1
1843; KNL-NEXT:    vpinsrb $8, 416(%rbp), %xmm1, %xmm1
1844; KNL-NEXT:    vpinsrb $9, 424(%rbp), %xmm1, %xmm1
1845; KNL-NEXT:    vpinsrb $10, 432(%rbp), %xmm1, %xmm1
1846; KNL-NEXT:    vpinsrb $11, 440(%rbp), %xmm1, %xmm1
1847; KNL-NEXT:    vpinsrb $12, 448(%rbp), %xmm1, %xmm1
1848; KNL-NEXT:    vpinsrb $13, 456(%rbp), %xmm1, %xmm1
1849; KNL-NEXT:    vpinsrb $14, 464(%rbp), %xmm1, %xmm1
1850; KNL-NEXT:    vpinsrb $15, 472(%rbp), %xmm1, %xmm1
1851; KNL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm1
1852; KNL-NEXT:    vpxor %xmm0, %xmm0, %xmm0
1853; KNL-NEXT:    vpcmpeqb %ymm0, %ymm1, %ymm1
1854; KNL-NEXT:    vmovd %edi, %xmm2
1855; KNL-NEXT:    vpinsrb $1, %esi, %xmm2, %xmm2
1856; KNL-NEXT:    vpinsrb $2, %edx, %xmm2, %xmm2
1857; KNL-NEXT:    vpinsrb $3, %ecx, %xmm2, %xmm2
1858; KNL-NEXT:    vpinsrb $4, %r8d, %xmm2, %xmm2
1859; KNL-NEXT:    vpinsrb $5, %r9d, %xmm2, %xmm2
1860; KNL-NEXT:    vpinsrb $6, 16(%rbp), %xmm2, %xmm2
1861; KNL-NEXT:    vpinsrb $7, 24(%rbp), %xmm2, %xmm2
1862; KNL-NEXT:    vpinsrb $8, 32(%rbp), %xmm2, %xmm2
1863; KNL-NEXT:    vpinsrb $9, 40(%rbp), %xmm2, %xmm2
1864; KNL-NEXT:    vpinsrb $10, 48(%rbp), %xmm2, %xmm2
1865; KNL-NEXT:    vpinsrb $11, 56(%rbp), %xmm2, %xmm2
1866; KNL-NEXT:    vpinsrb $12, 64(%rbp), %xmm2, %xmm2
1867; KNL-NEXT:    vpinsrb $13, 72(%rbp), %xmm2, %xmm2
1868; KNL-NEXT:    vpinsrb $14, 80(%rbp), %xmm2, %xmm2
1869; KNL-NEXT:    vpinsrb $15, 88(%rbp), %xmm2, %xmm2
1870; KNL-NEXT:    vmovd {{.*#+}} xmm3 = mem[0],zero,zero,zero
1871; KNL-NEXT:    vpinsrb $1, 104(%rbp), %xmm3, %xmm3
1872; KNL-NEXT:    vpinsrb $2, 112(%rbp), %xmm3, %xmm3
1873; KNL-NEXT:    vpinsrb $3, 120(%rbp), %xmm3, %xmm3
1874; KNL-NEXT:    vpinsrb $4, 128(%rbp), %xmm3, %xmm3
1875; KNL-NEXT:    vpinsrb $5, 136(%rbp), %xmm3, %xmm3
1876; KNL-NEXT:    vpinsrb $6, 144(%rbp), %xmm3, %xmm3
1877; KNL-NEXT:    vpinsrb $7, 152(%rbp), %xmm3, %xmm3
1878; KNL-NEXT:    vpinsrb $8, 160(%rbp), %xmm3, %xmm3
1879; KNL-NEXT:    vpinsrb $9, 168(%rbp), %xmm3, %xmm3
1880; KNL-NEXT:    vpinsrb $10, 176(%rbp), %xmm3, %xmm3
1881; KNL-NEXT:    vpinsrb $11, 184(%rbp), %xmm3, %xmm3
1882; KNL-NEXT:    vpinsrb $12, 192(%rbp), %xmm3, %xmm3
1883; KNL-NEXT:    vpinsrb $13, 200(%rbp), %xmm3, %xmm3
1884; KNL-NEXT:    vpinsrb $14, 208(%rbp), %xmm3, %xmm3
1885; KNL-NEXT:    vpinsrb $15, 216(%rbp), %xmm3, %xmm3
1886; KNL-NEXT:    vinserti128 $1, %xmm3, %ymm2, %ymm2
1887; KNL-NEXT:    vpcmpeqb %ymm0, %ymm2, %ymm2
1888; KNL-NEXT:    vinserti64x4 $1, %ymm1, %zmm2, %zmm1
1889; KNL-NEXT:    vpternlogq $15, %zmm1, %zmm1, %zmm1
1890; KNL-NEXT:    vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero
1891; KNL-NEXT:    vpinsrb $1, 488(%rbp), %xmm2, %xmm2
1892; KNL-NEXT:    vpinsrb $2, 496(%rbp), %xmm2, %xmm2
1893; KNL-NEXT:    vpinsrb $3, 504(%rbp), %xmm2, %xmm2
1894; KNL-NEXT:    vpinsrb $4, 512(%rbp), %xmm2, %xmm2
1895; KNL-NEXT:    vpinsrb $5, 520(%rbp), %xmm2, %xmm2
1896; KNL-NEXT:    vpinsrb $6, 528(%rbp), %xmm2, %xmm2
1897; KNL-NEXT:    vpinsrb $7, 536(%rbp), %xmm2, %xmm2
1898; KNL-NEXT:    vpinsrb $8, 544(%rbp), %xmm2, %xmm2
1899; KNL-NEXT:    vpinsrb $9, 552(%rbp), %xmm2, %xmm2
1900; KNL-NEXT:    vpinsrb $10, 560(%rbp), %xmm2, %xmm2
1901; KNL-NEXT:    vpinsrb $11, 568(%rbp), %xmm2, %xmm2
1902; KNL-NEXT:    vpinsrb $12, 576(%rbp), %xmm2, %xmm2
1903; KNL-NEXT:    vpinsrb $13, 584(%rbp), %xmm2, %xmm2
1904; KNL-NEXT:    vpinsrb $14, 592(%rbp), %xmm2, %xmm2
1905; KNL-NEXT:    vpinsrb $15, 600(%rbp), %xmm2, %xmm2
1906; KNL-NEXT:    vmovd {{.*#+}} xmm3 = mem[0],zero,zero,zero
1907; KNL-NEXT:    vpinsrb $1, 616(%rbp), %xmm3, %xmm3
1908; KNL-NEXT:    vpinsrb $2, 624(%rbp), %xmm3, %xmm3
1909; KNL-NEXT:    vpinsrb $3, 632(%rbp), %xmm3, %xmm3
1910; KNL-NEXT:    vpinsrb $4, 640(%rbp), %xmm3, %xmm3
1911; KNL-NEXT:    vpinsrb $5, 648(%rbp), %xmm3, %xmm3
1912; KNL-NEXT:    vpinsrb $6, 656(%rbp), %xmm3, %xmm3
1913; KNL-NEXT:    vpinsrb $7, 664(%rbp), %xmm3, %xmm3
1914; KNL-NEXT:    vpinsrb $8, 672(%rbp), %xmm3, %xmm3
1915; KNL-NEXT:    vpinsrb $9, 680(%rbp), %xmm3, %xmm3
1916; KNL-NEXT:    vpinsrb $10, 688(%rbp), %xmm3, %xmm3
1917; KNL-NEXT:    vpinsrb $11, 696(%rbp), %xmm3, %xmm3
1918; KNL-NEXT:    vpinsrb $12, 704(%rbp), %xmm3, %xmm3
1919; KNL-NEXT:    vpinsrb $13, 712(%rbp), %xmm3, %xmm3
1920; KNL-NEXT:    vpinsrb $14, 720(%rbp), %xmm3, %xmm3
1921; KNL-NEXT:    vpinsrb $15, 728(%rbp), %xmm3, %xmm3
1922; KNL-NEXT:    vinserti128 $1, %xmm3, %ymm2, %ymm2
1923; KNL-NEXT:    vpcmpeqb %ymm0, %ymm2, %ymm0
1924; KNL-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
1925; KNL-NEXT:    cmpb $0, 736(%rbp)
1926; KNL-NEXT:    vmovdqa %ymm0, {{[0-9]+}}(%rsp)
1927; KNL-NEXT:    vmovdqa64 %zmm1, (%rsp)
1928; KNL-NEXT:    setne (%rsp,%rax)
1929; KNL-NEXT:    vpmovsxbd (%rsp), %zmm0
1930; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
1931; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
1932; KNL-NEXT:    kmovw %k0, %eax
1933; KNL-NEXT:    vpmovsxbd {{[0-9]+}}(%rsp), %zmm0
1934; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
1935; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
1936; KNL-NEXT:    kmovw %k0, %ecx
1937; KNL-NEXT:    shll $16, %ecx
1938; KNL-NEXT:    orl %eax, %ecx
1939; KNL-NEXT:    vpmovsxbd {{[0-9]+}}(%rsp), %zmm0
1940; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
1941; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
1942; KNL-NEXT:    kmovw %k0, %edx
1943; KNL-NEXT:    vpmovsxbd {{[0-9]+}}(%rsp), %zmm0
1944; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
1945; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
1946; KNL-NEXT:    kmovw %k0, %eax
1947; KNL-NEXT:    shll $16, %eax
1948; KNL-NEXT:    orl %edx, %eax
1949; KNL-NEXT:    shlq $32, %rax
1950; KNL-NEXT:    orq %rcx, %rax
1951; KNL-NEXT:    vpmovsxbd {{[0-9]+}}(%rsp), %zmm0
1952; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
1953; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
1954; KNL-NEXT:    kmovw %k0, %ecx
1955; KNL-NEXT:    vpmovsxbd {{[0-9]+}}(%rsp), %zmm0
1956; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
1957; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
1958; KNL-NEXT:    kmovw %k0, %esi
1959; KNL-NEXT:    shll $16, %esi
1960; KNL-NEXT:    orl %ecx, %esi
1961; KNL-NEXT:    vpmovsxbd {{[0-9]+}}(%rsp), %zmm0
1962; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
1963; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
1964; KNL-NEXT:    kmovw %k0, %ecx
1965; KNL-NEXT:    vpmovsxbd {{[0-9]+}}(%rsp), %zmm0
1966; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
1967; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
1968; KNL-NEXT:    kmovw %k0, %edx
1969; KNL-NEXT:    shll $16, %edx
1970; KNL-NEXT:    orl %ecx, %edx
1971; KNL-NEXT:    shlq $32, %rdx
1972; KNL-NEXT:    orq %rsi, %rdx
1973; KNL-NEXT:    movq %rbp, %rsp
1974; KNL-NEXT:    popq %rbp
1975; KNL-NEXT:    vzeroupper
1976; KNL-NEXT:    retq
1977;
1978; SKX-LABEL: test_insertelement_variable_v96i1:
1979; SKX:       ## %bb.0:
1980; SKX-NEXT:    pushq %rbp
1981; SKX-NEXT:    .cfi_def_cfa_offset 16
1982; SKX-NEXT:    .cfi_offset %rbp, -16
1983; SKX-NEXT:    movq %rsp, %rbp
1984; SKX-NEXT:    .cfi_def_cfa_register %rbp
1985; SKX-NEXT:    andq $-64, %rsp
1986; SKX-NEXT:    subq $192, %rsp
1987; SKX-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1988; SKX-NEXT:    vpinsrb $1, 232(%rbp), %xmm0, %xmm0
1989; SKX-NEXT:    vpinsrb $2, 240(%rbp), %xmm0, %xmm0
1990; SKX-NEXT:    vpinsrb $3, 248(%rbp), %xmm0, %xmm0
1991; SKX-NEXT:    vpinsrb $4, 256(%rbp), %xmm0, %xmm0
1992; SKX-NEXT:    vpinsrb $5, 264(%rbp), %xmm0, %xmm0
1993; SKX-NEXT:    vpinsrb $6, 272(%rbp), %xmm0, %xmm0
1994; SKX-NEXT:    vpinsrb $7, 280(%rbp), %xmm0, %xmm0
1995; SKX-NEXT:    vpinsrb $8, 288(%rbp), %xmm0, %xmm0
1996; SKX-NEXT:    vpinsrb $9, 296(%rbp), %xmm0, %xmm0
1997; SKX-NEXT:    vpinsrb $10, 304(%rbp), %xmm0, %xmm0
1998; SKX-NEXT:    vpinsrb $11, 312(%rbp), %xmm0, %xmm0
1999; SKX-NEXT:    vpinsrb $12, 320(%rbp), %xmm0, %xmm0
2000; SKX-NEXT:    vpinsrb $13, 328(%rbp), %xmm0, %xmm0
2001; SKX-NEXT:    vpinsrb $14, 336(%rbp), %xmm0, %xmm0
2002; SKX-NEXT:    vpinsrb $15, 344(%rbp), %xmm0, %xmm0
2003; SKX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2004; SKX-NEXT:    vpinsrb $1, 360(%rbp), %xmm1, %xmm1
2005; SKX-NEXT:    vpinsrb $2, 368(%rbp), %xmm1, %xmm1
2006; SKX-NEXT:    vpinsrb $3, 376(%rbp), %xmm1, %xmm1
2007; SKX-NEXT:    vpinsrb $4, 384(%rbp), %xmm1, %xmm1
2008; SKX-NEXT:    vpinsrb $5, 392(%rbp), %xmm1, %xmm1
2009; SKX-NEXT:    vpinsrb $6, 400(%rbp), %xmm1, %xmm1
2010; SKX-NEXT:    vpinsrb $7, 408(%rbp), %xmm1, %xmm1
2011; SKX-NEXT:    vpinsrb $8, 416(%rbp), %xmm1, %xmm1
2012; SKX-NEXT:    vpinsrb $9, 424(%rbp), %xmm1, %xmm1
2013; SKX-NEXT:    vpinsrb $10, 432(%rbp), %xmm1, %xmm1
2014; SKX-NEXT:    vpinsrb $11, 440(%rbp), %xmm1, %xmm1
2015; SKX-NEXT:    vpinsrb $12, 448(%rbp), %xmm1, %xmm1
2016; SKX-NEXT:    vpinsrb $13, 456(%rbp), %xmm1, %xmm1
2017; SKX-NEXT:    vpinsrb $14, 464(%rbp), %xmm1, %xmm1
2018; SKX-NEXT:    vpinsrb $15, 472(%rbp), %xmm1, %xmm1
2019; SKX-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
2020; SKX-NEXT:    vmovd %edi, %xmm1
2021; SKX-NEXT:    vpinsrb $1, %esi, %xmm1, %xmm1
2022; SKX-NEXT:    vpinsrb $2, %edx, %xmm1, %xmm1
2023; SKX-NEXT:    vpinsrb $3, %ecx, %xmm1, %xmm1
2024; SKX-NEXT:    vpinsrb $4, %r8d, %xmm1, %xmm1
2025; SKX-NEXT:    vpinsrb $5, %r9d, %xmm1, %xmm1
2026; SKX-NEXT:    vpinsrb $6, 16(%rbp), %xmm1, %xmm1
2027; SKX-NEXT:    vpinsrb $7, 24(%rbp), %xmm1, %xmm1
2028; SKX-NEXT:    vpinsrb $8, 32(%rbp), %xmm1, %xmm1
2029; SKX-NEXT:    vpinsrb $9, 40(%rbp), %xmm1, %xmm1
2030; SKX-NEXT:    vpinsrb $10, 48(%rbp), %xmm1, %xmm1
2031; SKX-NEXT:    vpinsrb $11, 56(%rbp), %xmm1, %xmm1
2032; SKX-NEXT:    vpinsrb $12, 64(%rbp), %xmm1, %xmm1
2033; SKX-NEXT:    vpinsrb $13, 72(%rbp), %xmm1, %xmm1
2034; SKX-NEXT:    vpinsrb $14, 80(%rbp), %xmm1, %xmm1
2035; SKX-NEXT:    vpinsrb $15, 88(%rbp), %xmm1, %xmm1
2036; SKX-NEXT:    vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero
2037; SKX-NEXT:    vpinsrb $1, 104(%rbp), %xmm2, %xmm2
2038; SKX-NEXT:    vpinsrb $2, 112(%rbp), %xmm2, %xmm2
2039; SKX-NEXT:    vpinsrb $3, 120(%rbp), %xmm2, %xmm2
2040; SKX-NEXT:    vpinsrb $4, 128(%rbp), %xmm2, %xmm2
2041; SKX-NEXT:    vpinsrb $5, 136(%rbp), %xmm2, %xmm2
2042; SKX-NEXT:    vpinsrb $6, 144(%rbp), %xmm2, %xmm2
2043; SKX-NEXT:    vpinsrb $7, 152(%rbp), %xmm2, %xmm2
2044; SKX-NEXT:    vpinsrb $8, 160(%rbp), %xmm2, %xmm2
2045; SKX-NEXT:    vpinsrb $9, 168(%rbp), %xmm2, %xmm2
2046; SKX-NEXT:    vpinsrb $10, 176(%rbp), %xmm2, %xmm2
2047; SKX-NEXT:    vpinsrb $11, 184(%rbp), %xmm2, %xmm2
2048; SKX-NEXT:    vpinsrb $12, 192(%rbp), %xmm2, %xmm2
2049; SKX-NEXT:    vpinsrb $13, 200(%rbp), %xmm2, %xmm2
2050; SKX-NEXT:    vpinsrb $14, 208(%rbp), %xmm2, %xmm2
2051; SKX-NEXT:    vpinsrb $15, 216(%rbp), %xmm2, %xmm2
2052; SKX-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
2053; SKX-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
2054; SKX-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2055; SKX-NEXT:    vpinsrb $1, 488(%rbp), %xmm1, %xmm1
2056; SKX-NEXT:    vpinsrb $2, 496(%rbp), %xmm1, %xmm1
2057; SKX-NEXT:    vpinsrb $3, 504(%rbp), %xmm1, %xmm1
2058; SKX-NEXT:    vpinsrb $4, 512(%rbp), %xmm1, %xmm1
2059; SKX-NEXT:    vpinsrb $5, 520(%rbp), %xmm1, %xmm1
2060; SKX-NEXT:    vpinsrb $6, 528(%rbp), %xmm1, %xmm1
2061; SKX-NEXT:    vpinsrb $7, 536(%rbp), %xmm1, %xmm1
2062; SKX-NEXT:    vpinsrb $8, 544(%rbp), %xmm1, %xmm1
2063; SKX-NEXT:    vpinsrb $9, 552(%rbp), %xmm1, %xmm1
2064; SKX-NEXT:    vpinsrb $10, 560(%rbp), %xmm1, %xmm1
2065; SKX-NEXT:    vpinsrb $11, 568(%rbp), %xmm1, %xmm1
2066; SKX-NEXT:    vpinsrb $12, 576(%rbp), %xmm1, %xmm1
2067; SKX-NEXT:    vpinsrb $13, 584(%rbp), %xmm1, %xmm1
2068; SKX-NEXT:    vpinsrb $14, 592(%rbp), %xmm1, %xmm1
2069; SKX-NEXT:    vpinsrb $15, 600(%rbp), %xmm1, %xmm1
2070; SKX-NEXT:    vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero
2071; SKX-NEXT:    vpinsrb $1, 616(%rbp), %xmm2, %xmm2
2072; SKX-NEXT:    vpinsrb $2, 624(%rbp), %xmm2, %xmm2
2073; SKX-NEXT:    vpinsrb $3, 632(%rbp), %xmm2, %xmm2
2074; SKX-NEXT:    vpinsrb $4, 640(%rbp), %xmm2, %xmm2
2075; SKX-NEXT:    vpinsrb $5, 648(%rbp), %xmm2, %xmm2
2076; SKX-NEXT:    vpinsrb $6, 656(%rbp), %xmm2, %xmm2
2077; SKX-NEXT:    vpinsrb $7, 664(%rbp), %xmm2, %xmm2
2078; SKX-NEXT:    vpinsrb $8, 672(%rbp), %xmm2, %xmm2
2079; SKX-NEXT:    vpinsrb $9, 680(%rbp), %xmm2, %xmm2
2080; SKX-NEXT:    vpinsrb $10, 688(%rbp), %xmm2, %xmm2
2081; SKX-NEXT:    vpinsrb $11, 696(%rbp), %xmm2, %xmm2
2082; SKX-NEXT:    vpinsrb $12, 704(%rbp), %xmm2, %xmm2
2083; SKX-NEXT:    vpinsrb $13, 712(%rbp), %xmm2, %xmm2
2084; SKX-NEXT:    vpinsrb $14, 720(%rbp), %xmm2, %xmm2
2085; SKX-NEXT:    vpinsrb $15, 728(%rbp), %xmm2, %xmm2
2086; SKX-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
2087; SKX-NEXT:    movl 744(%rbp), %eax
2088; SKX-NEXT:    andl $127, %eax
2089; SKX-NEXT:    vptestmb %zmm0, %zmm0, %k0
2090; SKX-NEXT:    vptestmb %zmm1, %zmm1, %k1
2091; SKX-NEXT:    cmpb $0, 736(%rbp)
2092; SKX-NEXT:    vpmovm2b %k1, %zmm0
2093; SKX-NEXT:    vmovdqa64 %zmm0, {{[0-9]+}}(%rsp)
2094; SKX-NEXT:    vpmovm2b %k0, %zmm0
2095; SKX-NEXT:    vmovdqa64 %zmm0, (%rsp)
2096; SKX-NEXT:    setne (%rsp,%rax)
2097; SKX-NEXT:    vpsllw $7, {{[0-9]+}}(%rsp), %zmm0
2098; SKX-NEXT:    vpmovb2m %zmm0, %k0
2099; SKX-NEXT:    vpsllw $7, (%rsp), %zmm0
2100; SKX-NEXT:    vpmovb2m %zmm0, %k1
2101; SKX-NEXT:    kmovq %k1, %rax
2102; SKX-NEXT:    kmovq %k0, %rdx
2103; SKX-NEXT:    movq %rbp, %rsp
2104; SKX-NEXT:    popq %rbp
2105; SKX-NEXT:    vzeroupper
2106; SKX-NEXT:    retq
2107  %t1 = icmp ugt <96 x i8> %a, zeroinitializer
2108  %t2 = icmp ugt i8 %b, 0
2109  %t3 = insertelement <96 x i1> %t1, i1 %t2, i32 %index
2110  %t4 = bitcast <96 x i1> %t3 to i96
2111  ret i96 %t4
2112}
2113
2114define i128 @test_insertelement_variable_v128i1(<128 x i8> %a, i8 %b, i32 %index) {
2115; KNL-LABEL: test_insertelement_variable_v128i1:
2116; KNL:       ## %bb.0:
2117; KNL-NEXT:    pushq %rbp
2118; KNL-NEXT:    .cfi_def_cfa_offset 16
2119; KNL-NEXT:    .cfi_offset %rbp, -16
2120; KNL-NEXT:    movq %rsp, %rbp
2121; KNL-NEXT:    .cfi_def_cfa_register %rbp
2122; KNL-NEXT:    andq $-64, %rsp
2123; KNL-NEXT:    subq $192, %rsp
2124; KNL-NEXT:    ## kill: def $esi killed $esi def $rsi
2125; KNL-NEXT:    vextracti64x4 $1, %zmm0, %ymm2
2126; KNL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
2127; KNL-NEXT:    vpcmpeqb %ymm3, %ymm2, %ymm2
2128; KNL-NEXT:    vpcmpeqb %ymm3, %ymm0, %ymm0
2129; KNL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
2130; KNL-NEXT:    vpternlogq $15, %zmm0, %zmm0, %zmm0
2131; KNL-NEXT:    vextracti64x4 $1, %zmm1, %ymm2
2132; KNL-NEXT:    vpcmpeqb %ymm3, %ymm2, %ymm2
2133; KNL-NEXT:    vpcmpeqb %ymm3, %ymm1, %ymm1
2134; KNL-NEXT:    vinserti64x4 $1, %ymm2, %zmm1, %zmm1
2135; KNL-NEXT:    vpternlogq $15, %zmm1, %zmm1, %zmm1
2136; KNL-NEXT:    andl $127, %esi
2137; KNL-NEXT:    testb %dil, %dil
2138; KNL-NEXT:    vmovdqa64 %zmm1, {{[0-9]+}}(%rsp)
2139; KNL-NEXT:    vmovdqa64 %zmm0, (%rsp)
2140; KNL-NEXT:    setne (%rsp,%rsi)
2141; KNL-NEXT:    vpmovsxbd (%rsp), %zmm0
2142; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
2143; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
2144; KNL-NEXT:    kmovw %k0, %eax
2145; KNL-NEXT:    vpmovsxbd {{[0-9]+}}(%rsp), %zmm0
2146; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
2147; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
2148; KNL-NEXT:    kmovw %k0, %ecx
2149; KNL-NEXT:    shll $16, %ecx
2150; KNL-NEXT:    orl %eax, %ecx
2151; KNL-NEXT:    vpmovsxbd {{[0-9]+}}(%rsp), %zmm0
2152; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
2153; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
2154; KNL-NEXT:    kmovw %k0, %edx
2155; KNL-NEXT:    vpmovsxbd {{[0-9]+}}(%rsp), %zmm0
2156; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
2157; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
2158; KNL-NEXT:    kmovw %k0, %eax
2159; KNL-NEXT:    shll $16, %eax
2160; KNL-NEXT:    orl %edx, %eax
2161; KNL-NEXT:    shlq $32, %rax
2162; KNL-NEXT:    orq %rcx, %rax
2163; KNL-NEXT:    vpmovsxbd {{[0-9]+}}(%rsp), %zmm0
2164; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
2165; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
2166; KNL-NEXT:    kmovw %k0, %ecx
2167; KNL-NEXT:    vpmovsxbd {{[0-9]+}}(%rsp), %zmm0
2168; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
2169; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
2170; KNL-NEXT:    kmovw %k0, %esi
2171; KNL-NEXT:    shll $16, %esi
2172; KNL-NEXT:    orl %ecx, %esi
2173; KNL-NEXT:    vpmovsxbd {{[0-9]+}}(%rsp), %zmm0
2174; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
2175; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
2176; KNL-NEXT:    kmovw %k0, %ecx
2177; KNL-NEXT:    vpmovsxbd {{[0-9]+}}(%rsp), %zmm0
2178; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
2179; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
2180; KNL-NEXT:    kmovw %k0, %edx
2181; KNL-NEXT:    shll $16, %edx
2182; KNL-NEXT:    orl %ecx, %edx
2183; KNL-NEXT:    shlq $32, %rdx
2184; KNL-NEXT:    orq %rsi, %rdx
2185; KNL-NEXT:    movq %rbp, %rsp
2186; KNL-NEXT:    popq %rbp
2187; KNL-NEXT:    vzeroupper
2188; KNL-NEXT:    retq
2189;
2190; SKX-LABEL: test_insertelement_variable_v128i1:
2191; SKX:       ## %bb.0:
2192; SKX-NEXT:    pushq %rbp
2193; SKX-NEXT:    .cfi_def_cfa_offset 16
2194; SKX-NEXT:    .cfi_offset %rbp, -16
2195; SKX-NEXT:    movq %rsp, %rbp
2196; SKX-NEXT:    .cfi_def_cfa_register %rbp
2197; SKX-NEXT:    andq $-64, %rsp
2198; SKX-NEXT:    subq $192, %rsp
2199; SKX-NEXT:    ## kill: def $esi killed $esi def $rsi
2200; SKX-NEXT:    vptestmb %zmm0, %zmm0, %k0
2201; SKX-NEXT:    vptestmb %zmm1, %zmm1, %k1
2202; SKX-NEXT:    andl $127, %esi
2203; SKX-NEXT:    testb %dil, %dil
2204; SKX-NEXT:    vpmovm2b %k1, %zmm0
2205; SKX-NEXT:    vmovdqa64 %zmm0, {{[0-9]+}}(%rsp)
2206; SKX-NEXT:    vpmovm2b %k0, %zmm0
2207; SKX-NEXT:    vmovdqa64 %zmm0, (%rsp)
2208; SKX-NEXT:    setne (%rsp,%rsi)
2209; SKX-NEXT:    vpsllw $7, {{[0-9]+}}(%rsp), %zmm0
2210; SKX-NEXT:    vpmovb2m %zmm0, %k0
2211; SKX-NEXT:    vpsllw $7, (%rsp), %zmm0
2212; SKX-NEXT:    vpmovb2m %zmm0, %k1
2213; SKX-NEXT:    kmovq %k1, %rax
2214; SKX-NEXT:    kmovq %k0, %rdx
2215; SKX-NEXT:    movq %rbp, %rsp
2216; SKX-NEXT:    popq %rbp
2217; SKX-NEXT:    vzeroupper
2218; SKX-NEXT:    retq
2219  %t1 = icmp ugt <128 x i8> %a, zeroinitializer
2220  %t2 = icmp ugt i8 %b, 0
2221  %t3 = insertelement <128 x i1> %t1, i1 %t2, i32 %index
2222  %t4 = bitcast <128 x i1> %t3 to i128
2223  ret i128 %t4
2224}
2225
2226define void @test_concat_v2i1(ptr %arg, ptr %arg1, ptr %arg2) {
2227; KNL-LABEL: test_concat_v2i1:
2228; KNL:       ## %bb.0:
2229; KNL-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
2230; KNL-NEXT:    vpextrw $0, %xmm0, %eax
2231; KNL-NEXT:    movzwl %ax, %eax
2232; KNL-NEXT:    vmovd %eax, %xmm1
2233; KNL-NEXT:    vcvtph2ps %xmm1, %xmm1
2234; KNL-NEXT:    vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero
2235; KNL-NEXT:    vucomiss %xmm2, %xmm1
2236; KNL-NEXT:    setb %al
2237; KNL-NEXT:    andl $1, %eax
2238; KNL-NEXT:    kmovw %eax, %k0
2239; KNL-NEXT:    vpsrld $16, %xmm0, %xmm0
2240; KNL-NEXT:    vpextrw $0, %xmm0, %eax
2241; KNL-NEXT:    movzwl %ax, %eax
2242; KNL-NEXT:    vmovd %eax, %xmm0
2243; KNL-NEXT:    vcvtph2ps %xmm0, %xmm0
2244; KNL-NEXT:    vucomiss %xmm2, %xmm0
2245; KNL-NEXT:    setb %al
2246; KNL-NEXT:    kmovw %eax, %k1
2247; KNL-NEXT:    kshiftlw $1, %k1, %k1
2248; KNL-NEXT:    korw %k1, %k0, %k0
2249; KNL-NEXT:    vxorps %xmm2, %xmm2, %xmm2
2250; KNL-NEXT:    vucomiss %xmm2, %xmm1
2251; KNL-NEXT:    seta %al
2252; KNL-NEXT:    andl $1, %eax
2253; KNL-NEXT:    kmovw %eax, %k1
2254; KNL-NEXT:    vucomiss %xmm2, %xmm0
2255; KNL-NEXT:    seta %al
2256; KNL-NEXT:    kmovw %eax, %k2
2257; KNL-NEXT:    kshiftlw $1, %k2, %k2
2258; KNL-NEXT:    korw %k2, %k1, %k1
2259; KNL-NEXT:    kandw %k1, %k0, %k1
2260; KNL-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
2261; KNL-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k1} {z}
2262; KNL-NEXT:    vpmovdw %zmm1, %ymm1
2263; KNL-NEXT:    vpand %xmm0, %xmm1, %xmm0
2264; KNL-NEXT:    vmovd %xmm0, (%rdx)
2265; KNL-NEXT:    vzeroupper
2266; KNL-NEXT:    retq
2267;
2268; SKX-LABEL: test_concat_v2i1:
2269; SKX:       ## %bb.0:
2270; SKX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
2271; SKX-NEXT:    vpsrld $16, %xmm0, %xmm1
2272; SKX-NEXT:    vpextrw $0, %xmm1, %eax
2273; SKX-NEXT:    movzwl %ax, %eax
2274; SKX-NEXT:    vmovd %eax, %xmm1
2275; SKX-NEXT:    vcvtph2ps %xmm1, %xmm1
2276; SKX-NEXT:    vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero
2277; SKX-NEXT:    vucomiss %xmm2, %xmm1
2278; SKX-NEXT:    setb %al
2279; SKX-NEXT:    kmovd %eax, %k0
2280; SKX-NEXT:    kshiftlb $1, %k0, %k0
2281; SKX-NEXT:    vpextrw $0, %xmm0, %eax
2282; SKX-NEXT:    movzwl %ax, %eax
2283; SKX-NEXT:    vmovd %eax, %xmm0
2284; SKX-NEXT:    vcvtph2ps %xmm0, %xmm0
2285; SKX-NEXT:    vucomiss %xmm2, %xmm0
2286; SKX-NEXT:    setb %al
2287; SKX-NEXT:    kmovd %eax, %k1
2288; SKX-NEXT:    kshiftlb $7, %k1, %k1
2289; SKX-NEXT:    kshiftrb $7, %k1, %k1
2290; SKX-NEXT:    korw %k0, %k1, %k0
2291; SKX-NEXT:    vxorps %xmm2, %xmm2, %xmm2
2292; SKX-NEXT:    vucomiss %xmm2, %xmm1
2293; SKX-NEXT:    seta %al
2294; SKX-NEXT:    kmovd %eax, %k1
2295; SKX-NEXT:    kshiftlb $1, %k1, %k1
2296; SKX-NEXT:    vucomiss %xmm2, %xmm0
2297; SKX-NEXT:    seta %al
2298; SKX-NEXT:    kmovd %eax, %k2
2299; SKX-NEXT:    kshiftlb $7, %k2, %k2
2300; SKX-NEXT:    kshiftrb $7, %k2, %k2
2301; SKX-NEXT:    korw %k1, %k2, %k1
2302; SKX-NEXT:    kandw %k1, %k0, %k1
2303; SKX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
2304; SKX-NEXT:    vmovdqu16 %xmm0, %xmm0 {%k1} {z}
2305; SKX-NEXT:    vmovd %xmm0, (%rdx)
2306; SKX-NEXT:    retq
2307  %tmp = load <2 x half>, ptr %arg, align 8
2308  %tmp3 = fcmp fast olt <2 x half> %tmp, <half 0xH4600, half 0xH4600>
2309  %tmp4 = fcmp fast ogt <2 x half> %tmp, zeroinitializer
2310  %tmp5 = and <2 x i1> %tmp3, %tmp4
2311  %tmp6 = load <2 x half>, ptr %arg1, align 8
2312  %tmp7 = select <2 x i1> %tmp5, <2 x half> %tmp6, <2 x half> zeroinitializer
2313  store <2 x half> %tmp7, ptr %arg2, align 8
2314  ret void
2315}
2316