brintos

brintos / llvm-project-archived public Read only

0
0
Text · 100.9 KiB · 283c6a3 Raw
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