2106 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE414; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX26; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefixes=XOP,XOPAVX17; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=XOP,XOPAVX28; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq | FileCheck %s --check-prefixes=AVX512,AVX512DQ9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefixes=AVX512VL,AVX512DQVL11; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512VL,AVX512BWVL12;13; Just one 32-bit run to make sure we do reasonable things for i64 shifts.14; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X86-SSE15 16;17; Variable Shifts18;19 20define <2 x i32> @var_shift_v2i32(<2 x i32> %a, <2 x i32> %b) nounwind {21; SSE2-LABEL: var_shift_v2i32:22; SSE2: # %bb.0:23; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm1[2,3,3,3,4,5,6,7]24; SSE2-NEXT: movdqa %xmm0, %xmm325; SSE2-NEXT: psrld %xmm2, %xmm326; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm1[0,1,1,1,4,5,6,7]27; SSE2-NEXT: movdqa %xmm0, %xmm228; SSE2-NEXT: psrld %xmm4, %xmm229; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]30; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]31; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm1[2,3,3,3,4,5,6,7]32; SSE2-NEXT: movdqa %xmm0, %xmm433; SSE2-NEXT: psrld %xmm3, %xmm434; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,1,4,5,6,7]35; SSE2-NEXT: psrld %xmm1, %xmm036; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm4[1]37; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,3],xmm0[0,3]38; SSE2-NEXT: movaps %xmm2, %xmm039; SSE2-NEXT: retq40;41; SSE41-LABEL: var_shift_v2i32:42; SSE41: # %bb.0:43; SSE41-NEXT: pshuflw {{.*#+}} xmm2 = xmm1[2,3,3,3,4,5,6,7]44; SSE41-NEXT: movdqa %xmm0, %xmm345; SSE41-NEXT: psrld %xmm2, %xmm346; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]47; SSE41-NEXT: pshuflw {{.*#+}} xmm4 = xmm2[2,3,3,3,4,5,6,7]48; SSE41-NEXT: movdqa %xmm0, %xmm549; SSE41-NEXT: psrld %xmm4, %xmm550; SSE41-NEXT: pblendw {{.*#+}} xmm5 = xmm3[0,1,2,3],xmm5[4,5,6,7]51; SSE41-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,1,4,5,6,7]52; SSE41-NEXT: movdqa %xmm0, %xmm353; SSE41-NEXT: psrld %xmm1, %xmm354; SSE41-NEXT: pshuflw {{.*#+}} xmm1 = xmm2[0,1,1,1,4,5,6,7]55; SSE41-NEXT: psrld %xmm1, %xmm056; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]57; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm5[2,3],xmm0[4,5],xmm5[6,7]58; SSE41-NEXT: retq59;60; AVX1-LABEL: var_shift_v2i32:61; AVX1: # %bb.0:62; AVX1-NEXT: vpsrldq {{.*#+}} xmm2 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero63; AVX1-NEXT: vpsrld %xmm2, %xmm0, %xmm264; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm365; AVX1-NEXT: vpsrld %xmm3, %xmm0, %xmm366; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]67; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm368; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm3 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]69; AVX1-NEXT: vpsrld %xmm3, %xmm0, %xmm370; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero71; AVX1-NEXT: vpsrld %xmm1, %xmm0, %xmm072; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]73; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]74; AVX1-NEXT: retq75;76; AVX2-LABEL: var_shift_v2i32:77; AVX2: # %bb.0:78; AVX2-NEXT: vpsrlvd %xmm1, %xmm0, %xmm079; AVX2-NEXT: retq80;81; XOPAVX1-LABEL: var_shift_v2i32:82; XOPAVX1: # %bb.0:83; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm284; XOPAVX1-NEXT: vpsubd %xmm1, %xmm2, %xmm185; XOPAVX1-NEXT: vpshld %xmm1, %xmm0, %xmm086; XOPAVX1-NEXT: retq87;88; XOPAVX2-LABEL: var_shift_v2i32:89; XOPAVX2: # %bb.0:90; XOPAVX2-NEXT: vpsrlvd %xmm1, %xmm0, %xmm091; XOPAVX2-NEXT: retq92;93; AVX512-LABEL: var_shift_v2i32:94; AVX512: # %bb.0:95; AVX512-NEXT: vpsrlvd %xmm1, %xmm0, %xmm096; AVX512-NEXT: retq97;98; AVX512VL-LABEL: var_shift_v2i32:99; AVX512VL: # %bb.0:100; AVX512VL-NEXT: vpsrlvd %xmm1, %xmm0, %xmm0101; AVX512VL-NEXT: retq102;103; X86-SSE-LABEL: var_shift_v2i32:104; X86-SSE: # %bb.0:105; X86-SSE-NEXT: pshuflw {{.*#+}} xmm2 = xmm1[2,3,3,3,4,5,6,7]106; X86-SSE-NEXT: movdqa %xmm0, %xmm3107; X86-SSE-NEXT: psrld %xmm2, %xmm3108; X86-SSE-NEXT: pshuflw {{.*#+}} xmm4 = xmm1[0,1,1,1,4,5,6,7]109; X86-SSE-NEXT: movdqa %xmm0, %xmm2110; X86-SSE-NEXT: psrld %xmm4, %xmm2111; X86-SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]112; X86-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]113; X86-SSE-NEXT: pshuflw {{.*#+}} xmm3 = xmm1[2,3,3,3,4,5,6,7]114; X86-SSE-NEXT: movdqa %xmm0, %xmm4115; X86-SSE-NEXT: psrld %xmm3, %xmm4116; X86-SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,1,4,5,6,7]117; X86-SSE-NEXT: psrld %xmm1, %xmm0118; X86-SSE-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm4[1]119; X86-SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,3],xmm0[0,3]120; X86-SSE-NEXT: movaps %xmm2, %xmm0121; X86-SSE-NEXT: retl122 %shift = lshr <2 x i32> %a, %b123 ret <2 x i32> %shift124}125 126define <4 x i16> @var_shift_v4i16(<4 x i16> %a, <4 x i16> %b) nounwind {127; SSE2-LABEL: var_shift_v4i16:128; SSE2: # %bb.0:129; SSE2-NEXT: psllw $12, %xmm1130; SSE2-NEXT: movdqa %xmm1, %xmm2131; SSE2-NEXT: psraw $15, %xmm2132; SSE2-NEXT: movdqa %xmm2, %xmm3133; SSE2-NEXT: pandn %xmm0, %xmm3134; SSE2-NEXT: psrlw $8, %xmm0135; SSE2-NEXT: pand %xmm2, %xmm0136; SSE2-NEXT: por %xmm3, %xmm0137; SSE2-NEXT: paddw %xmm1, %xmm1138; SSE2-NEXT: movdqa %xmm1, %xmm2139; SSE2-NEXT: psraw $15, %xmm2140; SSE2-NEXT: movdqa %xmm2, %xmm3141; SSE2-NEXT: pandn %xmm0, %xmm3142; SSE2-NEXT: psrlw $4, %xmm0143; SSE2-NEXT: pand %xmm2, %xmm0144; SSE2-NEXT: por %xmm3, %xmm0145; SSE2-NEXT: paddw %xmm1, %xmm1146; SSE2-NEXT: movdqa %xmm1, %xmm2147; SSE2-NEXT: psraw $15, %xmm2148; SSE2-NEXT: movdqa %xmm2, %xmm3149; SSE2-NEXT: pandn %xmm0, %xmm3150; SSE2-NEXT: psrlw $2, %xmm0151; SSE2-NEXT: pand %xmm2, %xmm0152; SSE2-NEXT: por %xmm3, %xmm0153; SSE2-NEXT: paddw %xmm1, %xmm1154; SSE2-NEXT: psraw $15, %xmm1155; SSE2-NEXT: movdqa %xmm1, %xmm2156; SSE2-NEXT: pandn %xmm0, %xmm2157; SSE2-NEXT: psrlw $1, %xmm0158; SSE2-NEXT: pand %xmm1, %xmm0159; SSE2-NEXT: por %xmm2, %xmm0160; SSE2-NEXT: retq161;162; SSE41-LABEL: var_shift_v4i16:163; SSE41: # %bb.0:164; SSE41-NEXT: movdqa %xmm0, %xmm2165; SSE41-NEXT: movdqa %xmm1, %xmm0166; SSE41-NEXT: psllw $12, %xmm0167; SSE41-NEXT: psllw $4, %xmm1168; SSE41-NEXT: por %xmm1, %xmm0169; SSE41-NEXT: movdqa %xmm0, %xmm1170; SSE41-NEXT: paddw %xmm0, %xmm1171; SSE41-NEXT: movdqa %xmm2, %xmm3172; SSE41-NEXT: psrlw $8, %xmm3173; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2174; SSE41-NEXT: movdqa %xmm2, %xmm3175; SSE41-NEXT: psrlw $4, %xmm3176; SSE41-NEXT: movdqa %xmm1, %xmm0177; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2178; SSE41-NEXT: movdqa %xmm2, %xmm3179; SSE41-NEXT: psrlw $2, %xmm3180; SSE41-NEXT: paddw %xmm1, %xmm1181; SSE41-NEXT: movdqa %xmm1, %xmm0182; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2183; SSE41-NEXT: movdqa %xmm2, %xmm3184; SSE41-NEXT: psrlw $1, %xmm3185; SSE41-NEXT: paddw %xmm1, %xmm1186; SSE41-NEXT: movdqa %xmm1, %xmm0187; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2188; SSE41-NEXT: movdqa %xmm2, %xmm0189; SSE41-NEXT: retq190;191; AVX1-LABEL: var_shift_v4i16:192; AVX1: # %bb.0:193; AVX1-NEXT: vpsllw $12, %xmm1, %xmm2194; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1195; AVX1-NEXT: vpor %xmm2, %xmm1, %xmm1196; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm2197; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm3198; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0199; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm3200; AVX1-NEXT: vpblendvb %xmm2, %xmm3, %xmm0, %xmm0201; AVX1-NEXT: vpsrlw $2, %xmm0, %xmm2202; AVX1-NEXT: vpsllw $2, %xmm1, %xmm3203; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm0, %xmm0204; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm2205; AVX1-NEXT: vpsllw $3, %xmm1, %xmm1206; AVX1-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0207; AVX1-NEXT: retq208;209; AVX2-LABEL: var_shift_v4i16:210; AVX2: # %bb.0:211; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero212; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero213; AVX2-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0214; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1215; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0216; AVX2-NEXT: vzeroupper217; AVX2-NEXT: retq218;219; XOP-LABEL: var_shift_v4i16:220; XOP: # %bb.0:221; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2222; XOP-NEXT: vpsubw %xmm1, %xmm2, %xmm1223; XOP-NEXT: vpshlw %xmm1, %xmm0, %xmm0224; XOP-NEXT: retq225;226; AVX512DQ-LABEL: var_shift_v4i16:227; AVX512DQ: # %bb.0:228; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero229; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero230; AVX512DQ-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0231; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm0232; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0233; AVX512DQ-NEXT: vzeroupper234; AVX512DQ-NEXT: retq235;236; AVX512BW-LABEL: var_shift_v4i16:237; AVX512BW: # %bb.0:238; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1239; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0240; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm0241; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0242; AVX512BW-NEXT: vzeroupper243; AVX512BW-NEXT: retq244;245; AVX512DQVL-LABEL: var_shift_v4i16:246; AVX512DQVL: # %bb.0:247; AVX512DQVL-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero248; AVX512DQVL-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero249; AVX512DQVL-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0250; AVX512DQVL-NEXT: vpmovdw %ymm0, %xmm0251; AVX512DQVL-NEXT: vzeroupper252; AVX512DQVL-NEXT: retq253;254; AVX512BWVL-LABEL: var_shift_v4i16:255; AVX512BWVL: # %bb.0:256; AVX512BWVL-NEXT: vpsrlvw %xmm1, %xmm0, %xmm0257; AVX512BWVL-NEXT: retq258;259; X86-SSE-LABEL: var_shift_v4i16:260; X86-SSE: # %bb.0:261; X86-SSE-NEXT: psllw $12, %xmm1262; X86-SSE-NEXT: movdqa %xmm1, %xmm2263; X86-SSE-NEXT: psraw $15, %xmm2264; X86-SSE-NEXT: movdqa %xmm2, %xmm3265; X86-SSE-NEXT: pandn %xmm0, %xmm3266; X86-SSE-NEXT: psrlw $8, %xmm0267; X86-SSE-NEXT: pand %xmm2, %xmm0268; X86-SSE-NEXT: por %xmm3, %xmm0269; X86-SSE-NEXT: paddw %xmm1, %xmm1270; X86-SSE-NEXT: movdqa %xmm1, %xmm2271; X86-SSE-NEXT: psraw $15, %xmm2272; X86-SSE-NEXT: movdqa %xmm2, %xmm3273; X86-SSE-NEXT: pandn %xmm0, %xmm3274; X86-SSE-NEXT: psrlw $4, %xmm0275; X86-SSE-NEXT: pand %xmm2, %xmm0276; X86-SSE-NEXT: por %xmm3, %xmm0277; X86-SSE-NEXT: paddw %xmm1, %xmm1278; X86-SSE-NEXT: movdqa %xmm1, %xmm2279; X86-SSE-NEXT: psraw $15, %xmm2280; X86-SSE-NEXT: movdqa %xmm2, %xmm3281; X86-SSE-NEXT: pandn %xmm0, %xmm3282; X86-SSE-NEXT: psrlw $2, %xmm0283; X86-SSE-NEXT: pand %xmm2, %xmm0284; X86-SSE-NEXT: por %xmm3, %xmm0285; X86-SSE-NEXT: paddw %xmm1, %xmm1286; X86-SSE-NEXT: psraw $15, %xmm1287; X86-SSE-NEXT: movdqa %xmm1, %xmm2288; X86-SSE-NEXT: pandn %xmm0, %xmm2289; X86-SSE-NEXT: psrlw $1, %xmm0290; X86-SSE-NEXT: pand %xmm1, %xmm0291; X86-SSE-NEXT: por %xmm2, %xmm0292; X86-SSE-NEXT: retl293 %shift = lshr <4 x i16> %a, %b294 ret <4 x i16> %shift295}296 297define <2 x i16> @var_shift_v2i16(<2 x i16> %a, <2 x i16> %b) nounwind {298; SSE2-LABEL: var_shift_v2i16:299; SSE2: # %bb.0:300; SSE2-NEXT: psllw $12, %xmm1301; SSE2-NEXT: movdqa %xmm1, %xmm2302; SSE2-NEXT: psraw $15, %xmm2303; SSE2-NEXT: movdqa %xmm2, %xmm3304; SSE2-NEXT: pandn %xmm0, %xmm3305; SSE2-NEXT: psrlw $8, %xmm0306; SSE2-NEXT: pand %xmm2, %xmm0307; SSE2-NEXT: por %xmm3, %xmm0308; SSE2-NEXT: paddw %xmm1, %xmm1309; SSE2-NEXT: movdqa %xmm1, %xmm2310; SSE2-NEXT: psraw $15, %xmm2311; SSE2-NEXT: movdqa %xmm2, %xmm3312; SSE2-NEXT: pandn %xmm0, %xmm3313; SSE2-NEXT: psrlw $4, %xmm0314; SSE2-NEXT: pand %xmm2, %xmm0315; SSE2-NEXT: por %xmm3, %xmm0316; SSE2-NEXT: paddw %xmm1, %xmm1317; SSE2-NEXT: movdqa %xmm1, %xmm2318; SSE2-NEXT: psraw $15, %xmm2319; SSE2-NEXT: movdqa %xmm2, %xmm3320; SSE2-NEXT: pandn %xmm0, %xmm3321; SSE2-NEXT: psrlw $2, %xmm0322; SSE2-NEXT: pand %xmm2, %xmm0323; SSE2-NEXT: por %xmm3, %xmm0324; SSE2-NEXT: paddw %xmm1, %xmm1325; SSE2-NEXT: psraw $15, %xmm1326; SSE2-NEXT: movdqa %xmm1, %xmm2327; SSE2-NEXT: pandn %xmm0, %xmm2328; SSE2-NEXT: psrlw $1, %xmm0329; SSE2-NEXT: pand %xmm1, %xmm0330; SSE2-NEXT: por %xmm2, %xmm0331; SSE2-NEXT: retq332;333; SSE41-LABEL: var_shift_v2i16:334; SSE41: # %bb.0:335; SSE41-NEXT: movdqa %xmm0, %xmm2336; SSE41-NEXT: movdqa %xmm1, %xmm0337; SSE41-NEXT: psllw $12, %xmm0338; SSE41-NEXT: psllw $4, %xmm1339; SSE41-NEXT: por %xmm1, %xmm0340; SSE41-NEXT: movdqa %xmm0, %xmm1341; SSE41-NEXT: paddw %xmm0, %xmm1342; SSE41-NEXT: movdqa %xmm2, %xmm3343; SSE41-NEXT: psrlw $8, %xmm3344; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2345; SSE41-NEXT: movdqa %xmm2, %xmm3346; SSE41-NEXT: psrlw $4, %xmm3347; SSE41-NEXT: movdqa %xmm1, %xmm0348; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2349; SSE41-NEXT: movdqa %xmm2, %xmm3350; SSE41-NEXT: psrlw $2, %xmm3351; SSE41-NEXT: paddw %xmm1, %xmm1352; SSE41-NEXT: movdqa %xmm1, %xmm0353; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2354; SSE41-NEXT: movdqa %xmm2, %xmm3355; SSE41-NEXT: psrlw $1, %xmm3356; SSE41-NEXT: paddw %xmm1, %xmm1357; SSE41-NEXT: movdqa %xmm1, %xmm0358; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2359; SSE41-NEXT: movdqa %xmm2, %xmm0360; SSE41-NEXT: retq361;362; AVX1-LABEL: var_shift_v2i16:363; AVX1: # %bb.0:364; AVX1-NEXT: vpsllw $12, %xmm1, %xmm2365; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1366; AVX1-NEXT: vpor %xmm2, %xmm1, %xmm1367; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm2368; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm3369; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0370; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm3371; AVX1-NEXT: vpblendvb %xmm2, %xmm3, %xmm0, %xmm0372; AVX1-NEXT: vpsrlw $2, %xmm0, %xmm2373; AVX1-NEXT: vpsllw $2, %xmm1, %xmm3374; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm0, %xmm0375; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm2376; AVX1-NEXT: vpsllw $3, %xmm1, %xmm1377; AVX1-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0378; AVX1-NEXT: retq379;380; AVX2-LABEL: var_shift_v2i16:381; AVX2: # %bb.0:382; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero383; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero384; AVX2-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0385; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1386; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0387; AVX2-NEXT: vzeroupper388; AVX2-NEXT: retq389;390; XOP-LABEL: var_shift_v2i16:391; XOP: # %bb.0:392; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2393; XOP-NEXT: vpsubw %xmm1, %xmm2, %xmm1394; XOP-NEXT: vpshlw %xmm1, %xmm0, %xmm0395; XOP-NEXT: retq396;397; AVX512DQ-LABEL: var_shift_v2i16:398; AVX512DQ: # %bb.0:399; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero400; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero401; AVX512DQ-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0402; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm0403; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0404; AVX512DQ-NEXT: vzeroupper405; AVX512DQ-NEXT: retq406;407; AVX512BW-LABEL: var_shift_v2i16:408; AVX512BW: # %bb.0:409; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1410; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0411; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm0412; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0413; AVX512BW-NEXT: vzeroupper414; AVX512BW-NEXT: retq415;416; AVX512DQVL-LABEL: var_shift_v2i16:417; AVX512DQVL: # %bb.0:418; AVX512DQVL-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero419; AVX512DQVL-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero420; AVX512DQVL-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0421; AVX512DQVL-NEXT: vpmovdw %ymm0, %xmm0422; AVX512DQVL-NEXT: vzeroupper423; AVX512DQVL-NEXT: retq424;425; AVX512BWVL-LABEL: var_shift_v2i16:426; AVX512BWVL: # %bb.0:427; AVX512BWVL-NEXT: vpsrlvw %xmm1, %xmm0, %xmm0428; AVX512BWVL-NEXT: retq429;430; X86-SSE-LABEL: var_shift_v2i16:431; X86-SSE: # %bb.0:432; X86-SSE-NEXT: psllw $12, %xmm1433; X86-SSE-NEXT: movdqa %xmm1, %xmm2434; X86-SSE-NEXT: psraw $15, %xmm2435; X86-SSE-NEXT: movdqa %xmm2, %xmm3436; X86-SSE-NEXT: pandn %xmm0, %xmm3437; X86-SSE-NEXT: psrlw $8, %xmm0438; X86-SSE-NEXT: pand %xmm2, %xmm0439; X86-SSE-NEXT: por %xmm3, %xmm0440; X86-SSE-NEXT: paddw %xmm1, %xmm1441; X86-SSE-NEXT: movdqa %xmm1, %xmm2442; X86-SSE-NEXT: psraw $15, %xmm2443; X86-SSE-NEXT: movdqa %xmm2, %xmm3444; X86-SSE-NEXT: pandn %xmm0, %xmm3445; X86-SSE-NEXT: psrlw $4, %xmm0446; X86-SSE-NEXT: pand %xmm2, %xmm0447; X86-SSE-NEXT: por %xmm3, %xmm0448; X86-SSE-NEXT: paddw %xmm1, %xmm1449; X86-SSE-NEXT: movdqa %xmm1, %xmm2450; X86-SSE-NEXT: psraw $15, %xmm2451; X86-SSE-NEXT: movdqa %xmm2, %xmm3452; X86-SSE-NEXT: pandn %xmm0, %xmm3453; X86-SSE-NEXT: psrlw $2, %xmm0454; X86-SSE-NEXT: pand %xmm2, %xmm0455; X86-SSE-NEXT: por %xmm3, %xmm0456; X86-SSE-NEXT: paddw %xmm1, %xmm1457; X86-SSE-NEXT: psraw $15, %xmm1458; X86-SSE-NEXT: movdqa %xmm1, %xmm2459; X86-SSE-NEXT: pandn %xmm0, %xmm2460; X86-SSE-NEXT: psrlw $1, %xmm0461; X86-SSE-NEXT: pand %xmm1, %xmm0462; X86-SSE-NEXT: por %xmm2, %xmm0463; X86-SSE-NEXT: retl464 %shift = lshr <2 x i16> %a, %b465 ret <2 x i16> %shift466}467 468define <8 x i8> @var_shift_v8i8(<8 x i8> %a, <8 x i8> %b) nounwind {469; SSE2-LABEL: var_shift_v8i8:470; SSE2: # %bb.0:471; SSE2-NEXT: psllw $5, %xmm1472; SSE2-NEXT: pxor %xmm2, %xmm2473; SSE2-NEXT: pxor %xmm3, %xmm3474; SSE2-NEXT: pcmpgtb %xmm1, %xmm3475; SSE2-NEXT: movdqa %xmm3, %xmm4476; SSE2-NEXT: pandn %xmm0, %xmm4477; SSE2-NEXT: psrlw $4, %xmm0478; SSE2-NEXT: pand %xmm3, %xmm0479; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0480; SSE2-NEXT: por %xmm4, %xmm0481; SSE2-NEXT: paddb %xmm1, %xmm1482; SSE2-NEXT: pxor %xmm3, %xmm3483; SSE2-NEXT: pcmpgtb %xmm1, %xmm3484; SSE2-NEXT: movdqa %xmm3, %xmm4485; SSE2-NEXT: pandn %xmm0, %xmm4486; SSE2-NEXT: psrlw $2, %xmm0487; SSE2-NEXT: pand %xmm3, %xmm0488; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0489; SSE2-NEXT: por %xmm4, %xmm0490; SSE2-NEXT: paddb %xmm1, %xmm1491; SSE2-NEXT: pcmpgtb %xmm1, %xmm2492; SSE2-NEXT: movdqa %xmm2, %xmm1493; SSE2-NEXT: pandn %xmm0, %xmm1494; SSE2-NEXT: psrlw $1, %xmm0495; SSE2-NEXT: pand %xmm2, %xmm0496; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0497; SSE2-NEXT: por %xmm1, %xmm0498; SSE2-NEXT: retq499;500; SSE41-LABEL: var_shift_v8i8:501; SSE41: # %bb.0:502; SSE41-NEXT: movdqa %xmm0, %xmm2503; SSE41-NEXT: psllw $5, %xmm1504; SSE41-NEXT: movdqa %xmm0, %xmm3505; SSE41-NEXT: psrlw $4, %xmm3506; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3507; SSE41-NEXT: movdqa %xmm1, %xmm0508; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2509; SSE41-NEXT: movdqa %xmm2, %xmm3510; SSE41-NEXT: psrlw $2, %xmm3511; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3512; SSE41-NEXT: paddb %xmm1, %xmm1513; SSE41-NEXT: movdqa %xmm1, %xmm0514; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2515; SSE41-NEXT: movdqa %xmm2, %xmm3516; SSE41-NEXT: psrlw $1, %xmm3517; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3518; SSE41-NEXT: paddb %xmm1, %xmm1519; SSE41-NEXT: movdqa %xmm1, %xmm0520; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2521; SSE41-NEXT: movdqa %xmm2, %xmm0522; SSE41-NEXT: retq523;524; AVX-LABEL: var_shift_v8i8:525; AVX: # %bb.0:526; AVX-NEXT: vpsllw $5, %xmm1, %xmm1527; AVX-NEXT: vpsrlw $4, %xmm0, %xmm2528; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2529; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0530; AVX-NEXT: vpsrlw $2, %xmm0, %xmm2531; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2532; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1533; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0534; AVX-NEXT: vpsrlw $1, %xmm0, %xmm2535; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2536; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1537; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0538; AVX-NEXT: retq539;540; XOP-LABEL: var_shift_v8i8:541; XOP: # %bb.0:542; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2543; XOP-NEXT: vpsubb %xmm1, %xmm2, %xmm1544; XOP-NEXT: vpshlb %xmm1, %xmm0, %xmm0545; XOP-NEXT: retq546;547; AVX512DQ-LABEL: var_shift_v8i8:548; AVX512DQ: # %bb.0:549; AVX512DQ-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,zero550; AVX512DQ-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,zero551; AVX512DQ-NEXT: vpsrlvd %zmm1, %zmm0, %zmm0552; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0553; AVX512DQ-NEXT: vzeroupper554; AVX512DQ-NEXT: retq555;556; AVX512BW-LABEL: var_shift_v8i8:557; AVX512BW: # %bb.0:558; AVX512BW-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],zero559; AVX512BW-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],zero560; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm0561; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0562; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0563; AVX512BW-NEXT: vzeroupper564; AVX512BW-NEXT: retq565;566; AVX512DQVL-LABEL: var_shift_v8i8:567; AVX512DQVL: # %bb.0:568; AVX512DQVL-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,zero569; AVX512DQVL-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,zero570; AVX512DQVL-NEXT: vpsrlvd %zmm1, %zmm0, %zmm0571; AVX512DQVL-NEXT: vpmovdb %zmm0, %xmm0572; AVX512DQVL-NEXT: vzeroupper573; AVX512DQVL-NEXT: retq574;575; AVX512BWVL-LABEL: var_shift_v8i8:576; AVX512BWVL: # %bb.0:577; 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],zero578; 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],zero579; AVX512BWVL-NEXT: vpsrlvw %ymm1, %ymm0, %ymm0580; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm0581; AVX512BWVL-NEXT: vzeroupper582; AVX512BWVL-NEXT: retq583;584; X86-SSE-LABEL: var_shift_v8i8:585; X86-SSE: # %bb.0:586; X86-SSE-NEXT: psllw $5, %xmm1587; X86-SSE-NEXT: pxor %xmm2, %xmm2588; X86-SSE-NEXT: pxor %xmm3, %xmm3589; X86-SSE-NEXT: pcmpgtb %xmm1, %xmm3590; X86-SSE-NEXT: movdqa %xmm3, %xmm4591; X86-SSE-NEXT: pandn %xmm0, %xmm4592; X86-SSE-NEXT: psrlw $4, %xmm0593; X86-SSE-NEXT: pand %xmm3, %xmm0594; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0595; X86-SSE-NEXT: por %xmm4, %xmm0596; X86-SSE-NEXT: paddb %xmm1, %xmm1597; X86-SSE-NEXT: pxor %xmm3, %xmm3598; X86-SSE-NEXT: pcmpgtb %xmm1, %xmm3599; X86-SSE-NEXT: movdqa %xmm3, %xmm4600; X86-SSE-NEXT: pandn %xmm0, %xmm4601; X86-SSE-NEXT: psrlw $2, %xmm0602; X86-SSE-NEXT: pand %xmm3, %xmm0603; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0604; X86-SSE-NEXT: por %xmm4, %xmm0605; X86-SSE-NEXT: paddb %xmm1, %xmm1606; X86-SSE-NEXT: pcmpgtb %xmm1, %xmm2607; X86-SSE-NEXT: movdqa %xmm2, %xmm1608; X86-SSE-NEXT: pandn %xmm0, %xmm1609; X86-SSE-NEXT: psrlw $1, %xmm0610; X86-SSE-NEXT: pand %xmm2, %xmm0611; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0612; X86-SSE-NEXT: por %xmm1, %xmm0613; X86-SSE-NEXT: retl614 %shift = lshr <8 x i8> %a, %b615 ret <8 x i8> %shift616}617 618define <4 x i8> @var_shift_v4i8(<4 x i8> %a, <4 x i8> %b) nounwind {619; SSE2-LABEL: var_shift_v4i8:620; SSE2: # %bb.0:621; SSE2-NEXT: psllw $5, %xmm1622; SSE2-NEXT: pxor %xmm2, %xmm2623; SSE2-NEXT: pxor %xmm3, %xmm3624; SSE2-NEXT: pcmpgtb %xmm1, %xmm3625; SSE2-NEXT: movdqa %xmm3, %xmm4626; SSE2-NEXT: pandn %xmm0, %xmm4627; SSE2-NEXT: psrlw $4, %xmm0628; SSE2-NEXT: pand %xmm3, %xmm0629; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0630; SSE2-NEXT: por %xmm4, %xmm0631; SSE2-NEXT: paddb %xmm1, %xmm1632; SSE2-NEXT: pxor %xmm3, %xmm3633; SSE2-NEXT: pcmpgtb %xmm1, %xmm3634; SSE2-NEXT: movdqa %xmm3, %xmm4635; SSE2-NEXT: pandn %xmm0, %xmm4636; SSE2-NEXT: psrlw $2, %xmm0637; SSE2-NEXT: pand %xmm3, %xmm0638; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0639; SSE2-NEXT: por %xmm4, %xmm0640; SSE2-NEXT: paddb %xmm1, %xmm1641; SSE2-NEXT: pcmpgtb %xmm1, %xmm2642; SSE2-NEXT: movdqa %xmm2, %xmm1643; SSE2-NEXT: pandn %xmm0, %xmm1644; SSE2-NEXT: psrlw $1, %xmm0645; SSE2-NEXT: pand %xmm2, %xmm0646; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0647; SSE2-NEXT: por %xmm1, %xmm0648; SSE2-NEXT: retq649;650; SSE41-LABEL: var_shift_v4i8:651; SSE41: # %bb.0:652; SSE41-NEXT: movdqa %xmm0, %xmm2653; SSE41-NEXT: psllw $5, %xmm1654; SSE41-NEXT: movdqa %xmm0, %xmm3655; SSE41-NEXT: psrlw $4, %xmm3656; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3657; SSE41-NEXT: movdqa %xmm1, %xmm0658; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2659; SSE41-NEXT: movdqa %xmm2, %xmm3660; SSE41-NEXT: psrlw $2, %xmm3661; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3662; SSE41-NEXT: paddb %xmm1, %xmm1663; SSE41-NEXT: movdqa %xmm1, %xmm0664; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2665; SSE41-NEXT: movdqa %xmm2, %xmm3666; SSE41-NEXT: psrlw $1, %xmm3667; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3668; SSE41-NEXT: paddb %xmm1, %xmm1669; SSE41-NEXT: movdqa %xmm1, %xmm0670; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2671; SSE41-NEXT: movdqa %xmm2, %xmm0672; SSE41-NEXT: retq673;674; AVX-LABEL: var_shift_v4i8:675; AVX: # %bb.0:676; AVX-NEXT: vpsllw $5, %xmm1, %xmm1677; AVX-NEXT: vpsrlw $4, %xmm0, %xmm2678; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2679; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0680; AVX-NEXT: vpsrlw $2, %xmm0, %xmm2681; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2682; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1683; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0684; AVX-NEXT: vpsrlw $1, %xmm0, %xmm2685; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2686; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1687; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0688; AVX-NEXT: retq689;690; XOP-LABEL: var_shift_v4i8:691; XOP: # %bb.0:692; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2693; XOP-NEXT: vpsubb %xmm1, %xmm2, %xmm1694; XOP-NEXT: vpshlb %xmm1, %xmm0, %xmm0695; XOP-NEXT: retq696;697; AVX512DQ-LABEL: var_shift_v4i8:698; AVX512DQ: # %bb.0:699; AVX512DQ-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,zero700; AVX512DQ-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,zero701; AVX512DQ-NEXT: vpsrlvd %zmm1, %zmm0, %zmm0702; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0703; AVX512DQ-NEXT: vzeroupper704; AVX512DQ-NEXT: retq705;706; AVX512BW-LABEL: var_shift_v4i8:707; AVX512BW: # %bb.0:708; AVX512BW-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],zero709; AVX512BW-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],zero710; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm0711; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0712; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0713; AVX512BW-NEXT: vzeroupper714; AVX512BW-NEXT: retq715;716; AVX512DQVL-LABEL: var_shift_v4i8:717; AVX512DQVL: # %bb.0:718; AVX512DQVL-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,zero719; AVX512DQVL-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,zero720; AVX512DQVL-NEXT: vpsrlvd %zmm1, %zmm0, %zmm0721; AVX512DQVL-NEXT: vpmovdb %zmm0, %xmm0722; AVX512DQVL-NEXT: vzeroupper723; AVX512DQVL-NEXT: retq724;725; AVX512BWVL-LABEL: var_shift_v4i8:726; AVX512BWVL: # %bb.0:727; 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],zero728; 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],zero729; AVX512BWVL-NEXT: vpsrlvw %ymm1, %ymm0, %ymm0730; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm0731; AVX512BWVL-NEXT: vzeroupper732; AVX512BWVL-NEXT: retq733;734; X86-SSE-LABEL: var_shift_v4i8:735; X86-SSE: # %bb.0:736; X86-SSE-NEXT: psllw $5, %xmm1737; X86-SSE-NEXT: pxor %xmm2, %xmm2738; X86-SSE-NEXT: pxor %xmm3, %xmm3739; X86-SSE-NEXT: pcmpgtb %xmm1, %xmm3740; X86-SSE-NEXT: movdqa %xmm3, %xmm4741; X86-SSE-NEXT: pandn %xmm0, %xmm4742; X86-SSE-NEXT: psrlw $4, %xmm0743; X86-SSE-NEXT: pand %xmm3, %xmm0744; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0745; X86-SSE-NEXT: por %xmm4, %xmm0746; X86-SSE-NEXT: paddb %xmm1, %xmm1747; X86-SSE-NEXT: pxor %xmm3, %xmm3748; X86-SSE-NEXT: pcmpgtb %xmm1, %xmm3749; X86-SSE-NEXT: movdqa %xmm3, %xmm4750; X86-SSE-NEXT: pandn %xmm0, %xmm4751; X86-SSE-NEXT: psrlw $2, %xmm0752; X86-SSE-NEXT: pand %xmm3, %xmm0753; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0754; X86-SSE-NEXT: por %xmm4, %xmm0755; X86-SSE-NEXT: paddb %xmm1, %xmm1756; X86-SSE-NEXT: pcmpgtb %xmm1, %xmm2757; X86-SSE-NEXT: movdqa %xmm2, %xmm1758; X86-SSE-NEXT: pandn %xmm0, %xmm1759; X86-SSE-NEXT: psrlw $1, %xmm0760; X86-SSE-NEXT: pand %xmm2, %xmm0761; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0762; X86-SSE-NEXT: por %xmm1, %xmm0763; X86-SSE-NEXT: retl764 %shift = lshr <4 x i8> %a, %b765 ret <4 x i8> %shift766}767 768define <2 x i8> @var_shift_v2i8(<2 x i8> %a, <2 x i8> %b) nounwind {769; SSE2-LABEL: var_shift_v2i8:770; SSE2: # %bb.0:771; SSE2-NEXT: psllw $5, %xmm1772; SSE2-NEXT: pxor %xmm2, %xmm2773; SSE2-NEXT: pxor %xmm3, %xmm3774; SSE2-NEXT: pcmpgtb %xmm1, %xmm3775; SSE2-NEXT: movdqa %xmm3, %xmm4776; SSE2-NEXT: pandn %xmm0, %xmm4777; SSE2-NEXT: psrlw $4, %xmm0778; SSE2-NEXT: pand %xmm3, %xmm0779; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0780; SSE2-NEXT: por %xmm4, %xmm0781; SSE2-NEXT: paddb %xmm1, %xmm1782; SSE2-NEXT: pxor %xmm3, %xmm3783; SSE2-NEXT: pcmpgtb %xmm1, %xmm3784; SSE2-NEXT: movdqa %xmm3, %xmm4785; SSE2-NEXT: pandn %xmm0, %xmm4786; SSE2-NEXT: psrlw $2, %xmm0787; SSE2-NEXT: pand %xmm3, %xmm0788; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0789; SSE2-NEXT: por %xmm4, %xmm0790; SSE2-NEXT: paddb %xmm1, %xmm1791; SSE2-NEXT: pcmpgtb %xmm1, %xmm2792; SSE2-NEXT: movdqa %xmm2, %xmm1793; SSE2-NEXT: pandn %xmm0, %xmm1794; SSE2-NEXT: psrlw $1, %xmm0795; SSE2-NEXT: pand %xmm2, %xmm0796; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0797; SSE2-NEXT: por %xmm1, %xmm0798; SSE2-NEXT: retq799;800; SSE41-LABEL: var_shift_v2i8:801; SSE41: # %bb.0:802; SSE41-NEXT: movdqa %xmm0, %xmm2803; SSE41-NEXT: psllw $5, %xmm1804; SSE41-NEXT: movdqa %xmm0, %xmm3805; SSE41-NEXT: psrlw $4, %xmm3806; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3807; SSE41-NEXT: movdqa %xmm1, %xmm0808; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2809; SSE41-NEXT: movdqa %xmm2, %xmm3810; SSE41-NEXT: psrlw $2, %xmm3811; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3812; SSE41-NEXT: paddb %xmm1, %xmm1813; SSE41-NEXT: movdqa %xmm1, %xmm0814; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2815; SSE41-NEXT: movdqa %xmm2, %xmm3816; SSE41-NEXT: psrlw $1, %xmm3817; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3818; SSE41-NEXT: paddb %xmm1, %xmm1819; SSE41-NEXT: movdqa %xmm1, %xmm0820; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2821; SSE41-NEXT: movdqa %xmm2, %xmm0822; SSE41-NEXT: retq823;824; AVX-LABEL: var_shift_v2i8:825; AVX: # %bb.0:826; AVX-NEXT: vpsllw $5, %xmm1, %xmm1827; AVX-NEXT: vpsrlw $4, %xmm0, %xmm2828; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2829; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0830; AVX-NEXT: vpsrlw $2, %xmm0, %xmm2831; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2832; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1833; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0834; AVX-NEXT: vpsrlw $1, %xmm0, %xmm2835; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2836; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1837; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0838; AVX-NEXT: retq839;840; XOP-LABEL: var_shift_v2i8:841; XOP: # %bb.0:842; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2843; XOP-NEXT: vpsubb %xmm1, %xmm2, %xmm1844; XOP-NEXT: vpshlb %xmm1, %xmm0, %xmm0845; XOP-NEXT: retq846;847; AVX512DQ-LABEL: var_shift_v2i8:848; AVX512DQ: # %bb.0:849; AVX512DQ-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,zero850; AVX512DQ-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,zero851; AVX512DQ-NEXT: vpsrlvd %zmm1, %zmm0, %zmm0852; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0853; AVX512DQ-NEXT: vzeroupper854; AVX512DQ-NEXT: retq855;856; AVX512BW-LABEL: var_shift_v2i8:857; AVX512BW: # %bb.0:858; AVX512BW-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],zero859; AVX512BW-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],zero860; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm0861; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0862; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0863; AVX512BW-NEXT: vzeroupper864; AVX512BW-NEXT: retq865;866; AVX512DQVL-LABEL: var_shift_v2i8:867; AVX512DQVL: # %bb.0:868; AVX512DQVL-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,zero869; AVX512DQVL-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,zero870; AVX512DQVL-NEXT: vpsrlvd %zmm1, %zmm0, %zmm0871; AVX512DQVL-NEXT: vpmovdb %zmm0, %xmm0872; AVX512DQVL-NEXT: vzeroupper873; AVX512DQVL-NEXT: retq874;875; AVX512BWVL-LABEL: var_shift_v2i8:876; AVX512BWVL: # %bb.0:877; 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],zero878; 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],zero879; AVX512BWVL-NEXT: vpsrlvw %ymm1, %ymm0, %ymm0880; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm0881; AVX512BWVL-NEXT: vzeroupper882; AVX512BWVL-NEXT: retq883;884; X86-SSE-LABEL: var_shift_v2i8:885; X86-SSE: # %bb.0:886; X86-SSE-NEXT: psllw $5, %xmm1887; X86-SSE-NEXT: pxor %xmm2, %xmm2888; X86-SSE-NEXT: pxor %xmm3, %xmm3889; X86-SSE-NEXT: pcmpgtb %xmm1, %xmm3890; X86-SSE-NEXT: movdqa %xmm3, %xmm4891; X86-SSE-NEXT: pandn %xmm0, %xmm4892; X86-SSE-NEXT: psrlw $4, %xmm0893; X86-SSE-NEXT: pand %xmm3, %xmm0894; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0895; X86-SSE-NEXT: por %xmm4, %xmm0896; X86-SSE-NEXT: paddb %xmm1, %xmm1897; X86-SSE-NEXT: pxor %xmm3, %xmm3898; X86-SSE-NEXT: pcmpgtb %xmm1, %xmm3899; X86-SSE-NEXT: movdqa %xmm3, %xmm4900; X86-SSE-NEXT: pandn %xmm0, %xmm4901; X86-SSE-NEXT: psrlw $2, %xmm0902; X86-SSE-NEXT: pand %xmm3, %xmm0903; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0904; X86-SSE-NEXT: por %xmm4, %xmm0905; X86-SSE-NEXT: paddb %xmm1, %xmm1906; X86-SSE-NEXT: pcmpgtb %xmm1, %xmm2907; X86-SSE-NEXT: movdqa %xmm2, %xmm1908; X86-SSE-NEXT: pandn %xmm0, %xmm1909; X86-SSE-NEXT: psrlw $1, %xmm0910; X86-SSE-NEXT: pand %xmm2, %xmm0911; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0912; X86-SSE-NEXT: por %xmm1, %xmm0913; X86-SSE-NEXT: retl914 %shift = lshr <2 x i8> %a, %b915 ret <2 x i8> %shift916}917 918;919; Uniform Variable Shifts920;921 922define <2 x i32> @splatvar_shift_v2i32(<2 x i32> %a, <2 x i32> %b) nounwind {923; SSE2-LABEL: splatvar_shift_v2i32:924; SSE2: # %bb.0:925; SSE2-NEXT: xorps %xmm2, %xmm2926; SSE2-NEXT: movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]927; SSE2-NEXT: psrld %xmm2, %xmm0928; SSE2-NEXT: retq929;930; SSE41-LABEL: splatvar_shift_v2i32:931; SSE41: # %bb.0:932; SSE41-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero933; SSE41-NEXT: psrld %xmm1, %xmm0934; SSE41-NEXT: retq935;936; AVX-LABEL: splatvar_shift_v2i32:937; AVX: # %bb.0:938; AVX-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero939; AVX-NEXT: vpsrld %xmm1, %xmm0, %xmm0940; AVX-NEXT: retq941;942; XOP-LABEL: splatvar_shift_v2i32:943; XOP: # %bb.0:944; XOP-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero945; XOP-NEXT: vpsrld %xmm1, %xmm0, %xmm0946; XOP-NEXT: retq947;948; AVX512-LABEL: splatvar_shift_v2i32:949; AVX512: # %bb.0:950; AVX512-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero951; AVX512-NEXT: vpsrld %xmm1, %xmm0, %xmm0952; AVX512-NEXT: retq953;954; AVX512VL-LABEL: splatvar_shift_v2i32:955; AVX512VL: # %bb.0:956; AVX512VL-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero957; AVX512VL-NEXT: vpsrld %xmm1, %xmm0, %xmm0958; AVX512VL-NEXT: retq959;960; X86-SSE-LABEL: splatvar_shift_v2i32:961; X86-SSE: # %bb.0:962; X86-SSE-NEXT: xorps %xmm2, %xmm2963; X86-SSE-NEXT: movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]964; X86-SSE-NEXT: psrld %xmm2, %xmm0965; X86-SSE-NEXT: retl966 %splat = shufflevector <2 x i32> %b, <2 x i32> poison, <2 x i32> zeroinitializer967 %shift = lshr <2 x i32> %a, %splat968 ret <2 x i32> %shift969}970 971define <4 x i16> @splatvar_shift_v4i16(<4 x i16> %a, <4 x i16> %b) nounwind {972; SSE2-LABEL: splatvar_shift_v4i16:973; SSE2: # %bb.0:974; SSE2-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]975; SSE2-NEXT: psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero976; SSE2-NEXT: psrlw %xmm1, %xmm0977; SSE2-NEXT: retq978;979; SSE41-LABEL: splatvar_shift_v4i16:980; SSE41: # %bb.0:981; SSE41-NEXT: pmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero982; SSE41-NEXT: psrlw %xmm1, %xmm0983; SSE41-NEXT: retq984;985; AVX-LABEL: splatvar_shift_v4i16:986; AVX: # %bb.0:987; AVX-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero988; AVX-NEXT: vpsrlw %xmm1, %xmm0, %xmm0989; AVX-NEXT: retq990;991; XOP-LABEL: splatvar_shift_v4i16:992; XOP: # %bb.0:993; XOP-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero994; XOP-NEXT: vpsrlw %xmm1, %xmm0, %xmm0995; XOP-NEXT: retq996;997; AVX512-LABEL: splatvar_shift_v4i16:998; AVX512: # %bb.0:999; AVX512-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero1000; AVX512-NEXT: vpsrlw %xmm1, %xmm0, %xmm01001; AVX512-NEXT: retq1002;1003; AVX512VL-LABEL: splatvar_shift_v4i16:1004; AVX512VL: # %bb.0:1005; AVX512VL-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero1006; AVX512VL-NEXT: vpsrlw %xmm1, %xmm0, %xmm01007; AVX512VL-NEXT: retq1008;1009; X86-SSE-LABEL: splatvar_shift_v4i16:1010; X86-SSE: # %bb.0:1011; X86-SSE-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]1012; X86-SSE-NEXT: psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1013; X86-SSE-NEXT: psrlw %xmm1, %xmm01014; X86-SSE-NEXT: retl1015 %splat = shufflevector <4 x i16> %b, <4 x i16> poison, <4 x i32> zeroinitializer1016 %shift = lshr <4 x i16> %a, %splat1017 ret <4 x i16> %shift1018}1019 1020define <2 x i16> @splatvar_shift_v2i16(<2 x i16> %a, <2 x i16> %b) nounwind {1021; SSE2-LABEL: splatvar_shift_v2i16:1022; SSE2: # %bb.0:1023; SSE2-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]1024; SSE2-NEXT: psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1025; SSE2-NEXT: psrlw %xmm1, %xmm01026; SSE2-NEXT: retq1027;1028; SSE41-LABEL: splatvar_shift_v2i16:1029; SSE41: # %bb.0:1030; SSE41-NEXT: pmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero1031; SSE41-NEXT: psrlw %xmm1, %xmm01032; SSE41-NEXT: retq1033;1034; AVX-LABEL: splatvar_shift_v2i16:1035; AVX: # %bb.0:1036; AVX-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero1037; AVX-NEXT: vpsrlw %xmm1, %xmm0, %xmm01038; AVX-NEXT: retq1039;1040; XOP-LABEL: splatvar_shift_v2i16:1041; XOP: # %bb.0:1042; XOP-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero1043; XOP-NEXT: vpsrlw %xmm1, %xmm0, %xmm01044; XOP-NEXT: retq1045;1046; AVX512-LABEL: splatvar_shift_v2i16:1047; AVX512: # %bb.0:1048; AVX512-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero1049; AVX512-NEXT: vpsrlw %xmm1, %xmm0, %xmm01050; AVX512-NEXT: retq1051;1052; AVX512VL-LABEL: splatvar_shift_v2i16:1053; AVX512VL: # %bb.0:1054; AVX512VL-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero1055; AVX512VL-NEXT: vpsrlw %xmm1, %xmm0, %xmm01056; AVX512VL-NEXT: retq1057;1058; X86-SSE-LABEL: splatvar_shift_v2i16:1059; X86-SSE: # %bb.0:1060; X86-SSE-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]1061; X86-SSE-NEXT: psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1062; X86-SSE-NEXT: psrlw %xmm1, %xmm01063; X86-SSE-NEXT: retl1064 %splat = shufflevector <2 x i16> %b, <2 x i16> poison, <2 x i32> zeroinitializer1065 %shift = lshr <2 x i16> %a, %splat1066 ret <2 x i16> %shift1067}1068 1069define <8 x i8> @splatvar_shift_v8i8(<8 x i8> %a, <8 x i8> %b) nounwind {1070; SSE2-LABEL: splatvar_shift_v8i8:1071; SSE2: # %bb.0:1072; SSE2-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]1073; SSE2-NEXT: psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1074; SSE2-NEXT: psrlw %xmm1, %xmm01075; SSE2-NEXT: pcmpeqd %xmm2, %xmm21076; SSE2-NEXT: psrlw %xmm1, %xmm21077; SSE2-NEXT: psrlw $8, %xmm21078; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1079; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm2[0,0,0,0,4,5,6,7]1080; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]1081; SSE2-NEXT: pand %xmm1, %xmm01082; SSE2-NEXT: retq1083;1084; SSE41-LABEL: splatvar_shift_v8i8:1085; SSE41: # %bb.0:1086; SSE41-NEXT: pmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1087; SSE41-NEXT: psrlw %xmm1, %xmm01088; SSE41-NEXT: pcmpeqd %xmm2, %xmm21089; SSE41-NEXT: psrlw %xmm1, %xmm21090; SSE41-NEXT: pshufb {{.*#+}} xmm2 = xmm2[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1091; SSE41-NEXT: pand %xmm2, %xmm01092; SSE41-NEXT: retq1093;1094; AVX1-LABEL: splatvar_shift_v8i8:1095; AVX1: # %bb.0:1096; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1097; AVX1-NEXT: vpsrlw %xmm1, %xmm0, %xmm01098; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm21099; AVX1-NEXT: vpsrlw %xmm1, %xmm2, %xmm11100; AVX1-NEXT: vpshufb {{.*#+}} xmm1 = xmm1[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1101; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm01102; AVX1-NEXT: retq1103;1104; AVX2-LABEL: splatvar_shift_v8i8:1105; AVX2: # %bb.0:1106; AVX2-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1107; AVX2-NEXT: vpsrlw %xmm1, %xmm0, %xmm01108; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm21109; AVX2-NEXT: vpsrlw %xmm1, %xmm2, %xmm11110; AVX2-NEXT: vpsrlw $8, %xmm1, %xmm11111; AVX2-NEXT: vpbroadcastb %xmm1, %xmm11112; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm01113; AVX2-NEXT: retq1114;1115; XOPAVX1-LABEL: splatvar_shift_v8i8:1116; XOPAVX1: # %bb.0:1117; XOPAVX1-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1118; XOPAVX1-NEXT: vpshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]1119; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21120; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm11121; XOPAVX1-NEXT: vpshlb %xmm1, %xmm0, %xmm01122; XOPAVX1-NEXT: retq1123;1124; XOPAVX2-LABEL: splatvar_shift_v8i8:1125; XOPAVX2: # %bb.0:1126; XOPAVX2-NEXT: vpbroadcastb %xmm1, %xmm11127; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm21128; XOPAVX2-NEXT: vpsubb %xmm1, %xmm2, %xmm11129; XOPAVX2-NEXT: vpshlb %xmm1, %xmm0, %xmm01130; XOPAVX2-NEXT: retq1131;1132; AVX512DQ-LABEL: splatvar_shift_v8i8:1133; AVX512DQ: # %bb.0:1134; AVX512DQ-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1135; AVX512DQ-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,zero1136; AVX512DQ-NEXT: vpsrld %xmm1, %zmm0, %zmm01137; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm01138; AVX512DQ-NEXT: vzeroupper1139; AVX512DQ-NEXT: retq1140;1141; AVX512BW-LABEL: splatvar_shift_v8i8:1142; AVX512BW: # %bb.0:1143; AVX512BW-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1144; AVX512BW-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],zero1145; AVX512BW-NEXT: vpsrlw %xmm1, %ymm0, %ymm01146; AVX512BW-NEXT: vpmovwb %zmm0, %ymm01147; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01148; AVX512BW-NEXT: vzeroupper1149; AVX512BW-NEXT: retq1150;1151; AVX512DQVL-LABEL: splatvar_shift_v8i8:1152; AVX512DQVL: # %bb.0:1153; AVX512DQVL-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1154; AVX512DQVL-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,zero1155; AVX512DQVL-NEXT: vpsrld %xmm1, %zmm0, %zmm01156; AVX512DQVL-NEXT: vpmovdb %zmm0, %xmm01157; AVX512DQVL-NEXT: vzeroupper1158; AVX512DQVL-NEXT: retq1159;1160; AVX512BWVL-LABEL: splatvar_shift_v8i8:1161; AVX512BWVL: # %bb.0:1162; AVX512BWVL-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1163; 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],zero1164; AVX512BWVL-NEXT: vpsrlw %xmm1, %ymm0, %ymm01165; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm01166; AVX512BWVL-NEXT: vzeroupper1167; AVX512BWVL-NEXT: retq1168;1169; X86-SSE-LABEL: splatvar_shift_v8i8:1170; X86-SSE: # %bb.0:1171; X86-SSE-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]1172; X86-SSE-NEXT: psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1173; X86-SSE-NEXT: psrlw %xmm1, %xmm01174; X86-SSE-NEXT: pcmpeqd %xmm2, %xmm21175; X86-SSE-NEXT: psrlw %xmm1, %xmm21176; X86-SSE-NEXT: psrlw $8, %xmm21177; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1178; X86-SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm2[0,0,0,0,4,5,6,7]1179; X86-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]1180; X86-SSE-NEXT: pand %xmm1, %xmm01181; X86-SSE-NEXT: retl1182 %splat = shufflevector <8 x i8> %b, <8 x i8> poison, <8 x i32> zeroinitializer1183 %shift = lshr <8 x i8> %a, %splat1184 ret <8 x i8> %shift1185}1186 1187define <4 x i8> @splatvar_shift_v4i8(<4 x i8> %a, <4 x i8> %b) nounwind {1188; SSE2-LABEL: splatvar_shift_v4i8:1189; SSE2: # %bb.0:1190; SSE2-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]1191; SSE2-NEXT: psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1192; SSE2-NEXT: psrlw %xmm1, %xmm01193; SSE2-NEXT: pcmpeqd %xmm2, %xmm21194; SSE2-NEXT: psrlw %xmm1, %xmm21195; SSE2-NEXT: psrlw $8, %xmm21196; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1197; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm2[0,0,0,0,4,5,6,7]1198; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]1199; SSE2-NEXT: pand %xmm1, %xmm01200; SSE2-NEXT: retq1201;1202; SSE41-LABEL: splatvar_shift_v4i8:1203; SSE41: # %bb.0:1204; SSE41-NEXT: pmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1205; SSE41-NEXT: psrlw %xmm1, %xmm01206; SSE41-NEXT: pcmpeqd %xmm2, %xmm21207; SSE41-NEXT: psrlw %xmm1, %xmm21208; SSE41-NEXT: pshufb {{.*#+}} xmm2 = xmm2[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1209; SSE41-NEXT: pand %xmm2, %xmm01210; SSE41-NEXT: retq1211;1212; AVX1-LABEL: splatvar_shift_v4i8:1213; AVX1: # %bb.0:1214; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1215; AVX1-NEXT: vpsrlw %xmm1, %xmm0, %xmm01216; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm21217; AVX1-NEXT: vpsrlw %xmm1, %xmm2, %xmm11218; AVX1-NEXT: vpshufb {{.*#+}} xmm1 = xmm1[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1219; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm01220; AVX1-NEXT: retq1221;1222; AVX2-LABEL: splatvar_shift_v4i8:1223; AVX2: # %bb.0:1224; AVX2-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1225; AVX2-NEXT: vpsrlw %xmm1, %xmm0, %xmm01226; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm21227; AVX2-NEXT: vpsrlw %xmm1, %xmm2, %xmm11228; AVX2-NEXT: vpsrlw $8, %xmm1, %xmm11229; AVX2-NEXT: vpbroadcastb %xmm1, %xmm11230; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm01231; AVX2-NEXT: retq1232;1233; XOPAVX1-LABEL: splatvar_shift_v4i8:1234; XOPAVX1: # %bb.0:1235; XOPAVX1-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1236; XOPAVX1-NEXT: vpshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]1237; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21238; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm11239; XOPAVX1-NEXT: vpshlb %xmm1, %xmm0, %xmm01240; XOPAVX1-NEXT: retq1241;1242; XOPAVX2-LABEL: splatvar_shift_v4i8:1243; XOPAVX2: # %bb.0:1244; XOPAVX2-NEXT: vpbroadcastb %xmm1, %xmm11245; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm21246; XOPAVX2-NEXT: vpsubb %xmm1, %xmm2, %xmm11247; XOPAVX2-NEXT: vpshlb %xmm1, %xmm0, %xmm01248; XOPAVX2-NEXT: retq1249;1250; AVX512DQ-LABEL: splatvar_shift_v4i8:1251; AVX512DQ: # %bb.0:1252; AVX512DQ-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1253; AVX512DQ-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,zero1254; AVX512DQ-NEXT: vpsrld %xmm1, %zmm0, %zmm01255; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm01256; AVX512DQ-NEXT: vzeroupper1257; AVX512DQ-NEXT: retq1258;1259; AVX512BW-LABEL: splatvar_shift_v4i8:1260; AVX512BW: # %bb.0:1261; AVX512BW-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1262; AVX512BW-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],zero1263; AVX512BW-NEXT: vpsrlw %xmm1, %ymm0, %ymm01264; AVX512BW-NEXT: vpmovwb %zmm0, %ymm01265; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01266; AVX512BW-NEXT: vzeroupper1267; AVX512BW-NEXT: retq1268;1269; AVX512DQVL-LABEL: splatvar_shift_v4i8:1270; AVX512DQVL: # %bb.0:1271; AVX512DQVL-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1272; AVX512DQVL-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,zero1273; AVX512DQVL-NEXT: vpsrld %xmm1, %zmm0, %zmm01274; AVX512DQVL-NEXT: vpmovdb %zmm0, %xmm01275; AVX512DQVL-NEXT: vzeroupper1276; AVX512DQVL-NEXT: retq1277;1278; AVX512BWVL-LABEL: splatvar_shift_v4i8:1279; AVX512BWVL: # %bb.0:1280; AVX512BWVL-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1281; 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],zero1282; AVX512BWVL-NEXT: vpsrlw %xmm1, %ymm0, %ymm01283; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm01284; AVX512BWVL-NEXT: vzeroupper1285; AVX512BWVL-NEXT: retq1286;1287; X86-SSE-LABEL: splatvar_shift_v4i8:1288; X86-SSE: # %bb.0:1289; X86-SSE-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]1290; X86-SSE-NEXT: psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1291; X86-SSE-NEXT: psrlw %xmm1, %xmm01292; X86-SSE-NEXT: pcmpeqd %xmm2, %xmm21293; X86-SSE-NEXT: psrlw %xmm1, %xmm21294; X86-SSE-NEXT: psrlw $8, %xmm21295; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1296; X86-SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm2[0,0,0,0,4,5,6,7]1297; X86-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]1298; X86-SSE-NEXT: pand %xmm1, %xmm01299; X86-SSE-NEXT: retl1300 %splat = shufflevector <4 x i8> %b, <4 x i8> poison, <4 x i32> zeroinitializer1301 %shift = lshr <4 x i8> %a, %splat1302 ret <4 x i8> %shift1303}1304 1305define <2 x i8> @splatvar_shift_v2i8(<2 x i8> %a, <2 x i8> %b) nounwind {1306; SSE2-LABEL: splatvar_shift_v2i8:1307; SSE2: # %bb.0:1308; SSE2-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]1309; SSE2-NEXT: psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1310; SSE2-NEXT: psrlw %xmm1, %xmm01311; SSE2-NEXT: pcmpeqd %xmm2, %xmm21312; SSE2-NEXT: psrlw %xmm1, %xmm21313; SSE2-NEXT: psrlw $8, %xmm21314; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1315; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm2[0,0,0,0,4,5,6,7]1316; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]1317; SSE2-NEXT: pand %xmm1, %xmm01318; SSE2-NEXT: retq1319;1320; SSE41-LABEL: splatvar_shift_v2i8:1321; SSE41: # %bb.0:1322; SSE41-NEXT: pmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1323; SSE41-NEXT: psrlw %xmm1, %xmm01324; SSE41-NEXT: pcmpeqd %xmm2, %xmm21325; SSE41-NEXT: psrlw %xmm1, %xmm21326; SSE41-NEXT: pshufb {{.*#+}} xmm2 = xmm2[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1327; SSE41-NEXT: pand %xmm2, %xmm01328; SSE41-NEXT: retq1329;1330; AVX1-LABEL: splatvar_shift_v2i8:1331; AVX1: # %bb.0:1332; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1333; AVX1-NEXT: vpsrlw %xmm1, %xmm0, %xmm01334; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm21335; AVX1-NEXT: vpsrlw %xmm1, %xmm2, %xmm11336; AVX1-NEXT: vpshufb {{.*#+}} xmm1 = xmm1[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1337; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm01338; AVX1-NEXT: retq1339;1340; AVX2-LABEL: splatvar_shift_v2i8:1341; AVX2: # %bb.0:1342; AVX2-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1343; AVX2-NEXT: vpsrlw %xmm1, %xmm0, %xmm01344; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm21345; AVX2-NEXT: vpsrlw %xmm1, %xmm2, %xmm11346; AVX2-NEXT: vpsrlw $8, %xmm1, %xmm11347; AVX2-NEXT: vpbroadcastb %xmm1, %xmm11348; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm01349; AVX2-NEXT: retq1350;1351; XOP-LABEL: splatvar_shift_v2i8:1352; XOP: # %bb.0:1353; XOP-NEXT: insertq {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7,u,u,u,u,u,u,u,u]1354; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm21355; XOP-NEXT: vpsubb %xmm1, %xmm2, %xmm11356; XOP-NEXT: vpshlb %xmm1, %xmm0, %xmm01357; XOP-NEXT: retq1358;1359; AVX512DQ-LABEL: splatvar_shift_v2i8:1360; AVX512DQ: # %bb.0:1361; AVX512DQ-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1362; AVX512DQ-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,zero1363; AVX512DQ-NEXT: vpsrld %xmm1, %zmm0, %zmm01364; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm01365; AVX512DQ-NEXT: vzeroupper1366; AVX512DQ-NEXT: retq1367;1368; AVX512BW-LABEL: splatvar_shift_v2i8:1369; AVX512BW: # %bb.0:1370; AVX512BW-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1371; AVX512BW-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],zero1372; AVX512BW-NEXT: vpsrlw %xmm1, %ymm0, %ymm01373; AVX512BW-NEXT: vpmovwb %zmm0, %ymm01374; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01375; AVX512BW-NEXT: vzeroupper1376; AVX512BW-NEXT: retq1377;1378; AVX512DQVL-LABEL: splatvar_shift_v2i8:1379; AVX512DQVL: # %bb.0:1380; AVX512DQVL-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1381; AVX512DQVL-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,zero1382; AVX512DQVL-NEXT: vpsrld %xmm1, %zmm0, %zmm01383; AVX512DQVL-NEXT: vpmovdb %zmm0, %xmm01384; AVX512DQVL-NEXT: vzeroupper1385; AVX512DQVL-NEXT: retq1386;1387; AVX512BWVL-LABEL: splatvar_shift_v2i8:1388; AVX512BWVL: # %bb.0:1389; AVX512BWVL-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1390; 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],zero1391; AVX512BWVL-NEXT: vpsrlw %xmm1, %ymm0, %ymm01392; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm01393; AVX512BWVL-NEXT: vzeroupper1394; AVX512BWVL-NEXT: retq1395;1396; X86-SSE-LABEL: splatvar_shift_v2i8:1397; X86-SSE: # %bb.0:1398; X86-SSE-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]1399; X86-SSE-NEXT: psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1400; X86-SSE-NEXT: psrlw %xmm1, %xmm01401; X86-SSE-NEXT: pcmpeqd %xmm2, %xmm21402; X86-SSE-NEXT: psrlw %xmm1, %xmm21403; X86-SSE-NEXT: psrlw $8, %xmm21404; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1405; X86-SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm2[0,0,0,0,4,5,6,7]1406; X86-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]1407; X86-SSE-NEXT: pand %xmm1, %xmm01408; X86-SSE-NEXT: retl1409 %splat = shufflevector <2 x i8> %b, <2 x i8> poison, <2 x i32> zeroinitializer1410 %shift = lshr <2 x i8> %a, %splat1411 ret <2 x i8> %shift1412}1413 1414;1415; Constant Shifts1416;1417 1418define <2 x i32> @constant_shift_v2i32(<2 x i32> %a) nounwind {1419; SSE2-LABEL: constant_shift_v2i32:1420; SSE2: # %bb.0:1421; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1422; SSE2-NEXT: psrld $4, %xmm01423; SSE2-NEXT: psrld $5, %xmm11424; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1425; SSE2-NEXT: retq1426;1427; SSE41-LABEL: constant_shift_v2i32:1428; SSE41: # %bb.0:1429; SSE41-NEXT: movdqa %xmm0, %xmm11430; SSE41-NEXT: psrld $5, %xmm11431; SSE41-NEXT: psrld $4, %xmm01432; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]1433; SSE41-NEXT: retq1434;1435; AVX1-LABEL: constant_shift_v2i32:1436; AVX1: # %bb.0:1437; AVX1-NEXT: vpsrld $5, %xmm0, %xmm11438; AVX1-NEXT: vpsrld $4, %xmm0, %xmm01439; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]1440; AVX1-NEXT: retq1441;1442; AVX2-LABEL: constant_shift_v2i32:1443; AVX2: # %bb.0:1444; AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01445; AVX2-NEXT: retq1446;1447; XOPAVX1-LABEL: constant_shift_v2i32:1448; XOPAVX1: # %bb.0:1449; XOPAVX1-NEXT: vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01450; XOPAVX1-NEXT: retq1451;1452; XOPAVX2-LABEL: constant_shift_v2i32:1453; XOPAVX2: # %bb.0:1454; XOPAVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01455; XOPAVX2-NEXT: retq1456;1457; AVX512-LABEL: constant_shift_v2i32:1458; AVX512: # %bb.0:1459; AVX512-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01460; AVX512-NEXT: retq1461;1462; AVX512VL-LABEL: constant_shift_v2i32:1463; AVX512VL: # %bb.0:1464; AVX512VL-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01465; AVX512VL-NEXT: retq1466;1467; X86-SSE-LABEL: constant_shift_v2i32:1468; X86-SSE: # %bb.0:1469; X86-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1470; X86-SSE-NEXT: psrld $4, %xmm01471; X86-SSE-NEXT: psrld $5, %xmm11472; X86-SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1473; X86-SSE-NEXT: retl1474 %shift = lshr <2 x i32> %a, <i32 4, i32 5>1475 ret <2 x i32> %shift1476}1477 1478define <4 x i16> @constant_shift_v4i16(<4 x i16> %a) nounwind {1479; SSE2-LABEL: constant_shift_v4i16:1480; SSE2: # %bb.0:1481; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [0,65535,65535,65535,65535,65535,65535,65535]1482; SSE2-NEXT: pandn %xmm0, %xmm11483; SSE2-NEXT: pmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [0,0,0,128,0,64,0,32,u,u,u,u,u,u,u,u]1484; SSE2-NEXT: por %xmm1, %xmm01485; SSE2-NEXT: retq1486;1487; SSE41-LABEL: constant_shift_v4i16:1488; SSE41: # %bb.0:1489; SSE41-NEXT: movq {{.*#+}} xmm1 = [0,32768,16384,8192,0,0,0,0]1490; SSE41-NEXT: pmulhuw %xmm0, %xmm11491; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]1492; SSE41-NEXT: retq1493;1494; AVX-LABEL: constant_shift_v4i16:1495; AVX: # %bb.0:1496; AVX-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [u,32768,16384,8192,u,u,u,u]1497; AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]1498; AVX-NEXT: retq1499;1500; XOP-LABEL: constant_shift_v4i16:1501; XOP: # %bb.0:1502; XOP-NEXT: vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01503; XOP-NEXT: retq1504;1505; AVX512DQ-LABEL: constant_shift_v4i16:1506; AVX512DQ: # %bb.0:1507; AVX512DQ-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [u,32768,16384,8192,u,u,u,u]1508; AVX512DQ-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]1509; AVX512DQ-NEXT: retq1510;1511; AVX512BW-LABEL: constant_shift_v4i16:1512; AVX512BW: # %bb.0:1513; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01514; AVX512BW-NEXT: vmovq {{.*#+}} xmm1 = [0,1,2,3,0,0,0,0]1515; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm01516; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01517; AVX512BW-NEXT: vzeroupper1518; AVX512BW-NEXT: retq1519;1520; AVX512DQVL-LABEL: constant_shift_v4i16:1521; AVX512DQVL: # %bb.0:1522; AVX512DQVL-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [u,32768,16384,8192,u,u,u,u]1523; AVX512DQVL-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]1524; AVX512DQVL-NEXT: retq1525;1526; AVX512BWVL-LABEL: constant_shift_v4i16:1527; AVX512BWVL: # %bb.0:1528; AVX512BWVL-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01529; AVX512BWVL-NEXT: retq1530;1531; X86-SSE-LABEL: constant_shift_v4i16:1532; X86-SSE: # %bb.0:1533; X86-SSE-NEXT: movdqa {{.*#+}} xmm1 = [0,65535,65535,65535,65535,65535,65535,65535]1534; X86-SSE-NEXT: pandn %xmm0, %xmm11535; X86-SSE-NEXT: pmulhuw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [0,0,0,128,0,64,0,32,u,u,u,u,u,u,u,u]1536; X86-SSE-NEXT: por %xmm1, %xmm01537; X86-SSE-NEXT: retl1538 %shift = lshr <4 x i16> %a, <i16 0, i16 1, i16 2, i16 3>1539 ret <4 x i16> %shift1540}1541 1542define <2 x i16> @constant_shift_v2i16(<2 x i16> %a) nounwind {1543; SSE2-LABEL: constant_shift_v2i16:1544; SSE2: # %bb.0:1545; SSE2-NEXT: movdqa %xmm0, %xmm11546; SSE2-NEXT: psrlw $3, %xmm11547; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [65535,0,65535,65535,65535,65535,65535,65535]1548; SSE2-NEXT: psrlw $2, %xmm01549; SSE2-NEXT: pand %xmm2, %xmm01550; SSE2-NEXT: pandn %xmm1, %xmm21551; SSE2-NEXT: por %xmm2, %xmm01552; SSE2-NEXT: retq1553;1554; SSE41-LABEL: constant_shift_v2i16:1555; SSE41: # %bb.0:1556; SSE41-NEXT: movdqa %xmm0, %xmm11557; SSE41-NEXT: psrlw $3, %xmm11558; SSE41-NEXT: psrlw $2, %xmm01559; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3,4,5,6,7]1560; SSE41-NEXT: retq1561;1562; AVX-LABEL: constant_shift_v2i16:1563; AVX: # %bb.0:1564; AVX-NEXT: vpsrlw $3, %xmm0, %xmm11565; AVX-NEXT: vpsrlw $2, %xmm0, %xmm01566; AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3,4,5,6,7]1567; AVX-NEXT: retq1568;1569; XOP-LABEL: constant_shift_v2i16:1570; XOP: # %bb.0:1571; XOP-NEXT: vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01572; XOP-NEXT: retq1573;1574; AVX512DQ-LABEL: constant_shift_v2i16:1575; AVX512DQ: # %bb.0:1576; AVX512DQ-NEXT: vpsrlw $3, %xmm0, %xmm11577; AVX512DQ-NEXT: vpsrlw $2, %xmm0, %xmm01578; AVX512DQ-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3,4,5,6,7]1579; AVX512DQ-NEXT: retq1580;1581; AVX512BW-LABEL: constant_shift_v2i16:1582; AVX512BW: # %bb.0:1583; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01584; AVX512BW-NEXT: vmovd {{.*#+}} xmm1 = [2,3,0,0,0,0,0,0]1585; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm01586; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01587; AVX512BW-NEXT: vzeroupper1588; AVX512BW-NEXT: retq1589;1590; AVX512DQVL-LABEL: constant_shift_v2i16:1591; AVX512DQVL: # %bb.0:1592; AVX512DQVL-NEXT: vpsrlw $3, %xmm0, %xmm11593; AVX512DQVL-NEXT: vpsrlw $2, %xmm0, %xmm01594; AVX512DQVL-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3,4,5,6,7]1595; AVX512DQVL-NEXT: retq1596;1597; AVX512BWVL-LABEL: constant_shift_v2i16:1598; AVX512BWVL: # %bb.0:1599; AVX512BWVL-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01600; AVX512BWVL-NEXT: retq1601;1602; X86-SSE-LABEL: constant_shift_v2i16:1603; X86-SSE: # %bb.0:1604; X86-SSE-NEXT: movdqa %xmm0, %xmm11605; X86-SSE-NEXT: psrlw $3, %xmm11606; X86-SSE-NEXT: movdqa {{.*#+}} xmm2 = [65535,0,65535,65535,65535,65535,65535,65535]1607; X86-SSE-NEXT: psrlw $2, %xmm01608; X86-SSE-NEXT: pand %xmm2, %xmm01609; X86-SSE-NEXT: pandn %xmm1, %xmm21610; X86-SSE-NEXT: por %xmm2, %xmm01611; X86-SSE-NEXT: retl1612 %shift = lshr <2 x i16> %a, <i16 2, i16 3>1613 ret <2 x i16> %shift1614}1615 1616define <8 x i8> @constant_shift_v8i8(<8 x i8> %a) nounwind {1617; SSE2-LABEL: constant_shift_v8i8:1618; SSE2: # %bb.0:1619; SSE2-NEXT: pxor %xmm1, %xmm11620; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]1621; SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [256,128,64,32,16,8,4,2]1622; SSE2-NEXT: psrlw $8, %xmm01623; SSE2-NEXT: packuswb %xmm1, %xmm01624; SSE2-NEXT: retq1625;1626; SSE41-LABEL: constant_shift_v8i8:1627; SSE41: # %bb.0:1628; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero1629; SSE41-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [256,128,64,32,16,8,4,2]1630; SSE41-NEXT: psrlw $8, %xmm01631; SSE41-NEXT: pxor %xmm1, %xmm11632; SSE41-NEXT: packuswb %xmm1, %xmm01633; SSE41-NEXT: retq1634;1635; AVX1-LABEL: constant_shift_v8i8:1636; AVX1: # %bb.0:1637; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero1638; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [256,128,64,32,16,8,4,2]1639; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm01640; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm11641; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm01642; AVX1-NEXT: retq1643;1644; AVX2-LABEL: constant_shift_v8i8:1645; AVX2: # %bb.0:1646; AVX2-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],zero1647; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [256,128,64,32,16,8,4,2,u,u,u,u,u,u,u,u]1648; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm01649; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11650; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm01651; AVX2-NEXT: vzeroupper1652; AVX2-NEXT: retq1653;1654; XOP-LABEL: constant_shift_v8i8:1655; XOP: # %bb.0:1656; XOP-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01657; XOP-NEXT: retq1658;1659; AVX512DQ-LABEL: constant_shift_v8i8:1660; AVX512DQ: # %bb.0:1661; AVX512DQ-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,zero1662; AVX512DQ-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm01663; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm01664; AVX512DQ-NEXT: vzeroupper1665; AVX512DQ-NEXT: retq1666;1667; AVX512BW-LABEL: constant_shift_v8i8:1668; AVX512BW: # %bb.0:1669; AVX512BW-NEXT: vbroadcasti128 {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7]1670; AVX512BW-NEXT: # ymm1 = mem[0,1,0,1]1671; AVX512BW-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],zero1672; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm01673; AVX512BW-NEXT: vpmovwb %zmm0, %ymm01674; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01675; AVX512BW-NEXT: vzeroupper1676; AVX512BW-NEXT: retq1677;1678; AVX512DQVL-LABEL: constant_shift_v8i8:1679; AVX512DQVL: # %bb.0:1680; AVX512DQVL-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,zero1681; AVX512DQVL-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm01682; AVX512DQVL-NEXT: vpmovdb %zmm0, %xmm01683; AVX512DQVL-NEXT: vzeroupper1684; AVX512DQVL-NEXT: retq1685;1686; AVX512BWVL-LABEL: constant_shift_v8i8:1687; AVX512BWVL: # %bb.0:1688; 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],zero1689; AVX512BWVL-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01690; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm01691; AVX512BWVL-NEXT: vzeroupper1692; AVX512BWVL-NEXT: retq1693;1694; X86-SSE-LABEL: constant_shift_v8i8:1695; X86-SSE: # %bb.0:1696; X86-SSE-NEXT: pxor %xmm1, %xmm11697; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]1698; X86-SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [256,128,64,32,16,8,4,2]1699; X86-SSE-NEXT: psrlw $8, %xmm01700; X86-SSE-NEXT: packuswb %xmm1, %xmm01701; X86-SSE-NEXT: retl1702 %shift = lshr <8 x i8> %a, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7>1703 ret <8 x i8> %shift1704}1705 1706define <4 x i8> @constant_shift_v4i8(<4 x i8> %a) nounwind {1707; SSE2-LABEL: constant_shift_v4i8:1708; SSE2: # %bb.0:1709; SSE2-NEXT: pxor %xmm1, %xmm11710; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]1711; SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [256,128,64,32,u,u,u,u]1712; SSE2-NEXT: psrlw $8, %xmm01713; SSE2-NEXT: packuswb %xmm1, %xmm01714; SSE2-NEXT: retq1715;1716; SSE41-LABEL: constant_shift_v4i8:1717; SSE41: # %bb.0:1718; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero1719; SSE41-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [256,128,64,32,u,u,u,u]1720; SSE41-NEXT: psrlw $8, %xmm01721; SSE41-NEXT: pxor %xmm1, %xmm11722; SSE41-NEXT: packuswb %xmm1, %xmm01723; SSE41-NEXT: retq1724;1725; AVX1-LABEL: constant_shift_v4i8:1726; AVX1: # %bb.0:1727; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero1728; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [256,128,64,32,u,u,u,u]1729; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm01730; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm11731; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm01732; AVX1-NEXT: retq1733;1734; AVX2-LABEL: constant_shift_v4i8:1735; AVX2: # %bb.0:1736; AVX2-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],zero1737; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [256,128,64,32,u,u,u,u,u,u,u,u,u,u,u,u]1738; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm01739; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11740; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm01741; AVX2-NEXT: vzeroupper1742; AVX2-NEXT: retq1743;1744; XOP-LABEL: constant_shift_v4i8:1745; XOP: # %bb.0:1746; XOP-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01747; XOP-NEXT: retq1748;1749; AVX512DQ-LABEL: constant_shift_v4i8:1750; AVX512DQ: # %bb.0:1751; AVX512DQ-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,zero1752; AVX512DQ-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm01753; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm01754; AVX512DQ-NEXT: vzeroupper1755; AVX512DQ-NEXT: retq1756;1757; AVX512BW-LABEL: constant_shift_v4i8:1758; AVX512BW: # %bb.0:1759; AVX512BW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]1760; AVX512BW-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],zero1761; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm01762; AVX512BW-NEXT: vpmovwb %zmm0, %ymm01763; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01764; AVX512BW-NEXT: vzeroupper1765; AVX512BW-NEXT: retq1766;1767; AVX512DQVL-LABEL: constant_shift_v4i8:1768; AVX512DQVL: # %bb.0:1769; AVX512DQVL-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,zero1770; AVX512DQVL-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm01771; AVX512DQVL-NEXT: vpmovdb %zmm0, %xmm01772; AVX512DQVL-NEXT: vzeroupper1773; AVX512DQVL-NEXT: retq1774;1775; AVX512BWVL-LABEL: constant_shift_v4i8:1776; AVX512BWVL: # %bb.0:1777; 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],zero1778; AVX512BWVL-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01779; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm01780; AVX512BWVL-NEXT: vzeroupper1781; AVX512BWVL-NEXT: retq1782;1783; X86-SSE-LABEL: constant_shift_v4i8:1784; X86-SSE: # %bb.0:1785; X86-SSE-NEXT: pxor %xmm1, %xmm11786; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]1787; X86-SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [256,128,64,32,u,u,u,u]1788; X86-SSE-NEXT: psrlw $8, %xmm01789; X86-SSE-NEXT: packuswb %xmm1, %xmm01790; X86-SSE-NEXT: retl1791 %shift = lshr <4 x i8> %a, <i8 0, i8 1, i8 2, i8 3>1792 ret <4 x i8> %shift1793}1794 1795define <2 x i8> @constant_shift_v2i8(<2 x i8> %a) nounwind {1796; SSE2-LABEL: constant_shift_v2i8:1797; SSE2: # %bb.0:1798; SSE2-NEXT: pxor %xmm1, %xmm11799; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]1800; SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [64,32,u,u,u,u,u,u]1801; SSE2-NEXT: psrlw $8, %xmm01802; SSE2-NEXT: packuswb %xmm1, %xmm01803; SSE2-NEXT: retq1804;1805; SSE41-LABEL: constant_shift_v2i8:1806; SSE41: # %bb.0:1807; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero1808; SSE41-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [64,32,u,u,u,u,u,u]1809; SSE41-NEXT: psrlw $8, %xmm01810; SSE41-NEXT: pxor %xmm1, %xmm11811; SSE41-NEXT: packuswb %xmm1, %xmm01812; SSE41-NEXT: retq1813;1814; AVX1-LABEL: constant_shift_v2i8:1815; AVX1: # %bb.0:1816; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero1817; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [64,32,u,u,u,u,u,u]1818; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm01819; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm11820; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm01821; AVX1-NEXT: retq1822;1823; AVX2-LABEL: constant_shift_v2i8:1824; AVX2: # %bb.0:1825; AVX2-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],zero1826; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [64,32,u,u,u,u,u,u,u,u,u,u,u,u,u,u]1827; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm01828; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11829; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm01830; AVX2-NEXT: vzeroupper1831; AVX2-NEXT: retq1832;1833; XOP-LABEL: constant_shift_v2i8:1834; XOP: # %bb.0:1835; XOP-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01836; XOP-NEXT: retq1837;1838; AVX512DQ-LABEL: constant_shift_v2i8:1839; AVX512DQ: # %bb.0:1840; AVX512DQ-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,zero1841; AVX512DQ-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm01842; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm01843; AVX512DQ-NEXT: vzeroupper1844; AVX512DQ-NEXT: retq1845;1846; AVX512BW-LABEL: constant_shift_v2i8:1847; AVX512BW: # %bb.0:1848; AVX512BW-NEXT: vpbroadcastd {{.*#+}} ymm1 = [2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3]1849; AVX512BW-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],zero1850; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm01851; AVX512BW-NEXT: vpmovwb %zmm0, %ymm01852; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01853; AVX512BW-NEXT: vzeroupper1854; AVX512BW-NEXT: retq1855;1856; AVX512DQVL-LABEL: constant_shift_v2i8:1857; AVX512DQVL: # %bb.0:1858; AVX512DQVL-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,zero1859; AVX512DQVL-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm01860; AVX512DQVL-NEXT: vpmovdb %zmm0, %xmm01861; AVX512DQVL-NEXT: vzeroupper1862; AVX512DQVL-NEXT: retq1863;1864; AVX512BWVL-LABEL: constant_shift_v2i8:1865; AVX512BWVL: # %bb.0:1866; 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],zero1867; AVX512BWVL-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01868; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm01869; AVX512BWVL-NEXT: vzeroupper1870; AVX512BWVL-NEXT: retq1871;1872; X86-SSE-LABEL: constant_shift_v2i8:1873; X86-SSE: # %bb.0:1874; X86-SSE-NEXT: pxor %xmm1, %xmm11875; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]1876; X86-SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [64,32,u,u,u,u,u,u]1877; X86-SSE-NEXT: psrlw $8, %xmm01878; X86-SSE-NEXT: packuswb %xmm1, %xmm01879; X86-SSE-NEXT: retl1880 %shift = lshr <2 x i8> %a, <i8 2, i8 3>1881 ret <2 x i8> %shift1882}1883 1884;1885; Uniform Constant Shifts1886;1887 1888define <2 x i32> @splatconstant_shift_v2i32(<2 x i32> %a) nounwind {1889; SSE-LABEL: splatconstant_shift_v2i32:1890; SSE: # %bb.0:1891; SSE-NEXT: psrld $5, %xmm01892; SSE-NEXT: retq1893;1894; AVX-LABEL: splatconstant_shift_v2i32:1895; AVX: # %bb.0:1896; AVX-NEXT: vpsrld $5, %xmm0, %xmm01897; AVX-NEXT: retq1898;1899; XOP-LABEL: splatconstant_shift_v2i32:1900; XOP: # %bb.0:1901; XOP-NEXT: vpsrld $5, %xmm0, %xmm01902; XOP-NEXT: retq1903;1904; AVX512-LABEL: splatconstant_shift_v2i32:1905; AVX512: # %bb.0:1906; AVX512-NEXT: vpsrld $5, %xmm0, %xmm01907; AVX512-NEXT: retq1908;1909; AVX512VL-LABEL: splatconstant_shift_v2i32:1910; AVX512VL: # %bb.0:1911; AVX512VL-NEXT: vpsrld $5, %xmm0, %xmm01912; AVX512VL-NEXT: retq1913;1914; X86-SSE-LABEL: splatconstant_shift_v2i32:1915; X86-SSE: # %bb.0:1916; X86-SSE-NEXT: psrld $5, %xmm01917; X86-SSE-NEXT: retl1918 %shift = lshr <2 x i32> %a, <i32 5, i32 5>1919 ret <2 x i32> %shift1920}1921 1922define <4 x i16> @splatconstant_shift_v4i16(<4 x i16> %a) nounwind {1923; SSE-LABEL: splatconstant_shift_v4i16:1924; SSE: # %bb.0:1925; SSE-NEXT: psrlw $3, %xmm01926; SSE-NEXT: retq1927;1928; AVX-LABEL: splatconstant_shift_v4i16:1929; AVX: # %bb.0:1930; AVX-NEXT: vpsrlw $3, %xmm0, %xmm01931; AVX-NEXT: retq1932;1933; XOP-LABEL: splatconstant_shift_v4i16:1934; XOP: # %bb.0:1935; XOP-NEXT: vpsrlw $3, %xmm0, %xmm01936; XOP-NEXT: retq1937;1938; AVX512-LABEL: splatconstant_shift_v4i16:1939; AVX512: # %bb.0:1940; AVX512-NEXT: vpsrlw $3, %xmm0, %xmm01941; AVX512-NEXT: retq1942;1943; AVX512VL-LABEL: splatconstant_shift_v4i16:1944; AVX512VL: # %bb.0:1945; AVX512VL-NEXT: vpsrlw $3, %xmm0, %xmm01946; AVX512VL-NEXT: retq1947;1948; X86-SSE-LABEL: splatconstant_shift_v4i16:1949; X86-SSE: # %bb.0:1950; X86-SSE-NEXT: psrlw $3, %xmm01951; X86-SSE-NEXT: retl1952 %shift = lshr <4 x i16> %a, <i16 3, i16 3, i16 3, i16 3>1953 ret <4 x i16> %shift1954}1955 1956define <2 x i16> @splatconstant_shift_v2i16(<2 x i16> %a) nounwind {1957; SSE-LABEL: splatconstant_shift_v2i16:1958; SSE: # %bb.0:1959; SSE-NEXT: psrlw $3, %xmm01960; SSE-NEXT: retq1961;1962; AVX-LABEL: splatconstant_shift_v2i16:1963; AVX: # %bb.0:1964; AVX-NEXT: vpsrlw $3, %xmm0, %xmm01965; AVX-NEXT: retq1966;1967; XOP-LABEL: splatconstant_shift_v2i16:1968; XOP: # %bb.0:1969; XOP-NEXT: vpsrlw $3, %xmm0, %xmm01970; XOP-NEXT: retq1971;1972; AVX512-LABEL: splatconstant_shift_v2i16:1973; AVX512: # %bb.0:1974; AVX512-NEXT: vpsrlw $3, %xmm0, %xmm01975; AVX512-NEXT: retq1976;1977; AVX512VL-LABEL: splatconstant_shift_v2i16:1978; AVX512VL: # %bb.0:1979; AVX512VL-NEXT: vpsrlw $3, %xmm0, %xmm01980; AVX512VL-NEXT: retq1981;1982; X86-SSE-LABEL: splatconstant_shift_v2i16:1983; X86-SSE: # %bb.0:1984; X86-SSE-NEXT: psrlw $3, %xmm01985; X86-SSE-NEXT: retl1986 %shift = lshr <2 x i16> %a, <i16 3, i16 3>1987 ret <2 x i16> %shift1988}1989 1990define <8 x i8> @splatconstant_shift_v8i8(<8 x i8> %a) nounwind {1991; SSE-LABEL: splatconstant_shift_v8i8:1992; SSE: # %bb.0:1993; SSE-NEXT: psrlw $3, %xmm01994; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01995; SSE-NEXT: retq1996;1997; AVX-LABEL: splatconstant_shift_v8i8:1998; AVX: # %bb.0:1999; AVX-NEXT: vpsrlw $3, %xmm0, %xmm02000; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02001; AVX-NEXT: retq2002;2003; XOP-LABEL: splatconstant_shift_v8i8:2004; XOP: # %bb.0:2005; XOP-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02006; XOP-NEXT: retq2007;2008; AVX512-LABEL: splatconstant_shift_v8i8:2009; AVX512: # %bb.0:2010; AVX512-NEXT: vpsrlw $3, %xmm0, %xmm02011; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02012; AVX512-NEXT: retq2013;2014; AVX512VL-LABEL: splatconstant_shift_v8i8:2015; AVX512VL: # %bb.0:2016; AVX512VL-NEXT: vpsrlw $3, %xmm0, %xmm02017; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm02018; AVX512VL-NEXT: retq2019;2020; X86-SSE-LABEL: splatconstant_shift_v8i8:2021; X86-SSE: # %bb.0:2022; X86-SSE-NEXT: psrlw $3, %xmm02023; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm02024; X86-SSE-NEXT: retl2025 %shift = lshr <8 x i8> %a, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>2026 ret <8 x i8> %shift2027}2028 2029define <4 x i8> @splatconstant_shift_v4i8(<4 x i8> %a) nounwind {2030; SSE-LABEL: splatconstant_shift_v4i8:2031; SSE: # %bb.0:2032; SSE-NEXT: psrlw $3, %xmm02033; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02034; SSE-NEXT: retq2035;2036; AVX-LABEL: splatconstant_shift_v4i8:2037; AVX: # %bb.0:2038; AVX-NEXT: vpsrlw $3, %xmm0, %xmm02039; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02040; AVX-NEXT: retq2041;2042; XOP-LABEL: splatconstant_shift_v4i8:2043; XOP: # %bb.0:2044; XOP-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02045; XOP-NEXT: retq2046;2047; AVX512-LABEL: splatconstant_shift_v4i8:2048; AVX512: # %bb.0:2049; AVX512-NEXT: vpsrlw $3, %xmm0, %xmm02050; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02051; AVX512-NEXT: retq2052;2053; AVX512VL-LABEL: splatconstant_shift_v4i8:2054; AVX512VL: # %bb.0:2055; AVX512VL-NEXT: vpsrlw $3, %xmm0, %xmm02056; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm02057; AVX512VL-NEXT: retq2058;2059; X86-SSE-LABEL: splatconstant_shift_v4i8:2060; X86-SSE: # %bb.0:2061; X86-SSE-NEXT: psrlw $3, %xmm02062; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm02063; X86-SSE-NEXT: retl2064 %shift = lshr <4 x i8> %a, <i8 3, i8 3, i8 3, i8 3>2065 ret <4 x i8> %shift2066}2067 2068define <2 x i8> @splatconstant_shift_v2i8(<2 x i8> %a) nounwind {2069; SSE-LABEL: splatconstant_shift_v2i8:2070; SSE: # %bb.0:2071; SSE-NEXT: psrlw $3, %xmm02072; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02073; SSE-NEXT: retq2074;2075; AVX-LABEL: splatconstant_shift_v2i8:2076; AVX: # %bb.0:2077; AVX-NEXT: vpsrlw $3, %xmm0, %xmm02078; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02079; AVX-NEXT: retq2080;2081; XOP-LABEL: splatconstant_shift_v2i8:2082; XOP: # %bb.0:2083; XOP-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02084; XOP-NEXT: retq2085;2086; AVX512-LABEL: splatconstant_shift_v2i8:2087; AVX512: # %bb.0:2088; AVX512-NEXT: vpsrlw $3, %xmm0, %xmm02089; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02090; AVX512-NEXT: retq2091;2092; AVX512VL-LABEL: splatconstant_shift_v2i8:2093; AVX512VL: # %bb.0:2094; AVX512VL-NEXT: vpsrlw $3, %xmm0, %xmm02095; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm02096; AVX512VL-NEXT: retq2097;2098; X86-SSE-LABEL: splatconstant_shift_v2i8:2099; X86-SSE: # %bb.0:2100; X86-SSE-NEXT: psrlw $3, %xmm02101; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm02102; X86-SSE-NEXT: retl2103 %shift = lshr <2 x i8> %a, <i8 3, i8 3>2104 ret <2 x i8> %shift2105}2106