brintos

brintos / llvm-project-archived public Read only

0
0
Text · 72.4 KiB · a847da6 Raw
1769 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 i64> @var_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {21; SSE2-LABEL: var_shift_v2i64:22; SSE2:       # %bb.0:23; SSE2-NEXT:    movdqa %xmm0, %xmm224; SSE2-NEXT:    psrlq %xmm1, %xmm225; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]26; SSE2-NEXT:    psrlq %xmm1, %xmm027; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]28; SSE2-NEXT:    retq29;30; SSE41-LABEL: var_shift_v2i64:31; SSE41:       # %bb.0:32; SSE41-NEXT:    movdqa %xmm0, %xmm233; SSE41-NEXT:    psrlq %xmm1, %xmm234; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]35; SSE41-NEXT:    psrlq %xmm1, %xmm036; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5,6,7]37; SSE41-NEXT:    retq38;39; AVX1-LABEL: var_shift_v2i64:40; AVX1:       # %bb.0:41; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm242; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]43; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm044; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5,6,7]45; AVX1-NEXT:    retq46;47; AVX2-LABEL: var_shift_v2i64:48; AVX2:       # %bb.0:49; AVX2-NEXT:    vpsrlvq %xmm1, %xmm0, %xmm050; AVX2-NEXT:    retq51;52; XOPAVX1-LABEL: var_shift_v2i64:53; XOPAVX1:       # %bb.0:54; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm255; XOPAVX1-NEXT:    vpsubq %xmm1, %xmm2, %xmm156; XOPAVX1-NEXT:    vpshlq %xmm1, %xmm0, %xmm057; XOPAVX1-NEXT:    retq58;59; XOPAVX2-LABEL: var_shift_v2i64:60; XOPAVX2:       # %bb.0:61; XOPAVX2-NEXT:    vpsrlvq %xmm1, %xmm0, %xmm062; XOPAVX2-NEXT:    retq63;64; AVX512-LABEL: var_shift_v2i64:65; AVX512:       # %bb.0:66; AVX512-NEXT:    vpsrlvq %xmm1, %xmm0, %xmm067; AVX512-NEXT:    retq68;69; AVX512VL-LABEL: var_shift_v2i64:70; AVX512VL:       # %bb.0:71; AVX512VL-NEXT:    vpsrlvq %xmm1, %xmm0, %xmm072; AVX512VL-NEXT:    retq73;74; X86-SSE-LABEL: var_shift_v2i64:75; X86-SSE:       # %bb.0:76; X86-SSE-NEXT:    movdqa %xmm0, %xmm277; X86-SSE-NEXT:    psrlq %xmm1, %xmm278; X86-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]79; X86-SSE-NEXT:    psrlq %xmm1, %xmm080; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]81; X86-SSE-NEXT:    retl82  %shift = lshr <2 x i64> %a, %b83  ret <2 x i64> %shift84}85 86define <4 x i32> @var_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {87; SSE2-LABEL: var_shift_v4i32:88; SSE2:       # %bb.0:89; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm1[2,3,3,3,4,5,6,7]90; SSE2-NEXT:    movdqa %xmm0, %xmm391; SSE2-NEXT:    psrld %xmm2, %xmm392; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm1[0,1,1,1,4,5,6,7]93; SSE2-NEXT:    movdqa %xmm0, %xmm294; SSE2-NEXT:    psrld %xmm4, %xmm295; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]96; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]97; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm1[2,3,3,3,4,5,6,7]98; SSE2-NEXT:    movdqa %xmm0, %xmm499; SSE2-NEXT:    psrld %xmm3, %xmm4100; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,1,4,5,6,7]101; SSE2-NEXT:    psrld %xmm1, %xmm0102; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm4[1]103; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,3],xmm0[0,3]104; SSE2-NEXT:    movaps %xmm2, %xmm0105; SSE2-NEXT:    retq106;107; SSE41-LABEL: var_shift_v4i32:108; SSE41:       # %bb.0:109; SSE41-NEXT:    pshuflw {{.*#+}} xmm2 = xmm1[2,3,3,3,4,5,6,7]110; SSE41-NEXT:    movdqa %xmm0, %xmm3111; SSE41-NEXT:    psrld %xmm2, %xmm3112; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]113; SSE41-NEXT:    pshuflw {{.*#+}} xmm4 = xmm2[2,3,3,3,4,5,6,7]114; SSE41-NEXT:    movdqa %xmm0, %xmm5115; SSE41-NEXT:    psrld %xmm4, %xmm5116; SSE41-NEXT:    pblendw {{.*#+}} xmm5 = xmm3[0,1,2,3],xmm5[4,5,6,7]117; SSE41-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,1,4,5,6,7]118; SSE41-NEXT:    movdqa %xmm0, %xmm3119; SSE41-NEXT:    psrld %xmm1, %xmm3120; SSE41-NEXT:    pshuflw {{.*#+}} xmm1 = xmm2[0,1,1,1,4,5,6,7]121; SSE41-NEXT:    psrld %xmm1, %xmm0122; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]123; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm5[2,3],xmm0[4,5],xmm5[6,7]124; SSE41-NEXT:    retq125;126; AVX1-LABEL: var_shift_v4i32:127; AVX1:       # %bb.0:128; AVX1-NEXT:    vpsrldq {{.*#+}} xmm2 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero129; AVX1-NEXT:    vpsrld %xmm2, %xmm0, %xmm2130; AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm3131; AVX1-NEXT:    vpsrld %xmm3, %xmm0, %xmm3132; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]133; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3134; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm3 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]135; AVX1-NEXT:    vpsrld %xmm3, %xmm0, %xmm3136; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero137; AVX1-NEXT:    vpsrld %xmm1, %xmm0, %xmm0138; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]139; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]140; AVX1-NEXT:    retq141;142; AVX2-LABEL: var_shift_v4i32:143; AVX2:       # %bb.0:144; AVX2-NEXT:    vpsrlvd %xmm1, %xmm0, %xmm0145; AVX2-NEXT:    retq146;147; XOPAVX1-LABEL: var_shift_v4i32:148; XOPAVX1:       # %bb.0:149; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2150; XOPAVX1-NEXT:    vpsubd %xmm1, %xmm2, %xmm1151; XOPAVX1-NEXT:    vpshld %xmm1, %xmm0, %xmm0152; XOPAVX1-NEXT:    retq153;154; XOPAVX2-LABEL: var_shift_v4i32:155; XOPAVX2:       # %bb.0:156; XOPAVX2-NEXT:    vpsrlvd %xmm1, %xmm0, %xmm0157; XOPAVX2-NEXT:    retq158;159; AVX512-LABEL: var_shift_v4i32:160; AVX512:       # %bb.0:161; AVX512-NEXT:    vpsrlvd %xmm1, %xmm0, %xmm0162; AVX512-NEXT:    retq163;164; AVX512VL-LABEL: var_shift_v4i32:165; AVX512VL:       # %bb.0:166; AVX512VL-NEXT:    vpsrlvd %xmm1, %xmm0, %xmm0167; AVX512VL-NEXT:    retq168;169; X86-SSE-LABEL: var_shift_v4i32:170; X86-SSE:       # %bb.0:171; X86-SSE-NEXT:    pshuflw {{.*#+}} xmm2 = xmm1[2,3,3,3,4,5,6,7]172; X86-SSE-NEXT:    movdqa %xmm0, %xmm3173; X86-SSE-NEXT:    psrld %xmm2, %xmm3174; X86-SSE-NEXT:    pshuflw {{.*#+}} xmm4 = xmm1[0,1,1,1,4,5,6,7]175; X86-SSE-NEXT:    movdqa %xmm0, %xmm2176; X86-SSE-NEXT:    psrld %xmm4, %xmm2177; X86-SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]178; X86-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]179; X86-SSE-NEXT:    pshuflw {{.*#+}} xmm3 = xmm1[2,3,3,3,4,5,6,7]180; X86-SSE-NEXT:    movdqa %xmm0, %xmm4181; X86-SSE-NEXT:    psrld %xmm3, %xmm4182; X86-SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,1,4,5,6,7]183; X86-SSE-NEXT:    psrld %xmm1, %xmm0184; X86-SSE-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm4[1]185; X86-SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,3],xmm0[0,3]186; X86-SSE-NEXT:    movaps %xmm2, %xmm0187; X86-SSE-NEXT:    retl188  %shift = lshr <4 x i32> %a, %b189  ret <4 x i32> %shift190}191 192define <8 x i16> @var_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {193; SSE2-LABEL: var_shift_v8i16:194; SSE2:       # %bb.0:195; SSE2-NEXT:    psllw $12, %xmm1196; SSE2-NEXT:    movdqa %xmm1, %xmm2197; SSE2-NEXT:    psraw $15, %xmm2198; SSE2-NEXT:    movdqa %xmm2, %xmm3199; SSE2-NEXT:    pandn %xmm0, %xmm3200; SSE2-NEXT:    psrlw $8, %xmm0201; SSE2-NEXT:    pand %xmm2, %xmm0202; SSE2-NEXT:    por %xmm3, %xmm0203; SSE2-NEXT:    paddw %xmm1, %xmm1204; SSE2-NEXT:    movdqa %xmm1, %xmm2205; SSE2-NEXT:    psraw $15, %xmm2206; SSE2-NEXT:    movdqa %xmm2, %xmm3207; SSE2-NEXT:    pandn %xmm0, %xmm3208; SSE2-NEXT:    psrlw $4, %xmm0209; SSE2-NEXT:    pand %xmm2, %xmm0210; SSE2-NEXT:    por %xmm3, %xmm0211; SSE2-NEXT:    paddw %xmm1, %xmm1212; SSE2-NEXT:    movdqa %xmm1, %xmm2213; SSE2-NEXT:    psraw $15, %xmm2214; SSE2-NEXT:    movdqa %xmm2, %xmm3215; SSE2-NEXT:    pandn %xmm0, %xmm3216; SSE2-NEXT:    psrlw $2, %xmm0217; SSE2-NEXT:    pand %xmm2, %xmm0218; SSE2-NEXT:    por %xmm3, %xmm0219; SSE2-NEXT:    paddw %xmm1, %xmm1220; SSE2-NEXT:    psraw $15, %xmm1221; SSE2-NEXT:    movdqa %xmm1, %xmm2222; SSE2-NEXT:    pandn %xmm0, %xmm2223; SSE2-NEXT:    psrlw $1, %xmm0224; SSE2-NEXT:    pand %xmm1, %xmm0225; SSE2-NEXT:    por %xmm2, %xmm0226; SSE2-NEXT:    retq227;228; SSE41-LABEL: var_shift_v8i16:229; SSE41:       # %bb.0:230; SSE41-NEXT:    movdqa %xmm0, %xmm2231; SSE41-NEXT:    movdqa %xmm1, %xmm0232; SSE41-NEXT:    psllw $12, %xmm0233; SSE41-NEXT:    psllw $4, %xmm1234; SSE41-NEXT:    por %xmm1, %xmm0235; SSE41-NEXT:    movdqa %xmm0, %xmm1236; SSE41-NEXT:    paddw %xmm0, %xmm1237; SSE41-NEXT:    movdqa %xmm2, %xmm3238; SSE41-NEXT:    psrlw $8, %xmm3239; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm2240; SSE41-NEXT:    movdqa %xmm2, %xmm3241; SSE41-NEXT:    psrlw $4, %xmm3242; SSE41-NEXT:    movdqa %xmm1, %xmm0243; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm2244; SSE41-NEXT:    movdqa %xmm2, %xmm3245; SSE41-NEXT:    psrlw $2, %xmm3246; SSE41-NEXT:    paddw %xmm1, %xmm1247; SSE41-NEXT:    movdqa %xmm1, %xmm0248; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm2249; SSE41-NEXT:    movdqa %xmm2, %xmm3250; SSE41-NEXT:    psrlw $1, %xmm3251; SSE41-NEXT:    paddw %xmm1, %xmm1252; SSE41-NEXT:    movdqa %xmm1, %xmm0253; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm2254; SSE41-NEXT:    movdqa %xmm2, %xmm0255; SSE41-NEXT:    retq256;257; AVX1-LABEL: var_shift_v8i16:258; AVX1:       # %bb.0:259; AVX1-NEXT:    vpsllw $12, %xmm1, %xmm2260; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1261; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm1262; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm2263; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm3264; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0265; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm3266; AVX1-NEXT:    vpblendvb %xmm2, %xmm3, %xmm0, %xmm0267; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm2268; AVX1-NEXT:    vpsllw $2, %xmm1, %xmm3269; AVX1-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0270; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm2271; AVX1-NEXT:    vpsllw $3, %xmm1, %xmm1272; AVX1-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0273; AVX1-NEXT:    retq274;275; AVX2-LABEL: var_shift_v8i16:276; AVX2:       # %bb.0:277; 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],zero278; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero279; AVX2-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0280; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1281; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0282; AVX2-NEXT:    vzeroupper283; AVX2-NEXT:    retq284;285; XOP-LABEL: var_shift_v8i16:286; XOP:       # %bb.0:287; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2288; XOP-NEXT:    vpsubw %xmm1, %xmm2, %xmm1289; XOP-NEXT:    vpshlw %xmm1, %xmm0, %xmm0290; XOP-NEXT:    retq291;292; AVX512DQ-LABEL: var_shift_v8i16:293; AVX512DQ:       # %bb.0:294; 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],zero295; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero296; AVX512DQ-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0297; AVX512DQ-NEXT:    vpmovdw %zmm0, %ymm0298; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0299; AVX512DQ-NEXT:    vzeroupper300; AVX512DQ-NEXT:    retq301;302; AVX512BW-LABEL: var_shift_v8i16:303; AVX512BW:       # %bb.0:304; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1305; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0306; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0307; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0308; AVX512BW-NEXT:    vzeroupper309; AVX512BW-NEXT:    retq310;311; AVX512DQVL-LABEL: var_shift_v8i16:312; AVX512DQVL:       # %bb.0:313; 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],zero314; AVX512DQVL-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero315; AVX512DQVL-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0316; AVX512DQVL-NEXT:    vpmovdw %ymm0, %xmm0317; AVX512DQVL-NEXT:    vzeroupper318; AVX512DQVL-NEXT:    retq319;320; AVX512BWVL-LABEL: var_shift_v8i16:321; AVX512BWVL:       # %bb.0:322; AVX512BWVL-NEXT:    vpsrlvw %xmm1, %xmm0, %xmm0323; AVX512BWVL-NEXT:    retq324;325; X86-SSE-LABEL: var_shift_v8i16:326; X86-SSE:       # %bb.0:327; X86-SSE-NEXT:    psllw $12, %xmm1328; X86-SSE-NEXT:    movdqa %xmm1, %xmm2329; X86-SSE-NEXT:    psraw $15, %xmm2330; X86-SSE-NEXT:    movdqa %xmm2, %xmm3331; X86-SSE-NEXT:    pandn %xmm0, %xmm3332; X86-SSE-NEXT:    psrlw $8, %xmm0333; X86-SSE-NEXT:    pand %xmm2, %xmm0334; X86-SSE-NEXT:    por %xmm3, %xmm0335; X86-SSE-NEXT:    paddw %xmm1, %xmm1336; X86-SSE-NEXT:    movdqa %xmm1, %xmm2337; X86-SSE-NEXT:    psraw $15, %xmm2338; X86-SSE-NEXT:    movdqa %xmm2, %xmm3339; X86-SSE-NEXT:    pandn %xmm0, %xmm3340; X86-SSE-NEXT:    psrlw $4, %xmm0341; X86-SSE-NEXT:    pand %xmm2, %xmm0342; X86-SSE-NEXT:    por %xmm3, %xmm0343; X86-SSE-NEXT:    paddw %xmm1, %xmm1344; X86-SSE-NEXT:    movdqa %xmm1, %xmm2345; X86-SSE-NEXT:    psraw $15, %xmm2346; X86-SSE-NEXT:    movdqa %xmm2, %xmm3347; X86-SSE-NEXT:    pandn %xmm0, %xmm3348; X86-SSE-NEXT:    psrlw $2, %xmm0349; X86-SSE-NEXT:    pand %xmm2, %xmm0350; X86-SSE-NEXT:    por %xmm3, %xmm0351; X86-SSE-NEXT:    paddw %xmm1, %xmm1352; X86-SSE-NEXT:    psraw $15, %xmm1353; X86-SSE-NEXT:    movdqa %xmm1, %xmm2354; X86-SSE-NEXT:    pandn %xmm0, %xmm2355; X86-SSE-NEXT:    psrlw $1, %xmm0356; X86-SSE-NEXT:    pand %xmm1, %xmm0357; X86-SSE-NEXT:    por %xmm2, %xmm0358; X86-SSE-NEXT:    retl359  %shift = lshr <8 x i16> %a, %b360  ret <8 x i16> %shift361}362 363define <16 x i8> @var_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {364; SSE2-LABEL: var_shift_v16i8:365; SSE2:       # %bb.0:366; SSE2-NEXT:    psllw $5, %xmm1367; SSE2-NEXT:    pxor %xmm2, %xmm2368; SSE2-NEXT:    pxor %xmm3, %xmm3369; SSE2-NEXT:    pcmpgtb %xmm1, %xmm3370; SSE2-NEXT:    movdqa %xmm3, %xmm4371; SSE2-NEXT:    pandn %xmm0, %xmm4372; SSE2-NEXT:    psrlw $4, %xmm0373; SSE2-NEXT:    pand %xmm3, %xmm0374; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0375; SSE2-NEXT:    por %xmm4, %xmm0376; SSE2-NEXT:    paddb %xmm1, %xmm1377; SSE2-NEXT:    pxor %xmm3, %xmm3378; SSE2-NEXT:    pcmpgtb %xmm1, %xmm3379; SSE2-NEXT:    movdqa %xmm3, %xmm4380; SSE2-NEXT:    pandn %xmm0, %xmm4381; SSE2-NEXT:    psrlw $2, %xmm0382; SSE2-NEXT:    pand %xmm3, %xmm0383; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0384; SSE2-NEXT:    por %xmm4, %xmm0385; SSE2-NEXT:    paddb %xmm1, %xmm1386; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2387; SSE2-NEXT:    movdqa %xmm2, %xmm1388; SSE2-NEXT:    pandn %xmm0, %xmm1389; SSE2-NEXT:    psrlw $1, %xmm0390; SSE2-NEXT:    pand %xmm2, %xmm0391; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0392; SSE2-NEXT:    por %xmm1, %xmm0393; SSE2-NEXT:    retq394;395; SSE41-LABEL: var_shift_v16i8:396; SSE41:       # %bb.0:397; SSE41-NEXT:    movdqa %xmm0, %xmm2398; SSE41-NEXT:    psllw $5, %xmm1399; SSE41-NEXT:    movdqa %xmm0, %xmm3400; SSE41-NEXT:    psrlw $4, %xmm3401; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3402; SSE41-NEXT:    movdqa %xmm1, %xmm0403; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm2404; SSE41-NEXT:    movdqa %xmm2, %xmm3405; SSE41-NEXT:    psrlw $2, %xmm3406; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3407; SSE41-NEXT:    paddb %xmm1, %xmm1408; SSE41-NEXT:    movdqa %xmm1, %xmm0409; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm2410; SSE41-NEXT:    movdqa %xmm2, %xmm3411; SSE41-NEXT:    psrlw $1, %xmm3412; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3413; SSE41-NEXT:    paddb %xmm1, %xmm1414; SSE41-NEXT:    movdqa %xmm1, %xmm0415; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm2416; SSE41-NEXT:    movdqa %xmm2, %xmm0417; SSE41-NEXT:    retq418;419; AVX-LABEL: var_shift_v16i8:420; AVX:       # %bb.0:421; AVX-NEXT:    vpsllw $5, %xmm1, %xmm1422; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm2423; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2424; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0425; AVX-NEXT:    vpsrlw $2, %xmm0, %xmm2426; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2427; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1428; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0429; AVX-NEXT:    vpsrlw $1, %xmm0, %xmm2430; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2431; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1432; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0433; AVX-NEXT:    retq434;435; XOP-LABEL: var_shift_v16i8:436; XOP:       # %bb.0:437; XOP-NEXT:    vpxor %xmm2, %xmm2, %xmm2438; XOP-NEXT:    vpsubb %xmm1, %xmm2, %xmm1439; XOP-NEXT:    vpshlb %xmm1, %xmm0, %xmm0440; XOP-NEXT:    retq441;442; AVX512DQ-LABEL: var_shift_v16i8:443; AVX512DQ:       # %bb.0:444; 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,zero445; AVX512DQ-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero446; AVX512DQ-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0447; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0448; AVX512DQ-NEXT:    vzeroupper449; AVX512DQ-NEXT:    retq450;451; AVX512BW-LABEL: var_shift_v16i8:452; AVX512BW:       # %bb.0:453; 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],zero454; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero455; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0456; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0457; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0458; AVX512BW-NEXT:    vzeroupper459; AVX512BW-NEXT:    retq460;461; AVX512DQVL-LABEL: var_shift_v16i8:462; AVX512DQVL:       # %bb.0:463; 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,zero464; AVX512DQVL-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero465; AVX512DQVL-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0466; AVX512DQVL-NEXT:    vpmovdb %zmm0, %xmm0467; AVX512DQVL-NEXT:    vzeroupper468; AVX512DQVL-NEXT:    retq469;470; AVX512BWVL-LABEL: var_shift_v16i8:471; AVX512BWVL:       # %bb.0:472; 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],zero473; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero474; AVX512BWVL-NEXT:    vpsrlvw %ymm1, %ymm0, %ymm0475; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm0476; AVX512BWVL-NEXT:    vzeroupper477; AVX512BWVL-NEXT:    retq478;479; X86-SSE-LABEL: var_shift_v16i8:480; X86-SSE:       # %bb.0:481; X86-SSE-NEXT:    psllw $5, %xmm1482; X86-SSE-NEXT:    pxor %xmm2, %xmm2483; X86-SSE-NEXT:    pxor %xmm3, %xmm3484; X86-SSE-NEXT:    pcmpgtb %xmm1, %xmm3485; X86-SSE-NEXT:    movdqa %xmm3, %xmm4486; X86-SSE-NEXT:    pandn %xmm0, %xmm4487; X86-SSE-NEXT:    psrlw $4, %xmm0488; X86-SSE-NEXT:    pand %xmm3, %xmm0489; X86-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0490; X86-SSE-NEXT:    por %xmm4, %xmm0491; X86-SSE-NEXT:    paddb %xmm1, %xmm1492; X86-SSE-NEXT:    pxor %xmm3, %xmm3493; X86-SSE-NEXT:    pcmpgtb %xmm1, %xmm3494; X86-SSE-NEXT:    movdqa %xmm3, %xmm4495; X86-SSE-NEXT:    pandn %xmm0, %xmm4496; X86-SSE-NEXT:    psrlw $2, %xmm0497; X86-SSE-NEXT:    pand %xmm3, %xmm0498; X86-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0499; X86-SSE-NEXT:    por %xmm4, %xmm0500; X86-SSE-NEXT:    paddb %xmm1, %xmm1501; X86-SSE-NEXT:    pcmpgtb %xmm1, %xmm2502; X86-SSE-NEXT:    movdqa %xmm2, %xmm1503; X86-SSE-NEXT:    pandn %xmm0, %xmm1504; X86-SSE-NEXT:    psrlw $1, %xmm0505; X86-SSE-NEXT:    pand %xmm2, %xmm0506; X86-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0507; X86-SSE-NEXT:    por %xmm1, %xmm0508; X86-SSE-NEXT:    retl509  %shift = lshr <16 x i8> %a, %b510  ret <16 x i8> %shift511}512 513;514; Uniform Variable Shifts515;516 517define <2 x i64> @splatvar_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {518; SSE-LABEL: splatvar_shift_v2i64:519; SSE:       # %bb.0:520; SSE-NEXT:    psrlq %xmm1, %xmm0521; SSE-NEXT:    retq522;523; AVX-LABEL: splatvar_shift_v2i64:524; AVX:       # %bb.0:525; AVX-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0526; AVX-NEXT:    retq527;528; XOP-LABEL: splatvar_shift_v2i64:529; XOP:       # %bb.0:530; XOP-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0531; XOP-NEXT:    retq532;533; AVX512-LABEL: splatvar_shift_v2i64:534; AVX512:       # %bb.0:535; AVX512-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0536; AVX512-NEXT:    retq537;538; AVX512VL-LABEL: splatvar_shift_v2i64:539; AVX512VL:       # %bb.0:540; AVX512VL-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0541; AVX512VL-NEXT:    retq542;543; X86-SSE-LABEL: splatvar_shift_v2i64:544; X86-SSE:       # %bb.0:545; X86-SSE-NEXT:    psrlq %xmm1, %xmm0546; X86-SSE-NEXT:    retl547  %splat = shufflevector <2 x i64> %b, <2 x i64> poison, <2 x i32> zeroinitializer548  %shift = lshr <2 x i64> %a, %splat549  ret <2 x i64> %shift550}551 552define <4 x i32> @splatvar_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {553; SSE2-LABEL: splatvar_shift_v4i32:554; SSE2:       # %bb.0:555; SSE2-NEXT:    xorps %xmm2, %xmm2556; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]557; SSE2-NEXT:    psrld %xmm2, %xmm0558; SSE2-NEXT:    retq559;560; SSE41-LABEL: splatvar_shift_v4i32:561; SSE41:       # %bb.0:562; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero563; SSE41-NEXT:    psrld %xmm1, %xmm0564; SSE41-NEXT:    retq565;566; AVX-LABEL: splatvar_shift_v4i32:567; AVX:       # %bb.0:568; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero569; AVX-NEXT:    vpsrld %xmm1, %xmm0, %xmm0570; AVX-NEXT:    retq571;572; XOP-LABEL: splatvar_shift_v4i32:573; XOP:       # %bb.0:574; XOP-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero575; XOP-NEXT:    vpsrld %xmm1, %xmm0, %xmm0576; XOP-NEXT:    retq577;578; AVX512-LABEL: splatvar_shift_v4i32:579; AVX512:       # %bb.0:580; AVX512-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero581; AVX512-NEXT:    vpsrld %xmm1, %xmm0, %xmm0582; AVX512-NEXT:    retq583;584; AVX512VL-LABEL: splatvar_shift_v4i32:585; AVX512VL:       # %bb.0:586; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero587; AVX512VL-NEXT:    vpsrld %xmm1, %xmm0, %xmm0588; AVX512VL-NEXT:    retq589;590; X86-SSE-LABEL: splatvar_shift_v4i32:591; X86-SSE:       # %bb.0:592; X86-SSE-NEXT:    xorps %xmm2, %xmm2593; X86-SSE-NEXT:    movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]594; X86-SSE-NEXT:    psrld %xmm2, %xmm0595; X86-SSE-NEXT:    retl596  %splat = shufflevector <4 x i32> %b, <4 x i32> poison, <4 x i32> zeroinitializer597  %shift = lshr <4 x i32> %a, %splat598  ret <4 x i32> %shift599}600 601define <8 x i16> @splatvar_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {602; SSE2-LABEL: splatvar_shift_v8i16:603; SSE2:       # %bb.0:604; SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]605; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero606; SSE2-NEXT:    psrlw %xmm1, %xmm0607; SSE2-NEXT:    retq608;609; SSE41-LABEL: splatvar_shift_v8i16:610; SSE41:       # %bb.0:611; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero612; SSE41-NEXT:    psrlw %xmm1, %xmm0613; SSE41-NEXT:    retq614;615; AVX-LABEL: splatvar_shift_v8i16:616; AVX:       # %bb.0:617; AVX-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero618; AVX-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0619; AVX-NEXT:    retq620;621; XOP-LABEL: splatvar_shift_v8i16:622; XOP:       # %bb.0:623; XOP-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero624; XOP-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0625; XOP-NEXT:    retq626;627; AVX512-LABEL: splatvar_shift_v8i16:628; AVX512:       # %bb.0:629; AVX512-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero630; AVX512-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0631; AVX512-NEXT:    retq632;633; AVX512VL-LABEL: splatvar_shift_v8i16:634; AVX512VL:       # %bb.0:635; AVX512VL-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero636; AVX512VL-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0637; AVX512VL-NEXT:    retq638;639; X86-SSE-LABEL: splatvar_shift_v8i16:640; X86-SSE:       # %bb.0:641; X86-SSE-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]642; X86-SSE-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero643; X86-SSE-NEXT:    psrlw %xmm1, %xmm0644; X86-SSE-NEXT:    retl645  %splat = shufflevector <8 x i16> %b, <8 x i16> poison, <8 x i32> zeroinitializer646  %shift = lshr <8 x i16> %a, %splat647  ret <8 x i16> %shift648}649 650define <16 x i8> @splatvar_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {651; SSE2-LABEL: splatvar_shift_v16i8:652; SSE2:       # %bb.0:653; SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]654; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero655; SSE2-NEXT:    psrlw %xmm1, %xmm0656; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2657; SSE2-NEXT:    psrlw %xmm1, %xmm2658; SSE2-NEXT:    psrlw $8, %xmm2659; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]660; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm2[0,0,0,0,4,5,6,7]661; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]662; SSE2-NEXT:    pand %xmm1, %xmm0663; SSE2-NEXT:    retq664;665; SSE41-LABEL: splatvar_shift_v16i8:666; SSE41:       # %bb.0:667; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero668; SSE41-NEXT:    psrlw %xmm1, %xmm0669; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2670; SSE41-NEXT:    psrlw %xmm1, %xmm2671; SSE41-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]672; SSE41-NEXT:    pand %xmm2, %xmm0673; SSE41-NEXT:    retq674;675; AVX1-LABEL: splatvar_shift_v16i8:676; AVX1:       # %bb.0:677; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero678; AVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0679; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2680; AVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm1681; AVX1-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]682; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0683; AVX1-NEXT:    retq684;685; AVX2-LABEL: splatvar_shift_v16i8:686; AVX2:       # %bb.0:687; AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero688; AVX2-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0689; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2690; AVX2-NEXT:    vpsrlw %xmm1, %xmm2, %xmm1691; AVX2-NEXT:    vpsrlw $8, %xmm1, %xmm1692; AVX2-NEXT:    vpbroadcastb %xmm1, %xmm1693; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0694; AVX2-NEXT:    retq695;696; XOPAVX1-LABEL: splatvar_shift_v16i8:697; XOPAVX1:       # %bb.0:698; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2699; XOPAVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1700; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm2, %xmm1701; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm0, %xmm0702; XOPAVX1-NEXT:    retq703;704; XOPAVX2-LABEL: splatvar_shift_v16i8:705; XOPAVX2:       # %bb.0:706; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %xmm1707; XOPAVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2708; XOPAVX2-NEXT:    vpsubb %xmm1, %xmm2, %xmm1709; XOPAVX2-NEXT:    vpshlb %xmm1, %xmm0, %xmm0710; XOPAVX2-NEXT:    retq711;712; AVX512DQ-LABEL: splatvar_shift_v16i8:713; AVX512DQ:       # %bb.0:714; AVX512DQ-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero715; AVX512DQ-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero716; AVX512DQ-NEXT:    vpsrld %xmm1, %zmm0, %zmm0717; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0718; AVX512DQ-NEXT:    vzeroupper719; AVX512DQ-NEXT:    retq720;721; AVX512BW-LABEL: splatvar_shift_v16i8:722; AVX512BW:       # %bb.0:723; AVX512BW-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero724; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero725; AVX512BW-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0726; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0727; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0728; AVX512BW-NEXT:    vzeroupper729; AVX512BW-NEXT:    retq730;731; AVX512DQVL-LABEL: splatvar_shift_v16i8:732; AVX512DQVL:       # %bb.0:733; AVX512DQVL-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero734; AVX512DQVL-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero735; AVX512DQVL-NEXT:    vpsrld %xmm1, %zmm0, %zmm0736; AVX512DQVL-NEXT:    vpmovdb %zmm0, %xmm0737; AVX512DQVL-NEXT:    vzeroupper738; AVX512DQVL-NEXT:    retq739;740; AVX512BWVL-LABEL: splatvar_shift_v16i8:741; AVX512BWVL:       # %bb.0:742; AVX512BWVL-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero743; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero744; AVX512BWVL-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0745; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm0746; AVX512BWVL-NEXT:    vzeroupper747; AVX512BWVL-NEXT:    retq748;749; X86-SSE-LABEL: splatvar_shift_v16i8:750; X86-SSE:       # %bb.0:751; X86-SSE-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]752; X86-SSE-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero753; X86-SSE-NEXT:    psrlw %xmm1, %xmm0754; X86-SSE-NEXT:    pcmpeqd %xmm2, %xmm2755; X86-SSE-NEXT:    psrlw %xmm1, %xmm2756; X86-SSE-NEXT:    psrlw $8, %xmm2757; X86-SSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]758; X86-SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm2[0,0,0,0,4,5,6,7]759; X86-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]760; X86-SSE-NEXT:    pand %xmm1, %xmm0761; X86-SSE-NEXT:    retl762  %splat = shufflevector <16 x i8> %b, <16 x i8> poison, <16 x i32> zeroinitializer763  %shift = lshr <16 x i8> %a, %splat764  ret <16 x i8> %shift765}766 767;768; Uniform Variable Modulo Shifts769;770 771define <2 x i64> @splatvar_modulo_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {772; SSE-LABEL: splatvar_modulo_shift_v2i64:773; SSE:       # %bb.0:774; SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1775; SSE-NEXT:    psrlq %xmm1, %xmm0776; SSE-NEXT:    retq777;778; AVX-LABEL: splatvar_modulo_shift_v2i64:779; AVX:       # %bb.0:780; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1781; AVX-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0782; AVX-NEXT:    retq783;784; XOP-LABEL: splatvar_modulo_shift_v2i64:785; XOP:       # %bb.0:786; XOP-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1787; XOP-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0788; XOP-NEXT:    retq789;790; AVX512-LABEL: splatvar_modulo_shift_v2i64:791; AVX512:       # %bb.0:792; AVX512-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1793; AVX512-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0794; AVX512-NEXT:    retq795;796; AVX512VL-LABEL: splatvar_modulo_shift_v2i64:797; AVX512VL:       # %bb.0:798; AVX512VL-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm1, %xmm1799; AVX512VL-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0800; AVX512VL-NEXT:    retq801;802; X86-SSE-LABEL: splatvar_modulo_shift_v2i64:803; X86-SSE:       # %bb.0:804; X86-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1805; X86-SSE-NEXT:    psrlq %xmm1, %xmm0806; X86-SSE-NEXT:    retl807  %mod = and <2 x i64> %b, <i64 63, i64 63>808  %splat = shufflevector <2 x i64> %mod, <2 x i64> poison, <2 x i32> zeroinitializer809  %shift = lshr <2 x i64> %a, %splat810  ret <2 x i64> %shift811}812 813define <4 x i32> @splatvar_modulo_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {814; SSE-LABEL: splatvar_modulo_shift_v4i32:815; SSE:       # %bb.0:816; SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1817; SSE-NEXT:    psrld %xmm1, %xmm0818; SSE-NEXT:    retq819;820; AVX-LABEL: splatvar_modulo_shift_v4i32:821; AVX:       # %bb.0:822; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1823; AVX-NEXT:    vpsrld %xmm1, %xmm0, %xmm0824; AVX-NEXT:    retq825;826; XOP-LABEL: splatvar_modulo_shift_v4i32:827; XOP:       # %bb.0:828; XOP-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1829; XOP-NEXT:    vpsrld %xmm1, %xmm0, %xmm0830; XOP-NEXT:    retq831;832; AVX512-LABEL: splatvar_modulo_shift_v4i32:833; AVX512:       # %bb.0:834; AVX512-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1835; AVX512-NEXT:    vpsrld %xmm1, %xmm0, %xmm0836; AVX512-NEXT:    retq837;838; AVX512VL-LABEL: splatvar_modulo_shift_v4i32:839; AVX512VL:       # %bb.0:840; AVX512VL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1841; AVX512VL-NEXT:    vpsrld %xmm1, %xmm0, %xmm0842; AVX512VL-NEXT:    retq843;844; X86-SSE-LABEL: splatvar_modulo_shift_v4i32:845; X86-SSE:       # %bb.0:846; X86-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1847; X86-SSE-NEXT:    psrld %xmm1, %xmm0848; X86-SSE-NEXT:    retl849  %mod = and <4 x i32> %b, <i32 31, i32 31, i32 31, i32 31>850  %splat = shufflevector <4 x i32> %mod, <4 x i32> poison, <4 x i32> zeroinitializer851  %shift = lshr <4 x i32> %a, %splat852  ret <4 x i32> %shift853}854 855define <8 x i16> @splatvar_modulo_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {856; SSE-LABEL: splatvar_modulo_shift_v8i16:857; SSE:       # %bb.0:858; SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1859; SSE-NEXT:    psrlw %xmm1, %xmm0860; SSE-NEXT:    retq861;862; AVX-LABEL: splatvar_modulo_shift_v8i16:863; AVX:       # %bb.0:864; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1865; AVX-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0866; AVX-NEXT:    retq867;868; XOP-LABEL: splatvar_modulo_shift_v8i16:869; XOP:       # %bb.0:870; XOP-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1871; XOP-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0872; XOP-NEXT:    retq873;874; AVX512-LABEL: splatvar_modulo_shift_v8i16:875; AVX512:       # %bb.0:876; AVX512-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1877; AVX512-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0878; AVX512-NEXT:    retq879;880; AVX512VL-LABEL: splatvar_modulo_shift_v8i16:881; AVX512VL:       # %bb.0:882; AVX512VL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1883; AVX512VL-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0884; AVX512VL-NEXT:    retq885;886; X86-SSE-LABEL: splatvar_modulo_shift_v8i16:887; X86-SSE:       # %bb.0:888; X86-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1889; X86-SSE-NEXT:    psrlw %xmm1, %xmm0890; X86-SSE-NEXT:    retl891  %mod = and <8 x i16> %b, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>892  %splat = shufflevector <8 x i16> %mod, <8 x i16> poison, <8 x i32> zeroinitializer893  %shift = lshr <8 x i16> %a, %splat894  ret <8 x i16> %shift895}896 897define <16 x i8> @splatvar_modulo_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {898; SSE2-LABEL: splatvar_modulo_shift_v16i8:899; SSE2:       # %bb.0:900; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1901; SSE2-NEXT:    psrlw %xmm1, %xmm0902; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2903; SSE2-NEXT:    psrlw %xmm1, %xmm2904; SSE2-NEXT:    psrlw $8, %xmm2905; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]906; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm2[0,0,0,0,4,5,6,7]907; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]908; SSE2-NEXT:    pand %xmm1, %xmm0909; SSE2-NEXT:    retq910;911; SSE41-LABEL: splatvar_modulo_shift_v16i8:912; SSE41:       # %bb.0:913; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1914; SSE41-NEXT:    psrlw %xmm1, %xmm0915; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2916; SSE41-NEXT:    psrlw %xmm1, %xmm2917; SSE41-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]918; SSE41-NEXT:    pand %xmm2, %xmm0919; SSE41-NEXT:    retq920;921; AVX1-LABEL: splatvar_modulo_shift_v16i8:922; AVX1:       # %bb.0:923; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1924; AVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0925; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2926; AVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm1927; AVX1-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]928; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0929; AVX1-NEXT:    retq930;931; AVX2-LABEL: splatvar_modulo_shift_v16i8:932; AVX2:       # %bb.0:933; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1934; AVX2-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0935; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2936; AVX2-NEXT:    vpsrlw %xmm1, %xmm2, %xmm1937; AVX2-NEXT:    vpsrlw $8, %xmm1, %xmm1938; AVX2-NEXT:    vpbroadcastb %xmm1, %xmm1939; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0940; AVX2-NEXT:    retq941;942; XOPAVX1-LABEL: splatvar_modulo_shift_v16i8:943; XOPAVX1:       # %bb.0:944; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2945; XOPAVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1946; XOPAVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1947; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm2, %xmm1948; XOPAVX1-NEXT:    vpshlb %xmm1, %xmm0, %xmm0949; XOPAVX1-NEXT:    retq950;951; XOPAVX2-LABEL: splatvar_modulo_shift_v16i8:952; XOPAVX2:       # %bb.0:953; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %xmm1954; XOPAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1955; XOPAVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2956; XOPAVX2-NEXT:    vpsubb %xmm1, %xmm2, %xmm1957; XOPAVX2-NEXT:    vpshlb %xmm1, %xmm0, %xmm0958; XOPAVX2-NEXT:    retq959;960; AVX512DQ-LABEL: splatvar_modulo_shift_v16i8:961; AVX512DQ:       # %bb.0:962; AVX512DQ-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1963; AVX512DQ-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero964; AVX512DQ-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero965; AVX512DQ-NEXT:    vpsrld %xmm1, %zmm0, %zmm0966; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0967; AVX512DQ-NEXT:    vzeroupper968; AVX512DQ-NEXT:    retq969;970; AVX512BW-LABEL: splatvar_modulo_shift_v16i8:971; AVX512BW:       # %bb.0:972; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1973; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero974; AVX512BW-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero975; AVX512BW-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0976; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0977; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0978; AVX512BW-NEXT:    vzeroupper979; AVX512BW-NEXT:    retq980;981; AVX512DQVL-LABEL: splatvar_modulo_shift_v16i8:982; AVX512DQVL:       # %bb.0:983; AVX512DQVL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1984; AVX512DQVL-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero985; AVX512DQVL-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero986; AVX512DQVL-NEXT:    vpsrld %xmm1, %zmm0, %zmm0987; AVX512DQVL-NEXT:    vpmovdb %zmm0, %xmm0988; AVX512DQVL-NEXT:    vzeroupper989; AVX512DQVL-NEXT:    retq990;991; AVX512BWVL-LABEL: splatvar_modulo_shift_v16i8:992; AVX512BWVL:       # %bb.0:993; AVX512BWVL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1994; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero995; AVX512BWVL-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero996; AVX512BWVL-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0997; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm0998; AVX512BWVL-NEXT:    vzeroupper999; AVX512BWVL-NEXT:    retq1000;1001; X86-SSE-LABEL: splatvar_modulo_shift_v16i8:1002; X86-SSE:       # %bb.0:1003; X86-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11004; X86-SSE-NEXT:    psrlw %xmm1, %xmm01005; X86-SSE-NEXT:    pcmpeqd %xmm2, %xmm21006; X86-SSE-NEXT:    psrlw %xmm1, %xmm21007; X86-SSE-NEXT:    psrlw $8, %xmm21008; X86-SSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1009; X86-SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm2[0,0,0,0,4,5,6,7]1010; X86-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]1011; X86-SSE-NEXT:    pand %xmm1, %xmm01012; X86-SSE-NEXT:    retl1013  %mod = and <16 x i8> %b, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>1014  %splat = shufflevector <16 x i8> %mod, <16 x i8> poison, <16 x i32> zeroinitializer1015  %shift = lshr <16 x i8> %a, %splat1016  ret <16 x i8> %shift1017}1018 1019;1020; Constant Shifts1021;1022 1023define <2 x i64> @constant_shift_v2i64(<2 x i64> %a) nounwind {1024; SSE2-LABEL: constant_shift_v2i64:1025; SSE2:       # %bb.0:1026; SSE2-NEXT:    movdqa %xmm0, %xmm11027; SSE2-NEXT:    psrlq $1, %xmm11028; SSE2-NEXT:    psrlq $7, %xmm01029; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]1030; SSE2-NEXT:    retq1031;1032; SSE41-LABEL: constant_shift_v2i64:1033; SSE41:       # %bb.0:1034; SSE41-NEXT:    movdqa %xmm0, %xmm11035; SSE41-NEXT:    psrlq $7, %xmm11036; SSE41-NEXT:    psrlq $1, %xmm01037; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]1038; SSE41-NEXT:    retq1039;1040; AVX1-LABEL: constant_shift_v2i64:1041; AVX1:       # %bb.0:1042; AVX1-NEXT:    vpsrlq $7, %xmm0, %xmm11043; AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm01044; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]1045; AVX1-NEXT:    retq1046;1047; AVX2-LABEL: constant_shift_v2i64:1048; AVX2:       # %bb.0:1049; AVX2-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01050; AVX2-NEXT:    retq1051;1052; XOPAVX1-LABEL: constant_shift_v2i64:1053; XOPAVX1:       # %bb.0:1054; XOPAVX1-NEXT:    vpshlq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01055; XOPAVX1-NEXT:    retq1056;1057; XOPAVX2-LABEL: constant_shift_v2i64:1058; XOPAVX2:       # %bb.0:1059; XOPAVX2-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01060; XOPAVX2-NEXT:    retq1061;1062; AVX512-LABEL: constant_shift_v2i64:1063; AVX512:       # %bb.0:1064; AVX512-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01065; AVX512-NEXT:    retq1066;1067; AVX512VL-LABEL: constant_shift_v2i64:1068; AVX512VL:       # %bb.0:1069; AVX512VL-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01070; AVX512VL-NEXT:    retq1071;1072; X86-SSE-LABEL: constant_shift_v2i64:1073; X86-SSE:       # %bb.0:1074; X86-SSE-NEXT:    movdqa %xmm0, %xmm11075; X86-SSE-NEXT:    psrlq $1, %xmm11076; X86-SSE-NEXT:    psrlq $7, %xmm01077; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]1078; X86-SSE-NEXT:    retl1079  %shift = lshr <2 x i64> %a, <i64 1, i64 7>1080  ret <2 x i64> %shift1081}1082 1083define <4 x i32> @constant_shift_v4i32(<4 x i32> %a) nounwind {1084; SSE2-LABEL: constant_shift_v4i32:1085; SSE2:       # %bb.0:1086; SSE2-NEXT:    movdqa %xmm0, %xmm11087; SSE2-NEXT:    psrld $7, %xmm11088; SSE2-NEXT:    movdqa %xmm0, %xmm21089; SSE2-NEXT:    psrld $6, %xmm21090; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm1[1]1091; SSE2-NEXT:    movdqa %xmm0, %xmm11092; SSE2-NEXT:    psrld $5, %xmm11093; SSE2-NEXT:    psrld $4, %xmm01094; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1095; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,3],xmm2[0,3]1096; SSE2-NEXT:    retq1097;1098; SSE41-LABEL: constant_shift_v4i32:1099; SSE41:       # %bb.0:1100; SSE41-NEXT:    movdqa %xmm0, %xmm11101; SSE41-NEXT:    psrld $7, %xmm11102; SSE41-NEXT:    movdqa %xmm0, %xmm21103; SSE41-NEXT:    psrld $5, %xmm21104; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7]1105; SSE41-NEXT:    movdqa %xmm0, %xmm11106; SSE41-NEXT:    psrld $6, %xmm11107; SSE41-NEXT:    psrld $4, %xmm01108; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]1109; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]1110; SSE41-NEXT:    retq1111;1112; AVX1-LABEL: constant_shift_v4i32:1113; AVX1:       # %bb.0:1114; AVX1-NEXT:    vpsrld $7, %xmm0, %xmm11115; AVX1-NEXT:    vpsrld $5, %xmm0, %xmm21116; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]1117; AVX1-NEXT:    vpsrld $6, %xmm0, %xmm21118; AVX1-NEXT:    vpsrld $4, %xmm0, %xmm01119; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]1120; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]1121; AVX1-NEXT:    retq1122;1123; AVX2-LABEL: constant_shift_v4i32:1124; AVX2:       # %bb.0:1125; AVX2-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01126; AVX2-NEXT:    retq1127;1128; XOPAVX1-LABEL: constant_shift_v4i32:1129; XOPAVX1:       # %bb.0:1130; XOPAVX1-NEXT:    vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01131; XOPAVX1-NEXT:    retq1132;1133; XOPAVX2-LABEL: constant_shift_v4i32:1134; XOPAVX2:       # %bb.0:1135; XOPAVX2-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01136; XOPAVX2-NEXT:    retq1137;1138; AVX512-LABEL: constant_shift_v4i32:1139; AVX512:       # %bb.0:1140; AVX512-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01141; AVX512-NEXT:    retq1142;1143; AVX512VL-LABEL: constant_shift_v4i32:1144; AVX512VL:       # %bb.0:1145; AVX512VL-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01146; AVX512VL-NEXT:    retq1147;1148; X86-SSE-LABEL: constant_shift_v4i32:1149; X86-SSE:       # %bb.0:1150; X86-SSE-NEXT:    movdqa %xmm0, %xmm11151; X86-SSE-NEXT:    psrld $7, %xmm11152; X86-SSE-NEXT:    movdqa %xmm0, %xmm21153; X86-SSE-NEXT:    psrld $6, %xmm21154; X86-SSE-NEXT:    punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm1[1]1155; X86-SSE-NEXT:    movdqa %xmm0, %xmm11156; X86-SSE-NEXT:    psrld $5, %xmm11157; X86-SSE-NEXT:    psrld $4, %xmm01158; X86-SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1159; X86-SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,3],xmm2[0,3]1160; X86-SSE-NEXT:    retl1161  %shift = lshr <4 x i32> %a, <i32 4, i32 5, i32 6, i32 7>1162  ret <4 x i32> %shift1163}1164 1165define <8 x i16> @constant_shift_v8i16_pairs(<8 x i16> %a) nounwind {1166; SSE-LABEL: constant_shift_v8i16_pairs:1167; SSE:       # %bb.0:1168; SSE-NEXT:    pmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [32768,32768,8192,8192,16384,16384,4096,4096]1169; SSE-NEXT:    retq1170;1171; AVX1-LABEL: constant_shift_v8i16_pairs:1172; AVX1:       # %bb.0:1173; AVX1-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [32768,32768,8192,8192,16384,16384,4096,4096]1174; AVX1-NEXT:    retq1175;1176; AVX2-LABEL: constant_shift_v8i16_pairs:1177; AVX2:       # %bb.0:1178; AVX2-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01179; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01180; AVX2-NEXT:    retq1181;1182; XOP-LABEL: constant_shift_v8i16_pairs:1183; XOP:       # %bb.0:1184; XOP-NEXT:    vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01185; XOP-NEXT:    retq1186;1187; AVX512DQ-LABEL: constant_shift_v8i16_pairs:1188; AVX512DQ:       # %bb.0:1189; AVX512DQ-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01190; AVX512DQ-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01191; AVX512DQ-NEXT:    retq1192;1193; AVX512BW-LABEL: constant_shift_v8i16_pairs:1194; AVX512BW:       # %bb.0:1195; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01196; AVX512BW-NEXT:    vpmovsxbw {{.*#+}} xmm1 = [1,1,3,3,2,2,4,4]1197; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm01198; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01199; AVX512BW-NEXT:    vzeroupper1200; AVX512BW-NEXT:    retq1201;1202; AVX512DQVL-LABEL: constant_shift_v8i16_pairs:1203; AVX512DQVL:       # %bb.0:1204; AVX512DQVL-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01205; AVX512DQVL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01206; AVX512DQVL-NEXT:    retq1207;1208; AVX512BWVL-LABEL: constant_shift_v8i16_pairs:1209; AVX512BWVL:       # %bb.0:1210; AVX512BWVL-NEXT:    vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01211; AVX512BWVL-NEXT:    retq1212;1213; X86-SSE-LABEL: constant_shift_v8i16_pairs:1214; X86-SSE:       # %bb.0:1215; X86-SSE-NEXT:    pmulhuw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [32768,32768,8192,8192,16384,16384,4096,4096]1216; X86-SSE-NEXT:    retl1217  %shift = lshr <8 x i16> %a, <i16 1, i16 1, i16 3, i16 3, i16 2, i16 2, i16 4, i16 4>1218  ret <8 x i16> %shift1219}1220 1221define <8 x i16> @constant_shift_v8i16(<8 x i16> %a) nounwind {1222; SSE2-LABEL: constant_shift_v8i16:1223; SSE2:       # %bb.0:1224; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [0,65535,65535,65535,65535,65535,65535,65535]1225; SSE2-NEXT:    pandn %xmm0, %xmm11226; SSE2-NEXT:    pmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [0,0,0,128,0,64,0,32,0,16,0,8,0,4,0,2]1227; SSE2-NEXT:    por %xmm1, %xmm01228; SSE2-NEXT:    retq1229;1230; SSE41-LABEL: constant_shift_v8i16:1231; SSE41:       # %bb.0:1232; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [u,32768,16384,8192,4096,2048,1024,512]1233; SSE41-NEXT:    pmulhuw %xmm0, %xmm11234; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]1235; SSE41-NEXT:    retq1236;1237; AVX-LABEL: constant_shift_v8i16:1238; AVX:       # %bb.0:1239; AVX-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [u,32768,16384,8192,4096,2048,1024,512]1240; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]1241; AVX-NEXT:    retq1242;1243; XOP-LABEL: constant_shift_v8i16:1244; XOP:       # %bb.0:1245; XOP-NEXT:    vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01246; XOP-NEXT:    retq1247;1248; AVX512DQ-LABEL: constant_shift_v8i16:1249; AVX512DQ:       # %bb.0:1250; AVX512DQ-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [u,32768,16384,8192,4096,2048,1024,512]1251; AVX512DQ-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]1252; AVX512DQ-NEXT:    retq1253;1254; AVX512BW-LABEL: constant_shift_v8i16:1255; AVX512BW:       # %bb.0:1256; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01257; AVX512BW-NEXT:    vpmovsxbw {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7]1258; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm01259; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm01260; AVX512BW-NEXT:    vzeroupper1261; AVX512BW-NEXT:    retq1262;1263; AVX512DQVL-LABEL: constant_shift_v8i16:1264; AVX512DQVL:       # %bb.0:1265; AVX512DQVL-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [u,32768,16384,8192,4096,2048,1024,512]1266; AVX512DQVL-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]1267; AVX512DQVL-NEXT:    retq1268;1269; AVX512BWVL-LABEL: constant_shift_v8i16:1270; AVX512BWVL:       # %bb.0:1271; AVX512BWVL-NEXT:    vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01272; AVX512BWVL-NEXT:    retq1273;1274; X86-SSE-LABEL: constant_shift_v8i16:1275; X86-SSE:       # %bb.0:1276; X86-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [0,65535,65535,65535,65535,65535,65535,65535]1277; X86-SSE-NEXT:    pandn %xmm0, %xmm11278; X86-SSE-NEXT:    pmulhuw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [0,0,0,128,0,64,0,32,0,16,0,8,0,4,0,2]1279; X86-SSE-NEXT:    por %xmm1, %xmm01280; X86-SSE-NEXT:    retl1281  %shift = lshr <8 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>1282  ret <8 x i16> %shift1283}1284 1285define <16 x i8> @constant_shift_v16i8_pairs(<16 x i8> %a) nounwind {1286; SSE-LABEL: constant_shift_v16i8_pairs:1287; SSE:       # %bb.0:1288; SSE-NEXT:    pmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [512,16384,4096,1024,32768,16384,8192,4096]1289; SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01290; SSE-NEXT:    retq1291;1292; AVX-LABEL: constant_shift_v16i8_pairs:1293; AVX:       # %bb.0:1294; AVX-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [512,16384,4096,1024,32768,16384,8192,4096]1295; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01296; AVX-NEXT:    retq1297;1298; XOP-LABEL: constant_shift_v16i8_pairs:1299; XOP:       # %bb.0:1300; XOP-NEXT:    vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01301; XOP-NEXT:    retq1302;1303; AVX512DQ-LABEL: constant_shift_v16i8_pairs:1304; AVX512DQ:       # %bb.0:1305; AVX512DQ-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [512,16384,4096,1024,32768,16384,8192,4096]1306; AVX512DQ-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01307; AVX512DQ-NEXT:    retq1308;1309; AVX512BW-LABEL: constant_shift_v16i8_pairs:1310; AVX512BW:       # %bb.0:1311; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm01312; AVX512BW-NEXT:    vpmovsxbw {{.*#+}} xmm1 = [7,2,4,6,1,2,3,4]1313; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm01314; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01315; AVX512BW-NEXT:    vzeroupper1316; AVX512BW-NEXT:    retq1317;1318; AVX512DQVL-LABEL: constant_shift_v16i8_pairs:1319; AVX512DQVL:       # %bb.0:1320; AVX512DQVL-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [512,16384,4096,1024,32768,16384,8192,4096]1321; AVX512DQVL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01322; AVX512DQVL-NEXT:    retq1323;1324; AVX512BWVL-LABEL: constant_shift_v16i8_pairs:1325; AVX512BWVL:       # %bb.0:1326; AVX512BWVL-NEXT:    vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01327; AVX512BWVL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01328; AVX512BWVL-NEXT:    retq1329;1330; X86-SSE-LABEL: constant_shift_v16i8_pairs:1331; X86-SSE:       # %bb.0:1332; X86-SSE-NEXT:    pmulhuw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [512,16384,4096,1024,32768,16384,8192,4096]1333; X86-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01334; X86-SSE-NEXT:    retl1335  %shift = lshr <16 x i8> %a, <i8 7, i8 7, i8 2, i8 2, i8 4, i8 4, i8 6, i8 6, i8 1, i8 1, i8 2, i8 2, i8 3, i8 3, i8 4, i8 4>1336  ret <16 x i8> %shift1337}1338 1339define <16 x i8> @constant_shift_v16i8_quads(<16 x i8> %a) nounwind {1340; SSE-LABEL: constant_shift_v16i8_quads:1341; SSE:       # %bb.0:1342; SSE-NEXT:    pmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [16384,16384,4096,4096,32768,32768,8192,8192]1343; SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01344; SSE-NEXT:    retq1345;1346; AVX1-LABEL: constant_shift_v16i8_quads:1347; AVX1:       # %bb.0:1348; AVX1-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [16384,16384,4096,4096,32768,32768,8192,8192]1349; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01350; AVX1-NEXT:    retq1351;1352; AVX2-LABEL: constant_shift_v16i8_quads:1353; AVX2:       # %bb.0:1354; AVX2-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01355; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01356; AVX2-NEXT:    retq1357;1358; XOP-LABEL: constant_shift_v16i8_quads:1359; XOP:       # %bb.0:1360; XOP-NEXT:    vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01361; XOP-NEXT:    retq1362;1363; AVX512-LABEL: constant_shift_v16i8_quads:1364; AVX512:       # %bb.0:1365; AVX512-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01366; AVX512-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01367; AVX512-NEXT:    retq1368;1369; AVX512VL-LABEL: constant_shift_v16i8_quads:1370; AVX512VL:       # %bb.0:1371; AVX512VL-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01372; AVX512VL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01373; AVX512VL-NEXT:    retq1374;1375; X86-SSE-LABEL: constant_shift_v16i8_quads:1376; X86-SSE:       # %bb.0:1377; X86-SSE-NEXT:    pmulhuw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [16384,16384,4096,4096,32768,32768,8192,8192]1378; X86-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01379; X86-SSE-NEXT:    retl1380  %shift = lshr <16 x i8> %a, <i8 2, i8 2, i8 2, i8 2, i8 4, i8 4, i8 4, i8 4, i8 1, i8 1, i8 1, i8 1, i8 3, i8 3, i8 3, i8 3>1381  ret <16 x i8> %shift1382}1383 1384define <16 x i8> @constant_shift_v16i8(<16 x i8> %a) nounwind {1385; SSE2-LABEL: constant_shift_v16i8:1386; SSE2:       # %bb.0:1387; SSE2-NEXT:    pxor %xmm1, %xmm11388; SSE2-NEXT:    movdqa %xmm0, %xmm21389; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]1390; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [2,4,8,16,32,64,128,256]1391; SSE2-NEXT:    psrlw $8, %xmm21392; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]1393; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [256,128,64,32,16,8,4,2]1394; SSE2-NEXT:    psrlw $8, %xmm01395; SSE2-NEXT:    packuswb %xmm2, %xmm01396; SSE2-NEXT:    retq1397;1398; SSE41-LABEL: constant_shift_v16i8:1399; SSE41:       # %bb.0:1400; SSE41-NEXT:    pxor %xmm2, %xmm21401; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero1402; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm2[8],xmm0[9],xmm2[9],xmm0[10],xmm2[10],xmm0[11],xmm2[11],xmm0[12],xmm2[12],xmm0[13],xmm2[13],xmm0[14],xmm2[14],xmm0[15],xmm2[15]1403; SSE41-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [2,4,8,16,32,64,128,256]1404; SSE41-NEXT:    psrlw $8, %xmm01405; SSE41-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [256,128,64,32,16,8,4,2]1406; SSE41-NEXT:    psrlw $8, %xmm11407; SSE41-NEXT:    packuswb %xmm0, %xmm11408; SSE41-NEXT:    movdqa %xmm1, %xmm01409; SSE41-NEXT:    retq1410;1411; AVX1-LABEL: constant_shift_v16i8:1412; AVX1:       # %bb.0:1413; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm11414; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = 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]1415; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [2,4,8,16,32,64,128,256]1416; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm11417; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero1418; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [256,128,64,32,16,8,4,2]1419; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm01420; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm01421; AVX1-NEXT:    retq1422;1423; AVX2-LABEL: constant_shift_v16i8:1424; AVX2:       # %bb.0:1425; AVX2-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero1426; AVX2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [256,128,64,32,16,8,4,2,2,4,8,16,32,64,128,256]1427; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm01428; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm11429; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm01430; AVX2-NEXT:    vzeroupper1431; AVX2-NEXT:    retq1432;1433; XOP-LABEL: constant_shift_v16i8:1434; XOP:       # %bb.0:1435; XOP-NEXT:    vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01436; XOP-NEXT:    retq1437;1438; AVX512DQ-LABEL: constant_shift_v16i8:1439; AVX512DQ:       # %bb.0:1440; AVX512DQ-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero1441; AVX512DQ-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm01442; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm01443; AVX512DQ-NEXT:    vzeroupper1444; AVX512DQ-NEXT:    retq1445;1446; AVX512BW-LABEL: constant_shift_v16i8:1447; AVX512BW:       # %bb.0:1448; AVX512BW-NEXT:    vpmovsxbw {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]1449; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero1450; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm01451; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm01452; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm01453; AVX512BW-NEXT:    vzeroupper1454; AVX512BW-NEXT:    retq1455;1456; AVX512DQVL-LABEL: constant_shift_v16i8:1457; AVX512DQVL:       # %bb.0:1458; AVX512DQVL-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero1459; AVX512DQVL-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm01460; AVX512DQVL-NEXT:    vpmovdb %zmm0, %xmm01461; AVX512DQVL-NEXT:    vzeroupper1462; AVX512DQVL-NEXT:    retq1463;1464; AVX512BWVL-LABEL: constant_shift_v16i8:1465; AVX512BWVL:       # %bb.0:1466; AVX512BWVL-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero1467; AVX512BWVL-NEXT:    vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01468; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm01469; AVX512BWVL-NEXT:    vzeroupper1470; AVX512BWVL-NEXT:    retq1471;1472; X86-SSE-LABEL: constant_shift_v16i8:1473; X86-SSE:       # %bb.0:1474; X86-SSE-NEXT:    pxor %xmm1, %xmm11475; X86-SSE-NEXT:    movdqa %xmm0, %xmm21476; X86-SSE-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]1477; X86-SSE-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2 # [2,4,8,16,32,64,128,256]1478; X86-SSE-NEXT:    psrlw $8, %xmm21479; X86-SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]1480; X86-SSE-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [256,128,64,32,16,8,4,2]1481; X86-SSE-NEXT:    psrlw $8, %xmm01482; X86-SSE-NEXT:    packuswb %xmm2, %xmm01483; X86-SSE-NEXT:    retl1484  %shift = lshr <16 x i8> %a, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>1485  ret <16 x i8> %shift1486}1487 1488;1489; Uniform Constant Shifts1490;1491 1492define <2 x i64> @splatconstant_shift_v2i64(<2 x i64> %a) nounwind {1493; SSE-LABEL: splatconstant_shift_v2i64:1494; SSE:       # %bb.0:1495; SSE-NEXT:    psrlq $7, %xmm01496; SSE-NEXT:    retq1497;1498; AVX-LABEL: splatconstant_shift_v2i64:1499; AVX:       # %bb.0:1500; AVX-NEXT:    vpsrlq $7, %xmm0, %xmm01501; AVX-NEXT:    retq1502;1503; XOP-LABEL: splatconstant_shift_v2i64:1504; XOP:       # %bb.0:1505; XOP-NEXT:    vpsrlq $7, %xmm0, %xmm01506; XOP-NEXT:    retq1507;1508; AVX512-LABEL: splatconstant_shift_v2i64:1509; AVX512:       # %bb.0:1510; AVX512-NEXT:    vpsrlq $7, %xmm0, %xmm01511; AVX512-NEXT:    retq1512;1513; AVX512VL-LABEL: splatconstant_shift_v2i64:1514; AVX512VL:       # %bb.0:1515; AVX512VL-NEXT:    vpsrlq $7, %xmm0, %xmm01516; AVX512VL-NEXT:    retq1517;1518; X86-SSE-LABEL: splatconstant_shift_v2i64:1519; X86-SSE:       # %bb.0:1520; X86-SSE-NEXT:    psrlq $7, %xmm01521; X86-SSE-NEXT:    retl1522  %shift = lshr <2 x i64> %a, <i64 7, i64 7>1523  ret <2 x i64> %shift1524}1525 1526define <4 x i32> @splatconstant_shift_v4i32(<4 x i32> %a) nounwind {1527; SSE-LABEL: splatconstant_shift_v4i32:1528; SSE:       # %bb.0:1529; SSE-NEXT:    psrld $5, %xmm01530; SSE-NEXT:    retq1531;1532; AVX-LABEL: splatconstant_shift_v4i32:1533; AVX:       # %bb.0:1534; AVX-NEXT:    vpsrld $5, %xmm0, %xmm01535; AVX-NEXT:    retq1536;1537; XOP-LABEL: splatconstant_shift_v4i32:1538; XOP:       # %bb.0:1539; XOP-NEXT:    vpsrld $5, %xmm0, %xmm01540; XOP-NEXT:    retq1541;1542; AVX512-LABEL: splatconstant_shift_v4i32:1543; AVX512:       # %bb.0:1544; AVX512-NEXT:    vpsrld $5, %xmm0, %xmm01545; AVX512-NEXT:    retq1546;1547; AVX512VL-LABEL: splatconstant_shift_v4i32:1548; AVX512VL:       # %bb.0:1549; AVX512VL-NEXT:    vpsrld $5, %xmm0, %xmm01550; AVX512VL-NEXT:    retq1551;1552; X86-SSE-LABEL: splatconstant_shift_v4i32:1553; X86-SSE:       # %bb.0:1554; X86-SSE-NEXT:    psrld $5, %xmm01555; X86-SSE-NEXT:    retl1556  %shift = lshr <4 x i32> %a, <i32 5, i32 5, i32 5, i32 5>1557  ret <4 x i32> %shift1558}1559 1560define <8 x i16> @splatconstant_shift_v8i16(<8 x i16> %a) nounwind {1561; SSE-LABEL: splatconstant_shift_v8i16:1562; SSE:       # %bb.0:1563; SSE-NEXT:    psrlw $3, %xmm01564; SSE-NEXT:    retq1565;1566; AVX-LABEL: splatconstant_shift_v8i16:1567; AVX:       # %bb.0:1568; AVX-NEXT:    vpsrlw $3, %xmm0, %xmm01569; AVX-NEXT:    retq1570;1571; XOP-LABEL: splatconstant_shift_v8i16:1572; XOP:       # %bb.0:1573; XOP-NEXT:    vpsrlw $3, %xmm0, %xmm01574; XOP-NEXT:    retq1575;1576; AVX512-LABEL: splatconstant_shift_v8i16:1577; AVX512:       # %bb.0:1578; AVX512-NEXT:    vpsrlw $3, %xmm0, %xmm01579; AVX512-NEXT:    retq1580;1581; AVX512VL-LABEL: splatconstant_shift_v8i16:1582; AVX512VL:       # %bb.0:1583; AVX512VL-NEXT:    vpsrlw $3, %xmm0, %xmm01584; AVX512VL-NEXT:    retq1585;1586; X86-SSE-LABEL: splatconstant_shift_v8i16:1587; X86-SSE:       # %bb.0:1588; X86-SSE-NEXT:    psrlw $3, %xmm01589; X86-SSE-NEXT:    retl1590  %shift = lshr <8 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>1591  ret <8 x i16> %shift1592}1593 1594define <16 x i8> @splatconstant_shift_v16i8(<16 x i8> %a) nounwind {1595; SSE-LABEL: splatconstant_shift_v16i8:1596; SSE:       # %bb.0:1597; SSE-NEXT:    psrlw $3, %xmm01598; SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01599; SSE-NEXT:    retq1600;1601; AVX-LABEL: splatconstant_shift_v16i8:1602; AVX:       # %bb.0:1603; AVX-NEXT:    vpsrlw $3, %xmm0, %xmm01604; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01605; AVX-NEXT:    retq1606;1607; XOP-LABEL: splatconstant_shift_v16i8:1608; XOP:       # %bb.0:1609; XOP-NEXT:    vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01610; XOP-NEXT:    retq1611;1612; AVX512-LABEL: splatconstant_shift_v16i8:1613; AVX512:       # %bb.0:1614; AVX512-NEXT:    vpsrlw $3, %xmm0, %xmm01615; AVX512-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01616; AVX512-NEXT:    retq1617;1618; AVX512VL-LABEL: splatconstant_shift_v16i8:1619; AVX512VL:       # %bb.0:1620; AVX512VL-NEXT:    vpsrlw $3, %xmm0, %xmm01621; AVX512VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm01622; AVX512VL-NEXT:    retq1623;1624; X86-SSE-LABEL: splatconstant_shift_v16i8:1625; X86-SSE:       # %bb.0:1626; X86-SSE-NEXT:    psrlw $3, %xmm01627; X86-SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01628; X86-SSE-NEXT:    retl1629  %shift = lshr <16 x i8> %a, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>1630  ret <16 x i8> %shift1631}1632 1633define <4 x i32> @vector_variable_shift_right(<4 x i1> %cond, <4 x i32> %x, <4 x i32> %y, <4 x i32> %z) nounwind {1634; SSE2-LABEL: vector_variable_shift_right:1635; SSE2:       # %bb.0:1636; SSE2-NEXT:    xorps %xmm4, %xmm41637; SSE2-NEXT:    xorps %xmm5, %xmm51638; SSE2-NEXT:    movss {{.*#+}} xmm5 = xmm2[0],xmm5[1,2,3]1639; SSE2-NEXT:    movss {{.*#+}} xmm4 = xmm1[0],xmm4[1,2,3]1640; SSE2-NEXT:    pslld $31, %xmm01641; SSE2-NEXT:    psrad $31, %xmm01642; SSE2-NEXT:    movdqa %xmm3, %xmm11643; SSE2-NEXT:    psrld %xmm4, %xmm11644; SSE2-NEXT:    psrld %xmm5, %xmm31645; SSE2-NEXT:    pand %xmm0, %xmm11646; SSE2-NEXT:    pandn %xmm3, %xmm01647; SSE2-NEXT:    por %xmm1, %xmm01648; SSE2-NEXT:    retq1649;1650; SSE41-LABEL: vector_variable_shift_right:1651; SSE41:       # %bb.0:1652; SSE41-NEXT:    pslld $31, %xmm01653; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero1654; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero1655; SSE41-NEXT:    movdqa %xmm3, %xmm41656; SSE41-NEXT:    psrld %xmm1, %xmm41657; SSE41-NEXT:    psrld %xmm2, %xmm31658; SSE41-NEXT:    blendvps %xmm0, %xmm4, %xmm31659; SSE41-NEXT:    movaps %xmm3, %xmm01660; SSE41-NEXT:    retq1661;1662; AVX1-LABEL: vector_variable_shift_right:1663; AVX1:       # %bb.0:1664; AVX1-NEXT:    vpslld $31, %xmm0, %xmm01665; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero1666; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero1667; AVX1-NEXT:    vpsrld %xmm1, %xmm3, %xmm11668; AVX1-NEXT:    vpsrld %xmm2, %xmm3, %xmm21669; AVX1-NEXT:    vblendvps %xmm0, %xmm1, %xmm2, %xmm01670; AVX1-NEXT:    retq1671;1672; AVX2-LABEL: vector_variable_shift_right:1673; AVX2:       # %bb.0:1674; AVX2-NEXT:    vpslld $31, %xmm0, %xmm01675; AVX2-NEXT:    vbroadcastss %xmm1, %xmm11676; AVX2-NEXT:    vbroadcastss %xmm2, %xmm21677; AVX2-NEXT:    vblendvps %xmm0, %xmm1, %xmm2, %xmm01678; AVX2-NEXT:    vpsrlvd %xmm0, %xmm3, %xmm01679; AVX2-NEXT:    retq1680;1681; XOPAVX1-LABEL: vector_variable_shift_right:1682; XOPAVX1:       # %bb.0:1683; XOPAVX1-NEXT:    vpslld $31, %xmm0, %xmm01684; XOPAVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[0,0,0,0]1685; XOPAVX1-NEXT:    vshufps {{.*#+}} xmm2 = xmm2[0,0,0,0]1686; XOPAVX1-NEXT:    vblendvps %xmm0, %xmm1, %xmm2, %xmm01687; XOPAVX1-NEXT:    vxorps %xmm1, %xmm1, %xmm11688; XOPAVX1-NEXT:    vpsubd %xmm0, %xmm1, %xmm01689; XOPAVX1-NEXT:    vpshld %xmm0, %xmm3, %xmm01690; XOPAVX1-NEXT:    retq1691;1692; XOPAVX2-LABEL: vector_variable_shift_right:1693; XOPAVX2:       # %bb.0:1694; XOPAVX2-NEXT:    vpslld $31, %xmm0, %xmm01695; XOPAVX2-NEXT:    vbroadcastss %xmm1, %xmm11696; XOPAVX2-NEXT:    vbroadcastss %xmm2, %xmm21697; XOPAVX2-NEXT:    vblendvps %xmm0, %xmm1, %xmm2, %xmm01698; XOPAVX2-NEXT:    vpsrlvd %xmm0, %xmm3, %xmm01699; XOPAVX2-NEXT:    retq1700;1701; AVX512DQ-LABEL: vector_variable_shift_right:1702; AVX512DQ:       # %bb.0:1703; AVX512DQ-NEXT:    vpslld $31, %xmm0, %xmm01704; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k11705; AVX512DQ-NEXT:    vpbroadcastd %xmm1, %xmm01706; AVX512DQ-NEXT:    vpbroadcastd %xmm2, %xmm11707; AVX512DQ-NEXT:    vmovdqa32 %zmm0, %zmm1 {%k1}1708; AVX512DQ-NEXT:    vpsrlvd %xmm1, %xmm3, %xmm01709; AVX512DQ-NEXT:    vzeroupper1710; AVX512DQ-NEXT:    retq1711;1712; AVX512BW-LABEL: vector_variable_shift_right:1713; AVX512BW:       # %bb.0:1714; AVX512BW-NEXT:    vpslld $31, %xmm0, %xmm01715; AVX512BW-NEXT:    vptestmd %zmm0, %zmm0, %k11716; AVX512BW-NEXT:    vpbroadcastd %xmm1, %xmm01717; AVX512BW-NEXT:    vpbroadcastd %xmm2, %xmm11718; AVX512BW-NEXT:    vmovdqa32 %zmm0, %zmm1 {%k1}1719; AVX512BW-NEXT:    vpsrlvd %xmm1, %xmm3, %xmm01720; AVX512BW-NEXT:    vzeroupper1721; AVX512BW-NEXT:    retq1722;1723; AVX512DQVL-LABEL: vector_variable_shift_right:1724; AVX512DQVL:       # %bb.0:1725; AVX512DQVL-NEXT:    vpslld $31, %xmm0, %xmm01726; AVX512DQVL-NEXT:    vpmovd2m %xmm0, %k11727; AVX512DQVL-NEXT:    vpbroadcastd %xmm2, %xmm01728; AVX512DQVL-NEXT:    vpbroadcastd %xmm1, %xmm0 {%k1}1729; AVX512DQVL-NEXT:    vpsrlvd %xmm0, %xmm3, %xmm01730; AVX512DQVL-NEXT:    retq1731;1732; AVX512BWVL-LABEL: vector_variable_shift_right:1733; AVX512BWVL:       # %bb.0:1734; AVX512BWVL-NEXT:    vpslld $31, %xmm0, %xmm01735; AVX512BWVL-NEXT:    vptestmd %xmm0, %xmm0, %k11736; AVX512BWVL-NEXT:    vpbroadcastd %xmm2, %xmm01737; AVX512BWVL-NEXT:    vpbroadcastd %xmm1, %xmm0 {%k1}1738; AVX512BWVL-NEXT:    vpsrlvd %xmm0, %xmm3, %xmm01739; AVX512BWVL-NEXT:    retq1740;1741; X86-SSE-LABEL: vector_variable_shift_right:1742; X86-SSE:       # %bb.0:1743; X86-SSE-NEXT:    pushl %ebp1744; X86-SSE-NEXT:    movl %esp, %ebp1745; X86-SSE-NEXT:    andl $-16, %esp1746; X86-SSE-NEXT:    subl $16, %esp1747; X86-SSE-NEXT:    xorps %xmm3, %xmm31748; X86-SSE-NEXT:    xorps %xmm4, %xmm41749; X86-SSE-NEXT:    movss {{.*#+}} xmm4 = xmm2[0],xmm4[1,2,3]1750; X86-SSE-NEXT:    movss {{.*#+}} xmm3 = xmm1[0],xmm3[1,2,3]1751; X86-SSE-NEXT:    pslld $31, %xmm01752; X86-SSE-NEXT:    psrad $31, %xmm01753; X86-SSE-NEXT:    movdqa 8(%ebp), %xmm11754; X86-SSE-NEXT:    movdqa %xmm1, %xmm21755; X86-SSE-NEXT:    psrld %xmm3, %xmm21756; X86-SSE-NEXT:    psrld %xmm4, %xmm11757; X86-SSE-NEXT:    pand %xmm0, %xmm21758; X86-SSE-NEXT:    pandn %xmm1, %xmm01759; X86-SSE-NEXT:    por %xmm2, %xmm01760; X86-SSE-NEXT:    movl %ebp, %esp1761; X86-SSE-NEXT:    popl %ebp1762; X86-SSE-NEXT:    retl1763  %splat1 = shufflevector <4 x i32> %x, <4 x i32> poison, <4 x i32> zeroinitializer1764  %splat2 = shufflevector <4 x i32> %y, <4 x i32> poison, <4 x i32> zeroinitializer1765  %sel = select <4 x i1> %cond, <4 x i32> %splat1, <4 x i32> %splat21766  %sh = lshr <4 x i32> %z, %sel1767  ret <4 x i32> %sh1768}1769