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