brintos

brintos / llvm-project-archived public Read only

0
0
Text · 77.8 KiB · e183da1 Raw
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