1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -march=x86-64 -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck --check-prefix=KNL %s
3; RUN: llc < %s -march=x86-64 -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck --check-prefix=SKX %s
4
5define <16 x float> @test1(<16 x float> %x, float* %br, float %y) nounwind {
6; KNL-LABEL: test1:
7; KNL:       ## BB#0:
8; KNL-NEXT:    vinsertps {{.*#+}} xmm2 = xmm0[0],mem[0],xmm0[2,3]
9; KNL-NEXT:    vinsertf32x4 $0, %xmm2, %zmm0, %zmm0
10; KNL-NEXT:    vextractf32x4 $3, %zmm0, %xmm2
11; KNL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1],xmm1[0],xmm2[3]
12; KNL-NEXT:    vinsertf32x4 $3, %xmm1, %zmm0, %zmm0
13; KNL-NEXT:    retq
14;
15; SKX-LABEL: test1:
16; SKX:       ## BB#0:
17; SKX-NEXT:    vinsertps {{.*#+}} xmm2 = xmm0[0],mem[0],xmm0[2,3]
18; SKX-NEXT:    vinsertf32x4 $0, %xmm2, %zmm0, %zmm0
19; SKX-NEXT:    vextractf32x4 $3, %zmm0, %xmm2
20; SKX-NEXT:    vinsertps {{.*#+}} xmm1 = xmm2[0,1],xmm1[0],xmm2[3]
21; SKX-NEXT:    vinsertf32x4 $3, %xmm1, %zmm0, %zmm0
22; SKX-NEXT:    retq
23  %rrr = load float, float* %br
24  %rrr2 = insertelement <16 x float> %x, float %rrr, i32 1
25  %rrr3 = insertelement <16 x float> %rrr2, float %y, i32 14
26  ret <16 x float> %rrr3
27}
28
29define <8 x double> @test2(<8 x double> %x, double* %br, double %y) nounwind {
30; KNL-LABEL: test2:
31; KNL:       ## BB#0:
32; KNL-NEXT:    vmovhpd {{.*#+}} xmm2 = xmm0[0],mem[0]
33; KNL-NEXT:    vinsertf32x4 $0, %xmm2, %zmm0, %zmm0
34; KNL-NEXT:    vextractf32x4 $3, %zmm0, %xmm2
35; KNL-NEXT:    vmovsd {{.*#+}} xmm1 = xmm1[0],xmm2[1]
36; KNL-NEXT:    vinsertf32x4 $3, %xmm1, %zmm0, %zmm0
37; KNL-NEXT:    retq
38;
39; SKX-LABEL: test2:
40; SKX:       ## BB#0:
41; SKX-NEXT:    vmovhpd {{.*#+}} xmm2 = xmm0[0],mem[0]
42; SKX-NEXT:    vinsertf64x2 $0, %xmm2, %zmm0, %zmm0
43; SKX-NEXT:    vextractf64x2 $3, %zmm0, %xmm2
44; SKX-NEXT:    vmovsd {{.*#+}} xmm1 = xmm1[0],xmm2[1]
45; SKX-NEXT:    vinsertf64x2 $3, %xmm1, %zmm0, %zmm0
46; SKX-NEXT:    retq
47  %rrr = load double, double* %br
48  %rrr2 = insertelement <8 x double> %x, double %rrr, i32 1
49  %rrr3 = insertelement <8 x double> %rrr2, double %y, i32 6
50  ret <8 x double> %rrr3
51}
52
53define <16 x float> @test3(<16 x float> %x) nounwind {
54; KNL-LABEL: test3:
55; KNL:       ## BB#0:
56; KNL-NEXT:    vextractf32x4 $1, %zmm0, %xmm1
57; KNL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[2,3]
58; KNL-NEXT:    vinsertf32x4 $0, %xmm1, %zmm0, %zmm0
59; KNL-NEXT:    retq
60;
61; SKX-LABEL: test3:
62; SKX:       ## BB#0:
63; SKX-NEXT:    vextractf32x4 $1, %zmm0, %xmm1
64; SKX-NEXT:    vinsertps {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[2,3]
65; SKX-NEXT:    vinsertf32x4 $0, %xmm1, %zmm0, %zmm0
66; SKX-NEXT:    retq
67  %eee = extractelement <16 x float> %x, i32 4
68  %rrr2 = insertelement <16 x float> %x, float %eee, i32 1
69  ret <16 x float> %rrr2
70}
71
72define <8 x i64> @test4(<8 x i64> %x) nounwind {
73; KNL-LABEL: test4:
74; KNL:       ## BB#0:
75; KNL-NEXT:    vextracti32x4 $2, %zmm0, %xmm1
76; KNL-NEXT:    vmovq %xmm1, %rax
77; KNL-NEXT:    vpinsrq $1, %rax, %xmm0, %xmm1
78; KNL-NEXT:    vinserti32x4 $0, %xmm1, %zmm0, %zmm0
79; KNL-NEXT:    retq
80;
81; SKX-LABEL: test4:
82; SKX:       ## BB#0:
83; SKX-NEXT:    vextracti64x2 $2, %zmm0, %xmm1
84; SKX-NEXT:    vmovq %xmm1, %rax
85; SKX-NEXT:    vpinsrq $1, %rax, %xmm0, %xmm1
86; SKX-NEXT:    vinserti64x2 $0, %xmm1, %zmm0, %zmm0
87; SKX-NEXT:    retq
88  %eee = extractelement <8 x i64> %x, i32 4
89  %rrr2 = insertelement <8 x i64> %x, i64 %eee, i32 1
90  ret <8 x i64> %rrr2
91}
92
93define i32 @test5(<4 x float> %x) nounwind {
94; KNL-LABEL: test5:
95; KNL:       ## BB#0:
96; KNL-NEXT:    vextractps $3, %xmm0, %eax
97; KNL-NEXT:    retq
98;
99; SKX-LABEL: test5:
100; SKX:       ## BB#0:
101; SKX-NEXT:    vextractps $3, %xmm0, %eax
102; SKX-NEXT:    retq
103  %ef = extractelement <4 x float> %x, i32 3
104  %ei = bitcast float %ef to i32
105  ret i32 %ei
106}
107
108define void @test6(<4 x float> %x, float* %out) nounwind {
109; KNL-LABEL: test6:
110; KNL:       ## BB#0:
111; KNL-NEXT:    vextractps $3, %xmm0, (%rdi)
112; KNL-NEXT:    retq
113;
114; SKX-LABEL: test6:
115; SKX:       ## BB#0:
116; SKX-NEXT:    vextractps $3, %xmm0, (%rdi)
117; SKX-NEXT:    retq
118  %ef = extractelement <4 x float> %x, i32 3
119  store float %ef, float* %out, align 4
120  ret void
121}
122
123define float @test7(<16 x float> %x, i32 %ind) nounwind {
124; KNL-LABEL: test7:
125; KNL:       ## BB#0:
126; KNL-NEXT:    vmovd %edi, %xmm1
127; KNL-NEXT:    vpermps %zmm0, %zmm1, %zmm0
128; KNL-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
129; KNL-NEXT:    retq
130;
131; SKX-LABEL: test7:
132; SKX:       ## BB#0:
133; SKX-NEXT:    vmovd %edi, %xmm1
134; SKX-NEXT:    vpermps %zmm0, %zmm1, %zmm0
135; SKX-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
136; SKX-NEXT:    retq
137  %e = extractelement <16 x float> %x, i32 %ind
138  ret float %e
139}
140
141define double @test8(<8 x double> %x, i32 %ind) nounwind {
142; KNL-LABEL: test8:
143; KNL:       ## BB#0:
144; KNL-NEXT:    movslq %edi, %rax
145; KNL-NEXT:    vmovq %rax, %xmm1
146; KNL-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
147; KNL-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
148; KNL-NEXT:    retq
149;
150; SKX-LABEL: test8:
151; SKX:       ## BB#0:
152; SKX-NEXT:    movslq %edi, %rax
153; SKX-NEXT:    vmovq %rax, %xmm1
154; SKX-NEXT:    vpermpd %zmm0, %zmm1, %zmm0
155; SKX-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %ZMM0<kill>
156; SKX-NEXT:    retq
157  %e = extractelement <8 x double> %x, i32 %ind
158  ret double %e
159}
160
161define float @test9(<8 x float> %x, i32 %ind) nounwind {
162; KNL-LABEL: test9:
163; KNL:       ## BB#0:
164; KNL-NEXT:    vmovd %edi, %xmm1
165; KNL-NEXT:    vpermps %ymm0, %ymm1, %ymm0
166; KNL-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
167; KNL-NEXT:    retq
168;
169; SKX-LABEL: test9:
170; SKX:       ## BB#0:
171; SKX-NEXT:    vmovd %edi, %xmm1
172; SKX-NEXT:    vpermps %ymm0, %ymm1, %ymm0
173; SKX-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
174; SKX-NEXT:    retq
175  %e = extractelement <8 x float> %x, i32 %ind
176  ret float %e
177}
178
179define i32 @test10(<16 x i32> %x, i32 %ind) nounwind {
180; KNL-LABEL: test10:
181; KNL:       ## BB#0:
182; KNL-NEXT:    vmovd %edi, %xmm1
183; KNL-NEXT:    vpermd %zmm0, %zmm1, %zmm0
184; KNL-NEXT:    vmovd %xmm0, %eax
185; KNL-NEXT:    retq
186;
187; SKX-LABEL: test10:
188; SKX:       ## BB#0:
189; SKX-NEXT:    vmovd %edi, %xmm1
190; SKX-NEXT:    vpermd %zmm0, %zmm1, %zmm0
191; SKX-NEXT:    vmovd %xmm0, %eax
192; SKX-NEXT:    retq
193  %e = extractelement <16 x i32> %x, i32 %ind
194  ret i32 %e
195}
196
197define <16 x i32> @test11(<16 x i32>%a, <16 x i32>%b) {
198; KNL-LABEL: test11:
199; KNL:       ## BB#0:
200; KNL-NEXT:    vpcmpltud %zmm1, %zmm0, %k0
201; KNL-NEXT:    kshiftlw $11, %k0, %k0
202; KNL-NEXT:    kshiftrw $15, %k0, %k0
203; KNL-NEXT:    kmovw %k0, %eax
204; KNL-NEXT:    andl $1, %eax
205; KNL-NEXT:    testb %al, %al
206; KNL-NEXT:    je LBB10_2
207; KNL-NEXT:  ## BB#1: ## %A
208; KNL-NEXT:    vmovdqa64 %zmm1, %zmm0
209; KNL-NEXT:    retq
210; KNL-NEXT:  LBB10_2: ## %B
211; KNL-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
212; KNL-NEXT:    retq
213;
214; SKX-LABEL: test11:
215; SKX:       ## BB#0:
216; SKX-NEXT:    vpcmpltud %zmm1, %zmm0, %k0
217; SKX-NEXT:    kshiftlw $11, %k0, %k0
218; SKX-NEXT:    kshiftrw $15, %k0, %k0
219; SKX-NEXT:    kmovw %k0, %eax
220; SKX-NEXT:    andl $1, %eax
221; SKX-NEXT:    testb %al, %al
222; SKX-NEXT:    je LBB10_2
223; SKX-NEXT:  ## BB#1: ## %A
224; SKX-NEXT:    vmovdqa64 %zmm1, %zmm0
225; SKX-NEXT:    retq
226; SKX-NEXT:  LBB10_2: ## %B
227; SKX-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
228; SKX-NEXT:    retq
229  %cmp_res = icmp ult <16 x i32> %a, %b
230  %ia = extractelement <16 x i1> %cmp_res, i32 4
231  br i1 %ia, label %A, label %B
232  A:
233    ret <16 x i32>%b
234  B:
235   %c = add <16 x i32>%b, %a
236   ret <16 x i32>%c
237}
238
239define i64 @test12(<16 x i64>%a, <16 x i64>%b, i64 %a1, i64 %b1) {
240; KNL-LABEL: test12:
241; KNL:       ## BB#0:
242; KNL-NEXT:    vpcmpgtq %zmm0, %zmm2, %k0
243; KNL-NEXT:    vpcmpgtq %zmm1, %zmm3, %k1
244; KNL-NEXT:    kunpckbw %k0, %k1, %k0
245; KNL-NEXT:    kshiftlw $15, %k0, %k0
246; KNL-NEXT:    kshiftrw $15, %k0, %k0
247; KNL-NEXT:    kmovw %k0, %eax
248; KNL-NEXT:    andl $1, %eax
249; KNL-NEXT:    testb %al, %al
250; KNL-NEXT:    cmoveq %rsi, %rdi
251; KNL-NEXT:    movq %rdi, %rax
252; KNL-NEXT:    retq
253;
254; SKX-LABEL: test12:
255; SKX:       ## BB#0:
256; SKX-NEXT:    vpcmpgtq %zmm0, %zmm2, %k0
257; SKX-NEXT:    vpcmpgtq %zmm1, %zmm3, %k1
258; SKX-NEXT:    kunpckbw %k0, %k1, %k0
259; SKX-NEXT:    kshiftlw $15, %k0, %k0
260; SKX-NEXT:    kshiftrw $15, %k0, %k0
261; SKX-NEXT:    kmovw %k0, %eax
262; SKX-NEXT:    andl $1, %eax
263; SKX-NEXT:    testb %al, %al
264; SKX-NEXT:    cmoveq %rsi, %rdi
265; SKX-NEXT:    movq %rdi, %rax
266; SKX-NEXT:    retq
267  %cmpvector_func.i = icmp slt <16 x i64> %a, %b
268  %extract24vector_func.i = extractelement <16 x i1> %cmpvector_func.i, i32 0
269  %res = select i1 %extract24vector_func.i, i64 %a1, i64 %b1
270  ret i64 %res
271}
272
273define i16 @test13(i32 %a, i32 %b) {
274; KNL-LABEL: test13:
275; KNL:       ## BB#0:
276; KNL-NEXT:    cmpl %esi, %edi
277; KNL-NEXT:    setb %al
278; KNL-NEXT:    andl $1, %eax
279; KNL-NEXT:    kmovw %eax, %k0
280; KNL-NEXT:    movw $-4, %ax
281; KNL-NEXT:    kmovw %eax, %k1
282; KNL-NEXT:    kshiftrw $1, %k1, %k1
283; KNL-NEXT:    kshiftlw $1, %k1, %k1
284; KNL-NEXT:    korw %k0, %k1, %k0
285; KNL-NEXT:    kmovw %k0, %eax
286; KNL-NEXT:    retq
287;
288; SKX-LABEL: test13:
289; SKX:       ## BB#0:
290; SKX-NEXT:    cmpl %esi, %edi
291; SKX-NEXT:    setb %al
292; SKX-NEXT:    andl $1, %eax
293; SKX-NEXT:    kmovw %eax, %k0
294; SKX-NEXT:    movw $-4, %ax
295; SKX-NEXT:    kmovw %eax, %k1
296; SKX-NEXT:    kshiftrw $1, %k1, %k1
297; SKX-NEXT:    kshiftlw $1, %k1, %k1
298; SKX-NEXT:    korw %k0, %k1, %k0
299; SKX-NEXT:    kmovw %k0, %eax
300; SKX-NEXT:    retq
301  %cmp_res = icmp ult i32 %a, %b
302  %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
303  %res = bitcast <16 x i1> %maskv to i16
304  ret i16 %res
305}
306
307define i64 @test14(<8 x i64>%a, <8 x i64>%b, i64 %a1, i64 %b1) {
308; KNL-LABEL: test14:
309; KNL:       ## BB#0:
310; KNL-NEXT:    vpcmpgtq %zmm0, %zmm1, %k0
311; KNL-NEXT:    kshiftlw $11, %k0, %k0
312; KNL-NEXT:    kshiftrw $15, %k0, %k0
313; KNL-NEXT:    kmovw %k0, %eax
314; KNL-NEXT:    andl $1, %eax
315; KNL-NEXT:    testb %al, %al
316; KNL-NEXT:    cmoveq %rsi, %rdi
317; KNL-NEXT:    movq %rdi, %rax
318; KNL-NEXT:    retq
319;
320; SKX-LABEL: test14:
321; SKX:       ## BB#0:
322; SKX-NEXT:    vpcmpgtq %zmm0, %zmm1, %k0
323; SKX-NEXT:    kshiftlb $3, %k0, %k0
324; SKX-NEXT:    kshiftrb $7, %k0, %k0
325; SKX-NEXT:    kmovw %k0, %eax
326; SKX-NEXT:    andl $1, %eax
327; SKX-NEXT:    testb %al, %al
328; SKX-NEXT:    cmoveq %rsi, %rdi
329; SKX-NEXT:    movq %rdi, %rax
330; SKX-NEXT:    retq
331  %cmpvector_func.i = icmp slt <8 x i64> %a, %b
332  %extract24vector_func.i = extractelement <8 x i1> %cmpvector_func.i, i32 4
333  %res = select i1 %extract24vector_func.i, i64 %a1, i64 %b1
334  ret i64 %res
335}
336
337define i16 @test15(i1 *%addr) {
338; KNL-LABEL: test15:
339; KNL:       ## BB#0:
340; KNL-NEXT:    movb (%rdi), %al
341; KNL-NEXT:    xorl %ecx, %ecx
342; KNL-NEXT:    testb %al, %al
343; KNL-NEXT:    movw $-1, %ax
344; KNL-NEXT:    cmovew %cx, %ax
345; KNL-NEXT:    retq
346;
347; SKX-LABEL: test15:
348; SKX:       ## BB#0:
349; SKX-NEXT:    movb (%rdi), %al
350; SKX-NEXT:    xorl %ecx, %ecx
351; SKX-NEXT:    testb %al, %al
352; SKX-NEXT:    movw $-1, %ax
353; SKX-NEXT:    cmovew %cx, %ax
354; SKX-NEXT:    retq
355  %x = load i1 , i1 * %addr, align 1
356  %x1 = insertelement <16 x i1> undef, i1 %x, i32 10
357  %x2 = bitcast <16 x i1>%x1 to i16
358  ret i16 %x2
359}
360
361define i16 @test16(i1 *%addr, i16 %a) {
362; KNL-LABEL: test16:
363; KNL:       ## BB#0:
364; KNL-NEXT:    movzbl (%rdi), %eax
365; KNL-NEXT:    andl $1, %eax
366; KNL-NEXT:    kmovw %eax, %k1
367; KNL-NEXT:    kmovw %esi, %k2
368; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0
369; KNL-NEXT:    vmovdqa32 %zmm0, %zmm1 {%k2} {z}
370; KNL-NEXT:    vmovdqa32 %zmm0, %zmm0 {%k1} {z}
371; KNL-NEXT:    vmovdqa32 {{.*#+}} zmm2 = [0,1,2,3,4,5,6,7,8,9,16,11,12,13,14,15]
372; KNL-NEXT:    vpermi2d %zmm0, %zmm1, %zmm2
373; KNL-NEXT:    vpslld $31, %zmm2, %zmm0
374; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
375; KNL-NEXT:    kmovw %k0, %eax
376; KNL-NEXT:    retq
377;
378; SKX-LABEL: test16:
379; SKX:       ## BB#0:
380; SKX-NEXT:    movzbl (%rdi), %eax
381; SKX-NEXT:    andl $1, %eax
382; SKX-NEXT:    kmovd %eax, %k0
383; SKX-NEXT:    kmovw %esi, %k1
384; SKX-NEXT:    vpmovm2d %k1, %zmm0
385; SKX-NEXT:    vpmovm2d %k0, %zmm1
386; SKX-NEXT:    vmovdqa32 {{.*#+}} zmm2 = [0,1,2,3,4,5,6,7,8,9,16,11,12,13,14,15]
387; SKX-NEXT:    vpermi2d %zmm1, %zmm0, %zmm2
388; SKX-NEXT:    vpmovd2m %zmm2, %k0
389; SKX-NEXT:    kmovw %k0, %eax
390; SKX-NEXT:    retq
391  %x = load i1 , i1 * %addr, align 128
392  %a1 = bitcast i16 %a to <16 x i1>
393  %x1 = insertelement <16 x i1> %a1, i1 %x, i32 10
394  %x2 = bitcast <16 x i1>%x1 to i16
395  ret i16 %x2
396}
397
398define i8 @test17(i1 *%addr, i8 %a) {
399; KNL-LABEL: test17:
400; KNL:       ## BB#0:
401; KNL-NEXT:    movzbl (%rdi), %eax
402; KNL-NEXT:    andl $1, %eax
403; KNL-NEXT:    kmovw %eax, %k1
404; KNL-NEXT:    kmovw %esi, %k2
405; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0
406; KNL-NEXT:    vmovdqa64 %zmm0, %zmm1 {%k2} {z}
407; KNL-NEXT:    vmovdqa64 %zmm0, %zmm0 {%k1} {z}
408; KNL-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,1,2,3,8,5,6,7]
409; KNL-NEXT:    vpermi2q %zmm0, %zmm1, %zmm2
410; KNL-NEXT:    vpsllq $63, %zmm2, %zmm0
411; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k0
412; KNL-NEXT:    kmovw %k0, %eax
413; KNL-NEXT:    retq
414;
415; SKX-LABEL: test17:
416; SKX:       ## BB#0:
417; SKX-NEXT:    movzbl (%rdi), %eax
418; SKX-NEXT:    andl $1, %eax
419; SKX-NEXT:    kmovd %eax, %k0
420; SKX-NEXT:    kmovb %esi, %k1
421; SKX-NEXT:    vpmovm2q %k1, %zmm0
422; SKX-NEXT:    vpmovm2q %k0, %zmm1
423; SKX-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,1,2,3,8,5,6,7]
424; SKX-NEXT:    vpermi2q %zmm1, %zmm0, %zmm2
425; SKX-NEXT:    vpmovq2m %zmm2, %k0
426; SKX-NEXT:    kmovb %k0, %eax
427; SKX-NEXT:    retq
428  %x = load i1 , i1 * %addr, align 128
429  %a1 = bitcast i8 %a to <8 x i1>
430  %x1 = insertelement <8 x i1> %a1, i1 %x, i32 4
431  %x2 = bitcast <8 x i1>%x1 to i8
432  ret i8 %x2
433}
434
435define i64 @extract_v8i64(<8 x i64> %x, i64* %dst) {
436; KNL-LABEL: extract_v8i64:
437; KNL:       ## BB#0:
438; KNL-NEXT:    vpextrq $1, %xmm0, %rax
439; KNL-NEXT:    vextracti32x4 $1, %zmm0, %xmm0
440; KNL-NEXT:    vpextrq $1, %xmm0, (%rdi)
441; KNL-NEXT:    retq
442;
443; SKX-LABEL: extract_v8i64:
444; SKX:       ## BB#0:
445; SKX-NEXT:    vpextrq $1, %xmm0, %rax
446; SKX-NEXT:    vextracti64x2 $1, %zmm0, %xmm0
447; SKX-NEXT:    vpextrq $1, %xmm0, (%rdi)
448; SKX-NEXT:    retq
449  %r1 = extractelement <8 x i64> %x, i32 1
450  %r2 = extractelement <8 x i64> %x, i32 3
451  store i64 %r2, i64* %dst, align 1
452  ret i64 %r1
453}
454
455define i64 @extract_v4i64(<4 x i64> %x, i64* %dst) {
456; KNL-LABEL: extract_v4i64:
457; KNL:       ## BB#0:
458; KNL-NEXT:    vpextrq $1, %xmm0, %rax
459; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm0
460; KNL-NEXT:    vpextrq $1, %xmm0, (%rdi)
461; KNL-NEXT:    retq
462;
463; SKX-LABEL: extract_v4i64:
464; SKX:       ## BB#0:
465; SKX-NEXT:    vpextrq $1, %xmm0, %rax
466; SKX-NEXT:    vextracti64x2 $1, %ymm0, %xmm0
467; SKX-NEXT:    vpextrq $1, %xmm0, (%rdi)
468; SKX-NEXT:    retq
469  %r1 = extractelement <4 x i64> %x, i32 1
470  %r2 = extractelement <4 x i64> %x, i32 3
471  store i64 %r2, i64* %dst, align 1
472  ret i64 %r1
473}
474
475define i64 @extract_v2i64(<2 x i64> %x, i64* %dst) {
476; KNL-LABEL: extract_v2i64:
477; KNL:       ## BB#0:
478; KNL-NEXT:    vmovq %xmm0, %rax
479; KNL-NEXT:    vpextrq $1, %xmm0, (%rdi)
480; KNL-NEXT:    retq
481;
482; SKX-LABEL: extract_v2i64:
483; SKX:       ## BB#0:
484; SKX-NEXT:    vmovq %xmm0, %rax
485; SKX-NEXT:    vpextrq $1, %xmm0, (%rdi)
486; SKX-NEXT:    retq
487  %r1 = extractelement <2 x i64> %x, i32 0
488  %r2 = extractelement <2 x i64> %x, i32 1
489  store i64 %r2, i64* %dst, align 1
490  ret i64 %r1
491}
492
493define i32 @extract_v16i32(<16 x i32> %x, i32* %dst) {
494; KNL-LABEL: extract_v16i32:
495; KNL:       ## BB#0:
496; KNL-NEXT:    vpextrd $1, %xmm0, %eax
497; KNL-NEXT:    vextracti32x4 $1, %zmm0, %xmm0
498; KNL-NEXT:    vpextrd $1, %xmm0, (%rdi)
499; KNL-NEXT:    retq
500;
501; SKX-LABEL: extract_v16i32:
502; SKX:       ## BB#0:
503; SKX-NEXT:    vpextrd $1, %xmm0, %eax
504; SKX-NEXT:    vextracti32x4 $1, %zmm0, %xmm0
505; SKX-NEXT:    vpextrd $1, %xmm0, (%rdi)
506; SKX-NEXT:    retq
507  %r1 = extractelement <16 x i32> %x, i32 1
508  %r2 = extractelement <16 x i32> %x, i32 5
509  store i32 %r2, i32* %dst, align 1
510  ret i32 %r1
511}
512
513define i32 @extract_v8i32(<8 x i32> %x, i32* %dst) {
514; KNL-LABEL: extract_v8i32:
515; KNL:       ## BB#0:
516; KNL-NEXT:    vpextrd $1, %xmm0, %eax
517; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm0
518; KNL-NEXT:    vpextrd $1, %xmm0, (%rdi)
519; KNL-NEXT:    retq
520;
521; SKX-LABEL: extract_v8i32:
522; SKX:       ## BB#0:
523; SKX-NEXT:    vpextrd $1, %xmm0, %eax
524; SKX-NEXT:    vextracti32x4 $1, %ymm0, %xmm0
525; SKX-NEXT:    vpextrd $1, %xmm0, (%rdi)
526; SKX-NEXT:    retq
527  %r1 = extractelement <8 x i32> %x, i32 1
528  %r2 = extractelement <8 x i32> %x, i32 5
529  store i32 %r2, i32* %dst, align 1
530  ret i32 %r1
531}
532
533define i32 @extract_v4i32(<4 x i32> %x, i32* %dst) {
534; KNL-LABEL: extract_v4i32:
535; KNL:       ## BB#0:
536; KNL-NEXT:    vpextrd $1, %xmm0, %eax
537; KNL-NEXT:    vpextrd $3, %xmm0, (%rdi)
538; KNL-NEXT:    retq
539;
540; SKX-LABEL: extract_v4i32:
541; SKX:       ## BB#0:
542; SKX-NEXT:    vpextrd $1, %xmm0, %eax
543; SKX-NEXT:    vpextrd $3, %xmm0, (%rdi)
544; SKX-NEXT:    retq
545  %r1 = extractelement <4 x i32> %x, i32 1
546  %r2 = extractelement <4 x i32> %x, i32 3
547  store i32 %r2, i32* %dst, align 1
548  ret i32 %r1
549}
550
551define i16 @extract_v32i16(<32 x i16> %x, i16* %dst) {
552; KNL-LABEL: extract_v32i16:
553; KNL:       ## BB#0:
554; KNL-NEXT:    vpextrw $1, %xmm0, %eax
555; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm0
556; KNL-NEXT:    vpextrw $1, %xmm0, (%rdi)
557; KNL-NEXT:    ## kill: %AX<def> %AX<kill> %EAX<kill>
558; KNL-NEXT:    retq
559;
560; SKX-LABEL: extract_v32i16:
561; SKX:       ## BB#0:
562; SKX-NEXT:    vpextrw $1, %xmm0, %eax
563; SKX-NEXT:    vextracti32x4 $1, %zmm0, %xmm0
564; SKX-NEXT:    vpextrw $1, %xmm0, (%rdi)
565; SKX-NEXT:    ## kill: %AX<def> %AX<kill> %EAX<kill>
566; SKX-NEXT:    retq
567  %r1 = extractelement <32 x i16> %x, i32 1
568  %r2 = extractelement <32 x i16> %x, i32 9
569  store i16 %r2, i16* %dst, align 1
570  ret i16 %r1
571}
572
573define i16 @extract_v16i16(<16 x i16> %x, i16* %dst) {
574; KNL-LABEL: extract_v16i16:
575; KNL:       ## BB#0:
576; KNL-NEXT:    vpextrw $1, %xmm0, %eax
577; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm0
578; KNL-NEXT:    vpextrw $1, %xmm0, (%rdi)
579; KNL-NEXT:    ## kill: %AX<def> %AX<kill> %EAX<kill>
580; KNL-NEXT:    retq
581;
582; SKX-LABEL: extract_v16i16:
583; SKX:       ## BB#0:
584; SKX-NEXT:    vpextrw $1, %xmm0, %eax
585; SKX-NEXT:    vextracti32x4 $1, %ymm0, %xmm0
586; SKX-NEXT:    vpextrw $1, %xmm0, (%rdi)
587; SKX-NEXT:    ## kill: %AX<def> %AX<kill> %EAX<kill>
588; SKX-NEXT:    retq
589  %r1 = extractelement <16 x i16> %x, i32 1
590  %r2 = extractelement <16 x i16> %x, i32 9
591  store i16 %r2, i16* %dst, align 1
592  ret i16 %r1
593}
594
595define i16 @extract_v8i16(<8 x i16> %x, i16* %dst) {
596; KNL-LABEL: extract_v8i16:
597; KNL:       ## BB#0:
598; KNL-NEXT:    vpextrw $1, %xmm0, %eax
599; KNL-NEXT:    vpextrw $3, %xmm0, (%rdi)
600; KNL-NEXT:    ## kill: %AX<def> %AX<kill> %EAX<kill>
601; KNL-NEXT:    retq
602;
603; SKX-LABEL: extract_v8i16:
604; SKX:       ## BB#0:
605; SKX-NEXT:    vpextrw $1, %xmm0, %eax
606; SKX-NEXT:    vpextrw $3, %xmm0, (%rdi)
607; SKX-NEXT:    ## kill: %AX<def> %AX<kill> %EAX<kill>
608; SKX-NEXT:    retq
609  %r1 = extractelement <8 x i16> %x, i32 1
610  %r2 = extractelement <8 x i16> %x, i32 3
611  store i16 %r2, i16* %dst, align 1
612  ret i16 %r1
613}
614
615define i8 @extract_v64i8(<64 x i8> %x, i8* %dst) {
616; KNL-LABEL: extract_v64i8:
617; KNL:       ## BB#0:
618; KNL-NEXT:    vpextrb $1, %xmm0, %eax
619; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm0
620; KNL-NEXT:    vpextrb $1, %xmm0, (%rdi)
621; KNL-NEXT:    ## kill: %AL<def> %AL<kill> %EAX<kill>
622; KNL-NEXT:    retq
623;
624; SKX-LABEL: extract_v64i8:
625; SKX:       ## BB#0:
626; SKX-NEXT:    vpextrb $1, %xmm0, %eax
627; SKX-NEXT:    vextracti32x4 $1, %zmm0, %xmm0
628; SKX-NEXT:    vpextrb $1, %xmm0, (%rdi)
629; SKX-NEXT:    ## kill: %AL<def> %AL<kill> %EAX<kill>
630; SKX-NEXT:    retq
631  %r1 = extractelement <64 x i8> %x, i32 1
632  %r2 = extractelement <64 x i8> %x, i32 17
633  store i8 %r2, i8* %dst, align 1
634  ret i8 %r1
635}
636
637define i8 @extract_v32i8(<32 x i8> %x, i8* %dst) {
638; KNL-LABEL: extract_v32i8:
639; KNL:       ## BB#0:
640; KNL-NEXT:    vpextrb $1, %xmm0, %eax
641; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm0
642; KNL-NEXT:    vpextrb $1, %xmm0, (%rdi)
643; KNL-NEXT:    ## kill: %AL<def> %AL<kill> %EAX<kill>
644; KNL-NEXT:    retq
645;
646; SKX-LABEL: extract_v32i8:
647; SKX:       ## BB#0:
648; SKX-NEXT:    vpextrb $1, %xmm0, %eax
649; SKX-NEXT:    vextracti32x4 $1, %ymm0, %xmm0
650; SKX-NEXT:    vpextrb $1, %xmm0, (%rdi)
651; SKX-NEXT:    ## kill: %AL<def> %AL<kill> %EAX<kill>
652; SKX-NEXT:    retq
653  %r1 = extractelement <32 x i8> %x, i32 1
654  %r2 = extractelement <32 x i8> %x, i32 17
655  store i8 %r2, i8* %dst, align 1
656  ret i8 %r1
657}
658
659define i8 @extract_v16i8(<16 x i8> %x, i8* %dst) {
660; KNL-LABEL: extract_v16i8:
661; KNL:       ## BB#0:
662; KNL-NEXT:    vpextrb $1, %xmm0, %eax
663; KNL-NEXT:    vpextrb $3, %xmm0, (%rdi)
664; KNL-NEXT:    ## kill: %AL<def> %AL<kill> %EAX<kill>
665; KNL-NEXT:    retq
666;
667; SKX-LABEL: extract_v16i8:
668; SKX:       ## BB#0:
669; SKX-NEXT:    vpextrb $1, %xmm0, %eax
670; SKX-NEXT:    vpextrb $3, %xmm0, (%rdi)
671; SKX-NEXT:    ## kill: %AL<def> %AL<kill> %EAX<kill>
672; SKX-NEXT:    retq
673  %r1 = extractelement <16 x i8> %x, i32 1
674  %r2 = extractelement <16 x i8> %x, i32 3
675  store i8 %r2, i8* %dst, align 1
676  ret i8 %r1
677}
678
679define <8 x i64> @insert_v8i64(<8 x i64> %x, i64 %y , i64* %ptr) {
680; KNL-LABEL: insert_v8i64:
681; KNL:       ## BB#0:
682; KNL-NEXT:    vpinsrq $1, (%rsi), %xmm0, %xmm1
683; KNL-NEXT:    vinserti32x4 $0, %xmm1, %zmm0, %zmm0
684; KNL-NEXT:    vextracti32x4 $1, %zmm0, %xmm1
685; KNL-NEXT:    vpinsrq $1, %rdi, %xmm1, %xmm1
686; KNL-NEXT:    vinserti32x4 $1, %xmm1, %zmm0, %zmm0
687; KNL-NEXT:    retq
688;
689; SKX-LABEL: insert_v8i64:
690; SKX:       ## BB#0:
691; SKX-NEXT:    vpinsrq $1, (%rsi), %xmm0, %xmm1
692; SKX-NEXT:    vinserti64x2 $0, %xmm1, %zmm0, %zmm0
693; SKX-NEXT:    vextracti64x2 $1, %zmm0, %xmm1
694; SKX-NEXT:    vpinsrq $1, %rdi, %xmm1, %xmm1
695; SKX-NEXT:    vinserti64x2 $1, %xmm1, %zmm0, %zmm0
696; SKX-NEXT:    retq
697  %val = load i64, i64* %ptr
698  %r1 = insertelement <8 x i64> %x, i64 %val, i32 1
699  %r2 = insertelement <8 x i64> %r1, i64 %y, i32 3
700  ret <8 x i64> %r2
701}
702
703define <4 x i64> @insert_v4i64(<4 x i64> %x, i64 %y , i64* %ptr) {
704; KNL-LABEL: insert_v4i64:
705; KNL:       ## BB#0:
706; KNL-NEXT:    vpinsrq $1, (%rsi), %xmm0, %xmm1
707; KNL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]
708; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm1
709; KNL-NEXT:    vpinsrq $1, %rdi, %xmm1, %xmm1
710; KNL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
711; KNL-NEXT:    retq
712;
713; SKX-LABEL: insert_v4i64:
714; SKX:       ## BB#0:
715; SKX-NEXT:    vpinsrq $1, (%rsi), %xmm0, %xmm1
716; SKX-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]
717; SKX-NEXT:    vextracti64x2 $1, %ymm0, %xmm1
718; SKX-NEXT:    vpinsrq $1, %rdi, %xmm1, %xmm1
719; SKX-NEXT:    vinserti64x2 $1, %xmm1, %ymm0, %ymm0
720; SKX-NEXT:    retq
721  %val = load i64, i64* %ptr
722  %r1 = insertelement <4 x i64> %x, i64 %val, i32 1
723  %r2 = insertelement <4 x i64> %r1, i64 %y, i32 3
724  ret <4 x i64> %r2
725}
726
727define <2 x i64> @insert_v2i64(<2 x i64> %x, i64 %y , i64* %ptr) {
728; KNL-LABEL: insert_v2i64:
729; KNL:       ## BB#0:
730; KNL-NEXT:    vpinsrq $0, %rdi, %xmm0, %xmm0
731; KNL-NEXT:    vpinsrq $1, (%rsi), %xmm0, %xmm0
732; KNL-NEXT:    retq
733;
734; SKX-LABEL: insert_v2i64:
735; SKX:       ## BB#0:
736; SKX-NEXT:    vpinsrq $0, %rdi, %xmm0, %xmm0
737; SKX-NEXT:    vpinsrq $1, (%rsi), %xmm0, %xmm0
738; SKX-NEXT:    retq
739  %val = load i64, i64* %ptr
740  %r1 = insertelement <2 x i64> %x, i64 %val, i32 1
741  %r2 = insertelement <2 x i64> %r1, i64 %y, i32 0
742  ret <2 x i64> %r2
743}
744
745define <16 x i32> @insert_v16i32(<16 x i32> %x, i32 %y, i32* %ptr) {
746; KNL-LABEL: insert_v16i32:
747; KNL:       ## BB#0:
748; KNL-NEXT:    vpinsrd $1, (%rsi), %xmm0, %xmm1
749; KNL-NEXT:    vinserti32x4 $0, %xmm1, %zmm0, %zmm0
750; KNL-NEXT:    vextracti32x4 $1, %zmm0, %xmm1
751; KNL-NEXT:    vpinsrd $1, %edi, %xmm1, %xmm1
752; KNL-NEXT:    vinserti32x4 $1, %xmm1, %zmm0, %zmm0
753; KNL-NEXT:    retq
754;
755; SKX-LABEL: insert_v16i32:
756; SKX:       ## BB#0:
757; SKX-NEXT:    vpinsrd $1, (%rsi), %xmm0, %xmm1
758; SKX-NEXT:    vinserti32x4 $0, %xmm1, %zmm0, %zmm0
759; SKX-NEXT:    vextracti32x4 $1, %zmm0, %xmm1
760; SKX-NEXT:    vpinsrd $1, %edi, %xmm1, %xmm1
761; SKX-NEXT:    vinserti32x4 $1, %xmm1, %zmm0, %zmm0
762; SKX-NEXT:    retq
763  %val = load i32, i32* %ptr
764  %r1 = insertelement <16 x i32> %x, i32 %val, i32 1
765  %r2 = insertelement <16 x i32> %r1, i32 %y, i32 5
766  ret <16 x i32> %r2
767}
768
769define <8 x i32> @insert_v8i32(<8 x i32> %x, i32 %y, i32* %ptr) {
770; KNL-LABEL: insert_v8i32:
771; KNL:       ## BB#0:
772; KNL-NEXT:    vpinsrd $1, (%rsi), %xmm0, %xmm1
773; KNL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]
774; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm1
775; KNL-NEXT:    vpinsrd $1, %edi, %xmm1, %xmm1
776; KNL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
777; KNL-NEXT:    retq
778;
779; SKX-LABEL: insert_v8i32:
780; SKX:       ## BB#0:
781; SKX-NEXT:    vpinsrd $1, (%rsi), %xmm0, %xmm1
782; SKX-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]
783; SKX-NEXT:    vextracti32x4 $1, %ymm0, %xmm1
784; SKX-NEXT:    vpinsrd $1, %edi, %xmm1, %xmm1
785; SKX-NEXT:    vinserti32x4 $1, %xmm1, %ymm0, %ymm0
786; SKX-NEXT:    retq
787  %val = load i32, i32* %ptr
788  %r1 = insertelement <8 x i32> %x, i32 %val, i32 1
789  %r2 = insertelement <8 x i32> %r1, i32 %y, i32 5
790  ret <8 x i32> %r2
791}
792
793define <4 x i32> @insert_v4i32(<4 x i32> %x, i32 %y, i32* %ptr) {
794; KNL-LABEL: insert_v4i32:
795; KNL:       ## BB#0:
796; KNL-NEXT:    vpinsrd $1, (%rsi), %xmm0, %xmm0
797; KNL-NEXT:    vpinsrd $3, %edi, %xmm0, %xmm0
798; KNL-NEXT:    retq
799;
800; SKX-LABEL: insert_v4i32:
801; SKX:       ## BB#0:
802; SKX-NEXT:    vpinsrd $1, (%rsi), %xmm0, %xmm0
803; SKX-NEXT:    vpinsrd $3, %edi, %xmm0, %xmm0
804; SKX-NEXT:    retq
805  %val = load i32, i32* %ptr
806  %r1 = insertelement <4 x i32> %x, i32 %val, i32 1
807  %r2 = insertelement <4 x i32> %r1, i32 %y, i32 3
808  ret <4 x i32> %r2
809}
810
811define <32 x i16> @insert_v32i16(<32 x i16> %x, i16 %y, i16* %ptr) {
812; KNL-LABEL: insert_v32i16:
813; KNL:       ## BB#0:
814; KNL-NEXT:    vpinsrw $1, (%rsi), %xmm0, %xmm2
815; KNL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7]
816; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm2
817; KNL-NEXT:    vpinsrw $1, %edi, %xmm2, %xmm2
818; KNL-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
819; KNL-NEXT:    retq
820;
821; SKX-LABEL: insert_v32i16:
822; SKX:       ## BB#0:
823; SKX-NEXT:    vpinsrw $1, (%rsi), %xmm0, %xmm1
824; SKX-NEXT:    vinserti32x4 $0, %xmm1, %zmm0, %zmm0
825; SKX-NEXT:    vextracti32x4 $1, %zmm0, %xmm1
826; SKX-NEXT:    vpinsrw $1, %edi, %xmm1, %xmm1
827; SKX-NEXT:    vinserti32x4 $1, %xmm1, %zmm0, %zmm0
828; SKX-NEXT:    retq
829  %val = load i16, i16* %ptr
830  %r1 = insertelement <32 x i16> %x, i16 %val, i32 1
831  %r2 = insertelement <32 x i16> %r1, i16 %y, i32 9
832  ret <32 x i16> %r2
833}
834
835define <16 x i16> @insert_v16i16(<16 x i16> %x, i16 %y, i16* %ptr) {
836; KNL-LABEL: insert_v16i16:
837; KNL:       ## BB#0:
838; KNL-NEXT:    vpinsrw $1, (%rsi), %xmm0, %xmm1
839; KNL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]
840; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm1
841; KNL-NEXT:    vpinsrw $1, %edi, %xmm1, %xmm1
842; KNL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
843; KNL-NEXT:    retq
844;
845; SKX-LABEL: insert_v16i16:
846; SKX:       ## BB#0:
847; SKX-NEXT:    vpinsrw $1, (%rsi), %xmm0, %xmm1
848; SKX-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]
849; SKX-NEXT:    vextracti32x4 $1, %ymm0, %xmm1
850; SKX-NEXT:    vpinsrw $1, %edi, %xmm1, %xmm1
851; SKX-NEXT:    vinserti32x4 $1, %xmm1, %ymm0, %ymm0
852; SKX-NEXT:    retq
853  %val = load i16, i16* %ptr
854  %r1 = insertelement <16 x i16> %x, i16 %val, i32 1
855  %r2 = insertelement <16 x i16> %r1, i16 %y, i32 9
856  ret <16 x i16> %r2
857}
858
859define <8 x i16> @insert_v8i16(<8 x i16> %x, i16 %y, i16* %ptr) {
860; KNL-LABEL: insert_v8i16:
861; KNL:       ## BB#0:
862; KNL-NEXT:    vpinsrw $1, (%rsi), %xmm0, %xmm0
863; KNL-NEXT:    vpinsrw $5, %edi, %xmm0, %xmm0
864; KNL-NEXT:    retq
865;
866; SKX-LABEL: insert_v8i16:
867; SKX:       ## BB#0:
868; SKX-NEXT:    vpinsrw $1, (%rsi), %xmm0, %xmm0
869; SKX-NEXT:    vpinsrw $5, %edi, %xmm0, %xmm0
870; SKX-NEXT:    retq
871  %val = load i16, i16* %ptr
872  %r1 = insertelement <8 x i16> %x, i16 %val, i32 1
873  %r2 = insertelement <8 x i16> %r1, i16 %y, i32 5
874  ret <8 x i16> %r2
875}
876
877define <64 x i8> @insert_v64i8(<64 x i8> %x, i8 %y, i8* %ptr) {
878; KNL-LABEL: insert_v64i8:
879; KNL:       ## BB#0:
880; KNL-NEXT:    vpinsrb $1, (%rsi), %xmm0, %xmm2
881; KNL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm2[0,1,2,3],ymm0[4,5,6,7]
882; KNL-NEXT:    vextracti128 $1, %ymm1, %xmm2
883; KNL-NEXT:    vpinsrb $2, %edi, %xmm2, %xmm2
884; KNL-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
885; KNL-NEXT:    retq
886;
887; SKX-LABEL: insert_v64i8:
888; SKX:       ## BB#0:
889; SKX-NEXT:    vpinsrb $1, (%rsi), %xmm0, %xmm1
890; SKX-NEXT:    vinserti32x4 $0, %xmm1, %zmm0, %zmm0
891; SKX-NEXT:    vextracti32x4 $3, %zmm0, %xmm1
892; SKX-NEXT:    vpinsrb $2, %edi, %xmm1, %xmm1
893; SKX-NEXT:    vinserti32x4 $3, %xmm1, %zmm0, %zmm0
894; SKX-NEXT:    retq
895  %val = load i8, i8* %ptr
896  %r1 = insertelement <64 x i8> %x, i8 %val, i32 1
897  %r2 = insertelement <64 x i8> %r1, i8 %y, i32 50
898  ret <64 x i8> %r2
899}
900
901define <32 x i8> @insert_v32i8(<32 x i8> %x, i8 %y, i8* %ptr) {
902; KNL-LABEL: insert_v32i8:
903; KNL:       ## BB#0:
904; KNL-NEXT:    vpinsrb $1, (%rsi), %xmm0, %xmm1
905; KNL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]
906; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm1
907; KNL-NEXT:    vpinsrb $1, %edi, %xmm1, %xmm1
908; KNL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
909; KNL-NEXT:    retq
910;
911; SKX-LABEL: insert_v32i8:
912; SKX:       ## BB#0:
913; SKX-NEXT:    vpinsrb $1, (%rsi), %xmm0, %xmm1
914; SKX-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]
915; SKX-NEXT:    vextracti32x4 $1, %ymm0, %xmm1
916; SKX-NEXT:    vpinsrb $1, %edi, %xmm1, %xmm1
917; SKX-NEXT:    vinserti32x4 $1, %xmm1, %ymm0, %ymm0
918; SKX-NEXT:    retq
919  %val = load i8, i8* %ptr
920  %r1 = insertelement <32 x i8> %x, i8 %val, i32 1
921  %r2 = insertelement <32 x i8> %r1, i8 %y, i32 17
922  ret <32 x i8> %r2
923}
924
925define <16 x i8> @insert_v16i8(<16 x i8> %x, i8 %y, i8* %ptr) {
926; KNL-LABEL: insert_v16i8:
927; KNL:       ## BB#0:
928; KNL-NEXT:    vpinsrb $3, (%rsi), %xmm0, %xmm0
929; KNL-NEXT:    vpinsrb $10, %edi, %xmm0, %xmm0
930; KNL-NEXT:    retq
931;
932; SKX-LABEL: insert_v16i8:
933; SKX:       ## BB#0:
934; SKX-NEXT:    vpinsrb $3, (%rsi), %xmm0, %xmm0
935; SKX-NEXT:    vpinsrb $10, %edi, %xmm0, %xmm0
936; SKX-NEXT:    retq
937  %val = load i8, i8* %ptr
938  %r1 = insertelement <16 x i8> %x, i8 %val, i32 3
939  %r2 = insertelement <16 x i8> %r1, i8 %y, i32 10
940  ret <16 x i8> %r2
941}
942
943define <8 x i64> @test_insert_128_v8i64(<8 x i64> %x, i64 %y) {
944; KNL-LABEL: test_insert_128_v8i64:
945; KNL:       ## BB#0:
946; KNL-NEXT:    vpinsrq $1, %rdi, %xmm0, %xmm1
947; KNL-NEXT:    vinserti32x4 $0, %xmm1, %zmm0, %zmm0
948; KNL-NEXT:    retq
949;
950; SKX-LABEL: test_insert_128_v8i64:
951; SKX:       ## BB#0:
952; SKX-NEXT:    vpinsrq $1, %rdi, %xmm0, %xmm1
953; SKX-NEXT:    vinserti64x2 $0, %xmm1, %zmm0, %zmm0
954; SKX-NEXT:    retq
955  %r = insertelement <8 x i64> %x, i64 %y, i32 1
956  ret <8 x i64> %r
957}
958
959define <16 x i32> @test_insert_128_v16i32(<16 x i32> %x, i32 %y) {
960; KNL-LABEL: test_insert_128_v16i32:
961; KNL:       ## BB#0:
962; KNL-NEXT:    vpinsrd $1, %edi, %xmm0, %xmm1
963; KNL-NEXT:    vinserti32x4 $0, %xmm1, %zmm0, %zmm0
964; KNL-NEXT:    retq
965;
966; SKX-LABEL: test_insert_128_v16i32:
967; SKX:       ## BB#0:
968; SKX-NEXT:    vpinsrd $1, %edi, %xmm0, %xmm1
969; SKX-NEXT:    vinserti32x4 $0, %xmm1, %zmm0, %zmm0
970; SKX-NEXT:    retq
971  %r = insertelement <16 x i32> %x, i32 %y, i32 1
972  ret <16 x i32> %r
973}
974
975define <8 x double> @test_insert_128_v8f64(<8 x double> %x, double %y) {
976; KNL-LABEL: test_insert_128_v8f64:
977; KNL:       ## BB#0:
978; KNL-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm0[0],xmm1[0]
979; KNL-NEXT:    vinsertf32x4 $0, %xmm1, %zmm0, %zmm0
980; KNL-NEXT:    retq
981;
982; SKX-LABEL: test_insert_128_v8f64:
983; SKX:       ## BB#0:
984; SKX-NEXT:    vunpcklpd {{.*#+}} xmm1 = xmm0[0],xmm1[0]
985; SKX-NEXT:    vinsertf64x2 $0, %xmm1, %zmm0, %zmm0
986; SKX-NEXT:    retq
987  %r = insertelement <8 x double> %x, double %y, i32 1
988  ret <8 x double> %r
989}
990
991define <16 x float> @test_insert_128_v16f32(<16 x float> %x, float %y) {
992; KNL-LABEL: test_insert_128_v16f32:
993; KNL:       ## BB#0:
994; KNL-NEXT:    vinsertps {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[2,3]
995; KNL-NEXT:    vinsertf32x4 $0, %xmm1, %zmm0, %zmm0
996; KNL-NEXT:    retq
997;
998; SKX-LABEL: test_insert_128_v16f32:
999; SKX:       ## BB#0:
1000; SKX-NEXT:    vinsertps {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[2,3]
1001; SKX-NEXT:    vinsertf32x4 $0, %xmm1, %zmm0, %zmm0
1002; SKX-NEXT:    retq
1003  %r = insertelement <16 x float> %x, float %y, i32 1
1004  ret <16 x float> %r
1005}
1006
1007define <16 x i16> @test_insert_128_v16i16(<16 x i16> %x, i16 %y) {
1008; KNL-LABEL: test_insert_128_v16i16:
1009; KNL:       ## BB#0:
1010; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm1
1011; KNL-NEXT:    vpinsrw $2, %edi, %xmm1, %xmm1
1012; KNL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1013; KNL-NEXT:    retq
1014;
1015; SKX-LABEL: test_insert_128_v16i16:
1016; SKX:       ## BB#0:
1017; SKX-NEXT:    vextracti32x4 $1, %ymm0, %xmm1
1018; SKX-NEXT:    vpinsrw $2, %edi, %xmm1, %xmm1
1019; SKX-NEXT:    vinserti32x4 $1, %xmm1, %ymm0, %ymm0
1020; SKX-NEXT:    retq
1021  %r = insertelement <16 x i16> %x, i16 %y, i32 10
1022  ret <16 x i16> %r
1023}
1024
1025define <32 x i8> @test_insert_128_v32i8(<32 x i8> %x, i8 %y) {
1026; KNL-LABEL: test_insert_128_v32i8:
1027; KNL:       ## BB#0:
1028; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm1
1029; KNL-NEXT:    vpinsrb $4, %edi, %xmm1, %xmm1
1030; KNL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1031; KNL-NEXT:    retq
1032;
1033; SKX-LABEL: test_insert_128_v32i8:
1034; SKX:       ## BB#0:
1035; SKX-NEXT:    vextracti32x4 $1, %ymm0, %xmm1
1036; SKX-NEXT:    vpinsrb $4, %edi, %xmm1, %xmm1
1037; SKX-NEXT:    vinserti32x4 $1, %xmm1, %ymm0, %ymm0
1038; SKX-NEXT:    retq
1039  %r = insertelement <32 x i8> %x, i8 %y, i32 20
1040  ret <32 x i8> %r
1041}
1042
1043define i32 @test_insertelement_v32i1(i32 %a, i32 %b, <32 x i32> %x , <32 x i32> %y) {
1044; KNL-LABEL: test_insertelement_v32i1:
1045; KNL:       ## BB#0:
1046; KNL-NEXT:    pushq %rbp
1047; KNL-NEXT:  Lcfi0:
1048; KNL-NEXT:    .cfi_def_cfa_offset 16
1049; KNL-NEXT:  Lcfi1:
1050; KNL-NEXT:    .cfi_offset %rbp, -16
1051; KNL-NEXT:    movq %rsp, %rbp
1052; KNL-NEXT:  Lcfi2:
1053; KNL-NEXT:    .cfi_def_cfa_register %rbp
1054; KNL-NEXT:    andq $-32, %rsp
1055; KNL-NEXT:    subq $32, %rsp
1056; KNL-NEXT:    cmpl %esi, %edi
1057; KNL-NEXT:    vpcmpltud %zmm3, %zmm1, %k0
1058; KNL-NEXT:    kshiftlw $14, %k0, %k1
1059; KNL-NEXT:    kshiftrw $15, %k1, %k1
1060; KNL-NEXT:    kmovw %k1, %eax
1061; KNL-NEXT:    kshiftlw $15, %k0, %k1
1062; KNL-NEXT:    kshiftrw $15, %k1, %k1
1063; KNL-NEXT:    kmovw %k1, %ecx
1064; KNL-NEXT:    vmovd %ecx, %xmm1
1065; KNL-NEXT:    vpinsrb $1, %eax, %xmm1, %xmm1
1066; KNL-NEXT:    kshiftlw $13, %k0, %k1
1067; KNL-NEXT:    kshiftrw $15, %k1, %k1
1068; KNL-NEXT:    kmovw %k1, %eax
1069; KNL-NEXT:    vpinsrb $2, %eax, %xmm1, %xmm1
1070; KNL-NEXT:    kshiftlw $12, %k0, %k1
1071; KNL-NEXT:    kshiftrw $15, %k1, %k1
1072; KNL-NEXT:    kmovw %k1, %eax
1073; KNL-NEXT:    vpinsrb $3, %eax, %xmm1, %xmm1
1074; KNL-NEXT:    kshiftlw $11, %k0, %k1
1075; KNL-NEXT:    kshiftrw $15, %k1, %k1
1076; KNL-NEXT:    kmovw %k1, %eax
1077; KNL-NEXT:    vpinsrb $4, %eax, %xmm1, %xmm1
1078; KNL-NEXT:    kshiftlw $10, %k0, %k1
1079; KNL-NEXT:    kshiftrw $15, %k1, %k1
1080; KNL-NEXT:    kmovw %k1, %eax
1081; KNL-NEXT:    vpinsrb $5, %eax, %xmm1, %xmm1
1082; KNL-NEXT:    kshiftlw $9, %k0, %k1
1083; KNL-NEXT:    kshiftrw $15, %k1, %k1
1084; KNL-NEXT:    kmovw %k1, %eax
1085; KNL-NEXT:    vpinsrb $6, %eax, %xmm1, %xmm1
1086; KNL-NEXT:    kshiftlw $8, %k0, %k1
1087; KNL-NEXT:    kshiftrw $15, %k1, %k1
1088; KNL-NEXT:    kmovw %k1, %eax
1089; KNL-NEXT:    vpinsrb $7, %eax, %xmm1, %xmm1
1090; KNL-NEXT:    kshiftlw $7, %k0, %k1
1091; KNL-NEXT:    kshiftrw $15, %k1, %k1
1092; KNL-NEXT:    kmovw %k1, %eax
1093; KNL-NEXT:    vpinsrb $8, %eax, %xmm1, %xmm1
1094; KNL-NEXT:    kshiftlw $6, %k0, %k1
1095; KNL-NEXT:    kshiftrw $15, %k1, %k1
1096; KNL-NEXT:    kmovw %k1, %eax
1097; KNL-NEXT:    vpinsrb $9, %eax, %xmm1, %xmm1
1098; KNL-NEXT:    kshiftlw $5, %k0, %k1
1099; KNL-NEXT:    kshiftrw $15, %k1, %k1
1100; KNL-NEXT:    kmovw %k1, %eax
1101; KNL-NEXT:    vpinsrb $10, %eax, %xmm1, %xmm1
1102; KNL-NEXT:    kshiftlw $4, %k0, %k1
1103; KNL-NEXT:    kshiftrw $15, %k1, %k1
1104; KNL-NEXT:    kmovw %k1, %eax
1105; KNL-NEXT:    vpinsrb $11, %eax, %xmm1, %xmm1
1106; KNL-NEXT:    kshiftlw $3, %k0, %k1
1107; KNL-NEXT:    kshiftrw $15, %k1, %k1
1108; KNL-NEXT:    kmovw %k1, %eax
1109; KNL-NEXT:    vpinsrb $12, %eax, %xmm1, %xmm1
1110; KNL-NEXT:    kshiftlw $2, %k0, %k1
1111; KNL-NEXT:    kshiftrw $15, %k1, %k1
1112; KNL-NEXT:    kmovw %k1, %eax
1113; KNL-NEXT:    vpinsrb $13, %eax, %xmm1, %xmm1
1114; KNL-NEXT:    kshiftlw $1, %k0, %k1
1115; KNL-NEXT:    kshiftrw $15, %k1, %k1
1116; KNL-NEXT:    kmovw %k1, %eax
1117; KNL-NEXT:    vpinsrb $14, %eax, %xmm1, %xmm1
1118; KNL-NEXT:    kshiftrw $15, %k0, %k0
1119; KNL-NEXT:    kmovw %k0, %eax
1120; KNL-NEXT:    vpinsrb $15, %eax, %xmm1, %xmm1
1121; KNL-NEXT:    vpcmpltud %zmm2, %zmm0, %k0
1122; KNL-NEXT:    kshiftlw $14, %k0, %k1
1123; KNL-NEXT:    kshiftrw $15, %k1, %k1
1124; KNL-NEXT:    kmovw %k1, %eax
1125; KNL-NEXT:    kshiftlw $15, %k0, %k1
1126; KNL-NEXT:    kshiftrw $15, %k1, %k1
1127; KNL-NEXT:    kmovw %k1, %ecx
1128; KNL-NEXT:    vmovd %ecx, %xmm0
1129; KNL-NEXT:    vpinsrb $1, %eax, %xmm0, %xmm0
1130; KNL-NEXT:    kshiftlw $13, %k0, %k1
1131; KNL-NEXT:    kshiftrw $15, %k1, %k1
1132; KNL-NEXT:    kmovw %k1, %eax
1133; KNL-NEXT:    vpinsrb $2, %eax, %xmm0, %xmm0
1134; KNL-NEXT:    kshiftlw $12, %k0, %k1
1135; KNL-NEXT:    kshiftrw $15, %k1, %k1
1136; KNL-NEXT:    kmovw %k1, %eax
1137; KNL-NEXT:    vpinsrb $3, %eax, %xmm0, %xmm0
1138; KNL-NEXT:    kshiftlw $11, %k0, %k1
1139; KNL-NEXT:    kshiftrw $15, %k1, %k1
1140; KNL-NEXT:    kmovw %k1, %eax
1141; KNL-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm0
1142; KNL-NEXT:    kshiftlw $10, %k0, %k1
1143; KNL-NEXT:    kshiftrw $15, %k1, %k1
1144; KNL-NEXT:    kmovw %k1, %eax
1145; KNL-NEXT:    vpinsrb $5, %eax, %xmm0, %xmm0
1146; KNL-NEXT:    kshiftlw $9, %k0, %k1
1147; KNL-NEXT:    kshiftrw $15, %k1, %k1
1148; KNL-NEXT:    kmovw %k1, %eax
1149; KNL-NEXT:    vpinsrb $6, %eax, %xmm0, %xmm0
1150; KNL-NEXT:    kshiftlw $8, %k0, %k1
1151; KNL-NEXT:    kshiftrw $15, %k1, %k1
1152; KNL-NEXT:    kmovw %k1, %eax
1153; KNL-NEXT:    vpinsrb $7, %eax, %xmm0, %xmm0
1154; KNL-NEXT:    kshiftlw $7, %k0, %k1
1155; KNL-NEXT:    kshiftrw $15, %k1, %k1
1156; KNL-NEXT:    kmovw %k1, %eax
1157; KNL-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
1158; KNL-NEXT:    kshiftlw $6, %k0, %k1
1159; KNL-NEXT:    kshiftrw $15, %k1, %k1
1160; KNL-NEXT:    kmovw %k1, %eax
1161; KNL-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
1162; KNL-NEXT:    kshiftlw $5, %k0, %k1
1163; KNL-NEXT:    kshiftrw $15, %k1, %k1
1164; KNL-NEXT:    kmovw %k1, %eax
1165; KNL-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
1166; KNL-NEXT:    kshiftlw $4, %k0, %k1
1167; KNL-NEXT:    kshiftrw $15, %k1, %k1
1168; KNL-NEXT:    kmovw %k1, %eax
1169; KNL-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
1170; KNL-NEXT:    kshiftlw $3, %k0, %k1
1171; KNL-NEXT:    kshiftrw $15, %k1, %k1
1172; KNL-NEXT:    kmovw %k1, %eax
1173; KNL-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
1174; KNL-NEXT:    kshiftlw $2, %k0, %k1
1175; KNL-NEXT:    kshiftrw $15, %k1, %k1
1176; KNL-NEXT:    kmovw %k1, %eax
1177; KNL-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
1178; KNL-NEXT:    kshiftlw $1, %k0, %k1
1179; KNL-NEXT:    kshiftrw $15, %k1, %k1
1180; KNL-NEXT:    kmovw %k1, %eax
1181; KNL-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
1182; KNL-NEXT:    kshiftrw $15, %k0, %k0
1183; KNL-NEXT:    kmovw %k0, %eax
1184; KNL-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
1185; KNL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1186; KNL-NEXT:    vpsllw $7, %ymm0, %ymm0
1187; KNL-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1188; KNL-NEXT:    vpxor %ymm1, %ymm1, %ymm1
1189; KNL-NEXT:    vpcmpgtb %ymm0, %ymm1, %ymm0
1190; KNL-NEXT:    sbbl %eax, %eax
1191; KNL-NEXT:    andl $1, %eax
1192; KNL-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm1
1193; KNL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]
1194; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm1
1195; KNL-NEXT:    vpmovsxbd %xmm1, %zmm1
1196; KNL-NEXT:    vpslld $31, %zmm1, %zmm1
1197; KNL-NEXT:    vptestmd %zmm1, %zmm1, %k0
1198; KNL-NEXT:    kmovw %k0, {{[0-9]+}}(%rsp)
1199; KNL-NEXT:    vpmovsxbd %xmm0, %zmm0
1200; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
1201; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
1202; KNL-NEXT:    kmovw %k0, (%rsp)
1203; KNL-NEXT:    movl (%rsp), %eax
1204; KNL-NEXT:    movq %rbp, %rsp
1205; KNL-NEXT:    popq %rbp
1206; KNL-NEXT:    retq
1207;
1208; SKX-LABEL: test_insertelement_v32i1:
1209; SKX:       ## BB#0:
1210; SKX-NEXT:    cmpl %esi, %edi
1211; SKX-NEXT:    setb %al
1212; SKX-NEXT:    andl $1, %eax
1213; SKX-NEXT:    kmovw %eax, %k0
1214; SKX-NEXT:    vpcmpltud %zmm2, %zmm0, %k1
1215; SKX-NEXT:    vpcmpltud %zmm3, %zmm1, %k2
1216; SKX-NEXT:    kunpckwd %k1, %k2, %k1
1217; SKX-NEXT:    vpmovm2w %k1, %zmm0
1218; SKX-NEXT:    vpmovm2w %k0, %zmm1
1219; SKX-NEXT:    vmovdqu16 {{.*#+}} zmm2 = [0,1,2,3,32,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]
1220; SKX-NEXT:    vpermi2w %zmm1, %zmm0, %zmm2
1221; SKX-NEXT:    vpmovw2m %zmm2, %k0
1222; SKX-NEXT:    kmovd %k0, %eax
1223; SKX-NEXT:    retq
1224  %cmp_res_i1 = icmp ult i32 %a, %b
1225  %cmp_cmp_vec = icmp ult <32 x i32> %x, %y
1226  %maskv = insertelement <32 x i1> %cmp_cmp_vec, i1 %cmp_res_i1, i32 4
1227  %res = bitcast <32 x i1> %maskv to i32
1228  ret i32 %res
1229}
1230
1231define i8 @test_iinsertelement_v4i1(i32 %a, i32 %b, <4 x i32> %x , <4 x i32> %y) {
1232; KNL-LABEL: test_iinsertelement_v4i1:
1233; KNL:       ## BB#0:
1234; KNL-NEXT:    cmpl %esi, %edi
1235; KNL-NEXT:    setb %al
1236; KNL-NEXT:    andl $1, %eax
1237; KNL-NEXT:    kmovw %eax, %k1
1238; KNL-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm2
1239; KNL-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1240; KNL-NEXT:    vpxor %xmm2, %xmm1, %xmm1
1241; KNL-NEXT:    vpcmpgtd %xmm0, %xmm1, %xmm0
1242; KNL-NEXT:    vpextrd $1, %xmm0, %eax
1243; KNL-NEXT:    andl $1, %eax
1244; KNL-NEXT:    kmovw %eax, %k2
1245; KNL-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1
1246; KNL-NEXT:    vmovdqa64 %zmm1, %zmm2 {%k2} {z}
1247; KNL-NEXT:    vmovd %xmm0, %eax
1248; KNL-NEXT:    andl $1, %eax
1249; KNL-NEXT:    kmovw %eax, %k2
1250; KNL-NEXT:    vmovdqa64 %zmm1, %zmm3 {%k2} {z}
1251; KNL-NEXT:    vmovdqa64 {{.*#+}} zmm4 = [0,8,2,3,4,5,6,7]
1252; KNL-NEXT:    vpermi2q %zmm2, %zmm3, %zmm4
1253; KNL-NEXT:    vpsllq $63, %zmm4, %zmm2
1254; KNL-NEXT:    vptestmq %zmm2, %zmm2, %k2
1255; KNL-NEXT:    vmovdqa64 %zmm1, %zmm2 {%k2} {z}
1256; KNL-NEXT:    vmovdqa64 %zmm1, %zmm3 {%k1} {z}
1257; KNL-NEXT:    vmovdqa64 {{.*#+}} zmm4 = [0,1,8,3,4,5,6,7]
1258; KNL-NEXT:    vpermi2q %zmm3, %zmm2, %zmm4
1259; KNL-NEXT:    vpsllq $63, %zmm4, %zmm2
1260; KNL-NEXT:    vptestmq %zmm2, %zmm2, %k1
1261; KNL-NEXT:    vmovdqa64 %zmm1, %zmm2 {%k1} {z}
1262; KNL-NEXT:    vpextrd $3, %xmm0, %eax
1263; KNL-NEXT:    andl $1, %eax
1264; KNL-NEXT:    kmovw %eax, %k1
1265; KNL-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1} {z}
1266; KNL-NEXT:    vmovdqa64 {{.*#+}} zmm1 = [0,1,2,8,4,5,6,7]
1267; KNL-NEXT:    vpermi2q %zmm0, %zmm2, %zmm1
1268; KNL-NEXT:    vpsllq $63, %zmm1, %zmm0
1269; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k0
1270; KNL-NEXT:    kmovw %k0, %eax
1271; KNL-NEXT:    retq
1272;
1273; SKX-LABEL: test_iinsertelement_v4i1:
1274; SKX:       ## BB#0:
1275; SKX-NEXT:    cmpl %esi, %edi
1276; SKX-NEXT:    setb %al
1277; SKX-NEXT:    andl $1, %eax
1278; SKX-NEXT:    kmovw %eax, %k0
1279; SKX-NEXT:    vpcmpltud %xmm1, %xmm0, %k1
1280; SKX-NEXT:    vpmovm2d %k1, %xmm0
1281; SKX-NEXT:    vpmovm2d %k0, %xmm1
1282; SKX-NEXT:    vpbroadcastq %xmm1, %xmm1
1283; SKX-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3]
1284; SKX-NEXT:    vpmovd2m %xmm0, %k0
1285; SKX-NEXT:    kmovb %k0, %eax
1286; SKX-NEXT:    retq
1287  %cmp_res_i1 = icmp ult i32 %a, %b
1288  %cmp_cmp_vec = icmp ult <4 x i32> %x, %y
1289  %maskv = insertelement <4 x i1> %cmp_cmp_vec, i1 %cmp_res_i1, i32 2
1290  %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>
1291  %res = bitcast <8 x i1> %res0 to i8
1292  ret i8 %res
1293}
1294
1295define i8 @test_iinsertelement_v2i1(i32 %a, i32 %b, <2 x i64> %x , <2 x i64> %y) {
1296; KNL-LABEL: test_iinsertelement_v2i1:
1297; KNL:       ## BB#0:
1298; KNL-NEXT:    cmpl %esi, %edi
1299; KNL-NEXT:    setb %al
1300; KNL-NEXT:    andl $1, %eax
1301; KNL-NEXT:    kmovw %eax, %k1
1302; KNL-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1303; KNL-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1304; KNL-NEXT:    vpxor %xmm2, %xmm1, %xmm1
1305; KNL-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm0
1306; KNL-NEXT:    vmovq %xmm0, %rax
1307; KNL-NEXT:    andl $1, %eax
1308; KNL-NEXT:    kmovw %eax, %k2
1309; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0
1310; KNL-NEXT:    vmovdqa64 %zmm0, %zmm1 {%k2} {z}
1311; KNL-NEXT:    vmovdqa64 %zmm0, %zmm0 {%k1} {z}
1312; KNL-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,8,2,3,4,5,6,7]
1313; KNL-NEXT:    vpermi2q %zmm0, %zmm1, %zmm2
1314; KNL-NEXT:    vpsllq $63, %zmm2, %zmm0
1315; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k0
1316; KNL-NEXT:    kmovw %k0, %eax
1317; KNL-NEXT:    retq
1318;
1319; SKX-LABEL: test_iinsertelement_v2i1:
1320; SKX:       ## BB#0:
1321; SKX-NEXT:    cmpl %esi, %edi
1322; SKX-NEXT:    setb %al
1323; SKX-NEXT:    andl $1, %eax
1324; SKX-NEXT:    kmovw %eax, %k0
1325; SKX-NEXT:    vpcmpltuq %xmm1, %xmm0, %k1
1326; SKX-NEXT:    kshiftlw $1, %k1, %k1
1327; SKX-NEXT:    kshiftrw $1, %k1, %k1
1328; SKX-NEXT:    kshiftlw $1, %k0, %k0
1329; SKX-NEXT:    korw %k0, %k1, %k0
1330; SKX-NEXT:    kmovb %k0, %eax
1331; SKX-NEXT:    retq
1332  %cmp_res_i1 = icmp ult i32 %a, %b
1333  %cmp_cmp_vec = icmp ult <2 x i64> %x, %y
1334  %maskv = insertelement <2 x i1> %cmp_cmp_vec, i1 %cmp_res_i1, i32 1
1335  %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>
1336  %res = bitcast <8 x i1> %res0 to i8
1337  ret i8 %res
1338}
1339
1340define zeroext i8 @test_extractelement_v2i1(<2 x i64> %a, <2 x i64> %b) {
1341; KNL-LABEL: test_extractelement_v2i1:
1342; KNL:       ## BB#0:
1343; KNL-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1344; KNL-NEXT:    vpxor %xmm2, %xmm1, %xmm1
1345; KNL-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1346; KNL-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
1347; KNL-NEXT:    vmovq %xmm0, %rax
1348; KNL-NEXT:    testb $1, %al
1349; KNL-NEXT:    sete %al
1350; KNL-NEXT:    addb $3, %al
1351; KNL-NEXT:    movzbl %al, %eax
1352; KNL-NEXT:    retq
1353;
1354; SKX-LABEL: test_extractelement_v2i1:
1355; SKX:       ## BB#0:
1356; SKX-NEXT:    vpcmpnleuq %xmm1, %xmm0, %k0
1357; SKX-NEXT:    kshiftlw $15, %k0, %k0
1358; SKX-NEXT:    kshiftrw $15, %k0, %k0
1359; SKX-NEXT:    kmovw %k0, %eax
1360; SKX-NEXT:    andl $1, %eax
1361; SKX-NEXT:    testb %al, %al
1362; SKX-NEXT:    sete %al
1363; SKX-NEXT:    addb $3, %al
1364; SKX-NEXT:    movzbl %al, %eax
1365; SKX-NEXT:    retq
1366  %t1 = icmp ugt <2 x i64> %a, %b
1367  %t2 = extractelement <2 x i1> %t1, i32 0
1368  %res = select i1 %t2, i8 3, i8 4
1369  ret i8 %res
1370}
1371
1372define zeroext i8 @test_extractelement_v4i1(<4 x i32> %a, <4 x i32> %b) {
1373; KNL-LABEL: test_extractelement_v4i1:
1374; KNL:       ## BB#0:
1375; KNL-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm2
1376; KNL-NEXT:    vpxor %xmm2, %xmm1, %xmm1
1377; KNL-NEXT:    vpxor %xmm2, %xmm0, %xmm0
1378; KNL-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
1379; KNL-NEXT:    vpextrd $3, %xmm0, %eax
1380; KNL-NEXT:    andl $1, %eax
1381; KNL-NEXT:    retq
1382;
1383; SKX-LABEL: test_extractelement_v4i1:
1384; SKX:       ## BB#0:
1385; SKX-NEXT:    vpcmpnleud %xmm1, %xmm0, %k0
1386; SKX-NEXT:    kshiftlw $12, %k0, %k0
1387; SKX-NEXT:    kshiftrw $15, %k0, %k0
1388; SKX-NEXT:    kmovw %k0, %eax
1389; SKX-NEXT:    andl $1, %eax
1390; SKX-NEXT:    retq
1391  %t1 = icmp ugt <4 x i32> %a, %b
1392  %t2 = extractelement <4 x i1> %t1, i32 3
1393  %res = zext i1 %t2 to i8
1394  ret i8 %res
1395}
1396
1397define zeroext i8 @test_extractelement_v32i1(<32 x i8> %a, <32 x i8> %b) {
1398; KNL-LABEL: test_extractelement_v32i1:
1399; KNL:       ## BB#0:
1400; KNL-NEXT:    vmovdqa {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
1401; KNL-NEXT:    vpxor %ymm2, %ymm1, %ymm1
1402; KNL-NEXT:    vpxor %ymm2, %ymm0, %ymm0
1403; KNL-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm0
1404; KNL-NEXT:    vpextrb $2, %xmm0, %eax
1405; KNL-NEXT:    andl $1, %eax
1406; KNL-NEXT:    retq
1407;
1408; SKX-LABEL: test_extractelement_v32i1:
1409; SKX:       ## BB#0:
1410; SKX-NEXT:    vpcmpnleub %ymm1, %ymm0, %k0
1411; SKX-NEXT:    kshiftld $29, %k0, %k0
1412; SKX-NEXT:    kshiftrd $31, %k0, %k0
1413; SKX-NEXT:    kmovw %k0, %eax
1414; SKX-NEXT:    andl $1, %eax
1415; SKX-NEXT:    retq
1416  %t1 = icmp ugt <32 x i8> %a, %b
1417  %t2 = extractelement <32 x i1> %t1, i32 2
1418  %res = zext i1 %t2 to i8
1419  ret i8 %res
1420}
1421
1422define zeroext i8 @test_extractelement_v64i1(<64 x i8> %a, <64 x i8> %b) {
1423; KNL-LABEL: test_extractelement_v64i1:
1424; KNL:       ## BB#0:
1425; KNL-NEXT:    vmovdqa {{.*#+}} ymm0 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
1426; KNL-NEXT:    vpxor %ymm0, %ymm3, %ymm2
1427; KNL-NEXT:    vpxor %ymm0, %ymm1, %ymm0
1428; KNL-NEXT:    vpcmpgtb %ymm2, %ymm0, %ymm0
1429; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm0
1430; KNL-NEXT:    vpextrb $15, %xmm0, %eax
1431; KNL-NEXT:    testb $1, %al
1432; KNL-NEXT:    sete %al
1433; KNL-NEXT:    addb $3, %al
1434; KNL-NEXT:    movzbl %al, %eax
1435; KNL-NEXT:    retq
1436;
1437; SKX-LABEL: test_extractelement_v64i1:
1438; SKX:       ## BB#0:
1439; SKX-NEXT:    vpcmpnleub %zmm1, %zmm0, %k0
1440; SKX-NEXT:    kshiftrq $63, %k0, %k0
1441; SKX-NEXT:    kmovw %k0, %eax
1442; SKX-NEXT:    andl $1, %eax
1443; SKX-NEXT:    testb %al, %al
1444; SKX-NEXT:    sete %al
1445; SKX-NEXT:    addb $3, %al
1446; SKX-NEXT:    movzbl %al, %eax
1447; SKX-NEXT:    retq
1448  %t1 = icmp ugt <64 x i8> %a, %b
1449  %t2 = extractelement <64 x i1> %t1, i32 63
1450  %res = select i1 %t2, i8 3, i8 4
1451  ret i8 %res
1452}
1453