brintos

brintos / llvm-project-archived public Read only

0
0
Text · 95.6 KiB · fce8795 Raw
2146 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --no_x86_scrub_sp --no_x86_scrub_mem_shuffle2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse3 | FileCheck %s --check-prefix=SSE33; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=SSSE34; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE415; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop | FileCheck %s --check-prefixes=AVX,AVXNOVLBW,XOP6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVXNOVLBW,AVX17; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVXNOVLBW,AVX28; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVXNOVLBW,AVX512,AVX512F9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefixes=AVX,AVXNOVLBW,AVX512,AVX512BW10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vbmi | FileCheck %s --check-prefixes=AVX,AVXNOVLBW,AVX512,AVX512BW11; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512VL,AVX512VLBW12; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+avx512vbmi | FileCheck %s --check-prefixes=AVX,AVX512VL,VLVBMI13 14define <2 x i64> @var_shuffle_v2i64(<2 x i64> %v, <2 x i64> %indices) nounwind {15; SSE3-LABEL: var_shuffle_v2i64:16; SSE3:       # %bb.0:17; SSE3-NEXT:    movq %xmm1, %rax18; SSE3-NEXT:    andl $1, %eax19; SSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]20; SSE3-NEXT:    movq %xmm1, %rcx21; SSE3-NEXT:    andl $1, %ecx22; SSE3-NEXT:    movaps %xmm0, -24(%rsp)23; SSE3-NEXT:    movsd -24(%rsp,%rax,8), %xmm0 # xmm0 = mem[0],zero24; SSE3-NEXT:    movsd -24(%rsp,%rcx,8), %xmm1 # xmm1 = mem[0],zero25; SSE3-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]26; SSE3-NEXT:    retq27;28; SSSE3-LABEL: var_shuffle_v2i64:29; SSSE3:       # %bb.0:30; SSSE3-NEXT:    movq %xmm1, %rax31; SSSE3-NEXT:    andl $1, %eax32; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]33; SSSE3-NEXT:    movq %xmm1, %rcx34; SSSE3-NEXT:    andl $1, %ecx35; SSSE3-NEXT:    movaps %xmm0, -24(%rsp)36; SSSE3-NEXT:    movsd -24(%rsp,%rax,8), %xmm0 # xmm0 = mem[0],zero37; SSSE3-NEXT:    movsd -24(%rsp,%rcx,8), %xmm1 # xmm1 = mem[0],zero38; SSSE3-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]39; SSSE3-NEXT:    retq40;41; SSE41-LABEL: var_shuffle_v2i64:42; SSE41:       # %bb.0:43; SSE41-NEXT:    pxor %xmm2, %xmm244; SSE41-NEXT:    pcmpeqq %xmm1, %xmm245; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,1,0,1]46; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]47; SSE41-NEXT:    movdqa %xmm2, %xmm048; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm149; SSE41-NEXT:    movapd %xmm1, %xmm050; SSE41-NEXT:    retq51;52; AVX-LABEL: var_shuffle_v2i64:53; AVX:       # %bb.0:54; AVX-NEXT:    vpaddq %xmm1, %xmm1, %xmm155; AVX-NEXT:    vpermilpd %xmm1, %xmm0, %xmm056; AVX-NEXT:    retq57  %index0 = extractelement <2 x i64> %indices, i32 058  %index1 = extractelement <2 x i64> %indices, i32 159  %v0 = extractelement <2 x i64> %v, i64 %index060  %v1 = extractelement <2 x i64> %v, i64 %index161  %ret0 = insertelement <2 x i64> undef, i64 %v0, i32 062  %ret1 = insertelement <2 x i64> %ret0, i64 %v1, i32 163  ret <2 x i64> %ret164}65 66define <2 x i64> @var_shuffle_zero_v2i64(<2 x i64> %v, <2 x i64> %indices) nounwind {67; SSE3-LABEL: var_shuffle_zero_v2i64:68; SSE3:       # %bb.0:69; SSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]70; SSE3-NEXT:    pxor %xmm1, %xmm271; SSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]72; SSE3-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm273; SSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]74; SSE3-NEXT:    pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm375; SSE3-NEXT:    pand %xmm4, %xmm376; SSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]77; SSE3-NEXT:    por %xmm3, %xmm278; SSE3-NEXT:    por %xmm2, %xmm179; SSE3-NEXT:    movq %xmm1, %rax80; SSE3-NEXT:    andl $1, %eax81; SSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]82; SSE3-NEXT:    movq %xmm1, %rcx83; SSE3-NEXT:    andl $1, %ecx84; SSE3-NEXT:    movaps %xmm0, -24(%rsp)85; SSE3-NEXT:    movq -24(%rsp,%rax,8), %xmm0 # xmm0 = mem[0],zero86; SSE3-NEXT:    movq -24(%rsp,%rcx,8), %xmm1 # xmm1 = mem[0],zero87; SSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]88; SSE3-NEXT:    pandn %xmm0, %xmm289; SSE3-NEXT:    movdqa %xmm2, %xmm090; SSE3-NEXT:    retq91;92; SSSE3-LABEL: var_shuffle_zero_v2i64:93; SSSE3:       # %bb.0:94; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]95; SSSE3-NEXT:    pxor %xmm1, %xmm296; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]97; SSSE3-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm298; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]99; SSSE3-NEXT:    pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3100; SSSE3-NEXT:    pand %xmm4, %xmm3101; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]102; SSSE3-NEXT:    por %xmm3, %xmm2103; SSSE3-NEXT:    por %xmm2, %xmm1104; SSSE3-NEXT:    movq %xmm1, %rax105; SSSE3-NEXT:    andl $1, %eax106; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]107; SSSE3-NEXT:    movq %xmm1, %rcx108; SSSE3-NEXT:    andl $1, %ecx109; SSSE3-NEXT:    movaps %xmm0, -24(%rsp)110; SSSE3-NEXT:    movq -24(%rsp,%rax,8), %xmm0 # xmm0 = mem[0],zero111; SSSE3-NEXT:    movq -24(%rsp,%rcx,8), %xmm1 # xmm1 = mem[0],zero112; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]113; SSSE3-NEXT:    pandn %xmm0, %xmm2114; SSSE3-NEXT:    movdqa %xmm2, %xmm0115; SSSE3-NEXT:    retq116;117; SSE41-LABEL: var_shuffle_zero_v2i64:118; SSE41:       # %bb.0:119; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]120; SSE41-NEXT:    pxor %xmm1, %xmm2121; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]122; SSE41-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2123; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]124; SSE41-NEXT:    pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3125; SSE41-NEXT:    pand %xmm4, %xmm3126; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]127; SSE41-NEXT:    por %xmm3, %xmm2128; SSE41-NEXT:    por %xmm2, %xmm1129; SSE41-NEXT:    pxor %xmm3, %xmm3130; SSE41-NEXT:    pcmpeqq %xmm1, %xmm3131; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]132; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[2,3,2,3]133; SSE41-NEXT:    movdqa %xmm3, %xmm0134; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4135; SSE41-NEXT:    pandn %xmm4, %xmm2136; SSE41-NEXT:    movdqa %xmm2, %xmm0137; SSE41-NEXT:    retq138;139; XOP-LABEL: var_shuffle_zero_v2i64:140; XOP:       # %bb.0:141; XOP-NEXT:    vpcomgtuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm2142; XOP-NEXT:    vpor %xmm1, %xmm2, %xmm1143; XOP-NEXT:    vpaddq %xmm1, %xmm1, %xmm1144; XOP-NEXT:    vpermilpd %xmm1, %xmm0, %xmm0145; XOP-NEXT:    vpandn %xmm0, %xmm2, %xmm0146; XOP-NEXT:    retq147;148; AVX1-LABEL: var_shuffle_zero_v2i64:149; AVX1:       # %bb.0:150; AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm2151; AVX1-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2152; AVX1-NEXT:    vpor %xmm1, %xmm2, %xmm1153; AVX1-NEXT:    vpaddq %xmm1, %xmm1, %xmm1154; AVX1-NEXT:    vpermilpd %xmm1, %xmm0, %xmm0155; AVX1-NEXT:    vpandn %xmm0, %xmm2, %xmm0156; AVX1-NEXT:    retq157;158; AVX2-LABEL: var_shuffle_zero_v2i64:159; AVX2:       # %bb.0:160; AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm2161; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2162; AVX2-NEXT:    vpor %xmm1, %xmm2, %xmm1163; AVX2-NEXT:    vpaddq %xmm1, %xmm1, %xmm1164; AVX2-NEXT:    vpermilpd %xmm1, %xmm0, %xmm0165; AVX2-NEXT:    vpandn %xmm0, %xmm2, %xmm0166; AVX2-NEXT:    retq167;168; AVX512-LABEL: var_shuffle_zero_v2i64:169; AVX512:       # %bb.0:170; AVX512-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1171; AVX512-NEXT:    vpmovsxbq {{.*#+}} xmm2 = [3,3]172; AVX512-NEXT:    vpcmpnleuq %zmm2, %zmm1, %k1173; AVX512-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2174; AVX512-NEXT:    vmovdqa64 %zmm2, %zmm1 {%k1}175; AVX512-NEXT:    vpaddq %xmm1, %xmm1, %xmm1176; AVX512-NEXT:    vpermilpd %xmm1, %xmm0, %xmm0177; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1178; AVX512-NEXT:    vmovdqa64 %zmm1, %zmm0 {%k1}179; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0180; AVX512-NEXT:    vzeroupper181; AVX512-NEXT:    retq182;183; AVX512VL-LABEL: var_shuffle_zero_v2i64:184; AVX512VL:       # %bb.0:185; AVX512VL-NEXT:    vpcmpnleuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm1, %k1186; AVX512VL-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2187; AVX512VL-NEXT:    vmovdqa64 %xmm2, %xmm1 {%k1}188; AVX512VL-NEXT:    vpaddq %xmm1, %xmm1, %xmm1189; AVX512VL-NEXT:    vpermilpd %xmm1, %xmm0, %xmm0190; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1191; AVX512VL-NEXT:    vmovdqa64 %xmm1, %xmm0 {%k1}192; AVX512VL-NEXT:    retq193  %cmp = icmp ugt <2 x i64> %indices, <i64 3, i64 3>194  %or = select <2 x i1> %cmp, <2 x i64> <i64 -1, i64 -1>, <2 x i64> %indices195  %idx0 = extractelement <2 x i64> %or, i64 0196  %idx1 = extractelement <2 x i64> %or, i64 1197  %elt0 = extractelement <2 x i64> %v, i64 %idx0198  %elt1 = extractelement <2 x i64> %v, i64 %idx1199  %vec0 = insertelement <2 x i64> poison, i64 %elt0, i64 0200  %vec1 = insertelement <2 x i64> %vec0, i64 %elt1, i64 1201  %res = select <2 x i1> %cmp, <2 x i64> zeroinitializer, <2 x i64> %vec1202  ret <2 x i64> %res203}204 205define <4 x i32> @var_shuffle_v4i32(<4 x i32> %v, <4 x i32> %indices) nounwind {206; SSE3-LABEL: var_shuffle_v4i32:207; SSE3:       # %bb.0:208; SSE3-NEXT:    movd %xmm1, %eax209; SSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]210; SSE3-NEXT:    movd %xmm2, %ecx211; SSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]212; SSE3-NEXT:    movd %xmm2, %edx213; SSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[3,3,3,3]214; SSE3-NEXT:    movd %xmm1, %esi215; SSE3-NEXT:    movaps %xmm0, -24(%rsp)216; SSE3-NEXT:    andl $3, %eax217; SSE3-NEXT:    andl $3, %ecx218; SSE3-NEXT:    andl $3, %edx219; SSE3-NEXT:    andl $3, %esi220; SSE3-NEXT:    movss -24(%rsp,%rsi,4), %xmm0 # xmm0 = mem[0],zero,zero,zero221; SSE3-NEXT:    movss -24(%rsp,%rdx,4), %xmm1 # xmm1 = mem[0],zero,zero,zero222; SSE3-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]223; SSE3-NEXT:    movss -24(%rsp,%rax,4), %xmm0 # xmm0 = mem[0],zero,zero,zero224; SSE3-NEXT:    movss -24(%rsp,%rcx,4), %xmm2 # xmm2 = mem[0],zero,zero,zero225; SSE3-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]226; SSE3-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]227; SSE3-NEXT:    retq228;229; SSSE3-LABEL: var_shuffle_v4i32:230; SSSE3:       # %bb.0:231; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [67372036,67372036,67372036,67372036]232; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]233; SSSE3-NEXT:    pmuludq %xmm2, %xmm1234; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]235; SSSE3-NEXT:    pmuludq %xmm2, %xmm3236; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3]237; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]238; SSSE3-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1239; SSSE3-NEXT:    pshufb %xmm1, %xmm0240; SSSE3-NEXT:    retq241;242; SSE41-LABEL: var_shuffle_v4i32:243; SSE41:       # %bb.0:244; SSE41-NEXT:    pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [67372036,67372036,67372036,67372036]245; SSE41-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1246; SSE41-NEXT:    pshufb %xmm1, %xmm0247; SSE41-NEXT:    retq248;249; AVX-LABEL: var_shuffle_v4i32:250; AVX:       # %bb.0:251; AVX-NEXT:    vpermilps %xmm1, %xmm0, %xmm0252; AVX-NEXT:    retq253  %index0 = extractelement <4 x i32> %indices, i32 0254  %index1 = extractelement <4 x i32> %indices, i32 1255  %index2 = extractelement <4 x i32> %indices, i32 2256  %index3 = extractelement <4 x i32> %indices, i32 3257  %v0 = extractelement <4 x i32> %v, i32 %index0258  %v1 = extractelement <4 x i32> %v, i32 %index1259  %v2 = extractelement <4 x i32> %v, i32 %index2260  %v3 = extractelement <4 x i32> %v, i32 %index3261  %ret0 = insertelement <4 x i32> undef, i32 %v0, i32 0262  %ret1 = insertelement <4 x i32> %ret0, i32 %v1, i32 1263  %ret2 = insertelement <4 x i32> %ret1, i32 %v2, i32 2264  %ret3 = insertelement <4 x i32> %ret2, i32 %v3, i32 3265  ret <4 x i32> %ret3266}267 268define <4 x i32> @var_shuffle_zero_v4i32(<4 x i32> %v, <4 x i32> %indices) nounwind {269; SSE3-LABEL: var_shuffle_zero_v4i32:270; SSE3:       # %bb.0:271; SSE3-NEXT:    movaps %xmm0, %xmm2272; SSE3-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]273; SSE3-NEXT:    pxor %xmm1, %xmm0274; SSE3-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0275; SSE3-NEXT:    por %xmm0, %xmm1276; SSE3-NEXT:    movd %xmm1, %eax277; SSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,1,1]278; SSE3-NEXT:    movd %xmm3, %ecx279; SSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]280; SSE3-NEXT:    movd %xmm3, %edx281; SSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[3,3,3,3]282; SSE3-NEXT:    movd %xmm1, %esi283; SSE3-NEXT:    movaps %xmm2, -24(%rsp)284; SSE3-NEXT:    andl $3, %eax285; SSE3-NEXT:    andl $3, %ecx286; SSE3-NEXT:    andl $3, %edx287; SSE3-NEXT:    andl $3, %esi288; SSE3-NEXT:    movd -24(%rsp,%rsi,4), %xmm1 # xmm1 = mem[0],zero,zero,zero289; SSE3-NEXT:    movd -24(%rsp,%rdx,4), %xmm2 # xmm2 = mem[0],zero,zero,zero290; SSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]291; SSE3-NEXT:    movd -24(%rsp,%rax,4), %xmm1 # xmm1 = mem[0],zero,zero,zero292; SSE3-NEXT:    movd -24(%rsp,%rcx,4), %xmm3 # xmm3 = mem[0],zero,zero,zero293; SSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]294; SSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]295; SSE3-NEXT:    pandn %xmm1, %xmm0296; SSE3-NEXT:    retq297;298; SSSE3-LABEL: var_shuffle_zero_v4i32:299; SSSE3:       # %bb.0:300; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]301; SSSE3-NEXT:    pxor %xmm1, %xmm2302; SSSE3-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2303; SSSE3-NEXT:    por %xmm2, %xmm1304; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [67372036,67372036,67372036,67372036]305; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]306; SSSE3-NEXT:    pmuludq %xmm3, %xmm1307; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]308; SSSE3-NEXT:    pmuludq %xmm3, %xmm4309; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[0,2,2,3]310; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]311; SSSE3-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1312; SSSE3-NEXT:    por %xmm2, %xmm1313; SSSE3-NEXT:    pshufb %xmm1, %xmm0314; SSSE3-NEXT:    retq315;316; SSE41-LABEL: var_shuffle_zero_v4i32:317; SSE41:       # %bb.0:318; SSE41-NEXT:    pmovsxbd {{.*#+}} xmm2 = [4,4,4,4]319; SSE41-NEXT:    pmaxud %xmm1, %xmm2320; SSE41-NEXT:    pcmpeqd %xmm1, %xmm2321; SSE41-NEXT:    por %xmm2, %xmm1322; SSE41-NEXT:    pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [67372036,67372036,67372036,67372036]323; SSE41-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1324; SSE41-NEXT:    por %xmm2, %xmm1325; SSE41-NEXT:    pshufb %xmm1, %xmm0326; SSE41-NEXT:    retq327;328; XOP-LABEL: var_shuffle_zero_v4i32:329; XOP:       # %bb.0:330; XOP-NEXT:    vpcomgtud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm2331; XOP-NEXT:    vpor %xmm1, %xmm2, %xmm1332; XOP-NEXT:    vpermilps %xmm1, %xmm0, %xmm0333; XOP-NEXT:    vpandn %xmm0, %xmm2, %xmm0334; XOP-NEXT:    retq335;336; AVX1-LABEL: var_shuffle_zero_v4i32:337; AVX1:       # %bb.0:338; AVX1-NEXT:    vpmaxud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm2339; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm1, %xmm2340; AVX1-NEXT:    vpor %xmm1, %xmm2, %xmm1341; AVX1-NEXT:    vpermilps %xmm1, %xmm0, %xmm0342; AVX1-NEXT:    vpandn %xmm0, %xmm2, %xmm0343; AVX1-NEXT:    retq344;345; AVX2-LABEL: var_shuffle_zero_v4i32:346; AVX2:       # %bb.0:347; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [4,4,4,4]348; AVX2-NEXT:    vpmaxud %xmm2, %xmm1, %xmm2349; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm1, %xmm2350; AVX2-NEXT:    vpor %xmm1, %xmm2, %xmm1351; AVX2-NEXT:    vpermilps %xmm1, %xmm0, %xmm0352; AVX2-NEXT:    vpandn %xmm0, %xmm2, %xmm0353; AVX2-NEXT:    retq354;355; AVX512-LABEL: var_shuffle_zero_v4i32:356; AVX512:       # %bb.0:357; AVX512-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1358; AVX512-NEXT:    vpcmpnleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm1, %k1359; AVX512-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2360; AVX512-NEXT:    vmovdqa32 %zmm2, %zmm1 {%k1}361; AVX512-NEXT:    vpermilps %xmm1, %xmm0, %xmm0362; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1363; AVX512-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1}364; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0365; AVX512-NEXT:    vzeroupper366; AVX512-NEXT:    retq367;368; AVX512VL-LABEL: var_shuffle_zero_v4i32:369; AVX512VL:       # %bb.0:370; AVX512VL-NEXT:    vpcmpnleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %k1371; AVX512VL-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2372; AVX512VL-NEXT:    vmovdqa32 %xmm2, %xmm1 {%k1}373; AVX512VL-NEXT:    vpermilps %xmm1, %xmm0, %xmm0374; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1375; AVX512VL-NEXT:    vmovdqa32 %xmm1, %xmm0 {%k1}376; AVX512VL-NEXT:    retq377  %cmp = icmp ugt <4 x i32> %indices, <i32 3, i32 3, i32 3, i32 3>378  %or = select <4 x i1> %cmp, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> %indices379  %idx0 = extractelement <4 x i32> %or, i64 0380  %idx1 = extractelement <4 x i32> %or, i64 1381  %idx2 = extractelement <4 x i32> %or, i64 2382  %idx3 = extractelement <4 x i32> %or, i64 3383  %elt0 = extractelement <4 x i32> %v, i32 %idx0384  %elt1 = extractelement <4 x i32> %v, i32 %idx1385  %elt2 = extractelement <4 x i32> %v, i32 %idx2386  %elt3 = extractelement <4 x i32> %v, i32 %idx3387  %vec0 = insertelement <4 x i32> poison, i32 %elt0, i32 0388  %vec1 = insertelement <4 x i32> %vec0, i32 %elt1, i32 1389  %vec2 = insertelement <4 x i32> %vec1, i32 %elt2, i32 2390  %vec3 = insertelement <4 x i32> %vec2, i32 %elt3, i32 3391  %res = select <4 x i1> %cmp, <4 x i32> zeroinitializer, <4 x i32> %vec3392  ret <4 x i32> %res393}394 395define <8 x i16> @var_shuffle_v8i16(<8 x i16> %v, <8 x i16> %indices) nounwind {396; SSE3-LABEL: var_shuffle_v8i16:397; SSE3:       # %bb.0:398; SSE3-NEXT:    pextrw $0, %xmm1, %eax399; SSE3-NEXT:    pextrw $1, %xmm1, %ecx400; SSE3-NEXT:    pextrw $2, %xmm1, %edx401; SSE3-NEXT:    pextrw $3, %xmm1, %esi402; SSE3-NEXT:    pextrw $4, %xmm1, %edi403; SSE3-NEXT:    pextrw $5, %xmm1, %r8d404; SSE3-NEXT:    pextrw $6, %xmm1, %r9d405; SSE3-NEXT:    pextrw $7, %xmm1, %r10d406; SSE3-NEXT:    movaps %xmm0, -24(%rsp)407; SSE3-NEXT:    andl $7, %eax408; SSE3-NEXT:    andl $7, %ecx409; SSE3-NEXT:    andl $7, %edx410; SSE3-NEXT:    andl $7, %esi411; SSE3-NEXT:    andl $7, %edi412; SSE3-NEXT:    andl $7, %r8d413; SSE3-NEXT:    andl $7, %r9d414; SSE3-NEXT:    andl $7, %r10d415; SSE3-NEXT:    movzwl -24(%rsp,%r10,2), %r10d416; SSE3-NEXT:    movd %r10d, %xmm0417; SSE3-NEXT:    movzwl -24(%rsp,%r9,2), %r9d418; SSE3-NEXT:    movd %r9d, %xmm1419; SSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]420; SSE3-NEXT:    movzwl -24(%rsp,%r8,2), %r8d421; SSE3-NEXT:    movd %r8d, %xmm0422; SSE3-NEXT:    movzwl -24(%rsp,%rdi,2), %edi423; SSE3-NEXT:    movd %edi, %xmm2424; SSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]425; SSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]426; SSE3-NEXT:    movzwl -24(%rsp,%rsi,2), %esi427; SSE3-NEXT:    movd %esi, %xmm0428; SSE3-NEXT:    movzwl -24(%rsp,%rdx,2), %edx429; SSE3-NEXT:    movd %edx, %xmm1430; SSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]431; SSE3-NEXT:    movzwl -24(%rsp,%rcx,2), %ecx432; SSE3-NEXT:    movd %ecx, %xmm3433; SSE3-NEXT:    movzwl -24(%rsp,%rax,2), %eax434; SSE3-NEXT:    movd %eax, %xmm0435; SSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]436; SSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]437; SSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]438; SSE3-NEXT:    retq439;440; SSSE3-LABEL: var_shuffle_v8i16:441; SSSE3:       # %bb.0:442; SSSE3-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [514,514,514,514,514,514,514,514]443; SSSE3-NEXT:    paddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1444; SSSE3-NEXT:    pshufb %xmm1, %xmm0445; SSSE3-NEXT:    retq446;447; SSE41-LABEL: var_shuffle_v8i16:448; SSE41:       # %bb.0:449; SSE41-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [514,514,514,514,514,514,514,514]450; SSE41-NEXT:    paddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1451; SSE41-NEXT:    pshufb %xmm1, %xmm0452; SSE41-NEXT:    retq453;454; AVXNOVLBW-LABEL: var_shuffle_v8i16:455; AVXNOVLBW:       # %bb.0:456; AVXNOVLBW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [514,514,514,514,514,514,514,514]457; AVXNOVLBW-NEXT:    vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1458; AVXNOVLBW-NEXT:    vpshufb %xmm1, %xmm0, %xmm0459; AVXNOVLBW-NEXT:    retq460;461; AVX512VL-LABEL: var_shuffle_v8i16:462; AVX512VL:       # %bb.0:463; AVX512VL-NEXT:    vpermw %xmm0, %xmm1, %xmm0464; AVX512VL-NEXT:    retq465  %index0 = extractelement <8 x i16> %indices, i32 0466  %index1 = extractelement <8 x i16> %indices, i32 1467  %index2 = extractelement <8 x i16> %indices, i32 2468  %index3 = extractelement <8 x i16> %indices, i32 3469  %index4 = extractelement <8 x i16> %indices, i32 4470  %index5 = extractelement <8 x i16> %indices, i32 5471  %index6 = extractelement <8 x i16> %indices, i32 6472  %index7 = extractelement <8 x i16> %indices, i32 7473  %v0 = extractelement <8 x i16> %v, i16 %index0474  %v1 = extractelement <8 x i16> %v, i16 %index1475  %v2 = extractelement <8 x i16> %v, i16 %index2476  %v3 = extractelement <8 x i16> %v, i16 %index3477  %v4 = extractelement <8 x i16> %v, i16 %index4478  %v5 = extractelement <8 x i16> %v, i16 %index5479  %v6 = extractelement <8 x i16> %v, i16 %index6480  %v7 = extractelement <8 x i16> %v, i16 %index7481  %ret0 = insertelement <8 x i16> undef, i16 %v0, i32 0482  %ret1 = insertelement <8 x i16> %ret0, i16 %v1, i32 1483  %ret2 = insertelement <8 x i16> %ret1, i16 %v2, i32 2484  %ret3 = insertelement <8 x i16> %ret2, i16 %v3, i32 3485  %ret4 = insertelement <8 x i16> %ret3, i16 %v4, i32 4486  %ret5 = insertelement <8 x i16> %ret4, i16 %v5, i32 5487  %ret6 = insertelement <8 x i16> %ret5, i16 %v6, i32 6488  %ret7 = insertelement <8 x i16> %ret6, i16 %v7, i32 7489  ret <8 x i16> %ret7490}491 492define <8 x i16> @var_shuffle_zero_v8i16(<8 x i16> %v, <8 x i16> %indices) nounwind {493; SSE3-LABEL: var_shuffle_zero_v8i16:494; SSE3:       # %bb.0:495; SSE3-NEXT:    movdqa %xmm0, %xmm2496; SSE3-NEXT:    movdqa {{.*#+}} xmm3 = [8,8,8,8,8,8,8,8]497; SSE3-NEXT:    psubusw %xmm1, %xmm3498; SSE3-NEXT:    pxor %xmm0, %xmm0499; SSE3-NEXT:    pcmpeqw %xmm3, %xmm0500; SSE3-NEXT:    por %xmm0, %xmm1501; SSE3-NEXT:    pextrw $0, %xmm1, %eax502; SSE3-NEXT:    pextrw $1, %xmm1, %ecx503; SSE3-NEXT:    pextrw $2, %xmm1, %edx504; SSE3-NEXT:    pextrw $3, %xmm1, %edi505; SSE3-NEXT:    pextrw $4, %xmm1, %r8d506; SSE3-NEXT:    pextrw $5, %xmm1, %r9d507; SSE3-NEXT:    pextrw $6, %xmm1, %r10d508; SSE3-NEXT:    pextrw $7, %xmm1, %esi509; SSE3-NEXT:    movdqa %xmm2, -24(%rsp)510; SSE3-NEXT:    andl $7, %eax511; SSE3-NEXT:    movzwl -24(%rsp,%rax,2), %eax512; SSE3-NEXT:    andl $7, %ecx513; SSE3-NEXT:    movzwl -24(%rsp,%rcx,2), %ecx514; SSE3-NEXT:    andl $7, %edx515; SSE3-NEXT:    movzwl -24(%rsp,%rdx,2), %edx516; SSE3-NEXT:    andl $7, %edi517; SSE3-NEXT:    movzwl -24(%rsp,%rdi,2), %edi518; SSE3-NEXT:    andl $7, %r8d519; SSE3-NEXT:    movzwl -24(%rsp,%r8,2), %r8d520; SSE3-NEXT:    andl $7, %r9d521; SSE3-NEXT:    movzwl -24(%rsp,%r9,2), %r9d522; SSE3-NEXT:    andl $7, %r10d523; SSE3-NEXT:    movzwl -24(%rsp,%r10,2), %r10d524; SSE3-NEXT:    andl $7, %esi525; SSE3-NEXT:    movzwl -24(%rsp,%rsi,2), %esi526; SSE3-NEXT:    movd %esi, %xmm1527; SSE3-NEXT:    movd %r10d, %xmm2528; SSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]529; SSE3-NEXT:    movd %r9d, %xmm1530; SSE3-NEXT:    movd %r8d, %xmm3531; SSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3]532; SSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]533; SSE3-NEXT:    movd %edi, %xmm1534; SSE3-NEXT:    movd %edx, %xmm2535; SSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]536; SSE3-NEXT:    movd %ecx, %xmm1537; SSE3-NEXT:    movd %eax, %xmm4538; SSE3-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3]539; SSE3-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]540; SSE3-NEXT:    punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm3[0]541; SSE3-NEXT:    pandn %xmm4, %xmm0542; SSE3-NEXT:    retq543;544; SSSE3-LABEL: var_shuffle_zero_v8i16:545; SSSE3:       # %bb.0:546; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [8,8,8,8,8,8,8,8]547; SSSE3-NEXT:    psubusw %xmm1, %xmm2548; SSSE3-NEXT:    pxor %xmm3, %xmm3549; SSSE3-NEXT:    pcmpeqw %xmm2, %xmm3550; SSSE3-NEXT:    por %xmm3, %xmm1551; SSSE3-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [514,514,514,514,514,514,514,514]552; SSSE3-NEXT:    paddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1553; SSSE3-NEXT:    por %xmm3, %xmm1554; SSSE3-NEXT:    pshufb %xmm1, %xmm0555; SSSE3-NEXT:    retq556;557; SSE41-LABEL: var_shuffle_zero_v8i16:558; SSE41:       # %bb.0:559; SSE41-NEXT:    pmovsxbw {{.*#+}} xmm2 = [8,8,8,8,8,8,8,8]560; SSE41-NEXT:    pmaxuw %xmm1, %xmm2561; SSE41-NEXT:    pcmpeqw %xmm1, %xmm2562; SSE41-NEXT:    por %xmm2, %xmm1563; SSE41-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [514,514,514,514,514,514,514,514]564; SSE41-NEXT:    paddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1565; SSE41-NEXT:    por %xmm2, %xmm1566; SSE41-NEXT:    pshufb %xmm1, %xmm0567; SSE41-NEXT:    retq568;569; XOP-LABEL: var_shuffle_zero_v8i16:570; XOP:       # %bb.0:571; XOP-NEXT:    vpcomgtuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm2572; XOP-NEXT:    vpor %xmm1, %xmm2, %xmm1573; XOP-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [514,514,514,514,514,514,514,514]574; XOP-NEXT:    vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1575; XOP-NEXT:    vpor %xmm2, %xmm1, %xmm1576; XOP-NEXT:    vpshufb %xmm1, %xmm0, %xmm0577; XOP-NEXT:    retq578;579; AVX1-LABEL: var_shuffle_zero_v8i16:580; AVX1:       # %bb.0:581; AVX1-NEXT:    vpmaxuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm2582; AVX1-NEXT:    vpcmpeqw %xmm2, %xmm1, %xmm2583; AVX1-NEXT:    vpor %xmm1, %xmm2, %xmm1584; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [514,514,514,514,514,514,514,514]585; AVX1-NEXT:    vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1586; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm1587; AVX1-NEXT:    vpshufb %xmm1, %xmm0, %xmm0588; AVX1-NEXT:    retq589;590; AVX2-LABEL: var_shuffle_zero_v8i16:591; AVX2:       # %bb.0:592; AVX2-NEXT:    vpmaxuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm2593; AVX2-NEXT:    vpcmpeqw %xmm2, %xmm1, %xmm2594; AVX2-NEXT:    vpor %xmm1, %xmm2, %xmm1595; AVX2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [514,514,514,514,514,514,514,514]596; AVX2-NEXT:    vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1597; AVX2-NEXT:    vpor %xmm2, %xmm1, %xmm1598; AVX2-NEXT:    vpshufb %xmm1, %xmm0, %xmm0599; AVX2-NEXT:    retq600;601; AVX512F-LABEL: var_shuffle_zero_v8i16:602; AVX512F:       # %bb.0:603; AVX512F-NEXT:    vpmaxuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm2604; AVX512F-NEXT:    vpcmpeqw %xmm2, %xmm1, %xmm2605; AVX512F-NEXT:    vpor %xmm1, %xmm2, %xmm1606; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [514,514,514,514,514,514,514,514]607; AVX512F-NEXT:    vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1608; AVX512F-NEXT:    vpor %xmm2, %xmm1, %xmm1609; AVX512F-NEXT:    vpshufb %xmm1, %xmm0, %xmm0610; AVX512F-NEXT:    retq611;612; AVX512BW-LABEL: var_shuffle_zero_v8i16:613; AVX512BW:       # %bb.0:614; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1615; AVX512BW-NEXT:    vpbroadcastw {{.*#+}} xmm2 = [7,7,7,7,7,7,7,7]616; AVX512BW-NEXT:    vpcmpnleuw %zmm2, %zmm1, %k1617; AVX512BW-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2618; AVX512BW-NEXT:    vmovdqu16 %zmm2, %zmm1 {%k1}619; AVX512BW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [514,514,514,514,514,514,514,514]620; AVX512BW-NEXT:    vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1621; AVX512BW-NEXT:    vpshufb %xmm1, %xmm0, %xmm0622; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1623; AVX512BW-NEXT:    vmovdqu16 %zmm1, %zmm0 {%k1}624; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0625; AVX512BW-NEXT:    vzeroupper626; AVX512BW-NEXT:    retq627;628; AVX512VL-LABEL: var_shuffle_zero_v8i16:629; AVX512VL:       # %bb.0:630; AVX512VL-NEXT:    vpcmpnleuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %k1631; AVX512VL-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2632; AVX512VL-NEXT:    vmovdqu16 %xmm2, %xmm1 {%k1}633; AVX512VL-NEXT:    vpermw %xmm0, %xmm1, %xmm0634; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1635; AVX512VL-NEXT:    vmovdqu16 %xmm1, %xmm0 {%k1}636; AVX512VL-NEXT:    retq637  %cmp = icmp ugt <8 x i16> %indices, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>638  %or = select <8 x i1> %cmp, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <8 x i16> %indices639  %idx0 = extractelement <8 x i16> %or, i64 0640  %idx1 = extractelement <8 x i16> %or, i64 1641  %idx2 = extractelement <8 x i16> %or, i64 2642  %idx3 = extractelement <8 x i16> %or, i64 3643  %idx4 = extractelement <8 x i16> %or, i64 4644  %idx5 = extractelement <8 x i16> %or, i64 5645  %idx6 = extractelement <8 x i16> %or, i64 6646  %idx7 = extractelement <8 x i16> %or, i64 7647  %elt0 = extractelement <8 x i16> %v, i16 %idx0648  %elt1 = extractelement <8 x i16> %v, i16 %idx1649  %elt2 = extractelement <8 x i16> %v, i16 %idx2650  %elt3 = extractelement <8 x i16> %v, i16 %idx3651  %elt4 = extractelement <8 x i16> %v, i16 %idx4652  %elt5 = extractelement <8 x i16> %v, i16 %idx5653  %elt6 = extractelement <8 x i16> %v, i16 %idx6654  %elt7 = extractelement <8 x i16> %v, i16 %idx7655  %vec0 = insertelement <8 x i16> poison, i16 %elt0, i64 0656  %vec1 = insertelement <8 x i16> %vec0, i16 %elt1, i64 1657  %vec2 = insertelement <8 x i16> %vec1, i16 %elt2, i64 2658  %vec3 = insertelement <8 x i16> %vec2, i16 %elt3, i64 3659  %vec4 = insertelement <8 x i16> %vec3, i16 %elt4, i64 4660  %vec5 = insertelement <8 x i16> %vec4, i16 %elt5, i64 5661  %vec6 = insertelement <8 x i16> %vec5, i16 %elt6, i64 6662  %vec7 = insertelement <8 x i16> %vec6, i16 %elt7, i64 7663  %res = select <8 x i1> %cmp, <8 x i16> zeroinitializer, <8 x i16> %vec7664  ret <8 x i16> %res665}666 667define <16 x i8> @var_shuffle_v16i8(<16 x i8> %v, <16 x i8> %indices) nounwind {668; SSE3-LABEL: var_shuffle_v16i8:669; SSE3:       # %bb.0:670; SSE3-NEXT:    movaps %xmm1, -40(%rsp)671; SSE3-NEXT:    movaps %xmm0, -24(%rsp)672; SSE3-NEXT:    movzbl -25(%rsp), %eax673; SSE3-NEXT:    andl $15, %eax674; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax675; SSE3-NEXT:    movd %eax, %xmm1676; SSE3-NEXT:    movzbl -26(%rsp), %eax677; SSE3-NEXT:    andl $15, %eax678; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax679; SSE3-NEXT:    movd %eax, %xmm2680; SSE3-NEXT:    movzbl -27(%rsp), %eax681; SSE3-NEXT:    andl $15, %eax682; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax683; SSE3-NEXT:    movd %eax, %xmm4684; SSE3-NEXT:    movzbl -28(%rsp), %eax685; SSE3-NEXT:    andl $15, %eax686; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax687; SSE3-NEXT:    movd %eax, %xmm3688; SSE3-NEXT:    movzbl -29(%rsp), %eax689; SSE3-NEXT:    andl $15, %eax690; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax691; SSE3-NEXT:    movd %eax, %xmm6692; SSE3-NEXT:    movzbl -30(%rsp), %eax693; SSE3-NEXT:    andl $15, %eax694; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax695; SSE3-NEXT:    movd %eax, %xmm7696; SSE3-NEXT:    movzbl -31(%rsp), %eax697; SSE3-NEXT:    andl $15, %eax698; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax699; SSE3-NEXT:    movd %eax, %xmm8700; SSE3-NEXT:    movzbl -32(%rsp), %eax701; SSE3-NEXT:    andl $15, %eax702; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax703; SSE3-NEXT:    movd %eax, %xmm5704; SSE3-NEXT:    movzbl -33(%rsp), %eax705; SSE3-NEXT:    andl $15, %eax706; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax707; SSE3-NEXT:    movd %eax, %xmm9708; SSE3-NEXT:    movzbl -34(%rsp), %eax709; SSE3-NEXT:    andl $15, %eax710; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax711; SSE3-NEXT:    movd %eax, %xmm10712; SSE3-NEXT:    movzbl -35(%rsp), %eax713; SSE3-NEXT:    andl $15, %eax714; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax715; SSE3-NEXT:    movd %eax, %xmm12716; SSE3-NEXT:    movzbl -36(%rsp), %eax717; SSE3-NEXT:    andl $15, %eax718; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax719; SSE3-NEXT:    movd %eax, %xmm11720; SSE3-NEXT:    movzbl -37(%rsp), %eax721; SSE3-NEXT:    andl $15, %eax722; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax723; SSE3-NEXT:    movd %eax, %xmm13724; SSE3-NEXT:    movzbl -38(%rsp), %eax725; SSE3-NEXT:    andl $15, %eax726; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax727; SSE3-NEXT:    movd %eax, %xmm14728; SSE3-NEXT:    movzbl -39(%rsp), %eax729; SSE3-NEXT:    andl $15, %eax730; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax731; SSE3-NEXT:    movd %eax, %xmm15732; SSE3-NEXT:    movzbl -40(%rsp), %eax733; SSE3-NEXT:    andl $15, %eax734; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax735; SSE3-NEXT:    movd %eax, %xmm0736; SSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]737; SSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]738; SSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]739; SSE3-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm6[0],xmm7[1],xmm6[1],xmm7[2],xmm6[2],xmm7[3],xmm6[3],xmm7[4],xmm6[4],xmm7[5],xmm6[5],xmm7[6],xmm6[6],xmm7[7],xmm6[7]740; SSE3-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm8[0],xmm5[1],xmm8[1],xmm5[2],xmm8[2],xmm5[3],xmm8[3],xmm5[4],xmm8[4],xmm5[5],xmm8[5],xmm5[6],xmm8[6],xmm5[7],xmm8[7]741; SSE3-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1],xmm5[2],xmm7[2],xmm5[3],xmm7[3]742; SSE3-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]743; SSE3-NEXT:    punpcklbw {{.*#+}} xmm10 = xmm10[0],xmm9[0],xmm10[1],xmm9[1],xmm10[2],xmm9[2],xmm10[3],xmm9[3],xmm10[4],xmm9[4],xmm10[5],xmm9[5],xmm10[6],xmm9[6],xmm10[7],xmm9[7]744; SSE3-NEXT:    punpcklbw {{.*#+}} xmm11 = xmm11[0],xmm12[0],xmm11[1],xmm12[1],xmm11[2],xmm12[2],xmm11[3],xmm12[3],xmm11[4],xmm12[4],xmm11[5],xmm12[5],xmm11[6],xmm12[6],xmm11[7],xmm12[7]745; SSE3-NEXT:    punpcklwd {{.*#+}} xmm11 = xmm11[0],xmm10[0],xmm11[1],xmm10[1],xmm11[2],xmm10[2],xmm11[3],xmm10[3]746; SSE3-NEXT:    punpcklbw {{.*#+}} xmm14 = xmm14[0],xmm13[0],xmm14[1],xmm13[1],xmm14[2],xmm13[2],xmm14[3],xmm13[3],xmm14[4],xmm13[4],xmm14[5],xmm13[5],xmm14[6],xmm13[6],xmm14[7],xmm13[7]747; SSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm15[0],xmm0[1],xmm15[1],xmm0[2],xmm15[2],xmm0[3],xmm15[3],xmm0[4],xmm15[4],xmm0[5],xmm15[5],xmm0[6],xmm15[6],xmm0[7],xmm15[7]748; SSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm14[0],xmm0[1],xmm14[1],xmm0[2],xmm14[2],xmm0[3],xmm14[3]749; SSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm11[0],xmm0[1],xmm11[1]750; SSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm5[0]751; SSE3-NEXT:    retq752;753; SSSE3-LABEL: var_shuffle_v16i8:754; SSSE3:       # %bb.0:755; SSSE3-NEXT:    pshufb %xmm1, %xmm0756; SSSE3-NEXT:    retq757;758; SSE41-LABEL: var_shuffle_v16i8:759; SSE41:       # %bb.0:760; SSE41-NEXT:    pshufb %xmm1, %xmm0761; SSE41-NEXT:    retq762;763; AVX-LABEL: var_shuffle_v16i8:764; AVX:       # %bb.0:765; AVX-NEXT:    vpshufb %xmm1, %xmm0, %xmm0766; AVX-NEXT:    retq767  %index0 = extractelement <16 x i8> %indices, i32 0768  %index1 = extractelement <16 x i8> %indices, i32 1769  %index2 = extractelement <16 x i8> %indices, i32 2770  %index3 = extractelement <16 x i8> %indices, i32 3771  %index4 = extractelement <16 x i8> %indices, i32 4772  %index5 = extractelement <16 x i8> %indices, i32 5773  %index6 = extractelement <16 x i8> %indices, i32 6774  %index7 = extractelement <16 x i8> %indices, i32 7775  %index8 = extractelement <16 x i8> %indices, i32 8776  %index9 = extractelement <16 x i8> %indices, i32 9777  %index10 = extractelement <16 x i8> %indices, i32 10778  %index11 = extractelement <16 x i8> %indices, i32 11779  %index12 = extractelement <16 x i8> %indices, i32 12780  %index13 = extractelement <16 x i8> %indices, i32 13781  %index14 = extractelement <16 x i8> %indices, i32 14782  %index15 = extractelement <16 x i8> %indices, i32 15783  %v0 = extractelement <16 x i8> %v, i8 %index0784  %v1 = extractelement <16 x i8> %v, i8 %index1785  %v2 = extractelement <16 x i8> %v, i8 %index2786  %v3 = extractelement <16 x i8> %v, i8 %index3787  %v4 = extractelement <16 x i8> %v, i8 %index4788  %v5 = extractelement <16 x i8> %v, i8 %index5789  %v6 = extractelement <16 x i8> %v, i8 %index6790  %v7 = extractelement <16 x i8> %v, i8 %index7791  %v8 = extractelement <16 x i8> %v, i8 %index8792  %v9 = extractelement <16 x i8> %v, i8 %index9793  %v10 = extractelement <16 x i8> %v, i8 %index10794  %v11 = extractelement <16 x i8> %v, i8 %index11795  %v12 = extractelement <16 x i8> %v, i8 %index12796  %v13 = extractelement <16 x i8> %v, i8 %index13797  %v14 = extractelement <16 x i8> %v, i8 %index14798  %v15 = extractelement <16 x i8> %v, i8 %index15799  %ret0 = insertelement <16 x i8> undef, i8 %v0, i32 0800  %ret1 = insertelement <16 x i8> %ret0, i8 %v1, i32 1801  %ret2 = insertelement <16 x i8> %ret1, i8 %v2, i32 2802  %ret3 = insertelement <16 x i8> %ret2, i8 %v3, i32 3803  %ret4 = insertelement <16 x i8> %ret3, i8 %v4, i32 4804  %ret5 = insertelement <16 x i8> %ret4, i8 %v5, i32 5805  %ret6 = insertelement <16 x i8> %ret5, i8 %v6, i32 6806  %ret7 = insertelement <16 x i8> %ret6, i8 %v7, i32 7807  %ret8 = insertelement <16 x i8> %ret7, i8 %v8, i32 8808  %ret9 = insertelement <16 x i8> %ret8, i8 %v9, i32 9809  %ret10 = insertelement <16 x i8> %ret9, i8 %v10, i32 10810  %ret11 = insertelement <16 x i8> %ret10, i8 %v11, i32 11811  %ret12 = insertelement <16 x i8> %ret11, i8 %v12, i32 12812  %ret13 = insertelement <16 x i8> %ret12, i8 %v13, i32 13813  %ret14 = insertelement <16 x i8> %ret13, i8 %v14, i32 14814  %ret15 = insertelement <16 x i8> %ret14, i8 %v15, i32 15815  ret <16 x i8> %ret15816}817 818define <16 x i8> @var_shuffle_zero_v16i8(<16 x i8> %v, <16 x i8> %indices) nounwind {819; SSE3-LABEL: var_shuffle_zero_v16i8:820; SSE3:       # %bb.0:821; SSE3-NEXT:    movaps %xmm0, %xmm2822; SSE3-NEXT:    movdqa {{.*#+}} xmm0 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]823; SSE3-NEXT:    pmaxub %xmm1, %xmm0824; SSE3-NEXT:    pcmpeqb %xmm1, %xmm0825; SSE3-NEXT:    por %xmm0, %xmm1826; SSE3-NEXT:    movdqa %xmm1, -40(%rsp)827; SSE3-NEXT:    movaps %xmm2, -24(%rsp)828; SSE3-NEXT:    movzbl -25(%rsp), %eax829; SSE3-NEXT:    andl $15, %eax830; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax831; SSE3-NEXT:    movd %eax, %xmm1832; SSE3-NEXT:    movzbl -26(%rsp), %eax833; SSE3-NEXT:    andl $15, %eax834; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax835; SSE3-NEXT:    movd %eax, %xmm2836; SSE3-NEXT:    movzbl -27(%rsp), %eax837; SSE3-NEXT:    andl $15, %eax838; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax839; SSE3-NEXT:    movd %eax, %xmm4840; SSE3-NEXT:    movzbl -28(%rsp), %eax841; SSE3-NEXT:    andl $15, %eax842; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax843; SSE3-NEXT:    movd %eax, %xmm3844; SSE3-NEXT:    movzbl -29(%rsp), %eax845; SSE3-NEXT:    andl $15, %eax846; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax847; SSE3-NEXT:    movd %eax, %xmm6848; SSE3-NEXT:    movzbl -30(%rsp), %eax849; SSE3-NEXT:    andl $15, %eax850; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax851; SSE3-NEXT:    movd %eax, %xmm7852; SSE3-NEXT:    movzbl -31(%rsp), %eax853; SSE3-NEXT:    andl $15, %eax854; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax855; SSE3-NEXT:    movd %eax, %xmm8856; SSE3-NEXT:    movzbl -32(%rsp), %eax857; SSE3-NEXT:    andl $15, %eax858; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax859; SSE3-NEXT:    movd %eax, %xmm5860; SSE3-NEXT:    movzbl -33(%rsp), %eax861; SSE3-NEXT:    andl $15, %eax862; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax863; SSE3-NEXT:    movd %eax, %xmm9864; SSE3-NEXT:    movzbl -34(%rsp), %eax865; SSE3-NEXT:    andl $15, %eax866; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax867; SSE3-NEXT:    movd %eax, %xmm10868; SSE3-NEXT:    movzbl -35(%rsp), %eax869; SSE3-NEXT:    andl $15, %eax870; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax871; SSE3-NEXT:    movd %eax, %xmm12872; SSE3-NEXT:    movzbl -36(%rsp), %eax873; SSE3-NEXT:    andl $15, %eax874; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax875; SSE3-NEXT:    movd %eax, %xmm11876; SSE3-NEXT:    movzbl -37(%rsp), %eax877; SSE3-NEXT:    andl $15, %eax878; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax879; SSE3-NEXT:    movd %eax, %xmm13880; SSE3-NEXT:    movzbl -38(%rsp), %eax881; SSE3-NEXT:    andl $15, %eax882; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax883; SSE3-NEXT:    movd %eax, %xmm14884; SSE3-NEXT:    movzbl -39(%rsp), %eax885; SSE3-NEXT:    andl $15, %eax886; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax887; SSE3-NEXT:    movd %eax, %xmm15888; SSE3-NEXT:    movzbl -40(%rsp), %eax889; SSE3-NEXT:    andl $15, %eax890; SSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]891; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax892; SSE3-NEXT:    movd %eax, %xmm1893; SSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]894; SSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]895; SSE3-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm6[0],xmm7[1],xmm6[1],xmm7[2],xmm6[2],xmm7[3],xmm6[3],xmm7[4],xmm6[4],xmm7[5],xmm6[5],xmm7[6],xmm6[6],xmm7[7],xmm6[7]896; SSE3-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm8[0],xmm5[1],xmm8[1],xmm5[2],xmm8[2],xmm5[3],xmm8[3],xmm5[4],xmm8[4],xmm5[5],xmm8[5],xmm5[6],xmm8[6],xmm5[7],xmm8[7]897; SSE3-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1],xmm5[2],xmm7[2],xmm5[3],xmm7[3]898; SSE3-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]899; SSE3-NEXT:    punpcklbw {{.*#+}} xmm10 = xmm10[0],xmm9[0],xmm10[1],xmm9[1],xmm10[2],xmm9[2],xmm10[3],xmm9[3],xmm10[4],xmm9[4],xmm10[5],xmm9[5],xmm10[6],xmm9[6],xmm10[7],xmm9[7]900; SSE3-NEXT:    punpcklbw {{.*#+}} xmm11 = xmm11[0],xmm12[0],xmm11[1],xmm12[1],xmm11[2],xmm12[2],xmm11[3],xmm12[3],xmm11[4],xmm12[4],xmm11[5],xmm12[5],xmm11[6],xmm12[6],xmm11[7],xmm12[7]901; SSE3-NEXT:    punpcklwd {{.*#+}} xmm11 = xmm11[0],xmm10[0],xmm11[1],xmm10[1],xmm11[2],xmm10[2],xmm11[3],xmm10[3]902; SSE3-NEXT:    punpcklbw {{.*#+}} xmm14 = xmm14[0],xmm13[0],xmm14[1],xmm13[1],xmm14[2],xmm13[2],xmm14[3],xmm13[3],xmm14[4],xmm13[4],xmm14[5],xmm13[5],xmm14[6],xmm13[6],xmm14[7],xmm13[7]903; SSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm15[0],xmm1[1],xmm15[1],xmm1[2],xmm15[2],xmm1[3],xmm15[3],xmm1[4],xmm15[4],xmm1[5],xmm15[5],xmm1[6],xmm15[6],xmm1[7],xmm15[7]904; SSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm14[0],xmm1[1],xmm14[1],xmm1[2],xmm14[2],xmm1[3],xmm14[3]905; SSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm11[0],xmm1[1],xmm11[1]906; SSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm5[0]907; SSE3-NEXT:    pandn %xmm1, %xmm0908; SSE3-NEXT:    retq909;910; SSSE3-LABEL: var_shuffle_zero_v16i8:911; SSSE3:       # %bb.0:912; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]913; SSSE3-NEXT:    pmaxub %xmm1, %xmm2914; SSSE3-NEXT:    pcmpeqb %xmm1, %xmm2915; SSSE3-NEXT:    por %xmm1, %xmm2916; SSSE3-NEXT:    pshufb %xmm2, %xmm0917; SSSE3-NEXT:    retq918;919; SSE41-LABEL: var_shuffle_zero_v16i8:920; SSE41:       # %bb.0:921; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]922; SSE41-NEXT:    pmaxub %xmm1, %xmm2923; SSE41-NEXT:    pcmpeqb %xmm1, %xmm2924; SSE41-NEXT:    por %xmm1, %xmm2925; SSE41-NEXT:    pshufb %xmm2, %xmm0926; SSE41-NEXT:    retq927;928; XOP-LABEL: var_shuffle_zero_v16i8:929; XOP:       # %bb.0:930; XOP-NEXT:    vpcomgtub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm2931; XOP-NEXT:    vpor %xmm1, %xmm2, %xmm1932; XOP-NEXT:    vpshufb %xmm1, %xmm0, %xmm0933; XOP-NEXT:    retq934;935; AVX1-LABEL: var_shuffle_zero_v16i8:936; AVX1:       # %bb.0:937; AVX1-NEXT:    vpmaxub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm2938; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm1, %xmm2939; AVX1-NEXT:    vpor %xmm1, %xmm2, %xmm1940; AVX1-NEXT:    vpshufb %xmm1, %xmm0, %xmm0941; AVX1-NEXT:    retq942;943; AVX2-LABEL: var_shuffle_zero_v16i8:944; AVX2:       # %bb.0:945; AVX2-NEXT:    vpmaxub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm2946; AVX2-NEXT:    vpcmpeqb %xmm2, %xmm1, %xmm2947; AVX2-NEXT:    vpor %xmm1, %xmm2, %xmm1948; AVX2-NEXT:    vpshufb %xmm1, %xmm0, %xmm0949; AVX2-NEXT:    retq950;951; AVX512F-LABEL: var_shuffle_zero_v16i8:952; AVX512F:       # %bb.0:953; AVX512F-NEXT:    vpmaxub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm2954; AVX512F-NEXT:    vpcmpeqb %xmm2, %xmm1, %xmm2955; AVX512F-NEXT:    vpor %xmm1, %xmm2, %xmm1956; AVX512F-NEXT:    vpshufb %xmm1, %xmm0, %xmm0957; AVX512F-NEXT:    retq958;959; AVX512BW-LABEL: var_shuffle_zero_v16i8:960; AVX512BW:       # %bb.0:961; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1962; AVX512BW-NEXT:    vpbroadcastb {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]963; AVX512BW-NEXT:    vpcmpnleub %zmm2, %zmm1, %k1964; AVX512BW-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2965; AVX512BW-NEXT:    vmovdqu8 %zmm2, %zmm1 {%k1}966; AVX512BW-NEXT:    vpshufb %xmm1, %xmm0, %xmm0967; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1968; AVX512BW-NEXT:    vmovdqu8 %zmm1, %zmm0 {%k1}969; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0970; AVX512BW-NEXT:    vzeroupper971; AVX512BW-NEXT:    retq972;973; AVX512VL-LABEL: var_shuffle_zero_v16i8:974; AVX512VL:       # %bb.0:975; AVX512VL-NEXT:    vpcmpnleub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %k1976; AVX512VL-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2977; AVX512VL-NEXT:    vmovdqu8 %xmm2, %xmm1 {%k1}978; AVX512VL-NEXT:    vpshufb %xmm1, %xmm0, %xmm0979; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1980; AVX512VL-NEXT:    vmovdqu8 %xmm1, %xmm0 {%k1}981; AVX512VL-NEXT:    retq982  %cmp = icmp ugt <16 x i8> %indices, <i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15>983  %or = select <16 x i1> %cmp, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>, <16 x i8> %indices984  %idx0 = extractelement <16 x i8> %or, i64 0985  %idx1 = extractelement <16 x i8> %or, i64 1986  %idx2 = extractelement <16 x i8> %or, i64 2987  %idx3 = extractelement <16 x i8> %or, i64 3988  %idx4 = extractelement <16 x i8> %or, i64 4989  %idx5 = extractelement <16 x i8> %or, i64 5990  %idx6 = extractelement <16 x i8> %or, i64 6991  %idx7 = extractelement <16 x i8> %or, i64 7992  %idx8 = extractelement <16 x i8> %or, i64 8993  %idx9 = extractelement <16 x i8> %or, i64 9994  %idxA = extractelement <16 x i8> %or, i64 10995  %idxB = extractelement <16 x i8> %or, i64 11996  %idxC = extractelement <16 x i8> %or, i64 12997  %idxD = extractelement <16 x i8> %or, i64 13998  %idxE = extractelement <16 x i8> %or, i64 14999  %idxF = extractelement <16 x i8> %or, i64 151000  %elt0 = extractelement <16 x i8> %v, i8 %idx01001  %elt1 = extractelement <16 x i8> %v, i8 %idx11002  %elt2 = extractelement <16 x i8> %v, i8 %idx21003  %elt3 = extractelement <16 x i8> %v, i8 %idx31004  %elt4 = extractelement <16 x i8> %v, i8 %idx41005  %elt5 = extractelement <16 x i8> %v, i8 %idx51006  %elt6 = extractelement <16 x i8> %v, i8 %idx61007  %elt7 = extractelement <16 x i8> %v, i8 %idx71008  %elt8 = extractelement <16 x i8> %v, i8 %idx81009  %elt9 = extractelement <16 x i8> %v, i8 %idx91010  %eltA = extractelement <16 x i8> %v, i8 %idxA1011  %eltB = extractelement <16 x i8> %v, i8 %idxB1012  %eltC = extractelement <16 x i8> %v, i8 %idxC1013  %eltD = extractelement <16 x i8> %v, i8 %idxD1014  %eltE = extractelement <16 x i8> %v, i8 %idxE1015  %eltF = extractelement <16 x i8> %v, i8 %idxF1016  %vec0 = insertelement <16 x i8> poison, i8 %elt0, i64 01017  %vec1 = insertelement <16 x i8> %vec0, i8 %elt1, i64 11018  %vec2 = insertelement <16 x i8> %vec1, i8 %elt2, i64 21019  %vec3 = insertelement <16 x i8> %vec2, i8 %elt3, i64 31020  %vec4 = insertelement <16 x i8> %vec3, i8 %elt4, i64 41021  %vec5 = insertelement <16 x i8> %vec4, i8 %elt5, i64 51022  %vec6 = insertelement <16 x i8> %vec5, i8 %elt6, i64 61023  %vec7 = insertelement <16 x i8> %vec6, i8 %elt7, i64 71024  %vec8 = insertelement <16 x i8> %vec7, i8 %elt8, i64 81025  %vec9 = insertelement <16 x i8> %vec8, i8 %elt9, i64 91026  %vecA = insertelement <16 x i8> %vec9, i8 %eltA, i64 101027  %vecB = insertelement <16 x i8> %vecA, i8 %eltB, i64 111028  %vecC = insertelement <16 x i8> %vecB, i8 %eltC, i64 121029  %vecD = insertelement <16 x i8> %vecC, i8 %eltD, i64 131030  %vecE = insertelement <16 x i8> %vecD, i8 %eltE, i64 141031  %vecF = insertelement <16 x i8> %vecE, i8 %eltF, i64 151032  %res = select <16 x i1> %cmp, <16 x i8> zeroinitializer, <16 x i8> %vecF1033  ret <16 x i8> %res1034}1035 1036define <2 x double> @var_shuffle_v2f64(<2 x double> %v, <2 x i64> %indices) nounwind {1037; SSE3-LABEL: var_shuffle_v2f64:1038; SSE3:       # %bb.0:1039; SSE3-NEXT:    movq %xmm1, %rax1040; SSE3-NEXT:    andl $1, %eax1041; SSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]1042; SSE3-NEXT:    movq %xmm1, %rcx1043; SSE3-NEXT:    andl $1, %ecx1044; SSE3-NEXT:    movaps %xmm0, -24(%rsp)1045; SSE3-NEXT:    movsd -24(%rsp,%rax,8), %xmm0 # xmm0 = mem[0],zero1046; SSE3-NEXT:    movhps -24(%rsp,%rcx,8), %xmm0 # xmm0 = xmm0[0,1],mem[0,1]1047; SSE3-NEXT:    retq1048;1049; SSSE3-LABEL: var_shuffle_v2f64:1050; SSSE3:       # %bb.0:1051; SSSE3-NEXT:    movq %xmm1, %rax1052; SSSE3-NEXT:    andl $1, %eax1053; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]1054; SSSE3-NEXT:    movq %xmm1, %rcx1055; SSSE3-NEXT:    andl $1, %ecx1056; SSSE3-NEXT:    movaps %xmm0, -24(%rsp)1057; SSSE3-NEXT:    movsd -24(%rsp,%rax,8), %xmm0 # xmm0 = mem[0],zero1058; SSSE3-NEXT:    movhps -24(%rsp,%rcx,8), %xmm0 # xmm0 = xmm0[0,1],mem[0,1]1059; SSSE3-NEXT:    retq1060;1061; SSE41-LABEL: var_shuffle_v2f64:1062; SSE41:       # %bb.0:1063; SSE41-NEXT:    movdqa %xmm0, %xmm21064; SSE41-NEXT:    pxor %xmm0, %xmm01065; SSE41-NEXT:    pcmpeqq %xmm1, %xmm01066; SSE41-NEXT:    movddup {{.*#+}} xmm1 = xmm2[0,0]1067; SSE41-NEXT:    unpckhpd {{.*#+}} xmm2 = xmm2[1,1]1068; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm21069; SSE41-NEXT:    movapd %xmm2, %xmm01070; SSE41-NEXT:    retq1071;1072; AVX-LABEL: var_shuffle_v2f64:1073; AVX:       # %bb.0:1074; AVX-NEXT:    vpaddq %xmm1, %xmm1, %xmm11075; AVX-NEXT:    vpermilpd %xmm1, %xmm0, %xmm01076; AVX-NEXT:    retq1077  %index0 = extractelement <2 x i64> %indices, i32 01078  %index1 = extractelement <2 x i64> %indices, i32 11079  %v0 = extractelement <2 x double> %v, i64 %index01080  %v1 = extractelement <2 x double> %v, i64 %index11081  %ret0 = insertelement <2 x double> undef, double %v0, i32 01082  %ret1 = insertelement <2 x double> %ret0, double %v1, i32 11083  ret <2 x double> %ret11084}1085 1086define <2 x double> @var_shuffle_zero_v2f64(<2 x double> %v, <2 x i64> %indices) nounwind {1087; SSE3-LABEL: var_shuffle_zero_v2f64:1088; SSE3:       # %bb.0:1089; SSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]1090; SSE3-NEXT:    pxor %xmm1, %xmm21091; SSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]1092; SSE3-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm21093; SSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]1094; SSE3-NEXT:    pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm31095; SSE3-NEXT:    pand %xmm4, %xmm31096; SSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]1097; SSE3-NEXT:    por %xmm3, %xmm21098; SSE3-NEXT:    por %xmm2, %xmm11099; SSE3-NEXT:    movq %xmm1, %rax1100; SSE3-NEXT:    andl $1, %eax1101; SSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]1102; SSE3-NEXT:    movq %xmm1, %rcx1103; SSE3-NEXT:    andl $1, %ecx1104; SSE3-NEXT:    movaps %xmm0, -24(%rsp)1105; SSE3-NEXT:    movq -24(%rsp,%rax,8), %xmm0 # xmm0 = mem[0],zero1106; SSE3-NEXT:    movq -24(%rsp,%rcx,8), %xmm1 # xmm1 = mem[0],zero1107; SSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1108; SSE3-NEXT:    pandn %xmm0, %xmm21109; SSE3-NEXT:    movdqa %xmm2, %xmm01110; SSE3-NEXT:    retq1111;1112; SSSE3-LABEL: var_shuffle_zero_v2f64:1113; SSSE3:       # %bb.0:1114; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]1115; SSSE3-NEXT:    pxor %xmm1, %xmm21116; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]1117; SSSE3-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm21118; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]1119; SSSE3-NEXT:    pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm31120; SSSE3-NEXT:    pand %xmm4, %xmm31121; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]1122; SSSE3-NEXT:    por %xmm3, %xmm21123; SSSE3-NEXT:    por %xmm2, %xmm11124; SSSE3-NEXT:    movq %xmm1, %rax1125; SSSE3-NEXT:    andl $1, %eax1126; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]1127; SSSE3-NEXT:    movq %xmm1, %rcx1128; SSSE3-NEXT:    andl $1, %ecx1129; SSSE3-NEXT:    movaps %xmm0, -24(%rsp)1130; SSSE3-NEXT:    movq -24(%rsp,%rax,8), %xmm0 # xmm0 = mem[0],zero1131; SSSE3-NEXT:    movq -24(%rsp,%rcx,8), %xmm1 # xmm1 = mem[0],zero1132; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1133; SSSE3-NEXT:    pandn %xmm0, %xmm21134; SSSE3-NEXT:    movdqa %xmm2, %xmm01135; SSSE3-NEXT:    retq1136;1137; SSE41-LABEL: var_shuffle_zero_v2f64:1138; SSE41:       # %bb.0:1139; SSE41-NEXT:    movapd %xmm0, %xmm21140; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]1141; SSE41-NEXT:    pxor %xmm1, %xmm01142; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]1143; SSE41-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01144; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2]1145; SSE41-NEXT:    pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm41146; SSE41-NEXT:    pand %xmm3, %xmm41147; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]1148; SSE41-NEXT:    por %xmm4, %xmm31149; SSE41-NEXT:    por %xmm3, %xmm11150; SSE41-NEXT:    pxor %xmm0, %xmm01151; SSE41-NEXT:    pcmpeqq %xmm1, %xmm01152; SSE41-NEXT:    movddup {{.*#+}} xmm1 = xmm2[0,0]1153; SSE41-NEXT:    unpckhpd {{.*#+}} xmm2 = xmm2[1,1]1154; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm21155; SSE41-NEXT:    pandn %xmm2, %xmm31156; SSE41-NEXT:    movdqa %xmm3, %xmm01157; SSE41-NEXT:    retq1158;1159; XOP-LABEL: var_shuffle_zero_v2f64:1160; XOP:       # %bb.0:1161; XOP-NEXT:    vpcomgtuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm21162; XOP-NEXT:    vpor %xmm1, %xmm2, %xmm11163; XOP-NEXT:    vpaddq %xmm1, %xmm1, %xmm11164; XOP-NEXT:    vpermilpd %xmm1, %xmm0, %xmm01165; XOP-NEXT:    vpandn %xmm0, %xmm2, %xmm01166; XOP-NEXT:    retq1167;1168; AVX1-LABEL: var_shuffle_zero_v2f64:1169; AVX1:       # %bb.0:1170; AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm21171; AVX1-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21172; AVX1-NEXT:    vpor %xmm1, %xmm2, %xmm11173; AVX1-NEXT:    vpaddq %xmm1, %xmm1, %xmm11174; AVX1-NEXT:    vpermilpd %xmm1, %xmm0, %xmm01175; AVX1-NEXT:    vpandn %xmm0, %xmm2, %xmm01176; AVX1-NEXT:    retq1177;1178; AVX2-LABEL: var_shuffle_zero_v2f64:1179; AVX2:       # %bb.0:1180; AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm21181; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21182; AVX2-NEXT:    vpor %xmm1, %xmm2, %xmm11183; AVX2-NEXT:    vpaddq %xmm1, %xmm1, %xmm11184; AVX2-NEXT:    vpermilpd %xmm1, %xmm0, %xmm01185; AVX2-NEXT:    vpandn %xmm0, %xmm2, %xmm01186; AVX2-NEXT:    retq1187;1188; AVX512-LABEL: var_shuffle_zero_v2f64:1189; AVX512:       # %bb.0:1190; AVX512-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm11191; AVX512-NEXT:    vpmovsxbq {{.*#+}} xmm2 = [3,3]1192; AVX512-NEXT:    vpcmpnleuq %zmm2, %zmm1, %k11193; AVX512-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm21194; AVX512-NEXT:    vmovdqa64 %zmm2, %zmm1 {%k1}1195; AVX512-NEXT:    vpaddq %xmm1, %xmm1, %xmm11196; AVX512-NEXT:    vpermilpd %xmm1, %xmm0, %xmm01197; AVX512-NEXT:    vxorpd %xmm1, %xmm1, %xmm11198; AVX512-NEXT:    vmovapd %zmm1, %zmm0 {%k1}1199; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01200; AVX512-NEXT:    vzeroupper1201; AVX512-NEXT:    retq1202;1203; AVX512VL-LABEL: var_shuffle_zero_v2f64:1204; AVX512VL:       # %bb.0:1205; AVX512VL-NEXT:    vpcmpnleuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm1, %k11206; AVX512VL-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm21207; AVX512VL-NEXT:    vmovdqa64 %xmm2, %xmm1 {%k1}1208; AVX512VL-NEXT:    vpaddq %xmm1, %xmm1, %xmm11209; AVX512VL-NEXT:    vpermilpd %xmm1, %xmm0, %xmm01210; AVX512VL-NEXT:    vxorpd %xmm1, %xmm1, %xmm11211; AVX512VL-NEXT:    vmovapd %xmm1, %xmm0 {%k1}1212; AVX512VL-NEXT:    retq1213  %cmp = icmp ugt <2 x i64> %indices, <i64 3, i64 3>1214  %or = select <2 x i1> %cmp, <2 x i64> <i64 -1, i64 -1>, <2 x i64> %indices1215  %idx0 = extractelement <2 x i64> %or, i64 01216  %idx1 = extractelement <2 x i64> %or, i64 11217  %elt0 = extractelement <2 x double> %v, i64 %idx01218  %elt1 = extractelement <2 x double> %v, i64 %idx11219  %vec0 = insertelement <2 x double> poison, double %elt0, i64 01220  %vec1 = insertelement <2 x double> %vec0, double %elt1, i64 11221  %res = select <2 x i1> %cmp, <2 x double> zeroinitializer, <2 x double> %vec11222  ret <2 x double> %res1223}1224 1225define <4 x float> @var_shuffle_v4f32(<4 x float> %v, <4 x i32> %indices) nounwind {1226; SSE3-LABEL: var_shuffle_v4f32:1227; SSE3:       # %bb.0:1228; SSE3-NEXT:    movd %xmm1, %eax1229; SSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]1230; SSE3-NEXT:    movd %xmm2, %ecx1231; SSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]1232; SSE3-NEXT:    movd %xmm2, %edx1233; SSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[3,3,3,3]1234; SSE3-NEXT:    movd %xmm1, %esi1235; SSE3-NEXT:    movaps %xmm0, -24(%rsp)1236; SSE3-NEXT:    andl $3, %eax1237; SSE3-NEXT:    andl $3, %ecx1238; SSE3-NEXT:    andl $3, %edx1239; SSE3-NEXT:    andl $3, %esi1240; SSE3-NEXT:    movss -24(%rsp,%rsi,4), %xmm0 # xmm0 = mem[0],zero,zero,zero1241; SSE3-NEXT:    movss -24(%rsp,%rdx,4), %xmm1 # xmm1 = mem[0],zero,zero,zero1242; SSE3-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]1243; SSE3-NEXT:    movss -24(%rsp,%rax,4), %xmm0 # xmm0 = mem[0],zero,zero,zero1244; SSE3-NEXT:    movss -24(%rsp,%rcx,4), %xmm2 # xmm2 = mem[0],zero,zero,zero1245; SSE3-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]1246; SSE3-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]1247; SSE3-NEXT:    retq1248;1249; SSSE3-LABEL: var_shuffle_v4f32:1250; SSSE3:       # %bb.0:1251; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [67372036,67372036,67372036,67372036]1252; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]1253; SSSE3-NEXT:    pmuludq %xmm2, %xmm11254; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1255; SSSE3-NEXT:    pmuludq %xmm2, %xmm31256; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3]1257; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]1258; SSSE3-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11259; SSSE3-NEXT:    pshufb %xmm1, %xmm01260; SSSE3-NEXT:    retq1261;1262; SSE41-LABEL: var_shuffle_v4f32:1263; SSE41:       # %bb.0:1264; SSE41-NEXT:    pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [67372036,67372036,67372036,67372036]1265; SSE41-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11266; SSE41-NEXT:    pshufb %xmm1, %xmm01267; SSE41-NEXT:    retq1268;1269; AVX-LABEL: var_shuffle_v4f32:1270; AVX:       # %bb.0:1271; AVX-NEXT:    vpermilps %xmm1, %xmm0, %xmm01272; AVX-NEXT:    retq1273  %index0 = extractelement <4 x i32> %indices, i32 01274  %index1 = extractelement <4 x i32> %indices, i32 11275  %index2 = extractelement <4 x i32> %indices, i32 21276  %index3 = extractelement <4 x i32> %indices, i32 31277  %v0 = extractelement <4 x float> %v, i32 %index01278  %v1 = extractelement <4 x float> %v, i32 %index11279  %v2 = extractelement <4 x float> %v, i32 %index21280  %v3 = extractelement <4 x float> %v, i32 %index31281  %ret0 = insertelement <4 x float> undef, float %v0, i32 01282  %ret1 = insertelement <4 x float> %ret0, float %v1, i32 11283  %ret2 = insertelement <4 x float> %ret1, float %v2, i32 21284  %ret3 = insertelement <4 x float> %ret2, float %v3, i32 31285  ret <4 x float> %ret31286}1287 1288define <4 x float> @var_shuffle_zero_v4f32(<4 x float> %v, <4 x i32> %indices) nounwind {1289; SSE3-LABEL: var_shuffle_zero_v4f32:1290; SSE3:       # %bb.0:1291; SSE3-NEXT:    movaps %xmm0, %xmm21292; SSE3-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]1293; SSE3-NEXT:    pxor %xmm1, %xmm01294; SSE3-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01295; SSE3-NEXT:    por %xmm0, %xmm11296; SSE3-NEXT:    movd %xmm1, %eax1297; SSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,1,1]1298; SSE3-NEXT:    movd %xmm3, %ecx1299; SSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]1300; SSE3-NEXT:    movd %xmm3, %edx1301; SSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[3,3,3,3]1302; SSE3-NEXT:    movd %xmm1, %esi1303; SSE3-NEXT:    movaps %xmm2, -24(%rsp)1304; SSE3-NEXT:    andl $3, %eax1305; SSE3-NEXT:    movd -24(%rsp,%rax,4), %xmm1 # xmm1 = mem[0],zero,zero,zero1306; SSE3-NEXT:    andl $3, %ecx1307; SSE3-NEXT:    movd -24(%rsp,%rcx,4), %xmm2 # xmm2 = mem[0],zero,zero,zero1308; SSE3-NEXT:    andl $3, %edx1309; SSE3-NEXT:    movd -24(%rsp,%rdx,4), %xmm3 # xmm3 = mem[0],zero,zero,zero1310; SSE3-NEXT:    andl $3, %esi1311; SSE3-NEXT:    movd -24(%rsp,%rsi,4), %xmm4 # xmm4 = mem[0],zero,zero,zero1312; SSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]1313; SSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]1314; SSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]1315; SSE3-NEXT:    pandn %xmm1, %xmm01316; SSE3-NEXT:    retq1317;1318; SSSE3-LABEL: var_shuffle_zero_v4f32:1319; SSSE3:       # %bb.0:1320; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]1321; SSSE3-NEXT:    pxor %xmm1, %xmm21322; SSSE3-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm21323; SSSE3-NEXT:    por %xmm2, %xmm11324; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [67372036,67372036,67372036,67372036]1325; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]1326; SSSE3-NEXT:    pmuludq %xmm3, %xmm11327; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1328; SSSE3-NEXT:    pmuludq %xmm3, %xmm41329; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[0,2,2,3]1330; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]1331; SSSE3-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11332; SSSE3-NEXT:    por %xmm2, %xmm11333; SSSE3-NEXT:    pshufb %xmm1, %xmm01334; SSSE3-NEXT:    retq1335;1336; SSE41-LABEL: var_shuffle_zero_v4f32:1337; SSE41:       # %bb.0:1338; SSE41-NEXT:    pmovsxbd {{.*#+}} xmm2 = [4,4,4,4]1339; SSE41-NEXT:    pmaxud %xmm1, %xmm21340; SSE41-NEXT:    pcmpeqd %xmm1, %xmm21341; SSE41-NEXT:    por %xmm2, %xmm11342; SSE41-NEXT:    pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [67372036,67372036,67372036,67372036]1343; SSE41-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11344; SSE41-NEXT:    por %xmm2, %xmm11345; SSE41-NEXT:    pshufb %xmm1, %xmm01346; SSE41-NEXT:    retq1347;1348; XOP-LABEL: var_shuffle_zero_v4f32:1349; XOP:       # %bb.0:1350; XOP-NEXT:    vpcomgtud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm21351; XOP-NEXT:    vpor %xmm1, %xmm2, %xmm11352; XOP-NEXT:    vpermilps %xmm1, %xmm0, %xmm01353; XOP-NEXT:    vpandn %xmm0, %xmm2, %xmm01354; XOP-NEXT:    retq1355;1356; AVX1-LABEL: var_shuffle_zero_v4f32:1357; AVX1:       # %bb.0:1358; AVX1-NEXT:    vpmaxud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm21359; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm1, %xmm21360; AVX1-NEXT:    vpor %xmm1, %xmm2, %xmm11361; AVX1-NEXT:    vpermilps %xmm1, %xmm0, %xmm01362; AVX1-NEXT:    vpandn %xmm0, %xmm2, %xmm01363; AVX1-NEXT:    retq1364;1365; AVX2-LABEL: var_shuffle_zero_v4f32:1366; AVX2:       # %bb.0:1367; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [4,4,4,4]1368; AVX2-NEXT:    vpmaxud %xmm2, %xmm1, %xmm21369; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm1, %xmm21370; AVX2-NEXT:    vpor %xmm1, %xmm2, %xmm11371; AVX2-NEXT:    vpermilps %xmm1, %xmm0, %xmm01372; AVX2-NEXT:    vpandn %xmm0, %xmm2, %xmm01373; AVX2-NEXT:    retq1374;1375; AVX512-LABEL: var_shuffle_zero_v4f32:1376; AVX512:       # %bb.0:1377; AVX512-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm11378; AVX512-NEXT:    vpcmpnleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm1, %k11379; AVX512-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm21380; AVX512-NEXT:    vmovdqa32 %zmm2, %zmm1 {%k1}1381; AVX512-NEXT:    vpermilps %xmm1, %xmm0, %xmm01382; AVX512-NEXT:    vxorps %xmm1, %xmm1, %xmm11383; AVX512-NEXT:    vmovaps %zmm1, %zmm0 {%k1}1384; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01385; AVX512-NEXT:    vzeroupper1386; AVX512-NEXT:    retq1387;1388; AVX512VL-LABEL: var_shuffle_zero_v4f32:1389; AVX512VL:       # %bb.0:1390; AVX512VL-NEXT:    vpcmpnleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %k11391; AVX512VL-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm21392; AVX512VL-NEXT:    vmovdqa32 %xmm2, %xmm1 {%k1}1393; AVX512VL-NEXT:    vpermilps %xmm1, %xmm0, %xmm01394; AVX512VL-NEXT:    vxorps %xmm1, %xmm1, %xmm11395; AVX512VL-NEXT:    vmovaps %xmm1, %xmm0 {%k1}1396; AVX512VL-NEXT:    retq1397  %cmp = icmp ugt <4 x i32> %indices, <i32 3, i32 3, i32 3, i32 3>1398  %or = select <4 x i1> %cmp, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> %indices1399  %idx0 = extractelement <4 x i32> %or, i64 01400  %idx1 = extractelement <4 x i32> %or, i64 11401  %idx2 = extractelement <4 x i32> %or, i64 21402  %idx3 = extractelement <4 x i32> %or, i64 31403  %elt0 = extractelement <4 x float> %v, i32 %idx01404  %elt1 = extractelement <4 x float> %v, i32 %idx11405  %elt2 = extractelement <4 x float> %v, i32 %idx21406  %elt3 = extractelement <4 x float> %v, i32 %idx31407  %vec0 = insertelement <4 x float> poison, float %elt0, i64 01408  %vec1 = insertelement <4 x float> %vec0, float %elt1, i64 11409  %vec2 = insertelement <4 x float> %vec1, float %elt2, i64 21410  %vec3 = insertelement <4 x float> %vec2, float %elt3, i64 31411  %res = select <4 x i1> %cmp, <4 x float> zeroinitializer, <4 x float> %vec31412  ret <4 x float> %res1413}1414 1415define <16 x i8> @var_shuffle_v16i8_from_v16i8_v32i8(<16 x i8> %v, <32 x i8> %indices) nounwind {1416; SSE3-LABEL: var_shuffle_v16i8_from_v16i8_v32i8:1417; SSE3:       # %bb.0:1418; SSE3-NEXT:    movaps %xmm1, -40(%rsp)1419; SSE3-NEXT:    movaps %xmm0, -24(%rsp)1420; SSE3-NEXT:    movzbl -25(%rsp), %eax1421; SSE3-NEXT:    andl $15, %eax1422; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax1423; SSE3-NEXT:    movd %eax, %xmm11424; SSE3-NEXT:    movzbl -26(%rsp), %eax1425; SSE3-NEXT:    andl $15, %eax1426; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax1427; SSE3-NEXT:    movd %eax, %xmm21428; SSE3-NEXT:    movzbl -27(%rsp), %eax1429; SSE3-NEXT:    andl $15, %eax1430; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax1431; SSE3-NEXT:    movd %eax, %xmm41432; SSE3-NEXT:    movzbl -28(%rsp), %eax1433; SSE3-NEXT:    andl $15, %eax1434; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax1435; SSE3-NEXT:    movd %eax, %xmm31436; SSE3-NEXT:    movzbl -29(%rsp), %eax1437; SSE3-NEXT:    andl $15, %eax1438; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax1439; SSE3-NEXT:    movd %eax, %xmm61440; SSE3-NEXT:    movzbl -30(%rsp), %eax1441; SSE3-NEXT:    andl $15, %eax1442; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax1443; SSE3-NEXT:    movd %eax, %xmm71444; SSE3-NEXT:    movzbl -31(%rsp), %eax1445; SSE3-NEXT:    andl $15, %eax1446; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax1447; SSE3-NEXT:    movd %eax, %xmm81448; SSE3-NEXT:    movzbl -32(%rsp), %eax1449; SSE3-NEXT:    andl $15, %eax1450; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax1451; SSE3-NEXT:    movd %eax, %xmm51452; SSE3-NEXT:    movzbl -33(%rsp), %eax1453; SSE3-NEXT:    andl $15, %eax1454; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax1455; SSE3-NEXT:    movd %eax, %xmm91456; SSE3-NEXT:    movzbl -34(%rsp), %eax1457; SSE3-NEXT:    andl $15, %eax1458; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax1459; SSE3-NEXT:    movd %eax, %xmm101460; SSE3-NEXT:    movzbl -35(%rsp), %eax1461; SSE3-NEXT:    andl $15, %eax1462; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax1463; SSE3-NEXT:    movd %eax, %xmm121464; SSE3-NEXT:    movzbl -36(%rsp), %eax1465; SSE3-NEXT:    andl $15, %eax1466; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax1467; SSE3-NEXT:    movd %eax, %xmm111468; SSE3-NEXT:    movzbl -37(%rsp), %eax1469; SSE3-NEXT:    andl $15, %eax1470; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax1471; SSE3-NEXT:    movd %eax, %xmm131472; SSE3-NEXT:    movzbl -38(%rsp), %eax1473; SSE3-NEXT:    andl $15, %eax1474; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax1475; SSE3-NEXT:    movd %eax, %xmm141476; SSE3-NEXT:    movzbl -39(%rsp), %eax1477; SSE3-NEXT:    andl $15, %eax1478; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax1479; SSE3-NEXT:    movd %eax, %xmm151480; SSE3-NEXT:    movzbl -40(%rsp), %eax1481; SSE3-NEXT:    andl $15, %eax1482; SSE3-NEXT:    movzbl -24(%rsp,%rax), %eax1483; SSE3-NEXT:    movd %eax, %xmm01484; SSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]1485; SSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]1486; SSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]1487; SSE3-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm6[0],xmm7[1],xmm6[1],xmm7[2],xmm6[2],xmm7[3],xmm6[3],xmm7[4],xmm6[4],xmm7[5],xmm6[5],xmm7[6],xmm6[6],xmm7[7],xmm6[7]1488; SSE3-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm8[0],xmm5[1],xmm8[1],xmm5[2],xmm8[2],xmm5[3],xmm8[3],xmm5[4],xmm8[4],xmm5[5],xmm8[5],xmm5[6],xmm8[6],xmm5[7],xmm8[7]1489; SSE3-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1],xmm5[2],xmm7[2],xmm5[3],xmm7[3]1490; SSE3-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]1491; SSE3-NEXT:    punpcklbw {{.*#+}} xmm10 = xmm10[0],xmm9[0],xmm10[1],xmm9[1],xmm10[2],xmm9[2],xmm10[3],xmm9[3],xmm10[4],xmm9[4],xmm10[5],xmm9[5],xmm10[6],xmm9[6],xmm10[7],xmm9[7]1492; SSE3-NEXT:    punpcklbw {{.*#+}} xmm11 = xmm11[0],xmm12[0],xmm11[1],xmm12[1],xmm11[2],xmm12[2],xmm11[3],xmm12[3],xmm11[4],xmm12[4],xmm11[5],xmm12[5],xmm11[6],xmm12[6],xmm11[7],xmm12[7]1493; SSE3-NEXT:    punpcklwd {{.*#+}} xmm11 = xmm11[0],xmm10[0],xmm11[1],xmm10[1],xmm11[2],xmm10[2],xmm11[3],xmm10[3]1494; SSE3-NEXT:    punpcklbw {{.*#+}} xmm14 = xmm14[0],xmm13[0],xmm14[1],xmm13[1],xmm14[2],xmm13[2],xmm14[3],xmm13[3],xmm14[4],xmm13[4],xmm14[5],xmm13[5],xmm14[6],xmm13[6],xmm14[7],xmm13[7]1495; SSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm15[0],xmm0[1],xmm15[1],xmm0[2],xmm15[2],xmm0[3],xmm15[3],xmm0[4],xmm15[4],xmm0[5],xmm15[5],xmm0[6],xmm15[6],xmm0[7],xmm15[7]1496; SSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm14[0],xmm0[1],xmm14[1],xmm0[2],xmm14[2],xmm0[3],xmm14[3]1497; SSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm11[0],xmm0[1],xmm11[1]1498; SSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm5[0]1499; SSE3-NEXT:    retq1500;1501; SSSE3-LABEL: var_shuffle_v16i8_from_v16i8_v32i8:1502; SSSE3:       # %bb.0:1503; SSSE3-NEXT:    pshufb %xmm1, %xmm01504; SSSE3-NEXT:    retq1505;1506; SSE41-LABEL: var_shuffle_v16i8_from_v16i8_v32i8:1507; SSE41:       # %bb.0:1508; SSE41-NEXT:    pshufb %xmm1, %xmm01509; SSE41-NEXT:    retq1510;1511; AVX-LABEL: var_shuffle_v16i8_from_v16i8_v32i8:1512; AVX:       # %bb.0:1513; AVX-NEXT:    vpshufb %xmm1, %xmm0, %xmm01514; AVX-NEXT:    vzeroupper1515; AVX-NEXT:    retq1516  %index0 = extractelement <32 x i8> %indices, i32 01517  %index1 = extractelement <32 x i8> %indices, i32 11518  %index2 = extractelement <32 x i8> %indices, i32 21519  %index3 = extractelement <32 x i8> %indices, i32 31520  %index4 = extractelement <32 x i8> %indices, i32 41521  %index5 = extractelement <32 x i8> %indices, i32 51522  %index6 = extractelement <32 x i8> %indices, i32 61523  %index7 = extractelement <32 x i8> %indices, i32 71524  %index8 = extractelement <32 x i8> %indices, i32 81525  %index9 = extractelement <32 x i8> %indices, i32 91526  %index10 = extractelement <32 x i8> %indices, i32 101527  %index11 = extractelement <32 x i8> %indices, i32 111528  %index12 = extractelement <32 x i8> %indices, i32 121529  %index13 = extractelement <32 x i8> %indices, i32 131530  %index14 = extractelement <32 x i8> %indices, i32 141531  %index15 = extractelement <32 x i8> %indices, i32 151532  %v0 = extractelement <16 x i8> %v, i8 %index01533  %v1 = extractelement <16 x i8> %v, i8 %index11534  %v2 = extractelement <16 x i8> %v, i8 %index21535  %v3 = extractelement <16 x i8> %v, i8 %index31536  %v4 = extractelement <16 x i8> %v, i8 %index41537  %v5 = extractelement <16 x i8> %v, i8 %index51538  %v6 = extractelement <16 x i8> %v, i8 %index61539  %v7 = extractelement <16 x i8> %v, i8 %index71540  %v8 = extractelement <16 x i8> %v, i8 %index81541  %v9 = extractelement <16 x i8> %v, i8 %index91542  %v10 = extractelement <16 x i8> %v, i8 %index101543  %v11 = extractelement <16 x i8> %v, i8 %index111544  %v12 = extractelement <16 x i8> %v, i8 %index121545  %v13 = extractelement <16 x i8> %v, i8 %index131546  %v14 = extractelement <16 x i8> %v, i8 %index141547  %v15 = extractelement <16 x i8> %v, i8 %index151548  %ret0 = insertelement <16 x i8> undef, i8 %v0, i32 01549  %ret1 = insertelement <16 x i8> %ret0, i8 %v1, i32 11550  %ret2 = insertelement <16 x i8> %ret1, i8 %v2, i32 21551  %ret3 = insertelement <16 x i8> %ret2, i8 %v3, i32 31552  %ret4 = insertelement <16 x i8> %ret3, i8 %v4, i32 41553  %ret5 = insertelement <16 x i8> %ret4, i8 %v5, i32 51554  %ret6 = insertelement <16 x i8> %ret5, i8 %v6, i32 61555  %ret7 = insertelement <16 x i8> %ret6, i8 %v7, i32 71556  %ret8 = insertelement <16 x i8> %ret7, i8 %v8, i32 81557  %ret9 = insertelement <16 x i8> %ret8, i8 %v9, i32 91558  %ret10 = insertelement <16 x i8> %ret9, i8 %v10, i32 101559  %ret11 = insertelement <16 x i8> %ret10, i8 %v11, i32 111560  %ret12 = insertelement <16 x i8> %ret11, i8 %v12, i32 121561  %ret13 = insertelement <16 x i8> %ret12, i8 %v13, i32 131562  %ret14 = insertelement <16 x i8> %ret13, i8 %v14, i32 141563  %ret15 = insertelement <16 x i8> %ret14, i8 %v15, i32 151564  ret <16 x i8> %ret151565}1566 1567define <16 x i8> @var_shuffle_v16i8_from_v32i8_v16i8(<32 x i8> %v, <16 x i8> %indices) nounwind {1568; SSE3-LABEL: var_shuffle_v16i8_from_v32i8_v16i8:1569; SSE3:       # %bb.0:1570; SSE3-NEXT:    pushq %rbp1571; SSE3-NEXT:    pushq %r151572; SSE3-NEXT:    pushq %r141573; SSE3-NEXT:    pushq %r131574; SSE3-NEXT:    pushq %r121575; SSE3-NEXT:    pushq %rbx1576; SSE3-NEXT:    subq $424, %rsp # imm = 0x1A81577; SSE3-NEXT:    movaps %xmm2, -128(%rsp)1578; SSE3-NEXT:    movaps %xmm1, 400(%rsp)1579; SSE3-NEXT:    movaps %xmm0, 384(%rsp)1580; SSE3-NEXT:    movzbl -128(%rsp), %eax1581; SSE3-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill1582; SSE3-NEXT:    movaps %xmm1, 368(%rsp)1583; SSE3-NEXT:    movaps %xmm0, 352(%rsp)1584; SSE3-NEXT:    movzbl -127(%rsp), %ecx1585; SSE3-NEXT:    movaps %xmm1, 336(%rsp)1586; SSE3-NEXT:    movaps %xmm0, 320(%rsp)1587; SSE3-NEXT:    movzbl -126(%rsp), %edx1588; SSE3-NEXT:    movaps %xmm1, 304(%rsp)1589; SSE3-NEXT:    movaps %xmm0, 288(%rsp)1590; SSE3-NEXT:    movzbl -125(%rsp), %esi1591; SSE3-NEXT:    movaps %xmm1, 272(%rsp)1592; SSE3-NEXT:    movaps %xmm0, 256(%rsp)1593; SSE3-NEXT:    movzbl -124(%rsp), %edi1594; SSE3-NEXT:    movaps %xmm1, 240(%rsp)1595; SSE3-NEXT:    movaps %xmm0, 224(%rsp)1596; SSE3-NEXT:    movzbl -123(%rsp), %r8d1597; SSE3-NEXT:    movaps %xmm1, 208(%rsp)1598; SSE3-NEXT:    movaps %xmm0, 192(%rsp)1599; SSE3-NEXT:    movzbl -122(%rsp), %r9d1600; SSE3-NEXT:    movaps %xmm1, 176(%rsp)1601; SSE3-NEXT:    movaps %xmm0, 160(%rsp)1602; SSE3-NEXT:    movzbl -121(%rsp), %r10d1603; SSE3-NEXT:    movaps %xmm1, 144(%rsp)1604; SSE3-NEXT:    movaps %xmm0, 128(%rsp)1605; SSE3-NEXT:    movzbl -120(%rsp), %r11d1606; SSE3-NEXT:    movaps %xmm1, 112(%rsp)1607; SSE3-NEXT:    movaps %xmm0, 96(%rsp)1608; SSE3-NEXT:    movzbl -119(%rsp), %ebx1609; SSE3-NEXT:    movaps %xmm1, 80(%rsp)1610; SSE3-NEXT:    movaps %xmm0, 64(%rsp)1611; SSE3-NEXT:    movzbl -118(%rsp), %r14d1612; SSE3-NEXT:    movaps %xmm1, 48(%rsp)1613; SSE3-NEXT:    movaps %xmm0, 32(%rsp)1614; SSE3-NEXT:    movzbl -117(%rsp), %r15d1615; SSE3-NEXT:    movaps %xmm1, 16(%rsp)1616; SSE3-NEXT:    movaps %xmm0, (%rsp)1617; SSE3-NEXT:    movzbl -116(%rsp), %r12d1618; SSE3-NEXT:    movaps %xmm1, -16(%rsp)1619; SSE3-NEXT:    movaps %xmm0, -32(%rsp)1620; SSE3-NEXT:    movzbl -115(%rsp), %r13d1621; SSE3-NEXT:    movaps %xmm1, -48(%rsp)1622; SSE3-NEXT:    movaps %xmm0, -64(%rsp)1623; SSE3-NEXT:    movzbl -114(%rsp), %ebp1624; SSE3-NEXT:    movaps %xmm1, -80(%rsp)1625; SSE3-NEXT:    movaps %xmm0, -96(%rsp)1626; SSE3-NEXT:    movzbl -113(%rsp), %eax1627; SSE3-NEXT:    andl $31, %eax1628; SSE3-NEXT:    movzbl -96(%rsp,%rax), %eax1629; SSE3-NEXT:    movd %eax, %xmm11630; SSE3-NEXT:    andl $31, %ebp1631; SSE3-NEXT:    movzbl -64(%rsp,%rbp), %eax1632; SSE3-NEXT:    movd %eax, %xmm21633; SSE3-NEXT:    andl $31, %r13d1634; SSE3-NEXT:    movzbl -32(%rsp,%r13), %eax1635; SSE3-NEXT:    movd %eax, %xmm41636; SSE3-NEXT:    andl $31, %r12d1637; SSE3-NEXT:    movzbl (%rsp,%r12), %eax1638; SSE3-NEXT:    movd %eax, %xmm31639; SSE3-NEXT:    andl $31, %r15d1640; SSE3-NEXT:    movzbl 32(%rsp,%r15), %eax1641; SSE3-NEXT:    movd %eax, %xmm61642; SSE3-NEXT:    andl $31, %r14d1643; SSE3-NEXT:    movzbl 64(%rsp,%r14), %eax1644; SSE3-NEXT:    movd %eax, %xmm71645; SSE3-NEXT:    andl $31, %ebx1646; SSE3-NEXT:    movzbl 96(%rsp,%rbx), %eax1647; SSE3-NEXT:    movd %eax, %xmm81648; SSE3-NEXT:    andl $31, %r11d1649; SSE3-NEXT:    movzbl 128(%rsp,%r11), %eax1650; SSE3-NEXT:    movd %eax, %xmm51651; SSE3-NEXT:    andl $31, %r10d1652; SSE3-NEXT:    movzbl 160(%rsp,%r10), %eax1653; SSE3-NEXT:    movd %eax, %xmm91654; SSE3-NEXT:    andl $31, %r9d1655; SSE3-NEXT:    movzbl 192(%rsp,%r9), %eax1656; SSE3-NEXT:    movd %eax, %xmm101657; SSE3-NEXT:    andl $31, %r8d1658; SSE3-NEXT:    movzbl 224(%rsp,%r8), %eax1659; SSE3-NEXT:    movd %eax, %xmm121660; SSE3-NEXT:    andl $31, %edi1661; SSE3-NEXT:    movzbl 256(%rsp,%rdi), %eax1662; SSE3-NEXT:    movd %eax, %xmm111663; SSE3-NEXT:    andl $31, %esi1664; SSE3-NEXT:    movzbl 288(%rsp,%rsi), %eax1665; SSE3-NEXT:    movd %eax, %xmm131666; SSE3-NEXT:    andl $31, %edx1667; SSE3-NEXT:    movzbl 320(%rsp,%rdx), %eax1668; SSE3-NEXT:    movd %eax, %xmm141669; SSE3-NEXT:    andl $31, %ecx1670; SSE3-NEXT:    movzbl 352(%rsp,%rcx), %eax1671; SSE3-NEXT:    movd %eax, %xmm151672; SSE3-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload1673; SSE3-NEXT:    andl $31, %eax1674; SSE3-NEXT:    movzbl 384(%rsp,%rax), %eax1675; SSE3-NEXT:    movd %eax, %xmm01676; SSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]1677; SSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]1678; SSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]1679; SSE3-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm6[0],xmm7[1],xmm6[1],xmm7[2],xmm6[2],xmm7[3],xmm6[3],xmm7[4],xmm6[4],xmm7[5],xmm6[5],xmm7[6],xmm6[6],xmm7[7],xmm6[7]1680; SSE3-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm8[0],xmm5[1],xmm8[1],xmm5[2],xmm8[2],xmm5[3],xmm8[3],xmm5[4],xmm8[4],xmm5[5],xmm8[5],xmm5[6],xmm8[6],xmm5[7],xmm8[7]1681; SSE3-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1],xmm5[2],xmm7[2],xmm5[3],xmm7[3]1682; SSE3-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]1683; SSE3-NEXT:    punpcklbw {{.*#+}} xmm10 = xmm10[0],xmm9[0],xmm10[1],xmm9[1],xmm10[2],xmm9[2],xmm10[3],xmm9[3],xmm10[4],xmm9[4],xmm10[5],xmm9[5],xmm10[6],xmm9[6],xmm10[7],xmm9[7]1684; SSE3-NEXT:    punpcklbw {{.*#+}} xmm11 = xmm11[0],xmm12[0],xmm11[1],xmm12[1],xmm11[2],xmm12[2],xmm11[3],xmm12[3],xmm11[4],xmm12[4],xmm11[5],xmm12[5],xmm11[6],xmm12[6],xmm11[7],xmm12[7]1685; SSE3-NEXT:    punpcklwd {{.*#+}} xmm11 = xmm11[0],xmm10[0],xmm11[1],xmm10[1],xmm11[2],xmm10[2],xmm11[3],xmm10[3]1686; SSE3-NEXT:    punpcklbw {{.*#+}} xmm14 = xmm14[0],xmm13[0],xmm14[1],xmm13[1],xmm14[2],xmm13[2],xmm14[3],xmm13[3],xmm14[4],xmm13[4],xmm14[5],xmm13[5],xmm14[6],xmm13[6],xmm14[7],xmm13[7]1687; SSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm15[0],xmm0[1],xmm15[1],xmm0[2],xmm15[2],xmm0[3],xmm15[3],xmm0[4],xmm15[4],xmm0[5],xmm15[5],xmm0[6],xmm15[6],xmm0[7],xmm15[7]1688; SSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm14[0],xmm0[1],xmm14[1],xmm0[2],xmm14[2],xmm0[3],xmm14[3]1689; SSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm11[0],xmm0[1],xmm11[1]1690; SSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm5[0]1691; SSE3-NEXT:    addq $424, %rsp # imm = 0x1A81692; SSE3-NEXT:    popq %rbx1693; SSE3-NEXT:    popq %r121694; SSE3-NEXT:    popq %r131695; SSE3-NEXT:    popq %r141696; SSE3-NEXT:    popq %r151697; SSE3-NEXT:    popq %rbp1698; SSE3-NEXT:    retq1699;1700; SSSE3-LABEL: var_shuffle_v16i8_from_v32i8_v16i8:1701; SSSE3:       # %bb.0:1702; SSSE3-NEXT:    pushq %rbp1703; SSSE3-NEXT:    pushq %r151704; SSSE3-NEXT:    pushq %r141705; SSSE3-NEXT:    pushq %r131706; SSSE3-NEXT:    pushq %r121707; SSSE3-NEXT:    pushq %rbx1708; SSSE3-NEXT:    subq $424, %rsp # imm = 0x1A81709; SSSE3-NEXT:    movaps %xmm2, -128(%rsp)1710; SSSE3-NEXT:    movaps %xmm1, 400(%rsp)1711; SSSE3-NEXT:    movaps %xmm0, 384(%rsp)1712; SSSE3-NEXT:    movzbl -128(%rsp), %eax1713; SSSE3-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill1714; SSSE3-NEXT:    movaps %xmm1, 368(%rsp)1715; SSSE3-NEXT:    movaps %xmm0, 352(%rsp)1716; SSSE3-NEXT:    movzbl -127(%rsp), %ecx1717; SSSE3-NEXT:    movaps %xmm1, 336(%rsp)1718; SSSE3-NEXT:    movaps %xmm0, 320(%rsp)1719; SSSE3-NEXT:    movzbl -126(%rsp), %edx1720; SSSE3-NEXT:    movaps %xmm1, 304(%rsp)1721; SSSE3-NEXT:    movaps %xmm0, 288(%rsp)1722; SSSE3-NEXT:    movzbl -125(%rsp), %esi1723; SSSE3-NEXT:    movaps %xmm1, 272(%rsp)1724; SSSE3-NEXT:    movaps %xmm0, 256(%rsp)1725; SSSE3-NEXT:    movzbl -124(%rsp), %edi1726; SSSE3-NEXT:    movaps %xmm1, 240(%rsp)1727; SSSE3-NEXT:    movaps %xmm0, 224(%rsp)1728; SSSE3-NEXT:    movzbl -123(%rsp), %r8d1729; SSSE3-NEXT:    movaps %xmm1, 208(%rsp)1730; SSSE3-NEXT:    movaps %xmm0, 192(%rsp)1731; SSSE3-NEXT:    movzbl -122(%rsp), %r9d1732; SSSE3-NEXT:    movaps %xmm1, 176(%rsp)1733; SSSE3-NEXT:    movaps %xmm0, 160(%rsp)1734; SSSE3-NEXT:    movzbl -121(%rsp), %r10d1735; SSSE3-NEXT:    movaps %xmm1, 144(%rsp)1736; SSSE3-NEXT:    movaps %xmm0, 128(%rsp)1737; SSSE3-NEXT:    movzbl -120(%rsp), %r11d1738; SSSE3-NEXT:    movaps %xmm1, 112(%rsp)1739; SSSE3-NEXT:    movaps %xmm0, 96(%rsp)1740; SSSE3-NEXT:    movzbl -119(%rsp), %ebx1741; SSSE3-NEXT:    movaps %xmm1, 80(%rsp)1742; SSSE3-NEXT:    movaps %xmm0, 64(%rsp)1743; SSSE3-NEXT:    movzbl -118(%rsp), %r14d1744; SSSE3-NEXT:    movaps %xmm1, 48(%rsp)1745; SSSE3-NEXT:    movaps %xmm0, 32(%rsp)1746; SSSE3-NEXT:    movzbl -117(%rsp), %r15d1747; SSSE3-NEXT:    movaps %xmm1, 16(%rsp)1748; SSSE3-NEXT:    movaps %xmm0, (%rsp)1749; SSSE3-NEXT:    movzbl -116(%rsp), %r12d1750; SSSE3-NEXT:    movaps %xmm1, -16(%rsp)1751; SSSE3-NEXT:    movaps %xmm0, -32(%rsp)1752; SSSE3-NEXT:    movzbl -115(%rsp), %r13d1753; SSSE3-NEXT:    movaps %xmm1, -48(%rsp)1754; SSSE3-NEXT:    movaps %xmm0, -64(%rsp)1755; SSSE3-NEXT:    movzbl -114(%rsp), %ebp1756; SSSE3-NEXT:    movaps %xmm1, -80(%rsp)1757; SSSE3-NEXT:    movaps %xmm0, -96(%rsp)1758; SSSE3-NEXT:    movzbl -113(%rsp), %eax1759; SSSE3-NEXT:    andl $31, %eax1760; SSSE3-NEXT:    movzbl -96(%rsp,%rax), %eax1761; SSSE3-NEXT:    movd %eax, %xmm11762; SSSE3-NEXT:    andl $31, %ebp1763; SSSE3-NEXT:    movzbl -64(%rsp,%rbp), %eax1764; SSSE3-NEXT:    movd %eax, %xmm21765; SSSE3-NEXT:    andl $31, %r13d1766; SSSE3-NEXT:    movzbl -32(%rsp,%r13), %eax1767; SSSE3-NEXT:    movd %eax, %xmm41768; SSSE3-NEXT:    andl $31, %r12d1769; SSSE3-NEXT:    movzbl (%rsp,%r12), %eax1770; SSSE3-NEXT:    movd %eax, %xmm31771; SSSE3-NEXT:    andl $31, %r15d1772; SSSE3-NEXT:    movzbl 32(%rsp,%r15), %eax1773; SSSE3-NEXT:    movd %eax, %xmm61774; SSSE3-NEXT:    andl $31, %r14d1775; SSSE3-NEXT:    movzbl 64(%rsp,%r14), %eax1776; SSSE3-NEXT:    movd %eax, %xmm71777; SSSE3-NEXT:    andl $31, %ebx1778; SSSE3-NEXT:    movzbl 96(%rsp,%rbx), %eax1779; SSSE3-NEXT:    movd %eax, %xmm81780; SSSE3-NEXT:    andl $31, %r11d1781; SSSE3-NEXT:    movzbl 128(%rsp,%r11), %eax1782; SSSE3-NEXT:    movd %eax, %xmm51783; SSSE3-NEXT:    andl $31, %r10d1784; SSSE3-NEXT:    movzbl 160(%rsp,%r10), %eax1785; SSSE3-NEXT:    movd %eax, %xmm91786; SSSE3-NEXT:    andl $31, %r9d1787; SSSE3-NEXT:    movzbl 192(%rsp,%r9), %eax1788; SSSE3-NEXT:    movd %eax, %xmm101789; SSSE3-NEXT:    andl $31, %r8d1790; SSSE3-NEXT:    movzbl 224(%rsp,%r8), %eax1791; SSSE3-NEXT:    movd %eax, %xmm121792; SSSE3-NEXT:    andl $31, %edi1793; SSSE3-NEXT:    movzbl 256(%rsp,%rdi), %eax1794; SSSE3-NEXT:    movd %eax, %xmm111795; SSSE3-NEXT:    andl $31, %esi1796; SSSE3-NEXT:    movzbl 288(%rsp,%rsi), %eax1797; SSSE3-NEXT:    movd %eax, %xmm131798; SSSE3-NEXT:    andl $31, %edx1799; SSSE3-NEXT:    movzbl 320(%rsp,%rdx), %eax1800; SSSE3-NEXT:    movd %eax, %xmm141801; SSSE3-NEXT:    andl $31, %ecx1802; SSSE3-NEXT:    movzbl 352(%rsp,%rcx), %eax1803; SSSE3-NEXT:    movd %eax, %xmm151804; SSSE3-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload1805; SSSE3-NEXT:    andl $31, %eax1806; SSSE3-NEXT:    movzbl 384(%rsp,%rax), %eax1807; SSSE3-NEXT:    movd %eax, %xmm01808; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]1809; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]1810; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]1811; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm6[0],xmm7[1],xmm6[1],xmm7[2],xmm6[2],xmm7[3],xmm6[3],xmm7[4],xmm6[4],xmm7[5],xmm6[5],xmm7[6],xmm6[6],xmm7[7],xmm6[7]1812; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm8[0],xmm5[1],xmm8[1],xmm5[2],xmm8[2],xmm5[3],xmm8[3],xmm5[4],xmm8[4],xmm5[5],xmm8[5],xmm5[6],xmm8[6],xmm5[7],xmm8[7]1813; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1],xmm5[2],xmm7[2],xmm5[3],xmm7[3]1814; SSSE3-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]1815; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm10 = xmm10[0],xmm9[0],xmm10[1],xmm9[1],xmm10[2],xmm9[2],xmm10[3],xmm9[3],xmm10[4],xmm9[4],xmm10[5],xmm9[5],xmm10[6],xmm9[6],xmm10[7],xmm9[7]1816; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm11 = xmm11[0],xmm12[0],xmm11[1],xmm12[1],xmm11[2],xmm12[2],xmm11[3],xmm12[3],xmm11[4],xmm12[4],xmm11[5],xmm12[5],xmm11[6],xmm12[6],xmm11[7],xmm12[7]1817; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm11 = xmm11[0],xmm10[0],xmm11[1],xmm10[1],xmm11[2],xmm10[2],xmm11[3],xmm10[3]1818; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm14 = xmm14[0],xmm13[0],xmm14[1],xmm13[1],xmm14[2],xmm13[2],xmm14[3],xmm13[3],xmm14[4],xmm13[4],xmm14[5],xmm13[5],xmm14[6],xmm13[6],xmm14[7],xmm13[7]1819; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm15[0],xmm0[1],xmm15[1],xmm0[2],xmm15[2],xmm0[3],xmm15[3],xmm0[4],xmm15[4],xmm0[5],xmm15[5],xmm0[6],xmm15[6],xmm0[7],xmm15[7]1820; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm14[0],xmm0[1],xmm14[1],xmm0[2],xmm14[2],xmm0[3],xmm14[3]1821; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm11[0],xmm0[1],xmm11[1]1822; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm5[0]1823; SSSE3-NEXT:    addq $424, %rsp # imm = 0x1A81824; SSSE3-NEXT:    popq %rbx1825; SSSE3-NEXT:    popq %r121826; SSSE3-NEXT:    popq %r131827; SSSE3-NEXT:    popq %r141828; SSSE3-NEXT:    popq %r151829; SSSE3-NEXT:    popq %rbp1830; SSSE3-NEXT:    retq1831;1832; SSE41-LABEL: var_shuffle_v16i8_from_v32i8_v16i8:1833; SSE41:       # %bb.0:1834; SSE41-NEXT:    subq $392, %rsp # imm = 0x1881835; SSE41-NEXT:    movd %xmm2, %eax1836; SSE41-NEXT:    movaps %xmm1, 368(%rsp)1837; SSE41-NEXT:    movaps %xmm0, 352(%rsp)1838; SSE41-NEXT:    andl $31, %eax1839; SSE41-NEXT:    movaps %xmm1, 336(%rsp)1840; SSE41-NEXT:    movaps %xmm0, 320(%rsp)1841; SSE41-NEXT:    movaps %xmm1, 304(%rsp)1842; SSE41-NEXT:    movaps %xmm0, 288(%rsp)1843; SSE41-NEXT:    movaps %xmm1, 272(%rsp)1844; SSE41-NEXT:    movaps %xmm0, 256(%rsp)1845; SSE41-NEXT:    movaps %xmm1, 240(%rsp)1846; SSE41-NEXT:    movaps %xmm0, 224(%rsp)1847; SSE41-NEXT:    movaps %xmm1, 208(%rsp)1848; SSE41-NEXT:    movaps %xmm0, 192(%rsp)1849; SSE41-NEXT:    movaps %xmm1, 176(%rsp)1850; SSE41-NEXT:    movaps %xmm0, 160(%rsp)1851; SSE41-NEXT:    movaps %xmm1, 144(%rsp)1852; SSE41-NEXT:    movaps %xmm0, 128(%rsp)1853; SSE41-NEXT:    movaps %xmm1, 112(%rsp)1854; SSE41-NEXT:    movaps %xmm0, 96(%rsp)1855; SSE41-NEXT:    movaps %xmm1, 80(%rsp)1856; SSE41-NEXT:    movaps %xmm0, 64(%rsp)1857; SSE41-NEXT:    movaps %xmm1, 48(%rsp)1858; SSE41-NEXT:    movaps %xmm0, 32(%rsp)1859; SSE41-NEXT:    movaps %xmm1, 16(%rsp)1860; SSE41-NEXT:    movaps %xmm0, (%rsp)1861; SSE41-NEXT:    movaps %xmm1, -16(%rsp)1862; SSE41-NEXT:    movaps %xmm0, -32(%rsp)1863; SSE41-NEXT:    movaps %xmm1, -48(%rsp)1864; SSE41-NEXT:    movaps %xmm0, -64(%rsp)1865; SSE41-NEXT:    movaps %xmm1, -80(%rsp)1866; SSE41-NEXT:    movaps %xmm0, -96(%rsp)1867; SSE41-NEXT:    movaps %xmm1, -112(%rsp)1868; SSE41-NEXT:    movaps %xmm0, -128(%rsp)1869; SSE41-NEXT:    movzbl 352(%rsp,%rax), %eax1870; SSE41-NEXT:    movd %eax, %xmm01871; SSE41-NEXT:    pextrb $1, %xmm2, %eax1872; SSE41-NEXT:    andl $31, %eax1873; SSE41-NEXT:    pinsrb $1, 320(%rsp,%rax), %xmm01874; SSE41-NEXT:    pextrb $2, %xmm2, %eax1875; SSE41-NEXT:    andl $31, %eax1876; SSE41-NEXT:    pinsrb $2, 288(%rsp,%rax), %xmm01877; SSE41-NEXT:    pextrb $3, %xmm2, %eax1878; SSE41-NEXT:    andl $31, %eax1879; SSE41-NEXT:    pinsrb $3, 256(%rsp,%rax), %xmm01880; SSE41-NEXT:    pextrb $4, %xmm2, %eax1881; SSE41-NEXT:    andl $31, %eax1882; SSE41-NEXT:    pinsrb $4, 224(%rsp,%rax), %xmm01883; SSE41-NEXT:    pextrb $5, %xmm2, %eax1884; SSE41-NEXT:    andl $31, %eax1885; SSE41-NEXT:    pinsrb $5, 192(%rsp,%rax), %xmm01886; SSE41-NEXT:    pextrb $6, %xmm2, %eax1887; SSE41-NEXT:    andl $31, %eax1888; SSE41-NEXT:    pinsrb $6, 160(%rsp,%rax), %xmm01889; SSE41-NEXT:    pextrb $7, %xmm2, %eax1890; SSE41-NEXT:    andl $31, %eax1891; SSE41-NEXT:    pinsrb $7, 128(%rsp,%rax), %xmm01892; SSE41-NEXT:    pextrb $8, %xmm2, %eax1893; SSE41-NEXT:    andl $31, %eax1894; SSE41-NEXT:    pinsrb $8, 96(%rsp,%rax), %xmm01895; SSE41-NEXT:    pextrb $9, %xmm2, %eax1896; SSE41-NEXT:    andl $31, %eax1897; SSE41-NEXT:    pinsrb $9, 64(%rsp,%rax), %xmm01898; SSE41-NEXT:    pextrb $10, %xmm2, %eax1899; SSE41-NEXT:    andl $31, %eax1900; SSE41-NEXT:    pinsrb $10, 32(%rsp,%rax), %xmm01901; SSE41-NEXT:    pextrb $11, %xmm2, %eax1902; SSE41-NEXT:    andl $31, %eax1903; SSE41-NEXT:    pinsrb $11, (%rsp,%rax), %xmm01904; SSE41-NEXT:    pextrb $12, %xmm2, %eax1905; SSE41-NEXT:    andl $31, %eax1906; SSE41-NEXT:    pinsrb $12, -32(%rsp,%rax), %xmm01907; SSE41-NEXT:    pextrb $13, %xmm2, %eax1908; SSE41-NEXT:    andl $31, %eax1909; SSE41-NEXT:    pinsrb $13, -64(%rsp,%rax), %xmm01910; SSE41-NEXT:    pextrb $14, %xmm2, %eax1911; SSE41-NEXT:    andl $31, %eax1912; SSE41-NEXT:    pinsrb $14, -96(%rsp,%rax), %xmm01913; SSE41-NEXT:    pextrb $15, %xmm2, %eax1914; SSE41-NEXT:    andl $31, %eax1915; SSE41-NEXT:    pinsrb $15, -128(%rsp,%rax), %xmm01916; SSE41-NEXT:    addq $392, %rsp # imm = 0x1881917; SSE41-NEXT:    retq1918;1919; XOP-LABEL: var_shuffle_v16i8_from_v32i8_v16i8:1920; XOP:       # %bb.0:1921; XOP-NEXT:    vextractf128 $1, %ymm0, %xmm21922; XOP-NEXT:    vpperm %xmm1, %xmm2, %xmm0, %xmm01923; XOP-NEXT:    vzeroupper1924; XOP-NEXT:    retq1925;1926; AVX1-LABEL: var_shuffle_v16i8_from_v32i8_v16i8:1927; AVX1:       # %bb.0:1928; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21929; AVX1-NEXT:    vpshufb %xmm1, %xmm2, %xmm21930; AVX1-NEXT:    vpshufb %xmm1, %xmm0, %xmm01931; AVX1-NEXT:    vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11932; AVX1-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm01933; AVX1-NEXT:    vzeroupper1934; AVX1-NEXT:    retq1935;1936; AVX2-LABEL: var_shuffle_v16i8_from_v32i8_v16i8:1937; AVX2:       # %bb.0:1938; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm21939; AVX2-NEXT:    vpshufb %xmm1, %xmm2, %xmm21940; AVX2-NEXT:    vpshufb %xmm1, %xmm0, %xmm01941; AVX2-NEXT:    vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11942; AVX2-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm01943; AVX2-NEXT:    vzeroupper1944; AVX2-NEXT:    retq1945;1946; AVX512-LABEL: var_shuffle_v16i8_from_v32i8_v16i8:1947; AVX512:       # %bb.0:1948; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm21949; AVX512-NEXT:    vpshufb %xmm1, %xmm2, %xmm21950; AVX512-NEXT:    vpshufb %xmm1, %xmm0, %xmm01951; AVX512-NEXT:    vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11952; AVX512-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm01953; AVX512-NEXT:    vzeroupper1954; AVX512-NEXT:    retq1955;1956; AVX512VLBW-LABEL: var_shuffle_v16i8_from_v32i8_v16i8:1957; AVX512VLBW:       # %bb.0:1958; AVX512VLBW-NEXT:    # kill: def $xmm1 killed $xmm1 def $ymm11959; AVX512VLBW-NEXT:    vextracti128 $1, %ymm0, %xmm21960; AVX512VLBW-NEXT:    vpshufb %xmm1, %xmm2, %xmm21961; AVX512VLBW-NEXT:    vpshufb %xmm1, %xmm0, %xmm01962; AVX512VLBW-NEXT:    vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %k11963; AVX512VLBW-NEXT:    vmovdqu8 %ymm2, %ymm0 {%k1}1964; AVX512VLBW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm01965; AVX512VLBW-NEXT:    vzeroupper1966; AVX512VLBW-NEXT:    retq1967;1968; VLVBMI-LABEL: var_shuffle_v16i8_from_v32i8_v16i8:1969; VLVBMI:       # %bb.0:1970; VLVBMI-NEXT:    # kill: def $xmm1 killed $xmm1 def $ymm11971; VLVBMI-NEXT:    vpermb %ymm0, %ymm1, %ymm01972; VLVBMI-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm01973; VLVBMI-NEXT:    vzeroupper1974; VLVBMI-NEXT:    retq1975  %index0 = extractelement <16 x i8> %indices, i32 01976  %index1 = extractelement <16 x i8> %indices, i32 11977  %index2 = extractelement <16 x i8> %indices, i32 21978  %index3 = extractelement <16 x i8> %indices, i32 31979  %index4 = extractelement <16 x i8> %indices, i32 41980  %index5 = extractelement <16 x i8> %indices, i32 51981  %index6 = extractelement <16 x i8> %indices, i32 61982  %index7 = extractelement <16 x i8> %indices, i32 71983  %index8 = extractelement <16 x i8> %indices, i32 81984  %index9 = extractelement <16 x i8> %indices, i32 91985  %index10 = extractelement <16 x i8> %indices, i32 101986  %index11 = extractelement <16 x i8> %indices, i32 111987  %index12 = extractelement <16 x i8> %indices, i32 121988  %index13 = extractelement <16 x i8> %indices, i32 131989  %index14 = extractelement <16 x i8> %indices, i32 141990  %index15 = extractelement <16 x i8> %indices, i32 151991  %v0 = extractelement <32 x i8> %v, i8 %index01992  %v1 = extractelement <32 x i8> %v, i8 %index11993  %v2 = extractelement <32 x i8> %v, i8 %index21994  %v3 = extractelement <32 x i8> %v, i8 %index31995  %v4 = extractelement <32 x i8> %v, i8 %index41996  %v5 = extractelement <32 x i8> %v, i8 %index51997  %v6 = extractelement <32 x i8> %v, i8 %index61998  %v7 = extractelement <32 x i8> %v, i8 %index71999  %v8 = extractelement <32 x i8> %v, i8 %index82000  %v9 = extractelement <32 x i8> %v, i8 %index92001  %v10 = extractelement <32 x i8> %v, i8 %index102002  %v11 = extractelement <32 x i8> %v, i8 %index112003  %v12 = extractelement <32 x i8> %v, i8 %index122004  %v13 = extractelement <32 x i8> %v, i8 %index132005  %v14 = extractelement <32 x i8> %v, i8 %index142006  %v15 = extractelement <32 x i8> %v, i8 %index152007  %ret0 = insertelement <16 x i8> undef, i8 %v0, i32 02008  %ret1 = insertelement <16 x i8> %ret0, i8 %v1, i32 12009  %ret2 = insertelement <16 x i8> %ret1, i8 %v2, i32 22010  %ret3 = insertelement <16 x i8> %ret2, i8 %v3, i32 32011  %ret4 = insertelement <16 x i8> %ret3, i8 %v4, i32 42012  %ret5 = insertelement <16 x i8> %ret4, i8 %v5, i32 52013  %ret6 = insertelement <16 x i8> %ret5, i8 %v6, i32 62014  %ret7 = insertelement <16 x i8> %ret6, i8 %v7, i32 72015  %ret8 = insertelement <16 x i8> %ret7, i8 %v8, i32 82016  %ret9 = insertelement <16 x i8> %ret8, i8 %v9, i32 92017  %ret10 = insertelement <16 x i8> %ret9, i8 %v10, i32 102018  %ret11 = insertelement <16 x i8> %ret10, i8 %v11, i32 112019  %ret12 = insertelement <16 x i8> %ret11, i8 %v12, i32 122020  %ret13 = insertelement <16 x i8> %ret12, i8 %v13, i32 132021  %ret14 = insertelement <16 x i8> %ret13, i8 %v14, i32 142022  %ret15 = insertelement <16 x i8> %ret14, i8 %v15, i32 152023  ret <16 x i8> %ret152024}2025 2026define void @indices_convert() {2027; SSE3-LABEL: indices_convert:2028; SSE3:       # %bb.0: # %bb2029; SSE3-NEXT:    movaps (%rax), %xmm02030; SSE3-NEXT:    movaps %xmm0, -24(%rsp)2031; SSE3-NEXT:    movaps %xmm0, -40(%rsp)2032; SSE3-NEXT:    movl (%rax), %eax2033; SSE3-NEXT:    movaps %xmm0, -56(%rsp)2034; SSE3-NEXT:    movaps %xmm0, -72(%rsp)2035; SSE3-NEXT:    andl $3, %eax2036; SSE3-NEXT:    shll $3, %eax2037; SSE3-NEXT:    movsd -72(%rsp,%rax), %xmm0 # xmm0 = mem[0],zero2038; SSE3-NEXT:    movsd -40(%rsp,%rax), %xmm1 # xmm1 = mem[0],zero2039; SSE3-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]2040; SSE3-NEXT:    movups %xmm1, (%rax)2041; SSE3-NEXT:    retq2042;2043; SSSE3-LABEL: indices_convert:2044; SSSE3:       # %bb.0: # %bb2045; SSSE3-NEXT:    movaps (%rax), %xmm02046; SSSE3-NEXT:    movaps %xmm0, -24(%rsp)2047; SSSE3-NEXT:    movaps %xmm0, -40(%rsp)2048; SSSE3-NEXT:    movl (%rax), %eax2049; SSSE3-NEXT:    movaps %xmm0, -56(%rsp)2050; SSSE3-NEXT:    movaps %xmm0, -72(%rsp)2051; SSSE3-NEXT:    andl $3, %eax2052; SSSE3-NEXT:    shll $3, %eax2053; SSSE3-NEXT:    movsd -72(%rsp,%rax), %xmm0 # xmm0 = mem[0],zero2054; SSSE3-NEXT:    movsd -40(%rsp,%rax), %xmm1 # xmm1 = mem[0],zero2055; SSSE3-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]2056; SSSE3-NEXT:    movups %xmm1, (%rax)2057; SSSE3-NEXT:    retq2058;2059; SSE41-LABEL: indices_convert:2060; SSE41:       # %bb.0: # %bb2061; SSE41-NEXT:    movaps (%rax), %xmm02062; SSE41-NEXT:    extractps $2, %xmm0, %eax2063; SSE41-NEXT:    movaps %xmm0, -24(%rsp)2064; SSE41-NEXT:    movaps %xmm0, -40(%rsp)2065; SSE41-NEXT:    andl $3, %eax2066; SSE41-NEXT:    extractps $3, %xmm0, %ecx2067; SSE41-NEXT:    movaps %xmm0, -56(%rsp)2068; SSE41-NEXT:    movaps %xmm0, -72(%rsp)2069; SSE41-NEXT:    andl $3, %ecx2070; SSE41-NEXT:    movsd -72(%rsp,%rcx,8), %xmm0 # xmm0 = mem[0],zero2071; SSE41-NEXT:    movsd -40(%rsp,%rax,8), %xmm1 # xmm1 = mem[0],zero2072; SSE41-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]2073; SSE41-NEXT:    movups %xmm1, (%rax)2074; SSE41-NEXT:    retq2075;2076; XOP-LABEL: indices_convert:2077; XOP:       # %bb.0: # %bb2078; XOP-NEXT:    vmovdqa (%rax), %xmm02079; XOP-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]2080; XOP-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm12081; XOP-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero2082; XOP-NEXT:    vpaddq %xmm1, %xmm1, %xmm12083; XOP-NEXT:    vpermil2pd $0, %xmm1, %xmm0, %xmm0, %xmm02084; XOP-NEXT:    vmovupd %xmm0, (%rax)2085; XOP-NEXT:    retq2086;2087; AVX1-LABEL: indices_convert:2088; AVX1:       # %bb.0: # %bb2089; AVX1-NEXT:    vmovdqa (%rax), %xmm02090; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]2091; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm12092; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero2093; AVX1-NEXT:    vpaddq %xmm1, %xmm1, %xmm12094; AVX1-NEXT:    vpermilpd %xmm1, %xmm0, %xmm02095; AVX1-NEXT:    vmovupd %xmm0, (%rax)2096; AVX1-NEXT:    retq2097;2098; AVX2-LABEL: indices_convert:2099; AVX2:       # %bb.0: # %bb2100; AVX2-NEXT:    vpbroadcastq (%rax), %xmm02101; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [7,7,7,7]2102; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm02103; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero2104; AVX2-NEXT:    vpaddq %xmm0, %xmm0, %xmm02105; AVX2-NEXT:    vmovapd (%rax), %xmm12106; AVX2-NEXT:    vpermilpd %xmm0, %xmm1, %xmm02107; AVX2-NEXT:    vmovupd %xmm0, (%rax)2108; AVX2-NEXT:    retq2109;2110; AVX512-LABEL: indices_convert:2111; AVX512:       # %bb.0: # %bb2112; AVX512-NEXT:    vmovdqa (%rax), %ymm02113; AVX512-NEXT:    vpbroadcastq (%rax), %xmm12114; AVX512-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [7,7,7,7]2115; AVX512-NEXT:    vpand %xmm2, %xmm1, %xmm12116; AVX512-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero2117; AVX512-NEXT:    vpermq %zmm0, %zmm1, %zmm02118; AVX512-NEXT:    vmovdqu %xmm0, (%rax)2119; AVX512-NEXT:    vzeroupper2120; AVX512-NEXT:    retq2121;2122; AVX512VL-LABEL: indices_convert:2123; AVX512VL:       # %bb.0: # %bb2124; AVX512VL-NEXT:    vpbroadcastq (%rax), %xmm02125; AVX512VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm02126; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero2127; AVX512VL-NEXT:    vpermq (%rax), %ymm0, %ymm02128; AVX512VL-NEXT:    vmovdqu %xmm0, (%rax)2129; AVX512VL-NEXT:    vzeroupper2130; AVX512VL-NEXT:    retq2131bb:2132  %0 = load <4 x i64>, ptr undef, align 322133  %1 = bitcast <4 x i64> %0 to <8 x i32>2134  %2 = shufflevector <8 x i32> %1, <8 x i32> undef, <2 x i32> <i32 2, i32 12>2135  %3 = and <2 x i32> %2, <i32 7, i32 7>2136  %4 = extractelement <2 x i32> %3, i32 02137  %vecext.i8.1 = extractelement <4 x i64> %0, i32 %42138  %5 = extractelement <2 x i32> %3, i32 12139  %vecext.i8.2 = extractelement <4 x i64> %0, i32 %52140  %6 = insertelement <2 x i64> poison, i64 %vecext.i8.1, i32 02141  %7 = insertelement <2 x i64> %6, i64 %vecext.i8.2, i32 12142  %8 = select <2 x i1> undef, <2 x i64> undef, <2 x i64> %72143  store <2 x i64> %8, ptr undef, align 82144  ret void2145}2146