brintos

brintos / llvm-project-archived public Read only

0
0
Text · 101.0 KiB · 7c1a531 Raw
2496 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:    psrad %xmm2, %xmm326; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm1[0,1,1,1,4,5,6,7]27; SSE2-NEXT:    movdqa %xmm0, %xmm228; SSE2-NEXT:    psrad %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:    psrad %xmm3, %xmm434; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,1,4,5,6,7]35; SSE2-NEXT:    psrad %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:    psrad %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:    psrad %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:    psrad %xmm1, %xmm354; SSE41-NEXT:    pshuflw {{.*#+}} xmm1 = xmm2[0,1,1,1,4,5,6,7]55; SSE41-NEXT:    psrad %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:    vpsrad %xmm2, %xmm0, %xmm264; AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm365; AVX1-NEXT:    vpsrad %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:    vpsrad %xmm3, %xmm0, %xmm370; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero71; AVX1-NEXT:    vpsrad %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:    vpsravd %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:    vpshad %xmm1, %xmm0, %xmm086; XOPAVX1-NEXT:    retq87;88; XOPAVX2-LABEL: var_shift_v2i32:89; XOPAVX2:       # %bb.0:90; XOPAVX2-NEXT:    vpsravd %xmm1, %xmm0, %xmm091; XOPAVX2-NEXT:    retq92;93; AVX512-LABEL: var_shift_v2i32:94; AVX512:       # %bb.0:95; AVX512-NEXT:    vpsravd %xmm1, %xmm0, %xmm096; AVX512-NEXT:    retq97;98; AVX512VL-LABEL: var_shift_v2i32:99; AVX512VL:       # %bb.0:100; AVX512VL-NEXT:    vpsravd %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:    psrad %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:    psrad %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:    psrad %xmm3, %xmm4116; X86-SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,1,4,5,6,7]117; X86-SSE-NEXT:    psrad %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 = ashr <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:    psraw $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:    psraw $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:    psraw $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:    psraw $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:    psraw $8, %xmm3173; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm2174; SSE41-NEXT:    movdqa %xmm2, %xmm3175; SSE41-NEXT:    psraw $4, %xmm3176; SSE41-NEXT:    movdqa %xmm1, %xmm0177; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm2178; SSE41-NEXT:    movdqa %xmm2, %xmm3179; SSE41-NEXT:    psraw $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:    psraw $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:    vpsraw $8, %xmm0, %xmm3198; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0199; AVX1-NEXT:    vpsraw $4, %xmm0, %xmm3200; AVX1-NEXT:    vpblendvb %xmm2, %xmm3, %xmm0, %xmm0201; AVX1-NEXT:    vpsraw $2, %xmm0, %xmm2202; AVX1-NEXT:    vpsllw $2, %xmm1, %xmm3203; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0204; AVX1-NEXT:    vpsraw $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:    vpmovsxwd %xmm0, %ymm0213; AVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0214; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1215; AVX2-NEXT:    vpackssdw %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:    vpshaw %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:    vpmovsxwd %xmm0, %ymm0230; AVX512DQ-NEXT:    vpsravd %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:    vpsravw %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:    vpmovsxwd %xmm0, %ymm0249; AVX512DQVL-NEXT:    vpsravd %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:    vpsravw %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:    psraw $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:    psraw $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:    psraw $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:    psraw $1, %xmm0290; X86-SSE-NEXT:    pand %xmm1, %xmm0291; X86-SSE-NEXT:    por %xmm2, %xmm0292; X86-SSE-NEXT:    retl293  %shift = ashr <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:    psraw $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:    psraw $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:    psraw $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:    psraw $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:    psraw $8, %xmm3344; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm2345; SSE41-NEXT:    movdqa %xmm2, %xmm3346; SSE41-NEXT:    psraw $4, %xmm3347; SSE41-NEXT:    movdqa %xmm1, %xmm0348; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm2349; SSE41-NEXT:    movdqa %xmm2, %xmm3350; SSE41-NEXT:    psraw $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:    psraw $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:    vpsraw $8, %xmm0, %xmm3369; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0370; AVX1-NEXT:    vpsraw $4, %xmm0, %xmm3371; AVX1-NEXT:    vpblendvb %xmm2, %xmm3, %xmm0, %xmm0372; AVX1-NEXT:    vpsraw $2, %xmm0, %xmm2373; AVX1-NEXT:    vpsllw $2, %xmm1, %xmm3374; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0375; AVX1-NEXT:    vpsraw $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:    vpmovsxwd %xmm0, %ymm0384; AVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0385; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1386; AVX2-NEXT:    vpackssdw %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:    vpshaw %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:    vpmovsxwd %xmm0, %ymm0401; AVX512DQ-NEXT:    vpsravd %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:    vpsravw %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:    vpmovsxwd %xmm0, %ymm0420; AVX512DQVL-NEXT:    vpsravd %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:    vpsravw %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:    psraw $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:    psraw $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:    psraw $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:    psraw $1, %xmm0461; X86-SSE-NEXT:    pand %xmm1, %xmm0462; X86-SSE-NEXT:    por %xmm2, %xmm0463; X86-SSE-NEXT:    retl464  %shift = ashr <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:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]472; SSE2-NEXT:    psllw $5, %xmm1473; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm1[8],xmm4[9],xmm1[9],xmm4[10],xmm1[10],xmm4[11],xmm1[11],xmm4[12],xmm1[12],xmm4[13],xmm1[13],xmm4[14],xmm1[14],xmm4[15],xmm1[15]474; SSE2-NEXT:    pxor %xmm3, %xmm3475; SSE2-NEXT:    pxor %xmm5, %xmm5476; SSE2-NEXT:    pcmpgtw %xmm4, %xmm5477; SSE2-NEXT:    movdqa %xmm5, %xmm6478; SSE2-NEXT:    pandn %xmm2, %xmm6479; SSE2-NEXT:    psraw $4, %xmm2480; SSE2-NEXT:    pand %xmm5, %xmm2481; SSE2-NEXT:    por %xmm6, %xmm2482; SSE2-NEXT:    paddw %xmm4, %xmm4483; SSE2-NEXT:    pxor %xmm5, %xmm5484; SSE2-NEXT:    pcmpgtw %xmm4, %xmm5485; SSE2-NEXT:    movdqa %xmm5, %xmm6486; SSE2-NEXT:    pandn %xmm2, %xmm6487; SSE2-NEXT:    psraw $2, %xmm2488; SSE2-NEXT:    pand %xmm5, %xmm2489; SSE2-NEXT:    por %xmm6, %xmm2490; SSE2-NEXT:    paddw %xmm4, %xmm4491; SSE2-NEXT:    pxor %xmm5, %xmm5492; SSE2-NEXT:    pcmpgtw %xmm4, %xmm5493; SSE2-NEXT:    movdqa %xmm5, %xmm4494; SSE2-NEXT:    pandn %xmm2, %xmm4495; SSE2-NEXT:    psraw $1, %xmm2496; SSE2-NEXT:    pand %xmm5, %xmm2497; SSE2-NEXT:    por %xmm4, %xmm2498; SSE2-NEXT:    psrlw $8, %xmm2499; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]500; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]501; SSE2-NEXT:    pxor %xmm4, %xmm4502; SSE2-NEXT:    pcmpgtw %xmm1, %xmm4503; SSE2-NEXT:    movdqa %xmm4, %xmm5504; SSE2-NEXT:    pandn %xmm0, %xmm5505; SSE2-NEXT:    psraw $4, %xmm0506; SSE2-NEXT:    pand %xmm4, %xmm0507; SSE2-NEXT:    por %xmm5, %xmm0508; SSE2-NEXT:    paddw %xmm1, %xmm1509; SSE2-NEXT:    pxor %xmm4, %xmm4510; SSE2-NEXT:    pcmpgtw %xmm1, %xmm4511; SSE2-NEXT:    movdqa %xmm4, %xmm5512; SSE2-NEXT:    pandn %xmm0, %xmm5513; SSE2-NEXT:    psraw $2, %xmm0514; SSE2-NEXT:    pand %xmm4, %xmm0515; SSE2-NEXT:    por %xmm5, %xmm0516; SSE2-NEXT:    paddw %xmm1, %xmm1517; SSE2-NEXT:    pcmpgtw %xmm1, %xmm3518; SSE2-NEXT:    movdqa %xmm3, %xmm1519; SSE2-NEXT:    pandn %xmm0, %xmm1520; SSE2-NEXT:    psraw $1, %xmm0521; SSE2-NEXT:    pand %xmm3, %xmm0522; SSE2-NEXT:    por %xmm1, %xmm0523; SSE2-NEXT:    psrlw $8, %xmm0524; SSE2-NEXT:    packuswb %xmm2, %xmm0525; SSE2-NEXT:    retq526;527; SSE41-LABEL: var_shift_v8i8:528; SSE41:       # %bb.0:529; SSE41-NEXT:    movdqa %xmm0, %xmm2530; SSE41-NEXT:    psllw $5, %xmm1531; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]532; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15]533; SSE41-NEXT:    movdqa %xmm3, %xmm4534; SSE41-NEXT:    psraw $4, %xmm4535; SSE41-NEXT:    pblendvb %xmm0, %xmm4, %xmm3536; SSE41-NEXT:    movdqa %xmm3, %xmm4537; SSE41-NEXT:    psraw $2, %xmm4538; SSE41-NEXT:    paddw %xmm0, %xmm0539; SSE41-NEXT:    pblendvb %xmm0, %xmm4, %xmm3540; SSE41-NEXT:    movdqa %xmm3, %xmm4541; SSE41-NEXT:    psraw $1, %xmm4542; SSE41-NEXT:    paddw %xmm0, %xmm0543; SSE41-NEXT:    pblendvb %xmm0, %xmm4, %xmm3544; SSE41-NEXT:    psrlw $8, %xmm3545; SSE41-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]546; SSE41-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]547; SSE41-NEXT:    movdqa %xmm1, %xmm2548; SSE41-NEXT:    psraw $4, %xmm2549; SSE41-NEXT:    pblendvb %xmm0, %xmm2, %xmm1550; SSE41-NEXT:    movdqa %xmm1, %xmm2551; SSE41-NEXT:    psraw $2, %xmm2552; SSE41-NEXT:    paddw %xmm0, %xmm0553; SSE41-NEXT:    pblendvb %xmm0, %xmm2, %xmm1554; SSE41-NEXT:    movdqa %xmm1, %xmm2555; SSE41-NEXT:    psraw $1, %xmm2556; SSE41-NEXT:    paddw %xmm0, %xmm0557; SSE41-NEXT:    pblendvb %xmm0, %xmm2, %xmm1558; SSE41-NEXT:    psrlw $8, %xmm1559; SSE41-NEXT:    packuswb %xmm3, %xmm1560; SSE41-NEXT:    movdqa %xmm1, %xmm0561; SSE41-NEXT:    retq562;563; AVX-LABEL: var_shift_v8i8:564; AVX:       # %bb.0:565; AVX-NEXT:    vpsllw $5, %xmm1, %xmm1566; AVX-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]567; AVX-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]568; AVX-NEXT:    vpsraw $4, %xmm3, %xmm4569; AVX-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm3570; AVX-NEXT:    vpsraw $2, %xmm3, %xmm4571; AVX-NEXT:    vpaddw %xmm2, %xmm2, %xmm5572; AVX-NEXT:    vpblendvb %xmm5, %xmm4, %xmm3, %xmm3573; AVX-NEXT:    vpsraw $1, %xmm3, %xmm4574; AVX-NEXT:    vpsllw $2, %xmm2, %xmm2575; AVX-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm2576; AVX-NEXT:    vpsrlw $8, %xmm2, %xmm2577; AVX-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]578; AVX-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]579; AVX-NEXT:    vpsraw $4, %xmm0, %xmm3580; AVX-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0581; AVX-NEXT:    vpsraw $2, %xmm0, %xmm3582; AVX-NEXT:    vpaddw %xmm1, %xmm1, %xmm4583; AVX-NEXT:    vpblendvb %xmm4, %xmm3, %xmm0, %xmm0584; AVX-NEXT:    vpsraw $1, %xmm0, %xmm3585; AVX-NEXT:    vpsllw $2, %xmm1, %xmm1586; AVX-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0587; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm0588; AVX-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0589; AVX-NEXT:    retq590;591; XOP-LABEL: var_shift_v8i8:592; XOP:       # %bb.0:593; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2594; XOP-NEXT:    vpsubb %xmm1, %xmm2, %xmm1595; XOP-NEXT:    vpshab %xmm1, %xmm0, %xmm0596; XOP-NEXT:    retq597;598; AVX512DQ-LABEL: var_shift_v8i8:599; AVX512DQ:       # %bb.0:600; 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,zero601; AVX512DQ-NEXT:    vpmovsxbd %xmm0, %zmm0602; AVX512DQ-NEXT:    vpsravd %zmm1, %zmm0, %zmm0603; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0604; AVX512DQ-NEXT:    vzeroupper605; AVX512DQ-NEXT:    retq606;607; AVX512BW-LABEL: var_shift_v8i8:608; AVX512BW:       # %bb.0:609; 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],zero610; AVX512BW-NEXT:    vpmovsxbw %xmm0, %ymm0611; AVX512BW-NEXT:    vpsravw %zmm1, %zmm0, %zmm0612; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0613; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0614; AVX512BW-NEXT:    vzeroupper615; AVX512BW-NEXT:    retq616;617; AVX512DQVL-LABEL: var_shift_v8i8:618; AVX512DQVL:       # %bb.0:619; 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,zero620; AVX512DQVL-NEXT:    vpmovsxbd %xmm0, %zmm0621; AVX512DQVL-NEXT:    vpsravd %zmm1, %zmm0, %zmm0622; AVX512DQVL-NEXT:    vpmovdb %zmm0, %xmm0623; AVX512DQVL-NEXT:    vzeroupper624; AVX512DQVL-NEXT:    retq625;626; AVX512BWVL-LABEL: var_shift_v8i8:627; AVX512BWVL:       # %bb.0:628; 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],zero629; AVX512BWVL-NEXT:    vpmovsxbw %xmm0, %ymm0630; AVX512BWVL-NEXT:    vpsravw %ymm1, %ymm0, %ymm0631; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm0632; AVX512BWVL-NEXT:    vzeroupper633; AVX512BWVL-NEXT:    retq634;635; X86-SSE-LABEL: var_shift_v8i8:636; X86-SSE:       # %bb.0:637; X86-SSE-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]638; X86-SSE-NEXT:    psllw $5, %xmm1639; X86-SSE-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm1[8],xmm4[9],xmm1[9],xmm4[10],xmm1[10],xmm4[11],xmm1[11],xmm4[12],xmm1[12],xmm4[13],xmm1[13],xmm4[14],xmm1[14],xmm4[15],xmm1[15]640; X86-SSE-NEXT:    pxor %xmm3, %xmm3641; X86-SSE-NEXT:    pxor %xmm5, %xmm5642; X86-SSE-NEXT:    pcmpgtw %xmm4, %xmm5643; X86-SSE-NEXT:    movdqa %xmm5, %xmm6644; X86-SSE-NEXT:    pandn %xmm2, %xmm6645; X86-SSE-NEXT:    psraw $4, %xmm2646; X86-SSE-NEXT:    pand %xmm5, %xmm2647; X86-SSE-NEXT:    por %xmm6, %xmm2648; X86-SSE-NEXT:    paddw %xmm4, %xmm4649; X86-SSE-NEXT:    pxor %xmm5, %xmm5650; X86-SSE-NEXT:    pcmpgtw %xmm4, %xmm5651; X86-SSE-NEXT:    movdqa %xmm5, %xmm6652; X86-SSE-NEXT:    pandn %xmm2, %xmm6653; X86-SSE-NEXT:    psraw $2, %xmm2654; X86-SSE-NEXT:    pand %xmm5, %xmm2655; X86-SSE-NEXT:    por %xmm6, %xmm2656; X86-SSE-NEXT:    paddw %xmm4, %xmm4657; X86-SSE-NEXT:    pxor %xmm5, %xmm5658; X86-SSE-NEXT:    pcmpgtw %xmm4, %xmm5659; X86-SSE-NEXT:    movdqa %xmm5, %xmm4660; X86-SSE-NEXT:    pandn %xmm2, %xmm4661; X86-SSE-NEXT:    psraw $1, %xmm2662; X86-SSE-NEXT:    pand %xmm5, %xmm2663; X86-SSE-NEXT:    por %xmm4, %xmm2664; X86-SSE-NEXT:    psrlw $8, %xmm2665; X86-SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]666; X86-SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]667; X86-SSE-NEXT:    pxor %xmm4, %xmm4668; X86-SSE-NEXT:    pcmpgtw %xmm1, %xmm4669; X86-SSE-NEXT:    movdqa %xmm4, %xmm5670; X86-SSE-NEXT:    pandn %xmm0, %xmm5671; X86-SSE-NEXT:    psraw $4, %xmm0672; X86-SSE-NEXT:    pand %xmm4, %xmm0673; X86-SSE-NEXT:    por %xmm5, %xmm0674; X86-SSE-NEXT:    paddw %xmm1, %xmm1675; X86-SSE-NEXT:    pxor %xmm4, %xmm4676; X86-SSE-NEXT:    pcmpgtw %xmm1, %xmm4677; X86-SSE-NEXT:    movdqa %xmm4, %xmm5678; X86-SSE-NEXT:    pandn %xmm0, %xmm5679; X86-SSE-NEXT:    psraw $2, %xmm0680; X86-SSE-NEXT:    pand %xmm4, %xmm0681; X86-SSE-NEXT:    por %xmm5, %xmm0682; X86-SSE-NEXT:    paddw %xmm1, %xmm1683; X86-SSE-NEXT:    pcmpgtw %xmm1, %xmm3684; X86-SSE-NEXT:    movdqa %xmm3, %xmm1685; X86-SSE-NEXT:    pandn %xmm0, %xmm1686; X86-SSE-NEXT:    psraw $1, %xmm0687; X86-SSE-NEXT:    pand %xmm3, %xmm0688; X86-SSE-NEXT:    por %xmm1, %xmm0689; X86-SSE-NEXT:    psrlw $8, %xmm0690; X86-SSE-NEXT:    packuswb %xmm2, %xmm0691; X86-SSE-NEXT:    retl692  %shift = ashr <8 x i8> %a, %b693  ret <8 x i8> %shift694}695 696define <4 x i8> @var_shift_v4i8(<4 x i8> %a, <4 x i8> %b) nounwind {697; SSE2-LABEL: var_shift_v4i8:698; SSE2:       # %bb.0:699; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]700; SSE2-NEXT:    psllw $5, %xmm1701; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm1[8],xmm4[9],xmm1[9],xmm4[10],xmm1[10],xmm4[11],xmm1[11],xmm4[12],xmm1[12],xmm4[13],xmm1[13],xmm4[14],xmm1[14],xmm4[15],xmm1[15]702; SSE2-NEXT:    pxor %xmm3, %xmm3703; SSE2-NEXT:    pxor %xmm5, %xmm5704; SSE2-NEXT:    pcmpgtw %xmm4, %xmm5705; SSE2-NEXT:    movdqa %xmm5, %xmm6706; SSE2-NEXT:    pandn %xmm2, %xmm6707; SSE2-NEXT:    psraw $4, %xmm2708; SSE2-NEXT:    pand %xmm5, %xmm2709; SSE2-NEXT:    por %xmm6, %xmm2710; SSE2-NEXT:    paddw %xmm4, %xmm4711; SSE2-NEXT:    pxor %xmm5, %xmm5712; SSE2-NEXT:    pcmpgtw %xmm4, %xmm5713; SSE2-NEXT:    movdqa %xmm5, %xmm6714; SSE2-NEXT:    pandn %xmm2, %xmm6715; SSE2-NEXT:    psraw $2, %xmm2716; SSE2-NEXT:    pand %xmm5, %xmm2717; SSE2-NEXT:    por %xmm6, %xmm2718; SSE2-NEXT:    paddw %xmm4, %xmm4719; SSE2-NEXT:    pxor %xmm5, %xmm5720; SSE2-NEXT:    pcmpgtw %xmm4, %xmm5721; SSE2-NEXT:    movdqa %xmm5, %xmm4722; SSE2-NEXT:    pandn %xmm2, %xmm4723; SSE2-NEXT:    psraw $1, %xmm2724; SSE2-NEXT:    pand %xmm5, %xmm2725; SSE2-NEXT:    por %xmm4, %xmm2726; SSE2-NEXT:    psrlw $8, %xmm2727; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]728; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]729; SSE2-NEXT:    pxor %xmm4, %xmm4730; SSE2-NEXT:    pcmpgtw %xmm1, %xmm4731; SSE2-NEXT:    movdqa %xmm4, %xmm5732; SSE2-NEXT:    pandn %xmm0, %xmm5733; SSE2-NEXT:    psraw $4, %xmm0734; SSE2-NEXT:    pand %xmm4, %xmm0735; SSE2-NEXT:    por %xmm5, %xmm0736; SSE2-NEXT:    paddw %xmm1, %xmm1737; SSE2-NEXT:    pxor %xmm4, %xmm4738; SSE2-NEXT:    pcmpgtw %xmm1, %xmm4739; SSE2-NEXT:    movdqa %xmm4, %xmm5740; SSE2-NEXT:    pandn %xmm0, %xmm5741; SSE2-NEXT:    psraw $2, %xmm0742; SSE2-NEXT:    pand %xmm4, %xmm0743; SSE2-NEXT:    por %xmm5, %xmm0744; SSE2-NEXT:    paddw %xmm1, %xmm1745; SSE2-NEXT:    pcmpgtw %xmm1, %xmm3746; SSE2-NEXT:    movdqa %xmm3, %xmm1747; SSE2-NEXT:    pandn %xmm0, %xmm1748; SSE2-NEXT:    psraw $1, %xmm0749; SSE2-NEXT:    pand %xmm3, %xmm0750; SSE2-NEXT:    por %xmm1, %xmm0751; SSE2-NEXT:    psrlw $8, %xmm0752; SSE2-NEXT:    packuswb %xmm2, %xmm0753; SSE2-NEXT:    retq754;755; SSE41-LABEL: var_shift_v4i8:756; SSE41:       # %bb.0:757; SSE41-NEXT:    movdqa %xmm0, %xmm2758; SSE41-NEXT:    psllw $5, %xmm1759; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]760; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15]761; SSE41-NEXT:    movdqa %xmm3, %xmm4762; SSE41-NEXT:    psraw $4, %xmm4763; SSE41-NEXT:    pblendvb %xmm0, %xmm4, %xmm3764; SSE41-NEXT:    movdqa %xmm3, %xmm4765; SSE41-NEXT:    psraw $2, %xmm4766; SSE41-NEXT:    paddw %xmm0, %xmm0767; SSE41-NEXT:    pblendvb %xmm0, %xmm4, %xmm3768; SSE41-NEXT:    movdqa %xmm3, %xmm4769; SSE41-NEXT:    psraw $1, %xmm4770; SSE41-NEXT:    paddw %xmm0, %xmm0771; SSE41-NEXT:    pblendvb %xmm0, %xmm4, %xmm3772; SSE41-NEXT:    psrlw $8, %xmm3773; SSE41-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]774; SSE41-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]775; SSE41-NEXT:    movdqa %xmm1, %xmm2776; SSE41-NEXT:    psraw $4, %xmm2777; SSE41-NEXT:    pblendvb %xmm0, %xmm2, %xmm1778; SSE41-NEXT:    movdqa %xmm1, %xmm2779; SSE41-NEXT:    psraw $2, %xmm2780; SSE41-NEXT:    paddw %xmm0, %xmm0781; SSE41-NEXT:    pblendvb %xmm0, %xmm2, %xmm1782; SSE41-NEXT:    movdqa %xmm1, %xmm2783; SSE41-NEXT:    psraw $1, %xmm2784; SSE41-NEXT:    paddw %xmm0, %xmm0785; SSE41-NEXT:    pblendvb %xmm0, %xmm2, %xmm1786; SSE41-NEXT:    psrlw $8, %xmm1787; SSE41-NEXT:    packuswb %xmm3, %xmm1788; SSE41-NEXT:    movdqa %xmm1, %xmm0789; SSE41-NEXT:    retq790;791; AVX-LABEL: var_shift_v4i8:792; AVX:       # %bb.0:793; AVX-NEXT:    vpsllw $5, %xmm1, %xmm1794; AVX-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]795; AVX-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]796; AVX-NEXT:    vpsraw $4, %xmm3, %xmm4797; AVX-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm3798; AVX-NEXT:    vpsraw $2, %xmm3, %xmm4799; AVX-NEXT:    vpaddw %xmm2, %xmm2, %xmm5800; AVX-NEXT:    vpblendvb %xmm5, %xmm4, %xmm3, %xmm3801; AVX-NEXT:    vpsraw $1, %xmm3, %xmm4802; AVX-NEXT:    vpsllw $2, %xmm2, %xmm2803; AVX-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm2804; AVX-NEXT:    vpsrlw $8, %xmm2, %xmm2805; AVX-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]806; AVX-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]807; AVX-NEXT:    vpsraw $4, %xmm0, %xmm3808; AVX-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0809; AVX-NEXT:    vpsraw $2, %xmm0, %xmm3810; AVX-NEXT:    vpaddw %xmm1, %xmm1, %xmm4811; AVX-NEXT:    vpblendvb %xmm4, %xmm3, %xmm0, %xmm0812; AVX-NEXT:    vpsraw $1, %xmm0, %xmm3813; AVX-NEXT:    vpsllw $2, %xmm1, %xmm1814; AVX-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0815; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm0816; AVX-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0817; AVX-NEXT:    retq818;819; XOP-LABEL: var_shift_v4i8:820; XOP:       # %bb.0:821; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2822; XOP-NEXT:    vpsubb %xmm1, %xmm2, %xmm1823; XOP-NEXT:    vpshab %xmm1, %xmm0, %xmm0824; XOP-NEXT:    retq825;826; AVX512DQ-LABEL: var_shift_v4i8:827; AVX512DQ:       # %bb.0:828; 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,zero829; AVX512DQ-NEXT:    vpmovsxbd %xmm0, %zmm0830; AVX512DQ-NEXT:    vpsravd %zmm1, %zmm0, %zmm0831; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0832; AVX512DQ-NEXT:    vzeroupper833; AVX512DQ-NEXT:    retq834;835; AVX512BW-LABEL: var_shift_v4i8:836; AVX512BW:       # %bb.0:837; 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],zero838; AVX512BW-NEXT:    vpmovsxbw %xmm0, %ymm0839; AVX512BW-NEXT:    vpsravw %zmm1, %zmm0, %zmm0840; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0841; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0842; AVX512BW-NEXT:    vzeroupper843; AVX512BW-NEXT:    retq844;845; AVX512DQVL-LABEL: var_shift_v4i8:846; AVX512DQVL:       # %bb.0:847; 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,zero848; AVX512DQVL-NEXT:    vpmovsxbd %xmm0, %zmm0849; AVX512DQVL-NEXT:    vpsravd %zmm1, %zmm0, %zmm0850; AVX512DQVL-NEXT:    vpmovdb %zmm0, %xmm0851; AVX512DQVL-NEXT:    vzeroupper852; AVX512DQVL-NEXT:    retq853;854; AVX512BWVL-LABEL: var_shift_v4i8:855; AVX512BWVL:       # %bb.0:856; 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],zero857; AVX512BWVL-NEXT:    vpmovsxbw %xmm0, %ymm0858; AVX512BWVL-NEXT:    vpsravw %ymm1, %ymm0, %ymm0859; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm0860; AVX512BWVL-NEXT:    vzeroupper861; AVX512BWVL-NEXT:    retq862;863; X86-SSE-LABEL: var_shift_v4i8:864; X86-SSE:       # %bb.0:865; X86-SSE-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]866; X86-SSE-NEXT:    psllw $5, %xmm1867; X86-SSE-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm1[8],xmm4[9],xmm1[9],xmm4[10],xmm1[10],xmm4[11],xmm1[11],xmm4[12],xmm1[12],xmm4[13],xmm1[13],xmm4[14],xmm1[14],xmm4[15],xmm1[15]868; X86-SSE-NEXT:    pxor %xmm3, %xmm3869; X86-SSE-NEXT:    pxor %xmm5, %xmm5870; X86-SSE-NEXT:    pcmpgtw %xmm4, %xmm5871; X86-SSE-NEXT:    movdqa %xmm5, %xmm6872; X86-SSE-NEXT:    pandn %xmm2, %xmm6873; X86-SSE-NEXT:    psraw $4, %xmm2874; X86-SSE-NEXT:    pand %xmm5, %xmm2875; X86-SSE-NEXT:    por %xmm6, %xmm2876; X86-SSE-NEXT:    paddw %xmm4, %xmm4877; X86-SSE-NEXT:    pxor %xmm5, %xmm5878; X86-SSE-NEXT:    pcmpgtw %xmm4, %xmm5879; X86-SSE-NEXT:    movdqa %xmm5, %xmm6880; X86-SSE-NEXT:    pandn %xmm2, %xmm6881; X86-SSE-NEXT:    psraw $2, %xmm2882; X86-SSE-NEXT:    pand %xmm5, %xmm2883; X86-SSE-NEXT:    por %xmm6, %xmm2884; X86-SSE-NEXT:    paddw %xmm4, %xmm4885; X86-SSE-NEXT:    pxor %xmm5, %xmm5886; X86-SSE-NEXT:    pcmpgtw %xmm4, %xmm5887; X86-SSE-NEXT:    movdqa %xmm5, %xmm4888; X86-SSE-NEXT:    pandn %xmm2, %xmm4889; X86-SSE-NEXT:    psraw $1, %xmm2890; X86-SSE-NEXT:    pand %xmm5, %xmm2891; X86-SSE-NEXT:    por %xmm4, %xmm2892; X86-SSE-NEXT:    psrlw $8, %xmm2893; X86-SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]894; X86-SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]895; X86-SSE-NEXT:    pxor %xmm4, %xmm4896; X86-SSE-NEXT:    pcmpgtw %xmm1, %xmm4897; X86-SSE-NEXT:    movdqa %xmm4, %xmm5898; X86-SSE-NEXT:    pandn %xmm0, %xmm5899; X86-SSE-NEXT:    psraw $4, %xmm0900; X86-SSE-NEXT:    pand %xmm4, %xmm0901; X86-SSE-NEXT:    por %xmm5, %xmm0902; X86-SSE-NEXT:    paddw %xmm1, %xmm1903; X86-SSE-NEXT:    pxor %xmm4, %xmm4904; X86-SSE-NEXT:    pcmpgtw %xmm1, %xmm4905; X86-SSE-NEXT:    movdqa %xmm4, %xmm5906; X86-SSE-NEXT:    pandn %xmm0, %xmm5907; X86-SSE-NEXT:    psraw $2, %xmm0908; X86-SSE-NEXT:    pand %xmm4, %xmm0909; X86-SSE-NEXT:    por %xmm5, %xmm0910; X86-SSE-NEXT:    paddw %xmm1, %xmm1911; X86-SSE-NEXT:    pcmpgtw %xmm1, %xmm3912; X86-SSE-NEXT:    movdqa %xmm3, %xmm1913; X86-SSE-NEXT:    pandn %xmm0, %xmm1914; X86-SSE-NEXT:    psraw $1, %xmm0915; X86-SSE-NEXT:    pand %xmm3, %xmm0916; X86-SSE-NEXT:    por %xmm1, %xmm0917; X86-SSE-NEXT:    psrlw $8, %xmm0918; X86-SSE-NEXT:    packuswb %xmm2, %xmm0919; X86-SSE-NEXT:    retl920  %shift = ashr <4 x i8> %a, %b921  ret <4 x i8> %shift922}923 924define <2 x i8> @var_shift_v2i8(<2 x i8> %a, <2 x i8> %b) nounwind {925; SSE2-LABEL: var_shift_v2i8:926; SSE2:       # %bb.0:927; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]928; SSE2-NEXT:    psllw $5, %xmm1929; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm1[8],xmm4[9],xmm1[9],xmm4[10],xmm1[10],xmm4[11],xmm1[11],xmm4[12],xmm1[12],xmm4[13],xmm1[13],xmm4[14],xmm1[14],xmm4[15],xmm1[15]930; SSE2-NEXT:    pxor %xmm3, %xmm3931; SSE2-NEXT:    pxor %xmm5, %xmm5932; SSE2-NEXT:    pcmpgtw %xmm4, %xmm5933; SSE2-NEXT:    movdqa %xmm5, %xmm6934; SSE2-NEXT:    pandn %xmm2, %xmm6935; SSE2-NEXT:    psraw $4, %xmm2936; SSE2-NEXT:    pand %xmm5, %xmm2937; SSE2-NEXT:    por %xmm6, %xmm2938; SSE2-NEXT:    paddw %xmm4, %xmm4939; SSE2-NEXT:    pxor %xmm5, %xmm5940; SSE2-NEXT:    pcmpgtw %xmm4, %xmm5941; SSE2-NEXT:    movdqa %xmm5, %xmm6942; SSE2-NEXT:    pandn %xmm2, %xmm6943; SSE2-NEXT:    psraw $2, %xmm2944; SSE2-NEXT:    pand %xmm5, %xmm2945; SSE2-NEXT:    por %xmm6, %xmm2946; SSE2-NEXT:    paddw %xmm4, %xmm4947; SSE2-NEXT:    pxor %xmm5, %xmm5948; SSE2-NEXT:    pcmpgtw %xmm4, %xmm5949; SSE2-NEXT:    movdqa %xmm5, %xmm4950; SSE2-NEXT:    pandn %xmm2, %xmm4951; SSE2-NEXT:    psraw $1, %xmm2952; SSE2-NEXT:    pand %xmm5, %xmm2953; SSE2-NEXT:    por %xmm4, %xmm2954; SSE2-NEXT:    psrlw $8, %xmm2955; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]956; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]957; SSE2-NEXT:    pxor %xmm4, %xmm4958; SSE2-NEXT:    pcmpgtw %xmm1, %xmm4959; SSE2-NEXT:    movdqa %xmm4, %xmm5960; SSE2-NEXT:    pandn %xmm0, %xmm5961; SSE2-NEXT:    psraw $4, %xmm0962; SSE2-NEXT:    pand %xmm4, %xmm0963; SSE2-NEXT:    por %xmm5, %xmm0964; SSE2-NEXT:    paddw %xmm1, %xmm1965; SSE2-NEXT:    pxor %xmm4, %xmm4966; SSE2-NEXT:    pcmpgtw %xmm1, %xmm4967; SSE2-NEXT:    movdqa %xmm4, %xmm5968; SSE2-NEXT:    pandn %xmm0, %xmm5969; SSE2-NEXT:    psraw $2, %xmm0970; SSE2-NEXT:    pand %xmm4, %xmm0971; SSE2-NEXT:    por %xmm5, %xmm0972; SSE2-NEXT:    paddw %xmm1, %xmm1973; SSE2-NEXT:    pcmpgtw %xmm1, %xmm3974; SSE2-NEXT:    movdqa %xmm3, %xmm1975; SSE2-NEXT:    pandn %xmm0, %xmm1976; SSE2-NEXT:    psraw $1, %xmm0977; SSE2-NEXT:    pand %xmm3, %xmm0978; SSE2-NEXT:    por %xmm1, %xmm0979; SSE2-NEXT:    psrlw $8, %xmm0980; SSE2-NEXT:    packuswb %xmm2, %xmm0981; SSE2-NEXT:    retq982;983; SSE41-LABEL: var_shift_v2i8:984; SSE41:       # %bb.0:985; SSE41-NEXT:    movdqa %xmm0, %xmm2986; SSE41-NEXT:    psllw $5, %xmm1987; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]988; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15]989; SSE41-NEXT:    movdqa %xmm3, %xmm4990; SSE41-NEXT:    psraw $4, %xmm4991; SSE41-NEXT:    pblendvb %xmm0, %xmm4, %xmm3992; SSE41-NEXT:    movdqa %xmm3, %xmm4993; SSE41-NEXT:    psraw $2, %xmm4994; SSE41-NEXT:    paddw %xmm0, %xmm0995; SSE41-NEXT:    pblendvb %xmm0, %xmm4, %xmm3996; SSE41-NEXT:    movdqa %xmm3, %xmm4997; SSE41-NEXT:    psraw $1, %xmm4998; SSE41-NEXT:    paddw %xmm0, %xmm0999; SSE41-NEXT:    pblendvb %xmm0, %xmm4, %xmm31000; SSE41-NEXT:    psrlw $8, %xmm31001; SSE41-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]1002; SSE41-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]1003; SSE41-NEXT:    movdqa %xmm1, %xmm21004; SSE41-NEXT:    psraw $4, %xmm21005; SSE41-NEXT:    pblendvb %xmm0, %xmm2, %xmm11006; SSE41-NEXT:    movdqa %xmm1, %xmm21007; SSE41-NEXT:    psraw $2, %xmm21008; SSE41-NEXT:    paddw %xmm0, %xmm01009; SSE41-NEXT:    pblendvb %xmm0, %xmm2, %xmm11010; SSE41-NEXT:    movdqa %xmm1, %xmm21011; SSE41-NEXT:    psraw $1, %xmm21012; SSE41-NEXT:    paddw %xmm0, %xmm01013; SSE41-NEXT:    pblendvb %xmm0, %xmm2, %xmm11014; SSE41-NEXT:    psrlw $8, %xmm11015; SSE41-NEXT:    packuswb %xmm3, %xmm11016; SSE41-NEXT:    movdqa %xmm1, %xmm01017; SSE41-NEXT:    retq1018;1019; AVX-LABEL: var_shift_v2i8:1020; AVX:       # %bb.0:1021; AVX-NEXT:    vpsllw $5, %xmm1, %xmm11022; AVX-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1023; AVX-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1024; AVX-NEXT:    vpsraw $4, %xmm3, %xmm41025; AVX-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm31026; AVX-NEXT:    vpsraw $2, %xmm3, %xmm41027; AVX-NEXT:    vpaddw %xmm2, %xmm2, %xmm51028; AVX-NEXT:    vpblendvb %xmm5, %xmm4, %xmm3, %xmm31029; AVX-NEXT:    vpsraw $1, %xmm3, %xmm41030; AVX-NEXT:    vpsllw $2, %xmm2, %xmm21031; AVX-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm21032; AVX-NEXT:    vpsrlw $8, %xmm2, %xmm21033; AVX-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1034; AVX-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1035; AVX-NEXT:    vpsraw $4, %xmm0, %xmm31036; AVX-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm01037; AVX-NEXT:    vpsraw $2, %xmm0, %xmm31038; AVX-NEXT:    vpaddw %xmm1, %xmm1, %xmm41039; AVX-NEXT:    vpblendvb %xmm4, %xmm3, %xmm0, %xmm01040; AVX-NEXT:    vpsraw $1, %xmm0, %xmm31041; AVX-NEXT:    vpsllw $2, %xmm1, %xmm11042; AVX-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm01043; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm01044; AVX-NEXT:    vpackuswb %xmm2, %xmm0, %xmm01045; AVX-NEXT:    retq1046;1047; XOP-LABEL: var_shift_v2i8:1048; XOP:       # %bb.0:1049; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm21050; XOP-NEXT:    vpsubb %xmm1, %xmm2, %xmm11051; XOP-NEXT:    vpshab %xmm1, %xmm0, %xmm01052; XOP-NEXT:    retq1053;1054; AVX512DQ-LABEL: var_shift_v2i8:1055; AVX512DQ:       # %bb.0:1056; 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,zero1057; AVX512DQ-NEXT:    vpmovsxbd %xmm0, %zmm01058; AVX512DQ-NEXT:    vpsravd %zmm1, %zmm0, %zmm01059; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm01060; AVX512DQ-NEXT:    vzeroupper1061; AVX512DQ-NEXT:    retq1062;1063; AVX512BW-LABEL: var_shift_v2i8:1064; AVX512BW:       # %bb.0:1065; 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],zero1066; AVX512BW-NEXT:    vpmovsxbw %xmm0, %ymm01067; AVX512BW-NEXT:    vpsravw %zmm1, %zmm0, %zmm01068; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm01069; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm01070; AVX512BW-NEXT:    vzeroupper1071; AVX512BW-NEXT:    retq1072;1073; AVX512DQVL-LABEL: var_shift_v2i8:1074; AVX512DQVL:       # %bb.0:1075; 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,zero1076; AVX512DQVL-NEXT:    vpmovsxbd %xmm0, %zmm01077; AVX512DQVL-NEXT:    vpsravd %zmm1, %zmm0, %zmm01078; AVX512DQVL-NEXT:    vpmovdb %zmm0, %xmm01079; AVX512DQVL-NEXT:    vzeroupper1080; AVX512DQVL-NEXT:    retq1081;1082; AVX512BWVL-LABEL: var_shift_v2i8:1083; AVX512BWVL:       # %bb.0:1084; 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],zero1085; AVX512BWVL-NEXT:    vpmovsxbw %xmm0, %ymm01086; AVX512BWVL-NEXT:    vpsravw %ymm1, %ymm0, %ymm01087; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm01088; AVX512BWVL-NEXT:    vzeroupper1089; AVX512BWVL-NEXT:    retq1090;1091; X86-SSE-LABEL: var_shift_v2i8:1092; X86-SSE:       # %bb.0:1093; X86-SSE-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]1094; X86-SSE-NEXT:    psllw $5, %xmm11095; X86-SSE-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm1[8],xmm4[9],xmm1[9],xmm4[10],xmm1[10],xmm4[11],xmm1[11],xmm4[12],xmm1[12],xmm4[13],xmm1[13],xmm4[14],xmm1[14],xmm4[15],xmm1[15]1096; X86-SSE-NEXT:    pxor %xmm3, %xmm31097; X86-SSE-NEXT:    pxor %xmm5, %xmm51098; X86-SSE-NEXT:    pcmpgtw %xmm4, %xmm51099; X86-SSE-NEXT:    movdqa %xmm5, %xmm61100; X86-SSE-NEXT:    pandn %xmm2, %xmm61101; X86-SSE-NEXT:    psraw $4, %xmm21102; X86-SSE-NEXT:    pand %xmm5, %xmm21103; X86-SSE-NEXT:    por %xmm6, %xmm21104; X86-SSE-NEXT:    paddw %xmm4, %xmm41105; X86-SSE-NEXT:    pxor %xmm5, %xmm51106; X86-SSE-NEXT:    pcmpgtw %xmm4, %xmm51107; X86-SSE-NEXT:    movdqa %xmm5, %xmm61108; X86-SSE-NEXT:    pandn %xmm2, %xmm61109; X86-SSE-NEXT:    psraw $2, %xmm21110; X86-SSE-NEXT:    pand %xmm5, %xmm21111; X86-SSE-NEXT:    por %xmm6, %xmm21112; X86-SSE-NEXT:    paddw %xmm4, %xmm41113; X86-SSE-NEXT:    pxor %xmm5, %xmm51114; X86-SSE-NEXT:    pcmpgtw %xmm4, %xmm51115; X86-SSE-NEXT:    movdqa %xmm5, %xmm41116; X86-SSE-NEXT:    pandn %xmm2, %xmm41117; X86-SSE-NEXT:    psraw $1, %xmm21118; X86-SSE-NEXT:    pand %xmm5, %xmm21119; X86-SSE-NEXT:    por %xmm4, %xmm21120; X86-SSE-NEXT:    psrlw $8, %xmm21121; X86-SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1122; X86-SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1123; X86-SSE-NEXT:    pxor %xmm4, %xmm41124; X86-SSE-NEXT:    pcmpgtw %xmm1, %xmm41125; X86-SSE-NEXT:    movdqa %xmm4, %xmm51126; X86-SSE-NEXT:    pandn %xmm0, %xmm51127; X86-SSE-NEXT:    psraw $4, %xmm01128; X86-SSE-NEXT:    pand %xmm4, %xmm01129; X86-SSE-NEXT:    por %xmm5, %xmm01130; X86-SSE-NEXT:    paddw %xmm1, %xmm11131; X86-SSE-NEXT:    pxor %xmm4, %xmm41132; X86-SSE-NEXT:    pcmpgtw %xmm1, %xmm41133; X86-SSE-NEXT:    movdqa %xmm4, %xmm51134; X86-SSE-NEXT:    pandn %xmm0, %xmm51135; X86-SSE-NEXT:    psraw $2, %xmm01136; X86-SSE-NEXT:    pand %xmm4, %xmm01137; X86-SSE-NEXT:    por %xmm5, %xmm01138; X86-SSE-NEXT:    paddw %xmm1, %xmm11139; X86-SSE-NEXT:    pcmpgtw %xmm1, %xmm31140; X86-SSE-NEXT:    movdqa %xmm3, %xmm11141; X86-SSE-NEXT:    pandn %xmm0, %xmm11142; X86-SSE-NEXT:    psraw $1, %xmm01143; X86-SSE-NEXT:    pand %xmm3, %xmm01144; X86-SSE-NEXT:    por %xmm1, %xmm01145; X86-SSE-NEXT:    psrlw $8, %xmm01146; X86-SSE-NEXT:    packuswb %xmm2, %xmm01147; X86-SSE-NEXT:    retl1148  %shift = ashr <2 x i8> %a, %b1149  ret <2 x i8> %shift1150}1151 1152;1153; Uniform Variable Shifts1154;1155 1156define <2 x i32> @splatvar_shift_v2i32(<2 x i32> %a, <2 x i32> %b) nounwind {1157; SSE2-LABEL: splatvar_shift_v2i32:1158; SSE2:       # %bb.0:1159; SSE2-NEXT:    xorps %xmm2, %xmm21160; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]1161; SSE2-NEXT:    psrad %xmm2, %xmm01162; SSE2-NEXT:    retq1163;1164; SSE41-LABEL: splatvar_shift_v2i32:1165; SSE41:       # %bb.0:1166; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero1167; SSE41-NEXT:    psrad %xmm1, %xmm01168; SSE41-NEXT:    retq1169;1170; AVX-LABEL: splatvar_shift_v2i32:1171; AVX:       # %bb.0:1172; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero1173; AVX-NEXT:    vpsrad %xmm1, %xmm0, %xmm01174; AVX-NEXT:    retq1175;1176; XOP-LABEL: splatvar_shift_v2i32:1177; XOP:       # %bb.0:1178; XOP-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero1179; XOP-NEXT:    vpsrad %xmm1, %xmm0, %xmm01180; XOP-NEXT:    retq1181;1182; AVX512-LABEL: splatvar_shift_v2i32:1183; AVX512:       # %bb.0:1184; AVX512-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero1185; AVX512-NEXT:    vpsrad %xmm1, %xmm0, %xmm01186; AVX512-NEXT:    retq1187;1188; AVX512VL-LABEL: splatvar_shift_v2i32:1189; AVX512VL:       # %bb.0:1190; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero1191; AVX512VL-NEXT:    vpsrad %xmm1, %xmm0, %xmm01192; AVX512VL-NEXT:    retq1193;1194; X86-SSE-LABEL: splatvar_shift_v2i32:1195; X86-SSE:       # %bb.0:1196; X86-SSE-NEXT:    xorps %xmm2, %xmm21197; X86-SSE-NEXT:    movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]1198; X86-SSE-NEXT:    psrad %xmm2, %xmm01199; X86-SSE-NEXT:    retl1200  %splat = shufflevector <2 x i32> %b, <2 x i32> poison, <2 x i32> zeroinitializer1201  %shift = ashr <2 x i32> %a, %splat1202  ret <2 x i32> %shift1203}1204 1205define <4 x i16> @splatvar_shift_v4i16(<4 x i16> %a, <4 x i16> %b) nounwind {1206; SSE2-LABEL: splatvar_shift_v4i16:1207; SSE2:       # %bb.0:1208; SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]1209; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1210; SSE2-NEXT:    psraw %xmm1, %xmm01211; SSE2-NEXT:    retq1212;1213; SSE41-LABEL: splatvar_shift_v4i16:1214; SSE41:       # %bb.0:1215; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero1216; SSE41-NEXT:    psraw %xmm1, %xmm01217; SSE41-NEXT:    retq1218;1219; AVX-LABEL: splatvar_shift_v4i16:1220; AVX:       # %bb.0:1221; AVX-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero1222; AVX-NEXT:    vpsraw %xmm1, %xmm0, %xmm01223; AVX-NEXT:    retq1224;1225; XOP-LABEL: splatvar_shift_v4i16:1226; XOP:       # %bb.0:1227; XOP-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero1228; XOP-NEXT:    vpsraw %xmm1, %xmm0, %xmm01229; XOP-NEXT:    retq1230;1231; AVX512-LABEL: splatvar_shift_v4i16:1232; AVX512:       # %bb.0:1233; AVX512-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero1234; AVX512-NEXT:    vpsraw %xmm1, %xmm0, %xmm01235; AVX512-NEXT:    retq1236;1237; AVX512VL-LABEL: splatvar_shift_v4i16:1238; AVX512VL:       # %bb.0:1239; AVX512VL-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero1240; AVX512VL-NEXT:    vpsraw %xmm1, %xmm0, %xmm01241; AVX512VL-NEXT:    retq1242;1243; X86-SSE-LABEL: splatvar_shift_v4i16:1244; X86-SSE:       # %bb.0:1245; X86-SSE-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]1246; X86-SSE-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1247; X86-SSE-NEXT:    psraw %xmm1, %xmm01248; X86-SSE-NEXT:    retl1249  %splat = shufflevector <4 x i16> %b, <4 x i16> poison, <4 x i32> zeroinitializer1250  %shift = ashr <4 x i16> %a, %splat1251  ret <4 x i16> %shift1252}1253 1254define <2 x i16> @splatvar_shift_v2i16(<2 x i16> %a, <2 x i16> %b) nounwind {1255; SSE2-LABEL: splatvar_shift_v2i16:1256; SSE2:       # %bb.0:1257; SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]1258; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1259; SSE2-NEXT:    psraw %xmm1, %xmm01260; SSE2-NEXT:    retq1261;1262; SSE41-LABEL: splatvar_shift_v2i16:1263; SSE41:       # %bb.0:1264; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero1265; SSE41-NEXT:    psraw %xmm1, %xmm01266; SSE41-NEXT:    retq1267;1268; AVX-LABEL: splatvar_shift_v2i16:1269; AVX:       # %bb.0:1270; AVX-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero1271; AVX-NEXT:    vpsraw %xmm1, %xmm0, %xmm01272; AVX-NEXT:    retq1273;1274; XOP-LABEL: splatvar_shift_v2i16:1275; XOP:       # %bb.0:1276; XOP-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero1277; XOP-NEXT:    vpsraw %xmm1, %xmm0, %xmm01278; XOP-NEXT:    retq1279;1280; AVX512-LABEL: splatvar_shift_v2i16:1281; AVX512:       # %bb.0:1282; AVX512-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero1283; AVX512-NEXT:    vpsraw %xmm1, %xmm0, %xmm01284; AVX512-NEXT:    retq1285;1286; AVX512VL-LABEL: splatvar_shift_v2i16:1287; AVX512VL:       # %bb.0:1288; AVX512VL-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero1289; AVX512VL-NEXT:    vpsraw %xmm1, %xmm0, %xmm01290; AVX512VL-NEXT:    retq1291;1292; X86-SSE-LABEL: splatvar_shift_v2i16:1293; X86-SSE:       # %bb.0:1294; X86-SSE-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]1295; X86-SSE-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1296; X86-SSE-NEXT:    psraw %xmm1, %xmm01297; X86-SSE-NEXT:    retl1298  %splat = shufflevector <2 x i16> %b, <2 x i16> poison, <2 x i32> zeroinitializer1299  %shift = ashr <2 x i16> %a, %splat1300  ret <2 x i16> %shift1301}1302 1303define <8 x i8> @splatvar_shift_v8i8(<8 x i8> %a, <8 x i8> %b) nounwind {1304; SSE2-LABEL: splatvar_shift_v8i8:1305; SSE2:       # %bb.0:1306; SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]1307; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1308; SSE2-NEXT:    psrlw %xmm1, %xmm01309; SSE2-NEXT:    pcmpeqd %xmm2, %xmm21310; SSE2-NEXT:    psrlw %xmm1, %xmm21311; SSE2-NEXT:    psrlw $8, %xmm21312; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1313; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,0,0,0,4,5,6,7]1314; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,1,0,1]1315; SSE2-NEXT:    pand %xmm2, %xmm01316; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32896,32896,32896,32896,32896,32896,32896,32896]1317; SSE2-NEXT:    psrlw %xmm1, %xmm21318; SSE2-NEXT:    pxor %xmm2, %xmm01319; SSE2-NEXT:    psubb %xmm2, %xmm01320; SSE2-NEXT:    retq1321;1322; SSE41-LABEL: splatvar_shift_v8i8:1323; SSE41:       # %bb.0:1324; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1325; SSE41-NEXT:    psrlw %xmm1, %xmm01326; SSE41-NEXT:    pcmpeqd %xmm2, %xmm21327; SSE41-NEXT:    psrlw %xmm1, %xmm21328; SSE41-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1329; SSE41-NEXT:    pand %xmm2, %xmm01330; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [32896,32896,32896,32896,32896,32896,32896,32896]1331; SSE41-NEXT:    psrlw %xmm1, %xmm21332; SSE41-NEXT:    pxor %xmm2, %xmm01333; SSE41-NEXT:    psubb %xmm2, %xmm01334; SSE41-NEXT:    retq1335;1336; AVX1-LABEL: splatvar_shift_v8i8:1337; AVX1:       # %bb.0:1338; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1339; AVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm01340; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm21341; AVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm21342; AVX1-NEXT:    vpshufb {{.*#+}} xmm2 = xmm2[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1343; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm01344; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [32896,32896,32896,32896,32896,32896,32896,32896]1345; AVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm11346; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm01347; AVX1-NEXT:    vpsubb %xmm1, %xmm0, %xmm01348; AVX1-NEXT:    retq1349;1350; AVX2-LABEL: splatvar_shift_v8i8:1351; AVX2:       # %bb.0:1352; AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1353; AVX2-NEXT:    vpsrlw %xmm1, %xmm0, %xmm01354; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm21355; AVX2-NEXT:    vpsrlw %xmm1, %xmm2, %xmm21356; AVX2-NEXT:    vpsrlw $8, %xmm2, %xmm21357; AVX2-NEXT:    vpbroadcastb %xmm2, %xmm21358; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm01359; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]1360; AVX2-NEXT:    vpsrlw %xmm1, %xmm2, %xmm11361; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm01362; AVX2-NEXT:    vpsubb %xmm1, %xmm0, %xmm01363; AVX2-NEXT:    retq1364;1365; XOPAVX1-LABEL: splatvar_shift_v8i8:1366; XOPAVX1:       # %bb.0:1367; XOPAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1368; XOPAVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]1369; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm21370; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm2, %xmm11371; XOPAVX1-NEXT:    vpshab %xmm1, %xmm0, %xmm01372; XOPAVX1-NEXT:    retq1373;1374; XOPAVX2-LABEL: splatvar_shift_v8i8:1375; XOPAVX2:       # %bb.0:1376; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %xmm11377; XOPAVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm21378; XOPAVX2-NEXT:    vpsubb %xmm1, %xmm2, %xmm11379; XOPAVX2-NEXT:    vpshab %xmm1, %xmm0, %xmm01380; XOPAVX2-NEXT:    retq1381;1382; AVX512DQ-LABEL: splatvar_shift_v8i8:1383; AVX512DQ:       # %bb.0:1384; AVX512DQ-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1385; AVX512DQ-NEXT:    vpmovsxbd %xmm0, %zmm01386; AVX512DQ-NEXT:    vpsrad %xmm1, %zmm0, %zmm01387; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm01388; AVX512DQ-NEXT:    vzeroupper1389; AVX512DQ-NEXT:    retq1390;1391; AVX512BW-LABEL: splatvar_shift_v8i8:1392; AVX512BW:       # %bb.0:1393; AVX512BW-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1394; AVX512BW-NEXT:    vpmovsxbw %xmm0, %ymm01395; AVX512BW-NEXT:    vpsraw %xmm1, %ymm0, %ymm01396; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm01397; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm01398; AVX512BW-NEXT:    vzeroupper1399; AVX512BW-NEXT:    retq1400;1401; AVX512DQVL-LABEL: splatvar_shift_v8i8:1402; AVX512DQVL:       # %bb.0:1403; AVX512DQVL-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1404; AVX512DQVL-NEXT:    vpmovsxbd %xmm0, %zmm01405; AVX512DQVL-NEXT:    vpsrad %xmm1, %zmm0, %zmm01406; AVX512DQVL-NEXT:    vpmovdb %zmm0, %xmm01407; AVX512DQVL-NEXT:    vzeroupper1408; AVX512DQVL-NEXT:    retq1409;1410; AVX512BWVL-LABEL: splatvar_shift_v8i8:1411; AVX512BWVL:       # %bb.0:1412; AVX512BWVL-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1413; AVX512BWVL-NEXT:    vpmovsxbw %xmm0, %ymm01414; AVX512BWVL-NEXT:    vpsraw %xmm1, %ymm0, %ymm01415; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm01416; AVX512BWVL-NEXT:    vzeroupper1417; AVX512BWVL-NEXT:    retq1418;1419; X86-SSE-LABEL: splatvar_shift_v8i8:1420; X86-SSE:       # %bb.0:1421; X86-SSE-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]1422; X86-SSE-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1423; X86-SSE-NEXT:    psrlw %xmm1, %xmm01424; X86-SSE-NEXT:    pcmpeqd %xmm2, %xmm21425; X86-SSE-NEXT:    psrlw %xmm1, %xmm21426; X86-SSE-NEXT:    psrlw $8, %xmm21427; X86-SSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1428; X86-SSE-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,0,0,0,4,5,6,7]1429; X86-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,1,0,1]1430; X86-SSE-NEXT:    pand %xmm2, %xmm01431; X86-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [32896,32896,32896,32896,32896,32896,32896,32896]1432; X86-SSE-NEXT:    psrlw %xmm1, %xmm21433; X86-SSE-NEXT:    pxor %xmm2, %xmm01434; X86-SSE-NEXT:    psubb %xmm2, %xmm01435; X86-SSE-NEXT:    retl1436  %splat = shufflevector <8 x i8> %b, <8 x i8> poison, <8 x i32> zeroinitializer1437  %shift = ashr <8 x i8> %a, %splat1438  ret <8 x i8> %shift1439}1440 1441define <4 x i8> @splatvar_shift_v4i8(<4 x i8> %a, <4 x i8> %b) nounwind {1442; SSE2-LABEL: splatvar_shift_v4i8:1443; SSE2:       # %bb.0:1444; SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]1445; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1446; SSE2-NEXT:    psrlw %xmm1, %xmm01447; SSE2-NEXT:    pcmpeqd %xmm2, %xmm21448; SSE2-NEXT:    psrlw %xmm1, %xmm21449; SSE2-NEXT:    psrlw $8, %xmm21450; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1451; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,0,0,0,4,5,6,7]1452; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,1,0,1]1453; SSE2-NEXT:    pand %xmm2, %xmm01454; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32896,32896,32896,32896,32896,32896,32896,32896]1455; SSE2-NEXT:    psrlw %xmm1, %xmm21456; SSE2-NEXT:    pxor %xmm2, %xmm01457; SSE2-NEXT:    psubb %xmm2, %xmm01458; SSE2-NEXT:    retq1459;1460; SSE41-LABEL: splatvar_shift_v4i8:1461; SSE41:       # %bb.0:1462; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1463; SSE41-NEXT:    psrlw %xmm1, %xmm01464; SSE41-NEXT:    pcmpeqd %xmm2, %xmm21465; SSE41-NEXT:    psrlw %xmm1, %xmm21466; SSE41-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1467; SSE41-NEXT:    pand %xmm2, %xmm01468; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [32896,32896,32896,32896,32896,32896,32896,32896]1469; SSE41-NEXT:    psrlw %xmm1, %xmm21470; SSE41-NEXT:    pxor %xmm2, %xmm01471; SSE41-NEXT:    psubb %xmm2, %xmm01472; SSE41-NEXT:    retq1473;1474; AVX1-LABEL: splatvar_shift_v4i8:1475; AVX1:       # %bb.0:1476; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1477; AVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm01478; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm21479; AVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm21480; AVX1-NEXT:    vpshufb {{.*#+}} xmm2 = xmm2[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1481; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm01482; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [32896,32896,32896,32896,32896,32896,32896,32896]1483; AVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm11484; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm01485; AVX1-NEXT:    vpsubb %xmm1, %xmm0, %xmm01486; AVX1-NEXT:    retq1487;1488; AVX2-LABEL: splatvar_shift_v4i8:1489; AVX2:       # %bb.0:1490; AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1491; AVX2-NEXT:    vpsrlw %xmm1, %xmm0, %xmm01492; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm21493; AVX2-NEXT:    vpsrlw %xmm1, %xmm2, %xmm21494; AVX2-NEXT:    vpsrlw $8, %xmm2, %xmm21495; AVX2-NEXT:    vpbroadcastb %xmm2, %xmm21496; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm01497; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]1498; AVX2-NEXT:    vpsrlw %xmm1, %xmm2, %xmm11499; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm01500; AVX2-NEXT:    vpsubb %xmm1, %xmm0, %xmm01501; AVX2-NEXT:    retq1502;1503; XOPAVX1-LABEL: splatvar_shift_v4i8:1504; XOPAVX1:       # %bb.0:1505; XOPAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1506; XOPAVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]1507; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm21508; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm2, %xmm11509; XOPAVX1-NEXT:    vpshab %xmm1, %xmm0, %xmm01510; XOPAVX1-NEXT:    retq1511;1512; XOPAVX2-LABEL: splatvar_shift_v4i8:1513; XOPAVX2:       # %bb.0:1514; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %xmm11515; XOPAVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm21516; XOPAVX2-NEXT:    vpsubb %xmm1, %xmm2, %xmm11517; XOPAVX2-NEXT:    vpshab %xmm1, %xmm0, %xmm01518; XOPAVX2-NEXT:    retq1519;1520; AVX512DQ-LABEL: splatvar_shift_v4i8:1521; AVX512DQ:       # %bb.0:1522; AVX512DQ-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1523; AVX512DQ-NEXT:    vpmovsxbd %xmm0, %zmm01524; AVX512DQ-NEXT:    vpsrad %xmm1, %zmm0, %zmm01525; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm01526; AVX512DQ-NEXT:    vzeroupper1527; AVX512DQ-NEXT:    retq1528;1529; AVX512BW-LABEL: splatvar_shift_v4i8:1530; AVX512BW:       # %bb.0:1531; AVX512BW-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1532; AVX512BW-NEXT:    vpmovsxbw %xmm0, %ymm01533; AVX512BW-NEXT:    vpsraw %xmm1, %ymm0, %ymm01534; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm01535; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm01536; AVX512BW-NEXT:    vzeroupper1537; AVX512BW-NEXT:    retq1538;1539; AVX512DQVL-LABEL: splatvar_shift_v4i8:1540; AVX512DQVL:       # %bb.0:1541; AVX512DQVL-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1542; AVX512DQVL-NEXT:    vpmovsxbd %xmm0, %zmm01543; AVX512DQVL-NEXT:    vpsrad %xmm1, %zmm0, %zmm01544; AVX512DQVL-NEXT:    vpmovdb %zmm0, %xmm01545; AVX512DQVL-NEXT:    vzeroupper1546; AVX512DQVL-NEXT:    retq1547;1548; AVX512BWVL-LABEL: splatvar_shift_v4i8:1549; AVX512BWVL:       # %bb.0:1550; AVX512BWVL-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1551; AVX512BWVL-NEXT:    vpmovsxbw %xmm0, %ymm01552; AVX512BWVL-NEXT:    vpsraw %xmm1, %ymm0, %ymm01553; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm01554; AVX512BWVL-NEXT:    vzeroupper1555; AVX512BWVL-NEXT:    retq1556;1557; X86-SSE-LABEL: splatvar_shift_v4i8:1558; X86-SSE:       # %bb.0:1559; X86-SSE-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]1560; X86-SSE-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1561; X86-SSE-NEXT:    psrlw %xmm1, %xmm01562; X86-SSE-NEXT:    pcmpeqd %xmm2, %xmm21563; X86-SSE-NEXT:    psrlw %xmm1, %xmm21564; X86-SSE-NEXT:    psrlw $8, %xmm21565; X86-SSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1566; X86-SSE-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,0,0,0,4,5,6,7]1567; X86-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,1,0,1]1568; X86-SSE-NEXT:    pand %xmm2, %xmm01569; X86-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [32896,32896,32896,32896,32896,32896,32896,32896]1570; X86-SSE-NEXT:    psrlw %xmm1, %xmm21571; X86-SSE-NEXT:    pxor %xmm2, %xmm01572; X86-SSE-NEXT:    psubb %xmm2, %xmm01573; X86-SSE-NEXT:    retl1574  %splat = shufflevector <4 x i8> %b, <4 x i8> poison, <4 x i32> zeroinitializer1575  %shift = ashr <4 x i8> %a, %splat1576  ret <4 x i8> %shift1577}1578 1579define <2 x i8> @splatvar_shift_v2i8(<2 x i8> %a, <2 x i8> %b) nounwind {1580; SSE2-LABEL: splatvar_shift_v2i8:1581; SSE2:       # %bb.0:1582; SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]1583; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1584; SSE2-NEXT:    psrlw %xmm1, %xmm01585; SSE2-NEXT:    pcmpeqd %xmm2, %xmm21586; SSE2-NEXT:    psrlw %xmm1, %xmm21587; SSE2-NEXT:    psrlw $8, %xmm21588; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1589; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,0,0,0,4,5,6,7]1590; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,1,0,1]1591; SSE2-NEXT:    pand %xmm2, %xmm01592; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32896,32896,32896,32896,32896,32896,32896,32896]1593; SSE2-NEXT:    psrlw %xmm1, %xmm21594; SSE2-NEXT:    pxor %xmm2, %xmm01595; SSE2-NEXT:    psubb %xmm2, %xmm01596; SSE2-NEXT:    retq1597;1598; SSE41-LABEL: splatvar_shift_v2i8:1599; SSE41:       # %bb.0:1600; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1601; SSE41-NEXT:    psrlw %xmm1, %xmm01602; SSE41-NEXT:    pcmpeqd %xmm2, %xmm21603; SSE41-NEXT:    psrlw %xmm1, %xmm21604; SSE41-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1605; SSE41-NEXT:    pand %xmm2, %xmm01606; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [32896,32896,32896,32896,32896,32896,32896,32896]1607; SSE41-NEXT:    psrlw %xmm1, %xmm21608; SSE41-NEXT:    pxor %xmm2, %xmm01609; SSE41-NEXT:    psubb %xmm2, %xmm01610; SSE41-NEXT:    retq1611;1612; AVX1-LABEL: splatvar_shift_v2i8:1613; AVX1:       # %bb.0:1614; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1615; AVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm01616; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm21617; AVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm21618; AVX1-NEXT:    vpshufb {{.*#+}} xmm2 = xmm2[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1619; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm01620; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [32896,32896,32896,32896,32896,32896,32896,32896]1621; AVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm11622; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm01623; AVX1-NEXT:    vpsubb %xmm1, %xmm0, %xmm01624; AVX1-NEXT:    retq1625;1626; AVX2-LABEL: splatvar_shift_v2i8:1627; AVX2:       # %bb.0:1628; AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1629; AVX2-NEXT:    vpsrlw %xmm1, %xmm0, %xmm01630; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm21631; AVX2-NEXT:    vpsrlw %xmm1, %xmm2, %xmm21632; AVX2-NEXT:    vpsrlw $8, %xmm2, %xmm21633; AVX2-NEXT:    vpbroadcastb %xmm2, %xmm21634; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm01635; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]1636; AVX2-NEXT:    vpsrlw %xmm1, %xmm2, %xmm11637; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm01638; AVX2-NEXT:    vpsubb %xmm1, %xmm0, %xmm01639; AVX2-NEXT:    retq1640;1641; XOP-LABEL: splatvar_shift_v2i8:1642; XOP:       # %bb.0:1643; XOP-NEXT:    insertq {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7,u,u,u,u,u,u,u,u]1644; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm21645; XOP-NEXT:    vpsubb %xmm1, %xmm2, %xmm11646; XOP-NEXT:    vpshab %xmm1, %xmm0, %xmm01647; XOP-NEXT:    retq1648;1649; AVX512DQ-LABEL: splatvar_shift_v2i8:1650; AVX512DQ:       # %bb.0:1651; AVX512DQ-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1652; AVX512DQ-NEXT:    vpmovsxbd %xmm0, %zmm01653; AVX512DQ-NEXT:    vpsrad %xmm1, %zmm0, %zmm01654; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm01655; AVX512DQ-NEXT:    vzeroupper1656; AVX512DQ-NEXT:    retq1657;1658; AVX512BW-LABEL: splatvar_shift_v2i8:1659; AVX512BW:       # %bb.0:1660; AVX512BW-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1661; AVX512BW-NEXT:    vpmovsxbw %xmm0, %ymm01662; AVX512BW-NEXT:    vpsraw %xmm1, %ymm0, %ymm01663; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm01664; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm01665; AVX512BW-NEXT:    vzeroupper1666; AVX512BW-NEXT:    retq1667;1668; AVX512DQVL-LABEL: splatvar_shift_v2i8:1669; AVX512DQVL:       # %bb.0:1670; AVX512DQVL-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1671; AVX512DQVL-NEXT:    vpmovsxbd %xmm0, %zmm01672; AVX512DQVL-NEXT:    vpsrad %xmm1, %zmm0, %zmm01673; AVX512DQVL-NEXT:    vpmovdb %zmm0, %xmm01674; AVX512DQVL-NEXT:    vzeroupper1675; AVX512DQVL-NEXT:    retq1676;1677; AVX512BWVL-LABEL: splatvar_shift_v2i8:1678; AVX512BWVL:       # %bb.0:1679; AVX512BWVL-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1680; AVX512BWVL-NEXT:    vpmovsxbw %xmm0, %ymm01681; AVX512BWVL-NEXT:    vpsraw %xmm1, %ymm0, %ymm01682; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm01683; AVX512BWVL-NEXT:    vzeroupper1684; AVX512BWVL-NEXT:    retq1685;1686; X86-SSE-LABEL: splatvar_shift_v2i8:1687; X86-SSE:       # %bb.0:1688; X86-SSE-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]1689; X86-SSE-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero1690; X86-SSE-NEXT:    psrlw %xmm1, %xmm01691; X86-SSE-NEXT:    pcmpeqd %xmm2, %xmm21692; X86-SSE-NEXT:    psrlw %xmm1, %xmm21693; X86-SSE-NEXT:    psrlw $8, %xmm21694; X86-SSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1695; X86-SSE-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,0,0,0,4,5,6,7]1696; X86-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,1,0,1]1697; X86-SSE-NEXT:    pand %xmm2, %xmm01698; X86-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [32896,32896,32896,32896,32896,32896,32896,32896]1699; X86-SSE-NEXT:    psrlw %xmm1, %xmm21700; X86-SSE-NEXT:    pxor %xmm2, %xmm01701; X86-SSE-NEXT:    psubb %xmm2, %xmm01702; X86-SSE-NEXT:    retl1703  %splat = shufflevector <2 x i8> %b, <2 x i8> poison, <2 x i32> zeroinitializer1704  %shift = ashr <2 x i8> %a, %splat1705  ret <2 x i8> %shift1706}1707 1708;1709; Constant Shifts1710;1711 1712define <2 x i32> @constant_shift_v2i32(<2 x i32> %a) nounwind {1713; SSE2-LABEL: constant_shift_v2i32:1714; SSE2:       # %bb.0:1715; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1716; SSE2-NEXT:    psrad $4, %xmm01717; SSE2-NEXT:    psrad $5, %xmm11718; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1719; SSE2-NEXT:    retq1720;1721; SSE41-LABEL: constant_shift_v2i32:1722; SSE41:       # %bb.0:1723; SSE41-NEXT:    movdqa %xmm0, %xmm11724; SSE41-NEXT:    psrad $5, %xmm11725; SSE41-NEXT:    psrad $4, %xmm01726; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]1727; SSE41-NEXT:    retq1728;1729; AVX1-LABEL: constant_shift_v2i32:1730; AVX1:       # %bb.0:1731; AVX1-NEXT:    vpsrad $5, %xmm0, %xmm11732; AVX1-NEXT:    vpsrad $4, %xmm0, %xmm01733; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]1734; AVX1-NEXT:    retq1735;1736; AVX2-LABEL: constant_shift_v2i32:1737; AVX2:       # %bb.0:1738; AVX2-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01739; AVX2-NEXT:    retq1740;1741; XOPAVX1-LABEL: constant_shift_v2i32:1742; XOPAVX1:       # %bb.0:1743; XOPAVX1-NEXT:    vpshad {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01744; XOPAVX1-NEXT:    retq1745;1746; XOPAVX2-LABEL: constant_shift_v2i32:1747; XOPAVX2:       # %bb.0:1748; XOPAVX2-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01749; XOPAVX2-NEXT:    retq1750;1751; AVX512-LABEL: constant_shift_v2i32:1752; AVX512:       # %bb.0:1753; AVX512-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01754; AVX512-NEXT:    retq1755;1756; AVX512VL-LABEL: constant_shift_v2i32:1757; AVX512VL:       # %bb.0:1758; AVX512VL-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01759; AVX512VL-NEXT:    retq1760;1761; X86-SSE-LABEL: constant_shift_v2i32:1762; X86-SSE:       # %bb.0:1763; X86-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1764; X86-SSE-NEXT:    psrad $4, %xmm01765; X86-SSE-NEXT:    psrad $5, %xmm11766; X86-SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1767; X86-SSE-NEXT:    retl1768  %shift = ashr <2 x i32> %a, <i32 4, i32 5>1769  ret <2 x i32> %shift1770}1771 1772define <4 x i16> @constant_shift_v4i16(<4 x i16> %a) nounwind {1773; SSE2-LABEL: constant_shift_v4i16:1774; SSE2:       # %bb.0:1775; SSE2-NEXT:    movdqa %xmm0, %xmm11776; SSE2-NEXT:    psraw $2, %xmm11777; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,0],xmm0[0,0]1778; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[2,3]1779; SSE2-NEXT:    movaps {{.*#+}} xmm0 = [65535,0,65535,0,65535,65535,65535,65535]1780; SSE2-NEXT:    movaps %xmm1, %xmm21781; SSE2-NEXT:    andps %xmm0, %xmm21782; SSE2-NEXT:    psraw $1, %xmm11783; SSE2-NEXT:    andnps %xmm1, %xmm01784; SSE2-NEXT:    orps %xmm2, %xmm01785; SSE2-NEXT:    retq1786;1787; SSE41-LABEL: constant_shift_v4i16:1788; SSE41:       # %bb.0:1789; SSE41-NEXT:    movq {{.*#+}} xmm1 = [0,0,16384,8192,0,0,0,0]1790; SSE41-NEXT:    pmulhw %xmm0, %xmm11791; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5,6,7]1792; SSE41-NEXT:    psraw $1, %xmm01793; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3,4,5,6,7]1794; SSE41-NEXT:    retq1795;1796; AVX-LABEL: constant_shift_v4i16:1797; AVX:       # %bb.0:1798; AVX-NEXT:    vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [u,u,16384,8192,u,u,u,u]1799; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5,6,7]1800; AVX-NEXT:    vpsraw $1, %xmm0, %xmm01801; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3,4,5,6,7]1802; AVX-NEXT:    retq1803;1804; XOP-LABEL: constant_shift_v4i16:1805; XOP:       # %bb.0:1806; XOP-NEXT:    vpshaw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01807; XOP-NEXT:    retq1808;1809; AVX512DQ-LABEL: constant_shift_v4i16:1810; AVX512DQ:       # %bb.0:1811; AVX512DQ-NEXT:    vpmovsxwd %xmm0, %ymm01812; AVX512DQ-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01813; AVX512DQ-NEXT:    vpmovdw %zmm0, %ymm01814; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm01815; AVX512DQ-NEXT:    vzeroupper1816; AVX512DQ-NEXT:    retq1817;1818; AVX512BW-LABEL: constant_shift_v4i16:1819; AVX512BW:       # %bb.0:1820; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01821; AVX512BW-NEXT:    vmovq {{.*#+}} xmm1 = [0,1,2,3,0,0,0,0]1822; AVX512BW-NEXT:    vpsravw %zmm1, %zmm0, %zmm01823; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01824; AVX512BW-NEXT:    vzeroupper1825; AVX512BW-NEXT:    retq1826;1827; AVX512DQVL-LABEL: constant_shift_v4i16:1828; AVX512DQVL:       # %bb.0:1829; AVX512DQVL-NEXT:    vpmovsxwd %xmm0, %ymm01830; AVX512DQVL-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01831; AVX512DQVL-NEXT:    vpmovdw %ymm0, %xmm01832; AVX512DQVL-NEXT:    vzeroupper1833; AVX512DQVL-NEXT:    retq1834;1835; AVX512BWVL-LABEL: constant_shift_v4i16:1836; AVX512BWVL:       # %bb.0:1837; AVX512BWVL-NEXT:    vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01838; AVX512BWVL-NEXT:    retq1839;1840; X86-SSE-LABEL: constant_shift_v4i16:1841; X86-SSE:       # %bb.0:1842; X86-SSE-NEXT:    movdqa %xmm0, %xmm11843; X86-SSE-NEXT:    psraw $2, %xmm11844; X86-SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,0],xmm0[0,0]1845; X86-SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[2,3]1846; X86-SSE-NEXT:    movaps {{.*#+}} xmm0 = [65535,0,65535,0,65535,65535,65535,65535]1847; X86-SSE-NEXT:    movaps %xmm1, %xmm21848; X86-SSE-NEXT:    andps %xmm0, %xmm21849; X86-SSE-NEXT:    psraw $1, %xmm11850; X86-SSE-NEXT:    andnps %xmm1, %xmm01851; X86-SSE-NEXT:    orps %xmm2, %xmm01852; X86-SSE-NEXT:    retl1853  %shift = ashr <4 x i16> %a, <i16 0, i16 1, i16 2, i16 3>1854  ret <4 x i16> %shift1855}1856 1857define <2 x i16> @constant_shift_v2i16(<2 x i16> %a) nounwind {1858; SSE2-LABEL: constant_shift_v2i16:1859; SSE2:       # %bb.0:1860; SSE2-NEXT:    movdqa %xmm0, %xmm11861; SSE2-NEXT:    psraw $3, %xmm11862; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [65535,0,65535,65535,65535,65535,65535,65535]1863; SSE2-NEXT:    psraw $2, %xmm01864; SSE2-NEXT:    pand %xmm2, %xmm01865; SSE2-NEXT:    pandn %xmm1, %xmm21866; SSE2-NEXT:    por %xmm2, %xmm01867; SSE2-NEXT:    retq1868;1869; SSE41-LABEL: constant_shift_v2i16:1870; SSE41:       # %bb.0:1871; SSE41-NEXT:    movdqa %xmm0, %xmm11872; SSE41-NEXT:    psraw $3, %xmm11873; SSE41-NEXT:    psraw $2, %xmm01874; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3,4,5,6,7]1875; SSE41-NEXT:    retq1876;1877; AVX-LABEL: constant_shift_v2i16:1878; AVX:       # %bb.0:1879; AVX-NEXT:    vpsraw $3, %xmm0, %xmm11880; AVX-NEXT:    vpsraw $2, %xmm0, %xmm01881; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3,4,5,6,7]1882; AVX-NEXT:    retq1883;1884; XOP-LABEL: constant_shift_v2i16:1885; XOP:       # %bb.0:1886; XOP-NEXT:    vpshaw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01887; XOP-NEXT:    retq1888;1889; AVX512DQ-LABEL: constant_shift_v2i16:1890; AVX512DQ:       # %bb.0:1891; AVX512DQ-NEXT:    vpsraw $3, %xmm0, %xmm11892; AVX512DQ-NEXT:    vpsraw $2, %xmm0, %xmm01893; AVX512DQ-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3,4,5,6,7]1894; AVX512DQ-NEXT:    retq1895;1896; AVX512BW-LABEL: constant_shift_v2i16:1897; AVX512BW:       # %bb.0:1898; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01899; AVX512BW-NEXT:    vmovd {{.*#+}} xmm1 = [2,3,0,0,0,0,0,0]1900; AVX512BW-NEXT:    vpsravw %zmm1, %zmm0, %zmm01901; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01902; AVX512BW-NEXT:    vzeroupper1903; AVX512BW-NEXT:    retq1904;1905; AVX512DQVL-LABEL: constant_shift_v2i16:1906; AVX512DQVL:       # %bb.0:1907; AVX512DQVL-NEXT:    vpsraw $3, %xmm0, %xmm11908; AVX512DQVL-NEXT:    vpsraw $2, %xmm0, %xmm01909; AVX512DQVL-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3,4,5,6,7]1910; AVX512DQVL-NEXT:    retq1911;1912; AVX512BWVL-LABEL: constant_shift_v2i16:1913; AVX512BWVL:       # %bb.0:1914; AVX512BWVL-NEXT:    vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01915; AVX512BWVL-NEXT:    retq1916;1917; X86-SSE-LABEL: constant_shift_v2i16:1918; X86-SSE:       # %bb.0:1919; X86-SSE-NEXT:    movdqa %xmm0, %xmm11920; X86-SSE-NEXT:    psraw $3, %xmm11921; X86-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [65535,0,65535,65535,65535,65535,65535,65535]1922; X86-SSE-NEXT:    psraw $2, %xmm01923; X86-SSE-NEXT:    pand %xmm2, %xmm01924; X86-SSE-NEXT:    pandn %xmm1, %xmm21925; X86-SSE-NEXT:    por %xmm2, %xmm01926; X86-SSE-NEXT:    retl1927  %shift = ashr <2 x i16> %a, <i16 2, i16 3>1928  ret <2 x i16> %shift1929}1930 1931define <8 x i8> @constant_shift_v8i8(<8 x i8> %a) nounwind {1932; SSE-LABEL: constant_shift_v8i8:1933; SSE:       # %bb.0:1934; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1935; SSE-NEXT:    psraw $8, %xmm01936; SSE-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [256,128,64,32,16,8,4,2]1937; SSE-NEXT:    psrlw $8, %xmm01938; SSE-NEXT:    pxor %xmm1, %xmm11939; SSE-NEXT:    packuswb %xmm1, %xmm01940; SSE-NEXT:    retq1941;1942; AVX1-LABEL: constant_shift_v8i8:1943; AVX1:       # %bb.0:1944; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1945; AVX1-NEXT:    vpsraw $8, %xmm0, %xmm01946; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [256,128,64,32,16,8,4,2]1947; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm01948; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm11949; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm01950; AVX1-NEXT:    retq1951;1952; AVX2-LABEL: constant_shift_v8i8:1953; AVX2:       # %bb.0:1954; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm01955; 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]1956; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm01957; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm11958; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm01959; AVX2-NEXT:    vzeroupper1960; AVX2-NEXT:    retq1961;1962; XOP-LABEL: constant_shift_v8i8:1963; XOP:       # %bb.0:1964; XOP-NEXT:    vpshab {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01965; XOP-NEXT:    retq1966;1967; AVX512DQ-LABEL: constant_shift_v8i8:1968; AVX512DQ:       # %bb.0:1969; AVX512DQ-NEXT:    vpmovsxbd %xmm0, %zmm01970; AVX512DQ-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm01971; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm01972; AVX512DQ-NEXT:    vzeroupper1973; AVX512DQ-NEXT:    retq1974;1975; AVX512BW-LABEL: constant_shift_v8i8:1976; AVX512BW:       # %bb.0:1977; AVX512BW-NEXT:    vbroadcasti128 {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7]1978; AVX512BW-NEXT:    # ymm1 = mem[0,1,0,1]1979; AVX512BW-NEXT:    vpmovsxbw %xmm0, %ymm01980; AVX512BW-NEXT:    vpsravw %zmm1, %zmm0, %zmm01981; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm01982; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm01983; AVX512BW-NEXT:    vzeroupper1984; AVX512BW-NEXT:    retq1985;1986; AVX512DQVL-LABEL: constant_shift_v8i8:1987; AVX512DQVL:       # %bb.0:1988; AVX512DQVL-NEXT:    vpmovsxbd %xmm0, %zmm01989; AVX512DQVL-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm01990; AVX512DQVL-NEXT:    vpmovdb %zmm0, %xmm01991; AVX512DQVL-NEXT:    vzeroupper1992; AVX512DQVL-NEXT:    retq1993;1994; AVX512BWVL-LABEL: constant_shift_v8i8:1995; AVX512BWVL:       # %bb.0:1996; AVX512BWVL-NEXT:    vpmovsxbw %xmm0, %ymm01997; AVX512BWVL-NEXT:    vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01998; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm01999; AVX512BWVL-NEXT:    vzeroupper2000; AVX512BWVL-NEXT:    retq2001;2002; X86-SSE-LABEL: constant_shift_v8i8:2003; X86-SSE:       # %bb.0:2004; X86-SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2005; X86-SSE-NEXT:    psraw $8, %xmm02006; X86-SSE-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [256,128,64,32,16,8,4,2]2007; X86-SSE-NEXT:    psrlw $8, %xmm02008; X86-SSE-NEXT:    pxor %xmm1, %xmm12009; X86-SSE-NEXT:    packuswb %xmm1, %xmm02010; X86-SSE-NEXT:    retl2011  %shift = ashr <8 x i8> %a, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7>2012  ret <8 x i8> %shift2013}2014 2015define <4 x i8> @constant_shift_v4i8(<4 x i8> %a) nounwind {2016; SSE-LABEL: constant_shift_v4i8:2017; SSE:       # %bb.0:2018; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2019; SSE-NEXT:    psraw $8, %xmm02020; SSE-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [256,128,64,32,u,u,u,u]2021; SSE-NEXT:    psrlw $8, %xmm02022; SSE-NEXT:    pxor %xmm1, %xmm12023; SSE-NEXT:    packuswb %xmm1, %xmm02024; SSE-NEXT:    retq2025;2026; AVX1-LABEL: constant_shift_v4i8:2027; AVX1:       # %bb.0:2028; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2029; AVX1-NEXT:    vpsraw $8, %xmm0, %xmm02030; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [256,128,64,32,u,u,u,u]2031; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm02032; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm12033; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm02034; AVX1-NEXT:    retq2035;2036; AVX2-LABEL: constant_shift_v4i8:2037; AVX2:       # %bb.0:2038; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm02039; 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]2040; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm02041; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm12042; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm02043; AVX2-NEXT:    vzeroupper2044; AVX2-NEXT:    retq2045;2046; XOP-LABEL: constant_shift_v4i8:2047; XOP:       # %bb.0:2048; XOP-NEXT:    vpshab {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02049; XOP-NEXT:    retq2050;2051; AVX512DQ-LABEL: constant_shift_v4i8:2052; AVX512DQ:       # %bb.0:2053; AVX512DQ-NEXT:    vpmovsxbd %xmm0, %zmm02054; AVX512DQ-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm02055; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm02056; AVX512DQ-NEXT:    vzeroupper2057; AVX512DQ-NEXT:    retq2058;2059; AVX512BW-LABEL: constant_shift_v4i8:2060; AVX512BW:       # %bb.0:2061; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]2062; AVX512BW-NEXT:    vpmovsxbw %xmm0, %ymm02063; AVX512BW-NEXT:    vpsravw %zmm1, %zmm0, %zmm02064; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm02065; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm02066; AVX512BW-NEXT:    vzeroupper2067; AVX512BW-NEXT:    retq2068;2069; AVX512DQVL-LABEL: constant_shift_v4i8:2070; AVX512DQVL:       # %bb.0:2071; AVX512DQVL-NEXT:    vpmovsxbd %xmm0, %zmm02072; AVX512DQVL-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm02073; AVX512DQVL-NEXT:    vpmovdb %zmm0, %xmm02074; AVX512DQVL-NEXT:    vzeroupper2075; AVX512DQVL-NEXT:    retq2076;2077; AVX512BWVL-LABEL: constant_shift_v4i8:2078; AVX512BWVL:       # %bb.0:2079; AVX512BWVL-NEXT:    vpmovsxbw %xmm0, %ymm02080; AVX512BWVL-NEXT:    vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02081; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm02082; AVX512BWVL-NEXT:    vzeroupper2083; AVX512BWVL-NEXT:    retq2084;2085; X86-SSE-LABEL: constant_shift_v4i8:2086; X86-SSE:       # %bb.0:2087; X86-SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2088; X86-SSE-NEXT:    psraw $8, %xmm02089; X86-SSE-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [256,128,64,32,u,u,u,u]2090; X86-SSE-NEXT:    psrlw $8, %xmm02091; X86-SSE-NEXT:    pxor %xmm1, %xmm12092; X86-SSE-NEXT:    packuswb %xmm1, %xmm02093; X86-SSE-NEXT:    retl2094  %shift = ashr <4 x i8> %a, <i8 0, i8 1, i8 2, i8 3>2095  ret <4 x i8> %shift2096}2097 2098define <2 x i8> @constant_shift_v2i8(<2 x i8> %a) nounwind {2099; SSE-LABEL: constant_shift_v2i8:2100; SSE:       # %bb.0:2101; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2102; SSE-NEXT:    psraw $8, %xmm02103; SSE-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [64,32,u,u,u,u,u,u]2104; SSE-NEXT:    psrlw $8, %xmm02105; SSE-NEXT:    pxor %xmm1, %xmm12106; SSE-NEXT:    packuswb %xmm1, %xmm02107; SSE-NEXT:    retq2108;2109; AVX1-LABEL: constant_shift_v2i8:2110; AVX1:       # %bb.0:2111; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2112; AVX1-NEXT:    vpsraw $8, %xmm0, %xmm02113; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [64,32,u,u,u,u,u,u]2114; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm02115; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm12116; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm02117; AVX1-NEXT:    retq2118;2119; AVX2-LABEL: constant_shift_v2i8:2120; AVX2:       # %bb.0:2121; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm02122; 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]2123; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm02124; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm12125; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm02126; AVX2-NEXT:    vzeroupper2127; AVX2-NEXT:    retq2128;2129; XOP-LABEL: constant_shift_v2i8:2130; XOP:       # %bb.0:2131; XOP-NEXT:    vpshab {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02132; XOP-NEXT:    retq2133;2134; AVX512DQ-LABEL: constant_shift_v2i8:2135; AVX512DQ:       # %bb.0:2136; AVX512DQ-NEXT:    vpmovsxbd %xmm0, %zmm02137; AVX512DQ-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm02138; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm02139; AVX512DQ-NEXT:    vzeroupper2140; AVX512DQ-NEXT:    retq2141;2142; AVX512BW-LABEL: constant_shift_v2i8:2143; AVX512BW:       # %bb.0:2144; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3]2145; AVX512BW-NEXT:    vpmovsxbw %xmm0, %ymm02146; AVX512BW-NEXT:    vpsravw %zmm1, %zmm0, %zmm02147; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm02148; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm02149; AVX512BW-NEXT:    vzeroupper2150; AVX512BW-NEXT:    retq2151;2152; AVX512DQVL-LABEL: constant_shift_v2i8:2153; AVX512DQVL:       # %bb.0:2154; AVX512DQVL-NEXT:    vpmovsxbd %xmm0, %zmm02155; AVX512DQVL-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm02156; AVX512DQVL-NEXT:    vpmovdb %zmm0, %xmm02157; AVX512DQVL-NEXT:    vzeroupper2158; AVX512DQVL-NEXT:    retq2159;2160; AVX512BWVL-LABEL: constant_shift_v2i8:2161; AVX512BWVL:       # %bb.0:2162; AVX512BWVL-NEXT:    vpmovsxbw %xmm0, %ymm02163; AVX512BWVL-NEXT:    vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02164; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm02165; AVX512BWVL-NEXT:    vzeroupper2166; AVX512BWVL-NEXT:    retq2167;2168; X86-SSE-LABEL: constant_shift_v2i8:2169; X86-SSE:       # %bb.0:2170; X86-SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]2171; X86-SSE-NEXT:    psraw $8, %xmm02172; X86-SSE-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [64,32,u,u,u,u,u,u]2173; X86-SSE-NEXT:    psrlw $8, %xmm02174; X86-SSE-NEXT:    pxor %xmm1, %xmm12175; X86-SSE-NEXT:    packuswb %xmm1, %xmm02176; X86-SSE-NEXT:    retl2177  %shift = ashr <2 x i8> %a, <i8 2, i8 3>2178  ret <2 x i8> %shift2179}2180 2181;2182; Uniform Constant Shifts2183;2184 2185define <2 x i32> @splatconstant_shift_v2i32(<2 x i32> %a) nounwind {2186; SSE-LABEL: splatconstant_shift_v2i32:2187; SSE:       # %bb.0:2188; SSE-NEXT:    psrad $5, %xmm02189; SSE-NEXT:    retq2190;2191; AVX-LABEL: splatconstant_shift_v2i32:2192; AVX:       # %bb.0:2193; AVX-NEXT:    vpsrad $5, %xmm0, %xmm02194; AVX-NEXT:    retq2195;2196; XOP-LABEL: splatconstant_shift_v2i32:2197; XOP:       # %bb.0:2198; XOP-NEXT:    vpsrad $5, %xmm0, %xmm02199; XOP-NEXT:    retq2200;2201; AVX512-LABEL: splatconstant_shift_v2i32:2202; AVX512:       # %bb.0:2203; AVX512-NEXT:    vpsrad $5, %xmm0, %xmm02204; AVX512-NEXT:    retq2205;2206; AVX512VL-LABEL: splatconstant_shift_v2i32:2207; AVX512VL:       # %bb.0:2208; AVX512VL-NEXT:    vpsrad $5, %xmm0, %xmm02209; AVX512VL-NEXT:    retq2210;2211; X86-SSE-LABEL: splatconstant_shift_v2i32:2212; X86-SSE:       # %bb.0:2213; X86-SSE-NEXT:    psrad $5, %xmm02214; X86-SSE-NEXT:    retl2215  %shift = ashr <2 x i32> %a, <i32 5, i32 5>2216  ret <2 x i32> %shift2217}2218 2219define <4 x i16> @splatconstant_shift_v4i16(<4 x i16> %a) nounwind {2220; SSE-LABEL: splatconstant_shift_v4i16:2221; SSE:       # %bb.0:2222; SSE-NEXT:    psraw $3, %xmm02223; SSE-NEXT:    retq2224;2225; AVX-LABEL: splatconstant_shift_v4i16:2226; AVX:       # %bb.0:2227; AVX-NEXT:    vpsraw $3, %xmm0, %xmm02228; AVX-NEXT:    retq2229;2230; XOP-LABEL: splatconstant_shift_v4i16:2231; XOP:       # %bb.0:2232; XOP-NEXT:    vpsraw $3, %xmm0, %xmm02233; XOP-NEXT:    retq2234;2235; AVX512-LABEL: splatconstant_shift_v4i16:2236; AVX512:       # %bb.0:2237; AVX512-NEXT:    vpsraw $3, %xmm0, %xmm02238; AVX512-NEXT:    retq2239;2240; AVX512VL-LABEL: splatconstant_shift_v4i16:2241; AVX512VL:       # %bb.0:2242; AVX512VL-NEXT:    vpsraw $3, %xmm0, %xmm02243; AVX512VL-NEXT:    retq2244;2245; X86-SSE-LABEL: splatconstant_shift_v4i16:2246; X86-SSE:       # %bb.0:2247; X86-SSE-NEXT:    psraw $3, %xmm02248; X86-SSE-NEXT:    retl2249  %shift = ashr <4 x i16> %a, <i16 3, i16 3, i16 3, i16 3>2250  ret <4 x i16> %shift2251}2252 2253define <2 x i16> @splatconstant_shift_v2i16(<2 x i16> %a) nounwind {2254; SSE-LABEL: splatconstant_shift_v2i16:2255; SSE:       # %bb.0:2256; SSE-NEXT:    psraw $3, %xmm02257; SSE-NEXT:    retq2258;2259; AVX-LABEL: splatconstant_shift_v2i16:2260; AVX:       # %bb.0:2261; AVX-NEXT:    vpsraw $3, %xmm0, %xmm02262; AVX-NEXT:    retq2263;2264; XOP-LABEL: splatconstant_shift_v2i16:2265; XOP:       # %bb.0:2266; XOP-NEXT:    vpsraw $3, %xmm0, %xmm02267; XOP-NEXT:    retq2268;2269; AVX512-LABEL: splatconstant_shift_v2i16:2270; AVX512:       # %bb.0:2271; AVX512-NEXT:    vpsraw $3, %xmm0, %xmm02272; AVX512-NEXT:    retq2273;2274; AVX512VL-LABEL: splatconstant_shift_v2i16:2275; AVX512VL:       # %bb.0:2276; AVX512VL-NEXT:    vpsraw $3, %xmm0, %xmm02277; AVX512VL-NEXT:    retq2278;2279; X86-SSE-LABEL: splatconstant_shift_v2i16:2280; X86-SSE:       # %bb.0:2281; X86-SSE-NEXT:    psraw $3, %xmm02282; X86-SSE-NEXT:    retl2283  %shift = ashr <2 x i16> %a, <i16 3, i16 3>2284  ret <2 x i16> %shift2285}2286 2287define <8 x i8> @splatconstant_shift_v8i8(<8 x i8> %a) nounwind {2288; SSE-LABEL: splatconstant_shift_v8i8:2289; SSE:       # %bb.0:2290; SSE-NEXT:    psrlw $3, %xmm02291; SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02292; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2293; SSE-NEXT:    pxor %xmm1, %xmm02294; SSE-NEXT:    psubb %xmm1, %xmm02295; SSE-NEXT:    retq2296;2297; AVX1-LABEL: splatconstant_shift_v8i8:2298; AVX1:       # %bb.0:2299; AVX1-NEXT:    vpsrlw $3, %xmm0, %xmm02300; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02301; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2302; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm02303; AVX1-NEXT:    vpsubb %xmm1, %xmm0, %xmm02304; AVX1-NEXT:    retq2305;2306; AVX2-LABEL: splatconstant_shift_v8i8:2307; AVX2:       # %bb.0:2308; AVX2-NEXT:    vpsrlw $3, %xmm0, %xmm02309; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02310; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2311; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm02312; AVX2-NEXT:    vpsubb %xmm1, %xmm0, %xmm02313; AVX2-NEXT:    retq2314;2315; XOP-LABEL: splatconstant_shift_v8i8:2316; XOP:       # %bb.0:2317; XOP-NEXT:    vpshab {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02318; XOP-NEXT:    retq2319;2320; AVX512-LABEL: splatconstant_shift_v8i8:2321; AVX512:       # %bb.0:2322; AVX512-NEXT:    vpsrlw $3, %xmm0, %xmm02323; AVX512-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02324; AVX512-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2325; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm02326; AVX512-NEXT:    vpsubb %xmm1, %xmm0, %xmm02327; AVX512-NEXT:    retq2328;2329; AVX512DQVL-LABEL: splatconstant_shift_v8i8:2330; AVX512DQVL:       # %bb.0:2331; AVX512DQVL-NEXT:    vpsrlw $3, %xmm0, %xmm02332; AVX512DQVL-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2333; AVX512DQVL-NEXT:    vpternlogd {{.*#+}} xmm0 = xmm1 ^ (xmm0 & m32bcst)2334; AVX512DQVL-NEXT:    vpsubb %xmm1, %xmm0, %xmm02335; AVX512DQVL-NEXT:    retq2336;2337; AVX512BWVL-LABEL: splatconstant_shift_v8i8:2338; AVX512BWVL:       # %bb.0:2339; AVX512BWVL-NEXT:    vpsrlw $3, %xmm0, %xmm02340; AVX512BWVL-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2341; AVX512BWVL-NEXT:    vpternlogd {{.*#+}} xmm0 = xmm1 ^ (xmm0 & m32bcst)2342; AVX512BWVL-NEXT:    vpsubb %xmm1, %xmm0, %xmm02343; AVX512BWVL-NEXT:    retq2344;2345; X86-SSE-LABEL: splatconstant_shift_v8i8:2346; X86-SSE:       # %bb.0:2347; X86-SSE-NEXT:    psrlw $3, %xmm02348; X86-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm02349; X86-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2350; X86-SSE-NEXT:    pxor %xmm1, %xmm02351; X86-SSE-NEXT:    psubb %xmm1, %xmm02352; X86-SSE-NEXT:    retl2353  %shift = ashr <8 x i8> %a, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>2354  ret <8 x i8> %shift2355}2356 2357define <4 x i8> @splatconstant_shift_v4i8(<4 x i8> %a) nounwind {2358; SSE-LABEL: splatconstant_shift_v4i8:2359; SSE:       # %bb.0:2360; SSE-NEXT:    psrlw $3, %xmm02361; SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02362; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2363; SSE-NEXT:    pxor %xmm1, %xmm02364; SSE-NEXT:    psubb %xmm1, %xmm02365; SSE-NEXT:    retq2366;2367; AVX1-LABEL: splatconstant_shift_v4i8:2368; AVX1:       # %bb.0:2369; AVX1-NEXT:    vpsrlw $3, %xmm0, %xmm02370; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02371; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2372; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm02373; AVX1-NEXT:    vpsubb %xmm1, %xmm0, %xmm02374; AVX1-NEXT:    retq2375;2376; AVX2-LABEL: splatconstant_shift_v4i8:2377; AVX2:       # %bb.0:2378; AVX2-NEXT:    vpsrlw $3, %xmm0, %xmm02379; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02380; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2381; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm02382; AVX2-NEXT:    vpsubb %xmm1, %xmm0, %xmm02383; AVX2-NEXT:    retq2384;2385; XOP-LABEL: splatconstant_shift_v4i8:2386; XOP:       # %bb.0:2387; XOP-NEXT:    vpshab {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02388; XOP-NEXT:    retq2389;2390; AVX512-LABEL: splatconstant_shift_v4i8:2391; AVX512:       # %bb.0:2392; AVX512-NEXT:    vpsrlw $3, %xmm0, %xmm02393; AVX512-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02394; AVX512-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2395; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm02396; AVX512-NEXT:    vpsubb %xmm1, %xmm0, %xmm02397; AVX512-NEXT:    retq2398;2399; AVX512DQVL-LABEL: splatconstant_shift_v4i8:2400; AVX512DQVL:       # %bb.0:2401; AVX512DQVL-NEXT:    vpsrlw $3, %xmm0, %xmm02402; AVX512DQVL-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2403; AVX512DQVL-NEXT:    vpternlogd {{.*#+}} xmm0 = xmm1 ^ (xmm0 & m32bcst)2404; AVX512DQVL-NEXT:    vpsubb %xmm1, %xmm0, %xmm02405; AVX512DQVL-NEXT:    retq2406;2407; AVX512BWVL-LABEL: splatconstant_shift_v4i8:2408; AVX512BWVL:       # %bb.0:2409; AVX512BWVL-NEXT:    vpsrlw $3, %xmm0, %xmm02410; AVX512BWVL-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2411; AVX512BWVL-NEXT:    vpternlogd {{.*#+}} xmm0 = xmm1 ^ (xmm0 & m32bcst)2412; AVX512BWVL-NEXT:    vpsubb %xmm1, %xmm0, %xmm02413; AVX512BWVL-NEXT:    retq2414;2415; X86-SSE-LABEL: splatconstant_shift_v4i8:2416; X86-SSE:       # %bb.0:2417; X86-SSE-NEXT:    psrlw $3, %xmm02418; X86-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm02419; X86-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2420; X86-SSE-NEXT:    pxor %xmm1, %xmm02421; X86-SSE-NEXT:    psubb %xmm1, %xmm02422; X86-SSE-NEXT:    retl2423  %shift = ashr <4 x i8> %a, <i8 3, i8 3, i8 3, i8 3>2424  ret <4 x i8> %shift2425}2426 2427define <2 x i8> @splatconstant_shift_v2i8(<2 x i8> %a) nounwind {2428; SSE-LABEL: splatconstant_shift_v2i8:2429; SSE:       # %bb.0:2430; SSE-NEXT:    psrlw $3, %xmm02431; SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02432; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2433; SSE-NEXT:    pxor %xmm1, %xmm02434; SSE-NEXT:    psubb %xmm1, %xmm02435; SSE-NEXT:    retq2436;2437; AVX1-LABEL: splatconstant_shift_v2i8:2438; AVX1:       # %bb.0:2439; AVX1-NEXT:    vpsrlw $3, %xmm0, %xmm02440; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02441; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2442; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm02443; AVX1-NEXT:    vpsubb %xmm1, %xmm0, %xmm02444; AVX1-NEXT:    retq2445;2446; AVX2-LABEL: splatconstant_shift_v2i8:2447; AVX2:       # %bb.0:2448; AVX2-NEXT:    vpsrlw $3, %xmm0, %xmm02449; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02450; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2451; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm02452; AVX2-NEXT:    vpsubb %xmm1, %xmm0, %xmm02453; AVX2-NEXT:    retq2454;2455; XOP-LABEL: splatconstant_shift_v2i8:2456; XOP:       # %bb.0:2457; XOP-NEXT:    vpshab {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02458; XOP-NEXT:    retq2459;2460; AVX512-LABEL: splatconstant_shift_v2i8:2461; AVX512:       # %bb.0:2462; AVX512-NEXT:    vpsrlw $3, %xmm0, %xmm02463; AVX512-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02464; AVX512-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2465; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm02466; AVX512-NEXT:    vpsubb %xmm1, %xmm0, %xmm02467; AVX512-NEXT:    retq2468;2469; AVX512DQVL-LABEL: splatconstant_shift_v2i8:2470; AVX512DQVL:       # %bb.0:2471; AVX512DQVL-NEXT:    vpsrlw $3, %xmm0, %xmm02472; AVX512DQVL-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2473; AVX512DQVL-NEXT:    vpternlogd {{.*#+}} xmm0 = xmm1 ^ (xmm0 & m32bcst)2474; AVX512DQVL-NEXT:    vpsubb %xmm1, %xmm0, %xmm02475; AVX512DQVL-NEXT:    retq2476;2477; AVX512BWVL-LABEL: splatconstant_shift_v2i8:2478; AVX512BWVL:       # %bb.0:2479; AVX512BWVL-NEXT:    vpsrlw $3, %xmm0, %xmm02480; AVX512BWVL-NEXT:    vpbroadcastb {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2481; AVX512BWVL-NEXT:    vpternlogd {{.*#+}} xmm0 = xmm1 ^ (xmm0 & m32bcst)2482; AVX512BWVL-NEXT:    vpsubb %xmm1, %xmm0, %xmm02483; AVX512BWVL-NEXT:    retq2484;2485; X86-SSE-LABEL: splatconstant_shift_v2i8:2486; X86-SSE:       # %bb.0:2487; X86-SSE-NEXT:    psrlw $3, %xmm02488; X86-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm02489; X86-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2490; X86-SSE-NEXT:    pxor %xmm1, %xmm02491; X86-SSE-NEXT:    psubb %xmm1, %xmm02492; X86-SSE-NEXT:    retl2493  %shift = ashr <2 x i8> %a, <i8 3, i8 3>2494  ret <2 x i8> %shift2495}2496