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