2117 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX13; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX24; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=XOPAVX15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=XOPAVX26; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq | FileCheck %s --check-prefixes=AVX512,AVX512DQ7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefixes=AVX512VL,AVX512DQVL9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512VL,AVX512BWVL10;11; 32-bit runs to make sure we do reasonable things for i64 shifts.12; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=X86-AVX113; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=X86-AVX214 15;16; Variable Shifts17;18 19define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {20; AVX1-LABEL: var_shift_v4i64:21; AVX1: # %bb.0:22; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm223; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm324; AVX1-NEXT: vpsrlq %xmm2, %xmm3, %xmm425; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]26; AVX1-NEXT: vpsrlq %xmm2, %xmm3, %xmm227; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm4[0,1,2,3],xmm2[4,5,6,7]28; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm329; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]30; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm031; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]32; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm033; AVX1-NEXT: retq34;35; AVX2-LABEL: var_shift_v4i64:36; AVX2: # %bb.0:37; AVX2-NEXT: vpsrlvq %ymm1, %ymm0, %ymm038; AVX2-NEXT: retq39;40; XOPAVX1-LABEL: var_shift_v4i64:41; XOPAVX1: # %bb.0:42; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm243; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm344; XOPAVX1-NEXT: vpsubq %xmm2, %xmm3, %xmm245; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm446; XOPAVX1-NEXT: vpshlq %xmm2, %xmm4, %xmm247; XOPAVX1-NEXT: vpsubq %xmm1, %xmm3, %xmm148; XOPAVX1-NEXT: vpshlq %xmm1, %xmm0, %xmm049; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm050; XOPAVX1-NEXT: retq51;52; XOPAVX2-LABEL: var_shift_v4i64:53; XOPAVX2: # %bb.0:54; XOPAVX2-NEXT: vpsrlvq %ymm1, %ymm0, %ymm055; XOPAVX2-NEXT: retq56;57; AVX512-LABEL: var_shift_v4i64:58; AVX512: # %bb.0:59; AVX512-NEXT: vpsrlvq %ymm1, %ymm0, %ymm060; AVX512-NEXT: retq61;62; AVX512VL-LABEL: var_shift_v4i64:63; AVX512VL: # %bb.0:64; AVX512VL-NEXT: vpsrlvq %ymm1, %ymm0, %ymm065; AVX512VL-NEXT: retq66;67; X86-AVX1-LABEL: var_shift_v4i64:68; X86-AVX1: # %bb.0:69; X86-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm270; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm371; X86-AVX1-NEXT: vpsrlq %xmm2, %xmm3, %xmm472; X86-AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]73; X86-AVX1-NEXT: vpsrlq %xmm2, %xmm3, %xmm274; X86-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm4[0,1,2,3],xmm2[4,5,6,7]75; X86-AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm376; X86-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]77; X86-AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm078; X86-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]79; X86-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm080; X86-AVX1-NEXT: retl81;82; X86-AVX2-LABEL: var_shift_v4i64:83; X86-AVX2: # %bb.0:84; X86-AVX2-NEXT: vpsrlvq %ymm1, %ymm0, %ymm085; X86-AVX2-NEXT: retl86 %shift = lshr <4 x i64> %a, %b87 ret <4 x i64> %shift88}89 90define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {91; AVX1-LABEL: var_shift_v8i32:92; AVX1: # %bb.0:93; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm294; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm395; AVX1-NEXT: vpsrldq {{.*#+}} xmm4 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero96; AVX1-NEXT: vpsrld %xmm4, %xmm2, %xmm497; AVX1-NEXT: vpsrlq $32, %xmm3, %xmm598; AVX1-NEXT: vpsrld %xmm5, %xmm2, %xmm599; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]100; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5101; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]102; AVX1-NEXT: vpsrld %xmm6, %xmm2, %xmm6103; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero104; AVX1-NEXT: vpsrld %xmm3, %xmm2, %xmm2105; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7]106; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]107; AVX1-NEXT: vpsrldq {{.*#+}} xmm3 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero108; AVX1-NEXT: vpsrld %xmm3, %xmm0, %xmm3109; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm4110; AVX1-NEXT: vpsrld %xmm4, %xmm0, %xmm4111; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]112; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm4 = xmm1[2],xmm5[2],xmm1[3],xmm5[3]113; AVX1-NEXT: vpsrld %xmm4, %xmm0, %xmm4114; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero115; AVX1-NEXT: vpsrld %xmm1, %xmm0, %xmm0116; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]117; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]118; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0119; AVX1-NEXT: retq120;121; AVX2-LABEL: var_shift_v8i32:122; AVX2: # %bb.0:123; AVX2-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0124; AVX2-NEXT: retq125;126; XOPAVX1-LABEL: var_shift_v8i32:127; XOPAVX1: # %bb.0:128; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2129; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3130; XOPAVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm2131; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4132; XOPAVX1-NEXT: vpshld %xmm2, %xmm4, %xmm2133; XOPAVX1-NEXT: vpsubd %xmm1, %xmm3, %xmm1134; XOPAVX1-NEXT: vpshld %xmm1, %xmm0, %xmm0135; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0136; XOPAVX1-NEXT: retq137;138; XOPAVX2-LABEL: var_shift_v8i32:139; XOPAVX2: # %bb.0:140; XOPAVX2-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0141; XOPAVX2-NEXT: retq142;143; AVX512-LABEL: var_shift_v8i32:144; AVX512: # %bb.0:145; AVX512-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0146; AVX512-NEXT: retq147;148; AVX512VL-LABEL: var_shift_v8i32:149; AVX512VL: # %bb.0:150; AVX512VL-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0151; AVX512VL-NEXT: retq152;153; X86-AVX1-LABEL: var_shift_v8i32:154; X86-AVX1: # %bb.0:155; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2156; X86-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3157; X86-AVX1-NEXT: vpsrldq {{.*#+}} xmm4 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero158; X86-AVX1-NEXT: vpsrld %xmm4, %xmm2, %xmm4159; X86-AVX1-NEXT: vpsrlq $32, %xmm3, %xmm5160; X86-AVX1-NEXT: vpsrld %xmm5, %xmm2, %xmm5161; X86-AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]162; X86-AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5163; X86-AVX1-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]164; X86-AVX1-NEXT: vpsrld %xmm6, %xmm2, %xmm6165; X86-AVX1-NEXT: vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero166; X86-AVX1-NEXT: vpsrld %xmm3, %xmm2, %xmm2167; X86-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7]168; X86-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]169; X86-AVX1-NEXT: vpsrldq {{.*#+}} xmm3 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero170; X86-AVX1-NEXT: vpsrld %xmm3, %xmm0, %xmm3171; X86-AVX1-NEXT: vpsrlq $32, %xmm1, %xmm4172; X86-AVX1-NEXT: vpsrld %xmm4, %xmm0, %xmm4173; X86-AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]174; X86-AVX1-NEXT: vpunpckhdq {{.*#+}} xmm4 = xmm1[2],xmm5[2],xmm1[3],xmm5[3]175; X86-AVX1-NEXT: vpsrld %xmm4, %xmm0, %xmm4176; X86-AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero177; X86-AVX1-NEXT: vpsrld %xmm1, %xmm0, %xmm0178; X86-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]179; X86-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]180; X86-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0181; X86-AVX1-NEXT: retl182;183; X86-AVX2-LABEL: var_shift_v8i32:184; X86-AVX2: # %bb.0:185; X86-AVX2-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0186; X86-AVX2-NEXT: retl187 %shift = lshr <8 x i32> %a, %b188 ret <8 x i32> %shift189}190 191define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {192; AVX1-LABEL: var_shift_v16i16:193; AVX1: # %bb.0:194; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2195; AVX1-NEXT: vpsllw $12, %xmm2, %xmm3196; AVX1-NEXT: vpsllw $4, %xmm2, %xmm2197; AVX1-NEXT: vpor %xmm3, %xmm2, %xmm2198; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm3199; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4200; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm5201; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4202; AVX1-NEXT: vpsrlw $4, %xmm4, %xmm5203; AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm4, %xmm3204; AVX1-NEXT: vpsrlw $2, %xmm3, %xmm4205; AVX1-NEXT: vpsllw $2, %xmm2, %xmm5206; AVX1-NEXT: vpblendvb %xmm5, %xmm4, %xmm3, %xmm3207; AVX1-NEXT: vpsrlw $1, %xmm3, %xmm4208; AVX1-NEXT: vpsllw $3, %xmm2, %xmm2209; AVX1-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm2210; AVX1-NEXT: vpsllw $12, %xmm1, %xmm3211; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1212; AVX1-NEXT: vpor %xmm3, %xmm1, %xmm1213; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm3214; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm4215; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0216; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm4217; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm0, %xmm0218; AVX1-NEXT: vpsrlw $2, %xmm0, %xmm3219; AVX1-NEXT: vpsllw $2, %xmm1, %xmm4220; AVX1-NEXT: vpblendvb %xmm4, %xmm3, %xmm0, %xmm0221; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm3222; AVX1-NEXT: vpsllw $3, %xmm1, %xmm1223; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0224; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0225; AVX1-NEXT: retq226;227; AVX2-LABEL: var_shift_v16i16:228; AVX2: # %bb.0:229; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2230; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]231; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]232; AVX2-NEXT: vpsrlvd %ymm3, %ymm4, %ymm3233; AVX2-NEXT: vpsrld $16, %ymm3, %ymm3234; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]235; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]236; AVX2-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0237; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0238; AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0239; AVX2-NEXT: retq240;241; XOPAVX1-LABEL: var_shift_v16i16:242; XOPAVX1: # %bb.0:243; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2244; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3245; XOPAVX1-NEXT: vpsubw %xmm2, %xmm3, %xmm2246; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4247; XOPAVX1-NEXT: vpshlw %xmm2, %xmm4, %xmm2248; XOPAVX1-NEXT: vpsubw %xmm1, %xmm3, %xmm1249; XOPAVX1-NEXT: vpshlw %xmm1, %xmm0, %xmm0250; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0251; XOPAVX1-NEXT: retq252;253; XOPAVX2-LABEL: var_shift_v16i16:254; XOPAVX2: # %bb.0:255; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2256; XOPAVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3257; XOPAVX2-NEXT: vpsubw %xmm2, %xmm3, %xmm2258; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm4259; XOPAVX2-NEXT: vpshlw %xmm2, %xmm4, %xmm2260; XOPAVX2-NEXT: vpsubw %xmm1, %xmm3, %xmm1261; XOPAVX2-NEXT: vpshlw %xmm1, %xmm0, %xmm0262; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0263; XOPAVX2-NEXT: retq264;265; AVX512DQ-LABEL: var_shift_v16i16:266; AVX512DQ: # %bb.0:267; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero268; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero269; AVX512DQ-NEXT: vpsrlvd %zmm1, %zmm0, %zmm0270; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm0271; AVX512DQ-NEXT: retq272;273; AVX512BW-LABEL: var_shift_v16i16:274; AVX512BW: # %bb.0:275; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1276; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0277; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm0278; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0279; AVX512BW-NEXT: retq280;281; AVX512DQVL-LABEL: var_shift_v16i16:282; AVX512DQVL: # %bb.0:283; AVX512DQVL-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero284; AVX512DQVL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero285; AVX512DQVL-NEXT: vpsrlvd %zmm1, %zmm0, %zmm0286; AVX512DQVL-NEXT: vpmovdw %zmm0, %ymm0287; AVX512DQVL-NEXT: retq288;289; AVX512BWVL-LABEL: var_shift_v16i16:290; AVX512BWVL: # %bb.0:291; AVX512BWVL-NEXT: vpsrlvw %ymm1, %ymm0, %ymm0292; AVX512BWVL-NEXT: retq293;294; X86-AVX1-LABEL: var_shift_v16i16:295; X86-AVX1: # %bb.0:296; X86-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2297; X86-AVX1-NEXT: vpsllw $12, %xmm2, %xmm3298; X86-AVX1-NEXT: vpsllw $4, %xmm2, %xmm2299; X86-AVX1-NEXT: vpor %xmm3, %xmm2, %xmm2300; X86-AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm3301; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4302; X86-AVX1-NEXT: vpsrlw $8, %xmm4, %xmm5303; X86-AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4304; X86-AVX1-NEXT: vpsrlw $4, %xmm4, %xmm5305; X86-AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm4, %xmm3306; X86-AVX1-NEXT: vpsrlw $2, %xmm3, %xmm4307; X86-AVX1-NEXT: vpsllw $2, %xmm2, %xmm5308; X86-AVX1-NEXT: vpblendvb %xmm5, %xmm4, %xmm3, %xmm3309; X86-AVX1-NEXT: vpsrlw $1, %xmm3, %xmm4310; X86-AVX1-NEXT: vpsllw $3, %xmm2, %xmm2311; X86-AVX1-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm2312; X86-AVX1-NEXT: vpsllw $12, %xmm1, %xmm3313; X86-AVX1-NEXT: vpsllw $4, %xmm1, %xmm1314; X86-AVX1-NEXT: vpor %xmm3, %xmm1, %xmm1315; X86-AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm3316; X86-AVX1-NEXT: vpsrlw $8, %xmm0, %xmm4317; X86-AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0318; X86-AVX1-NEXT: vpsrlw $4, %xmm0, %xmm4319; X86-AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm0, %xmm0320; X86-AVX1-NEXT: vpsrlw $2, %xmm0, %xmm3321; X86-AVX1-NEXT: vpsllw $2, %xmm1, %xmm4322; X86-AVX1-NEXT: vpblendvb %xmm4, %xmm3, %xmm0, %xmm0323; X86-AVX1-NEXT: vpsrlw $1, %xmm0, %xmm3324; X86-AVX1-NEXT: vpsllw $3, %xmm1, %xmm1325; X86-AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0326; X86-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0327; X86-AVX1-NEXT: retl328;329; X86-AVX2-LABEL: var_shift_v16i16:330; X86-AVX2: # %bb.0:331; X86-AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2332; X86-AVX2-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]333; X86-AVX2-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]334; X86-AVX2-NEXT: vpsrlvd %ymm3, %ymm4, %ymm3335; X86-AVX2-NEXT: vpsrld $16, %ymm3, %ymm3336; X86-AVX2-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]337; X86-AVX2-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]338; X86-AVX2-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0339; X86-AVX2-NEXT: vpsrld $16, %ymm0, %ymm0340; X86-AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0341; X86-AVX2-NEXT: retl342 %shift = lshr <16 x i16> %a, %b343 ret <16 x i16> %shift344}345 346define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {347; AVX1-LABEL: var_shift_v32i8:348; AVX1: # %bb.0:349; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2350; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm3351; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]352; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3353; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5354; AVX1-NEXT: vpsllw $5, %xmm5, %xmm5355; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2356; AVX1-NEXT: vpsrlw $2, %xmm2, %xmm3357; AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]358; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3359; AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5360; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2361; AVX1-NEXT: vpsrlw $1, %xmm2, %xmm3362; AVX1-NEXT: vbroadcastss {{.*#+}} xmm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]363; AVX1-NEXT: vpand %xmm7, %xmm3, %xmm3364; AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5365; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2366; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm3367; AVX1-NEXT: vpand %xmm4, %xmm3, %xmm3368; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1369; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0370; AVX1-NEXT: vpsrlw $2, %xmm0, %xmm3371; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3372; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1373; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0374; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm3375; AVX1-NEXT: vpand %xmm7, %xmm3, %xmm3376; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1377; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0378; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0379; AVX1-NEXT: retq380;381; AVX2-LABEL: var_shift_v32i8:382; AVX2: # %bb.0:383; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1384; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm2385; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2386; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0387; AVX2-NEXT: vpsrlw $2, %ymm0, %ymm2388; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2389; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1390; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0391; AVX2-NEXT: vpsrlw $1, %ymm0, %ymm2392; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2393; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1394; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0395; AVX2-NEXT: retq396;397; XOPAVX1-LABEL: var_shift_v32i8:398; XOPAVX1: # %bb.0:399; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2400; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3401; XOPAVX1-NEXT: vpsubb %xmm2, %xmm3, %xmm2402; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4403; XOPAVX1-NEXT: vpshlb %xmm2, %xmm4, %xmm2404; XOPAVX1-NEXT: vpsubb %xmm1, %xmm3, %xmm1405; XOPAVX1-NEXT: vpshlb %xmm1, %xmm0, %xmm0406; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0407; XOPAVX1-NEXT: retq408;409; XOPAVX2-LABEL: var_shift_v32i8:410; XOPAVX2: # %bb.0:411; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2412; XOPAVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3413; XOPAVX2-NEXT: vpsubb %xmm2, %xmm3, %xmm2414; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm4415; XOPAVX2-NEXT: vpshlb %xmm2, %xmm4, %xmm2416; XOPAVX2-NEXT: vpsubb %xmm1, %xmm3, %xmm1417; XOPAVX2-NEXT: vpshlb %xmm1, %xmm0, %xmm0418; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0419; XOPAVX2-NEXT: retq420;421; AVX512DQ-LABEL: var_shift_v32i8:422; AVX512DQ: # %bb.0:423; AVX512DQ-NEXT: vpsllw $5, %ymm1, %ymm1424; AVX512DQ-NEXT: vpsrlw $4, %ymm0, %ymm2425; AVX512DQ-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2426; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0427; AVX512DQ-NEXT: vpsrlw $2, %ymm0, %ymm2428; AVX512DQ-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2429; AVX512DQ-NEXT: vpaddb %ymm1, %ymm1, %ymm1430; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0431; AVX512DQ-NEXT: vpsrlw $1, %ymm0, %ymm2432; AVX512DQ-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2433; AVX512DQ-NEXT: vpaddb %ymm1, %ymm1, %ymm1434; AVX512DQ-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0435; AVX512DQ-NEXT: retq436;437; AVX512BW-LABEL: var_shift_v32i8:438; AVX512BW: # %bb.0:439; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero440; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero441; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm0442; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0443; AVX512BW-NEXT: retq444;445; AVX512DQVL-LABEL: var_shift_v32i8:446; AVX512DQVL: # %bb.0:447; AVX512DQVL-NEXT: vpsllw $5, %ymm1, %ymm1448; AVX512DQVL-NEXT: vpsrlw $4, %ymm0, %ymm2449; AVX512DQVL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm2450; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0451; AVX512DQVL-NEXT: vpsrlw $2, %ymm0, %ymm2452; AVX512DQVL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm2453; AVX512DQVL-NEXT: vpaddb %ymm1, %ymm1, %ymm1454; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0455; AVX512DQVL-NEXT: vpsrlw $1, %ymm0, %ymm2456; AVX512DQVL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm2457; AVX512DQVL-NEXT: vpaddb %ymm1, %ymm1, %ymm1458; AVX512DQVL-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0459; AVX512DQVL-NEXT: retq460;461; AVX512BWVL-LABEL: var_shift_v32i8:462; AVX512BWVL: # %bb.0:463; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero464; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero465; AVX512BWVL-NEXT: vpsrlvw %zmm1, %zmm0, %zmm0466; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm0467; AVX512BWVL-NEXT: retq468;469; X86-AVX1-LABEL: var_shift_v32i8:470; X86-AVX1: # %bb.0:471; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3472; X86-AVX1-NEXT: vpsrlw $4, %xmm3, %xmm4473; X86-AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]474; X86-AVX1-NEXT: vpand %xmm2, %xmm4, %xmm4475; X86-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5476; X86-AVX1-NEXT: vpsllw $5, %xmm5, %xmm5477; X86-AVX1-NEXT: vpblendvb %xmm5, %xmm4, %xmm3, %xmm3478; X86-AVX1-NEXT: vpsrlw $2, %xmm3, %xmm4479; X86-AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]480; X86-AVX1-NEXT: vpand %xmm6, %xmm4, %xmm4481; X86-AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5482; X86-AVX1-NEXT: vpblendvb %xmm5, %xmm4, %xmm3, %xmm3483; X86-AVX1-NEXT: vpsrlw $1, %xmm3, %xmm4484; X86-AVX1-NEXT: vbroadcastss {{.*#+}} xmm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]485; X86-AVX1-NEXT: vpand %xmm7, %xmm4, %xmm4486; X86-AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5487; X86-AVX1-NEXT: vpblendvb %xmm5, %xmm4, %xmm3, %xmm3488; X86-AVX1-NEXT: vpsrlw $4, %xmm0, %xmm4489; X86-AVX1-NEXT: vpand %xmm2, %xmm4, %xmm2490; X86-AVX1-NEXT: vpsllw $5, %xmm1, %xmm1491; X86-AVX1-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0492; X86-AVX1-NEXT: vpsrlw $2, %xmm0, %xmm2493; X86-AVX1-NEXT: vpand %xmm6, %xmm2, %xmm2494; X86-AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1495; X86-AVX1-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0496; X86-AVX1-NEXT: vpsrlw $1, %xmm0, %xmm2497; X86-AVX1-NEXT: vpand %xmm7, %xmm2, %xmm2498; X86-AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1499; X86-AVX1-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0500; X86-AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0501; X86-AVX1-NEXT: retl502;503; X86-AVX2-LABEL: var_shift_v32i8:504; X86-AVX2: # %bb.0:505; X86-AVX2-NEXT: vpsllw $5, %ymm1, %ymm1506; X86-AVX2-NEXT: vpsrlw $4, %ymm0, %ymm2507; X86-AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}, %ymm2, %ymm2508; X86-AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0509; X86-AVX2-NEXT: vpsrlw $2, %ymm0, %ymm2510; X86-AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}, %ymm2, %ymm2511; X86-AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1512; X86-AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0513; X86-AVX2-NEXT: vpsrlw $1, %ymm0, %ymm2514; X86-AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}, %ymm2, %ymm2515; X86-AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1516; X86-AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0517; X86-AVX2-NEXT: retl518 %shift = lshr <32 x i8> %a, %b519 ret <32 x i8> %shift520}521 522;523; Uniform Variable Shifts524;525 526define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {527; AVX1-LABEL: splatvar_shift_v4i64:528; AVX1: # %bb.0:529; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2530; AVX1-NEXT: vpsrlq %xmm1, %xmm2, %xmm2531; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm0532; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0533; AVX1-NEXT: retq534;535; AVX2-LABEL: splatvar_shift_v4i64:536; AVX2: # %bb.0:537; AVX2-NEXT: vpsrlq %xmm1, %ymm0, %ymm0538; AVX2-NEXT: retq539;540; XOPAVX1-LABEL: splatvar_shift_v4i64:541; XOPAVX1: # %bb.0:542; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2543; XOPAVX1-NEXT: vpsrlq %xmm1, %xmm2, %xmm2544; XOPAVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm0545; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0546; XOPAVX1-NEXT: retq547;548; XOPAVX2-LABEL: splatvar_shift_v4i64:549; XOPAVX2: # %bb.0:550; XOPAVX2-NEXT: vpsrlq %xmm1, %ymm0, %ymm0551; XOPAVX2-NEXT: retq552;553; AVX512-LABEL: splatvar_shift_v4i64:554; AVX512: # %bb.0:555; AVX512-NEXT: vpsrlq %xmm1, %ymm0, %ymm0556; AVX512-NEXT: retq557;558; AVX512VL-LABEL: splatvar_shift_v4i64:559; AVX512VL: # %bb.0:560; AVX512VL-NEXT: vpsrlq %xmm1, %ymm0, %ymm0561; AVX512VL-NEXT: retq562;563; X86-AVX1-LABEL: splatvar_shift_v4i64:564; X86-AVX1: # %bb.0:565; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2566; X86-AVX1-NEXT: vpsrlq %xmm1, %xmm2, %xmm2567; X86-AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm0568; X86-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0569; X86-AVX1-NEXT: retl570;571; X86-AVX2-LABEL: splatvar_shift_v4i64:572; X86-AVX2: # %bb.0:573; X86-AVX2-NEXT: vpsrlq %xmm1, %ymm0, %ymm0574; X86-AVX2-NEXT: retl575 %splat = shufflevector <4 x i64> %b, <4 x i64> poison, <4 x i32> zeroinitializer576 %shift = lshr <4 x i64> %a, %splat577 ret <4 x i64> %shift578}579 580define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {581; AVX1-LABEL: splatvar_shift_v8i32:582; AVX1: # %bb.0:583; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2584; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero585; AVX1-NEXT: vpsrld %xmm1, %xmm2, %xmm2586; AVX1-NEXT: vpsrld %xmm1, %xmm0, %xmm0587; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0588; AVX1-NEXT: retq589;590; AVX2-LABEL: splatvar_shift_v8i32:591; AVX2: # %bb.0:592; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero593; AVX2-NEXT: vpsrld %xmm1, %ymm0, %ymm0594; AVX2-NEXT: retq595;596; XOPAVX1-LABEL: splatvar_shift_v8i32:597; XOPAVX1: # %bb.0:598; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2599; XOPAVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero600; XOPAVX1-NEXT: vpsrld %xmm1, %xmm2, %xmm2601; XOPAVX1-NEXT: vpsrld %xmm1, %xmm0, %xmm0602; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0603; XOPAVX1-NEXT: retq604;605; XOPAVX2-LABEL: splatvar_shift_v8i32:606; XOPAVX2: # %bb.0:607; XOPAVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero608; XOPAVX2-NEXT: vpsrld %xmm1, %ymm0, %ymm0609; XOPAVX2-NEXT: retq610;611; AVX512-LABEL: splatvar_shift_v8i32:612; AVX512: # %bb.0:613; AVX512-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero614; AVX512-NEXT: vpsrld %xmm1, %ymm0, %ymm0615; AVX512-NEXT: retq616;617; AVX512VL-LABEL: splatvar_shift_v8i32:618; AVX512VL: # %bb.0:619; AVX512VL-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero620; AVX512VL-NEXT: vpsrld %xmm1, %ymm0, %ymm0621; AVX512VL-NEXT: retq622;623; X86-AVX1-LABEL: splatvar_shift_v8i32:624; X86-AVX1: # %bb.0:625; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2626; X86-AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero627; X86-AVX1-NEXT: vpsrld %xmm1, %xmm2, %xmm2628; X86-AVX1-NEXT: vpsrld %xmm1, %xmm0, %xmm0629; X86-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0630; X86-AVX1-NEXT: retl631;632; X86-AVX2-LABEL: splatvar_shift_v8i32:633; X86-AVX2: # %bb.0:634; X86-AVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero635; X86-AVX2-NEXT: vpsrld %xmm1, %ymm0, %ymm0636; X86-AVX2-NEXT: retl637 %splat = shufflevector <8 x i32> %b, <8 x i32> poison, <8 x i32> zeroinitializer638 %shift = lshr <8 x i32> %a, %splat639 ret <8 x i32> %shift640}641 642define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {643; AVX1-LABEL: splatvar_shift_v16i16:644; AVX1: # %bb.0:645; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2646; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero647; AVX1-NEXT: vpsrlw %xmm1, %xmm2, %xmm2648; AVX1-NEXT: vpsrlw %xmm1, %xmm0, %xmm0649; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0650; AVX1-NEXT: retq651;652; AVX2-LABEL: splatvar_shift_v16i16:653; AVX2: # %bb.0:654; AVX2-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero655; AVX2-NEXT: vpsrlw %xmm1, %ymm0, %ymm0656; AVX2-NEXT: retq657;658; XOPAVX1-LABEL: splatvar_shift_v16i16:659; XOPAVX1: # %bb.0:660; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2661; XOPAVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero662; XOPAVX1-NEXT: vpsrlw %xmm1, %xmm2, %xmm2663; XOPAVX1-NEXT: vpsrlw %xmm1, %xmm0, %xmm0664; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0665; XOPAVX1-NEXT: retq666;667; XOPAVX2-LABEL: splatvar_shift_v16i16:668; XOPAVX2: # %bb.0:669; XOPAVX2-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero670; XOPAVX2-NEXT: vpsrlw %xmm1, %ymm0, %ymm0671; XOPAVX2-NEXT: retq672;673; AVX512-LABEL: splatvar_shift_v16i16:674; AVX512: # %bb.0:675; AVX512-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero676; AVX512-NEXT: vpsrlw %xmm1, %ymm0, %ymm0677; AVX512-NEXT: retq678;679; AVX512VL-LABEL: splatvar_shift_v16i16:680; AVX512VL: # %bb.0:681; AVX512VL-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero682; AVX512VL-NEXT: vpsrlw %xmm1, %ymm0, %ymm0683; AVX512VL-NEXT: retq684;685; X86-AVX1-LABEL: splatvar_shift_v16i16:686; X86-AVX1: # %bb.0:687; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2688; X86-AVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero689; X86-AVX1-NEXT: vpsrlw %xmm1, %xmm2, %xmm2690; X86-AVX1-NEXT: vpsrlw %xmm1, %xmm0, %xmm0691; X86-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0692; X86-AVX1-NEXT: retl693;694; X86-AVX2-LABEL: splatvar_shift_v16i16:695; X86-AVX2: # %bb.0:696; X86-AVX2-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero697; X86-AVX2-NEXT: vpsrlw %xmm1, %ymm0, %ymm0698; X86-AVX2-NEXT: retl699 %splat = shufflevector <16 x i16> %b, <16 x i16> poison, <16 x i32> zeroinitializer700 %shift = lshr <16 x i16> %a, %splat701 ret <16 x i16> %shift702}703 704define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {705; AVX1-LABEL: splatvar_shift_v32i8:706; AVX1: # %bb.0:707; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2708; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero709; AVX1-NEXT: vpsrlw %xmm1, %xmm2, %xmm2710; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3711; AVX1-NEXT: vpsrlw %xmm1, %xmm3, %xmm3712; AVX1-NEXT: vpshufb {{.*#+}} xmm3 = xmm3[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]713; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2714; AVX1-NEXT: vpsrlw %xmm1, %xmm0, %xmm0715; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0716; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0717; AVX1-NEXT: retq718;719; AVX2-LABEL: splatvar_shift_v32i8:720; AVX2: # %bb.0:721; AVX2-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero722; AVX2-NEXT: vpsrlw %xmm1, %ymm0, %ymm0723; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2724; AVX2-NEXT: vpsrlw %xmm1, %xmm2, %xmm1725; AVX2-NEXT: vpsrlw $8, %xmm1, %xmm1726; AVX2-NEXT: vpbroadcastb %xmm1, %ymm1727; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0728; AVX2-NEXT: retq729;730; XOPAVX1-LABEL: splatvar_shift_v32i8:731; XOPAVX1: # %bb.0:732; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2733; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1734; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1735; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2736; XOPAVX1-NEXT: vpshlb %xmm1, %xmm2, %xmm2737; XOPAVX1-NEXT: vpshlb %xmm1, %xmm0, %xmm0738; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0739; XOPAVX1-NEXT: retq740;741; XOPAVX2-LABEL: splatvar_shift_v32i8:742; XOPAVX2: # %bb.0:743; XOPAVX2-NEXT: vpbroadcastb %xmm1, %xmm1744; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2745; XOPAVX2-NEXT: vpsubb %xmm1, %xmm2, %xmm1746; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2747; XOPAVX2-NEXT: vpshlb %xmm1, %xmm2, %xmm2748; XOPAVX2-NEXT: vpshlb %xmm1, %xmm0, %xmm0749; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0750; XOPAVX2-NEXT: retq751;752; AVX512DQ-LABEL: splatvar_shift_v32i8:753; AVX512DQ: # %bb.0:754; AVX512DQ-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero755; AVX512DQ-NEXT: vpsrlw %xmm1, %ymm0, %ymm0756; AVX512DQ-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2757; AVX512DQ-NEXT: vpsrlw %xmm1, %xmm2, %xmm1758; AVX512DQ-NEXT: vpsrlw $8, %xmm1, %xmm1759; AVX512DQ-NEXT: vpbroadcastb %xmm1, %ymm1760; AVX512DQ-NEXT: vpand %ymm1, %ymm0, %ymm0761; AVX512DQ-NEXT: retq762;763; AVX512BW-LABEL: splatvar_shift_v32i8:764; AVX512BW: # %bb.0:765; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero766; AVX512BW-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero767; AVX512BW-NEXT: vpsrlw %xmm1, %zmm0, %zmm0768; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0769; AVX512BW-NEXT: retq770;771; AVX512DQVL-LABEL: splatvar_shift_v32i8:772; AVX512DQVL: # %bb.0:773; AVX512DQVL-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero774; AVX512DQVL-NEXT: vpsrlw %xmm1, %ymm0, %ymm0775; AVX512DQVL-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2776; AVX512DQVL-NEXT: vpsrlw %xmm1, %xmm2, %xmm1777; AVX512DQVL-NEXT: vpsrlw $8, %xmm1, %xmm1778; AVX512DQVL-NEXT: vpbroadcastb %xmm1, %ymm1779; AVX512DQVL-NEXT: vpand %ymm1, %ymm0, %ymm0780; AVX512DQVL-NEXT: retq781;782; AVX512BWVL-LABEL: splatvar_shift_v32i8:783; AVX512BWVL: # %bb.0:784; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero785; AVX512BWVL-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero786; AVX512BWVL-NEXT: vpsrlw %xmm1, %zmm0, %zmm0787; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm0788; AVX512BWVL-NEXT: retq789;790; X86-AVX1-LABEL: splatvar_shift_v32i8:791; X86-AVX1: # %bb.0:792; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2793; X86-AVX1-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero794; X86-AVX1-NEXT: vpsrlw %xmm1, %xmm2, %xmm2795; X86-AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3796; X86-AVX1-NEXT: vpsrlw %xmm1, %xmm3, %xmm3797; X86-AVX1-NEXT: vpshufb {{.*#+}} xmm3 = xmm3[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]798; X86-AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2799; X86-AVX1-NEXT: vpsrlw %xmm1, %xmm0, %xmm0800; X86-AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0801; X86-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0802; X86-AVX1-NEXT: retl803;804; X86-AVX2-LABEL: splatvar_shift_v32i8:805; X86-AVX2: # %bb.0:806; X86-AVX2-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero807; X86-AVX2-NEXT: vpsrlw %xmm1, %ymm0, %ymm0808; X86-AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2809; X86-AVX2-NEXT: vpsrlw %xmm1, %xmm2, %xmm1810; X86-AVX2-NEXT: vpsrlw $8, %xmm1, %xmm1811; X86-AVX2-NEXT: vpbroadcastb %xmm1, %ymm1812; X86-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0813; X86-AVX2-NEXT: retl814 %splat = shufflevector <32 x i8> %b, <32 x i8> poison, <32 x i32> zeroinitializer815 %shift = lshr <32 x i8> %a, %splat816 ret <32 x i8> %shift817}818 819;820; Uniform Variable Modulo Shifts821;822 823define <4 x i64> @splatvar_modulo_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {824; AVX1-LABEL: splatvar_modulo_shift_v4i64:825; AVX1: # %bb.0:826; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2827; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1828; AVX1-NEXT: vpsrlq %xmm1, %xmm2, %xmm2829; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm0830; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0831; AVX1-NEXT: retq832;833; AVX2-LABEL: splatvar_modulo_shift_v4i64:834; AVX2: # %bb.0:835; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1836; AVX2-NEXT: vpsrlq %xmm1, %ymm0, %ymm0837; AVX2-NEXT: retq838;839; XOPAVX1-LABEL: splatvar_modulo_shift_v4i64:840; XOPAVX1: # %bb.0:841; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2842; XOPAVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1843; XOPAVX1-NEXT: vpsrlq %xmm1, %xmm2, %xmm2844; XOPAVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm0845; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0846; XOPAVX1-NEXT: retq847;848; XOPAVX2-LABEL: splatvar_modulo_shift_v4i64:849; XOPAVX2: # %bb.0:850; XOPAVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1851; XOPAVX2-NEXT: vpsrlq %xmm1, %ymm0, %ymm0852; XOPAVX2-NEXT: retq853;854; AVX512-LABEL: splatvar_modulo_shift_v4i64:855; AVX512: # %bb.0:856; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1857; AVX512-NEXT: vpsrlq %xmm1, %ymm0, %ymm0858; AVX512-NEXT: retq859;860; AVX512VL-LABEL: splatvar_modulo_shift_v4i64:861; AVX512VL: # %bb.0:862; AVX512VL-NEXT: vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm1, %xmm1863; AVX512VL-NEXT: vpsrlq %xmm1, %ymm0, %ymm0864; AVX512VL-NEXT: retq865;866; X86-AVX1-LABEL: splatvar_modulo_shift_v4i64:867; X86-AVX1: # %bb.0:868; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2869; X86-AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1870; X86-AVX1-NEXT: vpsrlq %xmm1, %xmm2, %xmm2871; X86-AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm0872; X86-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0873; X86-AVX1-NEXT: retl874;875; X86-AVX2-LABEL: splatvar_modulo_shift_v4i64:876; X86-AVX2: # %bb.0:877; X86-AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1878; X86-AVX2-NEXT: vpsrlq %xmm1, %ymm0, %ymm0879; X86-AVX2-NEXT: retl880 %mod = and <4 x i64> %b, <i64 63, i64 63, i64 63, i64 63>881 %splat = shufflevector <4 x i64> %mod, <4 x i64> poison, <4 x i32> zeroinitializer882 %shift = lshr <4 x i64> %a, %splat883 ret <4 x i64> %shift884}885 886define <8 x i32> @splatvar_modulo_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {887; AVX1-LABEL: splatvar_modulo_shift_v8i32:888; AVX1: # %bb.0:889; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2890; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1891; AVX1-NEXT: vpsrld %xmm1, %xmm2, %xmm2892; AVX1-NEXT: vpsrld %xmm1, %xmm0, %xmm0893; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0894; AVX1-NEXT: retq895;896; AVX2-LABEL: splatvar_modulo_shift_v8i32:897; AVX2: # %bb.0:898; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1899; AVX2-NEXT: vpsrld %xmm1, %ymm0, %ymm0900; AVX2-NEXT: retq901;902; XOPAVX1-LABEL: splatvar_modulo_shift_v8i32:903; XOPAVX1: # %bb.0:904; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2905; XOPAVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1906; XOPAVX1-NEXT: vpsrld %xmm1, %xmm2, %xmm2907; XOPAVX1-NEXT: vpsrld %xmm1, %xmm0, %xmm0908; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0909; XOPAVX1-NEXT: retq910;911; XOPAVX2-LABEL: splatvar_modulo_shift_v8i32:912; XOPAVX2: # %bb.0:913; XOPAVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1914; XOPAVX2-NEXT: vpsrld %xmm1, %ymm0, %ymm0915; XOPAVX2-NEXT: retq916;917; AVX512-LABEL: splatvar_modulo_shift_v8i32:918; AVX512: # %bb.0:919; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1920; AVX512-NEXT: vpsrld %xmm1, %ymm0, %ymm0921; AVX512-NEXT: retq922;923; AVX512VL-LABEL: splatvar_modulo_shift_v8i32:924; AVX512VL: # %bb.0:925; AVX512VL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1926; AVX512VL-NEXT: vpsrld %xmm1, %ymm0, %ymm0927; AVX512VL-NEXT: retq928;929; X86-AVX1-LABEL: splatvar_modulo_shift_v8i32:930; X86-AVX1: # %bb.0:931; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2932; X86-AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1933; X86-AVX1-NEXT: vpsrld %xmm1, %xmm2, %xmm2934; X86-AVX1-NEXT: vpsrld %xmm1, %xmm0, %xmm0935; X86-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0936; X86-AVX1-NEXT: retl937;938; X86-AVX2-LABEL: splatvar_modulo_shift_v8i32:939; X86-AVX2: # %bb.0:940; X86-AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1941; X86-AVX2-NEXT: vpsrld %xmm1, %ymm0, %ymm0942; X86-AVX2-NEXT: retl943 %mod = and <8 x i32> %b, <i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31>944 %splat = shufflevector <8 x i32> %mod, <8 x i32> poison, <8 x i32> zeroinitializer945 %shift = lshr <8 x i32> %a, %splat946 ret <8 x i32> %shift947}948 949define <16 x i16> @splatvar_modulo_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {950; AVX1-LABEL: splatvar_modulo_shift_v16i16:951; AVX1: # %bb.0:952; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2953; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1954; AVX1-NEXT: vpsrlw %xmm1, %xmm2, %xmm2955; AVX1-NEXT: vpsrlw %xmm1, %xmm0, %xmm0956; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0957; AVX1-NEXT: retq958;959; AVX2-LABEL: splatvar_modulo_shift_v16i16:960; AVX2: # %bb.0:961; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1962; AVX2-NEXT: vpsrlw %xmm1, %ymm0, %ymm0963; AVX2-NEXT: retq964;965; XOPAVX1-LABEL: splatvar_modulo_shift_v16i16:966; XOPAVX1: # %bb.0:967; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2968; XOPAVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1969; XOPAVX1-NEXT: vpsrlw %xmm1, %xmm2, %xmm2970; XOPAVX1-NEXT: vpsrlw %xmm1, %xmm0, %xmm0971; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0972; XOPAVX1-NEXT: retq973;974; XOPAVX2-LABEL: splatvar_modulo_shift_v16i16:975; XOPAVX2: # %bb.0:976; XOPAVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1977; XOPAVX2-NEXT: vpsrlw %xmm1, %ymm0, %ymm0978; XOPAVX2-NEXT: retq979;980; AVX512-LABEL: splatvar_modulo_shift_v16i16:981; AVX512: # %bb.0:982; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1983; AVX512-NEXT: vpsrlw %xmm1, %ymm0, %ymm0984; AVX512-NEXT: retq985;986; AVX512VL-LABEL: splatvar_modulo_shift_v16i16:987; AVX512VL: # %bb.0:988; AVX512VL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1989; AVX512VL-NEXT: vpsrlw %xmm1, %ymm0, %ymm0990; AVX512VL-NEXT: retq991;992; X86-AVX1-LABEL: splatvar_modulo_shift_v16i16:993; X86-AVX1: # %bb.0:994; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2995; X86-AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1996; X86-AVX1-NEXT: vpsrlw %xmm1, %xmm2, %xmm2997; X86-AVX1-NEXT: vpsrlw %xmm1, %xmm0, %xmm0998; X86-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0999; X86-AVX1-NEXT: retl1000;1001; X86-AVX2-LABEL: splatvar_modulo_shift_v16i16:1002; X86-AVX2: # %bb.0:1003; X86-AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm11004; X86-AVX2-NEXT: vpsrlw %xmm1, %ymm0, %ymm01005; X86-AVX2-NEXT: retl1006 %mod = and <16 x i16> %b, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>1007 %splat = shufflevector <16 x i16> %mod, <16 x i16> poison, <16 x i32> zeroinitializer1008 %shift = lshr <16 x i16> %a, %splat1009 ret <16 x i16> %shift1010}1011 1012define <32 x i8> @splatvar_modulo_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {1013; AVX1-LABEL: splatvar_modulo_shift_v32i8:1014; AVX1: # %bb.0:1015; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm21016; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11017; AVX1-NEXT: vpsrlw %xmm1, %xmm2, %xmm21018; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm31019; AVX1-NEXT: vpsrlw %xmm1, %xmm3, %xmm31020; AVX1-NEXT: vpshufb {{.*#+}} xmm3 = xmm3[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1021; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm21022; AVX1-NEXT: vpsrlw %xmm1, %xmm0, %xmm01023; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm01024; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01025; AVX1-NEXT: retq1026;1027; AVX2-LABEL: splatvar_modulo_shift_v32i8:1028; AVX2: # %bb.0:1029; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11030; AVX2-NEXT: vpsrlw %xmm1, %ymm0, %ymm01031; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm21032; AVX2-NEXT: vpsrlw %xmm1, %xmm2, %xmm11033; AVX2-NEXT: vpsrlw $8, %xmm1, %xmm11034; AVX2-NEXT: vpbroadcastb %xmm1, %ymm11035; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm01036; AVX2-NEXT: retq1037;1038; XOPAVX1-LABEL: splatvar_modulo_shift_v32i8:1039; XOPAVX1: # %bb.0:1040; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21041; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm11042; XOPAVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11043; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm11044; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm21045; XOPAVX1-NEXT: vpshlb %xmm1, %xmm2, %xmm21046; XOPAVX1-NEXT: vpshlb %xmm1, %xmm0, %xmm01047; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01048; XOPAVX1-NEXT: retq1049;1050; XOPAVX2-LABEL: splatvar_modulo_shift_v32i8:1051; XOPAVX2: # %bb.0:1052; XOPAVX2-NEXT: vpbroadcastb %xmm1, %xmm11053; XOPAVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11054; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm21055; XOPAVX2-NEXT: vpsubb %xmm1, %xmm2, %xmm11056; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm21057; XOPAVX2-NEXT: vpshlb %xmm1, %xmm2, %xmm21058; XOPAVX2-NEXT: vpshlb %xmm1, %xmm0, %xmm01059; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm01060; XOPAVX2-NEXT: retq1061;1062; AVX512DQ-LABEL: splatvar_modulo_shift_v32i8:1063; AVX512DQ: # %bb.0:1064; AVX512DQ-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11065; AVX512DQ-NEXT: vpsrlw %xmm1, %ymm0, %ymm01066; AVX512DQ-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm21067; AVX512DQ-NEXT: vpsrlw %xmm1, %xmm2, %xmm11068; AVX512DQ-NEXT: vpsrlw $8, %xmm1, %xmm11069; AVX512DQ-NEXT: vpbroadcastb %xmm1, %ymm11070; AVX512DQ-NEXT: vpand %ymm1, %ymm0, %ymm01071; AVX512DQ-NEXT: retq1072;1073; AVX512BW-LABEL: splatvar_modulo_shift_v32i8:1074; AVX512BW: # %bb.0:1075; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero1076; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11077; AVX512BW-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1078; AVX512BW-NEXT: vpsrlw %xmm1, %zmm0, %zmm01079; AVX512BW-NEXT: vpmovwb %zmm0, %ymm01080; AVX512BW-NEXT: retq1081;1082; AVX512DQVL-LABEL: splatvar_modulo_shift_v32i8:1083; AVX512DQVL: # %bb.0:1084; AVX512DQVL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11085; AVX512DQVL-NEXT: vpsrlw %xmm1, %ymm0, %ymm01086; AVX512DQVL-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm21087; AVX512DQVL-NEXT: vpsrlw %xmm1, %xmm2, %xmm11088; AVX512DQVL-NEXT: vpsrlw $8, %xmm1, %xmm11089; AVX512DQVL-NEXT: vpbroadcastb %xmm1, %ymm11090; AVX512DQVL-NEXT: vpand %ymm1, %ymm0, %ymm01091; AVX512DQVL-NEXT: retq1092;1093; AVX512BWVL-LABEL: splatvar_modulo_shift_v32i8:1094; AVX512BWVL: # %bb.0:1095; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero1096; AVX512BWVL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm11097; AVX512BWVL-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1098; AVX512BWVL-NEXT: vpsrlw %xmm1, %zmm0, %zmm01099; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm01100; AVX512BWVL-NEXT: retq1101;1102; X86-AVX1-LABEL: splatvar_modulo_shift_v32i8:1103; X86-AVX1: # %bb.0:1104; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm21105; X86-AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm11106; X86-AVX1-NEXT: vpsrlw %xmm1, %xmm2, %xmm21107; X86-AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm31108; X86-AVX1-NEXT: vpsrlw %xmm1, %xmm3, %xmm31109; X86-AVX1-NEXT: vpshufb {{.*#+}} xmm3 = xmm3[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1110; X86-AVX1-NEXT: vpand %xmm3, %xmm2, %xmm21111; X86-AVX1-NEXT: vpsrlw %xmm1, %xmm0, %xmm01112; X86-AVX1-NEXT: vpand %xmm3, %xmm0, %xmm01113; X86-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm01114; X86-AVX1-NEXT: retl1115;1116; X86-AVX2-LABEL: splatvar_modulo_shift_v32i8:1117; X86-AVX2: # %bb.0:1118; X86-AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm11119; X86-AVX2-NEXT: vpsrlw %xmm1, %ymm0, %ymm01120; X86-AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm21121; X86-AVX2-NEXT: vpsrlw %xmm1, %xmm2, %xmm11122; X86-AVX2-NEXT: vpsrlw $8, %xmm1, %xmm11123; X86-AVX2-NEXT: vpbroadcastb %xmm1, %ymm11124; X86-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm01125; X86-AVX2-NEXT: retl1126 %mod = and <32 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, 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>1127 %splat = shufflevector <32 x i8> %mod, <32 x i8> poison, <32 x i32> zeroinitializer1128 %shift = lshr <32 x i8> %a, %splat1129 ret <32 x i8> %shift1130}1131 1132;1133; Constant Shifts1134;1135 1136define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind {1137; AVX1-LABEL: constant_shift_v4i64:1138; AVX1: # %bb.0:1139; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11140; AVX1-NEXT: vpsrlq $62, %xmm1, %xmm21141; AVX1-NEXT: vpsrlq $31, %xmm1, %xmm11142; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]1143; AVX1-NEXT: vpsrlq $7, %xmm0, %xmm21144; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm01145; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]1146; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01147; AVX1-NEXT: retq1148;1149; AVX2-LABEL: constant_shift_v4i64:1150; AVX2: # %bb.0:1151; AVX2-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01152; AVX2-NEXT: retq1153;1154; XOPAVX1-LABEL: constant_shift_v4i64:1155; XOPAVX1: # %bb.0:1156; XOPAVX1-NEXT: vpshlq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11157; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm01158; XOPAVX1-NEXT: vpshlq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01159; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01160; XOPAVX1-NEXT: retq1161;1162; XOPAVX2-LABEL: constant_shift_v4i64:1163; XOPAVX2: # %bb.0:1164; XOPAVX2-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01165; XOPAVX2-NEXT: retq1166;1167; AVX512-LABEL: constant_shift_v4i64:1168; AVX512: # %bb.0:1169; AVX512-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01170; AVX512-NEXT: retq1171;1172; AVX512VL-LABEL: constant_shift_v4i64:1173; AVX512VL: # %bb.0:1174; AVX512VL-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01175; AVX512VL-NEXT: retq1176;1177; X86-AVX1-LABEL: constant_shift_v4i64:1178; X86-AVX1: # %bb.0:1179; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11180; X86-AVX1-NEXT: vpsrlq $62, %xmm1, %xmm21181; X86-AVX1-NEXT: vpsrlq $31, %xmm1, %xmm11182; X86-AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]1183; X86-AVX1-NEXT: vpsrlq $7, %xmm0, %xmm21184; X86-AVX1-NEXT: vpsrlq $1, %xmm0, %xmm01185; X86-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]1186; X86-AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01187; X86-AVX1-NEXT: retl1188;1189; X86-AVX2-LABEL: constant_shift_v4i64:1190; X86-AVX2: # %bb.0:1191; X86-AVX2-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm01192; X86-AVX2-NEXT: retl1193 %shift = lshr <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62>1194 ret <4 x i64> %shift1195}1196 1197define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind {1198; AVX1-LABEL: constant_shift_v8i32:1199; AVX1: # %bb.0:1200; AVX1-NEXT: vpsrld $7, %xmm0, %xmm11201; AVX1-NEXT: vpsrld $5, %xmm0, %xmm21202; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]1203; AVX1-NEXT: vpsrld $6, %xmm0, %xmm21204; AVX1-NEXT: vpsrld $4, %xmm0, %xmm31205; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]1206; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]1207; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01208; AVX1-NEXT: vpsrld $7, %xmm0, %xmm21209; AVX1-NEXT: vpsrld $9, %xmm0, %xmm31210; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]1211; AVX1-NEXT: vpsrld $8, %xmm0, %xmm01212; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]1213; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01214; AVX1-NEXT: retq1215;1216; AVX2-LABEL: constant_shift_v8i32:1217; AVX2: # %bb.0:1218; AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01219; AVX2-NEXT: retq1220;1221; XOPAVX1-LABEL: constant_shift_v8i32:1222; XOPAVX1: # %bb.0:1223; XOPAVX1-NEXT: vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11224; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm01225; XOPAVX1-NEXT: vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01226; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01227; XOPAVX1-NEXT: retq1228;1229; XOPAVX2-LABEL: constant_shift_v8i32:1230; XOPAVX2: # %bb.0:1231; XOPAVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01232; XOPAVX2-NEXT: retq1233;1234; AVX512-LABEL: constant_shift_v8i32:1235; AVX512: # %bb.0:1236; AVX512-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01237; AVX512-NEXT: retq1238;1239; AVX512VL-LABEL: constant_shift_v8i32:1240; AVX512VL: # %bb.0:1241; AVX512VL-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01242; AVX512VL-NEXT: retq1243;1244; X86-AVX1-LABEL: constant_shift_v8i32:1245; X86-AVX1: # %bb.0:1246; X86-AVX1-NEXT: vpsrld $7, %xmm0, %xmm11247; X86-AVX1-NEXT: vpsrld $5, %xmm0, %xmm21248; X86-AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]1249; X86-AVX1-NEXT: vpsrld $6, %xmm0, %xmm21250; X86-AVX1-NEXT: vpsrld $4, %xmm0, %xmm31251; X86-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]1252; X86-AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]1253; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01254; X86-AVX1-NEXT: vpsrld $7, %xmm0, %xmm21255; X86-AVX1-NEXT: vpsrld $9, %xmm0, %xmm31256; X86-AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]1257; X86-AVX1-NEXT: vpsrld $8, %xmm0, %xmm01258; X86-AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]1259; X86-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01260; X86-AVX1-NEXT: retl1261;1262; X86-AVX2-LABEL: constant_shift_v8i32:1263; X86-AVX2: # %bb.0:1264; X86-AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm01265; X86-AVX2-NEXT: retl1266 %shift = lshr <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>1267 ret <8 x i32> %shift1268}1269 1270define <16 x i16> @constant_shift_v16i16_pairs(<16 x i16> %a) nounwind {1271; AVX1-LABEL: constant_shift_v16i16_pairs:1272; AVX1: # %bb.0:1273; AVX1-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [u,u,32768,32768,16384,16384,8192,8192]1274; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3,4,5,6,7]1275; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01276; AVX1-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [4096,4096,2048,2048,1024,1024,512,512]1277; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01278; AVX1-NEXT: retq1279;1280; AVX2-LABEL: constant_shift_v16i16_pairs:1281; AVX2: # %bb.0:1282; AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01283; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01284; AVX2-NEXT: retq1285;1286; XOPAVX1-LABEL: constant_shift_v16i16_pairs:1287; XOPAVX1: # %bb.0:1288; XOPAVX1-NEXT: vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11289; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm01290; XOPAVX1-NEXT: vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01291; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01292; XOPAVX1-NEXT: retq1293;1294; XOPAVX2-LABEL: constant_shift_v16i16_pairs:1295; XOPAVX2: # %bb.0:1296; XOPAVX2-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1 # [u,u,32768,32768,16384,16384,8192,8192,4096,4096,2048,2048,1024,1024,512,512]1297; XOPAVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7]1298; XOPAVX2-NEXT: retq1299;1300; AVX512DQ-LABEL: constant_shift_v16i16_pairs:1301; AVX512DQ: # %bb.0:1302; AVX512DQ-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01303; AVX512DQ-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01304; AVX512DQ-NEXT: retq1305;1306; AVX512BW-LABEL: constant_shift_v16i16_pairs:1307; AVX512BW: # %bb.0:1308; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01309; AVX512BW-NEXT: vpmovsxbw {{.*#+}} ymm1 = [0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1310; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm01311; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01312; AVX512BW-NEXT: retq1313;1314; AVX512DQVL-LABEL: constant_shift_v16i16_pairs:1315; AVX512DQVL: # %bb.0:1316; AVX512DQVL-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01317; AVX512DQVL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01318; AVX512DQVL-NEXT: retq1319;1320; AVX512BWVL-LABEL: constant_shift_v16i16_pairs:1321; AVX512BWVL: # %bb.0:1322; AVX512BWVL-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01323; AVX512BWVL-NEXT: retq1324;1325; X86-AVX1-LABEL: constant_shift_v16i16_pairs:1326; X86-AVX1: # %bb.0:1327; X86-AVX1-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm1 # [u,u,32768,32768,16384,16384,8192,8192]1328; X86-AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3,4,5,6,7]1329; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01330; X86-AVX1-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 # [4096,4096,2048,2048,1024,1024,512,512]1331; X86-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01332; X86-AVX1-NEXT: retl1333;1334; X86-AVX2-LABEL: constant_shift_v16i16_pairs:1335; X86-AVX2: # %bb.0:1336; X86-AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm01337; X86-AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm01338; X86-AVX2-NEXT: retl1339 %shift = lshr <16 x i16> %a, <i16 0, i16 0, i16 1, i16 1, i16 2, i16 2, i16 3, i16 3, i16 4, i16 4, i16 5, i16 5, i16 6, i16 6, i16 7, i16 7>1340 ret <16 x i16> %shift1341}1342 1343define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind {1344; AVX1-LABEL: constant_shift_v16i16:1345; AVX1: # %bb.0:1346; AVX1-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [u,32768,16384,8192,4096,2048,1024,512]1347; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5,6,7]1348; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01349; AVX1-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [256,128,64,32,16,8,4,2]1350; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01351; AVX1-NEXT: retq1352;1353; AVX2-LABEL: constant_shift_v16i16:1354; AVX2: # %bb.0:1355; AVX2-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1 # [u,32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2]1356; AVX2-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]1357; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]1358; AVX2-NEXT: retq1359;1360; XOPAVX1-LABEL: constant_shift_v16i16:1361; XOPAVX1: # %bb.0:1362; XOPAVX1-NEXT: vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11363; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm01364; XOPAVX1-NEXT: vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01365; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01366; XOPAVX1-NEXT: retq1367;1368; XOPAVX2-LABEL: constant_shift_v16i16:1369; XOPAVX2: # %bb.0:1370; XOPAVX2-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1 # [u,32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2]1371; XOPAVX2-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]1372; XOPAVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]1373; XOPAVX2-NEXT: retq1374;1375; AVX512DQ-LABEL: constant_shift_v16i16:1376; AVX512DQ: # %bb.0:1377; AVX512DQ-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1 # [u,32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2]1378; AVX512DQ-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]1379; AVX512DQ-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]1380; AVX512DQ-NEXT: retq1381;1382; AVX512BW-LABEL: constant_shift_v16i16:1383; AVX512BW: # %bb.0:1384; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01385; AVX512BW-NEXT: vpmovsxbw {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]1386; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm01387; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm01388; AVX512BW-NEXT: retq1389;1390; AVX512DQVL-LABEL: constant_shift_v16i16:1391; AVX512DQVL: # %bb.0:1392; AVX512DQVL-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1 # [u,32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2]1393; AVX512DQVL-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]1394; AVX512DQVL-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]1395; AVX512DQVL-NEXT: retq1396;1397; AVX512BWVL-LABEL: constant_shift_v16i16:1398; AVX512BWVL: # %bb.0:1399; AVX512BWVL-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01400; AVX512BWVL-NEXT: retq1401;1402; X86-AVX1-LABEL: constant_shift_v16i16:1403; X86-AVX1: # %bb.0:1404; X86-AVX1-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm1 # [u,32768,16384,8192,4096,2048,1024,512]1405; X86-AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5,6,7]1406; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01407; X86-AVX1-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 # [256,128,64,32,16,8,4,2]1408; X86-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01409; X86-AVX1-NEXT: retl1410;1411; X86-AVX2-LABEL: constant_shift_v16i16:1412; X86-AVX2: # %bb.0:1413; X86-AVX2-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm1 # [u,32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2]1414; X86-AVX2-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]1415; X86-AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]1416; X86-AVX2-NEXT: retl1417 %shift = lshr <16 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>1418 ret <16 x i16> %shift1419}1420 1421define <32 x i8> @constant_shift_v32i8_pairs(<32 x i8> %a) nounwind {1422; AVX1-LABEL: constant_shift_v32i8_pairs:1423; AVX1: # %bb.0:1424; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11425; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [512,16384,4096,1024,32768,16384,8192,4096]1426; AVX1-NEXT: vpmulhuw %xmm2, %xmm1, %xmm11427; AVX1-NEXT: vpmulhuw %xmm2, %xmm0, %xmm01428; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01429; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01430; AVX1-NEXT: retq1431;1432; AVX2-LABEL: constant_shift_v32i8_pairs:1433; AVX2: # %bb.0:1434; AVX2-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [512,16384,4096,1024,32768,16384,8192,4096,512,16384,4096,1024,32768,16384,8192,4096]1435; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01436; AVX2-NEXT: retq1437;1438; XOPAVX1-LABEL: constant_shift_v32i8_pairs:1439; XOPAVX1: # %bb.0:1440; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm11441; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [249,249,254,254,252,252,250,250,255,255,254,254,253,253,252,252]1442; XOPAVX1-NEXT: vpshlb %xmm2, %xmm1, %xmm11443; XOPAVX1-NEXT: vpshlb %xmm2, %xmm0, %xmm01444; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01445; XOPAVX1-NEXT: retq1446;1447; XOPAVX2-LABEL: constant_shift_v32i8_pairs:1448; XOPAVX2: # %bb.0:1449; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm11450; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [249,249,254,254,252,252,250,250,255,255,254,254,253,253,252,252]1451; XOPAVX2-NEXT: vpshlb %xmm2, %xmm1, %xmm11452; XOPAVX2-NEXT: vpshlb %xmm2, %xmm0, %xmm01453; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01454; XOPAVX2-NEXT: retq1455;1456; AVX512DQ-LABEL: constant_shift_v32i8_pairs:1457; AVX512DQ: # %bb.0:1458; AVX512DQ-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [512,16384,4096,1024,32768,16384,8192,4096,512,16384,4096,1024,32768,16384,8192,4096]1459; AVX512DQ-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01460; AVX512DQ-NEXT: retq1461;1462; AVX512BW-LABEL: constant_shift_v32i8_pairs:1463; AVX512BW: # %bb.0:1464; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm01465; AVX512BW-NEXT: vbroadcasti128 {{.*#+}} ymm1 = [7,2,4,6,1,2,3,4,7,2,4,6,1,2,3,4]1466; AVX512BW-NEXT: # ymm1 = mem[0,1,0,1]1467; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm01468; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01469; AVX512BW-NEXT: retq1470;1471; AVX512DQVL-LABEL: constant_shift_v32i8_pairs:1472; AVX512DQVL: # %bb.0:1473; AVX512DQVL-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [512,16384,4096,1024,32768,16384,8192,4096,512,16384,4096,1024,32768,16384,8192,4096]1474; AVX512DQVL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01475; AVX512DQVL-NEXT: retq1476;1477; AVX512BWVL-LABEL: constant_shift_v32i8_pairs:1478; AVX512BWVL: # %bb.0:1479; AVX512BWVL-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01480; AVX512BWVL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01481; AVX512BWVL-NEXT: retq1482;1483; X86-AVX1-LABEL: constant_shift_v32i8_pairs:1484; X86-AVX1: # %bb.0:1485; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11486; X86-AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [512,16384,4096,1024,32768,16384,8192,4096]1487; X86-AVX1-NEXT: vpmulhuw %xmm2, %xmm1, %xmm11488; X86-AVX1-NEXT: vpmulhuw %xmm2, %xmm0, %xmm01489; X86-AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01490; X86-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm01491; X86-AVX1-NEXT: retl1492;1493; X86-AVX2-LABEL: constant_shift_v32i8_pairs:1494; X86-AVX2: # %bb.0:1495; X86-AVX2-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm0 # [512,16384,4096,1024,32768,16384,8192,4096,512,16384,4096,1024,32768,16384,8192,4096]1496; X86-AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm01497; X86-AVX2-NEXT: retl1498 %shift = lshr <32 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, 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>1499 ret <32 x i8> %shift1500}1501 1502define <32 x i8> @constant_shift_v32i8_quads(<32 x i8> %a) nounwind {1503; AVX1-LABEL: constant_shift_v32i8_quads:1504; AVX1: # %bb.0:1505; AVX1-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [8192,8192,16384,16384,32768,32768,u,u]1506; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,5],xmm0[6,7]1507; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01508; AVX1-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [512,512,1024,1024,2048,2048,4096,4096]1509; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01510; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01511; AVX1-NEXT: retq1512;1513; AVX2-LABEL: constant_shift_v32i8_quads:1514; AVX2: # %bb.0:1515; AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01516; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01517; AVX2-NEXT: retq1518;1519; XOPAVX1-LABEL: constant_shift_v32i8_quads:1520; XOPAVX1: # %bb.0:1521; XOPAVX1-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11522; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm01523; XOPAVX1-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01524; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01525; XOPAVX1-NEXT: retq1526;1527; XOPAVX2-LABEL: constant_shift_v32i8_quads:1528; XOPAVX2: # %bb.0:1529; XOPAVX2-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11530; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm01531; XOPAVX2-NEXT: vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01532; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm01533; XOPAVX2-NEXT: retq1534;1535; AVX512-LABEL: constant_shift_v32i8_quads:1536; AVX512: # %bb.0:1537; AVX512-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01538; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01539; AVX512-NEXT: retq1540;1541; AVX512VL-LABEL: constant_shift_v32i8_quads:1542; AVX512VL: # %bb.0:1543; AVX512VL-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01544; AVX512VL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01545; AVX512VL-NEXT: retq1546;1547; X86-AVX1-LABEL: constant_shift_v32i8_quads:1548; X86-AVX1: # %bb.0:1549; X86-AVX1-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm1 # [8192,8192,16384,16384,32768,32768,u,u]1550; X86-AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,5],xmm0[6,7]1551; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01552; X86-AVX1-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 # [512,512,1024,1024,2048,2048,4096,4096]1553; X86-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01554; X86-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm01555; X86-AVX1-NEXT: retl1556;1557; X86-AVX2-LABEL: constant_shift_v32i8_quads:1558; X86-AVX2: # %bb.0:1559; X86-AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm01560; X86-AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm01561; X86-AVX2-NEXT: retl1562 %shift = lshr <32 x i8> %a, <i8 3, i8 3, i8 3, i8 3, i8 2, i8 2, i8 2, i8 2, i8 1, i8 1, i8 1, i8 1, i8 0, i8 0, i8 0, i8 0, i8 7, i8 7, i8 7, i8 7, i8 6, i8 6, i8 6, i8 6, i8 5, i8 5, i8 5, i8 5, i8 4, i8 4, i8 4, i8 4>1563 ret <32 x i8> %shift1564}1565 1566define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind {1567; AVX1-LABEL: constant_shift_v32i8:1568; AVX1: # %bb.0:1569; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11570; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21571; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]1572; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [2,4,8,16,32,64,128,256]1573; AVX1-NEXT: vpmullw %xmm4, %xmm3, %xmm31574; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm31575; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero1576; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [256,128,64,32,16,8,4,2]1577; AVX1-NEXT: vpmullw %xmm5, %xmm1, %xmm11578; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm11579; AVX1-NEXT: vpackuswb %xmm3, %xmm1, %xmm11580; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = 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]1581; AVX1-NEXT: vpmullw %xmm4, %xmm2, %xmm21582; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm21583; 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],zero1584; AVX1-NEXT: vpmullw %xmm5, %xmm0, %xmm01585; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm01586; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm01587; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01588; AVX1-NEXT: retq1589;1590; AVX2-LABEL: constant_shift_v32i8:1591; AVX2: # %bb.0:1592; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm11593; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]1594; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 # [2,4,8,16,32,64,128,256,2,4,8,16,32,64,128,256]1595; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm21596; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]1597; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [256,128,64,32,16,8,4,2,256,128,64,32,16,8,4,2]1598; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm01599; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm01600; AVX2-NEXT: retq1601;1602; XOPAVX1-LABEL: constant_shift_v32i8:1603; XOPAVX1: # %bb.0:1604; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm11605; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,255,254,253,252,251,250,249,249,250,251,252,253,254,255,0]1606; XOPAVX1-NEXT: vpshlb %xmm2, %xmm1, %xmm11607; XOPAVX1-NEXT: vpshlb %xmm2, %xmm0, %xmm01608; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01609; XOPAVX1-NEXT: retq1610;1611; XOPAVX2-LABEL: constant_shift_v32i8:1612; XOPAVX2: # %bb.0:1613; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm11614; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [0,255,254,253,252,251,250,249,249,250,251,252,253,254,255,0]1615; XOPAVX2-NEXT: vpshlb %xmm2, %xmm1, %xmm11616; XOPAVX2-NEXT: vpshlb %xmm2, %xmm0, %xmm01617; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01618; XOPAVX2-NEXT: retq1619;1620; AVX512DQ-LABEL: constant_shift_v32i8:1621; AVX512DQ: # %bb.0:1622; AVX512DQ-NEXT: vpxor %xmm1, %xmm1, %xmm11623; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]1624; AVX512DQ-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 # [2,4,8,16,32,64,128,256,2,4,8,16,32,64,128,256]1625; AVX512DQ-NEXT: vpsrlw $8, %ymm2, %ymm21626; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]1627; AVX512DQ-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [256,128,64,32,16,8,4,2,256,128,64,32,16,8,4,2]1628; AVX512DQ-NEXT: vpsrlw $8, %ymm0, %ymm01629; AVX512DQ-NEXT: vpackuswb %ymm2, %ymm0, %ymm01630; AVX512DQ-NEXT: retq1631;1632; AVX512BW-LABEL: constant_shift_v32i8:1633; AVX512BW: # %bb.0:1634; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero1635; AVX512BW-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm01636; AVX512BW-NEXT: vpmovwb %zmm0, %ymm01637; AVX512BW-NEXT: retq1638;1639; AVX512DQVL-LABEL: constant_shift_v32i8:1640; AVX512DQVL: # %bb.0:1641; AVX512DQVL-NEXT: vpxor %xmm1, %xmm1, %xmm11642; AVX512DQVL-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]1643; AVX512DQVL-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 # [2,4,8,16,32,64,128,256,2,4,8,16,32,64,128,256]1644; AVX512DQVL-NEXT: vpsrlw $8, %ymm2, %ymm21645; AVX512DQVL-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]1646; AVX512DQVL-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [256,128,64,32,16,8,4,2,256,128,64,32,16,8,4,2]1647; AVX512DQVL-NEXT: vpsrlw $8, %ymm0, %ymm01648; AVX512DQVL-NEXT: vpackuswb %ymm2, %ymm0, %ymm01649; AVX512DQVL-NEXT: retq1650;1651; AVX512BWVL-LABEL: constant_shift_v32i8:1652; AVX512BWVL: # %bb.0:1653; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero1654; AVX512BWVL-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm01655; AVX512BWVL-NEXT: vpmovwb %zmm0, %ymm01656; AVX512BWVL-NEXT: retq1657;1658; X86-AVX1-LABEL: constant_shift_v32i8:1659; X86-AVX1: # %bb.0:1660; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm11661; X86-AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21662; X86-AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]1663; X86-AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [2,4,8,16,32,64,128,256]1664; X86-AVX1-NEXT: vpmullw %xmm4, %xmm3, %xmm31665; X86-AVX1-NEXT: vpsrlw $8, %xmm3, %xmm31666; X86-AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero1667; X86-AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [256,128,64,32,16,8,4,2]1668; X86-AVX1-NEXT: vpmullw %xmm5, %xmm1, %xmm11669; X86-AVX1-NEXT: vpsrlw $8, %xmm1, %xmm11670; X86-AVX1-NEXT: vpackuswb %xmm3, %xmm1, %xmm11671; X86-AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = 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]1672; X86-AVX1-NEXT: vpmullw %xmm4, %xmm2, %xmm21673; X86-AVX1-NEXT: vpsrlw $8, %xmm2, %xmm21674; X86-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],zero1675; X86-AVX1-NEXT: vpmullw %xmm5, %xmm0, %xmm01676; X86-AVX1-NEXT: vpsrlw $8, %xmm0, %xmm01677; X86-AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm01678; X86-AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01679; X86-AVX1-NEXT: retl1680;1681; X86-AVX2-LABEL: constant_shift_v32i8:1682; X86-AVX2: # %bb.0:1683; X86-AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm11684; X86-AVX2-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]1685; X86-AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}, %ymm2, %ymm2 # [2,4,8,16,32,64,128,256,2,4,8,16,32,64,128,256]1686; X86-AVX2-NEXT: vpsrlw $8, %ymm2, %ymm21687; X86-AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]1688; X86-AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm0 # [256,128,64,32,16,8,4,2,256,128,64,32,16,8,4,2]1689; X86-AVX2-NEXT: vpsrlw $8, %ymm0, %ymm01690; X86-AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm01691; X86-AVX2-NEXT: retl1692 %shift = lshr <32 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, 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>1693 ret <32 x i8> %shift1694}1695 1696;1697; Uniform Constant Shifts1698;1699 1700define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind {1701; AVX1-LABEL: splatconstant_shift_v4i64:1702; AVX1: # %bb.0:1703; AVX1-NEXT: vpsrlq $7, %xmm0, %xmm11704; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01705; AVX1-NEXT: vpsrlq $7, %xmm0, %xmm01706; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01707; AVX1-NEXT: retq1708;1709; AVX2-LABEL: splatconstant_shift_v4i64:1710; AVX2: # %bb.0:1711; AVX2-NEXT: vpsrlq $7, %ymm0, %ymm01712; AVX2-NEXT: retq1713;1714; XOPAVX1-LABEL: splatconstant_shift_v4i64:1715; XOPAVX1: # %bb.0:1716; XOPAVX1-NEXT: vpsrlq $7, %xmm0, %xmm11717; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm01718; XOPAVX1-NEXT: vpsrlq $7, %xmm0, %xmm01719; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01720; XOPAVX1-NEXT: retq1721;1722; XOPAVX2-LABEL: splatconstant_shift_v4i64:1723; XOPAVX2: # %bb.0:1724; XOPAVX2-NEXT: vpsrlq $7, %ymm0, %ymm01725; XOPAVX2-NEXT: retq1726;1727; AVX512-LABEL: splatconstant_shift_v4i64:1728; AVX512: # %bb.0:1729; AVX512-NEXT: vpsrlq $7, %ymm0, %ymm01730; AVX512-NEXT: retq1731;1732; AVX512VL-LABEL: splatconstant_shift_v4i64:1733; AVX512VL: # %bb.0:1734; AVX512VL-NEXT: vpsrlq $7, %ymm0, %ymm01735; AVX512VL-NEXT: retq1736;1737; X86-AVX1-LABEL: splatconstant_shift_v4i64:1738; X86-AVX1: # %bb.0:1739; X86-AVX1-NEXT: vpsrlq $7, %xmm0, %xmm11740; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01741; X86-AVX1-NEXT: vpsrlq $7, %xmm0, %xmm01742; X86-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01743; X86-AVX1-NEXT: retl1744;1745; X86-AVX2-LABEL: splatconstant_shift_v4i64:1746; X86-AVX2: # %bb.0:1747; X86-AVX2-NEXT: vpsrlq $7, %ymm0, %ymm01748; X86-AVX2-NEXT: retl1749 %shift = lshr <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>1750 ret <4 x i64> %shift1751}1752 1753define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind {1754; AVX1-LABEL: splatconstant_shift_v8i32:1755; AVX1: # %bb.0:1756; AVX1-NEXT: vpsrld $5, %xmm0, %xmm11757; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01758; AVX1-NEXT: vpsrld $5, %xmm0, %xmm01759; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01760; AVX1-NEXT: retq1761;1762; AVX2-LABEL: splatconstant_shift_v8i32:1763; AVX2: # %bb.0:1764; AVX2-NEXT: vpsrld $5, %ymm0, %ymm01765; AVX2-NEXT: retq1766;1767; XOPAVX1-LABEL: splatconstant_shift_v8i32:1768; XOPAVX1: # %bb.0:1769; XOPAVX1-NEXT: vpsrld $5, %xmm0, %xmm11770; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm01771; XOPAVX1-NEXT: vpsrld $5, %xmm0, %xmm01772; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01773; XOPAVX1-NEXT: retq1774;1775; XOPAVX2-LABEL: splatconstant_shift_v8i32:1776; XOPAVX2: # %bb.0:1777; XOPAVX2-NEXT: vpsrld $5, %ymm0, %ymm01778; XOPAVX2-NEXT: retq1779;1780; AVX512-LABEL: splatconstant_shift_v8i32:1781; AVX512: # %bb.0:1782; AVX512-NEXT: vpsrld $5, %ymm0, %ymm01783; AVX512-NEXT: retq1784;1785; AVX512VL-LABEL: splatconstant_shift_v8i32:1786; AVX512VL: # %bb.0:1787; AVX512VL-NEXT: vpsrld $5, %ymm0, %ymm01788; AVX512VL-NEXT: retq1789;1790; X86-AVX1-LABEL: splatconstant_shift_v8i32:1791; X86-AVX1: # %bb.0:1792; X86-AVX1-NEXT: vpsrld $5, %xmm0, %xmm11793; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01794; X86-AVX1-NEXT: vpsrld $5, %xmm0, %xmm01795; X86-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01796; X86-AVX1-NEXT: retl1797;1798; X86-AVX2-LABEL: splatconstant_shift_v8i32:1799; X86-AVX2: # %bb.0:1800; X86-AVX2-NEXT: vpsrld $5, %ymm0, %ymm01801; X86-AVX2-NEXT: retl1802 %shift = lshr <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>1803 ret <8 x i32> %shift1804}1805 1806define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind {1807; AVX1-LABEL: splatconstant_shift_v16i16:1808; AVX1: # %bb.0:1809; AVX1-NEXT: vpsrlw $3, %xmm0, %xmm11810; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01811; AVX1-NEXT: vpsrlw $3, %xmm0, %xmm01812; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01813; AVX1-NEXT: retq1814;1815; AVX2-LABEL: splatconstant_shift_v16i16:1816; AVX2: # %bb.0:1817; AVX2-NEXT: vpsrlw $3, %ymm0, %ymm01818; AVX2-NEXT: retq1819;1820; XOPAVX1-LABEL: splatconstant_shift_v16i16:1821; XOPAVX1: # %bb.0:1822; XOPAVX1-NEXT: vpsrlw $3, %xmm0, %xmm11823; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm01824; XOPAVX1-NEXT: vpsrlw $3, %xmm0, %xmm01825; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01826; XOPAVX1-NEXT: retq1827;1828; XOPAVX2-LABEL: splatconstant_shift_v16i16:1829; XOPAVX2: # %bb.0:1830; XOPAVX2-NEXT: vpsrlw $3, %ymm0, %ymm01831; XOPAVX2-NEXT: retq1832;1833; AVX512-LABEL: splatconstant_shift_v16i16:1834; AVX512: # %bb.0:1835; AVX512-NEXT: vpsrlw $3, %ymm0, %ymm01836; AVX512-NEXT: retq1837;1838; AVX512VL-LABEL: splatconstant_shift_v16i16:1839; AVX512VL: # %bb.0:1840; AVX512VL-NEXT: vpsrlw $3, %ymm0, %ymm01841; AVX512VL-NEXT: retq1842;1843; X86-AVX1-LABEL: splatconstant_shift_v16i16:1844; X86-AVX1: # %bb.0:1845; X86-AVX1-NEXT: vpsrlw $3, %xmm0, %xmm11846; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01847; X86-AVX1-NEXT: vpsrlw $3, %xmm0, %xmm01848; X86-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01849; X86-AVX1-NEXT: retl1850;1851; X86-AVX2-LABEL: splatconstant_shift_v16i16:1852; X86-AVX2: # %bb.0:1853; X86-AVX2-NEXT: vpsrlw $3, %ymm0, %ymm01854; X86-AVX2-NEXT: retl1855 %shift = lshr <16 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>1856 ret <16 x i16> %shift1857}1858 1859define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind {1860; AVX1-LABEL: splatconstant_shift_v32i8:1861; AVX1: # %bb.0:1862; AVX1-NEXT: vpsrlw $3, %xmm0, %xmm11863; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01864; AVX1-NEXT: vpsrlw $3, %xmm0, %xmm01865; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01866; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01867; AVX1-NEXT: retq1868;1869; AVX2-LABEL: splatconstant_shift_v32i8:1870; AVX2: # %bb.0:1871; AVX2-NEXT: vpsrlw $3, %ymm0, %ymm01872; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01873; AVX2-NEXT: retq1874;1875; XOPAVX1-LABEL: splatconstant_shift_v32i8:1876; XOPAVX1: # %bb.0:1877; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm11878; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253]1879; XOPAVX1-NEXT: vpshlb %xmm2, %xmm1, %xmm11880; XOPAVX1-NEXT: vpshlb %xmm2, %xmm0, %xmm01881; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01882; XOPAVX1-NEXT: retq1883;1884; XOPAVX2-LABEL: splatconstant_shift_v32i8:1885; XOPAVX2: # %bb.0:1886; XOPAVX2-NEXT: vpsrlw $3, %ymm0, %ymm01887; XOPAVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01888; XOPAVX2-NEXT: retq1889;1890; AVX512-LABEL: splatconstant_shift_v32i8:1891; AVX512: # %bb.0:1892; AVX512-NEXT: vpsrlw $3, %ymm0, %ymm01893; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01894; AVX512-NEXT: retq1895;1896; AVX512VL-LABEL: splatconstant_shift_v32i8:1897; AVX512VL: # %bb.0:1898; AVX512VL-NEXT: vpsrlw $3, %ymm0, %ymm01899; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm01900; AVX512VL-NEXT: retq1901;1902; X86-AVX1-LABEL: splatconstant_shift_v32i8:1903; X86-AVX1: # %bb.0:1904; X86-AVX1-NEXT: vpsrlw $3, %xmm0, %xmm11905; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm01906; X86-AVX1-NEXT: vpsrlw $3, %xmm0, %xmm01907; X86-AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm01908; X86-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm01909; X86-AVX1-NEXT: retl1910;1911; X86-AVX2-LABEL: splatconstant_shift_v32i8:1912; X86-AVX2: # %bb.0:1913; X86-AVX2-NEXT: vpsrlw $3, %ymm0, %ymm01914; X86-AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm01915; X86-AVX2-NEXT: retl1916 %shift = lshr <32 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, 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>1917 ret <32 x i8> %shift1918}1919 1920;1921; Special Cases1922;1923 1924define <4 x i64> @shift32_v4i64(<4 x i64> %a) nounwind {1925; AVX1-LABEL: shift32_v4i64:1926; AVX1: # %bb.0:1927; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm11928; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm1[1,3],ymm0[5,7],ymm1[5,7]1929; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2,1,3,4,6,5,7]1930; AVX1-NEXT: retq1931;1932; AVX2-LABEL: shift32_v4i64:1933; AVX2: # %bb.0:1934; AVX2-NEXT: vpsrlq $32, %ymm0, %ymm01935; AVX2-NEXT: retq1936;1937; XOPAVX1-LABEL: shift32_v4i64:1938; XOPAVX1: # %bb.0:1939; XOPAVX1-NEXT: vxorps %xmm1, %xmm1, %xmm11940; XOPAVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm1[1,3],ymm0[5,7],ymm1[5,7]1941; XOPAVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2,1,3,4,6,5,7]1942; XOPAVX1-NEXT: retq1943;1944; XOPAVX2-LABEL: shift32_v4i64:1945; XOPAVX2: # %bb.0:1946; XOPAVX2-NEXT: vpsrlq $32, %ymm0, %ymm01947; XOPAVX2-NEXT: retq1948;1949; AVX512-LABEL: shift32_v4i64:1950; AVX512: # %bb.0:1951; AVX512-NEXT: vpsrlq $32, %ymm0, %ymm01952; AVX512-NEXT: retq1953;1954; AVX512VL-LABEL: shift32_v4i64:1955; AVX512VL: # %bb.0:1956; AVX512VL-NEXT: vpsrlq $32, %ymm0, %ymm01957; AVX512VL-NEXT: retq1958;1959; X86-AVX1-LABEL: shift32_v4i64:1960; X86-AVX1: # %bb.0:1961; X86-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm11962; X86-AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm1[1,3],ymm0[5,7],ymm1[5,7]1963; X86-AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2,1,3,4,6,5,7]1964; X86-AVX1-NEXT: retl1965;1966; X86-AVX2-LABEL: shift32_v4i64:1967; X86-AVX2: # %bb.0:1968; X86-AVX2-NEXT: vpsrlq $32, %ymm0, %ymm01969; X86-AVX2-NEXT: retl1970 %shift = lshr <4 x i64> %a, <i64 32, i64 32, i64 32, i64 32>1971 ret <4 x i64> %shift1972}1973 1974define <4 x i64> @shift32_v4i64_concat(<2 x i64> %lo, <2 x i64> %hi) nounwind {1975; AVX1-LABEL: shift32_v4i64_concat:1976; AVX1: # %bb.0:1977; AVX1-NEXT: vpsrlq $32, %xmm0, %xmm01978; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm11979; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01980; AVX1-NEXT: retq1981;1982; AVX2-LABEL: shift32_v4i64_concat:1983; AVX2: # %bb.0:1984; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01985; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm01986; AVX2-NEXT: vpsrlq $32, %ymm0, %ymm01987; AVX2-NEXT: retq1988;1989; XOPAVX1-LABEL: shift32_v4i64_concat:1990; XOPAVX1: # %bb.0:1991; XOPAVX1-NEXT: vpsrlq $32, %xmm0, %xmm01992; XOPAVX1-NEXT: vpsrlq $32, %xmm1, %xmm11993; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm01994; XOPAVX1-NEXT: retq1995;1996; XOPAVX2-LABEL: shift32_v4i64_concat:1997; XOPAVX2: # %bb.0:1998; XOPAVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm01999; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm02000; XOPAVX2-NEXT: vpsrlq $32, %ymm0, %ymm02001; XOPAVX2-NEXT: retq2002;2003; AVX512-LABEL: shift32_v4i64_concat:2004; AVX512: # %bb.0:2005; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm02006; AVX512-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm02007; AVX512-NEXT: vpsrlq $32, %ymm0, %ymm02008; AVX512-NEXT: retq2009;2010; AVX512VL-LABEL: shift32_v4i64_concat:2011; AVX512VL: # %bb.0:2012; AVX512VL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm02013; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm02014; AVX512VL-NEXT: vpsrlq $32, %ymm0, %ymm02015; AVX512VL-NEXT: retq2016;2017; X86-AVX1-LABEL: shift32_v4i64_concat:2018; X86-AVX1: # %bb.0:2019; X86-AVX1-NEXT: vpsrlq $32, %xmm0, %xmm02020; X86-AVX1-NEXT: vpsrlq $32, %xmm1, %xmm12021; X86-AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm02022; X86-AVX1-NEXT: retl2023;2024; X86-AVX2-LABEL: shift32_v4i64_concat:2025; X86-AVX2: # %bb.0:2026; X86-AVX2-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm02027; X86-AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm02028; X86-AVX2-NEXT: vpsrlq $32, %ymm0, %ymm02029; X86-AVX2-NEXT: retl2030 %a = shufflevector <2 x i64> %lo, <2 x i64> %hi, <4 x i32> <i32 0, i32 1, i32 2, i32 3>2031 %shift = lshr <4 x i64> %a, <i64 32, i64 32, i64 32, i64 32>2032 ret <4 x i64> %shift2033}2034 2035define <4 x i32> @sh_trunc_sh_vec(<4 x i64> %x) {2036; AVX1-LABEL: sh_trunc_sh_vec:2037; AVX1: # %bb.0:2038; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm12039; AVX1-NEXT: vpsrlq $36, %xmm1, %xmm12040; AVX1-NEXT: vpsrlq $36, %xmm0, %xmm02041; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]2042; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02043; AVX1-NEXT: vzeroupper2044; AVX1-NEXT: retq2045;2046; AVX2-LABEL: sh_trunc_sh_vec:2047; AVX2: # %bb.0:2048; AVX2-NEXT: vpsrlq $36, %ymm0, %ymm02049; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm12050; AVX2-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]2051; AVX2-NEXT: vbroadcastss {{.*#+}} xmm1 = [1048575,1048575,1048575,1048575]2052; AVX2-NEXT: vandps %xmm1, %xmm0, %xmm02053; AVX2-NEXT: vzeroupper2054; AVX2-NEXT: retq2055;2056; XOPAVX1-LABEL: sh_trunc_sh_vec:2057; XOPAVX1: # %bb.0:2058; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm12059; XOPAVX1-NEXT: vpsrlq $36, %xmm1, %xmm12060; XOPAVX1-NEXT: vpsrlq $36, %xmm0, %xmm02061; XOPAVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]2062; XOPAVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02063; XOPAVX1-NEXT: vzeroupper2064; XOPAVX1-NEXT: retq2065;2066; XOPAVX2-LABEL: sh_trunc_sh_vec:2067; XOPAVX2: # %bb.0:2068; XOPAVX2-NEXT: vpsrlq $36, %ymm0, %ymm02069; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm12070; XOPAVX2-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]2071; XOPAVX2-NEXT: vbroadcastss {{.*#+}} xmm1 = [1048575,1048575,1048575,1048575]2072; XOPAVX2-NEXT: vandps %xmm1, %xmm0, %xmm02073; XOPAVX2-NEXT: vzeroupper2074; XOPAVX2-NEXT: retq2075;2076; AVX512-LABEL: sh_trunc_sh_vec:2077; AVX512: # %bb.0:2078; AVX512-NEXT: vpsrlq $36, %ymm0, %ymm02079; AVX512-NEXT: vpmovqd %zmm0, %ymm02080; AVX512-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1048575,1048575,1048575,1048575]2081; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm02082; AVX512-NEXT: vzeroupper2083; AVX512-NEXT: retq2084;2085; AVX512VL-LABEL: sh_trunc_sh_vec:2086; AVX512VL: # %bb.0:2087; AVX512VL-NEXT: vpsrlq $36, %ymm0, %ymm02088; AVX512VL-NEXT: vpmovqd %ymm0, %xmm02089; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm02090; AVX512VL-NEXT: vzeroupper2091; AVX512VL-NEXT: retq2092;2093; X86-AVX1-LABEL: sh_trunc_sh_vec:2094; X86-AVX1: # %bb.0:2095; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm12096; X86-AVX1-NEXT: vpsrlq $36, %xmm1, %xmm12097; X86-AVX1-NEXT: vpsrlq $36, %xmm0, %xmm02098; X86-AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]2099; X86-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm02100; X86-AVX1-NEXT: vzeroupper2101; X86-AVX1-NEXT: retl2102;2103; X86-AVX2-LABEL: sh_trunc_sh_vec:2104; X86-AVX2: # %bb.0:2105; X86-AVX2-NEXT: vpsrlq $36, %ymm0, %ymm02106; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm12107; X86-AVX2-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]2108; X86-AVX2-NEXT: vbroadcastss {{.*#+}} xmm1 = [1048575,1048575,1048575,1048575]2109; X86-AVX2-NEXT: vandps %xmm1, %xmm0, %xmm02110; X86-AVX2-NEXT: vzeroupper2111; X86-AVX2-NEXT: retl2112 %s = lshr <4 x i64> %x, <i64 24, i64 24, i64 24, i64 24>2113 %t = trunc <4 x i64> %s to <4 x i32>2114 %r = lshr <4 x i32> %t, <i32 12, i32 12, i32 12, i32 12>2115 ret <4 x i32> %r2116}2117