476 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+prefer-256-bit | FileCheck %s --check-prefixes=AVX256,AVX256BW3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,-prefer-256-bit | FileCheck %s --check-prefixes=AVX512BW,AVX512BWVL4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+prefer-256-bit | FileCheck %s --check-prefixes=AVX256,AVX256VL5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,-prefer-256-bit | FileCheck %s --check-prefix=AVX512VL6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+prefer-256-bit | FileCheck %s --check-prefixes=AVX512BW,AVX512BWNOVL7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,-prefer-256-bit | FileCheck %s --check-prefixes=AVX512BW,AVX512BWNOVL8 9define <32 x i8> @var_shl_v32i8(<32 x i8> %a, <32 x i8> %b) {10; AVX256-LABEL: var_shl_v32i8:11; AVX256: # %bb.0:12; AVX256-NEXT: vpsllw $5, %ymm1, %ymm113; AVX256-NEXT: vpsllw $4, %ymm0, %ymm214; AVX256-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm215; AVX256-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm016; AVX256-NEXT: vpsllw $2, %ymm0, %ymm217; AVX256-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm218; AVX256-NEXT: vpaddb %ymm1, %ymm1, %ymm119; AVX256-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm020; AVX256-NEXT: vpaddb %ymm0, %ymm0, %ymm221; AVX256-NEXT: vpaddb %ymm1, %ymm1, %ymm122; AVX256-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm023; AVX256-NEXT: retq24;25; AVX512BW-LABEL: var_shl_v32i8:26; AVX512BW: # %bb.0:27; AVX512BW-NEXT: vpmovzxbw {{.*#+}} 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],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero28; AVX512BW-NEXT: vpmovzxbw {{.*#+}} 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],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero29; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm030; AVX512BW-NEXT: vpmovwb %zmm0, %ymm031; AVX512BW-NEXT: retq32;33; AVX512VL-LABEL: var_shl_v32i8:34; AVX512VL: # %bb.0:35; AVX512VL-NEXT: vpsllw $5, %ymm1, %ymm136; AVX512VL-NEXT: vpsllw $4, %ymm0, %ymm237; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm238; AVX512VL-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm039; AVX512VL-NEXT: vpsllw $2, %ymm0, %ymm240; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm241; AVX512VL-NEXT: vpaddb %ymm1, %ymm1, %ymm142; AVX512VL-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm043; AVX512VL-NEXT: vpaddb %ymm0, %ymm0, %ymm244; AVX512VL-NEXT: vpaddb %ymm1, %ymm1, %ymm145; AVX512VL-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm046; AVX512VL-NEXT: retq47 %shift = shl <32 x i8> %a, %b48 ret <32 x i8> %shift49}50 51define <16 x i16> @var_shl_v16i16(<16 x i16> %a, <16 x i16> %b) {52; AVX256BW-LABEL: var_shl_v16i16:53; AVX256BW: # %bb.0:54; AVX256BW-NEXT: vpsllvw %ymm1, %ymm0, %ymm055; AVX256BW-NEXT: retq56;57; AVX512BWVL-LABEL: var_shl_v16i16:58; AVX512BWVL: # %bb.0:59; AVX512BWVL-NEXT: vpsllvw %ymm1, %ymm0, %ymm060; AVX512BWVL-NEXT: retq61;62; AVX256VL-LABEL: var_shl_v16i16:63; AVX256VL: # %bb.0:64; AVX256VL-NEXT: vpxor %xmm2, %xmm2, %xmm265; AVX256VL-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]66; AVX256VL-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]67; AVX256VL-NEXT: vpsllvd %ymm3, %ymm4, %ymm368; AVX256VL-NEXT: vpsrld $16, %ymm3, %ymm369; AVX256VL-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]70; AVX256VL-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]71; AVX256VL-NEXT: vpsllvd %ymm1, %ymm0, %ymm072; AVX256VL-NEXT: vpsrld $16, %ymm0, %ymm073; AVX256VL-NEXT: vpackusdw %ymm3, %ymm0, %ymm074; AVX256VL-NEXT: retq75;76; AVX512VL-LABEL: var_shl_v16i16:77; AVX512VL: # %bb.0:78; AVX512VL-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],zero79; AVX512VL-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],zero80; AVX512VL-NEXT: vpsllvd %zmm1, %zmm0, %zmm081; AVX512VL-NEXT: vpmovdw %zmm0, %ymm082; AVX512VL-NEXT: retq83;84; AVX512BWNOVL-LABEL: var_shl_v16i16:85; AVX512BWNOVL: # %bb.0:86; AVX512BWNOVL-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm187; AVX512BWNOVL-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm088; AVX512BWNOVL-NEXT: vpsllvw %zmm1, %zmm0, %zmm089; AVX512BWNOVL-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm090; AVX512BWNOVL-NEXT: retq91 %shift = shl <16 x i16> %a, %b92 ret <16 x i16> %shift93}94 95define <16 x i8> @var_shl_v16i8(<16 x i8> %a, <16 x i8> %b) {96; AVX256BW-LABEL: var_shl_v16i8:97; AVX256BW: # %bb.0:98; AVX256BW-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero99; AVX256BW-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero100; AVX256BW-NEXT: vpsllvw %ymm1, %ymm0, %ymm0101; AVX256BW-NEXT: vpmovwb %ymm0, %xmm0102; AVX256BW-NEXT: vzeroupper103; AVX256BW-NEXT: retq104;105; AVX512BWVL-LABEL: var_shl_v16i8:106; AVX512BWVL: # %bb.0:107; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero108; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero109; AVX512BWVL-NEXT: vpsllvw %ymm1, %ymm0, %ymm0110; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm0111; AVX512BWVL-NEXT: vzeroupper112; AVX512BWVL-NEXT: retq113;114; AVX256VL-LABEL: var_shl_v16i8:115; AVX256VL: # %bb.0:116; AVX256VL-NEXT: vpsllw $5, %xmm1, %xmm1117; AVX256VL-NEXT: vpsllw $4, %xmm0, %xmm2118; AVX256VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm2, %xmm2119; AVX256VL-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0120; AVX256VL-NEXT: vpsllw $2, %xmm0, %xmm2121; AVX256VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm2, %xmm2122; AVX256VL-NEXT: vpaddb %xmm1, %xmm1, %xmm1123; AVX256VL-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0124; AVX256VL-NEXT: vpaddb %xmm0, %xmm0, %xmm2125; AVX256VL-NEXT: vpaddb %xmm1, %xmm1, %xmm1126; AVX256VL-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0127; AVX256VL-NEXT: retq128;129; AVX512VL-LABEL: var_shl_v16i8:130; AVX512VL: # %bb.0:131; AVX512VL-NEXT: vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero132; AVX512VL-NEXT: vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero133; AVX512VL-NEXT: vpsllvd %zmm1, %zmm0, %zmm0134; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0135; AVX512VL-NEXT: vzeroupper136; AVX512VL-NEXT: retq137;138; AVX512BWNOVL-LABEL: var_shl_v16i8:139; AVX512BWNOVL: # %bb.0:140; AVX512BWNOVL-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero141; AVX512BWNOVL-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero142; AVX512BWNOVL-NEXT: vpsllvw %zmm1, %zmm0, %zmm0143; AVX512BWNOVL-NEXT: vpmovwb %zmm0, %ymm0144; AVX512BWNOVL-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0145; AVX512BWNOVL-NEXT: vzeroupper146; AVX512BWNOVL-NEXT: retq147 %shift = shl <16 x i8> %a, %b148 ret <16 x i8> %shift149}150 151define <32 x i8> @var_lshr_v32i8(<32 x i8> %a, <32 x i8> %b) {152; AVX256-LABEL: var_lshr_v32i8:153; AVX256: # %bb.0:154; AVX256-NEXT: vpsllw $5, %ymm1, %ymm1155; AVX256-NEXT: vpsrlw $4, %ymm0, %ymm2156; AVX256-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm2157; AVX256-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0158; AVX256-NEXT: vpsrlw $2, %ymm0, %ymm2159; AVX256-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm2160; AVX256-NEXT: vpaddb %ymm1, %ymm1, %ymm1161; AVX256-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0162; AVX256-NEXT: vpsrlw $1, %ymm0, %ymm2163; AVX256-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm2164; AVX256-NEXT: vpaddb %ymm1, %ymm1, %ymm1165; AVX256-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0166; AVX256-NEXT: retq167;168; AVX512BW-LABEL: var_lshr_v32i8:169; AVX512BW: # %bb.0:170; AVX512BW-NEXT: vpmovzxbw {{.*#+}} 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],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero171; AVX512BW-NEXT: vpmovzxbw {{.*#+}} 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],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero172; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm0173; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0174; AVX512BW-NEXT: retq175;176; AVX512VL-LABEL: var_lshr_v32i8:177; AVX512VL: # %bb.0:178; AVX512VL-NEXT: vpsllw $5, %ymm1, %ymm1179; AVX512VL-NEXT: vpsrlw $4, %ymm0, %ymm2180; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm2181; AVX512VL-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0182; AVX512VL-NEXT: vpsrlw $2, %ymm0, %ymm2183; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm2184; AVX512VL-NEXT: vpaddb %ymm1, %ymm1, %ymm1185; AVX512VL-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0186; AVX512VL-NEXT: vpsrlw $1, %ymm0, %ymm2187; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm2188; AVX512VL-NEXT: vpaddb %ymm1, %ymm1, %ymm1189; AVX512VL-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0190; AVX512VL-NEXT: retq191 %shift = lshr <32 x i8> %a, %b192 ret <32 x i8> %shift193}194 195define <16 x i16> @var_lshr_v16i16(<16 x i16> %a, <16 x i16> %b) {196; AVX256BW-LABEL: var_lshr_v16i16:197; AVX256BW: # %bb.0:198; AVX256BW-NEXT: vpsrlvw %ymm1, %ymm0, %ymm0199; AVX256BW-NEXT: retq200;201; AVX512BWVL-LABEL: var_lshr_v16i16:202; AVX512BWVL: # %bb.0:203; AVX512BWVL-NEXT: vpsrlvw %ymm1, %ymm0, %ymm0204; AVX512BWVL-NEXT: retq205;206; AVX256VL-LABEL: var_lshr_v16i16:207; AVX256VL: # %bb.0:208; AVX256VL-NEXT: vpxor %xmm2, %xmm2, %xmm2209; AVX256VL-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]210; AVX256VL-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]211; AVX256VL-NEXT: vpsrlvd %ymm3, %ymm4, %ymm3212; AVX256VL-NEXT: vpsrld $16, %ymm3, %ymm3213; AVX256VL-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]214; AVX256VL-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]215; AVX256VL-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0216; AVX256VL-NEXT: vpsrld $16, %ymm0, %ymm0217; AVX256VL-NEXT: vpackusdw %ymm3, %ymm0, %ymm0218; AVX256VL-NEXT: retq219;220; AVX512VL-LABEL: var_lshr_v16i16:221; AVX512VL: # %bb.0:222; AVX512VL-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],zero223; AVX512VL-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],zero224; AVX512VL-NEXT: vpsrlvd %zmm1, %zmm0, %zmm0225; AVX512VL-NEXT: vpmovdw %zmm0, %ymm0226; AVX512VL-NEXT: retq227;228; AVX512BWNOVL-LABEL: var_lshr_v16i16:229; AVX512BWNOVL: # %bb.0:230; AVX512BWNOVL-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1231; AVX512BWNOVL-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0232; AVX512BWNOVL-NEXT: vpsrlvw %zmm1, %zmm0, %zmm0233; AVX512BWNOVL-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0234; AVX512BWNOVL-NEXT: retq235 %shift = lshr <16 x i16> %a, %b236 ret <16 x i16> %shift237}238 239define <16 x i8> @var_lshr_v16i8(<16 x i8> %a, <16 x i8> %b) {240; AVX256BW-LABEL: var_lshr_v16i8:241; AVX256BW: # %bb.0:242; AVX256BW-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero243; AVX256BW-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero244; AVX256BW-NEXT: vpsrlvw %ymm1, %ymm0, %ymm0245; AVX256BW-NEXT: vpmovwb %ymm0, %xmm0246; AVX256BW-NEXT: vzeroupper247; AVX256BW-NEXT: retq248;249; AVX512BWVL-LABEL: var_lshr_v16i8:250; AVX512BWVL: # %bb.0:251; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero252; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero253; AVX512BWVL-NEXT: vpsrlvw %ymm1, %ymm0, %ymm0254; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm0255; AVX512BWVL-NEXT: vzeroupper256; AVX512BWVL-NEXT: retq257;258; AVX256VL-LABEL: var_lshr_v16i8:259; AVX256VL: # %bb.0:260; AVX256VL-NEXT: vpsllw $5, %xmm1, %xmm1261; AVX256VL-NEXT: vpsrlw $4, %xmm0, %xmm2262; AVX256VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm2, %xmm2263; AVX256VL-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0264; AVX256VL-NEXT: vpsrlw $2, %xmm0, %xmm2265; AVX256VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm2, %xmm2266; AVX256VL-NEXT: vpaddb %xmm1, %xmm1, %xmm1267; AVX256VL-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0268; AVX256VL-NEXT: vpsrlw $1, %xmm0, %xmm2269; AVX256VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm2, %xmm2270; AVX256VL-NEXT: vpaddb %xmm1, %xmm1, %xmm1271; AVX256VL-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0272; AVX256VL-NEXT: retq273;274; AVX512VL-LABEL: var_lshr_v16i8:275; AVX512VL: # %bb.0:276; AVX512VL-NEXT: vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero277; AVX512VL-NEXT: vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero278; AVX512VL-NEXT: vpsrlvd %zmm1, %zmm0, %zmm0279; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0280; AVX512VL-NEXT: vzeroupper281; AVX512VL-NEXT: retq282;283; AVX512BWNOVL-LABEL: var_lshr_v16i8:284; AVX512BWNOVL: # %bb.0:285; AVX512BWNOVL-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero286; AVX512BWNOVL-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero287; AVX512BWNOVL-NEXT: vpsrlvw %zmm1, %zmm0, %zmm0288; AVX512BWNOVL-NEXT: vpmovwb %zmm0, %ymm0289; AVX512BWNOVL-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0290; AVX512BWNOVL-NEXT: vzeroupper291; AVX512BWNOVL-NEXT: retq292 %shift = lshr <16 x i8> %a, %b293 ret <16 x i8> %shift294}295 296define <32 x i8> @var_ashr_v32i8(<32 x i8> %a, <32 x i8> %b) {297; AVX256-LABEL: var_ashr_v32i8:298; AVX256: # %bb.0:299; AVX256-NEXT: vpsllw $5, %ymm1, %ymm1300; AVX256-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]301; AVX256-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]302; AVX256-NEXT: vpsraw $4, %ymm3, %ymm4303; AVX256-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3304; AVX256-NEXT: vpsraw $2, %ymm3, %ymm4305; AVX256-NEXT: vpaddw %ymm2, %ymm2, %ymm5306; AVX256-NEXT: vpblendvb %ymm5, %ymm4, %ymm3, %ymm3307; AVX256-NEXT: vpsraw $1, %ymm3, %ymm4308; AVX256-NEXT: vpsllw $2, %ymm2, %ymm2309; AVX256-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2310; AVX256-NEXT: vpsrlw $8, %ymm2, %ymm2311; AVX256-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]312; AVX256-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]313; AVX256-NEXT: vpsraw $4, %ymm0, %ymm3314; AVX256-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0315; AVX256-NEXT: vpsraw $2, %ymm0, %ymm3316; AVX256-NEXT: vpaddw %ymm1, %ymm1, %ymm4317; AVX256-NEXT: vpblendvb %ymm4, %ymm3, %ymm0, %ymm0318; AVX256-NEXT: vpsraw $1, %ymm0, %ymm3319; AVX256-NEXT: vpsllw $2, %ymm1, %ymm1320; AVX256-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0321; AVX256-NEXT: vpsrlw $8, %ymm0, %ymm0322; AVX256-NEXT: vpackuswb %ymm2, %ymm0, %ymm0323; AVX256-NEXT: retq324;325; AVX512BW-LABEL: var_ashr_v32i8:326; AVX512BW: # %bb.0:327; AVX512BW-NEXT: vpmovzxbw {{.*#+}} 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],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero328; AVX512BW-NEXT: vpmovsxbw %ymm0, %zmm0329; AVX512BW-NEXT: vpsravw %zmm1, %zmm0, %zmm0330; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0331; AVX512BW-NEXT: retq332;333; AVX512VL-LABEL: var_ashr_v32i8:334; AVX512VL: # %bb.0:335; AVX512VL-NEXT: vpsllw $5, %ymm1, %ymm1336; AVX512VL-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]337; AVX512VL-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]338; AVX512VL-NEXT: vpsraw $4, %ymm3, %ymm4339; AVX512VL-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3340; AVX512VL-NEXT: vpsraw $2, %ymm3, %ymm4341; AVX512VL-NEXT: vpaddw %ymm2, %ymm2, %ymm5342; AVX512VL-NEXT: vpblendvb %ymm5, %ymm4, %ymm3, %ymm3343; AVX512VL-NEXT: vpsraw $1, %ymm3, %ymm4344; AVX512VL-NEXT: vpsllw $2, %ymm2, %ymm2345; AVX512VL-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2346; AVX512VL-NEXT: vpsrlw $8, %ymm2, %ymm2347; AVX512VL-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]348; AVX512VL-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]349; AVX512VL-NEXT: vpsraw $4, %ymm0, %ymm3350; AVX512VL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0351; AVX512VL-NEXT: vpsraw $2, %ymm0, %ymm3352; AVX512VL-NEXT: vpaddw %ymm1, %ymm1, %ymm4353; AVX512VL-NEXT: vpblendvb %ymm4, %ymm3, %ymm0, %ymm0354; AVX512VL-NEXT: vpsraw $1, %ymm0, %ymm3355; AVX512VL-NEXT: vpsllw $2, %ymm1, %ymm1356; AVX512VL-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0357; AVX512VL-NEXT: vpsrlw $8, %ymm0, %ymm0358; AVX512VL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0359; AVX512VL-NEXT: retq360 %shift = ashr <32 x i8> %a, %b361 ret <32 x i8> %shift362}363 364define <16 x i16> @var_ashr_v16i16(<16 x i16> %a, <16 x i16> %b) {365; AVX256BW-LABEL: var_ashr_v16i16:366; AVX256BW: # %bb.0:367; AVX256BW-NEXT: vpsravw %ymm1, %ymm0, %ymm0368; AVX256BW-NEXT: retq369;370; AVX512BWVL-LABEL: var_ashr_v16i16:371; AVX512BWVL: # %bb.0:372; AVX512BWVL-NEXT: vpsravw %ymm1, %ymm0, %ymm0373; AVX512BWVL-NEXT: retq374;375; AVX256VL-LABEL: var_ashr_v16i16:376; AVX256VL: # %bb.0:377; AVX256VL-NEXT: vpxor %xmm2, %xmm2, %xmm2378; AVX256VL-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]379; AVX256VL-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]380; AVX256VL-NEXT: vpsravd %ymm3, %ymm4, %ymm3381; AVX256VL-NEXT: vpsrld $16, %ymm3, %ymm3382; AVX256VL-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]383; AVX256VL-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]384; AVX256VL-NEXT: vpsravd %ymm1, %ymm0, %ymm0385; AVX256VL-NEXT: vpsrld $16, %ymm0, %ymm0386; AVX256VL-NEXT: vpackusdw %ymm3, %ymm0, %ymm0387; AVX256VL-NEXT: retq388;389; AVX512VL-LABEL: var_ashr_v16i16:390; AVX512VL: # %bb.0:391; AVX512VL-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],zero392; AVX512VL-NEXT: vpmovsxwd %ymm0, %zmm0393; AVX512VL-NEXT: vpsravd %zmm1, %zmm0, %zmm0394; AVX512VL-NEXT: vpmovdw %zmm0, %ymm0395; AVX512VL-NEXT: retq396;397; AVX512BWNOVL-LABEL: var_ashr_v16i16:398; AVX512BWNOVL: # %bb.0:399; AVX512BWNOVL-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1400; AVX512BWNOVL-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0401; AVX512BWNOVL-NEXT: vpsravw %zmm1, %zmm0, %zmm0402; AVX512BWNOVL-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0403; AVX512BWNOVL-NEXT: retq404 %shift = ashr <16 x i16> %a, %b405 ret <16 x i16> %shift406}407 408define <16 x i8> @var_ashr_v16i8(<16 x i8> %a, <16 x i8> %b) {409; AVX256BW-LABEL: var_ashr_v16i8:410; AVX256BW: # %bb.0:411; AVX256BW-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero412; AVX256BW-NEXT: vpmovsxbw %xmm0, %ymm0413; AVX256BW-NEXT: vpsravw %ymm1, %ymm0, %ymm0414; AVX256BW-NEXT: vpmovwb %ymm0, %xmm0415; AVX256BW-NEXT: vzeroupper416; AVX256BW-NEXT: retq417;418; AVX512BWVL-LABEL: var_ashr_v16i8:419; AVX512BWVL: # %bb.0:420; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero421; AVX512BWVL-NEXT: vpmovsxbw %xmm0, %ymm0422; AVX512BWVL-NEXT: vpsravw %ymm1, %ymm0, %ymm0423; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm0424; AVX512BWVL-NEXT: vzeroupper425; AVX512BWVL-NEXT: retq426;427; AVX256VL-LABEL: var_ashr_v16i8:428; AVX256VL: # %bb.0:429; AVX256VL-NEXT: vpsllw $5, %xmm1, %xmm1430; AVX256VL-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]431; AVX256VL-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]432; AVX256VL-NEXT: vpsraw $4, %xmm3, %xmm4433; AVX256VL-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3434; AVX256VL-NEXT: vpsraw $2, %xmm3, %xmm4435; AVX256VL-NEXT: vpaddw %xmm2, %xmm2, %xmm5436; AVX256VL-NEXT: vpblendvb %xmm5, %xmm4, %xmm3, %xmm3437; AVX256VL-NEXT: vpsraw $1, %xmm3, %xmm4438; AVX256VL-NEXT: vpsllw $2, %xmm2, %xmm2439; AVX256VL-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm2440; AVX256VL-NEXT: vpsrlw $8, %xmm2, %xmm2441; AVX256VL-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]442; AVX256VL-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]443; AVX256VL-NEXT: vpsraw $4, %xmm0, %xmm3444; AVX256VL-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0445; AVX256VL-NEXT: vpsraw $2, %xmm0, %xmm3446; AVX256VL-NEXT: vpaddw %xmm1, %xmm1, %xmm4447; AVX256VL-NEXT: vpblendvb %xmm4, %xmm3, %xmm0, %xmm0448; AVX256VL-NEXT: vpsraw $1, %xmm0, %xmm3449; AVX256VL-NEXT: vpsllw $2, %xmm1, %xmm1450; AVX256VL-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0451; AVX256VL-NEXT: vpsrlw $8, %xmm0, %xmm0452; AVX256VL-NEXT: vpackuswb %xmm2, %xmm0, %xmm0453; AVX256VL-NEXT: retq454;455; AVX512VL-LABEL: var_ashr_v16i8:456; AVX512VL: # %bb.0:457; AVX512VL-NEXT: vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero458; AVX512VL-NEXT: vpmovsxbd %xmm0, %zmm0459; AVX512VL-NEXT: vpsravd %zmm1, %zmm0, %zmm0460; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0461; AVX512VL-NEXT: vzeroupper462; AVX512VL-NEXT: retq463;464; AVX512BWNOVL-LABEL: var_ashr_v16i8:465; AVX512BWNOVL: # %bb.0:466; AVX512BWNOVL-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero467; AVX512BWNOVL-NEXT: vpmovsxbw %xmm0, %ymm0468; AVX512BWNOVL-NEXT: vpsravw %zmm1, %zmm0, %zmm0469; AVX512BWNOVL-NEXT: vpmovwb %zmm0, %ymm0470; AVX512BWNOVL-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0471; AVX512BWNOVL-NEXT: vzeroupper472; AVX512BWNOVL-NEXT: retq473 %shift = ashr <16 x i8> %a, %b474 ret <16 x i8> %shift475}476