2157 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=+xop | FileCheck %s --check-prefix=XOP3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX14; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=INT256,AVX25; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=INT256,AVX512,AVX512F6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq | FileCheck %s --check-prefixes=INT256,AVX512,AVX512F7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefixes=INT256,AVX512,AVX512BW8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vbmi | FileCheck %s --check-prefixes=INT256,AVX512,AVX512BW9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=INT256,AVX512VL,AVX512VLF10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefixes=INT256,AVX512VL,AVX512VLF11; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl | FileCheck %s --check-prefixes=INT256,AVX512VL,AVX512VLBW12; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+avx512vbmi | FileCheck %s --check-prefixes=INT256,AVX512VL,VLVBMI13 14define <4 x i64> @var_shuffle_v4i64(<4 x i64> %v, <4 x i64> %indices) nounwind {15; XOP-LABEL: var_shuffle_v4i64:16; XOP: # %bb.0:17; XOP-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3,2,3]18; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm019; XOP-NEXT: vpaddq %xmm1, %xmm1, %xmm320; XOP-NEXT: vextractf128 $1, %ymm1, %xmm121; XOP-NEXT: vpaddq %xmm1, %xmm1, %xmm122; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm123; XOP-NEXT: vpermil2pd $0, %ymm1, %ymm2, %ymm0, %ymm024; XOP-NEXT: retq25;26; AVX1-LABEL: var_shuffle_v4i64:27; AVX1: # %bb.0:28; AVX1-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3,2,3]29; AVX1-NEXT: vpaddq %xmm1, %xmm1, %xmm330; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm131; AVX1-NEXT: vpaddq %xmm1, %xmm1, %xmm132; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm433; AVX1-NEXT: vpermilpd %ymm4, %ymm2, %ymm234; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm035; AVX1-NEXT: vpermilpd %ymm4, %ymm0, %ymm036; AVX1-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm337; AVX1-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}+16(%rip), %xmm1, %xmm138; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm139; AVX1-NEXT: vblendvpd %ymm1, %ymm2, %ymm0, %ymm040; AVX1-NEXT: retq41;42; AVX2-LABEL: var_shuffle_v4i64:43; AVX2: # %bb.0:44; AVX2-NEXT: vpaddq %ymm1, %ymm1, %ymm145; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [2,2,2,2]46; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm247; AVX2-NEXT: vpermpd {{.*#+}} ymm3 = ymm0[2,3,2,3]48; AVX2-NEXT: vpermilpd %ymm1, %ymm3, %ymm349; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,1,0,1]50; AVX2-NEXT: vpermilpd %ymm1, %ymm0, %ymm051; AVX2-NEXT: vblendvpd %ymm2, %ymm3, %ymm0, %ymm052; AVX2-NEXT: retq53;54; AVX512-LABEL: var_shuffle_v4i64:55; AVX512: # %bb.0:56; AVX512-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm157; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm058; AVX512-NEXT: vpermpd %zmm0, %zmm1, %zmm059; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm060; AVX512-NEXT: retq61;62; AVX512VL-LABEL: var_shuffle_v4i64:63; AVX512VL: # %bb.0:64; AVX512VL-NEXT: vpermpd %ymm0, %ymm1, %ymm065; AVX512VL-NEXT: retq66 %index0 = extractelement <4 x i64> %indices, i32 067 %index1 = extractelement <4 x i64> %indices, i32 168 %index2 = extractelement <4 x i64> %indices, i32 269 %index3 = extractelement <4 x i64> %indices, i32 370 %v0 = extractelement <4 x i64> %v, i64 %index071 %v1 = extractelement <4 x i64> %v, i64 %index172 %v2 = extractelement <4 x i64> %v, i64 %index273 %v3 = extractelement <4 x i64> %v, i64 %index374 %ret0 = insertelement <4 x i64> undef, i64 %v0, i32 075 %ret1 = insertelement <4 x i64> %ret0, i64 %v1, i32 176 %ret2 = insertelement <4 x i64> %ret1, i64 %v2, i32 277 %ret3 = insertelement <4 x i64> %ret2, i64 %v3, i32 378 ret <4 x i64> %ret379}80 81define <4 x i64> @var_shuffle_zero_v4i64(<4 x i64> %v, <4 x i64> %indices) nounwind {82; XOP-LABEL: var_shuffle_zero_v4i64:83; XOP: # %bb.0:84; XOP-NEXT: vextractf128 $1, %ymm1, %xmm285; XOP-NEXT: vpmovsxbq {{.*#+}} xmm3 = [3,3]86; XOP-NEXT: vpcomgtuq %xmm3, %xmm2, %xmm287; XOP-NEXT: vpcomgtuq %xmm3, %xmm1, %xmm388; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm289; XOP-NEXT: vorps %ymm1, %ymm2, %ymm190; XOP-NEXT: vpaddq %xmm1, %xmm1, %xmm391; XOP-NEXT: vextractf128 $1, %ymm1, %xmm192; XOP-NEXT: vpaddq %xmm1, %xmm1, %xmm193; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm194; XOP-NEXT: vperm2f128 {{.*#+}} ymm3 = ymm0[2,3,2,3]95; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm096; XOP-NEXT: vpermil2pd $0, %ymm1, %ymm3, %ymm0, %ymm097; XOP-NEXT: vandnps %ymm0, %ymm2, %ymm098; XOP-NEXT: retq99;100; AVX1-LABEL: var_shuffle_zero_v4i64:101; AVX1: # %bb.0:102; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2103; AVX1-NEXT: vmovddup {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]104; AVX1-NEXT: # xmm3 = mem[0,0]105; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2106; AVX1-NEXT: vmovddup {{.*#+}} xmm4 = [9223372036854775811,9223372036854775811]107; AVX1-NEXT: # xmm4 = mem[0,0]108; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm2109; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm3110; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm3111; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2112; AVX1-NEXT: vorps %ymm1, %ymm2, %ymm1113; AVX1-NEXT: vpaddq %xmm1, %xmm1, %xmm3114; AVX1-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm4115; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1116; AVX1-NEXT: vpaddq %xmm1, %xmm1, %xmm1117; AVX1-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}+16(%rip), %xmm1, %xmm5118; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm4, %ymm4119; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1120; AVX1-NEXT: vperm2f128 {{.*#+}} ymm3 = ymm0[2,3,2,3]121; AVX1-NEXT: vpermilpd %ymm1, %ymm3, %ymm3122; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0123; AVX1-NEXT: vpermilpd %ymm1, %ymm0, %ymm0124; AVX1-NEXT: vblendvpd %ymm4, %ymm3, %ymm0, %ymm0125; AVX1-NEXT: vandnps %ymm0, %ymm2, %ymm0126; AVX1-NEXT: retq127;128; AVX2-LABEL: var_shuffle_zero_v4i64:129; AVX2: # %bb.0:130; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]131; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm2132; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775811,9223372036854775811,9223372036854775811,9223372036854775811]133; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2134; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm1135; AVX2-NEXT: vpaddq %ymm1, %ymm1, %ymm1136; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [2,2,2,2]137; AVX2-NEXT: vpcmpgtq %ymm3, %ymm1, %ymm3138; AVX2-NEXT: vpermpd {{.*#+}} ymm4 = ymm0[2,3,2,3]139; AVX2-NEXT: vpermilpd %ymm1, %ymm4, %ymm4140; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,1,0,1]141; AVX2-NEXT: vpermilpd %ymm1, %ymm0, %ymm0142; AVX2-NEXT: vblendvpd %ymm3, %ymm4, %ymm0, %ymm0143; AVX2-NEXT: vpandn %ymm0, %ymm2, %ymm0144; AVX2-NEXT: retq145;146; AVX512-LABEL: var_shuffle_zero_v4i64:147; AVX512: # %bb.0:148; AVX512-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1149; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0150; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm2 = [3,3,3,3]151; AVX512-NEXT: vpcmpleuq %zmm2, %zmm1, %k1152; AVX512-NEXT: vpcmpnleuq %zmm2, %zmm1, %k2153; AVX512-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2154; AVX512-NEXT: vmovdqa64 %zmm2, %zmm1 {%k2}155; AVX512-NEXT: vpermq %zmm0, %zmm1, %zmm0 {%k1} {z}156; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0157; AVX512-NEXT: retq158;159; AVX512VL-LABEL: var_shuffle_zero_v4i64:160; AVX512VL: # %bb.0:161; AVX512VL-NEXT: vpcmpnleuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm1, %k1162; AVX512VL-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2163; AVX512VL-NEXT: vmovdqa64 %ymm2, %ymm1 {%k1}164; AVX512VL-NEXT: vpermq %ymm0, %ymm1, %ymm0165; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1166; AVX512VL-NEXT: vmovdqa64 %ymm1, %ymm0 {%k1}167; AVX512VL-NEXT: retq168 %cmp = icmp ugt <4 x i64> %indices, <i64 3, i64 3, i64 3, i64 3>169 %or = select <4 x i1> %cmp, <4 x i64> <i64 -1, i64 -1, i64 -1, i64 -1>, <4 x i64> %indices170 %idx0 = extractelement <4 x i64> %or, i64 0171 %idx1 = extractelement <4 x i64> %or, i64 1172 %idx2 = extractelement <4 x i64> %or, i64 2173 %idx3 = extractelement <4 x i64> %or, i64 3174 %elt0 = extractelement <4 x i64> %v, i64 %idx0175 %elt1 = extractelement <4 x i64> %v, i64 %idx1176 %elt2 = extractelement <4 x i64> %v, i64 %idx2177 %elt3 = extractelement <4 x i64> %v, i64 %idx3178 %vec0 = insertelement <4 x i64> poison, i64 %elt0, i64 0179 %vec1 = insertelement <4 x i64> %vec0, i64 %elt1, i64 1180 %vec2 = insertelement <4 x i64> %vec1, i64 %elt2, i64 2181 %vec3 = insertelement <4 x i64> %vec2, i64 %elt3, i64 3182 %res = select <4 x i1> %cmp, <4 x i64> zeroinitializer, <4 x i64> %vec3183 ret <4 x i64> %res184}185 186define <8 x i32> @var_shuffle_v8i32(<8 x i32> %v, <8 x i32> %indices) nounwind {187; XOP-LABEL: var_shuffle_v8i32:188; XOP: # %bb.0:189; XOP-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3,2,3]190; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0191; XOP-NEXT: vpermil2ps $0, %ymm1, %ymm2, %ymm0, %ymm0192; XOP-NEXT: retq193;194; AVX1-LABEL: var_shuffle_v8i32:195; AVX1: # %bb.0:196; AVX1-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3,2,3]197; AVX1-NEXT: vpermilps %ymm1, %ymm2, %ymm2198; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0199; AVX1-NEXT: vpermilps %ymm1, %ymm0, %ymm0200; AVX1-NEXT: vpcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm3201; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1202; AVX1-NEXT: vpcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}+16(%rip), %xmm1, %xmm1203; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1204; AVX1-NEXT: vblendvps %ymm1, %ymm2, %ymm0, %ymm0205; AVX1-NEXT: retq206;207; INT256-LABEL: var_shuffle_v8i32:208; INT256: # %bb.0:209; INT256-NEXT: vpermps %ymm0, %ymm1, %ymm0210; INT256-NEXT: retq211 %index0 = extractelement <8 x i32> %indices, i32 0212 %index1 = extractelement <8 x i32> %indices, i32 1213 %index2 = extractelement <8 x i32> %indices, i32 2214 %index3 = extractelement <8 x i32> %indices, i32 3215 %index4 = extractelement <8 x i32> %indices, i32 4216 %index5 = extractelement <8 x i32> %indices, i32 5217 %index6 = extractelement <8 x i32> %indices, i32 6218 %index7 = extractelement <8 x i32> %indices, i32 7219 %v0 = extractelement <8 x i32> %v, i32 %index0220 %v1 = extractelement <8 x i32> %v, i32 %index1221 %v2 = extractelement <8 x i32> %v, i32 %index2222 %v3 = extractelement <8 x i32> %v, i32 %index3223 %v4 = extractelement <8 x i32> %v, i32 %index4224 %v5 = extractelement <8 x i32> %v, i32 %index5225 %v6 = extractelement <8 x i32> %v, i32 %index6226 %v7 = extractelement <8 x i32> %v, i32 %index7227 %ret0 = insertelement <8 x i32> undef, i32 %v0, i32 0228 %ret1 = insertelement <8 x i32> %ret0, i32 %v1, i32 1229 %ret2 = insertelement <8 x i32> %ret1, i32 %v2, i32 2230 %ret3 = insertelement <8 x i32> %ret2, i32 %v3, i32 3231 %ret4 = insertelement <8 x i32> %ret3, i32 %v4, i32 4232 %ret5 = insertelement <8 x i32> %ret4, i32 %v5, i32 5233 %ret6 = insertelement <8 x i32> %ret5, i32 %v6, i32 6234 %ret7 = insertelement <8 x i32> %ret6, i32 %v7, i32 7235 ret <8 x i32> %ret7236}237 238define <8 x i32> @var_shuffle_zero_v8i32(<8 x i32> %v, <8 x i32> %indices) nounwind {239; XOP-LABEL: var_shuffle_zero_v8i32:240; XOP: # %bb.0:241; XOP-NEXT: vextractf128 $1, %ymm1, %xmm2242; XOP-NEXT: vbroadcastss {{.*#+}} xmm3 = [7,7,7,7]243; XOP-NEXT: vpcomgtud %xmm3, %xmm2, %xmm2244; XOP-NEXT: vpcomgtud %xmm3, %xmm1, %xmm3245; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2246; XOP-NEXT: vorps %ymm1, %ymm2, %ymm1247; XOP-NEXT: vperm2f128 {{.*#+}} ymm3 = ymm0[2,3,2,3]248; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0249; XOP-NEXT: vpermil2ps $0, %ymm1, %ymm3, %ymm0, %ymm0250; XOP-NEXT: vandnps %ymm0, %ymm2, %ymm0251; XOP-NEXT: retq252;253; AVX1-LABEL: var_shuffle_zero_v8i32:254; AVX1: # %bb.0:255; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2256; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [8,8,8,8]257; AVX1-NEXT: vpmaxud %xmm3, %xmm2, %xmm4258; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm2259; AVX1-NEXT: vpmaxud %xmm3, %xmm1, %xmm3260; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm3261; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2262; AVX1-NEXT: vorps %ymm1, %ymm2, %ymm1263; AVX1-NEXT: vpcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm3264; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4265; AVX1-NEXT: vpcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}+16(%rip), %xmm4, %xmm4266; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3267; AVX1-NEXT: vperm2f128 {{.*#+}} ymm4 = ymm0[2,3,2,3]268; AVX1-NEXT: vpermilps %ymm1, %ymm4, %ymm4269; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0270; AVX1-NEXT: vpermilps %ymm1, %ymm0, %ymm0271; AVX1-NEXT: vblendvps %ymm3, %ymm4, %ymm0, %ymm0272; AVX1-NEXT: vandnps %ymm0, %ymm2, %ymm0273; AVX1-NEXT: retq274;275; AVX2-LABEL: var_shuffle_zero_v8i32:276; AVX2: # %bb.0:277; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [8,8,8,8,8,8,8,8]278; AVX2-NEXT: vpmaxud %ymm2, %ymm1, %ymm2279; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm2280; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm1281; AVX2-NEXT: vpermd %ymm0, %ymm1, %ymm0282; AVX2-NEXT: vpandn %ymm0, %ymm2, %ymm0283; AVX2-NEXT: retq284;285; AVX512-LABEL: var_shuffle_zero_v8i32:286; AVX512: # %bb.0:287; AVX512-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1288; AVX512-NEXT: vpcmpnleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm1, %k1289; AVX512-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2290; AVX512-NEXT: vmovdqa32 %zmm2, %zmm1 {%k1}291; AVX512-NEXT: vpermd %ymm0, %ymm1, %ymm0292; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1293; AVX512-NEXT: vmovdqa32 %zmm1, %zmm0 {%k1}294; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0295; AVX512-NEXT: retq296;297; AVX512VL-LABEL: var_shuffle_zero_v8i32:298; AVX512VL: # %bb.0:299; AVX512VL-NEXT: vpcmpnleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %k1300; AVX512VL-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2301; AVX512VL-NEXT: vmovdqa32 %ymm2, %ymm1 {%k1}302; AVX512VL-NEXT: vpermd %ymm0, %ymm1, %ymm0303; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1304; AVX512VL-NEXT: vmovdqa32 %ymm1, %ymm0 {%k1}305; AVX512VL-NEXT: retq306 %cmp = icmp ugt <8 x i32> %indices, <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>307 %or = select <8 x i1> %cmp, <8 x i32> <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>, <8 x i32> %indices308 %idx0 = extractelement <8 x i32> %or, i64 0309 %idx1 = extractelement <8 x i32> %or, i64 1310 %idx2 = extractelement <8 x i32> %or, i64 2311 %idx3 = extractelement <8 x i32> %or, i64 3312 %idx4 = extractelement <8 x i32> %or, i64 4313 %idx5 = extractelement <8 x i32> %or, i64 5314 %idx6 = extractelement <8 x i32> %or, i64 6315 %idx7 = extractelement <8 x i32> %or, i64 7316 %elt0 = extractelement <8 x i32> %v, i32 %idx0317 %elt1 = extractelement <8 x i32> %v, i32 %idx1318 %elt2 = extractelement <8 x i32> %v, i32 %idx2319 %elt3 = extractelement <8 x i32> %v, i32 %idx3320 %elt4 = extractelement <8 x i32> %v, i32 %idx4321 %elt5 = extractelement <8 x i32> %v, i32 %idx5322 %elt6 = extractelement <8 x i32> %v, i32 %idx6323 %elt7 = extractelement <8 x i32> %v, i32 %idx7324 %vec0 = insertelement <8 x i32> poison, i32 %elt0, i64 0325 %vec1 = insertelement <8 x i32> %vec0, i32 %elt1, i64 1326 %vec2 = insertelement <8 x i32> %vec1, i32 %elt2, i64 2327 %vec3 = insertelement <8 x i32> %vec2, i32 %elt3, i64 3328 %vec4 = insertelement <8 x i32> %vec3, i32 %elt4, i64 4329 %vec5 = insertelement <8 x i32> %vec4, i32 %elt5, i64 5330 %vec6 = insertelement <8 x i32> %vec5, i32 %elt6, i64 6331 %vec7 = insertelement <8 x i32> %vec6, i32 %elt7, i64 7332 %res = select <8 x i1> %cmp, <8 x i32> zeroinitializer, <8 x i32> %vec7333 ret <8 x i32> %res334}335 336define <16 x i16> @var_shuffle_v16i16(<16 x i16> %v, <16 x i16> %indices) nounwind {337; XOP-LABEL: var_shuffle_v16i16:338; XOP: # %bb.0:339; XOP-NEXT: vbroadcastss {{.*#+}} xmm2 = [256,256,256,256,256,256,256,256]340; XOP-NEXT: vbroadcastss {{.*#+}} xmm3 = [514,514,514,514,514,514,514,514]341; XOP-NEXT: vpmacsww %xmm2, %xmm3, %xmm1, %xmm4342; XOP-NEXT: vextractf128 $1, %ymm1, %xmm1343; XOP-NEXT: vpmacsww %xmm2, %xmm3, %xmm1, %xmm1344; XOP-NEXT: vextractf128 $1, %ymm0, %xmm2345; XOP-NEXT: vpperm %xmm1, %xmm2, %xmm0, %xmm1346; XOP-NEXT: vpperm %xmm4, %xmm2, %xmm0, %xmm0347; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0348; XOP-NEXT: retq349;350; AVX1-LABEL: var_shuffle_v16i16:351; AVX1: # %bb.0:352; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [514,514,514,514,514,514,514,514]353; AVX1-NEXT: vpmullw %xmm2, %xmm1, %xmm3354; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [256,256,256,256,256,256,256,256]355; AVX1-NEXT: vpaddw %xmm4, %xmm3, %xmm3356; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1357; AVX1-NEXT: vpmullw %xmm2, %xmm1, %xmm1358; AVX1-NEXT: vpaddw %xmm4, %xmm1, %xmm1359; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]360; AVX1-NEXT: vpcmpgtb %xmm2, %xmm1, %xmm4361; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5362; AVX1-NEXT: vpshufb %xmm1, %xmm5, %xmm6363; AVX1-NEXT: vpshufb %xmm1, %xmm0, %xmm1364; AVX1-NEXT: vpblendvb %xmm4, %xmm6, %xmm1, %xmm1365; AVX1-NEXT: vpcmpgtb %xmm2, %xmm3, %xmm2366; AVX1-NEXT: vpshufb %xmm3, %xmm5, %xmm4367; AVX1-NEXT: vpshufb %xmm3, %xmm0, %xmm0368; AVX1-NEXT: vpblendvb %xmm2, %xmm4, %xmm0, %xmm0369; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0370; AVX1-NEXT: retq371;372; AVX2-LABEL: var_shuffle_v16i16:373; AVX2: # %bb.0:374; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514]375; AVX2-NEXT: vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1376; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm0[2,3,2,3]377; AVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm2378; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm0379; AVX2-NEXT: vpshufb %ymm1, %ymm0, %ymm0380; AVX2-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1381; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0382; AVX2-NEXT: retq383;384; AVX512-LABEL: var_shuffle_v16i16:385; AVX512: # %bb.0:386; AVX512-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514]387; AVX512-NEXT: vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1388; AVX512-NEXT: vpermq {{.*#+}} ymm2 = ymm0[2,3,2,3]389; AVX512-NEXT: vpshufb %ymm1, %ymm2, %ymm2390; AVX512-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm0391; AVX512-NEXT: vpshufb %ymm1, %ymm0, %ymm0392; AVX512-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1393; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0394; AVX512-NEXT: retq395;396; AVX512VLF-LABEL: var_shuffle_v16i16:397; AVX512VLF: # %bb.0:398; AVX512VLF-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514]399; AVX512VLF-NEXT: vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1400; AVX512VLF-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm2401; AVX512VLF-NEXT: vpshufb %ymm1, %ymm2, %ymm2402; AVX512VLF-NEXT: vpermq {{.*#+}} ymm0 = ymm0[2,3,2,3]403; AVX512VLF-NEXT: vpshufb %ymm1, %ymm0, %ymm3404; AVX512VLF-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm0405; AVX512VLF-NEXT: vpternlogq {{.*#+}} ymm0 = ymm2 ^ (ymm0 & (ymm3 ^ ymm2))406; AVX512VLF-NEXT: retq407;408; AVX512VLBW-LABEL: var_shuffle_v16i16:409; AVX512VLBW: # %bb.0:410; AVX512VLBW-NEXT: vpermw %ymm0, %ymm1, %ymm0411; AVX512VLBW-NEXT: retq412;413; VLVBMI-LABEL: var_shuffle_v16i16:414; VLVBMI: # %bb.0:415; VLVBMI-NEXT: vpermw %ymm0, %ymm1, %ymm0416; VLVBMI-NEXT: retq417 %index0 = extractelement <16 x i16> %indices, i32 0418 %index1 = extractelement <16 x i16> %indices, i32 1419 %index2 = extractelement <16 x i16> %indices, i32 2420 %index3 = extractelement <16 x i16> %indices, i32 3421 %index4 = extractelement <16 x i16> %indices, i32 4422 %index5 = extractelement <16 x i16> %indices, i32 5423 %index6 = extractelement <16 x i16> %indices, i32 6424 %index7 = extractelement <16 x i16> %indices, i32 7425 %index8 = extractelement <16 x i16> %indices, i32 8426 %index9 = extractelement <16 x i16> %indices, i32 9427 %index10 = extractelement <16 x i16> %indices, i32 10428 %index11 = extractelement <16 x i16> %indices, i32 11429 %index12 = extractelement <16 x i16> %indices, i32 12430 %index13 = extractelement <16 x i16> %indices, i32 13431 %index14 = extractelement <16 x i16> %indices, i32 14432 %index15 = extractelement <16 x i16> %indices, i32 15433 %v0 = extractelement <16 x i16> %v, i16 %index0434 %v1 = extractelement <16 x i16> %v, i16 %index1435 %v2 = extractelement <16 x i16> %v, i16 %index2436 %v3 = extractelement <16 x i16> %v, i16 %index3437 %v4 = extractelement <16 x i16> %v, i16 %index4438 %v5 = extractelement <16 x i16> %v, i16 %index5439 %v6 = extractelement <16 x i16> %v, i16 %index6440 %v7 = extractelement <16 x i16> %v, i16 %index7441 %v8 = extractelement <16 x i16> %v, i16 %index8442 %v9 = extractelement <16 x i16> %v, i16 %index9443 %v10 = extractelement <16 x i16> %v, i16 %index10444 %v11 = extractelement <16 x i16> %v, i16 %index11445 %v12 = extractelement <16 x i16> %v, i16 %index12446 %v13 = extractelement <16 x i16> %v, i16 %index13447 %v14 = extractelement <16 x i16> %v, i16 %index14448 %v15 = extractelement <16 x i16> %v, i16 %index15449 %ret0 = insertelement <16 x i16> undef, i16 %v0, i32 0450 %ret1 = insertelement <16 x i16> %ret0, i16 %v1, i32 1451 %ret2 = insertelement <16 x i16> %ret1, i16 %v2, i32 2452 %ret3 = insertelement <16 x i16> %ret2, i16 %v3, i32 3453 %ret4 = insertelement <16 x i16> %ret3, i16 %v4, i32 4454 %ret5 = insertelement <16 x i16> %ret4, i16 %v5, i32 5455 %ret6 = insertelement <16 x i16> %ret5, i16 %v6, i32 6456 %ret7 = insertelement <16 x i16> %ret6, i16 %v7, i32 7457 %ret8 = insertelement <16 x i16> %ret7, i16 %v8, i32 8458 %ret9 = insertelement <16 x i16> %ret8, i16 %v9, i32 9459 %ret10 = insertelement <16 x i16> %ret9, i16 %v10, i32 10460 %ret11 = insertelement <16 x i16> %ret10, i16 %v11, i32 11461 %ret12 = insertelement <16 x i16> %ret11, i16 %v12, i32 12462 %ret13 = insertelement <16 x i16> %ret12, i16 %v13, i32 13463 %ret14 = insertelement <16 x i16> %ret13, i16 %v14, i32 14464 %ret15 = insertelement <16 x i16> %ret14, i16 %v15, i32 15465 ret <16 x i16> %ret15466}467 468define <16 x i16> @var_shuffle_zero_v16i16(<16 x i16> %v, <16 x i16> %indices) nounwind {469; XOP-LABEL: var_shuffle_zero_v16i16:470; XOP: # %bb.0:471; XOP-NEXT: vextractf128 $1, %ymm1, %xmm2472; XOP-NEXT: vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]473; XOP-NEXT: vpcomgtuw %xmm3, %xmm2, %xmm2474; XOP-NEXT: vpcomgtuw %xmm3, %xmm1, %xmm3475; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2476; XOP-NEXT: vorps %ymm1, %ymm2, %ymm1477; XOP-NEXT: vbroadcastss {{.*#+}} xmm3 = [256,256,256,256,256,256,256,256]478; XOP-NEXT: vbroadcastss {{.*#+}} xmm4 = [514,514,514,514,514,514,514,514]479; XOP-NEXT: vpmacsww %xmm3, %xmm4, %xmm1, %xmm5480; XOP-NEXT: vextractf128 $1, %ymm1, %xmm1481; XOP-NEXT: vpmacsww %xmm3, %xmm4, %xmm1, %xmm1482; XOP-NEXT: vextractf128 $1, %ymm0, %xmm3483; XOP-NEXT: vpperm %xmm1, %xmm3, %xmm0, %xmm1484; XOP-NEXT: vpperm %xmm5, %xmm3, %xmm0, %xmm0485; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0486; XOP-NEXT: vandnps %ymm0, %ymm2, %ymm0487; XOP-NEXT: retq488;489; AVX1-LABEL: var_shuffle_zero_v16i16:490; AVX1: # %bb.0:491; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2492; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]493; AVX1-NEXT: vpmaxuw %xmm3, %xmm2, %xmm4494; AVX1-NEXT: vpcmpeqw %xmm4, %xmm2, %xmm2495; AVX1-NEXT: vpmaxuw %xmm3, %xmm1, %xmm3496; AVX1-NEXT: vpcmpeqw %xmm3, %xmm1, %xmm3497; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2498; AVX1-NEXT: vorps %ymm1, %ymm2, %ymm1499; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [514,514,514,514,514,514,514,514]500; AVX1-NEXT: vpmullw %xmm3, %xmm1, %xmm4501; AVX1-NEXT: vbroadcastss {{.*#+}} xmm5 = [256,256,256,256,256,256,256,256]502; AVX1-NEXT: vpaddw %xmm5, %xmm4, %xmm4503; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1504; AVX1-NEXT: vpmullw %xmm3, %xmm1, %xmm1505; AVX1-NEXT: vpaddw %xmm5, %xmm1, %xmm1506; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]507; AVX1-NEXT: vpcmpgtb %xmm3, %xmm1, %xmm5508; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6509; AVX1-NEXT: vpshufb %xmm1, %xmm6, %xmm7510; AVX1-NEXT: vpshufb %xmm1, %xmm0, %xmm1511; AVX1-NEXT: vpblendvb %xmm5, %xmm7, %xmm1, %xmm1512; AVX1-NEXT: vpcmpgtb %xmm3, %xmm4, %xmm3513; AVX1-NEXT: vpshufb %xmm4, %xmm6, %xmm5514; AVX1-NEXT: vpshufb %xmm4, %xmm0, %xmm0515; AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm0, %xmm0516; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0517; AVX1-NEXT: vandnps %ymm0, %ymm2, %ymm0518; AVX1-NEXT: retq519;520; AVX2-LABEL: var_shuffle_zero_v16i16:521; AVX2: # %bb.0:522; AVX2-NEXT: vpmaxuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm2523; AVX2-NEXT: vpcmpeqw %ymm2, %ymm1, %ymm2524; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm1525; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514]526; AVX2-NEXT: vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1527; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm3528; AVX2-NEXT: vpshufb %ymm1, %ymm3, %ymm3529; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[2,3,2,3]530; AVX2-NEXT: vpshufb %ymm1, %ymm0, %ymm0531; AVX2-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1532; AVX2-NEXT: vpblendvb %ymm1, %ymm0, %ymm3, %ymm0533; AVX2-NEXT: vpandn %ymm0, %ymm2, %ymm0534; AVX2-NEXT: retq535;536; AVX512F-LABEL: var_shuffle_zero_v16i16:537; AVX512F: # %bb.0:538; AVX512F-NEXT: vpmaxuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm2539; AVX512F-NEXT: vpcmpeqw %ymm2, %ymm1, %ymm2540; AVX512F-NEXT: vpor %ymm1, %ymm2, %ymm1541; AVX512F-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514]542; AVX512F-NEXT: vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1543; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm3544; AVX512F-NEXT: vpshufb %ymm1, %ymm3, %ymm3545; AVX512F-NEXT: vpermq {{.*#+}} ymm0 = ymm0[2,3,2,3]546; AVX512F-NEXT: vpshufb %ymm1, %ymm0, %ymm0547; AVX512F-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1548; AVX512F-NEXT: vpblendvb %ymm1, %ymm0, %ymm3, %ymm0549; AVX512F-NEXT: vpandn %ymm0, %ymm2, %ymm0550; AVX512F-NEXT: retq551;552; AVX512BW-LABEL: var_shuffle_zero_v16i16:553; AVX512BW: # %bb.0:554; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1555; AVX512BW-NEXT: vpbroadcastw {{.*#+}} ymm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]556; AVX512BW-NEXT: vpcmpnleuw %zmm2, %zmm1, %k1557; AVX512BW-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2558; AVX512BW-NEXT: vmovdqu16 %zmm2, %zmm1 {%k1}559; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514]560; AVX512BW-NEXT: vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1561; AVX512BW-NEXT: vpermq {{.*#+}} ymm2 = ymm0[2,3,2,3]562; AVX512BW-NEXT: vpshufb %ymm1, %ymm2, %ymm2563; AVX512BW-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm0564; AVX512BW-NEXT: vpshufb %ymm1, %ymm0, %ymm0565; AVX512BW-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1566; AVX512BW-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0567; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1568; AVX512BW-NEXT: vmovdqu16 %zmm1, %zmm0 {%k1}569; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0570; AVX512BW-NEXT: retq571;572; AVX512VLF-LABEL: var_shuffle_zero_v16i16:573; AVX512VLF: # %bb.0:574; AVX512VLF-NEXT: vpmaxuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm2575; AVX512VLF-NEXT: vpcmpeqw %ymm2, %ymm1, %ymm2576; AVX512VLF-NEXT: vpor %ymm1, %ymm2, %ymm1577; AVX512VLF-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514]578; AVX512VLF-NEXT: vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1579; AVX512VLF-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm3580; AVX512VLF-NEXT: vpshufb %ymm1, %ymm3, %ymm3581; AVX512VLF-NEXT: vpermq {{.*#+}} ymm0 = ymm0[2,3,2,3]582; AVX512VLF-NEXT: vpshufb %ymm1, %ymm0, %ymm0583; AVX512VLF-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1584; AVX512VLF-NEXT: vpternlogq {{.*#+}} ymm1 = ymm3 ^ (ymm1 & (ymm0 ^ ymm3))585; AVX512VLF-NEXT: vpandn %ymm1, %ymm2, %ymm0586; AVX512VLF-NEXT: retq587;588; AVX512VLBW-LABEL: var_shuffle_zero_v16i16:589; AVX512VLBW: # %bb.0:590; AVX512VLBW-NEXT: vpcmpnleuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %k1591; AVX512VLBW-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2592; AVX512VLBW-NEXT: vmovdqu16 %ymm2, %ymm1 {%k1}593; AVX512VLBW-NEXT: vpermw %ymm0, %ymm1, %ymm0594; AVX512VLBW-NEXT: vpxor %xmm1, %xmm1, %xmm1595; AVX512VLBW-NEXT: vmovdqu16 %ymm1, %ymm0 {%k1}596; AVX512VLBW-NEXT: retq597;598; VLVBMI-LABEL: var_shuffle_zero_v16i16:599; VLVBMI: # %bb.0:600; VLVBMI-NEXT: vpcmpnleuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %k1601; VLVBMI-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2602; VLVBMI-NEXT: vmovdqu16 %ymm2, %ymm1 {%k1}603; VLVBMI-NEXT: vpermw %ymm0, %ymm1, %ymm0604; VLVBMI-NEXT: vpxor %xmm1, %xmm1, %xmm1605; VLVBMI-NEXT: vmovdqu16 %ymm1, %ymm0 {%k1}606; VLVBMI-NEXT: retq607 %cmp = icmp ugt <16 x i16> %indices, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>608 %or = select <16 x i1> %cmp, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, <16 x i16> %indices609 %idx0 = extractelement <16 x i16> %or, i64 0610 %idx1 = extractelement <16 x i16> %or, i64 1611 %idx2 = extractelement <16 x i16> %or, i64 2612 %idx3 = extractelement <16 x i16> %or, i64 3613 %idx4 = extractelement <16 x i16> %or, i64 4614 %idx5 = extractelement <16 x i16> %or, i64 5615 %idx6 = extractelement <16 x i16> %or, i64 6616 %idx7 = extractelement <16 x i16> %or, i64 7617 %idx8 = extractelement <16 x i16> %or, i64 8618 %idx9 = extractelement <16 x i16> %or, i64 9619 %idxA = extractelement <16 x i16> %or, i64 10620 %idxB = extractelement <16 x i16> %or, i64 11621 %idxC = extractelement <16 x i16> %or, i64 12622 %idxD = extractelement <16 x i16> %or, i64 13623 %idxE = extractelement <16 x i16> %or, i64 14624 %idxF = extractelement <16 x i16> %or, i64 15625 %elt0 = extractelement <16 x i16> %v, i16 %idx0626 %elt1 = extractelement <16 x i16> %v, i16 %idx1627 %elt2 = extractelement <16 x i16> %v, i16 %idx2628 %elt3 = extractelement <16 x i16> %v, i16 %idx3629 %elt4 = extractelement <16 x i16> %v, i16 %idx4630 %elt5 = extractelement <16 x i16> %v, i16 %idx5631 %elt6 = extractelement <16 x i16> %v, i16 %idx6632 %elt7 = extractelement <16 x i16> %v, i16 %idx7633 %elt8 = extractelement <16 x i16> %v, i16 %idx8634 %elt9 = extractelement <16 x i16> %v, i16 %idx9635 %eltA = extractelement <16 x i16> %v, i16 %idxA636 %eltB = extractelement <16 x i16> %v, i16 %idxB637 %eltC = extractelement <16 x i16> %v, i16 %idxC638 %eltD = extractelement <16 x i16> %v, i16 %idxD639 %eltE = extractelement <16 x i16> %v, i16 %idxE640 %eltF = extractelement <16 x i16> %v, i16 %idxF641 %vec0 = insertelement <16 x i16> poison, i16 %elt0, i64 0642 %vec1 = insertelement <16 x i16> %vec0, i16 %elt1, i64 1643 %vec2 = insertelement <16 x i16> %vec1, i16 %elt2, i64 2644 %vec3 = insertelement <16 x i16> %vec2, i16 %elt3, i64 3645 %vec4 = insertelement <16 x i16> %vec3, i16 %elt4, i64 4646 %vec5 = insertelement <16 x i16> %vec4, i16 %elt5, i64 5647 %vec6 = insertelement <16 x i16> %vec5, i16 %elt6, i64 6648 %vec7 = insertelement <16 x i16> %vec6, i16 %elt7, i64 7649 %vec8 = insertelement <16 x i16> %vec7, i16 %elt8, i64 8650 %vec9 = insertelement <16 x i16> %vec8, i16 %elt9, i64 9651 %vecA = insertelement <16 x i16> %vec9, i16 %eltA, i64 10652 %vecB = insertelement <16 x i16> %vecA, i16 %eltB, i64 11653 %vecC = insertelement <16 x i16> %vecB, i16 %eltC, i64 12654 %vecD = insertelement <16 x i16> %vecC, i16 %eltD, i64 13655 %vecE = insertelement <16 x i16> %vecD, i16 %eltE, i64 14656 %vecF = insertelement <16 x i16> %vecE, i16 %eltF, i64 15657 %res = select <16 x i1> %cmp, <16 x i16> zeroinitializer, <16 x i16> %vecF658 ret <16 x i16> %res659}660 661define <32 x i8> @var_shuffle_v32i8(<32 x i8> %v, <32 x i8> %indices) nounwind {662; XOP-LABEL: var_shuffle_v32i8:663; XOP: # %bb.0:664; XOP-NEXT: vextractf128 $1, %ymm1, %xmm2665; XOP-NEXT: vextractf128 $1, %ymm0, %xmm3666; XOP-NEXT: vpperm %xmm2, %xmm3, %xmm0, %xmm2667; XOP-NEXT: vpperm %xmm1, %xmm3, %xmm0, %xmm0668; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0669; XOP-NEXT: retq670;671; AVX1-LABEL: var_shuffle_v32i8:672; AVX1: # %bb.0:673; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2674; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]675; AVX1-NEXT: vpcmpgtb %xmm3, %xmm2, %xmm4676; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5677; AVX1-NEXT: vpshufb %xmm2, %xmm5, %xmm6678; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm2679; AVX1-NEXT: vpblendvb %xmm4, %xmm6, %xmm2, %xmm2680; AVX1-NEXT: vpcmpgtb %xmm3, %xmm1, %xmm3681; AVX1-NEXT: vpshufb %xmm1, %xmm5, %xmm4682; AVX1-NEXT: vpshufb %xmm1, %xmm0, %xmm0683; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm0, %xmm0684; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0685; AVX1-NEXT: retq686;687; AVX2-LABEL: var_shuffle_v32i8:688; AVX2: # %bb.0:689; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm0[2,3,2,3]690; AVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm2691; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm0692; AVX2-NEXT: vpshufb %ymm1, %ymm0, %ymm0693; AVX2-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1694; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0695; AVX2-NEXT: retq696;697; AVX512-LABEL: var_shuffle_v32i8:698; AVX512: # %bb.0:699; AVX512-NEXT: vpermq {{.*#+}} ymm2 = ymm0[2,3,2,3]700; AVX512-NEXT: vpshufb %ymm1, %ymm2, %ymm2701; AVX512-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm0702; AVX512-NEXT: vpshufb %ymm1, %ymm0, %ymm0703; AVX512-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1704; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0705; AVX512-NEXT: retq706;707; AVX512VLF-LABEL: var_shuffle_v32i8:708; AVX512VLF: # %bb.0:709; AVX512VLF-NEXT: vpermq {{.*#+}} ymm2 = ymm0[2,3,2,3]710; AVX512VLF-NEXT: vpshufb %ymm1, %ymm2, %ymm2711; AVX512VLF-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm0712; AVX512VLF-NEXT: vpshufb %ymm1, %ymm0, %ymm3713; AVX512VLF-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm0714; AVX512VLF-NEXT: vpternlogq {{.*#+}} ymm0 = ymm3 ^ (ymm0 & (ymm2 ^ ymm3))715; AVX512VLF-NEXT: retq716;717; AVX512VLBW-LABEL: var_shuffle_v32i8:718; AVX512VLBW: # %bb.0:719; AVX512VLBW-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm2720; AVX512VLBW-NEXT: vpshufb %ymm1, %ymm2, %ymm2721; AVX512VLBW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[2,3,2,3]722; AVX512VLBW-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %k1723; AVX512VLBW-NEXT: vpshufb %ymm1, %ymm0, %ymm2 {%k1}724; AVX512VLBW-NEXT: vmovdqa %ymm2, %ymm0725; AVX512VLBW-NEXT: retq726;727; VLVBMI-LABEL: var_shuffle_v32i8:728; VLVBMI: # %bb.0:729; VLVBMI-NEXT: vpermb %ymm0, %ymm1, %ymm0730; VLVBMI-NEXT: retq731 %index0 = extractelement <32 x i8> %indices, i32 0732 %index1 = extractelement <32 x i8> %indices, i32 1733 %index2 = extractelement <32 x i8> %indices, i32 2734 %index3 = extractelement <32 x i8> %indices, i32 3735 %index4 = extractelement <32 x i8> %indices, i32 4736 %index5 = extractelement <32 x i8> %indices, i32 5737 %index6 = extractelement <32 x i8> %indices, i32 6738 %index7 = extractelement <32 x i8> %indices, i32 7739 %index8 = extractelement <32 x i8> %indices, i32 8740 %index9 = extractelement <32 x i8> %indices, i32 9741 %index10 = extractelement <32 x i8> %indices, i32 10742 %index11 = extractelement <32 x i8> %indices, i32 11743 %index12 = extractelement <32 x i8> %indices, i32 12744 %index13 = extractelement <32 x i8> %indices, i32 13745 %index14 = extractelement <32 x i8> %indices, i32 14746 %index15 = extractelement <32 x i8> %indices, i32 15747 %index16 = extractelement <32 x i8> %indices, i32 16748 %index17 = extractelement <32 x i8> %indices, i32 17749 %index18 = extractelement <32 x i8> %indices, i32 18750 %index19 = extractelement <32 x i8> %indices, i32 19751 %index20 = extractelement <32 x i8> %indices, i32 20752 %index21 = extractelement <32 x i8> %indices, i32 21753 %index22 = extractelement <32 x i8> %indices, i32 22754 %index23 = extractelement <32 x i8> %indices, i32 23755 %index24 = extractelement <32 x i8> %indices, i32 24756 %index25 = extractelement <32 x i8> %indices, i32 25757 %index26 = extractelement <32 x i8> %indices, i32 26758 %index27 = extractelement <32 x i8> %indices, i32 27759 %index28 = extractelement <32 x i8> %indices, i32 28760 %index29 = extractelement <32 x i8> %indices, i32 29761 %index30 = extractelement <32 x i8> %indices, i32 30762 %index31 = extractelement <32 x i8> %indices, i32 31763 %v0 = extractelement <32 x i8> %v, i8 %index0764 %v1 = extractelement <32 x i8> %v, i8 %index1765 %v2 = extractelement <32 x i8> %v, i8 %index2766 %v3 = extractelement <32 x i8> %v, i8 %index3767 %v4 = extractelement <32 x i8> %v, i8 %index4768 %v5 = extractelement <32 x i8> %v, i8 %index5769 %v6 = extractelement <32 x i8> %v, i8 %index6770 %v7 = extractelement <32 x i8> %v, i8 %index7771 %v8 = extractelement <32 x i8> %v, i8 %index8772 %v9 = extractelement <32 x i8> %v, i8 %index9773 %v10 = extractelement <32 x i8> %v, i8 %index10774 %v11 = extractelement <32 x i8> %v, i8 %index11775 %v12 = extractelement <32 x i8> %v, i8 %index12776 %v13 = extractelement <32 x i8> %v, i8 %index13777 %v14 = extractelement <32 x i8> %v, i8 %index14778 %v15 = extractelement <32 x i8> %v, i8 %index15779 %v16 = extractelement <32 x i8> %v, i8 %index16780 %v17 = extractelement <32 x i8> %v, i8 %index17781 %v18 = extractelement <32 x i8> %v, i8 %index18782 %v19 = extractelement <32 x i8> %v, i8 %index19783 %v20 = extractelement <32 x i8> %v, i8 %index20784 %v21 = extractelement <32 x i8> %v, i8 %index21785 %v22 = extractelement <32 x i8> %v, i8 %index22786 %v23 = extractelement <32 x i8> %v, i8 %index23787 %v24 = extractelement <32 x i8> %v, i8 %index24788 %v25 = extractelement <32 x i8> %v, i8 %index25789 %v26 = extractelement <32 x i8> %v, i8 %index26790 %v27 = extractelement <32 x i8> %v, i8 %index27791 %v28 = extractelement <32 x i8> %v, i8 %index28792 %v29 = extractelement <32 x i8> %v, i8 %index29793 %v30 = extractelement <32 x i8> %v, i8 %index30794 %v31 = extractelement <32 x i8> %v, i8 %index31795 %ret0 = insertelement <32 x i8> undef, i8 %v0, i32 0796 %ret1 = insertelement <32 x i8> %ret0, i8 %v1, i32 1797 %ret2 = insertelement <32 x i8> %ret1, i8 %v2, i32 2798 %ret3 = insertelement <32 x i8> %ret2, i8 %v3, i32 3799 %ret4 = insertelement <32 x i8> %ret3, i8 %v4, i32 4800 %ret5 = insertelement <32 x i8> %ret4, i8 %v5, i32 5801 %ret6 = insertelement <32 x i8> %ret5, i8 %v6, i32 6802 %ret7 = insertelement <32 x i8> %ret6, i8 %v7, i32 7803 %ret8 = insertelement <32 x i8> %ret7, i8 %v8, i32 8804 %ret9 = insertelement <32 x i8> %ret8, i8 %v9, i32 9805 %ret10 = insertelement <32 x i8> %ret9, i8 %v10, i32 10806 %ret11 = insertelement <32 x i8> %ret10, i8 %v11, i32 11807 %ret12 = insertelement <32 x i8> %ret11, i8 %v12, i32 12808 %ret13 = insertelement <32 x i8> %ret12, i8 %v13, i32 13809 %ret14 = insertelement <32 x i8> %ret13, i8 %v14, i32 14810 %ret15 = insertelement <32 x i8> %ret14, i8 %v15, i32 15811 %ret16 = insertelement <32 x i8> %ret15, i8 %v16, i32 16812 %ret17 = insertelement <32 x i8> %ret16, i8 %v17, i32 17813 %ret18 = insertelement <32 x i8> %ret17, i8 %v18, i32 18814 %ret19 = insertelement <32 x i8> %ret18, i8 %v19, i32 19815 %ret20 = insertelement <32 x i8> %ret19, i8 %v20, i32 20816 %ret21 = insertelement <32 x i8> %ret20, i8 %v21, i32 21817 %ret22 = insertelement <32 x i8> %ret21, i8 %v22, i32 22818 %ret23 = insertelement <32 x i8> %ret22, i8 %v23, i32 23819 %ret24 = insertelement <32 x i8> %ret23, i8 %v24, i32 24820 %ret25 = insertelement <32 x i8> %ret24, i8 %v25, i32 25821 %ret26 = insertelement <32 x i8> %ret25, i8 %v26, i32 26822 %ret27 = insertelement <32 x i8> %ret26, i8 %v27, i32 27823 %ret28 = insertelement <32 x i8> %ret27, i8 %v28, i32 28824 %ret29 = insertelement <32 x i8> %ret28, i8 %v29, i32 29825 %ret30 = insertelement <32 x i8> %ret29, i8 %v30, i32 30826 %ret31 = insertelement <32 x i8> %ret30, i8 %v31, i32 31827 ret <32 x i8> %ret31828}829 830define <32 x i8> @var_shuffle_zero_v32i8(<32 x i8> %v, <32 x i8> %indices) nounwind {831; XOP-LABEL: var_shuffle_zero_v32i8:832; XOP: # %bb.0:833; XOP-NEXT: vextractf128 $1, %ymm1, %xmm2834; XOP-NEXT: vbroadcastss {{.*#+}} xmm3 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31]835; XOP-NEXT: vpcomgtub %xmm3, %xmm2, %xmm2836; XOP-NEXT: vpcomgtub %xmm3, %xmm1, %xmm3837; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2838; XOP-NEXT: vorps %ymm1, %ymm2, %ymm1839; XOP-NEXT: vextractf128 $1, %ymm1, %xmm3840; XOP-NEXT: vextractf128 $1, %ymm0, %xmm4841; XOP-NEXT: vpperm %xmm3, %xmm4, %xmm0, %xmm3842; XOP-NEXT: vpperm %xmm1, %xmm4, %xmm0, %xmm0843; XOP-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0844; XOP-NEXT: vandnps %ymm0, %ymm2, %ymm0845; XOP-NEXT: retq846;847; AVX1-LABEL: var_shuffle_zero_v32i8:848; AVX1: # %bb.0:849; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2850; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]851; AVX1-NEXT: vpmaxub %xmm3, %xmm2, %xmm4852; AVX1-NEXT: vpcmpeqb %xmm4, %xmm2, %xmm2853; AVX1-NEXT: vpmaxub %xmm3, %xmm1, %xmm3854; AVX1-NEXT: vpcmpeqb %xmm3, %xmm1, %xmm3855; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2856; AVX1-NEXT: vorps %ymm1, %ymm2, %ymm1857; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3858; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]859; AVX1-NEXT: vpcmpgtb %xmm4, %xmm3, %xmm5860; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6861; AVX1-NEXT: vpshufb %xmm3, %xmm6, %xmm7862; AVX1-NEXT: vpshufb %xmm3, %xmm0, %xmm3863; AVX1-NEXT: vpblendvb %xmm5, %xmm7, %xmm3, %xmm3864; AVX1-NEXT: vpcmpgtb %xmm4, %xmm1, %xmm4865; AVX1-NEXT: vpshufb %xmm1, %xmm6, %xmm5866; AVX1-NEXT: vpshufb %xmm1, %xmm0, %xmm0867; AVX1-NEXT: vpblendvb %xmm4, %xmm5, %xmm0, %xmm0868; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0869; AVX1-NEXT: vandnps %ymm0, %ymm2, %ymm0870; AVX1-NEXT: retq871;872; AVX2-LABEL: var_shuffle_zero_v32i8:873; AVX2: # %bb.0:874; AVX2-NEXT: vpmaxub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm2875; AVX2-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm2876; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm1877; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm3878; AVX2-NEXT: vpshufb %ymm1, %ymm3, %ymm3879; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[2,3,2,3]880; AVX2-NEXT: vpshufb %ymm1, %ymm0, %ymm0881; AVX2-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1882; AVX2-NEXT: vpblendvb %ymm1, %ymm0, %ymm3, %ymm0883; AVX2-NEXT: vpandn %ymm0, %ymm2, %ymm0884; AVX2-NEXT: retq885;886; AVX512F-LABEL: var_shuffle_zero_v32i8:887; AVX512F: # %bb.0:888; AVX512F-NEXT: vpmaxub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm2889; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm2890; AVX512F-NEXT: vpor %ymm1, %ymm2, %ymm1891; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm3892; AVX512F-NEXT: vpshufb %ymm1, %ymm3, %ymm3893; AVX512F-NEXT: vpermq {{.*#+}} ymm0 = ymm0[2,3,2,3]894; AVX512F-NEXT: vpshufb %ymm1, %ymm0, %ymm0895; AVX512F-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1896; AVX512F-NEXT: vpblendvb %ymm1, %ymm0, %ymm3, %ymm0897; AVX512F-NEXT: vpandn %ymm0, %ymm2, %ymm0898; AVX512F-NEXT: retq899;900; AVX512BW-LABEL: var_shuffle_zero_v32i8:901; AVX512BW: # %bb.0:902; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1903; AVX512BW-NEXT: vpbroadcastb {{.*#+}} ymm2 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31]904; AVX512BW-NEXT: vpcmpnleub %zmm2, %zmm1, %k1905; AVX512BW-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2906; AVX512BW-NEXT: vmovdqu8 %zmm2, %zmm1 {%k1}907; AVX512BW-NEXT: vpermq {{.*#+}} ymm2 = ymm0[2,3,2,3]908; AVX512BW-NEXT: vpshufb %ymm1, %ymm2, %ymm2909; AVX512BW-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm0910; AVX512BW-NEXT: vpshufb %ymm1, %ymm0, %ymm0911; AVX512BW-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1912; AVX512BW-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0913; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1914; AVX512BW-NEXT: vmovdqu8 %zmm1, %zmm0 {%k1}915; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0916; AVX512BW-NEXT: retq917;918; AVX512VLF-LABEL: var_shuffle_zero_v32i8:919; AVX512VLF: # %bb.0:920; AVX512VLF-NEXT: vpmaxub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm2921; AVX512VLF-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm2922; AVX512VLF-NEXT: vpor %ymm1, %ymm2, %ymm1923; AVX512VLF-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm3924; AVX512VLF-NEXT: vpshufb %ymm1, %ymm3, %ymm3925; AVX512VLF-NEXT: vpermq {{.*#+}} ymm0 = ymm0[2,3,2,3]926; AVX512VLF-NEXT: vpshufb %ymm1, %ymm0, %ymm0927; AVX512VLF-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1928; AVX512VLF-NEXT: vpternlogq {{.*#+}} ymm1 = ymm3 ^ (ymm1 & (ymm0 ^ ymm3))929; AVX512VLF-NEXT: vpandn %ymm1, %ymm2, %ymm0930; AVX512VLF-NEXT: retq931;932; AVX512VLBW-LABEL: var_shuffle_zero_v32i8:933; AVX512VLBW: # %bb.0:934; AVX512VLBW-NEXT: vpcmpnleub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %k1935; AVX512VLBW-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2936; AVX512VLBW-NEXT: vmovdqu8 %ymm2, %ymm1 {%k1}937; AVX512VLBW-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm2938; AVX512VLBW-NEXT: vpshufb %ymm1, %ymm2, %ymm2939; AVX512VLBW-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %k2940; AVX512VLBW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[2,3,2,3]941; AVX512VLBW-NEXT: vpshufb %ymm1, %ymm0, %ymm2 {%k2}942; AVX512VLBW-NEXT: vpxor %xmm0, %xmm0, %xmm0943; AVX512VLBW-NEXT: vmovdqu8 %ymm0, %ymm2 {%k1}944; AVX512VLBW-NEXT: vmovdqa %ymm2, %ymm0945; AVX512VLBW-NEXT: retq946;947; VLVBMI-LABEL: var_shuffle_zero_v32i8:948; VLVBMI: # %bb.0:949; VLVBMI-NEXT: vpcmpnleub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %k1950; VLVBMI-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2951; VLVBMI-NEXT: vmovdqu8 %ymm2, %ymm1 {%k1}952; VLVBMI-NEXT: vpermb %ymm0, %ymm1, %ymm0953; VLVBMI-NEXT: vpxor %xmm1, %xmm1, %xmm1954; VLVBMI-NEXT: vmovdqu8 %ymm1, %ymm0 {%k1}955; VLVBMI-NEXT: retq956 %cmp = icmp ugt <32 x i8> %indices, <i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31>957 %or = select <32 x i1> %cmp, <32 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, 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>, <32 x i8> %indices958 %idx00 = extractelement <32 x i8> %or, i64 0959 %idx01 = extractelement <32 x i8> %or, i64 1960 %idx02 = extractelement <32 x i8> %or, i64 2961 %idx03 = extractelement <32 x i8> %or, i64 3962 %idx04 = extractelement <32 x i8> %or, i64 4963 %idx05 = extractelement <32 x i8> %or, i64 5964 %idx06 = extractelement <32 x i8> %or, i64 6965 %idx07 = extractelement <32 x i8> %or, i64 7966 %idx08 = extractelement <32 x i8> %or, i64 8967 %idx09 = extractelement <32 x i8> %or, i64 9968 %idx0A = extractelement <32 x i8> %or, i64 10969 %idx0B = extractelement <32 x i8> %or, i64 11970 %idx0C = extractelement <32 x i8> %or, i64 12971 %idx0D = extractelement <32 x i8> %or, i64 13972 %idx0E = extractelement <32 x i8> %or, i64 14973 %idx0F = extractelement <32 x i8> %or, i64 15974 %idx10 = extractelement <32 x i8> %or, i64 16975 %idx11 = extractelement <32 x i8> %or, i64 17976 %idx12 = extractelement <32 x i8> %or, i64 18977 %idx13 = extractelement <32 x i8> %or, i64 19978 %idx14 = extractelement <32 x i8> %or, i64 20979 %idx15 = extractelement <32 x i8> %or, i64 21980 %idx16 = extractelement <32 x i8> %or, i64 22981 %idx17 = extractelement <32 x i8> %or, i64 23982 %idx18 = extractelement <32 x i8> %or, i64 24983 %idx19 = extractelement <32 x i8> %or, i64 25984 %idx1A = extractelement <32 x i8> %or, i64 26985 %idx1B = extractelement <32 x i8> %or, i64 27986 %idx1C = extractelement <32 x i8> %or, i64 28987 %idx1D = extractelement <32 x i8> %or, i64 29988 %idx1E = extractelement <32 x i8> %or, i64 30989 %idx1F = extractelement <32 x i8> %or, i64 31990 %elt00 = extractelement <32 x i8> %v, i8 %idx00991 %elt01 = extractelement <32 x i8> %v, i8 %idx01992 %elt02 = extractelement <32 x i8> %v, i8 %idx02993 %elt03 = extractelement <32 x i8> %v, i8 %idx03994 %elt04 = extractelement <32 x i8> %v, i8 %idx04995 %elt05 = extractelement <32 x i8> %v, i8 %idx05996 %elt06 = extractelement <32 x i8> %v, i8 %idx06997 %elt07 = extractelement <32 x i8> %v, i8 %idx07998 %elt08 = extractelement <32 x i8> %v, i8 %idx08999 %elt09 = extractelement <32 x i8> %v, i8 %idx091000 %elt0A = extractelement <32 x i8> %v, i8 %idx0A1001 %elt0B = extractelement <32 x i8> %v, i8 %idx0B1002 %elt0C = extractelement <32 x i8> %v, i8 %idx0C1003 %elt0D = extractelement <32 x i8> %v, i8 %idx0D1004 %elt0E = extractelement <32 x i8> %v, i8 %idx0E1005 %elt0F = extractelement <32 x i8> %v, i8 %idx0F1006 %elt10 = extractelement <32 x i8> %v, i8 %idx101007 %elt11 = extractelement <32 x i8> %v, i8 %idx111008 %elt12 = extractelement <32 x i8> %v, i8 %idx121009 %elt13 = extractelement <32 x i8> %v, i8 %idx131010 %elt14 = extractelement <32 x i8> %v, i8 %idx141011 %elt15 = extractelement <32 x i8> %v, i8 %idx151012 %elt16 = extractelement <32 x i8> %v, i8 %idx161013 %elt17 = extractelement <32 x i8> %v, i8 %idx171014 %elt18 = extractelement <32 x i8> %v, i8 %idx181015 %elt19 = extractelement <32 x i8> %v, i8 %idx191016 %elt1A = extractelement <32 x i8> %v, i8 %idx1A1017 %elt1B = extractelement <32 x i8> %v, i8 %idx1B1018 %elt1C = extractelement <32 x i8> %v, i8 %idx1C1019 %elt1D = extractelement <32 x i8> %v, i8 %idx1D1020 %elt1E = extractelement <32 x i8> %v, i8 %idx1E1021 %elt1F = extractelement <32 x i8> %v, i8 %idx1F1022 %vec00 = insertelement <32 x i8> poison, i8 %elt00, i64 01023 %vec01 = insertelement <32 x i8> %vec00, i8 %elt01, i64 11024 %vec02 = insertelement <32 x i8> %vec01, i8 %elt02, i64 21025 %vec03 = insertelement <32 x i8> %vec02, i8 %elt03, i64 31026 %vec04 = insertelement <32 x i8> %vec03, i8 %elt04, i64 41027 %vec05 = insertelement <32 x i8> %vec04, i8 %elt05, i64 51028 %vec06 = insertelement <32 x i8> %vec05, i8 %elt06, i64 61029 %vec07 = insertelement <32 x i8> %vec06, i8 %elt07, i64 71030 %vec08 = insertelement <32 x i8> %vec07, i8 %elt08, i64 81031 %vec09 = insertelement <32 x i8> %vec08, i8 %elt09, i64 91032 %vec0A = insertelement <32 x i8> %vec09, i8 %elt0A, i64 101033 %vec0B = insertelement <32 x i8> %vec0A, i8 %elt0B, i64 111034 %vec0C = insertelement <32 x i8> %vec0B, i8 %elt0C, i64 121035 %vec0D = insertelement <32 x i8> %vec0C, i8 %elt0D, i64 131036 %vec0E = insertelement <32 x i8> %vec0D, i8 %elt0E, i64 141037 %vec0F = insertelement <32 x i8> %vec0E, i8 %elt0F, i64 151038 %vec10 = insertelement <32 x i8> %vec0F, i8 %elt10, i64 161039 %vec11 = insertelement <32 x i8> %vec10, i8 %elt11, i64 171040 %vec12 = insertelement <32 x i8> %vec11, i8 %elt12, i64 181041 %vec13 = insertelement <32 x i8> %vec12, i8 %elt13, i64 191042 %vec14 = insertelement <32 x i8> %vec13, i8 %elt14, i64 201043 %vec15 = insertelement <32 x i8> %vec14, i8 %elt15, i64 211044 %vec16 = insertelement <32 x i8> %vec15, i8 %elt16, i64 221045 %vec17 = insertelement <32 x i8> %vec16, i8 %elt17, i64 231046 %vec18 = insertelement <32 x i8> %vec17, i8 %elt18, i64 241047 %vec19 = insertelement <32 x i8> %vec18, i8 %elt19, i64 251048 %vec1A = insertelement <32 x i8> %vec19, i8 %elt1A, i64 261049 %vec1B = insertelement <32 x i8> %vec1A, i8 %elt1B, i64 271050 %vec1C = insertelement <32 x i8> %vec1B, i8 %elt1C, i64 281051 %vec1D = insertelement <32 x i8> %vec1C, i8 %elt1D, i64 291052 %vec1E = insertelement <32 x i8> %vec1D, i8 %elt1E, i64 301053 %vec1F = insertelement <32 x i8> %vec1E, i8 %elt1F, i64 311054 %res = select <32 x i1> %cmp, <32 x i8> zeroinitializer, <32 x i8> %vec1F1055 ret <32 x i8> %res1056}1057 1058define <4 x double> @var_shuffle_v4f64(<4 x double> %v, <4 x i64> %indices) nounwind {1059; XOP-LABEL: var_shuffle_v4f64:1060; XOP: # %bb.0:1061; XOP-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3,2,3]1062; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01063; XOP-NEXT: vpaddq %xmm1, %xmm1, %xmm31064; XOP-NEXT: vextractf128 $1, %ymm1, %xmm11065; XOP-NEXT: vpaddq %xmm1, %xmm1, %xmm11066; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm11067; XOP-NEXT: vpermil2pd $0, %ymm1, %ymm2, %ymm0, %ymm01068; XOP-NEXT: retq1069;1070; AVX1-LABEL: var_shuffle_v4f64:1071; AVX1: # %bb.0:1072; AVX1-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3,2,3]1073; AVX1-NEXT: vpaddq %xmm1, %xmm1, %xmm31074; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm11075; AVX1-NEXT: vpaddq %xmm1, %xmm1, %xmm11076; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm41077; AVX1-NEXT: vpermilpd %ymm4, %ymm2, %ymm21078; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01079; AVX1-NEXT: vpermilpd %ymm4, %ymm0, %ymm01080; AVX1-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm31081; AVX1-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}+16(%rip), %xmm1, %xmm11082; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm11083; AVX1-NEXT: vblendvpd %ymm1, %ymm2, %ymm0, %ymm01084; AVX1-NEXT: retq1085;1086; AVX2-LABEL: var_shuffle_v4f64:1087; AVX2: # %bb.0:1088; AVX2-NEXT: vpaddq %ymm1, %ymm1, %ymm11089; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [2,2,2,2]1090; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm21091; AVX2-NEXT: vpermpd {{.*#+}} ymm3 = ymm0[2,3,2,3]1092; AVX2-NEXT: vpermilpd %ymm1, %ymm3, %ymm31093; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,1,0,1]1094; AVX2-NEXT: vpermilpd %ymm1, %ymm0, %ymm01095; AVX2-NEXT: vblendvpd %ymm2, %ymm3, %ymm0, %ymm01096; AVX2-NEXT: retq1097;1098; AVX512-LABEL: var_shuffle_v4f64:1099; AVX512: # %bb.0:1100; AVX512-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm11101; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01102; AVX512-NEXT: vpermpd %zmm0, %zmm1, %zmm01103; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01104; AVX512-NEXT: retq1105;1106; AVX512VL-LABEL: var_shuffle_v4f64:1107; AVX512VL: # %bb.0:1108; AVX512VL-NEXT: vpermpd %ymm0, %ymm1, %ymm01109; AVX512VL-NEXT: retq1110 %index0 = extractelement <4 x i64> %indices, i32 01111 %index1 = extractelement <4 x i64> %indices, i32 11112 %index2 = extractelement <4 x i64> %indices, i32 21113 %index3 = extractelement <4 x i64> %indices, i32 31114 %v0 = extractelement <4 x double> %v, i64 %index01115 %v1 = extractelement <4 x double> %v, i64 %index11116 %v2 = extractelement <4 x double> %v, i64 %index21117 %v3 = extractelement <4 x double> %v, i64 %index31118 %ret0 = insertelement <4 x double> undef, double %v0, i32 01119 %ret1 = insertelement <4 x double> %ret0, double %v1, i32 11120 %ret2 = insertelement <4 x double> %ret1, double %v2, i32 21121 %ret3 = insertelement <4 x double> %ret2, double %v3, i32 31122 ret <4 x double> %ret31123}1124 1125define <4 x double> @var_shuffle_zero_v4f64(<4 x double> %v, <4 x i64> %indices) nounwind {1126; XOP-LABEL: var_shuffle_zero_v4f64:1127; XOP: # %bb.0:1128; XOP-NEXT: vextractf128 $1, %ymm1, %xmm21129; XOP-NEXT: vpmovsxbq {{.*#+}} xmm3 = [3,3]1130; XOP-NEXT: vpcomgtuq %xmm3, %xmm2, %xmm21131; XOP-NEXT: vpcomgtuq %xmm3, %xmm1, %xmm31132; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm21133; XOP-NEXT: vorps %ymm1, %ymm2, %ymm11134; XOP-NEXT: vpaddq %xmm1, %xmm1, %xmm31135; XOP-NEXT: vextractf128 $1, %ymm1, %xmm11136; XOP-NEXT: vpaddq %xmm1, %xmm1, %xmm11137; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm11138; XOP-NEXT: vperm2f128 {{.*#+}} ymm3 = ymm0[2,3,2,3]1139; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01140; XOP-NEXT: vpermil2pd $0, %ymm1, %ymm3, %ymm0, %ymm01141; XOP-NEXT: vandnps %ymm0, %ymm2, %ymm01142; XOP-NEXT: retq1143;1144; AVX1-LABEL: var_shuffle_zero_v4f64:1145; AVX1: # %bb.0:1146; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21147; AVX1-NEXT: vmovddup {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]1148; AVX1-NEXT: # xmm3 = mem[0,0]1149; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm21150; AVX1-NEXT: vmovddup {{.*#+}} xmm4 = [9223372036854775811,9223372036854775811]1151; AVX1-NEXT: # xmm4 = mem[0,0]1152; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm21153; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm31154; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm31155; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm21156; AVX1-NEXT: vorps %ymm1, %ymm2, %ymm11157; AVX1-NEXT: vpaddq %xmm1, %xmm1, %xmm31158; AVX1-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm41159; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm11160; AVX1-NEXT: vpaddq %xmm1, %xmm1, %xmm11161; AVX1-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}+16(%rip), %xmm1, %xmm51162; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm4, %ymm41163; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm11164; AVX1-NEXT: vperm2f128 {{.*#+}} ymm3 = ymm0[2,3,2,3]1165; AVX1-NEXT: vpermilpd %ymm1, %ymm3, %ymm31166; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01167; AVX1-NEXT: vpermilpd %ymm1, %ymm0, %ymm01168; AVX1-NEXT: vblendvpd %ymm4, %ymm3, %ymm0, %ymm01169; AVX1-NEXT: vandnps %ymm0, %ymm2, %ymm01170; AVX1-NEXT: retq1171;1172; AVX2-LABEL: var_shuffle_zero_v4f64:1173; AVX2: # %bb.0:1174; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]1175; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm21176; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775811,9223372036854775811,9223372036854775811,9223372036854775811]1177; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm21178; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm11179; AVX2-NEXT: vpaddq %ymm1, %ymm1, %ymm11180; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [2,2,2,2]1181; AVX2-NEXT: vpcmpgtq %ymm3, %ymm1, %ymm31182; AVX2-NEXT: vpermpd {{.*#+}} ymm4 = ymm0[2,3,2,3]1183; AVX2-NEXT: vpermilpd %ymm1, %ymm4, %ymm41184; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,1,0,1]1185; AVX2-NEXT: vpermilpd %ymm1, %ymm0, %ymm01186; AVX2-NEXT: vblendvpd %ymm3, %ymm4, %ymm0, %ymm01187; AVX2-NEXT: vpandn %ymm0, %ymm2, %ymm01188; AVX2-NEXT: retq1189;1190; AVX512-LABEL: var_shuffle_zero_v4f64:1191; AVX512: # %bb.0:1192; AVX512-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm11193; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01194; AVX512-NEXT: vpbroadcastq {{.*#+}} ymm2 = [3,3,3,3]1195; AVX512-NEXT: vpcmpleuq %zmm2, %zmm1, %k11196; AVX512-NEXT: vpcmpnleuq %zmm2, %zmm1, %k21197; AVX512-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm21198; AVX512-NEXT: vmovdqa64 %zmm2, %zmm1 {%k2}1199; AVX512-NEXT: vpermpd %zmm0, %zmm1, %zmm0 {%k1} {z}1200; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01201; AVX512-NEXT: retq1202;1203; AVX512VL-LABEL: var_shuffle_zero_v4f64:1204; AVX512VL: # %bb.0:1205; AVX512VL-NEXT: vpcmpnleuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm1, %k11206; AVX512VL-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm21207; AVX512VL-NEXT: vmovdqa64 %ymm2, %ymm1 {%k1}1208; AVX512VL-NEXT: vpermq %ymm0, %ymm1, %ymm01209; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm11210; AVX512VL-NEXT: vmovapd %ymm1, %ymm0 {%k1}1211; AVX512VL-NEXT: retq1212 %cmp = icmp ugt <4 x i64> %indices, <i64 3, i64 3, i64 3, i64 3>1213 %or = select <4 x i1> %cmp, <4 x i64> <i64 -1, i64 -1, i64 -1, i64 -1>, <4 x i64> %indices1214 %idx0 = extractelement <4 x i64> %or, i64 01215 %idx1 = extractelement <4 x i64> %or, i64 11216 %idx2 = extractelement <4 x i64> %or, i64 21217 %idx3 = extractelement <4 x i64> %or, i64 31218 %elt0 = extractelement <4 x double> %v, i64 %idx01219 %elt1 = extractelement <4 x double> %v, i64 %idx11220 %elt2 = extractelement <4 x double> %v, i64 %idx21221 %elt3 = extractelement <4 x double> %v, i64 %idx31222 %vec0 = insertelement <4 x double> poison, double %elt0, i64 01223 %vec1 = insertelement <4 x double> %vec0, double %elt1, i64 11224 %vec2 = insertelement <4 x double> %vec1, double %elt2, i64 21225 %vec3 = insertelement <4 x double> %vec2, double %elt3, i64 31226 %res = select <4 x i1> %cmp, <4 x double> zeroinitializer, <4 x double> %vec31227 ret <4 x double> %res1228}1229 1230define <8 x float> @var_shuffle_v8f32(<8 x float> %v, <8 x i32> %indices) nounwind {1231; XOP-LABEL: var_shuffle_v8f32:1232; XOP: # %bb.0:1233; XOP-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3,2,3]1234; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01235; XOP-NEXT: vpermil2ps $0, %ymm1, %ymm2, %ymm0, %ymm01236; XOP-NEXT: retq1237;1238; AVX1-LABEL: var_shuffle_v8f32:1239; AVX1: # %bb.0:1240; AVX1-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3,2,3]1241; AVX1-NEXT: vpermilps %ymm1, %ymm2, %ymm21242; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01243; AVX1-NEXT: vpermilps %ymm1, %ymm0, %ymm01244; AVX1-NEXT: vpcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm31245; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm11246; AVX1-NEXT: vpcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}+16(%rip), %xmm1, %xmm11247; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm11248; AVX1-NEXT: vblendvps %ymm1, %ymm2, %ymm0, %ymm01249; AVX1-NEXT: retq1250;1251; INT256-LABEL: var_shuffle_v8f32:1252; INT256: # %bb.0:1253; INT256-NEXT: vpermps %ymm0, %ymm1, %ymm01254; INT256-NEXT: retq1255 %index0 = extractelement <8 x i32> %indices, i32 01256 %index1 = extractelement <8 x i32> %indices, i32 11257 %index2 = extractelement <8 x i32> %indices, i32 21258 %index3 = extractelement <8 x i32> %indices, i32 31259 %index4 = extractelement <8 x i32> %indices, i32 41260 %index5 = extractelement <8 x i32> %indices, i32 51261 %index6 = extractelement <8 x i32> %indices, i32 61262 %index7 = extractelement <8 x i32> %indices, i32 71263 %v0 = extractelement <8 x float> %v, i32 %index01264 %v1 = extractelement <8 x float> %v, i32 %index11265 %v2 = extractelement <8 x float> %v, i32 %index21266 %v3 = extractelement <8 x float> %v, i32 %index31267 %v4 = extractelement <8 x float> %v, i32 %index41268 %v5 = extractelement <8 x float> %v, i32 %index51269 %v6 = extractelement <8 x float> %v, i32 %index61270 %v7 = extractelement <8 x float> %v, i32 %index71271 %ret0 = insertelement <8 x float> undef, float %v0, i32 01272 %ret1 = insertelement <8 x float> %ret0, float %v1, i32 11273 %ret2 = insertelement <8 x float> %ret1, float %v2, i32 21274 %ret3 = insertelement <8 x float> %ret2, float %v3, i32 31275 %ret4 = insertelement <8 x float> %ret3, float %v4, i32 41276 %ret5 = insertelement <8 x float> %ret4, float %v5, i32 51277 %ret6 = insertelement <8 x float> %ret5, float %v6, i32 61278 %ret7 = insertelement <8 x float> %ret6, float %v7, i32 71279 ret <8 x float> %ret71280}1281 1282define <8 x float> @var_shuffle_zero_v8f32(<8 x float> %v, <8 x i32> %indices) nounwind {1283; XOP-LABEL: var_shuffle_zero_v8f32:1284; XOP: # %bb.0:1285; XOP-NEXT: vextractf128 $1, %ymm1, %xmm21286; XOP-NEXT: vbroadcastss {{.*#+}} xmm3 = [7,7,7,7]1287; XOP-NEXT: vpcomgtud %xmm3, %xmm2, %xmm21288; XOP-NEXT: vpcomgtud %xmm3, %xmm1, %xmm31289; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm21290; XOP-NEXT: vorps %ymm1, %ymm2, %ymm11291; XOP-NEXT: vperm2f128 {{.*#+}} ymm3 = ymm0[2,3,2,3]1292; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01293; XOP-NEXT: vpermil2ps $0, %ymm1, %ymm3, %ymm0, %ymm01294; XOP-NEXT: vandnps %ymm0, %ymm2, %ymm01295; XOP-NEXT: retq1296;1297; AVX1-LABEL: var_shuffle_zero_v8f32:1298; AVX1: # %bb.0:1299; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21300; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [8,8,8,8]1301; AVX1-NEXT: vpmaxud %xmm3, %xmm2, %xmm41302; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm21303; AVX1-NEXT: vpmaxud %xmm3, %xmm1, %xmm31304; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm31305; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm21306; AVX1-NEXT: vorps %ymm1, %ymm2, %ymm11307; AVX1-NEXT: vpcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm31308; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm41309; AVX1-NEXT: vpcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}+16(%rip), %xmm4, %xmm41310; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm31311; AVX1-NEXT: vperm2f128 {{.*#+}} ymm4 = ymm0[2,3,2,3]1312; AVX1-NEXT: vpermilps %ymm1, %ymm4, %ymm41313; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01314; AVX1-NEXT: vpermilps %ymm1, %ymm0, %ymm01315; AVX1-NEXT: vblendvps %ymm3, %ymm4, %ymm0, %ymm01316; AVX1-NEXT: vandnps %ymm0, %ymm2, %ymm01317; AVX1-NEXT: retq1318;1319; AVX2-LABEL: var_shuffle_zero_v8f32:1320; AVX2: # %bb.0:1321; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [8,8,8,8,8,8,8,8]1322; AVX2-NEXT: vpmaxud %ymm2, %ymm1, %ymm21323; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm21324; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm11325; AVX2-NEXT: vpermd %ymm0, %ymm1, %ymm01326; AVX2-NEXT: vpandn %ymm0, %ymm2, %ymm01327; AVX2-NEXT: retq1328;1329; AVX512-LABEL: var_shuffle_zero_v8f32:1330; AVX512: # %bb.0:1331; AVX512-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm11332; AVX512-NEXT: vpcmpnleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm1, %k11333; AVX512-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm21334; AVX512-NEXT: vmovdqa32 %zmm2, %zmm1 {%k1}1335; AVX512-NEXT: vpermd %ymm0, %ymm1, %ymm01336; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm11337; AVX512-NEXT: vmovaps %zmm1, %zmm0 {%k1}1338; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01339; AVX512-NEXT: retq1340;1341; AVX512VL-LABEL: var_shuffle_zero_v8f32:1342; AVX512VL: # %bb.0:1343; AVX512VL-NEXT: vpcmpnleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %k11344; AVX512VL-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm21345; AVX512VL-NEXT: vmovdqa32 %ymm2, %ymm1 {%k1}1346; AVX512VL-NEXT: vpermd %ymm0, %ymm1, %ymm01347; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm11348; AVX512VL-NEXT: vmovaps %ymm1, %ymm0 {%k1}1349; AVX512VL-NEXT: retq1350 %cmp = icmp ugt <8 x i32> %indices, <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>1351 %or = select <8 x i1> %cmp, <8 x i32> <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>, <8 x i32> %indices1352 %idx0 = extractelement <8 x i32> %or, i64 01353 %idx1 = extractelement <8 x i32> %or, i64 11354 %idx2 = extractelement <8 x i32> %or, i64 21355 %idx3 = extractelement <8 x i32> %or, i64 31356 %idx4 = extractelement <8 x i32> %or, i64 41357 %idx5 = extractelement <8 x i32> %or, i64 51358 %idx6 = extractelement <8 x i32> %or, i64 61359 %idx7 = extractelement <8 x i32> %or, i64 71360 %elt0 = extractelement <8 x float> %v, i32 %idx01361 %elt1 = extractelement <8 x float> %v, i32 %idx11362 %elt2 = extractelement <8 x float> %v, i32 %idx21363 %elt3 = extractelement <8 x float> %v, i32 %idx31364 %elt4 = extractelement <8 x float> %v, i32 %idx41365 %elt5 = extractelement <8 x float> %v, i32 %idx51366 %elt6 = extractelement <8 x float> %v, i32 %idx61367 %elt7 = extractelement <8 x float> %v, i32 %idx71368 %vec0 = insertelement <8 x float> poison, float %elt0, i64 01369 %vec1 = insertelement <8 x float> %vec0, float %elt1, i64 11370 %vec2 = insertelement <8 x float> %vec1, float %elt2, i64 21371 %vec3 = insertelement <8 x float> %vec2, float %elt3, i64 31372 %vec4 = insertelement <8 x float> %vec3, float %elt4, i64 41373 %vec5 = insertelement <8 x float> %vec4, float %elt5, i64 51374 %vec6 = insertelement <8 x float> %vec5, float %elt6, i64 61375 %vec7 = insertelement <8 x float> %vec6, float %elt7, i64 71376 %res = select <8 x i1> %cmp, <8 x float> zeroinitializer, <8 x float> %vec71377 ret <8 x float> %res1378}1379 1380;1381; PR35820 - Unequal source/destination vector sizes1382;1383 1384define <4 x i64> @var_shuffle_v4i64_from_v2i64(<2 x i64> %v, <4 x i64> %indices) nounwind {1385; XOP-LABEL: var_shuffle_v4i64_from_v2i64:1386; XOP: # %bb.0:1387; XOP-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01388; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01389; XOP-NEXT: vpaddq %xmm1, %xmm1, %xmm21390; XOP-NEXT: vextractf128 $1, %ymm1, %xmm11391; XOP-NEXT: vpaddq %xmm1, %xmm1, %xmm11392; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm11393; XOP-NEXT: vpermil2pd $0, %ymm1, %ymm0, %ymm0, %ymm01394; XOP-NEXT: retq1395;1396; AVX1-LABEL: var_shuffle_v4i64_from_v2i64:1397; AVX1: # %bb.0:1398; AVX1-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01399; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01400; AVX1-NEXT: vpaddq %xmm1, %xmm1, %xmm21401; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm11402; AVX1-NEXT: vpaddq %xmm1, %xmm1, %xmm11403; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm31404; AVX1-NEXT: vpermilpd %ymm3, %ymm0, %ymm01405; AVX1-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21406; AVX1-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}+16(%rip), %xmm1, %xmm11407; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm11408; AVX1-NEXT: vpermilpd %ymm3, %ymm0, %ymm21409; AVX1-NEXT: vblendvpd %ymm1, %ymm2, %ymm0, %ymm01410; AVX1-NEXT: retq1411;1412; AVX2-LABEL: var_shuffle_v4i64_from_v2i64:1413; AVX2: # %bb.0:1414; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01415; AVX2-NEXT: vpaddq %ymm1, %ymm1, %ymm11416; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [2,2,2,2]1417; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm21418; AVX2-NEXT: vpermilpd %ymm1, %ymm0, %ymm31419; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,1,0,1]1420; AVX2-NEXT: vpermilpd %ymm1, %ymm0, %ymm01421; AVX2-NEXT: vblendvpd %ymm2, %ymm3, %ymm0, %ymm01422; AVX2-NEXT: retq1423;1424; AVX512-LABEL: var_shuffle_v4i64_from_v2i64:1425; AVX512: # %bb.0:1426; AVX512-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm11427; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01428; AVX512-NEXT: vpermpd %zmm0, %zmm1, %zmm01429; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01430; AVX512-NEXT: retq1431;1432; AVX512VL-LABEL: var_shuffle_v4i64_from_v2i64:1433; AVX512VL: # %bb.0:1434; AVX512VL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01435; AVX512VL-NEXT: vpermpd %ymm0, %ymm1, %ymm01436; AVX512VL-NEXT: retq1437 %index0 = extractelement <4 x i64> %indices, i32 01438 %index1 = extractelement <4 x i64> %indices, i32 11439 %index2 = extractelement <4 x i64> %indices, i32 21440 %index3 = extractelement <4 x i64> %indices, i32 31441 %v0 = extractelement <2 x i64> %v, i64 %index01442 %v1 = extractelement <2 x i64> %v, i64 %index11443 %v2 = extractelement <2 x i64> %v, i64 %index21444 %v3 = extractelement <2 x i64> %v, i64 %index31445 %ret0 = insertelement <4 x i64> undef, i64 %v0, i32 01446 %ret1 = insertelement <4 x i64> %ret0, i64 %v1, i32 11447 %ret2 = insertelement <4 x i64> %ret1, i64 %v2, i32 21448 %ret3 = insertelement <4 x i64> %ret2, i64 %v3, i32 31449 ret <4 x i64> %ret31450}1451 1452define <8 x i32> @var_shuffle_v8i32_from_v4i32(<4 x i32> %v, <8 x i32> %indices) unnamed_addr nounwind {1453; XOP-LABEL: var_shuffle_v8i32_from_v4i32:1454; XOP: # %bb.0: # %entry1455; XOP-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01456; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01457; XOP-NEXT: vpermil2ps $0, %ymm1, %ymm0, %ymm0, %ymm01458; XOP-NEXT: retq1459;1460; AVX1-LABEL: var_shuffle_v8i32_from_v4i32:1461; AVX1: # %bb.0: # %entry1462; AVX1-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01463; AVX1-NEXT: vpermilps %ymm1, %ymm0, %ymm21464; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01465; AVX1-NEXT: vpermilps %ymm1, %ymm0, %ymm01466; AVX1-NEXT: vpcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm31467; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm11468; AVX1-NEXT: vpcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}+16(%rip), %xmm1, %xmm11469; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm11470; AVX1-NEXT: vblendvps %ymm1, %ymm2, %ymm0, %ymm01471; AVX1-NEXT: retq1472;1473; INT256-LABEL: var_shuffle_v8i32_from_v4i32:1474; INT256: # %bb.0: # %entry1475; INT256-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01476; INT256-NEXT: vpermps %ymm0, %ymm1, %ymm01477; INT256-NEXT: retq1478entry:1479 %tmp1 = extractelement <8 x i32> %indices, i32 01480 %vecext2.8 = extractelement <4 x i32> %v, i32 %tmp11481 %tmp2 = extractelement <8 x i32> %indices, i32 11482 %vecext2.9 = extractelement <4 x i32> %v, i32 %tmp21483 %tmp3 = extractelement <8 x i32> %indices, i32 21484 %vecext2.10 = extractelement <4 x i32> %v, i32 %tmp31485 %tmp4 = extractelement <8 x i32> %indices, i32 31486 %vecext2.11 = extractelement <4 x i32> %v, i32 %tmp41487 %tmp5 = extractelement <8 x i32> %indices, i32 41488 %vecext2.12 = extractelement <4 x i32> %v, i32 %tmp51489 %tmp6 = extractelement <8 x i32> %indices, i32 51490 %vecext2.13 = extractelement <4 x i32> %v, i32 %tmp61491 %tmp7 = extractelement <8 x i32> %indices, i32 61492 %vecext2.14 = extractelement <4 x i32> %v, i32 %tmp71493 %tmp8 = extractelement <8 x i32> %indices, i32 71494 %vecext2.15 = extractelement <4 x i32> %v, i32 %tmp81495 %tmp9 = insertelement <8 x i32> undef, i32 %vecext2.8, i32 01496 %tmp10 = insertelement <8 x i32> %tmp9, i32 %vecext2.9, i32 11497 %tmp11 = insertelement <8 x i32> %tmp10, i32 %vecext2.10, i32 21498 %tmp12 = insertelement <8 x i32> %tmp11, i32 %vecext2.11, i32 31499 %tmp13 = insertelement <8 x i32> %tmp12, i32 %vecext2.12, i32 41500 %tmp14 = insertelement <8 x i32> %tmp13, i32 %vecext2.13, i32 51501 %tmp15 = insertelement <8 x i32> %tmp14, i32 %vecext2.14, i32 61502 %tmp16 = insertelement <8 x i32> %tmp15, i32 %vecext2.15, i32 71503 ret <8 x i32> %tmp161504}1505 1506define <16 x i16> @var_shuffle_v16i16_from_v8i16(<8 x i16> %v, <16 x i16> %indices) nounwind {1507; XOP-LABEL: var_shuffle_v16i16_from_v8i16:1508; XOP: # %bb.0:1509; XOP-NEXT: vbroadcastss {{.*#+}} xmm2 = [256,256,256,256,256,256,256,256]1510; XOP-NEXT: vbroadcastss {{.*#+}} xmm3 = [514,514,514,514,514,514,514,514]1511; XOP-NEXT: vpmacsww %xmm2, %xmm3, %xmm1, %xmm41512; XOP-NEXT: vextractf128 $1, %ymm1, %xmm11513; XOP-NEXT: vpmacsww %xmm2, %xmm3, %xmm1, %xmm11514; XOP-NEXT: vpperm %xmm1, %xmm0, %xmm0, %xmm11515; XOP-NEXT: vpperm %xmm4, %xmm0, %xmm0, %xmm01516; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01517; XOP-NEXT: retq1518;1519; AVX1-LABEL: var_shuffle_v16i16_from_v8i16:1520; AVX1: # %bb.0:1521; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [514,514,514,514,514,514,514,514]1522; AVX1-NEXT: vpmullw %xmm2, %xmm1, %xmm31523; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [256,256,256,256,256,256,256,256]1524; AVX1-NEXT: vpaddw %xmm4, %xmm3, %xmm31525; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm11526; AVX1-NEXT: vpmullw %xmm2, %xmm1, %xmm11527; AVX1-NEXT: vpaddw %xmm4, %xmm1, %xmm11528; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1529; AVX1-NEXT: vpcmpgtb %xmm2, %xmm1, %xmm41530; AVX1-NEXT: vpshufb %xmm1, %xmm0, %xmm51531; AVX1-NEXT: vpshufb %xmm1, %xmm0, %xmm11532; AVX1-NEXT: vpblendvb %xmm4, %xmm5, %xmm1, %xmm11533; AVX1-NEXT: vpcmpgtb %xmm2, %xmm3, %xmm21534; AVX1-NEXT: vpshufb %xmm3, %xmm0, %xmm41535; AVX1-NEXT: vpshufb %xmm3, %xmm0, %xmm01536; AVX1-NEXT: vpblendvb %xmm2, %xmm4, %xmm0, %xmm01537; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01538; AVX1-NEXT: retq1539;1540; AVX2-LABEL: var_shuffle_v16i16_from_v8i16:1541; AVX2: # %bb.0:1542; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01543; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514]1544; AVX2-NEXT: vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11545; AVX2-NEXT: vpshufb %ymm1, %ymm0, %ymm21546; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm01547; AVX2-NEXT: vpshufb %ymm1, %ymm0, %ymm01548; AVX2-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11549; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm01550; AVX2-NEXT: retq1551;1552; AVX512-LABEL: var_shuffle_v16i16_from_v8i16:1553; AVX512: # %bb.0:1554; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01555; AVX512-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514]1556; AVX512-NEXT: vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11557; AVX512-NEXT: vpshufb %ymm1, %ymm0, %ymm21558; AVX512-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm01559; AVX512-NEXT: vpshufb %ymm1, %ymm0, %ymm01560; AVX512-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11561; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm01562; AVX512-NEXT: retq1563;1564; AVX512VLF-LABEL: var_shuffle_v16i16_from_v8i16:1565; AVX512VLF: # %bb.0:1566; AVX512VLF-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01567; AVX512VLF-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514]1568; AVX512VLF-NEXT: vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11569; AVX512VLF-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm01570; AVX512VLF-NEXT: vpshufb %ymm1, %ymm0, %ymm21571; AVX512VLF-NEXT: vpshufb %ymm1, %ymm0, %ymm31572; AVX512VLF-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm01573; AVX512VLF-NEXT: vpternlogq {{.*#+}} ymm0 = ymm2 ^ (ymm0 & (ymm3 ^ ymm2))1574; AVX512VLF-NEXT: retq1575;1576; AVX512VLBW-LABEL: var_shuffle_v16i16_from_v8i16:1577; AVX512VLBW: # %bb.0:1578; AVX512VLBW-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01579; AVX512VLBW-NEXT: vpermw %ymm0, %ymm1, %ymm01580; AVX512VLBW-NEXT: retq1581;1582; VLVBMI-LABEL: var_shuffle_v16i16_from_v8i16:1583; VLVBMI: # %bb.0:1584; VLVBMI-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01585; VLVBMI-NEXT: vpermw %ymm0, %ymm1, %ymm01586; VLVBMI-NEXT: retq1587 %index0 = extractelement <16 x i16> %indices, i32 01588 %index1 = extractelement <16 x i16> %indices, i32 11589 %index2 = extractelement <16 x i16> %indices, i32 21590 %index3 = extractelement <16 x i16> %indices, i32 31591 %index4 = extractelement <16 x i16> %indices, i32 41592 %index5 = extractelement <16 x i16> %indices, i32 51593 %index6 = extractelement <16 x i16> %indices, i32 61594 %index7 = extractelement <16 x i16> %indices, i32 71595 %index8 = extractelement <16 x i16> %indices, i32 81596 %index9 = extractelement <16 x i16> %indices, i32 91597 %index10 = extractelement <16 x i16> %indices, i32 101598 %index11 = extractelement <16 x i16> %indices, i32 111599 %index12 = extractelement <16 x i16> %indices, i32 121600 %index13 = extractelement <16 x i16> %indices, i32 131601 %index14 = extractelement <16 x i16> %indices, i32 141602 %index15 = extractelement <16 x i16> %indices, i32 151603 %v0 = extractelement <8 x i16> %v, i16 %index01604 %v1 = extractelement <8 x i16> %v, i16 %index11605 %v2 = extractelement <8 x i16> %v, i16 %index21606 %v3 = extractelement <8 x i16> %v, i16 %index31607 %v4 = extractelement <8 x i16> %v, i16 %index41608 %v5 = extractelement <8 x i16> %v, i16 %index51609 %v6 = extractelement <8 x i16> %v, i16 %index61610 %v7 = extractelement <8 x i16> %v, i16 %index71611 %v8 = extractelement <8 x i16> %v, i16 %index81612 %v9 = extractelement <8 x i16> %v, i16 %index91613 %v10 = extractelement <8 x i16> %v, i16 %index101614 %v11 = extractelement <8 x i16> %v, i16 %index111615 %v12 = extractelement <8 x i16> %v, i16 %index121616 %v13 = extractelement <8 x i16> %v, i16 %index131617 %v14 = extractelement <8 x i16> %v, i16 %index141618 %v15 = extractelement <8 x i16> %v, i16 %index151619 %ret0 = insertelement <16 x i16> undef, i16 %v0, i32 01620 %ret1 = insertelement <16 x i16> %ret0, i16 %v1, i32 11621 %ret2 = insertelement <16 x i16> %ret1, i16 %v2, i32 21622 %ret3 = insertelement <16 x i16> %ret2, i16 %v3, i32 31623 %ret4 = insertelement <16 x i16> %ret3, i16 %v4, i32 41624 %ret5 = insertelement <16 x i16> %ret4, i16 %v5, i32 51625 %ret6 = insertelement <16 x i16> %ret5, i16 %v6, i32 61626 %ret7 = insertelement <16 x i16> %ret6, i16 %v7, i32 71627 %ret8 = insertelement <16 x i16> %ret7, i16 %v8, i32 81628 %ret9 = insertelement <16 x i16> %ret8, i16 %v9, i32 91629 %ret10 = insertelement <16 x i16> %ret9, i16 %v10, i32 101630 %ret11 = insertelement <16 x i16> %ret10, i16 %v11, i32 111631 %ret12 = insertelement <16 x i16> %ret11, i16 %v12, i32 121632 %ret13 = insertelement <16 x i16> %ret12, i16 %v13, i32 131633 %ret14 = insertelement <16 x i16> %ret13, i16 %v14, i32 141634 %ret15 = insertelement <16 x i16> %ret14, i16 %v15, i32 151635 ret <16 x i16> %ret151636}1637 1638define <32 x i8> @var_shuffle_v32i8_from_v16i8(<16 x i8> %v, <32 x i8> %indices) nounwind {1639; XOP-LABEL: var_shuffle_v32i8_from_v16i8:1640; XOP: # %bb.0:1641; XOP-NEXT: vextractf128 $1, %ymm1, %xmm21642; XOP-NEXT: vpperm %xmm2, %xmm0, %xmm0, %xmm21643; XOP-NEXT: vpperm %xmm1, %xmm0, %xmm0, %xmm01644; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01645; XOP-NEXT: retq1646;1647; AVX1-LABEL: var_shuffle_v32i8_from_v16i8:1648; AVX1: # %bb.0:1649; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm21650; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]1651; AVX1-NEXT: vpcmpgtb %xmm3, %xmm2, %xmm41652; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm51653; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm21654; AVX1-NEXT: vpblendvb %xmm4, %xmm5, %xmm2, %xmm21655; AVX1-NEXT: vpcmpgtb %xmm3, %xmm1, %xmm31656; AVX1-NEXT: vpshufb %xmm1, %xmm0, %xmm41657; AVX1-NEXT: vpshufb %xmm1, %xmm0, %xmm01658; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm0, %xmm01659; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01660; AVX1-NEXT: retq1661;1662; AVX2-LABEL: var_shuffle_v32i8_from_v16i8:1663; AVX2: # %bb.0:1664; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01665; AVX2-NEXT: vpshufb %ymm1, %ymm0, %ymm21666; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm01667; AVX2-NEXT: vpshufb %ymm1, %ymm0, %ymm01668; AVX2-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11669; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm01670; AVX2-NEXT: retq1671;1672; AVX512-LABEL: var_shuffle_v32i8_from_v16i8:1673; AVX512: # %bb.0:1674; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01675; AVX512-NEXT: vpshufb %ymm1, %ymm0, %ymm21676; AVX512-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm01677; AVX512-NEXT: vpshufb %ymm1, %ymm0, %ymm01678; AVX512-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm11679; AVX512-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm01680; AVX512-NEXT: retq1681;1682; AVX512VLF-LABEL: var_shuffle_v32i8_from_v16i8:1683; AVX512VLF: # %bb.0:1684; AVX512VLF-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01685; AVX512VLF-NEXT: vpshufb %ymm1, %ymm0, %ymm21686; AVX512VLF-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm01687; AVX512VLF-NEXT: vpshufb %ymm1, %ymm0, %ymm31688; AVX512VLF-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm01689; AVX512VLF-NEXT: vpternlogq {{.*#+}} ymm0 = ymm3 ^ (ymm0 & (ymm2 ^ ymm3))1690; AVX512VLF-NEXT: retq1691;1692; AVX512VLBW-LABEL: var_shuffle_v32i8_from_v16i8:1693; AVX512VLBW: # %bb.0:1694; AVX512VLBW-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01695; AVX512VLBW-NEXT: vinserti128 $1, %xmm0, %ymm0, %ymm01696; AVX512VLBW-NEXT: vpshufb %ymm1, %ymm0, %ymm01697; AVX512VLBW-NEXT: vpcmpgtb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %k11698; AVX512VLBW-NEXT: vpshufb %ymm1, %ymm0, %ymm0 {%k1}1699; AVX512VLBW-NEXT: retq1700;1701; VLVBMI-LABEL: var_shuffle_v32i8_from_v16i8:1702; VLVBMI: # %bb.0:1703; VLVBMI-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01704; VLVBMI-NEXT: vpermb %ymm0, %ymm1, %ymm01705; VLVBMI-NEXT: retq1706 %index0 = extractelement <32 x i8> %indices, i32 01707 %index1 = extractelement <32 x i8> %indices, i32 11708 %index2 = extractelement <32 x i8> %indices, i32 21709 %index3 = extractelement <32 x i8> %indices, i32 31710 %index4 = extractelement <32 x i8> %indices, i32 41711 %index5 = extractelement <32 x i8> %indices, i32 51712 %index6 = extractelement <32 x i8> %indices, i32 61713 %index7 = extractelement <32 x i8> %indices, i32 71714 %index8 = extractelement <32 x i8> %indices, i32 81715 %index9 = extractelement <32 x i8> %indices, i32 91716 %index10 = extractelement <32 x i8> %indices, i32 101717 %index11 = extractelement <32 x i8> %indices, i32 111718 %index12 = extractelement <32 x i8> %indices, i32 121719 %index13 = extractelement <32 x i8> %indices, i32 131720 %index14 = extractelement <32 x i8> %indices, i32 141721 %index15 = extractelement <32 x i8> %indices, i32 151722 %index16 = extractelement <32 x i8> %indices, i32 161723 %index17 = extractelement <32 x i8> %indices, i32 171724 %index18 = extractelement <32 x i8> %indices, i32 181725 %index19 = extractelement <32 x i8> %indices, i32 191726 %index20 = extractelement <32 x i8> %indices, i32 201727 %index21 = extractelement <32 x i8> %indices, i32 211728 %index22 = extractelement <32 x i8> %indices, i32 221729 %index23 = extractelement <32 x i8> %indices, i32 231730 %index24 = extractelement <32 x i8> %indices, i32 241731 %index25 = extractelement <32 x i8> %indices, i32 251732 %index26 = extractelement <32 x i8> %indices, i32 261733 %index27 = extractelement <32 x i8> %indices, i32 271734 %index28 = extractelement <32 x i8> %indices, i32 281735 %index29 = extractelement <32 x i8> %indices, i32 291736 %index30 = extractelement <32 x i8> %indices, i32 301737 %index31 = extractelement <32 x i8> %indices, i32 311738 %v0 = extractelement <16 x i8> %v, i8 %index01739 %v1 = extractelement <16 x i8> %v, i8 %index11740 %v2 = extractelement <16 x i8> %v, i8 %index21741 %v3 = extractelement <16 x i8> %v, i8 %index31742 %v4 = extractelement <16 x i8> %v, i8 %index41743 %v5 = extractelement <16 x i8> %v, i8 %index51744 %v6 = extractelement <16 x i8> %v, i8 %index61745 %v7 = extractelement <16 x i8> %v, i8 %index71746 %v8 = extractelement <16 x i8> %v, i8 %index81747 %v9 = extractelement <16 x i8> %v, i8 %index91748 %v10 = extractelement <16 x i8> %v, i8 %index101749 %v11 = extractelement <16 x i8> %v, i8 %index111750 %v12 = extractelement <16 x i8> %v, i8 %index121751 %v13 = extractelement <16 x i8> %v, i8 %index131752 %v14 = extractelement <16 x i8> %v, i8 %index141753 %v15 = extractelement <16 x i8> %v, i8 %index151754 %v16 = extractelement <16 x i8> %v, i8 %index161755 %v17 = extractelement <16 x i8> %v, i8 %index171756 %v18 = extractelement <16 x i8> %v, i8 %index181757 %v19 = extractelement <16 x i8> %v, i8 %index191758 %v20 = extractelement <16 x i8> %v, i8 %index201759 %v21 = extractelement <16 x i8> %v, i8 %index211760 %v22 = extractelement <16 x i8> %v, i8 %index221761 %v23 = extractelement <16 x i8> %v, i8 %index231762 %v24 = extractelement <16 x i8> %v, i8 %index241763 %v25 = extractelement <16 x i8> %v, i8 %index251764 %v26 = extractelement <16 x i8> %v, i8 %index261765 %v27 = extractelement <16 x i8> %v, i8 %index271766 %v28 = extractelement <16 x i8> %v, i8 %index281767 %v29 = extractelement <16 x i8> %v, i8 %index291768 %v30 = extractelement <16 x i8> %v, i8 %index301769 %v31 = extractelement <16 x i8> %v, i8 %index311770 %ret0 = insertelement <32 x i8> undef, i8 %v0, i32 01771 %ret1 = insertelement <32 x i8> %ret0, i8 %v1, i32 11772 %ret2 = insertelement <32 x i8> %ret1, i8 %v2, i32 21773 %ret3 = insertelement <32 x i8> %ret2, i8 %v3, i32 31774 %ret4 = insertelement <32 x i8> %ret3, i8 %v4, i32 41775 %ret5 = insertelement <32 x i8> %ret4, i8 %v5, i32 51776 %ret6 = insertelement <32 x i8> %ret5, i8 %v6, i32 61777 %ret7 = insertelement <32 x i8> %ret6, i8 %v7, i32 71778 %ret8 = insertelement <32 x i8> %ret7, i8 %v8, i32 81779 %ret9 = insertelement <32 x i8> %ret8, i8 %v9, i32 91780 %ret10 = insertelement <32 x i8> %ret9, i8 %v10, i32 101781 %ret11 = insertelement <32 x i8> %ret10, i8 %v11, i32 111782 %ret12 = insertelement <32 x i8> %ret11, i8 %v12, i32 121783 %ret13 = insertelement <32 x i8> %ret12, i8 %v13, i32 131784 %ret14 = insertelement <32 x i8> %ret13, i8 %v14, i32 141785 %ret15 = insertelement <32 x i8> %ret14, i8 %v15, i32 151786 %ret16 = insertelement <32 x i8> %ret15, i8 %v16, i32 161787 %ret17 = insertelement <32 x i8> %ret16, i8 %v17, i32 171788 %ret18 = insertelement <32 x i8> %ret17, i8 %v18, i32 181789 %ret19 = insertelement <32 x i8> %ret18, i8 %v19, i32 191790 %ret20 = insertelement <32 x i8> %ret19, i8 %v20, i32 201791 %ret21 = insertelement <32 x i8> %ret20, i8 %v21, i32 211792 %ret22 = insertelement <32 x i8> %ret21, i8 %v22, i32 221793 %ret23 = insertelement <32 x i8> %ret22, i8 %v23, i32 231794 %ret24 = insertelement <32 x i8> %ret23, i8 %v24, i32 241795 %ret25 = insertelement <32 x i8> %ret24, i8 %v25, i32 251796 %ret26 = insertelement <32 x i8> %ret25, i8 %v26, i32 261797 %ret27 = insertelement <32 x i8> %ret26, i8 %v27, i32 271798 %ret28 = insertelement <32 x i8> %ret27, i8 %v28, i32 281799 %ret29 = insertelement <32 x i8> %ret28, i8 %v29, i32 291800 %ret30 = insertelement <32 x i8> %ret29, i8 %v30, i32 301801 %ret31 = insertelement <32 x i8> %ret30, i8 %v31, i32 311802 ret <32 x i8> %ret311803}1804 1805define <4 x double> @var_shuffle_v4f64_from_v2f64(<2 x double> %v, <4 x i64> %indices) nounwind {1806; XOP-LABEL: var_shuffle_v4f64_from_v2f64:1807; XOP: # %bb.0:1808; XOP-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01809; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01810; XOP-NEXT: vpaddq %xmm1, %xmm1, %xmm21811; XOP-NEXT: vextractf128 $1, %ymm1, %xmm11812; XOP-NEXT: vpaddq %xmm1, %xmm1, %xmm11813; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm11814; XOP-NEXT: vpermil2pd $0, %ymm1, %ymm0, %ymm0, %ymm01815; XOP-NEXT: retq1816;1817; AVX1-LABEL: var_shuffle_v4f64_from_v2f64:1818; AVX1: # %bb.0:1819; AVX1-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01820; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01821; AVX1-NEXT: vpaddq %xmm1, %xmm1, %xmm21822; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm11823; AVX1-NEXT: vpaddq %xmm1, %xmm1, %xmm11824; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm31825; AVX1-NEXT: vpermilpd %ymm3, %ymm0, %ymm01826; AVX1-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm21827; AVX1-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}+16(%rip), %xmm1, %xmm11828; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm11829; AVX1-NEXT: vpermilpd %ymm3, %ymm0, %ymm21830; AVX1-NEXT: vblendvpd %ymm1, %ymm2, %ymm0, %ymm01831; AVX1-NEXT: retq1832;1833; AVX2-LABEL: var_shuffle_v4f64_from_v2f64:1834; AVX2: # %bb.0:1835; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01836; AVX2-NEXT: vpaddq %ymm1, %ymm1, %ymm11837; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [2,2,2,2]1838; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm21839; AVX2-NEXT: vpermilpd %ymm1, %ymm0, %ymm31840; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,1,0,1]1841; AVX2-NEXT: vpermilpd %ymm1, %ymm0, %ymm01842; AVX2-NEXT: vblendvpd %ymm2, %ymm3, %ymm0, %ymm01843; AVX2-NEXT: retq1844;1845; AVX512-LABEL: var_shuffle_v4f64_from_v2f64:1846; AVX512: # %bb.0:1847; AVX512-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm11848; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01849; AVX512-NEXT: vpermpd %zmm0, %zmm1, %zmm01850; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01851; AVX512-NEXT: retq1852;1853; AVX512VL-LABEL: var_shuffle_v4f64_from_v2f64:1854; AVX512VL: # %bb.0:1855; AVX512VL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01856; AVX512VL-NEXT: vpermpd %ymm0, %ymm1, %ymm01857; AVX512VL-NEXT: retq1858 %index0 = extractelement <4 x i64> %indices, i32 01859 %index1 = extractelement <4 x i64> %indices, i32 11860 %index2 = extractelement <4 x i64> %indices, i32 21861 %index3 = extractelement <4 x i64> %indices, i32 31862 %v0 = extractelement <2 x double> %v, i64 %index01863 %v1 = extractelement <2 x double> %v, i64 %index11864 %v2 = extractelement <2 x double> %v, i64 %index21865 %v3 = extractelement <2 x double> %v, i64 %index31866 %ret0 = insertelement <4 x double> undef, double %v0, i32 01867 %ret1 = insertelement <4 x double> %ret0, double %v1, i32 11868 %ret2 = insertelement <4 x double> %ret1, double %v2, i32 21869 %ret3 = insertelement <4 x double> %ret2, double %v3, i32 31870 ret <4 x double> %ret31871}1872 1873define <8 x float> @var_shuffle_v8f32_from_v4f32(<4 x float> %v, <8 x i32> %indices) unnamed_addr nounwind {1874; XOP-LABEL: var_shuffle_v8f32_from_v4f32:1875; XOP: # %bb.0: # %entry1876; XOP-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01877; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01878; XOP-NEXT: vpermil2ps $0, %ymm1, %ymm0, %ymm0, %ymm01879; XOP-NEXT: retq1880;1881; AVX1-LABEL: var_shuffle_v8f32_from_v4f32:1882; AVX1: # %bb.0: # %entry1883; AVX1-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01884; AVX1-NEXT: vpermilps %ymm1, %ymm0, %ymm21885; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm01886; AVX1-NEXT: vpermilps %ymm1, %ymm0, %ymm01887; AVX1-NEXT: vpcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm31888; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm11889; AVX1-NEXT: vpcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}+16(%rip), %xmm1, %xmm11890; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm11891; AVX1-NEXT: vblendvps %ymm1, %ymm2, %ymm0, %ymm01892; AVX1-NEXT: retq1893;1894; INT256-LABEL: var_shuffle_v8f32_from_v4f32:1895; INT256: # %bb.0: # %entry1896; INT256-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01897; INT256-NEXT: vpermps %ymm0, %ymm1, %ymm01898; INT256-NEXT: retq1899entry:1900 %tmp1 = extractelement <8 x i32> %indices, i32 01901 %vecext2.8 = extractelement <4 x float> %v, i32 %tmp11902 %tmp2 = extractelement <8 x i32> %indices, i32 11903 %vecext2.9 = extractelement <4 x float> %v, i32 %tmp21904 %tmp3 = extractelement <8 x i32> %indices, i32 21905 %vecext2.10 = extractelement <4 x float> %v, i32 %tmp31906 %tmp4 = extractelement <8 x i32> %indices, i32 31907 %vecext2.11 = extractelement <4 x float> %v, i32 %tmp41908 %tmp5 = extractelement <8 x i32> %indices, i32 41909 %vecext2.12 = extractelement <4 x float> %v, i32 %tmp51910 %tmp6 = extractelement <8 x i32> %indices, i32 51911 %vecext2.13 = extractelement <4 x float> %v, i32 %tmp61912 %tmp7 = extractelement <8 x i32> %indices, i32 61913 %vecext2.14 = extractelement <4 x float> %v, i32 %tmp71914 %tmp8 = extractelement <8 x i32> %indices, i32 71915 %vecext2.15 = extractelement <4 x float> %v, i32 %tmp81916 %tmp9 = insertelement <8 x float> undef, float %vecext2.8, i32 01917 %tmp10 = insertelement <8 x float> %tmp9, float %vecext2.9, i32 11918 %tmp11 = insertelement <8 x float> %tmp10, float %vecext2.10, i32 21919 %tmp12 = insertelement <8 x float> %tmp11, float %vecext2.11, i32 31920 %tmp13 = insertelement <8 x float> %tmp12, float %vecext2.12, i32 41921 %tmp14 = insertelement <8 x float> %tmp13, float %vecext2.13, i32 51922 %tmp15 = insertelement <8 x float> %tmp14, float %vecext2.14, i32 61923 %tmp16 = insertelement <8 x float> %tmp15, float %vecext2.15, i32 71924 ret <8 x float> %tmp161925}1926 1927define <4 x i32> @var_shuffle_v4i32_from_v8i32(<8 x i32> %v, <4 x i32> %indices) unnamed_addr nounwind {1928; XOP-LABEL: var_shuffle_v4i32_from_v8i32:1929; XOP: # %bb.0: # %entry1930; XOP-NEXT: vextractf128 $1, %ymm0, %xmm21931; XOP-NEXT: vpermil2ps $0, %xmm1, %xmm2, %xmm0, %xmm01932; XOP-NEXT: vzeroupper1933; XOP-NEXT: retq1934;1935; AVX1-LABEL: var_shuffle_v4i32_from_v8i32:1936; AVX1: # %bb.0: # %entry1937; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm21938; AVX1-NEXT: vpermilps %xmm1, %xmm2, %xmm21939; AVX1-NEXT: vpermilps %xmm1, %xmm0, %xmm01940; AVX1-NEXT: vpcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11941; AVX1-NEXT: vblendvps %xmm1, %xmm2, %xmm0, %xmm01942; AVX1-NEXT: vzeroupper1943; AVX1-NEXT: retq1944;1945; INT256-LABEL: var_shuffle_v4i32_from_v8i32:1946; INT256: # %bb.0: # %entry1947; INT256-NEXT: # kill: def $xmm1 killed $xmm1 def $ymm11948; INT256-NEXT: vpermps %ymm0, %ymm1, %ymm01949; INT256-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01950; INT256-NEXT: vzeroupper1951; INT256-NEXT: retq1952entry:1953 %tmp1 = extractelement <4 x i32> %indices, i32 01954 %vecext2.8 = extractelement <8 x i32> %v, i32 %tmp11955 %tmp2 = extractelement <4 x i32> %indices, i32 11956 %vecext2.9 = extractelement <8 x i32> %v, i32 %tmp21957 %tmp3 = extractelement <4 x i32> %indices, i32 21958 %vecext2.10 = extractelement <8 x i32> %v, i32 %tmp31959 %tmp4 = extractelement <4 x i32> %indices, i32 31960 %vecext2.11 = extractelement <8 x i32> %v, i32 %tmp41961 %tmp9 = insertelement <4 x i32> undef, i32 %vecext2.8, i32 01962 %tmp10 = insertelement <4 x i32> %tmp9, i32 %vecext2.9, i32 11963 %tmp11 = insertelement <4 x i32> %tmp10, i32 %vecext2.10, i32 21964 %tmp12 = insertelement <4 x i32> %tmp11, i32 %vecext2.11, i32 31965 ret <4 x i32> %tmp121966}1967 1968;1969; PR50356 - correctly adjust the indices vector to match the source/destination size.1970;1971 1972define <4 x i64> @PR50356(<4 x i64> %0, <4 x i32> %1, <4 x i64> %2) unnamed_addr nounwind {1973; XOP-LABEL: PR50356:1974; XOP: # %bb.0:1975; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11976; XOP-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero1977; XOP-NEXT: vextractf128 $1, %ymm0, %xmm31978; XOP-NEXT: vpaddq %xmm1, %xmm1, %xmm11979; XOP-NEXT: vpermil2pd $0, %xmm1, %xmm3, %xmm0, %xmm01980; XOP-NEXT: vpcomltq %xmm2, %xmm0, %xmm01981; XOP-NEXT: vextractf128 $1, %ymm2, %xmm11982; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm21983; XOP-NEXT: vpcomltq %xmm1, %xmm2, %xmm11984; XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01985; XOP-NEXT: vmovapd {{.*#+}} ymm1 = [34,68,102,136]1986; XOP-NEXT: vblendvpd %ymm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm01987; XOP-NEXT: retq1988;1989; AVX1-LABEL: PR50356:1990; AVX1: # %bb.0:1991; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11992; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero1993; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm31994; AVX1-NEXT: vpaddq %xmm1, %xmm1, %xmm11995; AVX1-NEXT: vpermilpd %xmm1, %xmm3, %xmm31996; AVX1-NEXT: vpermilpd %xmm1, %xmm0, %xmm01997; AVX1-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11998; AVX1-NEXT: vblendvpd %xmm1, %xmm3, %xmm0, %xmm01999; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm02000; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm12001; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm22002; AVX1-NEXT: vpcmpgtq %xmm2, %xmm1, %xmm12003; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm02004; AVX1-NEXT: vmovapd {{.*#+}} ymm1 = [34,68,102,136]2005; AVX1-NEXT: vblendvpd %ymm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm02006; AVX1-NEXT: retq2007;2008; AVX2-LABEL: PR50356:2009; AVX2: # %bb.0:2010; AVX2-NEXT: pushq %rbp2011; AVX2-NEXT: movq %rsp, %rbp2012; AVX2-NEXT: andq $-32, %rsp2013; AVX2-NEXT: subq $64, %rsp2014; AVX2-NEXT: vmovd %xmm1, %eax2015; AVX2-NEXT: vmovaps %ymm0, (%rsp)2016; AVX2-NEXT: andl $3, %eax2017; AVX2-NEXT: vpextrd $1, %xmm1, %ecx2018; AVX2-NEXT: andl $3, %ecx2019; AVX2-NEXT: vmovq (%rsp,%rcx,8), %xmm0 # xmm0 = mem[0],zero2020; AVX2-NEXT: vmovq (%rsp,%rax,8), %xmm1 # xmm1 = mem[0],zero2021; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]2022; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm02023; AVX2-NEXT: vmovapd {{.*#+}} ymm1 = [34,68,102,136]2024; AVX2-NEXT: vblendvpd %ymm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm02025; AVX2-NEXT: movq %rbp, %rsp2026; AVX2-NEXT: popq %rbp2027; AVX2-NEXT: retq2028;2029; AVX512-LABEL: PR50356:2030; AVX512: # %bb.0:2031; AVX512-NEXT: pushq %rbp2032; AVX512-NEXT: movq %rsp, %rbp2033; AVX512-NEXT: andq $-32, %rsp2034; AVX512-NEXT: subq $64, %rsp2035; AVX512-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm22036; AVX512-NEXT: vmovd %xmm1, %eax2037; AVX512-NEXT: vmovaps %ymm0, (%rsp)2038; AVX512-NEXT: andl $3, %eax2039; AVX512-NEXT: vpextrd $1, %xmm1, %ecx2040; AVX512-NEXT: andl $3, %ecx2041; AVX512-NEXT: vmovq (%rsp,%rcx,8), %xmm0 # xmm0 = mem[0],zero2042; AVX512-NEXT: vmovq (%rsp,%rax,8), %xmm1 # xmm1 = mem[0],zero2043; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]2044; AVX512-NEXT: vpcmpgtq %zmm0, %zmm2, %k12045; AVX512-NEXT: vpmovsxbq {{.*#+}} ymm1 = [17,51,85,119]2046; AVX512-NEXT: vpmovzxbq {{.*#+}} ymm0 = [34,68,102,136]2047; AVX512-NEXT: vmovdqa64 %zmm1, %zmm0 {%k1}2048; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm02049; AVX512-NEXT: movq %rbp, %rsp2050; AVX512-NEXT: popq %rbp2051; AVX512-NEXT: retq2052;2053; AVX512VL-LABEL: PR50356:2054; AVX512VL: # %bb.0:2055; AVX512VL-NEXT: pushq %rbp2056; AVX512VL-NEXT: movq %rsp, %rbp2057; AVX512VL-NEXT: andq $-32, %rsp2058; AVX512VL-NEXT: subq $64, %rsp2059; AVX512VL-NEXT: vmovd %xmm1, %eax2060; AVX512VL-NEXT: vmovaps %ymm0, (%rsp)2061; AVX512VL-NEXT: andl $3, %eax2062; AVX512VL-NEXT: vpextrd $1, %xmm1, %ecx2063; AVX512VL-NEXT: andl $3, %ecx2064; AVX512VL-NEXT: vmovq (%rsp,%rcx,8), %xmm0 # xmm0 = mem[0],zero2065; AVX512VL-NEXT: vmovq (%rsp,%rax,8), %xmm1 # xmm1 = mem[0],zero2066; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]2067; AVX512VL-NEXT: vpcmpgtq %ymm0, %ymm2, %k12068; AVX512VL-NEXT: vpmovzxbq {{.*#+}} ymm0 = [34,68,102,136]2069; AVX512VL-NEXT: vmovdqa64 {{.*#+}} ymm0 {%k1} = [17,51,85,119]2070; AVX512VL-NEXT: movq %rbp, %rsp2071; AVX512VL-NEXT: popq %rbp2072; AVX512VL-NEXT: retq2073 %v9 = and <4 x i32> %1, <i32 7, i32 7, i32 7, i32 7>2074 %v10 = extractelement <4 x i32> %v9, i32 02075 %v11 = extractelement <4 x i64> %0, i32 %v102076 %v14 = extractelement <4 x i32> %v9, i32 12077 %v15 = extractelement <4 x i64> %0, i32 %v142078 %v27 = insertelement <4 x i64> zeroinitializer, i64 %v11, i32 02079 %v28 = insertelement <4 x i64> %v27, i64 %v15, i32 12080 %v36 = icmp slt <4 x i64> %v28, %22081 %v37 = select <4 x i1> %v36, <4 x i64> <i64 17, i64 51, i64 85, i64 119>, <4 x i64> <i64 34, i64 68, i64 102, i64 136> ; 17 68 102 1362082 ret <4 x i64> %v372083}2084 2085define <4 x i64> @var_shuffle_v4i64_with_v16i8_indices(<4 x i64> %v, <16 x i8> %indices) unnamed_addr nounwind {2086; XOP-LABEL: var_shuffle_v4i64_with_v16i8_indices:2087; XOP: # %bb.0:2088; XOP-NEXT: vpsrld $16, %xmm1, %xmm22089; XOP-NEXT: vpmovzxbq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero2090; XOP-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero2091; XOP-NEXT: vperm2f128 {{.*#+}} ymm3 = ymm0[2,3,2,3]2092; XOP-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm02093; XOP-NEXT: vpaddq %xmm1, %xmm1, %xmm12094; XOP-NEXT: vpaddq %xmm2, %xmm2, %xmm22095; XOP-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm12096; XOP-NEXT: vpermil2pd $0, %ymm1, %ymm3, %ymm0, %ymm02097; XOP-NEXT: retq2098;2099; AVX1-LABEL: var_shuffle_v4i64_with_v16i8_indices:2100; AVX1: # %bb.0:2101; AVX1-NEXT: vpsrld $16, %xmm1, %xmm22102; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero2103; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero2104; AVX1-NEXT: vperm2f128 {{.*#+}} ymm3 = ymm0[2,3,2,3]2105; AVX1-NEXT: vpaddq %xmm1, %xmm1, %xmm12106; AVX1-NEXT: vpaddq %xmm2, %xmm2, %xmm22107; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm42108; AVX1-NEXT: vpermilpd %ymm4, %ymm3, %ymm32109; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm02110; AVX1-NEXT: vpermilpd %ymm4, %ymm0, %ymm02111; AVX1-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm12112; AVX1-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}+16(%rip), %xmm2, %xmm22113; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm12114; AVX1-NEXT: vblendvpd %ymm1, %ymm3, %ymm0, %ymm02115; AVX1-NEXT: retq2116;2117; AVX2-LABEL: var_shuffle_v4i64_with_v16i8_indices:2118; AVX2: # %bb.0:2119; AVX2-NEXT: vpmovzxbq {{.*#+}} ymm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero,xmm1[2],zero,zero,zero,zero,zero,zero,zero,xmm1[3],zero,zero,zero,zero,zero,zero,zero2120; AVX2-NEXT: vpaddq %ymm1, %ymm1, %ymm12121; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [2,2,2,2]2122; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm22123; AVX2-NEXT: vpermpd {{.*#+}} ymm3 = ymm0[2,3,2,3]2124; AVX2-NEXT: vpermilpd %ymm1, %ymm3, %ymm32125; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,1,0,1]2126; AVX2-NEXT: vpermilpd %ymm1, %ymm0, %ymm02127; AVX2-NEXT: vblendvpd %ymm2, %ymm3, %ymm0, %ymm02128; AVX2-NEXT: retq2129;2130; AVX512-LABEL: var_shuffle_v4i64_with_v16i8_indices:2131; AVX512: # %bb.0:2132; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm02133; AVX512-NEXT: vpmovzxbq {{.*#+}} ymm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero,xmm1[2],zero,zero,zero,zero,zero,zero,zero,xmm1[3],zero,zero,zero,zero,zero,zero,zero2134; AVX512-NEXT: vpermq %zmm0, %zmm1, %zmm02135; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm02136; AVX512-NEXT: retq2137;2138; AVX512VL-LABEL: var_shuffle_v4i64_with_v16i8_indices:2139; AVX512VL: # %bb.0:2140; AVX512VL-NEXT: vpmovzxbq {{.*#+}} ymm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero,xmm1[2],zero,zero,zero,zero,zero,zero,zero,xmm1[3],zero,zero,zero,zero,zero,zero,zero2141; AVX512VL-NEXT: vpermq %ymm0, %ymm1, %ymm02142; AVX512VL-NEXT: retq2143 %index0 = extractelement <16 x i8> %indices, i32 02144 %index1 = extractelement <16 x i8> %indices, i32 12145 %index2 = extractelement <16 x i8> %indices, i32 22146 %index3 = extractelement <16 x i8> %indices, i32 32147 %v0 = extractelement <4 x i64> %v, i8 %index02148 %v1 = extractelement <4 x i64> %v, i8 %index12149 %v2 = extractelement <4 x i64> %v, i8 %index22150 %v3 = extractelement <4 x i64> %v, i8 %index32151 %ret0 = insertelement <4 x i64> undef, i64 %v0, i32 02152 %ret1 = insertelement <4 x i64> %ret0, i64 %v1, i32 12153 %ret2 = insertelement <4 x i64> %ret1, i64 %v2, i32 22154 %ret3 = insertelement <4 x i64> %ret2, i64 %v3, i32 32155 ret <4 x i64> %ret32156}2157