379 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX13; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX24; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+avx512f | FileCheck %s --check-prefixes=AVX512,AVX512F5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW6 7; trunc(concat(x,y)) -> pack8 9define <16 x i16> @trunc_concat_packssdw_256(<8 x i32> %a0, <8 x i32> %a1) nounwind {10; AVX1-LABEL: trunc_concat_packssdw_256:11; AVX1: # %bb.0:12; AVX1-NEXT: vpsrad $17, %xmm0, %xmm213; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm014; AVX1-NEXT: vpsrad $17, %xmm0, %xmm015; AVX1-NEXT: vpsrad $23, %xmm1, %xmm316; AVX1-NEXT: vpackssdw %xmm3, %xmm2, %xmm217; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm118; AVX1-NEXT: vpsrad $23, %xmm1, %xmm119; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm020; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm021; AVX1-NEXT: retq22;23; AVX2-LABEL: trunc_concat_packssdw_256:24; AVX2: # %bb.0:25; AVX2-NEXT: vpsrad $17, %ymm0, %ymm026; AVX2-NEXT: vpsrad $23, %ymm1, %ymm127; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm028; AVX2-NEXT: retq29;30; AVX512-LABEL: trunc_concat_packssdw_256:31; AVX512: # %bb.0:32; AVX512-NEXT: vpsrad $17, %ymm0, %ymm033; AVX512-NEXT: vpsrad $23, %ymm1, %ymm134; AVX512-NEXT: vperm2i128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]35; AVX512-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm036; AVX512-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm037; AVX512-NEXT: vpmovdw %zmm0, %ymm038; AVX512-NEXT: retq39 %1 = ashr <8 x i32> %a0, <i32 17, i32 17, i32 17, i32 17, i32 17, i32 17, i32 17, i32 17>40 %2 = ashr <8 x i32> %a1, <i32 23, i32 23, i32 23, i32 23, i32 23, i32 23, i32 23, i32 23>41 %3 = shufflevector <8 x i32> %1, <8 x i32> %2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11, i32 4, i32 5, i32 6, i32 7, i32 12, i32 13, i32 14, i32 15>42 %4 = trunc <16 x i32> %3 to <16 x i16>43 ret <16 x i16> %444}45 46define <16 x i16> @trunc_concat_packusdw_256(<8 x i32> %a0, <8 x i32> %a1) nounwind {47; AVX1-LABEL: trunc_concat_packusdw_256:48; AVX1: # %bb.0:49; AVX1-NEXT: vpsrld $17, %xmm0, %xmm250; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm051; AVX1-NEXT: vpsrld $17, %xmm0, %xmm052; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm153; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm354; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm055; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm156; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm057; AVX1-NEXT: retq58;59; AVX2-LABEL: trunc_concat_packusdw_256:60; AVX2: # %bb.0:61; AVX2-NEXT: vpsrld $17, %ymm0, %ymm062; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [15,15,15,15,15,15,15,15]63; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm164; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm065; AVX2-NEXT: retq66;67; AVX512-LABEL: trunc_concat_packusdw_256:68; AVX512: # %bb.0:69; AVX512-NEXT: vpsrld $17, %ymm0, %ymm070; AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm171; AVX512-NEXT: vperm2i128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]72; AVX512-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm073; AVX512-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm074; AVX512-NEXT: vpmovdw %zmm0, %ymm075; AVX512-NEXT: retq76 %1 = lshr <8 x i32> %a0, <i32 17, i32 17, i32 17, i32 17, i32 17, i32 17, i32 17, i32 17>77 %2 = and <8 x i32> %a1, <i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15>78 %3 = shufflevector <8 x i32> %1, <8 x i32> %2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11, i32 4, i32 5, i32 6, i32 7, i32 12, i32 13, i32 14, i32 15>79 %4 = trunc <16 x i32> %3 to <16 x i16>80 ret <16 x i16> %481}82 83define <32 x i8> @trunc_concat_packsswb_256(<16 x i16> %a0, <16 x i16> %a1) nounwind {84; AVX1-LABEL: trunc_concat_packsswb_256:85; AVX1: # %bb.0:86; AVX1-NEXT: vpsraw $15, %xmm0, %xmm287; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm088; AVX1-NEXT: vpsraw $15, %xmm0, %xmm089; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm190; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm391; AVX1-NEXT: vpacksswb %xmm3, %xmm0, %xmm092; AVX1-NEXT: vpacksswb %xmm1, %xmm2, %xmm193; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm094; AVX1-NEXT: retq95;96; AVX2-LABEL: trunc_concat_packsswb_256:97; AVX2: # %bb.0:98; AVX2-NEXT: vpsraw $15, %ymm0, %ymm099; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1100; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm0101; AVX2-NEXT: retq102;103; AVX512F-LABEL: trunc_concat_packsswb_256:104; AVX512F: # %bb.0:105; AVX512F-NEXT: vpsraw $15, %ymm0, %ymm0106; AVX512F-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1107; AVX512F-NEXT: vpacksswb %ymm1, %ymm0, %ymm0108; AVX512F-NEXT: retq109;110; AVX512BW-LABEL: trunc_concat_packsswb_256:111; AVX512BW: # %bb.0:112; AVX512BW-NEXT: vpsraw $15, %ymm0, %ymm0113; AVX512BW-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1114; AVX512BW-NEXT: vperm2i128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]115; AVX512BW-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0116; AVX512BW-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm0117; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0118; AVX512BW-NEXT: retq119 %1 = ashr <16 x i16> %a0, <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>120 %2 = and <16 x i16> %a1, <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>121 %3 = shufflevector <16 x i16> %1, <16 x i16> %2, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>122 %4 = trunc <32 x i16> %3 to <32 x i8>123 ret <32 x i8> %4124}125 126define <32 x i8> @trunc_concat_packuswb_256(<16 x i16> %a0, <16 x i16> %a1) nounwind {127; AVX1-LABEL: trunc_concat_packuswb_256:128; AVX1: # %bb.0:129; AVX1-NEXT: vpsrlw $15, %xmm0, %xmm2130; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0131; AVX1-NEXT: vpsrlw $15, %xmm0, %xmm0132; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1133; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3134; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0135; AVX1-NEXT: vpackuswb %xmm1, %xmm2, %xmm1136; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0137; AVX1-NEXT: retq138;139; AVX2-LABEL: trunc_concat_packuswb_256:140; AVX2: # %bb.0:141; AVX2-NEXT: vpsrlw $15, %ymm0, %ymm0142; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1143; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0144; AVX2-NEXT: retq145;146; AVX512F-LABEL: trunc_concat_packuswb_256:147; AVX512F: # %bb.0:148; AVX512F-NEXT: vpsrlw $15, %ymm0, %ymm0149; AVX512F-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1150; AVX512F-NEXT: vpackuswb %ymm1, %ymm0, %ymm0151; AVX512F-NEXT: retq152;153; AVX512BW-LABEL: trunc_concat_packuswb_256:154; AVX512BW: # %bb.0:155; AVX512BW-NEXT: vpsrlw $15, %ymm0, %ymm0156; AVX512BW-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm1, %ymm1157; AVX512BW-NEXT: vperm2i128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]158; AVX512BW-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0159; AVX512BW-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm0160; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0161; AVX512BW-NEXT: retq162 %1 = lshr <16 x i16> %a0, <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>163 %2 = and <16 x i16> %a1, <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>164 %3 = shufflevector <16 x i16> %1, <16 x i16> %2, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>165 %4 = trunc <32 x i16> %3 to <32 x i8>166 ret <32 x i8> %4167}168 169; concat(trunc(x),trunc(y)) -> pack170 171 172define <16 x i16> @concat_trunc_packssdw_256(<8 x i32> %a0, <8 x i32> %a1) nounwind {173; AVX1-LABEL: concat_trunc_packssdw_256:174; AVX1: # %bb.0:175; AVX1-NEXT: vpsrad $17, %xmm0, %xmm2176; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0177; AVX1-NEXT: vpsrad $17, %xmm0, %xmm0178; AVX1-NEXT: vpsrad $23, %xmm1, %xmm3179; AVX1-NEXT: vpackssdw %xmm3, %xmm2, %xmm2180; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1181; AVX1-NEXT: vpsrad $23, %xmm1, %xmm1182; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0183; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0184; AVX1-NEXT: retq185;186; AVX2-LABEL: concat_trunc_packssdw_256:187; AVX2: # %bb.0:188; AVX2-NEXT: vpsrad $17, %ymm0, %ymm0189; AVX2-NEXT: vpsrad $23, %ymm1, %ymm1190; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0191; AVX2-NEXT: retq192;193; AVX512-LABEL: concat_trunc_packssdw_256:194; AVX512: # %bb.0:195; AVX512-NEXT: vpsrad $17, %ymm0, %ymm0196; AVX512-NEXT: vpsrad $23, %ymm1, %ymm1197; AVX512-NEXT: vpmovdw %ymm0, %xmm0198; AVX512-NEXT: vpmovdw %ymm1, %xmm1199; AVX512-NEXT: vpunpckhqdq {{.*#+}} xmm2 = xmm0[1],xmm1[1]200; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]201; AVX512-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0202; AVX512-NEXT: retq203 %1 = ashr <8 x i32> %a0, <i32 17, i32 17, i32 17, i32 17, i32 17, i32 17, i32 17, i32 17>204 %2 = ashr <8 x i32> %a1, <i32 23, i32 23, i32 23, i32 23, i32 23, i32 23, i32 23, i32 23>205 %3 = trunc <8 x i32> %1 to <8 x i16>206 %4 = trunc <8 x i32> %2 to <8 x i16>207 %5 = shufflevector <8 x i16> %3, <8 x i16> %4, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11, i32 4, i32 5, i32 6, i32 7, i32 12, i32 13, i32 14, i32 15>208 ret <16 x i16> %5209}210 211define <16 x i16> @concat_trunc_packusdw_256(<8 x i32> %a0, <8 x i32> %a1) nounwind {212; AVX1-LABEL: concat_trunc_packusdw_256:213; AVX1: # %bb.0:214; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2215; AVX1-NEXT: vpsrld $17, %xmm2, %xmm2216; AVX1-NEXT: vpsrld $17, %xmm0, %xmm0217; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0218; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1219; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2220; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1221; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1222; AVX1-NEXT: vpunpckhqdq {{.*#+}} xmm2 = xmm0[1],xmm1[1]223; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]224; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0225; AVX1-NEXT: retq226;227; AVX2-LABEL: concat_trunc_packusdw_256:228; AVX2: # %bb.0:229; AVX2-NEXT: vpsrld $17, %ymm0, %ymm0230; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2231; AVX2-NEXT: vpackusdw %xmm2, %xmm0, %xmm0232; AVX2-NEXT: vpshufb {{.*#+}} ymm1 = ymm1[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]233; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]234; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1235; AVX2-NEXT: vpunpckhqdq {{.*#+}} xmm2 = xmm0[1],xmm1[1]236; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]237; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0238; AVX2-NEXT: retq239;240; AVX512-LABEL: concat_trunc_packusdw_256:241; AVX512: # %bb.0:242; AVX512-NEXT: vpsrld $17, %ymm0, %ymm0243; AVX512-NEXT: vpmovdw %ymm0, %xmm0244; AVX512-NEXT: vpmovdw %ymm1, %xmm1245; AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1246; AVX512-NEXT: vpunpckhqdq {{.*#+}} xmm2 = xmm0[1],xmm1[1]247; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]248; AVX512-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0249; AVX512-NEXT: retq250 %1 = lshr <8 x i32> %a0, <i32 17, i32 17, i32 17, i32 17, i32 17, i32 17, i32 17, i32 17>251 %2 = and <8 x i32> %a1, <i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15>252 %3 = trunc <8 x i32> %1 to <8 x i16>253 %4 = trunc <8 x i32> %2 to <8 x i16>254 %5 = shufflevector <8 x i16> %3, <8 x i16> %4, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11, i32 4, i32 5, i32 6, i32 7, i32 12, i32 13, i32 14, i32 15>255 ret <16 x i16> %5256}257 258define <32 x i8> @concat_trunc_packsswb_256(<16 x i16> %a0, <16 x i16> %a1) nounwind {259; AVX1-LABEL: concat_trunc_packsswb_256:260; AVX1: # %bb.0:261; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2262; AVX1-NEXT: vpsraw $15, %xmm2, %xmm2263; AVX1-NEXT: vpsraw $15, %xmm0, %xmm0264; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm0265; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1266; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2267; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm1268; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1269; AVX1-NEXT: vpunpckhqdq {{.*#+}} xmm2 = xmm0[1],xmm1[1]270; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]271; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0272; AVX1-NEXT: retq273;274; AVX2-LABEL: concat_trunc_packsswb_256:275; AVX2: # %bb.0:276; AVX2-NEXT: vpsraw $15, %ymm0, %ymm0277; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2278; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm0279; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1280; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2281; AVX2-NEXT: vpackuswb %xmm2, %xmm1, %xmm1282; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1283; AVX2-NEXT: vpunpckhqdq {{.*#+}} xmm2 = xmm0[1],xmm1[1]284; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]285; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0286; AVX2-NEXT: retq287;288; AVX512F-LABEL: concat_trunc_packsswb_256:289; AVX512F: # %bb.0:290; AVX512F-NEXT: vpsraw $15, %ymm0, %ymm0291; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero292; AVX512F-NEXT: vpmovdb %zmm0, %xmm0293; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero294; AVX512F-NEXT: vpmovdb %zmm1, %xmm1295; AVX512F-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1296; AVX512F-NEXT: vpunpckhqdq {{.*#+}} xmm2 = xmm0[1],xmm1[1]297; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]298; AVX512F-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0299; AVX512F-NEXT: retq300;301; AVX512BW-LABEL: concat_trunc_packsswb_256:302; AVX512BW: # %bb.0:303; AVX512BW-NEXT: vpsraw $15, %ymm0, %ymm0304; AVX512BW-NEXT: vpmovwb %ymm0, %xmm0305; AVX512BW-NEXT: vpmovwb %ymm1, %xmm1306; AVX512BW-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1307; AVX512BW-NEXT: vpunpckhqdq {{.*#+}} xmm2 = xmm0[1],xmm1[1]308; AVX512BW-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]309; AVX512BW-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0310; AVX512BW-NEXT: retq311 %1 = ashr <16 x i16> %a0, <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>312 %2 = and <16 x i16> %a1, <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>313 %3 = trunc <16 x i16> %1 to <16 x i8>314 %4 = trunc <16 x i16> %2 to <16 x i8>315 %5 = shufflevector <16 x i8> %3, <16 x i8> %4, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>316 ret <32 x i8> %5317}318 319define <32 x i8> @concat_trunc_packuswb_256(<16 x i16> %a0, <16 x i16> %a1) nounwind {320; AVX1-LABEL: concat_trunc_packuswb_256:321; AVX1: # %bb.0:322; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2323; AVX1-NEXT: vpsrlw $15, %xmm2, %xmm2324; AVX1-NEXT: vpsrlw $15, %xmm0, %xmm0325; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0326; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1327; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2328; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm1329; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1330; AVX1-NEXT: vpunpckhqdq {{.*#+}} xmm2 = xmm0[1],xmm1[1]331; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]332; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0333; AVX1-NEXT: retq334;335; AVX2-LABEL: concat_trunc_packuswb_256:336; AVX2: # %bb.0:337; AVX2-NEXT: vpsrlw $15, %ymm0, %ymm0338; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2339; AVX2-NEXT: vpackuswb %xmm2, %xmm0, %xmm0340; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1341; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2342; AVX2-NEXT: vpackuswb %xmm2, %xmm1, %xmm1343; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1344; AVX2-NEXT: vpunpckhqdq {{.*#+}} xmm2 = xmm0[1],xmm1[1]345; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]346; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0347; AVX2-NEXT: retq348;349; AVX512F-LABEL: concat_trunc_packuswb_256:350; AVX512F: # %bb.0:351; AVX512F-NEXT: vpsrlw $15, %ymm0, %ymm0352; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero353; AVX512F-NEXT: vpmovdb %zmm0, %xmm0354; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero355; AVX512F-NEXT: vpmovdb %zmm1, %xmm1356; AVX512F-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1357; AVX512F-NEXT: vpunpckhqdq {{.*#+}} xmm2 = xmm0[1],xmm1[1]358; AVX512F-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]359; AVX512F-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0360; AVX512F-NEXT: retq361;362; AVX512BW-LABEL: concat_trunc_packuswb_256:363; AVX512BW: # %bb.0:364; AVX512BW-NEXT: vpsrlw $15, %ymm0, %ymm0365; AVX512BW-NEXT: vpmovwb %ymm0, %xmm0366; AVX512BW-NEXT: vpmovwb %ymm1, %xmm1367; AVX512BW-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1368; AVX512BW-NEXT: vpunpckhqdq {{.*#+}} xmm2 = xmm0[1],xmm1[1]369; AVX512BW-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]370; AVX512BW-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0371; AVX512BW-NEXT: retq372 %1 = lshr <16 x i16> %a0, <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>373 %2 = and <16 x i16> %a1, <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>374 %3 = trunc <16 x i16> %1 to <16 x i8>375 %4 = trunc <16 x i16> %2 to <16 x i8>376 %5 = shufflevector <16 x i8> %3, <16 x i8> %4, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>377 ret <32 x i8> %5378}379