2238 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f | FileCheck --check-prefixes=CHECK,KNL %s3; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f,+avx512bw,+avx512vl,+avx512dq | FileCheck --check-prefixes=CHECK,SKX %s4; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f,+avx512bw,+avx512vl,+avx512dq,+avx512vbmi | FileCheck --check-prefixes=CHECK,SKX %s5 6define <16 x float> @test1(<16 x float> %x, ptr %br, float %y) nounwind {7; KNL-LABEL: test1:8; KNL: ## %bb.0:9; KNL-NEXT: vinsertps {{.*#+}} xmm2 = xmm0[0],mem[0],xmm0[2,3]10; KNL-NEXT: vinsertf32x4 $0, %xmm2, %zmm0, %zmm011; KNL-NEXT: movw $16384, %ax ## imm = 0x400012; KNL-NEXT: kmovw %eax, %k113; KNL-NEXT: vbroadcastss %xmm1, %zmm0 {%k1}14; KNL-NEXT: retq15;16; SKX-LABEL: test1:17; SKX: ## %bb.0:18; SKX-NEXT: vinsertps {{.*#+}} xmm2 = xmm0[0],mem[0],xmm0[2,3]19; SKX-NEXT: vinsertf32x4 $0, %xmm2, %zmm0, %zmm020; SKX-NEXT: movw $16384, %ax ## imm = 0x400021; SKX-NEXT: kmovd %eax, %k122; SKX-NEXT: vbroadcastss %xmm1, %zmm0 {%k1}23; SKX-NEXT: retq24 %rrr = load float, ptr %br25 %rrr2 = insertelement <16 x float> %x, float %rrr, i32 126 %rrr3 = insertelement <16 x float> %rrr2, float %y, i32 1427 ret <16 x float> %rrr328}29 30define <8 x double> @test2(<8 x double> %x, ptr %br, double %y) nounwind {31; KNL-LABEL: test2:32; KNL: ## %bb.0:33; KNL-NEXT: vmovhpd {{.*#+}} xmm2 = xmm0[0],mem[0]34; KNL-NEXT: vinsertf32x4 $0, %xmm2, %zmm0, %zmm035; KNL-NEXT: movb $64, %al36; KNL-NEXT: kmovw %eax, %k137; KNL-NEXT: vbroadcastsd %xmm1, %zmm0 {%k1}38; KNL-NEXT: retq39;40; SKX-LABEL: test2:41; SKX: ## %bb.0:42; SKX-NEXT: vmovhpd {{.*#+}} xmm2 = xmm0[0],mem[0]43; SKX-NEXT: vinsertf32x4 $0, %xmm2, %zmm0, %zmm044; SKX-NEXT: movb $64, %al45; SKX-NEXT: kmovd %eax, %k146; SKX-NEXT: vbroadcastsd %xmm1, %zmm0 {%k1}47; SKX-NEXT: retq48 %rrr = load double, ptr %br49 %rrr2 = insertelement <8 x double> %x, double %rrr, i32 150 %rrr3 = insertelement <8 x double> %rrr2, double %y, i32 651 ret <8 x double> %rrr352}53 54define <16 x float> @test3(<16 x float> %x) nounwind {55; CHECK-LABEL: test3:56; CHECK: ## %bb.0:57; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm158; CHECK-NEXT: vinsertps {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[2,3]59; CHECK-NEXT: vinsertf32x4 $0, %xmm1, %zmm0, %zmm060; CHECK-NEXT: retq61 %eee = extractelement <16 x float> %x, i32 462 %rrr2 = insertelement <16 x float> %x, float %eee, i32 163 ret <16 x float> %rrr264}65 66define <8 x i64> @test4(<8 x i64> %x) nounwind {67; CHECK-LABEL: test4:68; CHECK: ## %bb.0:69; CHECK-NEXT: vextractf32x4 $2, %zmm0, %xmm170; CHECK-NEXT: vmovlhps {{.*#+}} xmm1 = xmm0[0],xmm1[0]71; CHECK-NEXT: vinsertf32x4 $0, %xmm1, %zmm0, %zmm072; CHECK-NEXT: retq73 %eee = extractelement <8 x i64> %x, i32 474 %rrr2 = insertelement <8 x i64> %x, i64 %eee, i32 175 ret <8 x i64> %rrr276}77 78define i32 @test5(<4 x float> %x) nounwind {79; CHECK-LABEL: test5:80; CHECK: ## %bb.0:81; CHECK-NEXT: vextractps $3, %xmm0, %eax82; CHECK-NEXT: retq83 %ef = extractelement <4 x float> %x, i32 384 %ei = bitcast float %ef to i3285 ret i32 %ei86}87 88define void @test6(<4 x float> %x, ptr %out) nounwind {89; CHECK-LABEL: test6:90; CHECK: ## %bb.0:91; CHECK-NEXT: vextractps $3, %xmm0, (%rdi)92; CHECK-NEXT: retq93 %ef = extractelement <4 x float> %x, i32 394 store float %ef, ptr %out, align 495 ret void96}97 98define float @test7(<16 x float> %x, i32 %ind) nounwind {99; CHECK-LABEL: test7:100; CHECK: ## %bb.0:101; CHECK-NEXT: pushq %rbp102; CHECK-NEXT: movq %rsp, %rbp103; CHECK-NEXT: andq $-64, %rsp104; CHECK-NEXT: subq $128, %rsp105; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi106; CHECK-NEXT: vmovaps %zmm0, (%rsp)107; CHECK-NEXT: andl $15, %edi108; CHECK-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero109; CHECK-NEXT: movq %rbp, %rsp110; CHECK-NEXT: popq %rbp111; CHECK-NEXT: vzeroupper112; CHECK-NEXT: retq113 %e = extractelement <16 x float> %x, i32 %ind114 ret float %e115}116 117define double @test8(<8 x double> %x, i32 %ind) nounwind {118; CHECK-LABEL: test8:119; CHECK: ## %bb.0:120; CHECK-NEXT: pushq %rbp121; CHECK-NEXT: movq %rsp, %rbp122; CHECK-NEXT: andq $-64, %rsp123; CHECK-NEXT: subq $128, %rsp124; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi125; CHECK-NEXT: vmovaps %zmm0, (%rsp)126; CHECK-NEXT: andl $7, %edi127; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero128; CHECK-NEXT: movq %rbp, %rsp129; CHECK-NEXT: popq %rbp130; CHECK-NEXT: vzeroupper131; CHECK-NEXT: retq132 %e = extractelement <8 x double> %x, i32 %ind133 ret double %e134}135 136define float @test9(<8 x float> %x, i32 %ind) nounwind {137; CHECK-LABEL: test9:138; CHECK: ## %bb.0:139; CHECK-NEXT: pushq %rbp140; CHECK-NEXT: movq %rsp, %rbp141; CHECK-NEXT: andq $-32, %rsp142; CHECK-NEXT: subq $64, %rsp143; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi144; CHECK-NEXT: vmovaps %ymm0, (%rsp)145; CHECK-NEXT: andl $7, %edi146; CHECK-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero147; CHECK-NEXT: movq %rbp, %rsp148; CHECK-NEXT: popq %rbp149; CHECK-NEXT: vzeroupper150; CHECK-NEXT: retq151 %e = extractelement <8 x float> %x, i32 %ind152 ret float %e153}154 155define i32 @test10(<16 x i32> %x, i32 %ind) nounwind {156; CHECK-LABEL: test10:157; CHECK: ## %bb.0:158; CHECK-NEXT: pushq %rbp159; CHECK-NEXT: movq %rsp, %rbp160; CHECK-NEXT: andq $-64, %rsp161; CHECK-NEXT: subq $128, %rsp162; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi163; CHECK-NEXT: vmovaps %zmm0, (%rsp)164; CHECK-NEXT: andl $15, %edi165; CHECK-NEXT: movl (%rsp,%rdi,4), %eax166; CHECK-NEXT: movq %rbp, %rsp167; CHECK-NEXT: popq %rbp168; CHECK-NEXT: vzeroupper169; CHECK-NEXT: retq170 %e = extractelement <16 x i32> %x, i32 %ind171 ret i32 %e172}173 174define <16 x i32> @test11(<16 x i32>%a, <16 x i32>%b) nounwind {175; KNL-LABEL: test11:176; KNL: ## %bb.0:177; KNL-NEXT: vpcmpltud %zmm1, %zmm0, %k0178; KNL-NEXT: kmovw %k0, %eax179; KNL-NEXT: testb $16, %al180; KNL-NEXT: je LBB10_2181; KNL-NEXT: ## %bb.1: ## %A182; KNL-NEXT: vmovdqa64 %zmm1, %zmm0183; KNL-NEXT: retq184; KNL-NEXT: LBB10_2: ## %B185; KNL-NEXT: vpaddd %zmm0, %zmm1, %zmm0186; KNL-NEXT: retq187;188; SKX-LABEL: test11:189; SKX: ## %bb.0:190; SKX-NEXT: vpcmpltud %zmm1, %zmm0, %k0191; SKX-NEXT: kmovd %k0, %eax192; SKX-NEXT: testb $16, %al193; SKX-NEXT: je LBB10_2194; SKX-NEXT: ## %bb.1: ## %A195; SKX-NEXT: vmovdqa64 %zmm1, %zmm0196; SKX-NEXT: retq197; SKX-NEXT: LBB10_2: ## %B198; SKX-NEXT: vpaddd %zmm0, %zmm1, %zmm0199; SKX-NEXT: retq200 %cmp_res = icmp ult <16 x i32> %a, %b201 %ia = extractelement <16 x i1> %cmp_res, i32 4202 br i1 %ia, label %A, label %B203 A:204 ret <16 x i32>%b205 B:206 %c = add <16 x i32>%b, %a207 ret <16 x i32>%c208}209 210define i64 @test12(<16 x i64>%a, <16 x i64>%b, i64 %a1, i64 %b1) nounwind {211; KNL-LABEL: test12:212; KNL: ## %bb.0:213; KNL-NEXT: movq %rdi, %rax214; KNL-NEXT: vpcmpgtq %zmm0, %zmm2, %k0215; KNL-NEXT: kmovw %k0, %ecx216; KNL-NEXT: testb $1, %cl217; KNL-NEXT: cmoveq %rsi, %rax218; KNL-NEXT: vzeroupper219; KNL-NEXT: retq220;221; SKX-LABEL: test12:222; SKX: ## %bb.0:223; SKX-NEXT: movq %rdi, %rax224; SKX-NEXT: vpcmpgtq %zmm0, %zmm2, %k0225; SKX-NEXT: kmovd %k0, %ecx226; SKX-NEXT: testb $1, %cl227; SKX-NEXT: cmoveq %rsi, %rax228; SKX-NEXT: vzeroupper229; SKX-NEXT: retq230 %cmpvector_func.i = icmp slt <16 x i64> %a, %b231 %extract24vector_func.i = extractelement <16 x i1> %cmpvector_func.i, i32 0232 %res = select i1 %extract24vector_func.i, i64 %a1, i64 %b1233 ret i64 %res234}235 236define i16 @test13(i32 %a, i32 %b) nounwind {237; KNL-LABEL: test13:238; KNL: ## %bb.0:239; KNL-NEXT: cmpl %esi, %edi240; KNL-NEXT: setb %al241; KNL-NEXT: movw $-4, %cx242; KNL-NEXT: kmovw %ecx, %k0243; KNL-NEXT: kshiftrw $1, %k0, %k0244; KNL-NEXT: kshiftlw $1, %k0, %k0245; KNL-NEXT: andl $1, %eax246; KNL-NEXT: kmovw %eax, %k1247; KNL-NEXT: korw %k1, %k0, %k0248; KNL-NEXT: kmovw %k0, %eax249; KNL-NEXT: ## kill: def $ax killed $ax killed $eax250; KNL-NEXT: retq251;252; SKX-LABEL: test13:253; SKX: ## %bb.0:254; SKX-NEXT: cmpl %esi, %edi255; SKX-NEXT: setb %al256; SKX-NEXT: movw $-4, %cx257; SKX-NEXT: kmovd %ecx, %k0258; SKX-NEXT: kshiftrw $1, %k0, %k0259; SKX-NEXT: kshiftlw $1, %k0, %k0260; SKX-NEXT: andl $1, %eax261; SKX-NEXT: kmovw %eax, %k1262; SKX-NEXT: korw %k1, %k0, %k0263; SKX-NEXT: kmovd %k0, %eax264; SKX-NEXT: ## kill: def $ax killed $ax killed $eax265; SKX-NEXT: retq266 %cmp_res = icmp ult i32 %a, %b267 %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 0268 %res = bitcast <16 x i1> %maskv to i16269 ret i16 %res270}271 272define i64 @test14(<8 x i64>%a, <8 x i64>%b, i64 %a1, i64 %b1) nounwind {273; KNL-LABEL: test14:274; KNL: ## %bb.0:275; KNL-NEXT: movq %rdi, %rax276; KNL-NEXT: vpcmpgtq %zmm0, %zmm1, %k0277; KNL-NEXT: kmovw %k0, %ecx278; KNL-NEXT: testb $16, %cl279; KNL-NEXT: cmoveq %rsi, %rax280; KNL-NEXT: vzeroupper281; KNL-NEXT: retq282;283; SKX-LABEL: test14:284; SKX: ## %bb.0:285; SKX-NEXT: movq %rdi, %rax286; SKX-NEXT: vpcmpgtq %zmm0, %zmm1, %k0287; SKX-NEXT: kmovd %k0, %ecx288; SKX-NEXT: testb $16, %cl289; SKX-NEXT: cmoveq %rsi, %rax290; SKX-NEXT: vzeroupper291; SKX-NEXT: retq292 %cmpvector_func.i = icmp slt <8 x i64> %a, %b293 %extract24vector_func.i = extractelement <8 x i1> %cmpvector_func.i, i32 4294 %res = select i1 %extract24vector_func.i, i64 %a1, i64 %b1295 ret i64 %res296}297 298define i16 @test15(ptr%addr) nounwind {299; CHECK-LABEL: test15:300; CHECK: ## %bb.0:301; CHECK-NEXT: movzbl (%rdi), %eax302; CHECK-NEXT: negl %eax303; CHECK-NEXT: ## kill: def $ax killed $ax killed $eax304; CHECK-NEXT: retq305 %x = load i1 , ptr %addr, align 1306 %x1 = insertelement <16 x i1> undef, i1 %x, i32 10307 %x2 = bitcast <16 x i1>%x1 to i16308 ret i16 %x2309}310 311define i16 @test16(ptr%addr, i16 %a) nounwind {312; KNL-LABEL: test16:313; KNL: ## %bb.0:314; KNL-NEXT: movzbl (%rdi), %eax315; KNL-NEXT: kmovw %esi, %k0316; KNL-NEXT: movw $-1025, %cx ## imm = 0xFBFF317; KNL-NEXT: kmovw %ecx, %k1318; KNL-NEXT: kandw %k1, %k0, %k0319; KNL-NEXT: kmovw %eax, %k1320; KNL-NEXT: kshiftlw $15, %k1, %k1321; KNL-NEXT: kshiftrw $5, %k1, %k1322; KNL-NEXT: korw %k1, %k0, %k0323; KNL-NEXT: kmovw %k0, %eax324; KNL-NEXT: ## kill: def $ax killed $ax killed $eax325; KNL-NEXT: retq326;327; SKX-LABEL: test16:328; SKX: ## %bb.0:329; SKX-NEXT: kmovb (%rdi), %k0330; SKX-NEXT: kmovd %esi, %k1331; SKX-NEXT: movw $-1025, %ax ## imm = 0xFBFF332; SKX-NEXT: kmovd %eax, %k2333; SKX-NEXT: kandw %k2, %k1, %k1334; SKX-NEXT: kshiftlw $15, %k0, %k0335; SKX-NEXT: kshiftrw $5, %k0, %k0336; SKX-NEXT: korw %k0, %k1, %k0337; SKX-NEXT: kmovd %k0, %eax338; SKX-NEXT: ## kill: def $ax killed $ax killed $eax339; SKX-NEXT: retq340 %x = load i1 , ptr %addr, align 128341 %a1 = bitcast i16 %a to <16 x i1>342 %x1 = insertelement <16 x i1> %a1, i1 %x, i32 10343 %x2 = bitcast <16 x i1>%x1 to i16344 ret i16 %x2345}346 347define i8 @test17(ptr%addr, i8 %a) nounwind {348; KNL-LABEL: test17:349; KNL: ## %bb.0:350; KNL-NEXT: movzbl (%rdi), %eax351; KNL-NEXT: kmovw %esi, %k0352; KNL-NEXT: movw $-17, %cx353; KNL-NEXT: kmovw %ecx, %k1354; KNL-NEXT: kandw %k1, %k0, %k0355; KNL-NEXT: kmovw %eax, %k1356; KNL-NEXT: kshiftlw $15, %k1, %k1357; KNL-NEXT: kshiftrw $11, %k1, %k1358; KNL-NEXT: korw %k1, %k0, %k0359; KNL-NEXT: kmovw %k0, %eax360; KNL-NEXT: ## kill: def $al killed $al killed $eax361; KNL-NEXT: retq362;363; SKX-LABEL: test17:364; SKX: ## %bb.0:365; SKX-NEXT: kmovb (%rdi), %k0366; SKX-NEXT: kmovd %esi, %k1367; SKX-NEXT: movb $-17, %al368; SKX-NEXT: kmovd %eax, %k2369; SKX-NEXT: kandb %k2, %k1, %k1370; SKX-NEXT: kshiftlb $7, %k0, %k0371; SKX-NEXT: kshiftrb $3, %k0, %k0372; SKX-NEXT: korb %k0, %k1, %k0373; SKX-NEXT: kmovd %k0, %eax374; SKX-NEXT: ## kill: def $al killed $al killed $eax375; SKX-NEXT: retq376 %x = load i1 , ptr %addr, align 128377 %a1 = bitcast i8 %a to <8 x i1>378 %x1 = insertelement <8 x i1> %a1, i1 %x, i32 4379 %x2 = bitcast <8 x i1>%x1 to i8380 ret i8 %x2381}382 383define i64 @extract_v8i64(<8 x i64> %x, ptr %dst) nounwind {384; CHECK-LABEL: extract_v8i64:385; CHECK: ## %bb.0:386; CHECK-NEXT: vpextrq $1, %xmm0, %rax387; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm0388; CHECK-NEXT: vpextrq $1, %xmm0, (%rdi)389; CHECK-NEXT: vzeroupper390; CHECK-NEXT: retq391 %r1 = extractelement <8 x i64> %x, i32 1392 %r2 = extractelement <8 x i64> %x, i32 3393 store i64 %r2, ptr %dst, align 1394 ret i64 %r1395}396 397define i64 @extract_v4i64(<4 x i64> %x, ptr %dst) nounwind {398; CHECK-LABEL: extract_v4i64:399; CHECK: ## %bb.0:400; CHECK-NEXT: vpextrq $1, %xmm0, %rax401; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm0402; CHECK-NEXT: vpextrq $1, %xmm0, (%rdi)403; CHECK-NEXT: vzeroupper404; CHECK-NEXT: retq405 %r1 = extractelement <4 x i64> %x, i32 1406 %r2 = extractelement <4 x i64> %x, i32 3407 store i64 %r2, ptr %dst, align 1408 ret i64 %r1409}410 411define i64 @extract_v2i64(<2 x i64> %x, ptr %dst) nounwind {412; CHECK-LABEL: extract_v2i64:413; CHECK: ## %bb.0:414; CHECK-NEXT: vmovq %xmm0, %rax415; CHECK-NEXT: vpextrq $1, %xmm0, (%rdi)416; CHECK-NEXT: retq417 %r1 = extractelement <2 x i64> %x, i32 0418 %r2 = extractelement <2 x i64> %x, i32 1419 store i64 %r2, ptr %dst, align 1420 ret i64 %r1421}422 423define i32 @extract_v16i32(<16 x i32> %x, ptr %dst) nounwind {424; CHECK-LABEL: extract_v16i32:425; CHECK: ## %bb.0:426; CHECK-NEXT: vextractps $1, %xmm0, %eax427; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm0428; CHECK-NEXT: vextractps $1, %xmm0, (%rdi)429; CHECK-NEXT: vzeroupper430; CHECK-NEXT: retq431 %r1 = extractelement <16 x i32> %x, i32 1432 %r2 = extractelement <16 x i32> %x, i32 5433 store i32 %r2, ptr %dst, align 1434 ret i32 %r1435}436 437define i32 @extract_v8i32(<8 x i32> %x, ptr %dst) nounwind {438; CHECK-LABEL: extract_v8i32:439; CHECK: ## %bb.0:440; CHECK-NEXT: vextractps $1, %xmm0, %eax441; CHECK-NEXT: vextractf128 $1, %ymm0, %xmm0442; CHECK-NEXT: vextractps $1, %xmm0, (%rdi)443; CHECK-NEXT: vzeroupper444; CHECK-NEXT: retq445 %r1 = extractelement <8 x i32> %x, i32 1446 %r2 = extractelement <8 x i32> %x, i32 5447 store i32 %r2, ptr %dst, align 1448 ret i32 %r1449}450 451define i32 @extract_v4i32(<4 x i32> %x, ptr %dst) nounwind {452; CHECK-LABEL: extract_v4i32:453; CHECK: ## %bb.0:454; CHECK-NEXT: vextractps $1, %xmm0, %eax455; CHECK-NEXT: vextractps $3, %xmm0, (%rdi)456; CHECK-NEXT: retq457 %r1 = extractelement <4 x i32> %x, i32 1458 %r2 = extractelement <4 x i32> %x, i32 3459 store i32 %r2, ptr %dst, align 1460 ret i32 %r1461}462 463define i16 @extract_v32i16(<32 x i16> %x, ptr %dst) nounwind {464; CHECK-LABEL: extract_v32i16:465; CHECK: ## %bb.0:466; CHECK-NEXT: vpextrw $1, %xmm0, %eax467; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm0468; CHECK-NEXT: vpextrw $1, %xmm0, (%rdi)469; CHECK-NEXT: ## kill: def $ax killed $ax killed $eax470; CHECK-NEXT: vzeroupper471; CHECK-NEXT: retq472 %r1 = extractelement <32 x i16> %x, i32 1473 %r2 = extractelement <32 x i16> %x, i32 9474 store i16 %r2, ptr %dst, align 1475 ret i16 %r1476}477 478define i16 @extract_v16i16(<16 x i16> %x, ptr %dst) nounwind {479; CHECK-LABEL: extract_v16i16:480; CHECK: ## %bb.0:481; CHECK-NEXT: vpextrw $1, %xmm0, %eax482; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm0483; CHECK-NEXT: vpextrw $1, %xmm0, (%rdi)484; CHECK-NEXT: ## kill: def $ax killed $ax killed $eax485; CHECK-NEXT: vzeroupper486; CHECK-NEXT: retq487 %r1 = extractelement <16 x i16> %x, i32 1488 %r2 = extractelement <16 x i16> %x, i32 9489 store i16 %r2, ptr %dst, align 1490 ret i16 %r1491}492 493define i16 @extract_v8i16(<8 x i16> %x, ptr %dst) nounwind {494; CHECK-LABEL: extract_v8i16:495; CHECK: ## %bb.0:496; CHECK-NEXT: vpextrw $1, %xmm0, %eax497; CHECK-NEXT: vpextrw $3, %xmm0, (%rdi)498; CHECK-NEXT: ## kill: def $ax killed $ax killed $eax499; CHECK-NEXT: retq500 %r1 = extractelement <8 x i16> %x, i32 1501 %r2 = extractelement <8 x i16> %x, i32 3502 store i16 %r2, ptr %dst, align 1503 ret i16 %r1504}505 506define i8 @extract_v64i8(<64 x i8> %x, ptr %dst) nounwind {507; CHECK-LABEL: extract_v64i8:508; CHECK: ## %bb.0:509; CHECK-NEXT: vpextrb $1, %xmm0, %eax510; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm0511; CHECK-NEXT: vpextrb $1, %xmm0, (%rdi)512; CHECK-NEXT: ## kill: def $al killed $al killed $eax513; CHECK-NEXT: vzeroupper514; CHECK-NEXT: retq515 %r1 = extractelement <64 x i8> %x, i32 1516 %r2 = extractelement <64 x i8> %x, i32 17517 store i8 %r2, ptr %dst, align 1518 ret i8 %r1519}520 521define i8 @extract_v32i8(<32 x i8> %x, ptr %dst) nounwind {522; CHECK-LABEL: extract_v32i8:523; CHECK: ## %bb.0:524; CHECK-NEXT: vpextrb $1, %xmm0, %eax525; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm0526; CHECK-NEXT: vpextrb $1, %xmm0, (%rdi)527; CHECK-NEXT: ## kill: def $al killed $al killed $eax528; CHECK-NEXT: vzeroupper529; CHECK-NEXT: retq530 %r1 = extractelement <32 x i8> %x, i32 1531 %r2 = extractelement <32 x i8> %x, i32 17532 store i8 %r2, ptr %dst, align 1533 ret i8 %r1534}535 536define i8 @extract_v16i8(<16 x i8> %x, ptr %dst) nounwind {537; CHECK-LABEL: extract_v16i8:538; CHECK: ## %bb.0:539; CHECK-NEXT: vpextrb $1, %xmm0, %eax540; CHECK-NEXT: vpextrb $3, %xmm0, (%rdi)541; CHECK-NEXT: ## kill: def $al killed $al killed $eax542; CHECK-NEXT: retq543 %r1 = extractelement <16 x i8> %x, i32 1544 %r2 = extractelement <16 x i8> %x, i32 3545 store i8 %r2, ptr %dst, align 1546 ret i8 %r1547}548 549define <8 x i64> @insert_v8i64(<8 x i64> %x, i64 %y , ptr %ptr) nounwind {550; KNL-LABEL: insert_v8i64:551; KNL: ## %bb.0:552; KNL-NEXT: vpinsrq $1, (%rsi), %xmm0, %xmm1553; KNL-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0554; KNL-NEXT: movb $8, %al555; KNL-NEXT: kmovw %eax, %k1556; KNL-NEXT: vpbroadcastq %rdi, %zmm0 {%k1}557; KNL-NEXT: retq558;559; SKX-LABEL: insert_v8i64:560; SKX: ## %bb.0:561; SKX-NEXT: vpinsrq $1, (%rsi), %xmm0, %xmm1562; SKX-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0563; SKX-NEXT: movb $8, %al564; SKX-NEXT: kmovd %eax, %k1565; SKX-NEXT: vpbroadcastq %rdi, %zmm0 {%k1}566; SKX-NEXT: retq567 %val = load i64, ptr %ptr568 %r1 = insertelement <8 x i64> %x, i64 %val, i32 1569 %r2 = insertelement <8 x i64> %r1, i64 %y, i32 3570 ret <8 x i64> %r2571}572 573define <4 x i64> @insert_v4i64(<4 x i64> %x, i64 %y , ptr %ptr) nounwind {574; KNL-LABEL: insert_v4i64:575; KNL: ## %bb.0:576; KNL-NEXT: vpinsrq $1, (%rsi), %xmm0, %xmm1577; KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]578; KNL-NEXT: vmovq %rdi, %xmm1579; KNL-NEXT: vpbroadcastq %xmm1, %ymm1580; KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5],ymm1[6,7]581; KNL-NEXT: retq582;583; SKX-LABEL: insert_v4i64:584; SKX: ## %bb.0:585; SKX-NEXT: vpinsrq $1, (%rsi), %xmm0, %xmm1586; SKX-NEXT: vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]587; SKX-NEXT: vpbroadcastq %rdi, %ymm1588; SKX-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4,5],ymm1[6,7]589; SKX-NEXT: retq590 %val = load i64, ptr %ptr591 %r1 = insertelement <4 x i64> %x, i64 %val, i32 1592 %r2 = insertelement <4 x i64> %r1, i64 %y, i32 3593 ret <4 x i64> %r2594}595 596define <2 x i64> @insert_v2i64(<2 x i64> %x, i64 %y , ptr %ptr) nounwind {597; CHECK-LABEL: insert_v2i64:598; CHECK: ## %bb.0:599; CHECK-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero600; CHECK-NEXT: vmovq %rdi, %xmm1601; CHECK-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]602; CHECK-NEXT: retq603 %val = load i64, ptr %ptr604 %r1 = insertelement <2 x i64> %x, i64 %val, i32 1605 %r2 = insertelement <2 x i64> %r1, i64 %y, i32 0606 ret <2 x i64> %r2607}608 609define <16 x i32> @insert_v16i32(<16 x i32> %x, i32 %y, ptr %ptr) nounwind {610; KNL-LABEL: insert_v16i32:611; KNL: ## %bb.0:612; KNL-NEXT: vpinsrd $1, (%rsi), %xmm0, %xmm1613; KNL-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0614; KNL-NEXT: movw $32, %ax615; KNL-NEXT: kmovw %eax, %k1616; KNL-NEXT: vpbroadcastd %edi, %zmm0 {%k1}617; KNL-NEXT: retq618;619; SKX-LABEL: insert_v16i32:620; SKX: ## %bb.0:621; SKX-NEXT: vpinsrd $1, (%rsi), %xmm0, %xmm1622; SKX-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0623; SKX-NEXT: movw $32, %ax624; SKX-NEXT: kmovd %eax, %k1625; SKX-NEXT: vpbroadcastd %edi, %zmm0 {%k1}626; SKX-NEXT: retq627 %val = load i32, ptr %ptr628 %r1 = insertelement <16 x i32> %x, i32 %val, i32 1629 %r2 = insertelement <16 x i32> %r1, i32 %y, i32 5630 ret <16 x i32> %r2631}632 633define <8 x i32> @insert_v8i32(<8 x i32> %x, i32 %y, ptr %ptr) nounwind {634; KNL-LABEL: insert_v8i32:635; KNL: ## %bb.0:636; KNL-NEXT: vpinsrd $1, (%rsi), %xmm0, %xmm1637; KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]638; KNL-NEXT: vmovd %edi, %xmm1639; KNL-NEXT: vpbroadcastd %xmm1, %ymm1640; KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm1[5],ymm0[6,7]641; KNL-NEXT: retq642;643; SKX-LABEL: insert_v8i32:644; SKX: ## %bb.0:645; SKX-NEXT: vpinsrd $1, (%rsi), %xmm0, %xmm1646; SKX-NEXT: vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]647; SKX-NEXT: vpbroadcastd %edi, %ymm1648; SKX-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3,4],ymm1[5],ymm0[6,7]649; SKX-NEXT: retq650 %val = load i32, ptr %ptr651 %r1 = insertelement <8 x i32> %x, i32 %val, i32 1652 %r2 = insertelement <8 x i32> %r1, i32 %y, i32 5653 ret <8 x i32> %r2654}655 656define <4 x i32> @insert_v4i32(<4 x i32> %x, i32 %y, ptr %ptr) nounwind {657; CHECK-LABEL: insert_v4i32:658; CHECK: ## %bb.0:659; CHECK-NEXT: vpinsrd $1, (%rsi), %xmm0, %xmm0660; CHECK-NEXT: vpinsrd $3, %edi, %xmm0, %xmm0661; CHECK-NEXT: retq662 %val = load i32, ptr %ptr663 %r1 = insertelement <4 x i32> %x, i32 %val, i32 1664 %r2 = insertelement <4 x i32> %r1, i32 %y, i32 3665 ret <4 x i32> %r2666}667 668define <32 x i16> @insert_v32i16(<32 x i16> %x, i16 %y, ptr %ptr) nounwind {669; KNL-LABEL: insert_v32i16:670; KNL: ## %bb.0:671; KNL-NEXT: vpinsrw $1, (%rsi), %xmm0, %xmm1672; KNL-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm1673; KNL-NEXT: vmovd %edi, %xmm0674; KNL-NEXT: vpbroadcastw %xmm0, %ymm0675; KNL-NEXT: vpternlogq {{.*#+}} zmm0 = zmm0 ^ (mem & (zmm0 ^ zmm1))676; KNL-NEXT: retq677;678; SKX-LABEL: insert_v32i16:679; SKX: ## %bb.0:680; SKX-NEXT: vpinsrw $1, (%rsi), %xmm0, %xmm1681; SKX-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0682; SKX-NEXT: movl $512, %eax ## imm = 0x200683; SKX-NEXT: kmovd %eax, %k1684; SKX-NEXT: vpbroadcastw %edi, %zmm0 {%k1}685; SKX-NEXT: retq686 %val = load i16, ptr %ptr687 %r1 = insertelement <32 x i16> %x, i16 %val, i32 1688 %r2 = insertelement <32 x i16> %r1, i16 %y, i32 9689 ret <32 x i16> %r2690}691 692define <16 x i16> @insert_v16i16(<16 x i16> %x, i16 %y, ptr %ptr) nounwind {693; KNL-LABEL: insert_v16i16:694; KNL: ## %bb.0:695; KNL-NEXT: vpinsrw $1, (%rsi), %xmm0, %xmm1696; KNL-NEXT: vmovd %edi, %xmm2697; KNL-NEXT: vpbroadcastw %xmm2, %ymm2698; KNL-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0],ymm2[1],ymm0[2,3,4,5,6,7,8],ymm2[9],ymm0[10,11,12,13,14,15]699; KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]700; KNL-NEXT: retq701;702; SKX-LABEL: insert_v16i16:703; SKX: ## %bb.0:704; SKX-NEXT: vpinsrw $1, (%rsi), %xmm0, %xmm1705; SKX-NEXT: vpbroadcastw %edi, %ymm2706; SKX-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0],ymm2[1],ymm0[2,3,4,5,6,7,8],ymm2[9],ymm0[10,11,12,13,14,15]707; SKX-NEXT: vpblendd {{.*#+}} ymm0 = ymm1[0,1,2,3],ymm0[4,5,6,7]708; SKX-NEXT: retq709 %val = load i16, ptr %ptr710 %r1 = insertelement <16 x i16> %x, i16 %val, i32 1711 %r2 = insertelement <16 x i16> %r1, i16 %y, i32 9712 ret <16 x i16> %r2713}714 715define <8 x i16> @insert_v8i16(<8 x i16> %x, i16 %y, ptr %ptr) nounwind {716; CHECK-LABEL: insert_v8i16:717; CHECK: ## %bb.0:718; CHECK-NEXT: vpinsrw $1, (%rsi), %xmm0, %xmm0719; CHECK-NEXT: vpinsrw $5, %edi, %xmm0, %xmm0720; CHECK-NEXT: retq721 %val = load i16, ptr %ptr722 %r1 = insertelement <8 x i16> %x, i16 %val, i32 1723 %r2 = insertelement <8 x i16> %r1, i16 %y, i32 5724 ret <8 x i16> %r2725}726 727define <64 x i8> @insert_v64i8(<64 x i8> %x, i8 %y, ptr %ptr) nounwind {728; CHECK-LABEL: insert_v64i8:729; CHECK: ## %bb.0:730; CHECK-NEXT: vpinsrb $1, (%rsi), %xmm0, %xmm1731; CHECK-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm1732; CHECK-NEXT: vextracti32x4 $3, %zmm0, %xmm0733; CHECK-NEXT: vpinsrb $2, %edi, %xmm0, %xmm0734; CHECK-NEXT: vinserti32x4 $3, %xmm0, %zmm1, %zmm0735; CHECK-NEXT: retq736 %val = load i8, ptr %ptr737 %r1 = insertelement <64 x i8> %x, i8 %val, i32 1738 %r2 = insertelement <64 x i8> %r1, i8 %y, i32 50739 ret <64 x i8> %r2740}741 742define <32 x i8> @insert_v32i8(<32 x i8> %x, i8 %y, ptr %ptr) nounwind {743; CHECK-LABEL: insert_v32i8:744; CHECK: ## %bb.0:745; CHECK-NEXT: vpinsrb $1, (%rsi), %xmm0, %xmm1746; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm0747; CHECK-NEXT: vpinsrb $1, %edi, %xmm0, %xmm0748; CHECK-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0749; CHECK-NEXT: retq750 %val = load i8, ptr %ptr751 %r1 = insertelement <32 x i8> %x, i8 %val, i32 1752 %r2 = insertelement <32 x i8> %r1, i8 %y, i32 17753 ret <32 x i8> %r2754}755 756define <16 x i8> @insert_v16i8(<16 x i8> %x, i8 %y, ptr %ptr) nounwind {757; CHECK-LABEL: insert_v16i8:758; CHECK: ## %bb.0:759; CHECK-NEXT: vpinsrb $3, (%rsi), %xmm0, %xmm0760; CHECK-NEXT: vpinsrb $10, %edi, %xmm0, %xmm0761; CHECK-NEXT: retq762 %val = load i8, ptr %ptr763 %r1 = insertelement <16 x i8> %x, i8 %val, i32 3764 %r2 = insertelement <16 x i8> %r1, i8 %y, i32 10765 ret <16 x i8> %r2766}767 768define <8 x i64> @test_insert_128_v8i64(<8 x i64> %x, i64 %y) nounwind {769; CHECK-LABEL: test_insert_128_v8i64:770; CHECK: ## %bb.0:771; CHECK-NEXT: vpinsrq $1, %rdi, %xmm0, %xmm1772; CHECK-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0773; CHECK-NEXT: retq774 %r = insertelement <8 x i64> %x, i64 %y, i32 1775 ret <8 x i64> %r776}777 778define <16 x i32> @test_insert_128_v16i32(<16 x i32> %x, i32 %y) nounwind {779; CHECK-LABEL: test_insert_128_v16i32:780; CHECK: ## %bb.0:781; CHECK-NEXT: vpinsrd $1, %edi, %xmm0, %xmm1782; CHECK-NEXT: vinserti32x4 $0, %xmm1, %zmm0, %zmm0783; CHECK-NEXT: retq784 %r = insertelement <16 x i32> %x, i32 %y, i32 1785 ret <16 x i32> %r786}787 788define <8 x double> @test_insert_128_v8f64(<8 x double> %x, double %y) nounwind {789; CHECK-LABEL: test_insert_128_v8f64:790; CHECK: ## %bb.0:791; CHECK-NEXT: vmovlhps {{.*#+}} xmm1 = xmm0[0],xmm1[0]792; CHECK-NEXT: vinsertf32x4 $0, %xmm1, %zmm0, %zmm0793; CHECK-NEXT: retq794 %r = insertelement <8 x double> %x, double %y, i32 1795 ret <8 x double> %r796}797 798define <16 x float> @test_insert_128_v16f32(<16 x float> %x, float %y) nounwind {799; CHECK-LABEL: test_insert_128_v16f32:800; CHECK: ## %bb.0:801; CHECK-NEXT: vinsertps {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[2,3]802; CHECK-NEXT: vinsertf32x4 $0, %xmm1, %zmm0, %zmm0803; CHECK-NEXT: retq804 %r = insertelement <16 x float> %x, float %y, i32 1805 ret <16 x float> %r806}807 808define <16 x i16> @test_insert_128_v16i16(<16 x i16> %x, i16 %y) nounwind {809; KNL-LABEL: test_insert_128_v16i16:810; KNL: ## %bb.0:811; KNL-NEXT: vmovd %edi, %xmm1812; KNL-NEXT: vpbroadcastw %xmm1, %ymm1813; 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]814; KNL-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]815; KNL-NEXT: retq816;817; SKX-LABEL: test_insert_128_v16i16:818; SKX: ## %bb.0:819; SKX-NEXT: vpbroadcastw %edi, %ymm1820; 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]821; SKX-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]822; SKX-NEXT: retq823 %r = insertelement <16 x i16> %x, i16 %y, i32 10824 ret <16 x i16> %r825}826 827define <32 x i8> @test_insert_128_v32i8(<32 x i8> %x, i8 %y) nounwind {828; CHECK-LABEL: test_insert_128_v32i8:829; CHECK: ## %bb.0:830; CHECK-NEXT: vextracti128 $1, %ymm0, %xmm1831; CHECK-NEXT: vpinsrb $4, %edi, %xmm1, %xmm1832; CHECK-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0833; CHECK-NEXT: retq834 %r = insertelement <32 x i8> %x, i8 %y, i32 20835 ret <32 x i8> %r836}837 838define i32 @test_insertelement_v32i1(i32 %a, i32 %b, <32 x i32> %x , <32 x i32> %y) nounwind {839; KNL-LABEL: test_insertelement_v32i1:840; KNL: ## %bb.0:841; KNL-NEXT: cmpl %esi, %edi842; KNL-NEXT: setb %al843; KNL-NEXT: vpcmpltud %zmm3, %zmm1, %k0844; KNL-NEXT: kmovw %k0, %ecx845; KNL-NEXT: shll $16, %ecx846; KNL-NEXT: movw $-17, %dx847; KNL-NEXT: kmovw %edx, %k1848; KNL-NEXT: vpcmpltud %zmm2, %zmm0, %k0 {%k1}849; KNL-NEXT: kmovw %eax, %k1850; KNL-NEXT: kshiftlw $15, %k1, %k1851; KNL-NEXT: kshiftrw $11, %k1, %k1852; KNL-NEXT: korw %k1, %k0, %k0853; KNL-NEXT: kmovw %k0, %eax854; KNL-NEXT: orl %ecx, %eax855; KNL-NEXT: vzeroupper856; KNL-NEXT: retq857;858; SKX-LABEL: test_insertelement_v32i1:859; SKX: ## %bb.0:860; SKX-NEXT: cmpl %esi, %edi861; SKX-NEXT: setb %al862; SKX-NEXT: vpcmpltud %zmm2, %zmm0, %k0863; SKX-NEXT: vpcmpltud %zmm3, %zmm1, %k1864; SKX-NEXT: kunpckwd %k0, %k1, %k0865; SKX-NEXT: movl $-17, %ecx866; SKX-NEXT: kmovd %ecx, %k1867; SKX-NEXT: kandd %k1, %k0, %k0868; SKX-NEXT: kmovd %eax, %k1869; SKX-NEXT: kshiftld $31, %k1, %k1870; SKX-NEXT: kshiftrd $27, %k1, %k1871; SKX-NEXT: kord %k1, %k0, %k0872; SKX-NEXT: kmovd %k0, %eax873; SKX-NEXT: vzeroupper874; SKX-NEXT: retq875 %cmp_res_i1 = icmp ult i32 %a, %b876 %cmp_cmp_vec = icmp ult <32 x i32> %x, %y877 %maskv = insertelement <32 x i1> %cmp_cmp_vec, i1 %cmp_res_i1, i32 4878 %res = bitcast <32 x i1> %maskv to i32879 ret i32 %res880}881 882define i8 @test_iinsertelement_v4i1(i32 %a, i32 %b, <4 x i32> %x , <4 x i32> %y) nounwind {883; KNL-LABEL: test_iinsertelement_v4i1:884; KNL: ## %bb.0:885; KNL-NEXT: ## kill: def $xmm1 killed $xmm1 def $zmm1886; KNL-NEXT: ## kill: def $xmm0 killed $xmm0 def $zmm0887; KNL-NEXT: cmpl %esi, %edi888; KNL-NEXT: setb %al889; KNL-NEXT: movw $-5, %cx890; KNL-NEXT: kmovw %ecx, %k1891; KNL-NEXT: vpcmpltud %zmm1, %zmm0, %k0 {%k1}892; KNL-NEXT: kmovw %eax, %k1893; KNL-NEXT: kshiftlw $15, %k1, %k1894; KNL-NEXT: kshiftrw $13, %k1, %k1895; KNL-NEXT: korw %k1, %k0, %k0896; KNL-NEXT: kmovw %k0, %eax897; KNL-NEXT: ## kill: def $al killed $al killed $eax898; KNL-NEXT: vzeroupper899; KNL-NEXT: retq900;901; SKX-LABEL: test_iinsertelement_v4i1:902; SKX: ## %bb.0:903; SKX-NEXT: cmpl %esi, %edi904; SKX-NEXT: setb %al905; SKX-NEXT: movb $-5, %cl906; SKX-NEXT: kmovd %ecx, %k1907; SKX-NEXT: vpcmpltud %xmm1, %xmm0, %k0 {%k1}908; SKX-NEXT: kmovd %eax, %k1909; SKX-NEXT: kshiftlb $7, %k1, %k1910; SKX-NEXT: kshiftrb $5, %k1, %k1911; SKX-NEXT: korw %k1, %k0, %k0912; SKX-NEXT: kmovd %k0, %eax913; SKX-NEXT: ## kill: def $al killed $al killed $eax914; SKX-NEXT: retq915 %cmp_res_i1 = icmp ult i32 %a, %b916 %cmp_cmp_vec = icmp ult <4 x i32> %x, %y917 %maskv = insertelement <4 x i1> %cmp_cmp_vec, i1 %cmp_res_i1, i32 2918 %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>919 %res = bitcast <8 x i1> %res0 to i8920 ret i8 %res921}922 923define i8 @test_iinsertelement_v2i1(i32 %a, i32 %b, <2 x i64> %x , <2 x i64> %y) nounwind {924; KNL-LABEL: test_iinsertelement_v2i1:925; KNL: ## %bb.0:926; KNL-NEXT: ## kill: def $xmm1 killed $xmm1 def $zmm1927; KNL-NEXT: ## kill: def $xmm0 killed $xmm0 def $zmm0928; KNL-NEXT: cmpl %esi, %edi929; KNL-NEXT: setb %al930; KNL-NEXT: vpcmpltuq %zmm1, %zmm0, %k0931; KNL-NEXT: kshiftlw $15, %k0, %k0932; KNL-NEXT: kshiftrw $15, %k0, %k0933; KNL-NEXT: kmovw %eax, %k1934; KNL-NEXT: kshiftlw $1, %k1, %k1935; KNL-NEXT: korw %k1, %k0, %k0936; KNL-NEXT: kmovw %k0, %eax937; KNL-NEXT: ## kill: def $al killed $al killed $eax938; KNL-NEXT: vzeroupper939; KNL-NEXT: retq940;941; SKX-LABEL: test_iinsertelement_v2i1:942; SKX: ## %bb.0:943; SKX-NEXT: cmpl %esi, %edi944; SKX-NEXT: setb %al945; SKX-NEXT: vpcmpltuq %xmm1, %xmm0, %k0946; SKX-NEXT: kshiftlb $7, %k0, %k0947; SKX-NEXT: kshiftrb $7, %k0, %k0948; SKX-NEXT: kmovd %eax, %k1949; SKX-NEXT: kshiftlb $1, %k1, %k1950; SKX-NEXT: korw %k1, %k0, %k0951; SKX-NEXT: kmovd %k0, %eax952; SKX-NEXT: ## kill: def $al killed $al killed $eax953; SKX-NEXT: retq954 %cmp_res_i1 = icmp ult i32 %a, %b955 %cmp_cmp_vec = icmp ult <2 x i64> %x, %y956 %maskv = insertelement <2 x i1> %cmp_cmp_vec, i1 %cmp_res_i1, i32 1957 %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>958 %res = bitcast <8 x i1> %res0 to i8959 ret i8 %res960}961 962define zeroext i8 @test_extractelement_v2i1(<2 x i64> %a, <2 x i64> %b) nounwind {963; KNL-LABEL: test_extractelement_v2i1:964; KNL: ## %bb.0:965; KNL-NEXT: ## kill: def $xmm1 killed $xmm1 def $zmm1966; KNL-NEXT: ## kill: def $xmm0 killed $xmm0 def $zmm0967; KNL-NEXT: vpcmpnleuq %zmm1, %zmm0, %k0968; KNL-NEXT: kmovw %k0, %ecx969; KNL-NEXT: andl $1, %ecx970; KNL-NEXT: movl $4, %eax971; KNL-NEXT: subl %ecx, %eax972; KNL-NEXT: vzeroupper973; KNL-NEXT: retq974;975; SKX-LABEL: test_extractelement_v2i1:976; SKX: ## %bb.0:977; SKX-NEXT: vpcmpnleuq %xmm1, %xmm0, %k0978; SKX-NEXT: kmovd %k0, %ecx979; SKX-NEXT: andl $1, %ecx980; SKX-NEXT: movl $4, %eax981; SKX-NEXT: subl %ecx, %eax982; SKX-NEXT: retq983 %t1 = icmp ugt <2 x i64> %a, %b984 %t2 = extractelement <2 x i1> %t1, i32 0985 %res = select i1 %t2, i8 3, i8 4986 ret i8 %res987}988 989define zeroext i8 @extractelement_v2i1_alt(<2 x i64> %a, <2 x i64> %b) nounwind {990; KNL-LABEL: extractelement_v2i1_alt:991; KNL: ## %bb.0:992; KNL-NEXT: ## kill: def $xmm1 killed $xmm1 def $zmm1993; KNL-NEXT: ## kill: def $xmm0 killed $xmm0 def $zmm0994; KNL-NEXT: vpcmpnleuq %zmm1, %zmm0, %k0995; KNL-NEXT: kmovw %k0, %eax996; KNL-NEXT: andb $1, %al997; KNL-NEXT: movb $4, %cl998; KNL-NEXT: subb %al, %cl999; KNL-NEXT: movzbl %cl, %eax1000; KNL-NEXT: vzeroupper1001; KNL-NEXT: retq1002;1003; SKX-LABEL: extractelement_v2i1_alt:1004; SKX: ## %bb.0:1005; SKX-NEXT: vpcmpnleuq %xmm1, %xmm0, %k01006; SKX-NEXT: kmovd %k0, %eax1007; SKX-NEXT: andb $1, %al1008; SKX-NEXT: movb $4, %cl1009; SKX-NEXT: subb %al, %cl1010; SKX-NEXT: movzbl %cl, %eax1011; SKX-NEXT: retq1012 %t1 = icmp ugt <2 x i64> %a, %b1013 %t2 = extractelement <2 x i1> %t1, i32 01014 %sext = sext i1 %t2 to i81015 %res = add i8 %sext, 41016 ret i8 %res1017}1018 1019define zeroext i8 @test_extractelement_v4i1(<4 x i32> %a, <4 x i32> %b) nounwind {1020; KNL-LABEL: test_extractelement_v4i1:1021; KNL: ## %bb.0:1022; KNL-NEXT: ## kill: def $xmm1 killed $xmm1 def $zmm11023; KNL-NEXT: ## kill: def $xmm0 killed $xmm0 def $zmm01024; KNL-NEXT: vpcmpnleud %zmm1, %zmm0, %k01025; KNL-NEXT: kshiftrw $3, %k0, %k01026; KNL-NEXT: kmovw %k0, %eax1027; KNL-NEXT: andl $1, %eax1028; KNL-NEXT: vzeroupper1029; KNL-NEXT: retq1030;1031; SKX-LABEL: test_extractelement_v4i1:1032; SKX: ## %bb.0:1033; SKX-NEXT: vpcmpnleud %xmm1, %xmm0, %k01034; SKX-NEXT: kshiftrb $3, %k0, %k01035; SKX-NEXT: kmovd %k0, %eax1036; SKX-NEXT: andl $1, %eax1037; SKX-NEXT: retq1038 %t1 = icmp ugt <4 x i32> %a, %b1039 %t2 = extractelement <4 x i1> %t1, i32 31040 %res = zext i1 %t2 to i81041 ret i8 %res1042}1043 1044define zeroext i8 @test_extractelement_v32i1(<32 x i8> %a, <32 x i8> %b) nounwind {1045; KNL-LABEL: test_extractelement_v32i1:1046; KNL: ## %bb.0:1047; KNL-NEXT: vpminub %xmm1, %xmm0, %xmm11048; KNL-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm01049; KNL-NEXT: vpextrb $2, %xmm0, %eax1050; KNL-NEXT: notb %al1051; KNL-NEXT: movzbl %al, %eax1052; KNL-NEXT: andl $1, %eax1053; KNL-NEXT: vzeroupper1054; KNL-NEXT: retq1055;1056; SKX-LABEL: test_extractelement_v32i1:1057; SKX: ## %bb.0:1058; SKX-NEXT: vpcmpnleub %ymm1, %ymm0, %k01059; SKX-NEXT: kshiftrd $2, %k0, %k01060; SKX-NEXT: kmovd %k0, %eax1061; SKX-NEXT: andl $1, %eax1062; SKX-NEXT: vzeroupper1063; SKX-NEXT: retq1064 %t1 = icmp ugt <32 x i8> %a, %b1065 %t2 = extractelement <32 x i1> %t1, i32 21066 %res = zext i1 %t2 to i81067 ret i8 %res1068}1069 1070define zeroext i8 @test_extractelement_v64i1(<64 x i8> %a, <64 x i8> %b) nounwind {1071; KNL-LABEL: test_extractelement_v64i1:1072; KNL: ## %bb.0:1073; KNL-NEXT: vextracti64x4 $1, %zmm1, %ymm11074; KNL-NEXT: vextracti64x4 $1, %zmm0, %ymm01075; KNL-NEXT: vpminub %ymm1, %ymm0, %ymm11076; KNL-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm01077; KNL-NEXT: vextracti128 $1, %ymm0, %xmm01078; KNL-NEXT: vpextrb $15, %xmm0, %eax1079; KNL-NEXT: notb %al1080; KNL-NEXT: movzbl %al, %ecx1081; KNL-NEXT: andl $1, %ecx1082; KNL-NEXT: movl $4, %eax1083; KNL-NEXT: subl %ecx, %eax1084; KNL-NEXT: vzeroupper1085; KNL-NEXT: retq1086;1087; SKX-LABEL: test_extractelement_v64i1:1088; SKX: ## %bb.0:1089; SKX-NEXT: vpcmpnleub %zmm1, %zmm0, %k01090; SKX-NEXT: kshiftrq $63, %k0, %k01091; SKX-NEXT: kmovd %k0, %ecx1092; SKX-NEXT: andl $1, %ecx1093; SKX-NEXT: movl $4, %eax1094; SKX-NEXT: subl %ecx, %eax1095; SKX-NEXT: vzeroupper1096; SKX-NEXT: retq1097 %t1 = icmp ugt <64 x i8> %a, %b1098 %t2 = extractelement <64 x i1> %t1, i32 631099 %res = select i1 %t2, i8 3, i8 41100 ret i8 %res1101}1102 1103define zeroext i8 @extractelement_v64i1_alt(<64 x i8> %a, <64 x i8> %b) nounwind {1104; KNL-LABEL: extractelement_v64i1_alt:1105; KNL: ## %bb.0:1106; KNL-NEXT: vextracti64x4 $1, %zmm1, %ymm11107; KNL-NEXT: vextracti64x4 $1, %zmm0, %ymm01108; KNL-NEXT: vpminub %ymm1, %ymm0, %ymm11109; KNL-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm01110; KNL-NEXT: vextracti128 $1, %ymm0, %xmm01111; KNL-NEXT: vpextrb $15, %xmm0, %eax1112; KNL-NEXT: notb %al1113; KNL-NEXT: addb $4, %al1114; KNL-NEXT: movzbl %al, %eax1115; KNL-NEXT: vzeroupper1116; KNL-NEXT: retq1117;1118; SKX-LABEL: extractelement_v64i1_alt:1119; SKX: ## %bb.0:1120; SKX-NEXT: vpcmpnleub %zmm1, %zmm0, %k01121; SKX-NEXT: kshiftrq $63, %k0, %k01122; SKX-NEXT: kmovd %k0, %eax1123; SKX-NEXT: andb $1, %al1124; SKX-NEXT: movb $4, %cl1125; SKX-NEXT: subb %al, %cl1126; SKX-NEXT: movzbl %cl, %eax1127; SKX-NEXT: vzeroupper1128; SKX-NEXT: retq1129 %t1 = icmp ugt <64 x i8> %a, %b1130 %t2 = extractelement <64 x i1> %t1, i32 631131 %sext = sext i1 %t2 to i81132 %res = add i8 %sext, 41133 ret i8 %res1134}1135 1136define i64 @test_extractelement_variable_v2i64(<2 x i64> %t1, i32 %index) nounwind {1137; CHECK-LABEL: test_extractelement_variable_v2i64:1138; CHECK: ## %bb.0:1139; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi1140; CHECK-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)1141; CHECK-NEXT: andl $1, %edi1142; CHECK-NEXT: movq -24(%rsp,%rdi,8), %rax1143; CHECK-NEXT: retq1144 %t2 = extractelement <2 x i64> %t1, i32 %index1145 ret i64 %t21146}1147 1148define i64 @test_extractelement_variable_v4i64(<4 x i64> %t1, i32 %index) nounwind {1149; CHECK-LABEL: test_extractelement_variable_v4i64:1150; CHECK: ## %bb.0:1151; CHECK-NEXT: pushq %rbp1152; CHECK-NEXT: movq %rsp, %rbp1153; CHECK-NEXT: andq $-32, %rsp1154; CHECK-NEXT: subq $64, %rsp1155; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi1156; CHECK-NEXT: vmovaps %ymm0, (%rsp)1157; CHECK-NEXT: andl $3, %edi1158; CHECK-NEXT: movq (%rsp,%rdi,8), %rax1159; CHECK-NEXT: movq %rbp, %rsp1160; CHECK-NEXT: popq %rbp1161; CHECK-NEXT: vzeroupper1162; CHECK-NEXT: retq1163 %t2 = extractelement <4 x i64> %t1, i32 %index1164 ret i64 %t21165}1166 1167define i64 @test_extractelement_variable_v8i64(<8 x i64> %t1, i32 %index) nounwind {1168; CHECK-LABEL: test_extractelement_variable_v8i64:1169; CHECK: ## %bb.0:1170; CHECK-NEXT: pushq %rbp1171; CHECK-NEXT: movq %rsp, %rbp1172; CHECK-NEXT: andq $-64, %rsp1173; CHECK-NEXT: subq $128, %rsp1174; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi1175; CHECK-NEXT: vmovaps %zmm0, (%rsp)1176; CHECK-NEXT: andl $7, %edi1177; CHECK-NEXT: movq (%rsp,%rdi,8), %rax1178; CHECK-NEXT: movq %rbp, %rsp1179; CHECK-NEXT: popq %rbp1180; CHECK-NEXT: vzeroupper1181; CHECK-NEXT: retq1182 %t2 = extractelement <8 x i64> %t1, i32 %index1183 ret i64 %t21184}1185 1186define double @test_extractelement_variable_v2f64(<2 x double> %t1, i32 %index) nounwind {1187; CHECK-LABEL: test_extractelement_variable_v2f64:1188; CHECK: ## %bb.0:1189; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi1190; CHECK-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)1191; CHECK-NEXT: andl $1, %edi1192; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero1193; CHECK-NEXT: retq1194 %t2 = extractelement <2 x double> %t1, i32 %index1195 ret double %t21196}1197 1198define double @test_extractelement_variable_v4f64(<4 x double> %t1, i32 %index) nounwind {1199; CHECK-LABEL: test_extractelement_variable_v4f64:1200; CHECK: ## %bb.0:1201; CHECK-NEXT: pushq %rbp1202; CHECK-NEXT: movq %rsp, %rbp1203; CHECK-NEXT: andq $-32, %rsp1204; CHECK-NEXT: subq $64, %rsp1205; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi1206; CHECK-NEXT: vmovaps %ymm0, (%rsp)1207; CHECK-NEXT: andl $3, %edi1208; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero1209; CHECK-NEXT: movq %rbp, %rsp1210; CHECK-NEXT: popq %rbp1211; CHECK-NEXT: vzeroupper1212; CHECK-NEXT: retq1213 %t2 = extractelement <4 x double> %t1, i32 %index1214 ret double %t21215}1216 1217define double @test_extractelement_variable_v8f64(<8 x double> %t1, i32 %index) nounwind {1218; CHECK-LABEL: test_extractelement_variable_v8f64:1219; CHECK: ## %bb.0:1220; CHECK-NEXT: pushq %rbp1221; CHECK-NEXT: movq %rsp, %rbp1222; CHECK-NEXT: andq $-64, %rsp1223; CHECK-NEXT: subq $128, %rsp1224; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi1225; CHECK-NEXT: vmovaps %zmm0, (%rsp)1226; CHECK-NEXT: andl $7, %edi1227; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero1228; CHECK-NEXT: movq %rbp, %rsp1229; CHECK-NEXT: popq %rbp1230; CHECK-NEXT: vzeroupper1231; CHECK-NEXT: retq1232 %t2 = extractelement <8 x double> %t1, i32 %index1233 ret double %t21234}1235 1236define i32 @test_extractelement_variable_v4i32(<4 x i32> %t1, i32 %index) nounwind {1237; CHECK-LABEL: test_extractelement_variable_v4i32:1238; CHECK: ## %bb.0:1239; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi1240; CHECK-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)1241; CHECK-NEXT: andl $3, %edi1242; CHECK-NEXT: movl -24(%rsp,%rdi,4), %eax1243; CHECK-NEXT: retq1244 %t2 = extractelement <4 x i32> %t1, i32 %index1245 ret i32 %t21246}1247 1248define i32 @test_extractelement_variable_v8i32(<8 x i32> %t1, i32 %index) nounwind {1249; CHECK-LABEL: test_extractelement_variable_v8i32:1250; CHECK: ## %bb.0:1251; CHECK-NEXT: pushq %rbp1252; CHECK-NEXT: movq %rsp, %rbp1253; CHECK-NEXT: andq $-32, %rsp1254; CHECK-NEXT: subq $64, %rsp1255; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi1256; CHECK-NEXT: vmovaps %ymm0, (%rsp)1257; CHECK-NEXT: andl $7, %edi1258; CHECK-NEXT: movl (%rsp,%rdi,4), %eax1259; CHECK-NEXT: movq %rbp, %rsp1260; CHECK-NEXT: popq %rbp1261; CHECK-NEXT: vzeroupper1262; CHECK-NEXT: retq1263 %t2 = extractelement <8 x i32> %t1, i32 %index1264 ret i32 %t21265}1266 1267define i32 @test_extractelement_variable_v16i32(<16 x i32> %t1, i32 %index) nounwind {1268; CHECK-LABEL: test_extractelement_variable_v16i32:1269; CHECK: ## %bb.0:1270; CHECK-NEXT: pushq %rbp1271; CHECK-NEXT: movq %rsp, %rbp1272; CHECK-NEXT: andq $-64, %rsp1273; CHECK-NEXT: subq $128, %rsp1274; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi1275; CHECK-NEXT: vmovaps %zmm0, (%rsp)1276; CHECK-NEXT: andl $15, %edi1277; CHECK-NEXT: movl (%rsp,%rdi,4), %eax1278; CHECK-NEXT: movq %rbp, %rsp1279; CHECK-NEXT: popq %rbp1280; CHECK-NEXT: vzeroupper1281; CHECK-NEXT: retq1282 %t2 = extractelement <16 x i32> %t1, i32 %index1283 ret i32 %t21284}1285 1286define float @test_extractelement_variable_v4f32(<4 x float> %t1, i32 %index) nounwind {1287; CHECK-LABEL: test_extractelement_variable_v4f32:1288; CHECK: ## %bb.0:1289; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi1290; CHECK-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)1291; CHECK-NEXT: andl $3, %edi1292; CHECK-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero1293; CHECK-NEXT: retq1294 %t2 = extractelement <4 x float> %t1, i32 %index1295 ret float %t21296}1297 1298define float @test_extractelement_variable_v8f32(<8 x float> %t1, i32 %index) nounwind {1299; CHECK-LABEL: test_extractelement_variable_v8f32:1300; CHECK: ## %bb.0:1301; CHECK-NEXT: pushq %rbp1302; CHECK-NEXT: movq %rsp, %rbp1303; CHECK-NEXT: andq $-32, %rsp1304; CHECK-NEXT: subq $64, %rsp1305; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi1306; CHECK-NEXT: vmovaps %ymm0, (%rsp)1307; CHECK-NEXT: andl $7, %edi1308; CHECK-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero1309; CHECK-NEXT: movq %rbp, %rsp1310; CHECK-NEXT: popq %rbp1311; CHECK-NEXT: vzeroupper1312; CHECK-NEXT: retq1313 %t2 = extractelement <8 x float> %t1, i32 %index1314 ret float %t21315}1316 1317define float @test_extractelement_variable_v16f32(<16 x float> %t1, i32 %index) nounwind {1318; CHECK-LABEL: test_extractelement_variable_v16f32:1319; CHECK: ## %bb.0:1320; CHECK-NEXT: pushq %rbp1321; CHECK-NEXT: movq %rsp, %rbp1322; CHECK-NEXT: andq $-64, %rsp1323; CHECK-NEXT: subq $128, %rsp1324; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi1325; CHECK-NEXT: vmovaps %zmm0, (%rsp)1326; CHECK-NEXT: andl $15, %edi1327; CHECK-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero1328; CHECK-NEXT: movq %rbp, %rsp1329; CHECK-NEXT: popq %rbp1330; CHECK-NEXT: vzeroupper1331; CHECK-NEXT: retq1332 %t2 = extractelement <16 x float> %t1, i32 %index1333 ret float %t21334}1335 1336define i16 @test_extractelement_variable_v8i16(<8 x i16> %t1, i32 %index) nounwind {1337; CHECK-LABEL: test_extractelement_variable_v8i16:1338; CHECK: ## %bb.0:1339; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi1340; CHECK-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)1341; CHECK-NEXT: andl $7, %edi1342; CHECK-NEXT: movzwl -24(%rsp,%rdi,2), %eax1343; CHECK-NEXT: retq1344 %t2 = extractelement <8 x i16> %t1, i32 %index1345 ret i16 %t21346}1347 1348define i16 @test_extractelement_variable_v16i16(<16 x i16> %t1, i32 %index) nounwind {1349; CHECK-LABEL: test_extractelement_variable_v16i16:1350; CHECK: ## %bb.0:1351; CHECK-NEXT: pushq %rbp1352; CHECK-NEXT: movq %rsp, %rbp1353; CHECK-NEXT: andq $-32, %rsp1354; CHECK-NEXT: subq $64, %rsp1355; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi1356; CHECK-NEXT: vmovaps %ymm0, (%rsp)1357; CHECK-NEXT: andl $15, %edi1358; CHECK-NEXT: movzwl (%rsp,%rdi,2), %eax1359; CHECK-NEXT: movq %rbp, %rsp1360; CHECK-NEXT: popq %rbp1361; CHECK-NEXT: vzeroupper1362; CHECK-NEXT: retq1363 %t2 = extractelement <16 x i16> %t1, i32 %index1364 ret i16 %t21365}1366 1367define i16 @test_extractelement_variable_v32i16(<32 x i16> %t1, i32 %index) nounwind {1368; CHECK-LABEL: test_extractelement_variable_v32i16:1369; CHECK: ## %bb.0:1370; CHECK-NEXT: pushq %rbp1371; CHECK-NEXT: movq %rsp, %rbp1372; CHECK-NEXT: andq $-64, %rsp1373; CHECK-NEXT: subq $128, %rsp1374; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi1375; CHECK-NEXT: vmovaps %zmm0, (%rsp)1376; CHECK-NEXT: andl $31, %edi1377; CHECK-NEXT: movzwl (%rsp,%rdi,2), %eax1378; CHECK-NEXT: movq %rbp, %rsp1379; CHECK-NEXT: popq %rbp1380; CHECK-NEXT: vzeroupper1381; CHECK-NEXT: retq1382 %t2 = extractelement <32 x i16> %t1, i32 %index1383 ret i16 %t21384}1385 1386define i8 @test_extractelement_variable_v16i8(<16 x i8> %t1, i32 %index) nounwind {1387; CHECK-LABEL: test_extractelement_variable_v16i8:1388; CHECK: ## %bb.0:1389; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi1390; CHECK-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)1391; CHECK-NEXT: andl $15, %edi1392; CHECK-NEXT: movzbl -24(%rsp,%rdi), %eax1393; CHECK-NEXT: retq1394 %t2 = extractelement <16 x i8> %t1, i32 %index1395 ret i8 %t21396}1397 1398define i8 @test_extractelement_variable_v32i8(<32 x i8> %t1, i32 %index) nounwind {1399; CHECK-LABEL: test_extractelement_variable_v32i8:1400; CHECK: ## %bb.0:1401; CHECK-NEXT: pushq %rbp1402; CHECK-NEXT: movq %rsp, %rbp1403; CHECK-NEXT: andq $-32, %rsp1404; CHECK-NEXT: subq $64, %rsp1405; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi1406; CHECK-NEXT: vmovaps %ymm0, (%rsp)1407; CHECK-NEXT: andl $31, %edi1408; CHECK-NEXT: movzbl (%rsp,%rdi), %eax1409; CHECK-NEXT: movq %rbp, %rsp1410; CHECK-NEXT: popq %rbp1411; CHECK-NEXT: vzeroupper1412; CHECK-NEXT: retq1413 1414 %t2 = extractelement <32 x i8> %t1, i32 %index1415 ret i8 %t21416}1417 1418define i8 @test_extractelement_variable_v64i8(<64 x i8> %t1, i32 %index) nounwind {1419; CHECK-LABEL: test_extractelement_variable_v64i8:1420; CHECK: ## %bb.0:1421; CHECK-NEXT: pushq %rbp1422; CHECK-NEXT: movq %rsp, %rbp1423; CHECK-NEXT: andq $-64, %rsp1424; CHECK-NEXT: subq $128, %rsp1425; CHECK-NEXT: ## kill: def $edi killed $edi def $rdi1426; CHECK-NEXT: vmovaps %zmm0, (%rsp)1427; CHECK-NEXT: andl $63, %edi1428; CHECK-NEXT: movzbl (%rsp,%rdi), %eax1429; CHECK-NEXT: movq %rbp, %rsp1430; CHECK-NEXT: popq %rbp1431; CHECK-NEXT: vzeroupper1432; CHECK-NEXT: retq1433 1434 %t2 = extractelement <64 x i8> %t1, i32 %index1435 ret i8 %t21436}1437 1438define i8 @test_extractelement_variable_v64i8_indexi8(<64 x i8> %t1, i8 %index) nounwind {1439; CHECK-LABEL: test_extractelement_variable_v64i8_indexi8:1440; CHECK: ## %bb.0:1441; CHECK-NEXT: pushq %rbp1442; CHECK-NEXT: movq %rsp, %rbp1443; CHECK-NEXT: andq $-64, %rsp1444; CHECK-NEXT: subq $128, %rsp1445; CHECK-NEXT: addb %dil, %dil1446; CHECK-NEXT: vmovaps %zmm0, (%rsp)1447; CHECK-NEXT: movzbl %dil, %eax1448; CHECK-NEXT: andl $63, %eax1449; CHECK-NEXT: movzbl (%rsp,%rax), %eax1450; CHECK-NEXT: movq %rbp, %rsp1451; CHECK-NEXT: popq %rbp1452; CHECK-NEXT: vzeroupper1453; CHECK-NEXT: retq1454 1455 %i = add i8 %index, %index1456 %t2 = extractelement <64 x i8> %t1, i8 %i1457 ret i8 %t21458}1459 1460define zeroext i8 @test_extractelement_varible_v2i1(<2 x i64> %a, <2 x i64> %b, i32 %index) nounwind {1461; KNL-LABEL: test_extractelement_varible_v2i1:1462; KNL: ## %bb.0:1463; KNL-NEXT: ## kill: def $edi killed $edi def $rdi1464; KNL-NEXT: ## kill: def $xmm1 killed $xmm1 def $zmm11465; KNL-NEXT: ## kill: def $xmm0 killed $xmm0 def $zmm01466; KNL-NEXT: vpcmpnleuq %zmm1, %zmm0, %k11467; KNL-NEXT: vpternlogq {{.*#+}} zmm0 {%k1} {z} = -11468; KNL-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp)1469; KNL-NEXT: andl $1, %edi1470; KNL-NEXT: movzbl -24(%rsp,%rdi,8), %eax1471; KNL-NEXT: andl $1, %eax1472; KNL-NEXT: vzeroupper1473; KNL-NEXT: retq1474;1475; SKX-LABEL: test_extractelement_varible_v2i1:1476; SKX: ## %bb.0:1477; SKX-NEXT: ## kill: def $edi killed $edi def $rdi1478; SKX-NEXT: vpcmpnleuq %xmm1, %xmm0, %k01479; SKX-NEXT: vpmovm2q %k0, %xmm01480; SKX-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp)1481; SKX-NEXT: andl $1, %edi1482; SKX-NEXT: movzbl -24(%rsp,%rdi,8), %eax1483; SKX-NEXT: andl $1, %eax1484; SKX-NEXT: retq1485 %t1 = icmp ugt <2 x i64> %a, %b1486 %t2 = extractelement <2 x i1> %t1, i32 %index1487 %res = zext i1 %t2 to i81488 ret i8 %res1489}1490 1491define zeroext i8 @test_extractelement_varible_v4i1(<4 x i32> %a, <4 x i32> %b, i32 %index) nounwind {1492; KNL-LABEL: test_extractelement_varible_v4i1:1493; KNL: ## %bb.0:1494; KNL-NEXT: ## kill: def $edi killed $edi def $rdi1495; KNL-NEXT: ## kill: def $xmm1 killed $xmm1 def $zmm11496; KNL-NEXT: ## kill: def $xmm0 killed $xmm0 def $zmm01497; KNL-NEXT: vpcmpnleud %zmm1, %zmm0, %k11498; KNL-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -11499; KNL-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp)1500; KNL-NEXT: andl $3, %edi1501; KNL-NEXT: movzbl -24(%rsp,%rdi,4), %eax1502; KNL-NEXT: andl $1, %eax1503; KNL-NEXT: vzeroupper1504; KNL-NEXT: retq1505;1506; SKX-LABEL: test_extractelement_varible_v4i1:1507; SKX: ## %bb.0:1508; SKX-NEXT: ## kill: def $edi killed $edi def $rdi1509; SKX-NEXT: vpcmpnleud %xmm1, %xmm0, %k01510; SKX-NEXT: vpmovm2d %k0, %xmm01511; SKX-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp)1512; SKX-NEXT: andl $3, %edi1513; SKX-NEXT: movzbl -24(%rsp,%rdi,4), %eax1514; SKX-NEXT: andl $1, %eax1515; SKX-NEXT: retq1516 %t1 = icmp ugt <4 x i32> %a, %b1517 %t2 = extractelement <4 x i1> %t1, i32 %index1518 %res = zext i1 %t2 to i81519 ret i8 %res1520}1521 1522define zeroext i8 @test_extractelement_varible_v8i1(<8 x i32> %a, <8 x i32> %b, i32 %index) nounwind {1523; KNL-LABEL: test_extractelement_varible_v8i1:1524; KNL: ## %bb.0:1525; KNL-NEXT: ## kill: def $edi killed $edi def $rdi1526; KNL-NEXT: ## kill: def $ymm1 killed $ymm1 def $zmm11527; KNL-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm01528; KNL-NEXT: vpcmpnleud %zmm1, %zmm0, %k11529; KNL-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -11530; KNL-NEXT: vpmovdw %zmm0, %ymm01531; KNL-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp)1532; KNL-NEXT: andl $7, %edi1533; KNL-NEXT: movzbl -24(%rsp,%rdi,2), %eax1534; KNL-NEXT: andl $1, %eax1535; KNL-NEXT: vzeroupper1536; KNL-NEXT: retq1537;1538; SKX-LABEL: test_extractelement_varible_v8i1:1539; SKX: ## %bb.0:1540; SKX-NEXT: ## kill: def $edi killed $edi def $rdi1541; SKX-NEXT: vpcmpnleud %ymm1, %ymm0, %k01542; SKX-NEXT: vpmovm2w %k0, %xmm01543; SKX-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp)1544; SKX-NEXT: andl $7, %edi1545; SKX-NEXT: movzbl -24(%rsp,%rdi,2), %eax1546; SKX-NEXT: andl $1, %eax1547; SKX-NEXT: vzeroupper1548; SKX-NEXT: retq1549 %t1 = icmp ugt <8 x i32> %a, %b1550 %t2 = extractelement <8 x i1> %t1, i32 %index1551 %res = zext i1 %t2 to i81552 ret i8 %res1553}1554 1555define zeroext i8 @test_extractelement_varible_v16i1(<16 x i32> %a, <16 x i32> %b, i32 %index) nounwind {1556; KNL-LABEL: test_extractelement_varible_v16i1:1557; KNL: ## %bb.0:1558; KNL-NEXT: ## kill: def $edi killed $edi def $rdi1559; KNL-NEXT: vpcmpnleud %zmm1, %zmm0, %k11560; KNL-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -11561; KNL-NEXT: vpmovdb %zmm0, -{{[0-9]+}}(%rsp)1562; KNL-NEXT: andl $15, %edi1563; KNL-NEXT: movzbl -24(%rsp,%rdi), %eax1564; KNL-NEXT: andl $1, %eax1565; KNL-NEXT: vzeroupper1566; KNL-NEXT: retq1567;1568; SKX-LABEL: test_extractelement_varible_v16i1:1569; SKX: ## %bb.0:1570; SKX-NEXT: ## kill: def $edi killed $edi def $rdi1571; SKX-NEXT: vpcmpnleud %zmm1, %zmm0, %k01572; SKX-NEXT: vpmovm2b %k0, %xmm01573; SKX-NEXT: vmovdqa %xmm0, -{{[0-9]+}}(%rsp)1574; SKX-NEXT: andl $15, %edi1575; SKX-NEXT: movzbl -24(%rsp,%rdi), %eax1576; SKX-NEXT: andl $1, %eax1577; SKX-NEXT: vzeroupper1578; SKX-NEXT: retq1579 %t1 = icmp ugt <16 x i32> %a, %b1580 %t2 = extractelement <16 x i1> %t1, i32 %index1581 %res = zext i1 %t2 to i81582 ret i8 %res1583}1584 1585define zeroext i8 @test_extractelement_varible_v32i1(<32 x i8> %a, <32 x i8> %b, i32 %index) nounwind {1586; KNL-LABEL: test_extractelement_varible_v32i1:1587; KNL: ## %bb.0:1588; KNL-NEXT: vpminub %ymm1, %ymm0, %ymm11589; KNL-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm01590; KNL-NEXT: vpmovmskb %ymm0, %ecx1591; KNL-NEXT: xorl %eax, %eax1592; KNL-NEXT: btl %edi, %ecx1593; KNL-NEXT: setae %al1594; KNL-NEXT: vzeroupper1595; KNL-NEXT: retq1596;1597; SKX-LABEL: test_extractelement_varible_v32i1:1598; SKX: ## %bb.0:1599; SKX-NEXT: pushq %rbp1600; SKX-NEXT: movq %rsp, %rbp1601; SKX-NEXT: andq $-32, %rsp1602; SKX-NEXT: subq $64, %rsp1603; SKX-NEXT: ## kill: def $edi killed $edi def $rdi1604; SKX-NEXT: vpcmpnleub %ymm1, %ymm0, %k01605; SKX-NEXT: vpmovm2b %k0, %ymm01606; SKX-NEXT: vmovdqa %ymm0, (%rsp)1607; SKX-NEXT: andl $31, %edi1608; SKX-NEXT: movzbl (%rsp,%rdi), %eax1609; SKX-NEXT: andl $1, %eax1610; SKX-NEXT: movq %rbp, %rsp1611; SKX-NEXT: popq %rbp1612; SKX-NEXT: vzeroupper1613; SKX-NEXT: retq1614 %t1 = icmp ugt <32 x i8> %a, %b1615 %t2 = extractelement <32 x i1> %t1, i32 %index1616 %res = zext i1 %t2 to i81617 ret i8 %res1618}1619 1620define <8 x i64> @insert_double_zero(<2 x i64> %a) nounwind {1621; CHECK-LABEL: insert_double_zero:1622; CHECK: ## %bb.0:1623; CHECK-NEXT: vxorps %xmm1, %xmm1, %xmm11624; CHECK-NEXT: vinsertf32x4 $2, %xmm0, %zmm1, %zmm01625; CHECK-NEXT: retq1626 %b = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1627 %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>1628 %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>1629 ret <8 x i64> %e1630}1631 1632define i32 @test_insertelement_variable_v32i1(<32 x i8> %a, i8 %b, i32 %index) nounwind {1633; KNL-LABEL: test_insertelement_variable_v32i1:1634; KNL: ## %bb.0:1635; KNL-NEXT: pushq %rbp1636; KNL-NEXT: movq %rsp, %rbp1637; KNL-NEXT: andq $-32, %rsp1638; KNL-NEXT: subq $64, %rsp1639; KNL-NEXT: ## kill: def $esi killed $esi def $rsi1640; KNL-NEXT: vpxor %xmm1, %xmm1, %xmm11641; KNL-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm01642; KNL-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm01643; KNL-NEXT: andl $31, %esi1644; KNL-NEXT: testb %dil, %dil1645; KNL-NEXT: vmovdqa %ymm0, (%rsp)1646; KNL-NEXT: setne (%rsp,%rsi)1647; KNL-NEXT: vpmovsxbd (%rsp), %zmm01648; KNL-NEXT: vpslld $31, %zmm0, %zmm01649; KNL-NEXT: vptestmd %zmm0, %zmm0, %k01650; KNL-NEXT: kmovw %k0, %ecx1651; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm01652; KNL-NEXT: vpslld $31, %zmm0, %zmm01653; KNL-NEXT: vptestmd %zmm0, %zmm0, %k01654; KNL-NEXT: kmovw %k0, %eax1655; KNL-NEXT: shll $16, %eax1656; KNL-NEXT: orl %ecx, %eax1657; KNL-NEXT: movq %rbp, %rsp1658; KNL-NEXT: popq %rbp1659; KNL-NEXT: vzeroupper1660; KNL-NEXT: retq1661;1662; SKX-LABEL: test_insertelement_variable_v32i1:1663; SKX: ## %bb.0:1664; SKX-NEXT: vptestmb %ymm0, %ymm0, %k01665; SKX-NEXT: testb %dil, %dil1666; SKX-NEXT: setne %al1667; SKX-NEXT: vpbroadcastb %esi, %ymm01668; SKX-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %k11669; SKX-NEXT: vpmovm2b %k0, %ymm01670; SKX-NEXT: vpbroadcastb %eax, %ymm0 {%k1}1671; SKX-NEXT: vpsllw $7, %ymm0, %ymm01672; SKX-NEXT: vpmovb2m %ymm0, %k01673; SKX-NEXT: kmovd %k0, %eax1674; SKX-NEXT: vzeroupper1675; SKX-NEXT: retq1676 %t1 = icmp ugt <32 x i8> %a, zeroinitializer1677 %t2 = icmp ugt i8 %b, 01678 %t3 = insertelement <32 x i1> %t1, i1 %t2, i32 %index1679 %t4 = bitcast <32 x i1> %t3 to i321680 ret i32 %t41681}1682 1683define i64 @test_insertelement_variable_v64i1(<64 x i8> %a, i8 %b, i32 %index) nounwind {1684; KNL-LABEL: test_insertelement_variable_v64i1:1685; KNL: ## %bb.0:1686; KNL-NEXT: pushq %rbp1687; KNL-NEXT: movq %rsp, %rbp1688; KNL-NEXT: andq $-64, %rsp1689; KNL-NEXT: subq $128, %rsp1690; KNL-NEXT: ## kill: def $esi killed $esi def $rsi1691; KNL-NEXT: vextracti64x4 $1, %zmm0, %ymm11692; KNL-NEXT: vpxor %xmm2, %xmm2, %xmm21693; KNL-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm11694; KNL-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm01695; KNL-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm01696; KNL-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm01697; KNL-NEXT: andl $63, %esi1698; KNL-NEXT: testb %dil, %dil1699; KNL-NEXT: vmovdqa64 %zmm0, (%rsp)1700; KNL-NEXT: setne (%rsp,%rsi)1701; KNL-NEXT: vpmovsxbd (%rsp), %zmm01702; KNL-NEXT: vpslld $31, %zmm0, %zmm01703; KNL-NEXT: vptestmd %zmm0, %zmm0, %k01704; KNL-NEXT: kmovw %k0, %eax1705; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm01706; KNL-NEXT: vpslld $31, %zmm0, %zmm01707; KNL-NEXT: vptestmd %zmm0, %zmm0, %k01708; KNL-NEXT: kmovw %k0, %ecx1709; KNL-NEXT: shll $16, %ecx1710; KNL-NEXT: orl %eax, %ecx1711; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm01712; KNL-NEXT: vpslld $31, %zmm0, %zmm01713; KNL-NEXT: vptestmd %zmm0, %zmm0, %k01714; KNL-NEXT: kmovw %k0, %edx1715; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm01716; KNL-NEXT: vpslld $31, %zmm0, %zmm01717; KNL-NEXT: vptestmd %zmm0, %zmm0, %k01718; KNL-NEXT: kmovw %k0, %eax1719; KNL-NEXT: shll $16, %eax1720; KNL-NEXT: orl %edx, %eax1721; KNL-NEXT: shlq $32, %rax1722; KNL-NEXT: orq %rcx, %rax1723; KNL-NEXT: movq %rbp, %rsp1724; KNL-NEXT: popq %rbp1725; KNL-NEXT: vzeroupper1726; KNL-NEXT: retq1727;1728; SKX-LABEL: test_insertelement_variable_v64i1:1729; SKX: ## %bb.0:1730; SKX-NEXT: vptestmb %zmm0, %zmm0, %k01731; SKX-NEXT: testb %dil, %dil1732; SKX-NEXT: setne %al1733; SKX-NEXT: vpbroadcastb %esi, %zmm01734; SKX-NEXT: vpcmpeqb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k11735; SKX-NEXT: vpmovm2b %k0, %zmm01736; SKX-NEXT: vpbroadcastb %eax, %zmm0 {%k1}1737; SKX-NEXT: vpsllw $7, %zmm0, %zmm01738; SKX-NEXT: vpmovb2m %zmm0, %k01739; SKX-NEXT: kmovq %k0, %rax1740; SKX-NEXT: vzeroupper1741; SKX-NEXT: retq1742 %t1 = icmp ugt <64 x i8> %a, zeroinitializer1743 %t2 = icmp ugt i8 %b, 01744 %t3 = insertelement <64 x i1> %t1, i1 %t2, i32 %index1745 %t4 = bitcast <64 x i1> %t3 to i641746 ret i64 %t41747}1748 1749define i96 @test_insertelement_variable_v96i1(<96 x i8> %a, i8 %b, i32 %index) nounwind {1750; KNL-LABEL: test_insertelement_variable_v96i1:1751; KNL: ## %bb.0:1752; KNL-NEXT: pushq %rbp1753; KNL-NEXT: movq %rsp, %rbp1754; KNL-NEXT: andq $-64, %rsp1755; KNL-NEXT: subq $192, %rsp1756; KNL-NEXT: movl 744(%rbp), %eax1757; KNL-NEXT: andl $127, %eax1758; KNL-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1759; KNL-NEXT: vpinsrb $1, 232(%rbp), %xmm0, %xmm01760; KNL-NEXT: vpinsrb $2, 240(%rbp), %xmm0, %xmm01761; KNL-NEXT: vpinsrb $3, 248(%rbp), %xmm0, %xmm01762; KNL-NEXT: vpinsrb $4, 256(%rbp), %xmm0, %xmm01763; KNL-NEXT: vpinsrb $5, 264(%rbp), %xmm0, %xmm01764; KNL-NEXT: vpinsrb $6, 272(%rbp), %xmm0, %xmm01765; KNL-NEXT: vpinsrb $7, 280(%rbp), %xmm0, %xmm01766; KNL-NEXT: vpinsrb $8, 288(%rbp), %xmm0, %xmm01767; KNL-NEXT: vpinsrb $9, 296(%rbp), %xmm0, %xmm01768; KNL-NEXT: vpinsrb $10, 304(%rbp), %xmm0, %xmm01769; KNL-NEXT: vpinsrb $11, 312(%rbp), %xmm0, %xmm01770; KNL-NEXT: vpinsrb $12, 320(%rbp), %xmm0, %xmm01771; KNL-NEXT: vpinsrb $13, 328(%rbp), %xmm0, %xmm01772; KNL-NEXT: vpinsrb $14, 336(%rbp), %xmm0, %xmm01773; KNL-NEXT: vpinsrb $15, 344(%rbp), %xmm0, %xmm01774; KNL-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero1775; KNL-NEXT: vpinsrb $1, 360(%rbp), %xmm1, %xmm11776; KNL-NEXT: vpinsrb $2, 368(%rbp), %xmm1, %xmm11777; KNL-NEXT: vpinsrb $3, 376(%rbp), %xmm1, %xmm11778; KNL-NEXT: vpinsrb $4, 384(%rbp), %xmm1, %xmm11779; KNL-NEXT: vpinsrb $5, 392(%rbp), %xmm1, %xmm11780; KNL-NEXT: vpinsrb $6, 400(%rbp), %xmm1, %xmm11781; KNL-NEXT: vpinsrb $7, 408(%rbp), %xmm1, %xmm11782; KNL-NEXT: vpinsrb $8, 416(%rbp), %xmm1, %xmm11783; KNL-NEXT: vpinsrb $9, 424(%rbp), %xmm1, %xmm11784; KNL-NEXT: vpinsrb $10, 432(%rbp), %xmm1, %xmm11785; KNL-NEXT: vpinsrb $11, 440(%rbp), %xmm1, %xmm11786; KNL-NEXT: vpinsrb $12, 448(%rbp), %xmm1, %xmm11787; KNL-NEXT: vpinsrb $13, 456(%rbp), %xmm1, %xmm11788; KNL-NEXT: vpinsrb $14, 464(%rbp), %xmm1, %xmm11789; KNL-NEXT: vpinsrb $15, 472(%rbp), %xmm1, %xmm11790; KNL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm11791; KNL-NEXT: vpxor %xmm0, %xmm0, %xmm01792; KNL-NEXT: vpcmpeqb %ymm0, %ymm1, %ymm11793; KNL-NEXT: vmovd %edi, %xmm21794; KNL-NEXT: vpinsrb $1, %esi, %xmm2, %xmm21795; KNL-NEXT: vpinsrb $2, %edx, %xmm2, %xmm21796; KNL-NEXT: vpinsrb $3, %ecx, %xmm2, %xmm21797; KNL-NEXT: vpinsrb $4, %r8d, %xmm2, %xmm21798; KNL-NEXT: vpinsrb $5, %r9d, %xmm2, %xmm21799; KNL-NEXT: vpinsrb $6, 16(%rbp), %xmm2, %xmm21800; KNL-NEXT: vpinsrb $7, 24(%rbp), %xmm2, %xmm21801; KNL-NEXT: vpinsrb $8, 32(%rbp), %xmm2, %xmm21802; KNL-NEXT: vpinsrb $9, 40(%rbp), %xmm2, %xmm21803; KNL-NEXT: vpinsrb $10, 48(%rbp), %xmm2, %xmm21804; KNL-NEXT: vpinsrb $11, 56(%rbp), %xmm2, %xmm21805; KNL-NEXT: vpinsrb $12, 64(%rbp), %xmm2, %xmm21806; KNL-NEXT: vpinsrb $13, 72(%rbp), %xmm2, %xmm21807; KNL-NEXT: vpinsrb $14, 80(%rbp), %xmm2, %xmm21808; KNL-NEXT: vpinsrb $15, 88(%rbp), %xmm2, %xmm21809; KNL-NEXT: vmovd {{.*#+}} xmm3 = mem[0],zero,zero,zero1810; KNL-NEXT: vpinsrb $1, 104(%rbp), %xmm3, %xmm31811; KNL-NEXT: vpinsrb $2, 112(%rbp), %xmm3, %xmm31812; KNL-NEXT: vpinsrb $3, 120(%rbp), %xmm3, %xmm31813; KNL-NEXT: vpinsrb $4, 128(%rbp), %xmm3, %xmm31814; KNL-NEXT: vpinsrb $5, 136(%rbp), %xmm3, %xmm31815; KNL-NEXT: vpinsrb $6, 144(%rbp), %xmm3, %xmm31816; KNL-NEXT: vpinsrb $7, 152(%rbp), %xmm3, %xmm31817; KNL-NEXT: vpinsrb $8, 160(%rbp), %xmm3, %xmm31818; KNL-NEXT: vpinsrb $9, 168(%rbp), %xmm3, %xmm31819; KNL-NEXT: vpinsrb $10, 176(%rbp), %xmm3, %xmm31820; KNL-NEXT: vpinsrb $11, 184(%rbp), %xmm3, %xmm31821; KNL-NEXT: vpinsrb $12, 192(%rbp), %xmm3, %xmm31822; KNL-NEXT: vpinsrb $13, 200(%rbp), %xmm3, %xmm31823; KNL-NEXT: vpinsrb $14, 208(%rbp), %xmm3, %xmm31824; KNL-NEXT: vpinsrb $15, 216(%rbp), %xmm3, %xmm31825; KNL-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm21826; KNL-NEXT: vpcmpeqb %ymm0, %ymm2, %ymm21827; KNL-NEXT: vinserti64x4 $1, %ymm1, %zmm2, %zmm11828; KNL-NEXT: vpternlogq {{.*#+}} zmm1 = ~zmm11829; KNL-NEXT: vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero1830; KNL-NEXT: vpinsrb $1, 488(%rbp), %xmm2, %xmm21831; KNL-NEXT: vpinsrb $2, 496(%rbp), %xmm2, %xmm21832; KNL-NEXT: vpinsrb $3, 504(%rbp), %xmm2, %xmm21833; KNL-NEXT: vpinsrb $4, 512(%rbp), %xmm2, %xmm21834; KNL-NEXT: vpinsrb $5, 520(%rbp), %xmm2, %xmm21835; KNL-NEXT: vpinsrb $6, 528(%rbp), %xmm2, %xmm21836; KNL-NEXT: vpinsrb $7, 536(%rbp), %xmm2, %xmm21837; KNL-NEXT: vpinsrb $8, 544(%rbp), %xmm2, %xmm21838; KNL-NEXT: vpinsrb $9, 552(%rbp), %xmm2, %xmm21839; KNL-NEXT: vpinsrb $10, 560(%rbp), %xmm2, %xmm21840; KNL-NEXT: vpinsrb $11, 568(%rbp), %xmm2, %xmm21841; KNL-NEXT: vpinsrb $12, 576(%rbp), %xmm2, %xmm21842; KNL-NEXT: vpinsrb $13, 584(%rbp), %xmm2, %xmm21843; KNL-NEXT: vpinsrb $14, 592(%rbp), %xmm2, %xmm21844; KNL-NEXT: vpinsrb $15, 600(%rbp), %xmm2, %xmm21845; KNL-NEXT: vmovd {{.*#+}} xmm3 = mem[0],zero,zero,zero1846; KNL-NEXT: vpinsrb $1, 616(%rbp), %xmm3, %xmm31847; KNL-NEXT: vpinsrb $2, 624(%rbp), %xmm3, %xmm31848; KNL-NEXT: vpinsrb $3, 632(%rbp), %xmm3, %xmm31849; KNL-NEXT: vpinsrb $4, 640(%rbp), %xmm3, %xmm31850; KNL-NEXT: vpinsrb $5, 648(%rbp), %xmm3, %xmm31851; KNL-NEXT: vpinsrb $6, 656(%rbp), %xmm3, %xmm31852; KNL-NEXT: vpinsrb $7, 664(%rbp), %xmm3, %xmm31853; KNL-NEXT: vpinsrb $8, 672(%rbp), %xmm3, %xmm31854; KNL-NEXT: vpinsrb $9, 680(%rbp), %xmm3, %xmm31855; KNL-NEXT: vpinsrb $10, 688(%rbp), %xmm3, %xmm31856; KNL-NEXT: vpinsrb $11, 696(%rbp), %xmm3, %xmm31857; KNL-NEXT: vpinsrb $12, 704(%rbp), %xmm3, %xmm31858; KNL-NEXT: vpinsrb $13, 712(%rbp), %xmm3, %xmm31859; KNL-NEXT: vpinsrb $14, 720(%rbp), %xmm3, %xmm31860; KNL-NEXT: vpinsrb $15, 728(%rbp), %xmm3, %xmm31861; KNL-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm21862; KNL-NEXT: vpcmpeqb %ymm0, %ymm2, %ymm21863; KNL-NEXT: vpternlogq {{.*#+}} zmm2 = ~zmm21864; KNL-NEXT: cmpb $0, 736(%rbp)1865; KNL-NEXT: vmovdqa %ymm0, {{[0-9]+}}(%rsp)1866; KNL-NEXT: vmovdqa %ymm2, {{[0-9]+}}(%rsp)1867; KNL-NEXT: vmovdqa64 %zmm1, (%rsp)1868; KNL-NEXT: setne (%rsp,%rax)1869; KNL-NEXT: vpmovsxbd (%rsp), %zmm01870; KNL-NEXT: vpslld $31, %zmm0, %zmm01871; KNL-NEXT: vptestmd %zmm0, %zmm0, %k01872; KNL-NEXT: kmovw %k0, %eax1873; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm01874; KNL-NEXT: vpslld $31, %zmm0, %zmm01875; KNL-NEXT: vptestmd %zmm0, %zmm0, %k01876; KNL-NEXT: kmovw %k0, %ecx1877; KNL-NEXT: shll $16, %ecx1878; KNL-NEXT: orl %eax, %ecx1879; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm01880; KNL-NEXT: vpslld $31, %zmm0, %zmm01881; KNL-NEXT: vptestmd %zmm0, %zmm0, %k01882; KNL-NEXT: kmovw %k0, %edx1883; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm01884; KNL-NEXT: vpslld $31, %zmm0, %zmm01885; KNL-NEXT: vptestmd %zmm0, %zmm0, %k01886; KNL-NEXT: kmovw %k0, %eax1887; KNL-NEXT: shll $16, %eax1888; KNL-NEXT: orl %edx, %eax1889; KNL-NEXT: shlq $32, %rax1890; KNL-NEXT: orq %rcx, %rax1891; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm01892; KNL-NEXT: vpslld $31, %zmm0, %zmm01893; KNL-NEXT: vptestmd %zmm0, %zmm0, %k01894; KNL-NEXT: kmovw %k0, %ecx1895; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm01896; KNL-NEXT: vpslld $31, %zmm0, %zmm01897; KNL-NEXT: vptestmd %zmm0, %zmm0, %k01898; KNL-NEXT: kmovw %k0, %esi1899; KNL-NEXT: shll $16, %esi1900; KNL-NEXT: orl %ecx, %esi1901; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm01902; KNL-NEXT: vpslld $31, %zmm0, %zmm01903; KNL-NEXT: vptestmd %zmm0, %zmm0, %k01904; KNL-NEXT: kmovw %k0, %ecx1905; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm01906; KNL-NEXT: vpslld $31, %zmm0, %zmm01907; KNL-NEXT: vptestmd %zmm0, %zmm0, %k01908; KNL-NEXT: kmovw %k0, %edx1909; KNL-NEXT: shll $16, %edx1910; KNL-NEXT: orl %ecx, %edx1911; KNL-NEXT: shlq $32, %rdx1912; KNL-NEXT: orq %rsi, %rdx1913; KNL-NEXT: movq %rbp, %rsp1914; KNL-NEXT: popq %rbp1915; KNL-NEXT: vzeroupper1916; KNL-NEXT: retq1917;1918; SKX-LABEL: test_insertelement_variable_v96i1:1919; SKX: ## %bb.0:1920; SKX-NEXT: pushq %rbp1921; SKX-NEXT: movq %rsp, %rbp1922; SKX-NEXT: andq $-64, %rsp1923; SKX-NEXT: subq $192, %rsp1924; SKX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero1925; SKX-NEXT: vpinsrb $1, 232(%rbp), %xmm0, %xmm01926; SKX-NEXT: vpinsrb $2, 240(%rbp), %xmm0, %xmm01927; SKX-NEXT: vpinsrb $3, 248(%rbp), %xmm0, %xmm01928; SKX-NEXT: vpinsrb $4, 256(%rbp), %xmm0, %xmm01929; SKX-NEXT: vpinsrb $5, 264(%rbp), %xmm0, %xmm01930; SKX-NEXT: vpinsrb $6, 272(%rbp), %xmm0, %xmm01931; SKX-NEXT: vpinsrb $7, 280(%rbp), %xmm0, %xmm01932; SKX-NEXT: vpinsrb $8, 288(%rbp), %xmm0, %xmm01933; SKX-NEXT: vpinsrb $9, 296(%rbp), %xmm0, %xmm01934; SKX-NEXT: vpinsrb $10, 304(%rbp), %xmm0, %xmm01935; SKX-NEXT: vpinsrb $11, 312(%rbp), %xmm0, %xmm01936; SKX-NEXT: vpinsrb $12, 320(%rbp), %xmm0, %xmm01937; SKX-NEXT: vpinsrb $13, 328(%rbp), %xmm0, %xmm01938; SKX-NEXT: vpinsrb $14, 336(%rbp), %xmm0, %xmm01939; SKX-NEXT: vpinsrb $15, 344(%rbp), %xmm0, %xmm01940; SKX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero1941; SKX-NEXT: vpinsrb $1, 360(%rbp), %xmm1, %xmm11942; SKX-NEXT: vpinsrb $2, 368(%rbp), %xmm1, %xmm11943; SKX-NEXT: vpinsrb $3, 376(%rbp), %xmm1, %xmm11944; SKX-NEXT: vpinsrb $4, 384(%rbp), %xmm1, %xmm11945; SKX-NEXT: vpinsrb $5, 392(%rbp), %xmm1, %xmm11946; SKX-NEXT: vpinsrb $6, 400(%rbp), %xmm1, %xmm11947; SKX-NEXT: vpinsrb $7, 408(%rbp), %xmm1, %xmm11948; SKX-NEXT: vpinsrb $8, 416(%rbp), %xmm1, %xmm11949; SKX-NEXT: vpinsrb $9, 424(%rbp), %xmm1, %xmm11950; SKX-NEXT: vpinsrb $10, 432(%rbp), %xmm1, %xmm11951; SKX-NEXT: vpinsrb $11, 440(%rbp), %xmm1, %xmm11952; SKX-NEXT: vpinsrb $12, 448(%rbp), %xmm1, %xmm11953; SKX-NEXT: vpinsrb $13, 456(%rbp), %xmm1, %xmm11954; SKX-NEXT: vpinsrb $14, 464(%rbp), %xmm1, %xmm11955; SKX-NEXT: vpinsrb $15, 472(%rbp), %xmm1, %xmm11956; SKX-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01957; SKX-NEXT: vmovd %edi, %xmm11958; SKX-NEXT: vpinsrb $1, %esi, %xmm1, %xmm11959; SKX-NEXT: vpinsrb $2, %edx, %xmm1, %xmm11960; SKX-NEXT: vpinsrb $3, %ecx, %xmm1, %xmm11961; SKX-NEXT: vpinsrb $4, %r8d, %xmm1, %xmm11962; SKX-NEXT: vpinsrb $5, %r9d, %xmm1, %xmm11963; SKX-NEXT: vpinsrb $6, 16(%rbp), %xmm1, %xmm11964; SKX-NEXT: vpinsrb $7, 24(%rbp), %xmm1, %xmm11965; SKX-NEXT: vpinsrb $8, 32(%rbp), %xmm1, %xmm11966; SKX-NEXT: vpinsrb $9, 40(%rbp), %xmm1, %xmm11967; SKX-NEXT: vpinsrb $10, 48(%rbp), %xmm1, %xmm11968; SKX-NEXT: vpinsrb $11, 56(%rbp), %xmm1, %xmm11969; SKX-NEXT: vpinsrb $12, 64(%rbp), %xmm1, %xmm11970; SKX-NEXT: vpinsrb $13, 72(%rbp), %xmm1, %xmm11971; SKX-NEXT: vpinsrb $14, 80(%rbp), %xmm1, %xmm11972; SKX-NEXT: vpinsrb $15, 88(%rbp), %xmm1, %xmm11973; SKX-NEXT: vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero1974; SKX-NEXT: vpinsrb $1, 104(%rbp), %xmm2, %xmm21975; SKX-NEXT: vpinsrb $2, 112(%rbp), %xmm2, %xmm21976; SKX-NEXT: vpinsrb $3, 120(%rbp), %xmm2, %xmm21977; SKX-NEXT: vpinsrb $4, 128(%rbp), %xmm2, %xmm21978; SKX-NEXT: vpinsrb $5, 136(%rbp), %xmm2, %xmm21979; SKX-NEXT: vpinsrb $6, 144(%rbp), %xmm2, %xmm21980; SKX-NEXT: vpinsrb $7, 152(%rbp), %xmm2, %xmm21981; SKX-NEXT: vpinsrb $8, 160(%rbp), %xmm2, %xmm21982; SKX-NEXT: vpinsrb $9, 168(%rbp), %xmm2, %xmm21983; SKX-NEXT: vpinsrb $10, 176(%rbp), %xmm2, %xmm21984; SKX-NEXT: vpinsrb $11, 184(%rbp), %xmm2, %xmm21985; SKX-NEXT: vpinsrb $12, 192(%rbp), %xmm2, %xmm21986; SKX-NEXT: vpinsrb $13, 200(%rbp), %xmm2, %xmm21987; SKX-NEXT: vpinsrb $14, 208(%rbp), %xmm2, %xmm21988; SKX-NEXT: vpinsrb $15, 216(%rbp), %xmm2, %xmm21989; SKX-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm11990; SKX-NEXT: vinserti64x4 $1, %ymm0, %zmm1, %zmm01991; SKX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero1992; SKX-NEXT: vpinsrb $1, 488(%rbp), %xmm1, %xmm11993; SKX-NEXT: vpinsrb $2, 496(%rbp), %xmm1, %xmm11994; SKX-NEXT: vpinsrb $3, 504(%rbp), %xmm1, %xmm11995; SKX-NEXT: vpinsrb $4, 512(%rbp), %xmm1, %xmm11996; SKX-NEXT: vpinsrb $5, 520(%rbp), %xmm1, %xmm11997; SKX-NEXT: vpinsrb $6, 528(%rbp), %xmm1, %xmm11998; SKX-NEXT: vpinsrb $7, 536(%rbp), %xmm1, %xmm11999; SKX-NEXT: vpinsrb $8, 544(%rbp), %xmm1, %xmm12000; SKX-NEXT: vpinsrb $9, 552(%rbp), %xmm1, %xmm12001; SKX-NEXT: vpinsrb $10, 560(%rbp), %xmm1, %xmm12002; SKX-NEXT: vpinsrb $11, 568(%rbp), %xmm1, %xmm12003; SKX-NEXT: vpinsrb $12, 576(%rbp), %xmm1, %xmm12004; SKX-NEXT: vpinsrb $13, 584(%rbp), %xmm1, %xmm12005; SKX-NEXT: vpinsrb $14, 592(%rbp), %xmm1, %xmm12006; SKX-NEXT: vpinsrb $15, 600(%rbp), %xmm1, %xmm12007; SKX-NEXT: vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero2008; SKX-NEXT: vpinsrb $1, 616(%rbp), %xmm2, %xmm22009; SKX-NEXT: vpinsrb $2, 624(%rbp), %xmm2, %xmm22010; SKX-NEXT: vpinsrb $3, 632(%rbp), %xmm2, %xmm22011; SKX-NEXT: vpinsrb $4, 640(%rbp), %xmm2, %xmm22012; SKX-NEXT: vpinsrb $5, 648(%rbp), %xmm2, %xmm22013; SKX-NEXT: vpinsrb $6, 656(%rbp), %xmm2, %xmm22014; SKX-NEXT: vpinsrb $7, 664(%rbp), %xmm2, %xmm22015; SKX-NEXT: vpinsrb $8, 672(%rbp), %xmm2, %xmm22016; SKX-NEXT: vpinsrb $9, 680(%rbp), %xmm2, %xmm22017; SKX-NEXT: vpinsrb $10, 688(%rbp), %xmm2, %xmm22018; SKX-NEXT: vpinsrb $11, 696(%rbp), %xmm2, %xmm22019; SKX-NEXT: vpinsrb $12, 704(%rbp), %xmm2, %xmm22020; SKX-NEXT: vpinsrb $13, 712(%rbp), %xmm2, %xmm22021; SKX-NEXT: vpinsrb $14, 720(%rbp), %xmm2, %xmm22022; SKX-NEXT: vpinsrb $15, 728(%rbp), %xmm2, %xmm22023; SKX-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm12024; SKX-NEXT: movl 744(%rbp), %eax2025; SKX-NEXT: andl $127, %eax2026; SKX-NEXT: vptestmb %zmm0, %zmm0, %k02027; SKX-NEXT: vptestmb %zmm1, %zmm1, %k12028; SKX-NEXT: cmpb $0, 736(%rbp)2029; SKX-NEXT: vpmovm2b %k1, %zmm02030; SKX-NEXT: vmovdqa64 %zmm0, {{[0-9]+}}(%rsp)2031; SKX-NEXT: vpmovm2b %k0, %zmm02032; SKX-NEXT: vmovdqa64 %zmm0, (%rsp)2033; SKX-NEXT: setne (%rsp,%rax)2034; SKX-NEXT: vpsllw $7, {{[0-9]+}}(%rsp), %zmm02035; SKX-NEXT: vpmovb2m %zmm0, %k02036; SKX-NEXT: vpsllw $7, (%rsp), %zmm02037; SKX-NEXT: vpmovb2m %zmm0, %k12038; SKX-NEXT: kmovq %k1, %rax2039; SKX-NEXT: kmovq %k0, %rdx2040; SKX-NEXT: movq %rbp, %rsp2041; SKX-NEXT: popq %rbp2042; SKX-NEXT: vzeroupper2043; SKX-NEXT: retq2044 %t1 = icmp ugt <96 x i8> %a, zeroinitializer2045 %t2 = icmp ugt i8 %b, 02046 %t3 = insertelement <96 x i1> %t1, i1 %t2, i32 %index2047 %t4 = bitcast <96 x i1> %t3 to i962048 ret i96 %t42049}2050 2051define i128 @test_insertelement_variable_v128i1(<128 x i8> %a, i8 %b, i32 %index) nounwind {2052; KNL-LABEL: test_insertelement_variable_v128i1:2053; KNL: ## %bb.0:2054; KNL-NEXT: pushq %rbp2055; KNL-NEXT: movq %rsp, %rbp2056; KNL-NEXT: andq $-64, %rsp2057; KNL-NEXT: subq $192, %rsp2058; KNL-NEXT: ## kill: def $esi killed $esi def $rsi2059; KNL-NEXT: vextracti64x4 $1, %zmm0, %ymm22060; KNL-NEXT: vpxor %xmm3, %xmm3, %xmm32061; KNL-NEXT: vpcmpeqb %ymm3, %ymm2, %ymm22062; KNL-NEXT: vpcmpeqb %ymm3, %ymm0, %ymm02063; KNL-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm02064; KNL-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm02065; KNL-NEXT: vextracti64x4 $1, %zmm1, %ymm22066; KNL-NEXT: vpcmpeqb %ymm3, %ymm2, %ymm22067; KNL-NEXT: vpcmpeqb %ymm3, %ymm1, %ymm12068; KNL-NEXT: vinserti64x4 $1, %ymm2, %zmm1, %zmm12069; KNL-NEXT: vpternlogq {{.*#+}} zmm1 = ~zmm12070; KNL-NEXT: andl $127, %esi2071; KNL-NEXT: testb %dil, %dil2072; KNL-NEXT: vmovdqa64 %zmm1, {{[0-9]+}}(%rsp)2073; KNL-NEXT: vmovdqa64 %zmm0, (%rsp)2074; KNL-NEXT: setne (%rsp,%rsi)2075; KNL-NEXT: vpmovsxbd (%rsp), %zmm02076; KNL-NEXT: vpslld $31, %zmm0, %zmm02077; KNL-NEXT: vptestmd %zmm0, %zmm0, %k02078; KNL-NEXT: kmovw %k0, %eax2079; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm02080; KNL-NEXT: vpslld $31, %zmm0, %zmm02081; KNL-NEXT: vptestmd %zmm0, %zmm0, %k02082; KNL-NEXT: kmovw %k0, %ecx2083; KNL-NEXT: shll $16, %ecx2084; KNL-NEXT: orl %eax, %ecx2085; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm02086; KNL-NEXT: vpslld $31, %zmm0, %zmm02087; KNL-NEXT: vptestmd %zmm0, %zmm0, %k02088; KNL-NEXT: kmovw %k0, %edx2089; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm02090; KNL-NEXT: vpslld $31, %zmm0, %zmm02091; KNL-NEXT: vptestmd %zmm0, %zmm0, %k02092; KNL-NEXT: kmovw %k0, %eax2093; KNL-NEXT: shll $16, %eax2094; KNL-NEXT: orl %edx, %eax2095; KNL-NEXT: shlq $32, %rax2096; KNL-NEXT: orq %rcx, %rax2097; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm02098; KNL-NEXT: vpslld $31, %zmm0, %zmm02099; KNL-NEXT: vptestmd %zmm0, %zmm0, %k02100; KNL-NEXT: kmovw %k0, %ecx2101; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm02102; KNL-NEXT: vpslld $31, %zmm0, %zmm02103; KNL-NEXT: vptestmd %zmm0, %zmm0, %k02104; KNL-NEXT: kmovw %k0, %esi2105; KNL-NEXT: shll $16, %esi2106; KNL-NEXT: orl %ecx, %esi2107; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm02108; KNL-NEXT: vpslld $31, %zmm0, %zmm02109; KNL-NEXT: vptestmd %zmm0, %zmm0, %k02110; KNL-NEXT: kmovw %k0, %ecx2111; KNL-NEXT: vpmovsxbd {{[0-9]+}}(%rsp), %zmm02112; KNL-NEXT: vpslld $31, %zmm0, %zmm02113; KNL-NEXT: vptestmd %zmm0, %zmm0, %k02114; KNL-NEXT: kmovw %k0, %edx2115; KNL-NEXT: shll $16, %edx2116; KNL-NEXT: orl %ecx, %edx2117; KNL-NEXT: shlq $32, %rdx2118; KNL-NEXT: orq %rsi, %rdx2119; KNL-NEXT: movq %rbp, %rsp2120; KNL-NEXT: popq %rbp2121; KNL-NEXT: vzeroupper2122; KNL-NEXT: retq2123;2124; SKX-LABEL: test_insertelement_variable_v128i1:2125; SKX: ## %bb.0:2126; SKX-NEXT: pushq %rbp2127; SKX-NEXT: movq %rsp, %rbp2128; SKX-NEXT: andq $-64, %rsp2129; SKX-NEXT: subq $192, %rsp2130; SKX-NEXT: ## kill: def $esi killed $esi def $rsi2131; SKX-NEXT: vptestmb %zmm0, %zmm0, %k02132; SKX-NEXT: vptestmb %zmm1, %zmm1, %k12133; SKX-NEXT: andl $127, %esi2134; SKX-NEXT: testb %dil, %dil2135; SKX-NEXT: vpmovm2b %k1, %zmm02136; SKX-NEXT: vmovdqa64 %zmm0, {{[0-9]+}}(%rsp)2137; SKX-NEXT: vpmovm2b %k0, %zmm02138; SKX-NEXT: vmovdqa64 %zmm0, (%rsp)2139; SKX-NEXT: setne (%rsp,%rsi)2140; SKX-NEXT: vpsllw $7, {{[0-9]+}}(%rsp), %zmm02141; SKX-NEXT: vpmovb2m %zmm0, %k02142; SKX-NEXT: vpsllw $7, (%rsp), %zmm02143; SKX-NEXT: vpmovb2m %zmm0, %k12144; SKX-NEXT: kmovq %k1, %rax2145; SKX-NEXT: kmovq %k0, %rdx2146; SKX-NEXT: movq %rbp, %rsp2147; SKX-NEXT: popq %rbp2148; SKX-NEXT: vzeroupper2149; SKX-NEXT: retq2150 %t1 = icmp ugt <128 x i8> %a, zeroinitializer2151 %t2 = icmp ugt i8 %b, 02152 %t3 = insertelement <128 x i1> %t1, i1 %t2, i32 %index2153 %t4 = bitcast <128 x i1> %t3 to i1282154 ret i128 %t42155}2156 2157define void @test_concat_v2i1(ptr %arg, ptr %arg1, ptr %arg2) nounwind {2158; KNL-LABEL: test_concat_v2i1:2159; KNL: ## %bb.0:2160; KNL-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero2161; KNL-NEXT: vcvtph2ps %xmm0, %xmm12162; KNL-NEXT: vmovss {{.*#+}} xmm2 = [6.0E+0,0.0E+0,0.0E+0,0.0E+0]2163; KNL-NEXT: vucomiss %xmm2, %xmm12164; KNL-NEXT: setb %al2165; KNL-NEXT: andl $1, %eax2166; KNL-NEXT: kmovw %eax, %k02167; KNL-NEXT: vpsrld $16, %xmm0, %xmm02168; KNL-NEXT: vcvtph2ps %xmm0, %xmm02169; KNL-NEXT: vucomiss %xmm2, %xmm02170; KNL-NEXT: setb %al2171; KNL-NEXT: kmovw %eax, %k12172; KNL-NEXT: kshiftlw $1, %k1, %k12173; KNL-NEXT: korw %k1, %k0, %k02174; KNL-NEXT: vxorps %xmm2, %xmm2, %xmm22175; KNL-NEXT: vucomiss %xmm2, %xmm12176; KNL-NEXT: seta %al2177; KNL-NEXT: andl $1, %eax2178; KNL-NEXT: kmovw %eax, %k12179; KNL-NEXT: vucomiss %xmm2, %xmm02180; KNL-NEXT: seta %al2181; KNL-NEXT: kmovw %eax, %k22182; KNL-NEXT: kshiftlw $1, %k2, %k22183; KNL-NEXT: korw %k2, %k1, %k12184; KNL-NEXT: kandw %k1, %k0, %k12185; KNL-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero2186; KNL-NEXT: vpternlogd {{.*#+}} zmm1 {%k1} {z} = -12187; KNL-NEXT: vpmovdw %zmm1, %ymm12188; KNL-NEXT: vpand %xmm0, %xmm1, %xmm02189; KNL-NEXT: vmovd %xmm0, (%rdx)2190; KNL-NEXT: vzeroupper2191; KNL-NEXT: retq2192;2193; SKX-LABEL: test_concat_v2i1:2194; SKX: ## %bb.0:2195; SKX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero2196; SKX-NEXT: vcvtph2ps %xmm0, %ymm02197; SKX-NEXT: vcmpltps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %k02198; SKX-NEXT: vxorps %xmm1, %xmm1, %xmm12199; SKX-NEXT: vcmpltps %ymm0, %ymm1, %k12200; SKX-NEXT: kandw %k1, %k0, %k12201; SKX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero2202; SKX-NEXT: vmovdqu16 %xmm0, %xmm0 {%k1} {z}2203; SKX-NEXT: vmovd %xmm0, (%rdx)2204; SKX-NEXT: vzeroupper2205; SKX-NEXT: retq2206 %tmp = load <2 x half>, ptr %arg, align 82207 %tmp3 = fcmp fast olt <2 x half> %tmp, <half 0xH4600, half 0xH4600>2208 %tmp4 = fcmp fast ogt <2 x half> %tmp, zeroinitializer2209 %tmp5 = and <2 x i1> %tmp3, %tmp42210 %tmp6 = load <2 x half>, ptr %arg1, align 82211 %tmp7 = select <2 x i1> %tmp5, <2 x half> %tmp6, <2 x half> zeroinitializer2212 store <2 x half> %tmp7, ptr %arg2, align 82213 ret void2214}2215 2216; Check that an extracted bool element comparison is correctly extended when2217; the bool vector is bitcasted instead.2218define void @test_extractelement_v64i1_cmp0(<64 x i1> %0) nounwind {2219; KNL-LABEL: test_extractelement_v64i1_cmp0:2220; KNL: ## %bb.0: ## %entry2221; KNL-NEXT: retq2222;2223; SKX-LABEL: test_extractelement_v64i1_cmp0:2224; SKX: ## %bb.0: ## %entry2225; SKX-NEXT: vzeroupper2226; SKX-NEXT: retq2227entry:2228 %1 = extractelement <64 x i1> %0, i64 02229 br i1 %1, label %common.ret, label %22230 2231common.ret: ; preds = %2, %entry2232 ret void2233 22342: ; preds = %entry2235 %3 = extractelement <64 x i1> zeroinitializer, i64 02236 br label %common.ret2237}2238