1490 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: psllq %xmm1, %xmm225; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]26; SSE2-NEXT: psllq %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: psllq %xmm1, %xmm234; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]35; SSE41-NEXT: psllq %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: vpsllq %xmm1, %xmm0, %xmm242; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]43; AVX1-NEXT: vpsllq %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: vpsllvq %xmm1, %xmm0, %xmm050; AVX2-NEXT: retq51;52; XOPAVX1-LABEL: var_shift_v2i64:53; XOPAVX1: # %bb.0:54; XOPAVX1-NEXT: vpshlq %xmm1, %xmm0, %xmm055; XOPAVX1-NEXT: retq56;57; XOPAVX2-LABEL: var_shift_v2i64:58; XOPAVX2: # %bb.0:59; XOPAVX2-NEXT: vpsllvq %xmm1, %xmm0, %xmm060; XOPAVX2-NEXT: retq61;62; AVX512-LABEL: var_shift_v2i64:63; AVX512: # %bb.0:64; AVX512-NEXT: vpsllvq %xmm1, %xmm0, %xmm065; AVX512-NEXT: retq66;67; AVX512VL-LABEL: var_shift_v2i64:68; AVX512VL: # %bb.0:69; AVX512VL-NEXT: vpsllvq %xmm1, %xmm0, %xmm070; AVX512VL-NEXT: retq71;72; X86-SSE-LABEL: var_shift_v2i64:73; X86-SSE: # %bb.0:74; X86-SSE-NEXT: movdqa %xmm0, %xmm275; X86-SSE-NEXT: psllq %xmm1, %xmm276; X86-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]77; X86-SSE-NEXT: psllq %xmm1, %xmm078; X86-SSE-NEXT: movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]79; X86-SSE-NEXT: retl80 %shift = shl <2 x i64> %a, %b81 ret <2 x i64> %shift82}83 84define <4 x i32> @var_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {85; SSE2-LABEL: var_shift_v4i32:86; SSE2: # %bb.0:87; SSE2-NEXT: pslld $23, %xmm188; SSE2-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm189; SSE2-NEXT: cvttps2dq %xmm1, %xmm190; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]91; SSE2-NEXT: pmuludq %xmm1, %xmm092; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]93; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]94; SSE2-NEXT: pmuludq %xmm2, %xmm195; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]96; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]97; SSE2-NEXT: retq98;99; SSE41-LABEL: var_shift_v4i32:100; SSE41: # %bb.0:101; SSE41-NEXT: pslld $23, %xmm1102; SSE41-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1103; SSE41-NEXT: cvttps2dq %xmm1, %xmm1104; SSE41-NEXT: pmulld %xmm1, %xmm0105; SSE41-NEXT: retq106;107; AVX1-LABEL: var_shift_v4i32:108; AVX1: # %bb.0:109; AVX1-NEXT: vpslld $23, %xmm1, %xmm1110; AVX1-NEXT: vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1111; AVX1-NEXT: vcvttps2dq %xmm1, %xmm1112; AVX1-NEXT: vpmulld %xmm1, %xmm0, %xmm0113; AVX1-NEXT: retq114;115; AVX2-LABEL: var_shift_v4i32:116; AVX2: # %bb.0:117; AVX2-NEXT: vpsllvd %xmm1, %xmm0, %xmm0118; AVX2-NEXT: retq119;120; XOPAVX1-LABEL: var_shift_v4i32:121; XOPAVX1: # %bb.0:122; XOPAVX1-NEXT: vpshld %xmm1, %xmm0, %xmm0123; XOPAVX1-NEXT: retq124;125; XOPAVX2-LABEL: var_shift_v4i32:126; XOPAVX2: # %bb.0:127; XOPAVX2-NEXT: vpsllvd %xmm1, %xmm0, %xmm0128; XOPAVX2-NEXT: retq129;130; AVX512-LABEL: var_shift_v4i32:131; AVX512: # %bb.0:132; AVX512-NEXT: vpsllvd %xmm1, %xmm0, %xmm0133; AVX512-NEXT: retq134;135; AVX512VL-LABEL: var_shift_v4i32:136; AVX512VL: # %bb.0:137; AVX512VL-NEXT: vpsllvd %xmm1, %xmm0, %xmm0138; AVX512VL-NEXT: retq139;140; X86-SSE-LABEL: var_shift_v4i32:141; X86-SSE: # %bb.0:142; X86-SSE-NEXT: pslld $23, %xmm1143; X86-SSE-NEXT: paddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1144; X86-SSE-NEXT: cvttps2dq %xmm1, %xmm1145; X86-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]146; X86-SSE-NEXT: pmuludq %xmm1, %xmm0147; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]148; X86-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]149; X86-SSE-NEXT: pmuludq %xmm2, %xmm1150; X86-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]151; X86-SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]152; X86-SSE-NEXT: retl153 %shift = shl <4 x i32> %a, %b154 ret <4 x i32> %shift155}156 157define <8 x i16> @var_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {158; SSE2-LABEL: var_shift_v8i16:159; SSE2: # %bb.0:160; SSE2-NEXT: movdqa %xmm1, %xmm2161; SSE2-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]162; SSE2-NEXT: pslld $23, %xmm2163; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]164; SSE2-NEXT: paddd %xmm3, %xmm2165; SSE2-NEXT: cvttps2dq %xmm2, %xmm2166; SSE2-NEXT: pslld $16, %xmm2167; SSE2-NEXT: psrad $16, %xmm2168; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]169; SSE2-NEXT: pslld $23, %xmm1170; SSE2-NEXT: paddd %xmm3, %xmm1171; SSE2-NEXT: cvttps2dq %xmm1, %xmm1172; SSE2-NEXT: pslld $16, %xmm1173; SSE2-NEXT: psrad $16, %xmm1174; SSE2-NEXT: packssdw %xmm2, %xmm1175; SSE2-NEXT: pmullw %xmm1, %xmm0176; SSE2-NEXT: retq177;178; SSE41-LABEL: var_shift_v8i16:179; SSE41: # %bb.0:180; SSE41-NEXT: pmovzxwd {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero181; SSE41-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]182; SSE41-NEXT: pslld $23, %xmm1183; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]184; SSE41-NEXT: paddd %xmm3, %xmm1185; SSE41-NEXT: cvttps2dq %xmm1, %xmm1186; SSE41-NEXT: pslld $23, %xmm2187; SSE41-NEXT: paddd %xmm3, %xmm2188; SSE41-NEXT: cvttps2dq %xmm2, %xmm2189; SSE41-NEXT: packusdw %xmm1, %xmm2190; SSE41-NEXT: pmullw %xmm2, %xmm0191; SSE41-NEXT: retq192;193; AVX1-LABEL: var_shift_v8i16:194; AVX1: # %bb.0:195; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm2 = xmm1[4,4,5,5,6,6,7,7]196; AVX1-NEXT: vpslld $23, %xmm2, %xmm2197; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]198; AVX1-NEXT: vpaddd %xmm3, %xmm2, %xmm2199; AVX1-NEXT: vcvttps2dq %xmm2, %xmm2200; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero201; AVX1-NEXT: vpslld $23, %xmm1, %xmm1202; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1203; AVX1-NEXT: vcvttps2dq %xmm1, %xmm1204; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1205; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0206; AVX1-NEXT: retq207;208; AVX2-LABEL: var_shift_v8i16:209; AVX2: # %bb.0:210; 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],zero211; 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],zero212; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm0213; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]214; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]215; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0216; AVX2-NEXT: vzeroupper217; AVX2-NEXT: retq218;219; XOP-LABEL: var_shift_v8i16:220; XOP: # %bb.0:221; XOP-NEXT: vpshlw %xmm1, %xmm0, %xmm0222; XOP-NEXT: retq223;224; AVX512DQ-LABEL: var_shift_v8i16:225; AVX512DQ: # %bb.0:226; 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],zero227; 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],zero228; AVX512DQ-NEXT: vpsllvd %ymm1, %ymm0, %ymm0229; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm0230; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0231; AVX512DQ-NEXT: vzeroupper232; AVX512DQ-NEXT: retq233;234; AVX512BW-LABEL: var_shift_v8i16:235; AVX512BW: # %bb.0:236; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1237; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0238; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm0239; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0240; AVX512BW-NEXT: vzeroupper241; AVX512BW-NEXT: retq242;243; AVX512DQVL-LABEL: var_shift_v8i16:244; AVX512DQVL: # %bb.0:245; 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],zero246; 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],zero247; AVX512DQVL-NEXT: vpsllvd %ymm1, %ymm0, %ymm0248; AVX512DQVL-NEXT: vpmovdw %ymm0, %xmm0249; AVX512DQVL-NEXT: vzeroupper250; AVX512DQVL-NEXT: retq251;252; AVX512BWVL-LABEL: var_shift_v8i16:253; AVX512BWVL: # %bb.0:254; AVX512BWVL-NEXT: vpsllvw %xmm1, %xmm0, %xmm0255; AVX512BWVL-NEXT: retq256;257; X86-SSE-LABEL: var_shift_v8i16:258; X86-SSE: # %bb.0:259; X86-SSE-NEXT: movdqa %xmm1, %xmm2260; X86-SSE-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]261; X86-SSE-NEXT: pslld $23, %xmm2262; X86-SSE-NEXT: movdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]263; X86-SSE-NEXT: paddd %xmm3, %xmm2264; X86-SSE-NEXT: cvttps2dq %xmm2, %xmm2265; X86-SSE-NEXT: pslld $16, %xmm2266; X86-SSE-NEXT: psrad $16, %xmm2267; X86-SSE-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]268; X86-SSE-NEXT: pslld $23, %xmm1269; X86-SSE-NEXT: paddd %xmm3, %xmm1270; X86-SSE-NEXT: cvttps2dq %xmm1, %xmm1271; X86-SSE-NEXT: pslld $16, %xmm1272; X86-SSE-NEXT: psrad $16, %xmm1273; X86-SSE-NEXT: packssdw %xmm2, %xmm1274; X86-SSE-NEXT: pmullw %xmm1, %xmm0275; X86-SSE-NEXT: retl276 %shift = shl <8 x i16> %a, %b277 ret <8 x i16> %shift278}279 280define <16 x i8> @var_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {281; SSE2-LABEL: var_shift_v16i8:282; SSE2: # %bb.0:283; SSE2-NEXT: psllw $5, %xmm1284; SSE2-NEXT: pxor %xmm2, %xmm2285; SSE2-NEXT: pxor %xmm3, %xmm3286; SSE2-NEXT: pcmpgtb %xmm1, %xmm3287; SSE2-NEXT: movdqa %xmm3, %xmm4288; SSE2-NEXT: pandn %xmm0, %xmm4289; SSE2-NEXT: psllw $4, %xmm0290; SSE2-NEXT: pand %xmm3, %xmm0291; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0292; SSE2-NEXT: por %xmm4, %xmm0293; SSE2-NEXT: paddb %xmm1, %xmm1294; SSE2-NEXT: pxor %xmm3, %xmm3295; SSE2-NEXT: pcmpgtb %xmm1, %xmm3296; SSE2-NEXT: movdqa %xmm3, %xmm4297; SSE2-NEXT: pandn %xmm0, %xmm4298; SSE2-NEXT: psllw $2, %xmm0299; SSE2-NEXT: pand %xmm3, %xmm0300; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0301; SSE2-NEXT: por %xmm4, %xmm0302; SSE2-NEXT: paddb %xmm1, %xmm1303; SSE2-NEXT: pcmpgtb %xmm1, %xmm2304; SSE2-NEXT: movdqa %xmm2, %xmm1305; SSE2-NEXT: pandn %xmm0, %xmm1306; SSE2-NEXT: paddb %xmm0, %xmm0307; SSE2-NEXT: pand %xmm2, %xmm0308; SSE2-NEXT: por %xmm1, %xmm0309; SSE2-NEXT: retq310;311; SSE41-LABEL: var_shift_v16i8:312; SSE41: # %bb.0:313; SSE41-NEXT: movdqa %xmm0, %xmm2314; SSE41-NEXT: psllw $5, %xmm1315; SSE41-NEXT: movdqa %xmm0, %xmm3316; SSE41-NEXT: psllw $4, %xmm3317; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3318; SSE41-NEXT: movdqa %xmm1, %xmm0319; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2320; SSE41-NEXT: movdqa %xmm2, %xmm3321; SSE41-NEXT: psllw $2, %xmm3322; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3323; SSE41-NEXT: paddb %xmm1, %xmm1324; SSE41-NEXT: movdqa %xmm1, %xmm0325; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2326; SSE41-NEXT: movdqa %xmm2, %xmm3327; SSE41-NEXT: paddb %xmm2, %xmm3328; SSE41-NEXT: paddb %xmm1, %xmm1329; SSE41-NEXT: movdqa %xmm1, %xmm0330; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2331; SSE41-NEXT: movdqa %xmm2, %xmm0332; SSE41-NEXT: retq333;334; AVX-LABEL: var_shift_v16i8:335; AVX: # %bb.0:336; AVX-NEXT: vpsllw $5, %xmm1, %xmm1337; AVX-NEXT: vpsllw $4, %xmm0, %xmm2338; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2339; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0340; AVX-NEXT: vpsllw $2, %xmm0, %xmm2341; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2342; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1343; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0344; AVX-NEXT: vpaddb %xmm0, %xmm0, %xmm2345; AVX-NEXT: vpaddb %xmm1, %xmm1, %xmm1346; AVX-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0347; AVX-NEXT: retq348;349; XOP-LABEL: var_shift_v16i8:350; XOP: # %bb.0:351; XOP-NEXT: vpshlb %xmm1, %xmm0, %xmm0352; XOP-NEXT: retq353;354; AVX512DQ-LABEL: var_shift_v16i8:355; AVX512DQ: # %bb.0:356; 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,zero357; 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,zero358; AVX512DQ-NEXT: vpsllvd %zmm1, %zmm0, %zmm0359; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0360; AVX512DQ-NEXT: vzeroupper361; AVX512DQ-NEXT: retq362;363; AVX512BW-LABEL: var_shift_v16i8:364; AVX512BW: # %bb.0:365; 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],zero366; 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],zero367; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm0368; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0369; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0370; AVX512BW-NEXT: vzeroupper371; AVX512BW-NEXT: retq372;373; AVX512DQVL-LABEL: var_shift_v16i8:374; AVX512DQVL: # %bb.0:375; 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,zero376; 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,zero377; AVX512DQVL-NEXT: vpsllvd %zmm1, %zmm0, %zmm0378; AVX512DQVL-NEXT: vpmovdb %zmm0, %xmm0379; AVX512DQVL-NEXT: vzeroupper380; AVX512DQVL-NEXT: retq381;382; AVX512BWVL-LABEL: var_shift_v16i8:383; AVX512BWVL: # %bb.0:384; 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],zero385; 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],zero386; AVX512BWVL-NEXT: vpsllvw %ymm1, %ymm0, %ymm0387; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm0388; AVX512BWVL-NEXT: vzeroupper389; AVX512BWVL-NEXT: retq390;391; X86-SSE-LABEL: var_shift_v16i8:392; X86-SSE: # %bb.0:393; X86-SSE-NEXT: psllw $5, %xmm1394; X86-SSE-NEXT: pxor %xmm2, %xmm2395; X86-SSE-NEXT: pxor %xmm3, %xmm3396; X86-SSE-NEXT: pcmpgtb %xmm1, %xmm3397; X86-SSE-NEXT: movdqa %xmm3, %xmm4398; X86-SSE-NEXT: pandn %xmm0, %xmm4399; X86-SSE-NEXT: psllw $4, %xmm0400; X86-SSE-NEXT: pand %xmm3, %xmm0401; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0402; X86-SSE-NEXT: por %xmm4, %xmm0403; X86-SSE-NEXT: paddb %xmm1, %xmm1404; X86-SSE-NEXT: pxor %xmm3, %xmm3405; X86-SSE-NEXT: pcmpgtb %xmm1, %xmm3406; X86-SSE-NEXT: movdqa %xmm3, %xmm4407; X86-SSE-NEXT: pandn %xmm0, %xmm4408; X86-SSE-NEXT: psllw $2, %xmm0409; X86-SSE-NEXT: pand %xmm3, %xmm0410; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0411; X86-SSE-NEXT: por %xmm4, %xmm0412; X86-SSE-NEXT: paddb %xmm1, %xmm1413; X86-SSE-NEXT: pcmpgtb %xmm1, %xmm2414; X86-SSE-NEXT: movdqa %xmm2, %xmm1415; X86-SSE-NEXT: pandn %xmm0, %xmm1416; X86-SSE-NEXT: paddb %xmm0, %xmm0417; X86-SSE-NEXT: pand %xmm2, %xmm0418; X86-SSE-NEXT: por %xmm1, %xmm0419; X86-SSE-NEXT: retl420 %shift = shl <16 x i8> %a, %b421 ret <16 x i8> %shift422}423 424;425; Uniform Variable Shifts426;427 428define <2 x i64> @splatvar_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {429; SSE-LABEL: splatvar_shift_v2i64:430; SSE: # %bb.0:431; SSE-NEXT: psllq %xmm1, %xmm0432; SSE-NEXT: retq433;434; AVX-LABEL: splatvar_shift_v2i64:435; AVX: # %bb.0:436; AVX-NEXT: vpsllq %xmm1, %xmm0, %xmm0437; AVX-NEXT: retq438;439; XOP-LABEL: splatvar_shift_v2i64:440; XOP: # %bb.0:441; XOP-NEXT: vpsllq %xmm1, %xmm0, %xmm0442; XOP-NEXT: retq443;444; AVX512-LABEL: splatvar_shift_v2i64:445; AVX512: # %bb.0:446; AVX512-NEXT: vpsllq %xmm1, %xmm0, %xmm0447; AVX512-NEXT: retq448;449; AVX512VL-LABEL: splatvar_shift_v2i64:450; AVX512VL: # %bb.0:451; AVX512VL-NEXT: vpsllq %xmm1, %xmm0, %xmm0452; AVX512VL-NEXT: retq453;454; X86-SSE-LABEL: splatvar_shift_v2i64:455; X86-SSE: # %bb.0:456; X86-SSE-NEXT: psllq %xmm1, %xmm0457; X86-SSE-NEXT: retl458 %splat = shufflevector <2 x i64> %b, <2 x i64> poison, <2 x i32> zeroinitializer459 %shift = shl <2 x i64> %a, %splat460 ret <2 x i64> %shift461}462 463define <4 x i32> @splatvar_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {464; SSE2-LABEL: splatvar_shift_v4i32:465; SSE2: # %bb.0:466; SSE2-NEXT: xorps %xmm2, %xmm2467; SSE2-NEXT: movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]468; SSE2-NEXT: pslld %xmm2, %xmm0469; SSE2-NEXT: retq470;471; SSE41-LABEL: splatvar_shift_v4i32:472; SSE41: # %bb.0:473; SSE41-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero474; SSE41-NEXT: pslld %xmm1, %xmm0475; SSE41-NEXT: retq476;477; AVX-LABEL: splatvar_shift_v4i32:478; AVX: # %bb.0:479; AVX-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero480; AVX-NEXT: vpslld %xmm1, %xmm0, %xmm0481; AVX-NEXT: retq482;483; XOP-LABEL: splatvar_shift_v4i32:484; XOP: # %bb.0:485; XOP-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero486; XOP-NEXT: vpslld %xmm1, %xmm0, %xmm0487; XOP-NEXT: retq488;489; AVX512-LABEL: splatvar_shift_v4i32:490; AVX512: # %bb.0:491; AVX512-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero492; AVX512-NEXT: vpslld %xmm1, %xmm0, %xmm0493; AVX512-NEXT: retq494;495; AVX512VL-LABEL: splatvar_shift_v4i32:496; AVX512VL: # %bb.0:497; AVX512VL-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero498; AVX512VL-NEXT: vpslld %xmm1, %xmm0, %xmm0499; AVX512VL-NEXT: retq500;501; X86-SSE-LABEL: splatvar_shift_v4i32:502; X86-SSE: # %bb.0:503; X86-SSE-NEXT: xorps %xmm2, %xmm2504; X86-SSE-NEXT: movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]505; X86-SSE-NEXT: pslld %xmm2, %xmm0506; X86-SSE-NEXT: retl507 %splat = shufflevector <4 x i32> %b, <4 x i32> poison, <4 x i32> zeroinitializer508 %shift = shl <4 x i32> %a, %splat509 ret <4 x i32> %shift510}511 512define <8 x i16> @splatvar_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {513; SSE2-LABEL: splatvar_shift_v8i16:514; SSE2: # %bb.0:515; SSE2-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]516; SSE2-NEXT: psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero517; SSE2-NEXT: psllw %xmm1, %xmm0518; SSE2-NEXT: retq519;520; SSE41-LABEL: splatvar_shift_v8i16:521; SSE41: # %bb.0:522; SSE41-NEXT: pmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero523; SSE41-NEXT: psllw %xmm1, %xmm0524; SSE41-NEXT: retq525;526; AVX-LABEL: splatvar_shift_v8i16:527; AVX: # %bb.0:528; AVX-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero529; AVX-NEXT: vpsllw %xmm1, %xmm0, %xmm0530; AVX-NEXT: retq531;532; XOP-LABEL: splatvar_shift_v8i16:533; XOP: # %bb.0:534; XOP-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero535; XOP-NEXT: vpsllw %xmm1, %xmm0, %xmm0536; XOP-NEXT: retq537;538; AVX512-LABEL: splatvar_shift_v8i16:539; AVX512: # %bb.0:540; AVX512-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero541; AVX512-NEXT: vpsllw %xmm1, %xmm0, %xmm0542; AVX512-NEXT: retq543;544; AVX512VL-LABEL: splatvar_shift_v8i16:545; AVX512VL: # %bb.0:546; AVX512VL-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero547; AVX512VL-NEXT: vpsllw %xmm1, %xmm0, %xmm0548; AVX512VL-NEXT: retq549;550; X86-SSE-LABEL: splatvar_shift_v8i16:551; X86-SSE: # %bb.0:552; X86-SSE-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]553; X86-SSE-NEXT: psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero554; X86-SSE-NEXT: psllw %xmm1, %xmm0555; X86-SSE-NEXT: retl556 %splat = shufflevector <8 x i16> %b, <8 x i16> poison, <8 x i32> zeroinitializer557 %shift = shl <8 x i16> %a, %splat558 ret <8 x i16> %shift559}560 561define <16 x i8> @splatvar_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {562; SSE2-LABEL: splatvar_shift_v16i8:563; SSE2: # %bb.0:564; SSE2-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]565; SSE2-NEXT: psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero566; SSE2-NEXT: psllw %xmm1, %xmm0567; SSE2-NEXT: pcmpeqd %xmm2, %xmm2568; SSE2-NEXT: psllw %xmm1, %xmm2569; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]570; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm2[0,0,0,0,4,5,6,7]571; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]572; SSE2-NEXT: pand %xmm1, %xmm0573; SSE2-NEXT: retq574;575; SSE41-LABEL: splatvar_shift_v16i8:576; SSE41: # %bb.0:577; SSE41-NEXT: pmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero578; SSE41-NEXT: psllw %xmm1, %xmm0579; SSE41-NEXT: pcmpeqd %xmm2, %xmm2580; SSE41-NEXT: psllw %xmm1, %xmm2581; SSE41-NEXT: pxor %xmm1, %xmm1582; SSE41-NEXT: pshufb %xmm1, %xmm2583; SSE41-NEXT: pand %xmm2, %xmm0584; SSE41-NEXT: retq585;586; AVX1-LABEL: splatvar_shift_v16i8:587; AVX1: # %bb.0:588; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero589; AVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0590; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2591; AVX1-NEXT: vpsllw %xmm1, %xmm2, %xmm1592; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2593; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1594; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0595; AVX1-NEXT: retq596;597; AVX2-LABEL: splatvar_shift_v16i8:598; AVX2: # %bb.0:599; AVX2-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero600; AVX2-NEXT: vpsllw %xmm1, %xmm0, %xmm0601; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2602; AVX2-NEXT: vpsllw %xmm1, %xmm2, %xmm1603; AVX2-NEXT: vpbroadcastb %xmm1, %xmm1604; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0605; AVX2-NEXT: retq606;607; XOPAVX1-LABEL: splatvar_shift_v16i8:608; XOPAVX1: # %bb.0:609; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2610; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1611; XOPAVX1-NEXT: vpshlb %xmm1, %xmm0, %xmm0612; XOPAVX1-NEXT: retq613;614; XOPAVX2-LABEL: splatvar_shift_v16i8:615; XOPAVX2: # %bb.0:616; XOPAVX2-NEXT: vpbroadcastb %xmm1, %xmm1617; XOPAVX2-NEXT: vpshlb %xmm1, %xmm0, %xmm0618; XOPAVX2-NEXT: retq619;620; AVX512DQ-LABEL: splatvar_shift_v16i8:621; AVX512DQ: # %bb.0:622; AVX512DQ-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero623; 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,zero624; AVX512DQ-NEXT: vpslld %xmm1, %zmm0, %zmm0625; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0626; AVX512DQ-NEXT: vzeroupper627; AVX512DQ-NEXT: retq628;629; AVX512BW-LABEL: splatvar_shift_v16i8:630; AVX512BW: # %bb.0:631; AVX512BW-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero632; 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],zero633; AVX512BW-NEXT: vpsllw %xmm1, %ymm0, %ymm0634; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0635; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0636; AVX512BW-NEXT: vzeroupper637; AVX512BW-NEXT: retq638;639; AVX512DQVL-LABEL: splatvar_shift_v16i8:640; AVX512DQVL: # %bb.0:641; AVX512DQVL-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero642; 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,zero643; AVX512DQVL-NEXT: vpslld %xmm1, %zmm0, %zmm0644; AVX512DQVL-NEXT: vpmovdb %zmm0, %xmm0645; AVX512DQVL-NEXT: vzeroupper646; AVX512DQVL-NEXT: retq647;648; AVX512BWVL-LABEL: splatvar_shift_v16i8:649; AVX512BWVL: # %bb.0:650; AVX512BWVL-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero651; 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],zero652; AVX512BWVL-NEXT: vpsllw %xmm1, %ymm0, %ymm0653; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm0654; AVX512BWVL-NEXT: vzeroupper655; AVX512BWVL-NEXT: retq656;657; X86-SSE-LABEL: splatvar_shift_v16i8:658; X86-SSE: # %bb.0:659; X86-SSE-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]660; X86-SSE-NEXT: psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero661; X86-SSE-NEXT: psllw %xmm1, %xmm0662; X86-SSE-NEXT: pcmpeqd %xmm2, %xmm2663; X86-SSE-NEXT: psllw %xmm1, %xmm2664; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]665; X86-SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm2[0,0,0,0,4,5,6,7]666; X86-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]667; X86-SSE-NEXT: pand %xmm1, %xmm0668; X86-SSE-NEXT: retl669 %splat = shufflevector <16 x i8> %b, <16 x i8> poison, <16 x i32> zeroinitializer670 %shift = shl <16 x i8> %a, %splat671 ret <16 x i8> %shift672}673 674;675; Uniform Variable Modulo Shifts676;677 678define <2 x i64> @splatvar_modulo_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {679; SSE-LABEL: splatvar_modulo_shift_v2i64:680; SSE: # %bb.0:681; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1682; SSE-NEXT: psllq %xmm1, %xmm0683; SSE-NEXT: retq684;685; AVX-LABEL: splatvar_modulo_shift_v2i64:686; AVX: # %bb.0:687; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1688; AVX-NEXT: vpsllq %xmm1, %xmm0, %xmm0689; AVX-NEXT: retq690;691; XOP-LABEL: splatvar_modulo_shift_v2i64:692; XOP: # %bb.0:693; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1694; XOP-NEXT: vpsllq %xmm1, %xmm0, %xmm0695; XOP-NEXT: retq696;697; AVX512-LABEL: splatvar_modulo_shift_v2i64:698; AVX512: # %bb.0:699; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1700; AVX512-NEXT: vpsllq %xmm1, %xmm0, %xmm0701; AVX512-NEXT: retq702;703; AVX512VL-LABEL: splatvar_modulo_shift_v2i64:704; AVX512VL: # %bb.0:705; AVX512VL-NEXT: vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm1, %xmm1706; AVX512VL-NEXT: vpsllq %xmm1, %xmm0, %xmm0707; AVX512VL-NEXT: retq708;709; X86-SSE-LABEL: splatvar_modulo_shift_v2i64:710; X86-SSE: # %bb.0:711; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1712; X86-SSE-NEXT: psllq %xmm1, %xmm0713; X86-SSE-NEXT: retl714 %mod = and <2 x i64> %b, <i64 63, i64 63>715 %splat = shufflevector <2 x i64> %mod, <2 x i64> poison, <2 x i32> zeroinitializer716 %shift = shl <2 x i64> %a, %splat717 ret <2 x i64> %shift718}719 720define <4 x i32> @splatvar_modulo_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {721; SSE-LABEL: splatvar_modulo_shift_v4i32:722; SSE: # %bb.0:723; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1724; SSE-NEXT: pslld %xmm1, %xmm0725; SSE-NEXT: retq726;727; AVX-LABEL: splatvar_modulo_shift_v4i32:728; AVX: # %bb.0:729; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1730; AVX-NEXT: vpslld %xmm1, %xmm0, %xmm0731; AVX-NEXT: retq732;733; XOP-LABEL: splatvar_modulo_shift_v4i32:734; XOP: # %bb.0:735; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1736; XOP-NEXT: vpslld %xmm1, %xmm0, %xmm0737; XOP-NEXT: retq738;739; AVX512-LABEL: splatvar_modulo_shift_v4i32:740; AVX512: # %bb.0:741; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1742; AVX512-NEXT: vpslld %xmm1, %xmm0, %xmm0743; AVX512-NEXT: retq744;745; AVX512VL-LABEL: splatvar_modulo_shift_v4i32:746; AVX512VL: # %bb.0:747; AVX512VL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1748; AVX512VL-NEXT: vpslld %xmm1, %xmm0, %xmm0749; AVX512VL-NEXT: retq750;751; X86-SSE-LABEL: splatvar_modulo_shift_v4i32:752; X86-SSE: # %bb.0:753; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1754; X86-SSE-NEXT: pslld %xmm1, %xmm0755; X86-SSE-NEXT: retl756 %mod = and <4 x i32> %b, <i32 31, i32 31, i32 31, i32 31>757 %splat = shufflevector <4 x i32> %mod, <4 x i32> poison, <4 x i32> zeroinitializer758 %shift = shl <4 x i32> %a, %splat759 ret <4 x i32> %shift760}761 762define <8 x i16> @splatvar_modulo_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {763; SSE-LABEL: splatvar_modulo_shift_v8i16:764; SSE: # %bb.0:765; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1766; SSE-NEXT: psllw %xmm1, %xmm0767; SSE-NEXT: retq768;769; AVX-LABEL: splatvar_modulo_shift_v8i16:770; AVX: # %bb.0:771; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1772; AVX-NEXT: vpsllw %xmm1, %xmm0, %xmm0773; AVX-NEXT: retq774;775; XOP-LABEL: splatvar_modulo_shift_v8i16:776; XOP: # %bb.0:777; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1778; XOP-NEXT: vpsllw %xmm1, %xmm0, %xmm0779; XOP-NEXT: retq780;781; AVX512-LABEL: splatvar_modulo_shift_v8i16:782; AVX512: # %bb.0:783; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1784; AVX512-NEXT: vpsllw %xmm1, %xmm0, %xmm0785; AVX512-NEXT: retq786;787; AVX512VL-LABEL: splatvar_modulo_shift_v8i16:788; AVX512VL: # %bb.0:789; AVX512VL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1790; AVX512VL-NEXT: vpsllw %xmm1, %xmm0, %xmm0791; AVX512VL-NEXT: retq792;793; X86-SSE-LABEL: splatvar_modulo_shift_v8i16:794; X86-SSE: # %bb.0:795; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1796; X86-SSE-NEXT: psllw %xmm1, %xmm0797; X86-SSE-NEXT: retl798 %mod = and <8 x i16> %b, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>799 %splat = shufflevector <8 x i16> %mod, <8 x i16> poison, <8 x i32> zeroinitializer800 %shift = shl <8 x i16> %a, %splat801 ret <8 x i16> %shift802}803 804define <16 x i8> @splatvar_modulo_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {805; SSE2-LABEL: splatvar_modulo_shift_v16i8:806; SSE2: # %bb.0:807; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1808; SSE2-NEXT: psllw %xmm1, %xmm0809; SSE2-NEXT: pcmpeqd %xmm2, %xmm2810; SSE2-NEXT: psllw %xmm1, %xmm2811; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]812; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm2[0,0,0,0,4,5,6,7]813; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]814; SSE2-NEXT: pand %xmm1, %xmm0815; SSE2-NEXT: retq816;817; SSE41-LABEL: splatvar_modulo_shift_v16i8:818; SSE41: # %bb.0:819; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1820; SSE41-NEXT: psllw %xmm1, %xmm0821; SSE41-NEXT: pcmpeqd %xmm2, %xmm2822; SSE41-NEXT: psllw %xmm1, %xmm2823; SSE41-NEXT: pxor %xmm1, %xmm1824; SSE41-NEXT: pshufb %xmm1, %xmm2825; SSE41-NEXT: pand %xmm2, %xmm0826; SSE41-NEXT: retq827;828; AVX1-LABEL: splatvar_modulo_shift_v16i8:829; AVX1: # %bb.0:830; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1831; AVX1-NEXT: vpsllw %xmm1, %xmm0, %xmm0832; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2833; AVX1-NEXT: vpsllw %xmm1, %xmm2, %xmm1834; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2835; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1836; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0837; AVX1-NEXT: retq838;839; AVX2-LABEL: splatvar_modulo_shift_v16i8:840; AVX2: # %bb.0:841; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1842; AVX2-NEXT: vpsllw %xmm1, %xmm0, %xmm0843; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2844; AVX2-NEXT: vpsllw %xmm1, %xmm2, %xmm1845; AVX2-NEXT: vpbroadcastb %xmm1, %xmm1846; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0847; AVX2-NEXT: retq848;849; XOPAVX1-LABEL: splatvar_modulo_shift_v16i8:850; XOPAVX1: # %bb.0:851; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2852; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1853; XOPAVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1854; XOPAVX1-NEXT: vpshlb %xmm1, %xmm0, %xmm0855; XOPAVX1-NEXT: retq856;857; XOPAVX2-LABEL: splatvar_modulo_shift_v16i8:858; XOPAVX2: # %bb.0:859; XOPAVX2-NEXT: vpbroadcastb %xmm1, %xmm1860; XOPAVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1861; XOPAVX2-NEXT: vpshlb %xmm1, %xmm0, %xmm0862; XOPAVX2-NEXT: retq863;864; AVX512DQ-LABEL: splatvar_modulo_shift_v16i8:865; AVX512DQ: # %bb.0:866; AVX512DQ-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1867; 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,zero868; AVX512DQ-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero869; AVX512DQ-NEXT: vpslld %xmm1, %zmm0, %zmm0870; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0871; AVX512DQ-NEXT: vzeroupper872; AVX512DQ-NEXT: retq873;874; AVX512BW-LABEL: splatvar_modulo_shift_v16i8:875; AVX512BW: # %bb.0:876; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1877; 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],zero878; AVX512BW-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero879; AVX512BW-NEXT: vpsllw %xmm1, %ymm0, %ymm0880; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0881; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0882; AVX512BW-NEXT: vzeroupper883; AVX512BW-NEXT: retq884;885; AVX512DQVL-LABEL: splatvar_modulo_shift_v16i8:886; AVX512DQVL: # %bb.0:887; AVX512DQVL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1888; 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,zero889; AVX512DQVL-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero890; AVX512DQVL-NEXT: vpslld %xmm1, %zmm0, %zmm0891; AVX512DQVL-NEXT: vpmovdb %zmm0, %xmm0892; AVX512DQVL-NEXT: vzeroupper893; AVX512DQVL-NEXT: retq894;895; AVX512BWVL-LABEL: splatvar_modulo_shift_v16i8:896; AVX512BWVL: # %bb.0:897; AVX512BWVL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm1898; 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],zero899; AVX512BWVL-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero900; AVX512BWVL-NEXT: vpsllw %xmm1, %ymm0, %ymm0901; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm0902; AVX512BWVL-NEXT: vzeroupper903; AVX512BWVL-NEXT: retq904;905; X86-SSE-LABEL: splatvar_modulo_shift_v16i8:906; X86-SSE: # %bb.0:907; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1908; X86-SSE-NEXT: psllw %xmm1, %xmm0909; X86-SSE-NEXT: pcmpeqd %xmm2, %xmm2910; X86-SSE-NEXT: psllw %xmm1, %xmm2911; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]912; X86-SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm2[0,0,0,0,4,5,6,7]913; X86-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]914; X86-SSE-NEXT: pand %xmm1, %xmm0915; X86-SSE-NEXT: retl916 %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>917 %splat = shufflevector <16 x i8> %mod, <16 x i8> poison, <16 x i32> zeroinitializer918 %shift = shl <16 x i8> %a, %splat919 ret <16 x i8> %shift920}921 922;923; Constant Shifts924;925 926define <2 x i64> @constant_shift_v2i64(<2 x i64> %a) nounwind {927; SSE2-LABEL: constant_shift_v2i64:928; SSE2: # %bb.0:929; SSE2-NEXT: movdqa %xmm0, %xmm1930; SSE2-NEXT: paddq %xmm1, %xmm1931; SSE2-NEXT: psllq $7, %xmm0932; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]933; SSE2-NEXT: retq934;935; SSE41-LABEL: constant_shift_v2i64:936; SSE41: # %bb.0:937; SSE41-NEXT: movdqa %xmm0, %xmm1938; SSE41-NEXT: psllq $7, %xmm1939; SSE41-NEXT: paddq %xmm0, %xmm0940; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]941; SSE41-NEXT: retq942;943; AVX1-LABEL: constant_shift_v2i64:944; AVX1: # %bb.0:945; AVX1-NEXT: vpsllq $7, %xmm0, %xmm1946; AVX1-NEXT: vpaddq %xmm0, %xmm0, %xmm0947; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]948; AVX1-NEXT: retq949;950; AVX2-LABEL: constant_shift_v2i64:951; AVX2: # %bb.0:952; AVX2-NEXT: vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0953; AVX2-NEXT: retq954;955; XOPAVX1-LABEL: constant_shift_v2i64:956; XOPAVX1: # %bb.0:957; XOPAVX1-NEXT: vpshlq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0958; XOPAVX1-NEXT: retq959;960; XOPAVX2-LABEL: constant_shift_v2i64:961; XOPAVX2: # %bb.0:962; XOPAVX2-NEXT: vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0963; XOPAVX2-NEXT: retq964;965; AVX512-LABEL: constant_shift_v2i64:966; AVX512: # %bb.0:967; AVX512-NEXT: vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0968; AVX512-NEXT: retq969;970; AVX512VL-LABEL: constant_shift_v2i64:971; AVX512VL: # %bb.0:972; AVX512VL-NEXT: vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0973; AVX512VL-NEXT: retq974;975; X86-SSE-LABEL: constant_shift_v2i64:976; X86-SSE: # %bb.0:977; X86-SSE-NEXT: movdqa %xmm0, %xmm1978; X86-SSE-NEXT: paddq %xmm1, %xmm1979; X86-SSE-NEXT: psllq $7, %xmm0980; X86-SSE-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]981; X86-SSE-NEXT: retl982 %shift = shl <2 x i64> %a, <i64 1, i64 7>983 ret <2 x i64> %shift984}985 986define <4 x i32> @constant_shift_v4i32(<4 x i32> %a) nounwind {987; SSE2-LABEL: constant_shift_v4i32:988; SSE2: # %bb.0:989; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]990; SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [16,32,64,128]991; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]992; SSE2-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [32,u,128,u]993; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]994; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]995; SSE2-NEXT: retq996;997; SSE41-LABEL: constant_shift_v4i32:998; SSE41: # %bb.0:999; SSE41-NEXT: pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [16,32,64,128]1000; SSE41-NEXT: retq1001;1002; AVX1-LABEL: constant_shift_v4i32:1003; AVX1: # %bb.0:1004; AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [16,32,64,128]1005; AVX1-NEXT: retq1006;1007; AVX2-LABEL: constant_shift_v4i32:1008; AVX2: # %bb.0:1009; AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01010; AVX2-NEXT: retq1011;1012; XOPAVX1-LABEL: constant_shift_v4i32:1013; XOPAVX1: # %bb.0:1014; XOPAVX1-NEXT: vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01015; XOPAVX1-NEXT: retq1016;1017; XOPAVX2-LABEL: constant_shift_v4i32:1018; XOPAVX2: # %bb.0:1019; XOPAVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01020; XOPAVX2-NEXT: retq1021;1022; AVX512-LABEL: constant_shift_v4i32:1023; AVX512: # %bb.0:1024; AVX512-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01025; AVX512-NEXT: retq1026;1027; AVX512VL-LABEL: constant_shift_v4i32:1028; AVX512VL: # %bb.0:1029; AVX512VL-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01030; AVX512VL-NEXT: retq1031;1032; X86-SSE-LABEL: constant_shift_v4i32:1033; X86-SSE: # %bb.0:1034; X86-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]1035; X86-SSE-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [16,32,64,128]1036; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1037; X86-SSE-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 # [32,u,128,u]1038; X86-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]1039; X86-SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1040; X86-SSE-NEXT: retl1041 %shift = shl <4 x i32> %a, <i32 4, i32 5, i32 6, i32 7>1042 ret <4 x i32> %shift1043}1044 1045define <8 x i16> @constant_shift_v8i16(<8 x i16> %a) nounwind {1046; SSE-LABEL: constant_shift_v8i16:1047; SSE: # %bb.0:1048; SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [1,2,4,8,16,32,64,128]1049; SSE-NEXT: retq1050;1051; AVX-LABEL: constant_shift_v8i16:1052; AVX: # %bb.0:1053; AVX-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,2,4,8,16,32,64,128]1054; AVX-NEXT: retq1055;1056; XOP-LABEL: constant_shift_v8i16:1057; XOP: # %bb.0:1058; XOP-NEXT: vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01059; XOP-NEXT: retq1060;1061; AVX512DQ-LABEL: constant_shift_v8i16:1062; AVX512DQ: # %bb.0:1063; AVX512DQ-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,2,4,8,16,32,64,128]1064; AVX512DQ-NEXT: retq1065;1066; AVX512BW-LABEL: constant_shift_v8i16:1067; AVX512BW: # %bb.0:1068; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01069; AVX512BW-NEXT: vpmovsxbw {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7]1070; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm01071; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01072; AVX512BW-NEXT: vzeroupper1073; AVX512BW-NEXT: retq1074;1075; AVX512DQVL-LABEL: constant_shift_v8i16:1076; AVX512DQVL: # %bb.0:1077; AVX512DQVL-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,2,4,8,16,32,64,128]1078; AVX512DQVL-NEXT: retq1079;1080; AVX512BWVL-LABEL: constant_shift_v8i16:1081; AVX512BWVL: # %bb.0:1082; AVX512BWVL-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01083; AVX512BWVL-NEXT: retq1084;1085; X86-SSE-LABEL: constant_shift_v8i16:1086; X86-SSE: # %bb.0:1087; X86-SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [1,2,4,8,16,32,64,128]1088; X86-SSE-NEXT: retl1089 %shift = shl <8 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>1090 ret <8 x i16> %shift1091}1092 1093define <8 x i16> @constant_shift_v8i16_pairs(<8 x i16> %a) nounwind {1094; SSE-LABEL: constant_shift_v8i16_pairs:1095; SSE: # %bb.0:1096; SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [32,32,4,4,2,2,16,16]1097; SSE-NEXT: retq1098;1099; AVX1-LABEL: constant_shift_v8i16_pairs:1100; AVX1: # %bb.0:1101; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [32,32,4,4,2,2,16,16]1102; AVX1-NEXT: retq1103;1104; AVX2-LABEL: constant_shift_v8i16_pairs:1105; AVX2: # %bb.0:1106; AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01107; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01108; AVX2-NEXT: retq1109;1110; XOP-LABEL: constant_shift_v8i16_pairs:1111; XOP: # %bb.0:1112; XOP-NEXT: vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01113; XOP-NEXT: retq1114;1115; AVX512DQ-LABEL: constant_shift_v8i16_pairs:1116; AVX512DQ: # %bb.0:1117; AVX512DQ-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01118; AVX512DQ-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01119; AVX512DQ-NEXT: retq1120;1121; AVX512BW-LABEL: constant_shift_v8i16_pairs:1122; AVX512BW: # %bb.0:1123; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01124; AVX512BW-NEXT: vpmovsxbw {{.*#+}} xmm1 = [5,5,2,2,1,1,4,4]1125; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm01126; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01127; AVX512BW-NEXT: vzeroupper1128; AVX512BW-NEXT: retq1129;1130; AVX512DQVL-LABEL: constant_shift_v8i16_pairs:1131; AVX512DQVL: # %bb.0:1132; AVX512DQVL-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01133; AVX512DQVL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01134; AVX512DQVL-NEXT: retq1135;1136; AVX512BWVL-LABEL: constant_shift_v8i16_pairs:1137; AVX512BWVL: # %bb.0:1138; AVX512BWVL-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01139; AVX512BWVL-NEXT: retq1140;1141; X86-SSE-LABEL: constant_shift_v8i16_pairs:1142; X86-SSE: # %bb.0:1143; X86-SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [32,32,4,4,2,2,16,16]1144; X86-SSE-NEXT: retl1145 %shift = shl <8 x i16> %a, <i16 5, i16 5, i16 2, i16 2, i16 1, i16 1, i16 4, i16 4>1146 ret <8 x i16> %shift1147}1148 1149define <16 x i8> @constant_shift_v16i8(<16 x i8> %a) nounwind {1150; SSE2-LABEL: constant_shift_v16i8:1151; SSE2: # %bb.0:1152; SSE2-NEXT: movdqa %xmm0, %xmm11153; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1154; SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [128,u,64,u,32,u,16,u,8,u,4,u,2,u,1,u]1155; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]1156; SSE2-NEXT: pand %xmm2, %xmm11157; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1158; SSE2-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [1,u,2,u,4,u,8,u,16,u,32,u,64,u,128,u]1159; SSE2-NEXT: pand %xmm2, %xmm01160; SSE2-NEXT: packuswb %xmm1, %xmm01161; SSE2-NEXT: retq1162;1163; SSE41-LABEL: constant_shift_v16i8:1164; SSE41: # %bb.0:1165; SSE41-NEXT: movdqa %xmm0, %xmm11166; SSE41-NEXT: pmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [0,2,0,8,0,32,0,128,0,64,0,16,0,4,0,1]1167; SSE41-NEXT: psllw $8, %xmm11168; SSE41-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [1,2,4,8,16,32,64,128,128,64,32,16,8,4,2,1]1169; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01170; SSE41-NEXT: por %xmm1, %xmm01171; SSE41-NEXT: retq1172;1173; AVX1-LABEL: constant_shift_v16i8:1174; AVX1: # %bb.0:1175; AVX1-NEXT: vpmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [0,2,0,8,0,32,0,128,0,64,0,16,0,4,0,1]1176; AVX1-NEXT: vpsllw $8, %xmm1, %xmm11177; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1,2,4,8,16,32,64,128,128,64,32,16,8,4,2,1]1178; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01179; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm01180; AVX1-NEXT: retq1181;1182; AVX2-LABEL: constant_shift_v16i8:1183; AVX2: # %bb.0:1184; 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],zero1185; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [1,2,4,8,16,32,64,128,128,64,32,16,8,4,2,1]1186; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01187; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11188; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm01189; AVX2-NEXT: vzeroupper1190; AVX2-NEXT: retq1191;1192; XOP-LABEL: constant_shift_v16i8:1193; XOP: # %bb.0:1194; XOP-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01195; XOP-NEXT: retq1196;1197; AVX512DQ-LABEL: constant_shift_v16i8:1198; AVX512DQ: # %bb.0:1199; 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,zero1200; AVX512DQ-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm01201; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm01202; AVX512DQ-NEXT: vzeroupper1203; AVX512DQ-NEXT: retq1204;1205; AVX512BW-LABEL: constant_shift_v16i8:1206; AVX512BW: # %bb.0:1207; AVX512BW-NEXT: vpmovsxbw {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]1208; 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],zero1209; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm01210; AVX512BW-NEXT: vpmovwb %zmm0, %ymm01211; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01212; AVX512BW-NEXT: vzeroupper1213; AVX512BW-NEXT: retq1214;1215; AVX512DQVL-LABEL: constant_shift_v16i8:1216; AVX512DQVL: # %bb.0:1217; 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,zero1218; AVX512DQVL-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm01219; AVX512DQVL-NEXT: vpmovdb %zmm0, %xmm01220; AVX512DQVL-NEXT: vzeroupper1221; AVX512DQVL-NEXT: retq1222;1223; AVX512BWVL-LABEL: constant_shift_v16i8:1224; AVX512BWVL: # %bb.0:1225; 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],zero1226; AVX512BWVL-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01227; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm01228; AVX512BWVL-NEXT: vzeroupper1229; AVX512BWVL-NEXT: retq1230;1231; X86-SSE-LABEL: constant_shift_v16i8:1232; X86-SSE: # %bb.0:1233; X86-SSE-NEXT: movdqa %xmm0, %xmm11234; X86-SSE-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1235; X86-SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 # [128,u,64,u,32,u,16,u,8,u,4,u,2,u,1,u]1236; X86-SSE-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]1237; X86-SSE-NEXT: pand %xmm2, %xmm11238; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1239; X86-SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [1,u,2,u,4,u,8,u,16,u,32,u,64,u,128,u]1240; X86-SSE-NEXT: pand %xmm2, %xmm01241; X86-SSE-NEXT: packuswb %xmm1, %xmm01242; X86-SSE-NEXT: retl1243 %shift = shl <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>1244 ret <16 x i8> %shift1245}1246 1247define <16 x i8> @constant_shift_v16i8_pairs(<16 x i8> %a) nounwind {1248; SSE-LABEL: constant_shift_v16i8_pairs:1249; SSE: # %bb.0:1250; SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [8,128,64,4,128,1,128,2]1251; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01252; SSE-NEXT: retq1253;1254; AVX-LABEL: constant_shift_v16i8_pairs:1255; AVX: # %bb.0:1256; AVX-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [8,128,64,4,128,1,128,2]1257; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01258; AVX-NEXT: retq1259;1260; XOP-LABEL: constant_shift_v16i8_pairs:1261; XOP: # %bb.0:1262; XOP-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01263; XOP-NEXT: retq1264;1265; AVX512DQ-LABEL: constant_shift_v16i8_pairs:1266; AVX512DQ: # %bb.0:1267; AVX512DQ-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [8,128,64,4,128,1,128,2]1268; AVX512DQ-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01269; AVX512DQ-NEXT: retq1270;1271; AVX512BW-LABEL: constant_shift_v16i8_pairs:1272; AVX512BW: # %bb.0:1273; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01274; AVX512BW-NEXT: vpmovsxbw {{.*#+}} xmm1 = [3,7,6,2,7,0,7,1]1275; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm01276; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01277; AVX512BW-NEXT: vzeroupper1278; AVX512BW-NEXT: retq1279;1280; AVX512DQVL-LABEL: constant_shift_v16i8_pairs:1281; AVX512DQVL: # %bb.0:1282; AVX512DQVL-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [8,128,64,4,128,1,128,2]1283; AVX512DQVL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01284; AVX512DQVL-NEXT: retq1285;1286; AVX512BWVL-LABEL: constant_shift_v16i8_pairs:1287; AVX512BWVL: # %bb.0:1288; AVX512BWVL-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01289; AVX512BWVL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01290; AVX512BWVL-NEXT: retq1291;1292; X86-SSE-LABEL: constant_shift_v16i8_pairs:1293; X86-SSE: # %bb.0:1294; X86-SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [8,128,64,4,128,1,128,2]1295; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01296; X86-SSE-NEXT: retl1297 %shift = shl <16 x i8> %a, <i8 3, i8 3, i8 7, i8 7, i8 6, i8 6, i8 2, i8 2, i8 7, i8 7, i8 0, i8 0, i8 7, i8 7, i8 1, i8 1>1298 ret <16 x i8> %shift1299}1300 1301define <16 x i8> @constant_shift_v16i8_quads(<16 x i8> %a) nounwind {1302; SSE-LABEL: constant_shift_v16i8_quads:1303; SSE: # %bb.0:1304; SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [4,4,8,8,1,1,2,2]1305; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01306; SSE-NEXT: retq1307;1308; AVX1-LABEL: constant_shift_v16i8_quads:1309; AVX1: # %bb.0:1310; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [4,4,8,8,1,1,2,2]1311; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01312; AVX1-NEXT: retq1313;1314; AVX2-LABEL: constant_shift_v16i8_quads:1315; AVX2: # %bb.0:1316; AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01317; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01318; AVX2-NEXT: retq1319;1320; XOP-LABEL: constant_shift_v16i8_quads:1321; XOP: # %bb.0:1322; XOP-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01323; XOP-NEXT: retq1324;1325; AVX512-LABEL: constant_shift_v16i8_quads:1326; AVX512: # %bb.0:1327; AVX512-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01328; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01329; AVX512-NEXT: retq1330;1331; AVX512VL-LABEL: constant_shift_v16i8_quads:1332; AVX512VL: # %bb.0:1333; AVX512VL-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01334; AVX512VL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01335; AVX512VL-NEXT: retq1336;1337; X86-SSE-LABEL: constant_shift_v16i8_quads:1338; X86-SSE: # %bb.0:1339; X86-SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [4,4,8,8,1,1,2,2]1340; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01341; X86-SSE-NEXT: retl1342 %shift = shl <16 x i8> %a, <i8 2, i8 2, i8 2, i8 2, i8 3, i8 3, i8 3, i8 3, i8 0, i8 0, i8 0, i8 0, i8 1, i8 1, i8 1, i8 1>1343 ret <16 x i8> %shift1344}1345 1346;1347; Uniform Constant Shifts1348;1349 1350define <2 x i64> @splatconstant_shift_v2i64(<2 x i64> %a) nounwind {1351; SSE-LABEL: splatconstant_shift_v2i64:1352; SSE: # %bb.0:1353; SSE-NEXT: psllq $7, %xmm01354; SSE-NEXT: retq1355;1356; AVX-LABEL: splatconstant_shift_v2i64:1357; AVX: # %bb.0:1358; AVX-NEXT: vpsllq $7, %xmm0, %xmm01359; AVX-NEXT: retq1360;1361; XOP-LABEL: splatconstant_shift_v2i64:1362; XOP: # %bb.0:1363; XOP-NEXT: vpsllq $7, %xmm0, %xmm01364; XOP-NEXT: retq1365;1366; AVX512-LABEL: splatconstant_shift_v2i64:1367; AVX512: # %bb.0:1368; AVX512-NEXT: vpsllq $7, %xmm0, %xmm01369; AVX512-NEXT: retq1370;1371; AVX512VL-LABEL: splatconstant_shift_v2i64:1372; AVX512VL: # %bb.0:1373; AVX512VL-NEXT: vpsllq $7, %xmm0, %xmm01374; AVX512VL-NEXT: retq1375;1376; X86-SSE-LABEL: splatconstant_shift_v2i64:1377; X86-SSE: # %bb.0:1378; X86-SSE-NEXT: psllq $7, %xmm01379; X86-SSE-NEXT: retl1380 %shift = shl <2 x i64> %a, <i64 7, i64 7>1381 ret <2 x i64> %shift1382}1383 1384define <4 x i32> @splatconstant_shift_v4i32(<4 x i32> %a) nounwind {1385; SSE-LABEL: splatconstant_shift_v4i32:1386; SSE: # %bb.0:1387; SSE-NEXT: pslld $5, %xmm01388; SSE-NEXT: retq1389;1390; AVX-LABEL: splatconstant_shift_v4i32:1391; AVX: # %bb.0:1392; AVX-NEXT: vpslld $5, %xmm0, %xmm01393; AVX-NEXT: retq1394;1395; XOP-LABEL: splatconstant_shift_v4i32:1396; XOP: # %bb.0:1397; XOP-NEXT: vpslld $5, %xmm0, %xmm01398; XOP-NEXT: retq1399;1400; AVX512-LABEL: splatconstant_shift_v4i32:1401; AVX512: # %bb.0:1402; AVX512-NEXT: vpslld $5, %xmm0, %xmm01403; AVX512-NEXT: retq1404;1405; AVX512VL-LABEL: splatconstant_shift_v4i32:1406; AVX512VL: # %bb.0:1407; AVX512VL-NEXT: vpslld $5, %xmm0, %xmm01408; AVX512VL-NEXT: retq1409;1410; X86-SSE-LABEL: splatconstant_shift_v4i32:1411; X86-SSE: # %bb.0:1412; X86-SSE-NEXT: pslld $5, %xmm01413; X86-SSE-NEXT: retl1414 %shift = shl <4 x i32> %a, <i32 5, i32 5, i32 5, i32 5>1415 ret <4 x i32> %shift1416}1417 1418define <8 x i16> @splatconstant_shift_v8i16(<8 x i16> %a) nounwind {1419; SSE-LABEL: splatconstant_shift_v8i16:1420; SSE: # %bb.0:1421; SSE-NEXT: psllw $3, %xmm01422; SSE-NEXT: retq1423;1424; AVX-LABEL: splatconstant_shift_v8i16:1425; AVX: # %bb.0:1426; AVX-NEXT: vpsllw $3, %xmm0, %xmm01427; AVX-NEXT: retq1428;1429; XOP-LABEL: splatconstant_shift_v8i16:1430; XOP: # %bb.0:1431; XOP-NEXT: vpsllw $3, %xmm0, %xmm01432; XOP-NEXT: retq1433;1434; AVX512-LABEL: splatconstant_shift_v8i16:1435; AVX512: # %bb.0:1436; AVX512-NEXT: vpsllw $3, %xmm0, %xmm01437; AVX512-NEXT: retq1438;1439; AVX512VL-LABEL: splatconstant_shift_v8i16:1440; AVX512VL: # %bb.0:1441; AVX512VL-NEXT: vpsllw $3, %xmm0, %xmm01442; AVX512VL-NEXT: retq1443;1444; X86-SSE-LABEL: splatconstant_shift_v8i16:1445; X86-SSE: # %bb.0:1446; X86-SSE-NEXT: psllw $3, %xmm01447; X86-SSE-NEXT: retl1448 %shift = shl <8 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>1449 ret <8 x i16> %shift1450}1451 1452define <16 x i8> @splatconstant_shift_v16i8(<16 x i8> %a) nounwind {1453; SSE-LABEL: splatconstant_shift_v16i8:1454; SSE: # %bb.0:1455; SSE-NEXT: psllw $3, %xmm01456; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01457; SSE-NEXT: retq1458;1459; AVX-LABEL: splatconstant_shift_v16i8:1460; AVX: # %bb.0:1461; AVX-NEXT: vpsllw $3, %xmm0, %xmm01462; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01463; AVX-NEXT: retq1464;1465; XOP-LABEL: splatconstant_shift_v16i8:1466; XOP: # %bb.0:1467; XOP-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01468; XOP-NEXT: retq1469;1470; AVX512-LABEL: splatconstant_shift_v16i8:1471; AVX512: # %bb.0:1472; AVX512-NEXT: vpsllw $3, %xmm0, %xmm01473; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01474; AVX512-NEXT: retq1475;1476; AVX512VL-LABEL: splatconstant_shift_v16i8:1477; AVX512VL: # %bb.0:1478; AVX512VL-NEXT: vpsllw $3, %xmm0, %xmm01479; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm01480; AVX512VL-NEXT: retq1481;1482; X86-SSE-LABEL: splatconstant_shift_v16i8:1483; X86-SSE: # %bb.0:1484; X86-SSE-NEXT: psllw $3, %xmm01485; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01486; X86-SSE-NEXT: retl1487 %shift = shl <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>1488 ret <16 x i8> %shift1489}1490