2128 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE23; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE414; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX26; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefixes=XOP,XOPAVX17; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=XOP,XOPAVX28; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq | FileCheck %s --check-prefixes=AVX512,AVX512DQ9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefixes=AVX512VL,AVX512DQVL11; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512VL,AVX512BWVL12;13; Just one 32-bit run to make sure we do reasonable things for i64 shifts.14; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X86-SSE15 16;17; Variable Shifts18;19 20define <2 x i64> @var_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {21; SSE2-LABEL: var_shift_v2i64:22; SSE2: # %bb.0:23; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]24; SSE2-NEXT: movdqa %xmm2, %xmm325; SSE2-NEXT: psrlq %xmm1, %xmm326; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[2,3,2,3]27; SSE2-NEXT: psrlq %xmm4, %xmm228; SSE2-NEXT: movsd {{.*#+}} xmm2 = xmm3[0],xmm2[1]29; SSE2-NEXT: movdqa %xmm0, %xmm330; SSE2-NEXT: psrlq %xmm1, %xmm331; SSE2-NEXT: psrlq %xmm4, %xmm032; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm3[0],xmm0[1]33; SSE2-NEXT: xorpd %xmm2, %xmm034; SSE2-NEXT: psubq %xmm2, %xmm035; SSE2-NEXT: retq36;37; SSE41-LABEL: var_shift_v2i64:38; SSE41: # %bb.0:39; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]40; SSE41-NEXT: movdqa %xmm2, %xmm341; SSE41-NEXT: psrlq %xmm1, %xmm342; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm1[2,3,2,3]43; SSE41-NEXT: psrlq %xmm4, %xmm244; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]45; SSE41-NEXT: movdqa %xmm0, %xmm346; SSE41-NEXT: psrlq %xmm1, %xmm347; SSE41-NEXT: psrlq %xmm4, %xmm048; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]49; SSE41-NEXT: pxor %xmm2, %xmm050; SSE41-NEXT: psubq %xmm2, %xmm051; SSE41-NEXT: retq52;53; AVX1-LABEL: var_shift_v2i64:54; AVX1: # %bb.0:55; AVX1-NEXT: vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]56; AVX1-NEXT: # xmm2 = mem[0,0]57; AVX1-NEXT: vpsrlq %xmm1, %xmm2, %xmm358; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm1[2,3,2,3]59; AVX1-NEXT: vpsrlq %xmm4, %xmm2, %xmm260; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]61; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm162; AVX1-NEXT: vpsrlq %xmm4, %xmm0, %xmm063; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]64; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm065; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm066; AVX1-NEXT: retq67;68; AVX2-LABEL: var_shift_v2i64:69; AVX2: # %bb.0:70; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]71; AVX2-NEXT: vpsrlvq %xmm1, %xmm2, %xmm272; AVX2-NEXT: vpsrlvq %xmm1, %xmm0, %xmm073; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm074; AVX2-NEXT: vpsubq %xmm2, %xmm0, %xmm075; AVX2-NEXT: retq76;77; XOP-LABEL: var_shift_v2i64:78; XOP: # %bb.0:79; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm280; XOP-NEXT: vpsubq %xmm1, %xmm2, %xmm181; XOP-NEXT: vpshaq %xmm1, %xmm0, %xmm082; XOP-NEXT: retq83;84; AVX512-LABEL: var_shift_v2i64:85; AVX512: # %bb.0:86; AVX512-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm187; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm088; AVX512-NEXT: vpsravq %zmm1, %zmm0, %zmm089; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm090; AVX512-NEXT: vzeroupper91; AVX512-NEXT: retq92;93; AVX512VL-LABEL: var_shift_v2i64:94; AVX512VL: # %bb.0:95; AVX512VL-NEXT: vpsravq %xmm1, %xmm0, %xmm096; AVX512VL-NEXT: retq97;98; X86-SSE-LABEL: var_shift_v2i64:99; X86-SSE: # %bb.0:100; X86-SSE-NEXT: movdqa {{.*#+}} xmm2 = [0,2147483648,0,2147483648]101; X86-SSE-NEXT: movdqa %xmm2, %xmm3102; X86-SSE-NEXT: psrlq %xmm1, %xmm3103; X86-SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm1[2,3,2,3]104; X86-SSE-NEXT: psrlq %xmm4, %xmm2105; X86-SSE-NEXT: movsd {{.*#+}} xmm2 = xmm3[0],xmm2[1]106; X86-SSE-NEXT: movdqa %xmm0, %xmm3107; X86-SSE-NEXT: psrlq %xmm1, %xmm3108; X86-SSE-NEXT: psrlq %xmm4, %xmm0109; X86-SSE-NEXT: movsd {{.*#+}} xmm0 = xmm3[0],xmm0[1]110; X86-SSE-NEXT: xorpd %xmm2, %xmm0111; X86-SSE-NEXT: psubq %xmm2, %xmm0112; X86-SSE-NEXT: retl113 %shift = ashr <2 x i64> %a, %b114 ret <2 x i64> %shift115}116 117define <4 x i32> @var_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {118; SSE2-LABEL: var_shift_v4i32:119; SSE2: # %bb.0:120; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm1[2,3,3,3,4,5,6,7]121; SSE2-NEXT: movdqa %xmm0, %xmm3122; SSE2-NEXT: psrad %xmm2, %xmm3123; SSE2-NEXT: pshuflw {{.*#+}} xmm4 = xmm1[0,1,1,1,4,5,6,7]124; SSE2-NEXT: movdqa %xmm0, %xmm2125; SSE2-NEXT: psrad %xmm4, %xmm2126; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]127; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]128; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm1[2,3,3,3,4,5,6,7]129; SSE2-NEXT: movdqa %xmm0, %xmm4130; SSE2-NEXT: psrad %xmm3, %xmm4131; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,1,4,5,6,7]132; SSE2-NEXT: psrad %xmm1, %xmm0133; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm4[1]134; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,3],xmm0[0,3]135; SSE2-NEXT: movaps %xmm2, %xmm0136; SSE2-NEXT: retq137;138; SSE41-LABEL: var_shift_v4i32:139; SSE41: # %bb.0:140; SSE41-NEXT: pshuflw {{.*#+}} xmm2 = xmm1[2,3,3,3,4,5,6,7]141; SSE41-NEXT: movdqa %xmm0, %xmm3142; SSE41-NEXT: psrad %xmm2, %xmm3143; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]144; SSE41-NEXT: pshuflw {{.*#+}} xmm4 = xmm2[2,3,3,3,4,5,6,7]145; SSE41-NEXT: movdqa %xmm0, %xmm5146; SSE41-NEXT: psrad %xmm4, %xmm5147; SSE41-NEXT: pblendw {{.*#+}} xmm5 = xmm3[0,1,2,3],xmm5[4,5,6,7]148; SSE41-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,1,4,5,6,7]149; SSE41-NEXT: movdqa %xmm0, %xmm3150; SSE41-NEXT: psrad %xmm1, %xmm3151; SSE41-NEXT: pshuflw {{.*#+}} xmm1 = xmm2[0,1,1,1,4,5,6,7]152; SSE41-NEXT: psrad %xmm1, %xmm0153; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]154; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm5[2,3],xmm0[4,5],xmm5[6,7]155; SSE41-NEXT: retq156;157; AVX1-LABEL: var_shift_v4i32:158; AVX1: # %bb.0:159; AVX1-NEXT: vpsrldq {{.*#+}} xmm2 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero160; AVX1-NEXT: vpsrad %xmm2, %xmm0, %xmm2161; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm3162; AVX1-NEXT: vpsrad %xmm3, %xmm0, %xmm3163; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]164; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3165; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm3 = xmm1[2],xmm3[2],xmm1[3],xmm3[3]166; AVX1-NEXT: vpsrad %xmm3, %xmm0, %xmm3167; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero168; AVX1-NEXT: vpsrad %xmm1, %xmm0, %xmm0169; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]170; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]171; AVX1-NEXT: retq172;173; AVX2-LABEL: var_shift_v4i32:174; AVX2: # %bb.0:175; AVX2-NEXT: vpsravd %xmm1, %xmm0, %xmm0176; AVX2-NEXT: retq177;178; XOPAVX1-LABEL: var_shift_v4i32:179; XOPAVX1: # %bb.0:180; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2181; XOPAVX1-NEXT: vpsubd %xmm1, %xmm2, %xmm1182; XOPAVX1-NEXT: vpshad %xmm1, %xmm0, %xmm0183; XOPAVX1-NEXT: retq184;185; XOPAVX2-LABEL: var_shift_v4i32:186; XOPAVX2: # %bb.0:187; XOPAVX2-NEXT: vpsravd %xmm1, %xmm0, %xmm0188; XOPAVX2-NEXT: retq189;190; AVX512-LABEL: var_shift_v4i32:191; AVX512: # %bb.0:192; AVX512-NEXT: vpsravd %xmm1, %xmm0, %xmm0193; AVX512-NEXT: retq194;195; AVX512VL-LABEL: var_shift_v4i32:196; AVX512VL: # %bb.0:197; AVX512VL-NEXT: vpsravd %xmm1, %xmm0, %xmm0198; AVX512VL-NEXT: retq199;200; X86-SSE-LABEL: var_shift_v4i32:201; X86-SSE: # %bb.0:202; X86-SSE-NEXT: pshuflw {{.*#+}} xmm2 = xmm1[2,3,3,3,4,5,6,7]203; X86-SSE-NEXT: movdqa %xmm0, %xmm3204; X86-SSE-NEXT: psrad %xmm2, %xmm3205; X86-SSE-NEXT: pshuflw {{.*#+}} xmm4 = xmm1[0,1,1,1,4,5,6,7]206; X86-SSE-NEXT: movdqa %xmm0, %xmm2207; X86-SSE-NEXT: psrad %xmm4, %xmm2208; X86-SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]209; X86-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]210; X86-SSE-NEXT: pshuflw {{.*#+}} xmm3 = xmm1[2,3,3,3,4,5,6,7]211; X86-SSE-NEXT: movdqa %xmm0, %xmm4212; X86-SSE-NEXT: psrad %xmm3, %xmm4213; X86-SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,1,4,5,6,7]214; X86-SSE-NEXT: psrad %xmm1, %xmm0215; X86-SSE-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm4[1]216; X86-SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,3],xmm0[0,3]217; X86-SSE-NEXT: movaps %xmm2, %xmm0218; X86-SSE-NEXT: retl219 %shift = ashr <4 x i32> %a, %b220 ret <4 x i32> %shift221}222 223define <8 x i16> @var_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {224; SSE2-LABEL: var_shift_v8i16:225; SSE2: # %bb.0:226; SSE2-NEXT: psllw $12, %xmm1227; SSE2-NEXT: movdqa %xmm1, %xmm2228; SSE2-NEXT: psraw $15, %xmm2229; SSE2-NEXT: movdqa %xmm2, %xmm3230; SSE2-NEXT: pandn %xmm0, %xmm3231; SSE2-NEXT: psraw $8, %xmm0232; SSE2-NEXT: pand %xmm2, %xmm0233; SSE2-NEXT: por %xmm3, %xmm0234; SSE2-NEXT: paddw %xmm1, %xmm1235; SSE2-NEXT: movdqa %xmm1, %xmm2236; SSE2-NEXT: psraw $15, %xmm2237; SSE2-NEXT: movdqa %xmm2, %xmm3238; SSE2-NEXT: pandn %xmm0, %xmm3239; SSE2-NEXT: psraw $4, %xmm0240; SSE2-NEXT: pand %xmm2, %xmm0241; SSE2-NEXT: por %xmm3, %xmm0242; SSE2-NEXT: paddw %xmm1, %xmm1243; SSE2-NEXT: movdqa %xmm1, %xmm2244; SSE2-NEXT: psraw $15, %xmm2245; SSE2-NEXT: movdqa %xmm2, %xmm3246; SSE2-NEXT: pandn %xmm0, %xmm3247; SSE2-NEXT: psraw $2, %xmm0248; SSE2-NEXT: pand %xmm2, %xmm0249; SSE2-NEXT: por %xmm3, %xmm0250; SSE2-NEXT: paddw %xmm1, %xmm1251; SSE2-NEXT: psraw $15, %xmm1252; SSE2-NEXT: movdqa %xmm1, %xmm2253; SSE2-NEXT: pandn %xmm0, %xmm2254; SSE2-NEXT: psraw $1, %xmm0255; SSE2-NEXT: pand %xmm1, %xmm0256; SSE2-NEXT: por %xmm2, %xmm0257; SSE2-NEXT: retq258;259; SSE41-LABEL: var_shift_v8i16:260; SSE41: # %bb.0:261; SSE41-NEXT: movdqa %xmm0, %xmm2262; SSE41-NEXT: movdqa %xmm1, %xmm0263; SSE41-NEXT: psllw $12, %xmm0264; SSE41-NEXT: psllw $4, %xmm1265; SSE41-NEXT: por %xmm1, %xmm0266; SSE41-NEXT: movdqa %xmm0, %xmm1267; SSE41-NEXT: paddw %xmm0, %xmm1268; SSE41-NEXT: movdqa %xmm2, %xmm3269; SSE41-NEXT: psraw $8, %xmm3270; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2271; SSE41-NEXT: movdqa %xmm2, %xmm3272; SSE41-NEXT: psraw $4, %xmm3273; SSE41-NEXT: movdqa %xmm1, %xmm0274; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2275; SSE41-NEXT: movdqa %xmm2, %xmm3276; SSE41-NEXT: psraw $2, %xmm3277; SSE41-NEXT: paddw %xmm1, %xmm1278; SSE41-NEXT: movdqa %xmm1, %xmm0279; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2280; SSE41-NEXT: movdqa %xmm2, %xmm3281; SSE41-NEXT: psraw $1, %xmm3282; SSE41-NEXT: paddw %xmm1, %xmm1283; SSE41-NEXT: movdqa %xmm1, %xmm0284; SSE41-NEXT: pblendvb %xmm0, %xmm3, %xmm2285; SSE41-NEXT: movdqa %xmm2, %xmm0286; SSE41-NEXT: retq287;288; AVX1-LABEL: var_shift_v8i16:289; AVX1: # %bb.0:290; AVX1-NEXT: vpsllw $12, %xmm1, %xmm2291; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1292; AVX1-NEXT: vpor %xmm2, %xmm1, %xmm1293; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm2294; AVX1-NEXT: vpsraw $8, %xmm0, %xmm3295; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0296; AVX1-NEXT: vpsraw $4, %xmm0, %xmm3297; AVX1-NEXT: vpblendvb %xmm2, %xmm3, %xmm0, %xmm0298; AVX1-NEXT: vpsraw $2, %xmm0, %xmm2299; AVX1-NEXT: vpsllw $2, %xmm1, %xmm3300; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm0, %xmm0301; AVX1-NEXT: vpsraw $1, %xmm0, %xmm2302; AVX1-NEXT: vpsllw $3, %xmm1, %xmm1303; AVX1-NEXT: vpblendvb %xmm1, %xmm2, %xmm0, %xmm0304; AVX1-NEXT: retq305;306; AVX2-LABEL: var_shift_v8i16:307; AVX2: # %bb.0:308; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero309; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0310; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0311; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1312; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0313; AVX2-NEXT: vzeroupper314; AVX2-NEXT: retq315;316; XOP-LABEL: var_shift_v8i16:317; XOP: # %bb.0:318; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2319; XOP-NEXT: vpsubw %xmm1, %xmm2, %xmm1320; XOP-NEXT: vpshaw %xmm1, %xmm0, %xmm0321; XOP-NEXT: retq322;323; AVX512DQ-LABEL: var_shift_v8i16:324; AVX512DQ: # %bb.0:325; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero326; AVX512DQ-NEXT: vpmovsxwd %xmm0, %ymm0327; AVX512DQ-NEXT: vpsravd %ymm1, %ymm0, %ymm0328; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm0329; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0330; AVX512DQ-NEXT: vzeroupper331; AVX512DQ-NEXT: retq332;333; AVX512BW-LABEL: var_shift_v8i16:334; AVX512BW: # %bb.0:335; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1336; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0337; AVX512BW-NEXT: vpsravw %zmm1, %zmm0, %zmm0338; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0339; AVX512BW-NEXT: vzeroupper340; AVX512BW-NEXT: retq341;342; AVX512DQVL-LABEL: var_shift_v8i16:343; AVX512DQVL: # %bb.0:344; AVX512DQVL-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero345; AVX512DQVL-NEXT: vpmovsxwd %xmm0, %ymm0346; AVX512DQVL-NEXT: vpsravd %ymm1, %ymm0, %ymm0347; AVX512DQVL-NEXT: vpmovdw %ymm0, %xmm0348; AVX512DQVL-NEXT: vzeroupper349; AVX512DQVL-NEXT: retq350;351; AVX512BWVL-LABEL: var_shift_v8i16:352; AVX512BWVL: # %bb.0:353; AVX512BWVL-NEXT: vpsravw %xmm1, %xmm0, %xmm0354; AVX512BWVL-NEXT: retq355;356; X86-SSE-LABEL: var_shift_v8i16:357; X86-SSE: # %bb.0:358; X86-SSE-NEXT: psllw $12, %xmm1359; X86-SSE-NEXT: movdqa %xmm1, %xmm2360; X86-SSE-NEXT: psraw $15, %xmm2361; X86-SSE-NEXT: movdqa %xmm2, %xmm3362; X86-SSE-NEXT: pandn %xmm0, %xmm3363; X86-SSE-NEXT: psraw $8, %xmm0364; X86-SSE-NEXT: pand %xmm2, %xmm0365; X86-SSE-NEXT: por %xmm3, %xmm0366; X86-SSE-NEXT: paddw %xmm1, %xmm1367; X86-SSE-NEXT: movdqa %xmm1, %xmm2368; X86-SSE-NEXT: psraw $15, %xmm2369; X86-SSE-NEXT: movdqa %xmm2, %xmm3370; X86-SSE-NEXT: pandn %xmm0, %xmm3371; X86-SSE-NEXT: psraw $4, %xmm0372; X86-SSE-NEXT: pand %xmm2, %xmm0373; X86-SSE-NEXT: por %xmm3, %xmm0374; X86-SSE-NEXT: paddw %xmm1, %xmm1375; X86-SSE-NEXT: movdqa %xmm1, %xmm2376; X86-SSE-NEXT: psraw $15, %xmm2377; X86-SSE-NEXT: movdqa %xmm2, %xmm3378; X86-SSE-NEXT: pandn %xmm0, %xmm3379; X86-SSE-NEXT: psraw $2, %xmm0380; X86-SSE-NEXT: pand %xmm2, %xmm0381; X86-SSE-NEXT: por %xmm3, %xmm0382; X86-SSE-NEXT: paddw %xmm1, %xmm1383; X86-SSE-NEXT: psraw $15, %xmm1384; X86-SSE-NEXT: movdqa %xmm1, %xmm2385; X86-SSE-NEXT: pandn %xmm0, %xmm2386; X86-SSE-NEXT: psraw $1, %xmm0387; X86-SSE-NEXT: pand %xmm1, %xmm0388; X86-SSE-NEXT: por %xmm2, %xmm0389; X86-SSE-NEXT: retl390 %shift = ashr <8 x i16> %a, %b391 ret <8 x i16> %shift392}393 394define <16 x i8> @var_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {395; SSE2-LABEL: var_shift_v16i8:396; SSE2: # %bb.0:397; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]398; SSE2-NEXT: psllw $5, %xmm1399; SSE2-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm1[8],xmm4[9],xmm1[9],xmm4[10],xmm1[10],xmm4[11],xmm1[11],xmm4[12],xmm1[12],xmm4[13],xmm1[13],xmm4[14],xmm1[14],xmm4[15],xmm1[15]400; SSE2-NEXT: pxor %xmm3, %xmm3401; SSE2-NEXT: pxor %xmm5, %xmm5402; SSE2-NEXT: pcmpgtw %xmm4, %xmm5403; SSE2-NEXT: movdqa %xmm5, %xmm6404; SSE2-NEXT: pandn %xmm2, %xmm6405; SSE2-NEXT: psraw $4, %xmm2406; SSE2-NEXT: pand %xmm5, %xmm2407; SSE2-NEXT: por %xmm6, %xmm2408; SSE2-NEXT: paddw %xmm4, %xmm4409; SSE2-NEXT: pxor %xmm5, %xmm5410; SSE2-NEXT: pcmpgtw %xmm4, %xmm5411; SSE2-NEXT: movdqa %xmm5, %xmm6412; SSE2-NEXT: pandn %xmm2, %xmm6413; SSE2-NEXT: psraw $2, %xmm2414; SSE2-NEXT: pand %xmm5, %xmm2415; SSE2-NEXT: por %xmm6, %xmm2416; SSE2-NEXT: paddw %xmm4, %xmm4417; SSE2-NEXT: pxor %xmm5, %xmm5418; SSE2-NEXT: pcmpgtw %xmm4, %xmm5419; SSE2-NEXT: movdqa %xmm5, %xmm4420; SSE2-NEXT: pandn %xmm2, %xmm4421; SSE2-NEXT: psraw $1, %xmm2422; SSE2-NEXT: pand %xmm5, %xmm2423; SSE2-NEXT: por %xmm4, %xmm2424; SSE2-NEXT: psrlw $8, %xmm2425; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]426; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]427; SSE2-NEXT: pxor %xmm4, %xmm4428; SSE2-NEXT: pcmpgtw %xmm1, %xmm4429; SSE2-NEXT: movdqa %xmm4, %xmm5430; SSE2-NEXT: pandn %xmm0, %xmm5431; SSE2-NEXT: psraw $4, %xmm0432; SSE2-NEXT: pand %xmm4, %xmm0433; SSE2-NEXT: por %xmm5, %xmm0434; SSE2-NEXT: paddw %xmm1, %xmm1435; SSE2-NEXT: pxor %xmm4, %xmm4436; SSE2-NEXT: pcmpgtw %xmm1, %xmm4437; SSE2-NEXT: movdqa %xmm4, %xmm5438; SSE2-NEXT: pandn %xmm0, %xmm5439; SSE2-NEXT: psraw $2, %xmm0440; SSE2-NEXT: pand %xmm4, %xmm0441; SSE2-NEXT: por %xmm5, %xmm0442; SSE2-NEXT: paddw %xmm1, %xmm1443; SSE2-NEXT: pcmpgtw %xmm1, %xmm3444; SSE2-NEXT: movdqa %xmm3, %xmm1445; SSE2-NEXT: pandn %xmm0, %xmm1446; SSE2-NEXT: psraw $1, %xmm0447; SSE2-NEXT: pand %xmm3, %xmm0448; SSE2-NEXT: por %xmm1, %xmm0449; SSE2-NEXT: psrlw $8, %xmm0450; SSE2-NEXT: packuswb %xmm2, %xmm0451; SSE2-NEXT: retq452;453; SSE41-LABEL: var_shift_v16i8:454; SSE41: # %bb.0:455; SSE41-NEXT: movdqa %xmm0, %xmm2456; SSE41-NEXT: psllw $5, %xmm1457; SSE41-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]458; SSE41-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15]459; SSE41-NEXT: movdqa %xmm3, %xmm4460; SSE41-NEXT: psraw $4, %xmm4461; SSE41-NEXT: pblendvb %xmm0, %xmm4, %xmm3462; SSE41-NEXT: movdqa %xmm3, %xmm4463; SSE41-NEXT: psraw $2, %xmm4464; SSE41-NEXT: paddw %xmm0, %xmm0465; SSE41-NEXT: pblendvb %xmm0, %xmm4, %xmm3466; SSE41-NEXT: movdqa %xmm3, %xmm4467; SSE41-NEXT: psraw $1, %xmm4468; SSE41-NEXT: paddw %xmm0, %xmm0469; SSE41-NEXT: pblendvb %xmm0, %xmm4, %xmm3470; SSE41-NEXT: psrlw $8, %xmm3471; SSE41-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]472; SSE41-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]473; SSE41-NEXT: movdqa %xmm1, %xmm2474; SSE41-NEXT: psraw $4, %xmm2475; SSE41-NEXT: pblendvb %xmm0, %xmm2, %xmm1476; SSE41-NEXT: movdqa %xmm1, %xmm2477; SSE41-NEXT: psraw $2, %xmm2478; SSE41-NEXT: paddw %xmm0, %xmm0479; SSE41-NEXT: pblendvb %xmm0, %xmm2, %xmm1480; SSE41-NEXT: movdqa %xmm1, %xmm2481; SSE41-NEXT: psraw $1, %xmm2482; SSE41-NEXT: paddw %xmm0, %xmm0483; SSE41-NEXT: pblendvb %xmm0, %xmm2, %xmm1484; SSE41-NEXT: psrlw $8, %xmm1485; SSE41-NEXT: packuswb %xmm3, %xmm1486; SSE41-NEXT: movdqa %xmm1, %xmm0487; SSE41-NEXT: retq488;489; AVX-LABEL: var_shift_v16i8:490; AVX: # %bb.0:491; AVX-NEXT: vpsllw $5, %xmm1, %xmm1492; AVX-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]493; AVX-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]494; AVX-NEXT: vpsraw $4, %xmm3, %xmm4495; AVX-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm3496; AVX-NEXT: vpsraw $2, %xmm3, %xmm4497; AVX-NEXT: vpaddw %xmm2, %xmm2, %xmm5498; AVX-NEXT: vpblendvb %xmm5, %xmm4, %xmm3, %xmm3499; AVX-NEXT: vpsraw $1, %xmm3, %xmm4500; AVX-NEXT: vpsllw $2, %xmm2, %xmm2501; AVX-NEXT: vpblendvb %xmm2, %xmm4, %xmm3, %xmm2502; AVX-NEXT: vpsrlw $8, %xmm2, %xmm2503; AVX-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]504; AVX-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]505; AVX-NEXT: vpsraw $4, %xmm0, %xmm3506; AVX-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0507; AVX-NEXT: vpsraw $2, %xmm0, %xmm3508; AVX-NEXT: vpaddw %xmm1, %xmm1, %xmm4509; AVX-NEXT: vpblendvb %xmm4, %xmm3, %xmm0, %xmm0510; AVX-NEXT: vpsraw $1, %xmm0, %xmm3511; AVX-NEXT: vpsllw $2, %xmm1, %xmm1512; AVX-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0513; AVX-NEXT: vpsrlw $8, %xmm0, %xmm0514; AVX-NEXT: vpackuswb %xmm2, %xmm0, %xmm0515; AVX-NEXT: retq516;517; XOP-LABEL: var_shift_v16i8:518; XOP: # %bb.0:519; XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2520; XOP-NEXT: vpsubb %xmm1, %xmm2, %xmm1521; XOP-NEXT: vpshab %xmm1, %xmm0, %xmm0522; XOP-NEXT: retq523;524; AVX512DQ-LABEL: var_shift_v16i8:525; AVX512DQ: # %bb.0:526; AVX512DQ-NEXT: vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero527; AVX512DQ-NEXT: vpmovsxbd %xmm0, %zmm0528; AVX512DQ-NEXT: vpsravd %zmm1, %zmm0, %zmm0529; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0530; AVX512DQ-NEXT: vzeroupper531; AVX512DQ-NEXT: retq532;533; AVX512BW-LABEL: var_shift_v16i8:534; AVX512BW: # %bb.0:535; AVX512BW-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero536; AVX512BW-NEXT: vpmovsxbw %xmm0, %ymm0537; AVX512BW-NEXT: vpsravw %zmm1, %zmm0, %zmm0538; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0539; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0540; AVX512BW-NEXT: vzeroupper541; AVX512BW-NEXT: retq542;543; AVX512DQVL-LABEL: var_shift_v16i8:544; AVX512DQVL: # %bb.0:545; AVX512DQVL-NEXT: vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero546; AVX512DQVL-NEXT: vpmovsxbd %xmm0, %zmm0547; AVX512DQVL-NEXT: vpsravd %zmm1, %zmm0, %zmm0548; AVX512DQVL-NEXT: vpmovdb %zmm0, %xmm0549; AVX512DQVL-NEXT: vzeroupper550; AVX512DQVL-NEXT: retq551;552; AVX512BWVL-LABEL: var_shift_v16i8:553; AVX512BWVL: # %bb.0:554; AVX512BWVL-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero555; AVX512BWVL-NEXT: vpmovsxbw %xmm0, %ymm0556; AVX512BWVL-NEXT: vpsravw %ymm1, %ymm0, %ymm0557; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm0558; AVX512BWVL-NEXT: vzeroupper559; AVX512BWVL-NEXT: retq560;561; X86-SSE-LABEL: var_shift_v16i8:562; X86-SSE: # %bb.0:563; X86-SSE-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]564; X86-SSE-NEXT: psllw $5, %xmm1565; X86-SSE-NEXT: punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm1[8],xmm4[9],xmm1[9],xmm4[10],xmm1[10],xmm4[11],xmm1[11],xmm4[12],xmm1[12],xmm4[13],xmm1[13],xmm4[14],xmm1[14],xmm4[15],xmm1[15]566; X86-SSE-NEXT: pxor %xmm3, %xmm3567; X86-SSE-NEXT: pxor %xmm5, %xmm5568; X86-SSE-NEXT: pcmpgtw %xmm4, %xmm5569; X86-SSE-NEXT: movdqa %xmm5, %xmm6570; X86-SSE-NEXT: pandn %xmm2, %xmm6571; X86-SSE-NEXT: psraw $4, %xmm2572; X86-SSE-NEXT: pand %xmm5, %xmm2573; X86-SSE-NEXT: por %xmm6, %xmm2574; X86-SSE-NEXT: paddw %xmm4, %xmm4575; X86-SSE-NEXT: pxor %xmm5, %xmm5576; X86-SSE-NEXT: pcmpgtw %xmm4, %xmm5577; X86-SSE-NEXT: movdqa %xmm5, %xmm6578; X86-SSE-NEXT: pandn %xmm2, %xmm6579; X86-SSE-NEXT: psraw $2, %xmm2580; X86-SSE-NEXT: pand %xmm5, %xmm2581; X86-SSE-NEXT: por %xmm6, %xmm2582; X86-SSE-NEXT: paddw %xmm4, %xmm4583; X86-SSE-NEXT: pxor %xmm5, %xmm5584; X86-SSE-NEXT: pcmpgtw %xmm4, %xmm5585; X86-SSE-NEXT: movdqa %xmm5, %xmm4586; X86-SSE-NEXT: pandn %xmm2, %xmm4587; X86-SSE-NEXT: psraw $1, %xmm2588; X86-SSE-NEXT: pand %xmm5, %xmm2589; X86-SSE-NEXT: por %xmm4, %xmm2590; X86-SSE-NEXT: psrlw $8, %xmm2591; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]592; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]593; X86-SSE-NEXT: pxor %xmm4, %xmm4594; X86-SSE-NEXT: pcmpgtw %xmm1, %xmm4595; X86-SSE-NEXT: movdqa %xmm4, %xmm5596; X86-SSE-NEXT: pandn %xmm0, %xmm5597; X86-SSE-NEXT: psraw $4, %xmm0598; X86-SSE-NEXT: pand %xmm4, %xmm0599; X86-SSE-NEXT: por %xmm5, %xmm0600; X86-SSE-NEXT: paddw %xmm1, %xmm1601; X86-SSE-NEXT: pxor %xmm4, %xmm4602; X86-SSE-NEXT: pcmpgtw %xmm1, %xmm4603; X86-SSE-NEXT: movdqa %xmm4, %xmm5604; X86-SSE-NEXT: pandn %xmm0, %xmm5605; X86-SSE-NEXT: psraw $2, %xmm0606; X86-SSE-NEXT: pand %xmm4, %xmm0607; X86-SSE-NEXT: por %xmm5, %xmm0608; X86-SSE-NEXT: paddw %xmm1, %xmm1609; X86-SSE-NEXT: pcmpgtw %xmm1, %xmm3610; X86-SSE-NEXT: movdqa %xmm3, %xmm1611; X86-SSE-NEXT: pandn %xmm0, %xmm1612; X86-SSE-NEXT: psraw $1, %xmm0613; X86-SSE-NEXT: pand %xmm3, %xmm0614; X86-SSE-NEXT: por %xmm1, %xmm0615; X86-SSE-NEXT: psrlw $8, %xmm0616; X86-SSE-NEXT: packuswb %xmm2, %xmm0617; X86-SSE-NEXT: retl618 %shift = ashr <16 x i8> %a, %b619 ret <16 x i8> %shift620}621 622;623; Uniform Variable Shifts624;625 626define <2 x i64> @splatvar_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {627; SSE-LABEL: splatvar_shift_v2i64:628; SSE: # %bb.0:629; SSE-NEXT: movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]630; SSE-NEXT: psrlq %xmm1, %xmm2631; SSE-NEXT: psrlq %xmm1, %xmm0632; SSE-NEXT: pxor %xmm2, %xmm0633; SSE-NEXT: psubq %xmm2, %xmm0634; SSE-NEXT: retq635;636; AVX1-LABEL: splatvar_shift_v2i64:637; AVX1: # %bb.0:638; AVX1-NEXT: vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]639; AVX1-NEXT: # xmm2 = mem[0,0]640; AVX1-NEXT: vpsrlq %xmm1, %xmm2, %xmm2641; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm0642; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0643; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0644; AVX1-NEXT: retq645;646; AVX2-LABEL: splatvar_shift_v2i64:647; AVX2: # %bb.0:648; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]649; AVX2-NEXT: vpsrlq %xmm1, %xmm2, %xmm2650; AVX2-NEXT: vpsrlq %xmm1, %xmm0, %xmm0651; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0652; AVX2-NEXT: vpsubq %xmm2, %xmm0, %xmm0653; AVX2-NEXT: retq654;655; XOPAVX1-LABEL: splatvar_shift_v2i64:656; XOPAVX1: # %bb.0:657; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2658; XOPAVX1-NEXT: vpsubq %xmm1, %xmm2, %xmm1659; XOPAVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]660; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm0661; XOPAVX1-NEXT: retq662;663; XOPAVX2-LABEL: splatvar_shift_v2i64:664; XOPAVX2: # %bb.0:665; XOPAVX2-NEXT: vpbroadcastq %xmm1, %xmm1666; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2667; XOPAVX2-NEXT: vpsubq %xmm1, %xmm2, %xmm1668; XOPAVX2-NEXT: vpshaq %xmm1, %xmm0, %xmm0669; XOPAVX2-NEXT: retq670;671; AVX512-LABEL: splatvar_shift_v2i64:672; AVX512: # %bb.0:673; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0674; AVX512-NEXT: vpsraq %xmm1, %zmm0, %zmm0675; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0676; AVX512-NEXT: vzeroupper677; AVX512-NEXT: retq678;679; AVX512VL-LABEL: splatvar_shift_v2i64:680; AVX512VL: # %bb.0:681; AVX512VL-NEXT: vpsraq %xmm1, %xmm0, %xmm0682; AVX512VL-NEXT: retq683;684; X86-SSE-LABEL: splatvar_shift_v2i64:685; X86-SSE: # %bb.0:686; X86-SSE-NEXT: movdqa {{.*#+}} xmm2 = [0,2147483648,0,2147483648]687; X86-SSE-NEXT: psrlq %xmm1, %xmm2688; X86-SSE-NEXT: psrlq %xmm1, %xmm0689; X86-SSE-NEXT: pxor %xmm2, %xmm0690; X86-SSE-NEXT: psubq %xmm2, %xmm0691; X86-SSE-NEXT: retl692 %splat = shufflevector <2 x i64> %b, <2 x i64> poison, <2 x i32> zeroinitializer693 %shift = ashr <2 x i64> %a, %splat694 ret <2 x i64> %shift695}696 697define <4 x i32> @splatvar_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {698; SSE2-LABEL: splatvar_shift_v4i32:699; SSE2: # %bb.0:700; SSE2-NEXT: xorps %xmm2, %xmm2701; SSE2-NEXT: movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]702; SSE2-NEXT: psrad %xmm2, %xmm0703; SSE2-NEXT: retq704;705; SSE41-LABEL: splatvar_shift_v4i32:706; SSE41: # %bb.0:707; SSE41-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero708; SSE41-NEXT: psrad %xmm1, %xmm0709; SSE41-NEXT: retq710;711; AVX-LABEL: splatvar_shift_v4i32:712; AVX: # %bb.0:713; AVX-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero714; AVX-NEXT: vpsrad %xmm1, %xmm0, %xmm0715; AVX-NEXT: retq716;717; XOP-LABEL: splatvar_shift_v4i32:718; XOP: # %bb.0:719; XOP-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero720; XOP-NEXT: vpsrad %xmm1, %xmm0, %xmm0721; XOP-NEXT: retq722;723; AVX512-LABEL: splatvar_shift_v4i32:724; AVX512: # %bb.0:725; AVX512-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero726; AVX512-NEXT: vpsrad %xmm1, %xmm0, %xmm0727; AVX512-NEXT: retq728;729; AVX512VL-LABEL: splatvar_shift_v4i32:730; AVX512VL: # %bb.0:731; AVX512VL-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero732; AVX512VL-NEXT: vpsrad %xmm1, %xmm0, %xmm0733; AVX512VL-NEXT: retq734;735; X86-SSE-LABEL: splatvar_shift_v4i32:736; X86-SSE: # %bb.0:737; X86-SSE-NEXT: xorps %xmm2, %xmm2738; X86-SSE-NEXT: movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]739; X86-SSE-NEXT: psrad %xmm2, %xmm0740; X86-SSE-NEXT: retl741 %splat = shufflevector <4 x i32> %b, <4 x i32> poison, <4 x i32> zeroinitializer742 %shift = ashr <4 x i32> %a, %splat743 ret <4 x i32> %shift744}745 746define <8 x i16> @splatvar_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {747; SSE2-LABEL: splatvar_shift_v8i16:748; SSE2: # %bb.0:749; SSE2-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]750; SSE2-NEXT: psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero751; SSE2-NEXT: psraw %xmm1, %xmm0752; SSE2-NEXT: retq753;754; SSE41-LABEL: splatvar_shift_v8i16:755; SSE41: # %bb.0:756; SSE41-NEXT: pmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero757; SSE41-NEXT: psraw %xmm1, %xmm0758; SSE41-NEXT: retq759;760; AVX-LABEL: splatvar_shift_v8i16:761; AVX: # %bb.0:762; AVX-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero763; AVX-NEXT: vpsraw %xmm1, %xmm0, %xmm0764; AVX-NEXT: retq765;766; XOP-LABEL: splatvar_shift_v8i16:767; XOP: # %bb.0:768; XOP-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero769; XOP-NEXT: vpsraw %xmm1, %xmm0, %xmm0770; XOP-NEXT: retq771;772; AVX512-LABEL: splatvar_shift_v8i16:773; AVX512: # %bb.0:774; AVX512-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero775; AVX512-NEXT: vpsraw %xmm1, %xmm0, %xmm0776; AVX512-NEXT: retq777;778; AVX512VL-LABEL: splatvar_shift_v8i16:779; AVX512VL: # %bb.0:780; AVX512VL-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero781; AVX512VL-NEXT: vpsraw %xmm1, %xmm0, %xmm0782; AVX512VL-NEXT: retq783;784; X86-SSE-LABEL: splatvar_shift_v8i16:785; X86-SSE: # %bb.0:786; X86-SSE-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]787; X86-SSE-NEXT: psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero788; X86-SSE-NEXT: psraw %xmm1, %xmm0789; X86-SSE-NEXT: retl790 %splat = shufflevector <8 x i16> %b, <8 x i16> poison, <8 x i32> zeroinitializer791 %shift = ashr <8 x i16> %a, %splat792 ret <8 x i16> %shift793}794 795define <16 x i8> @splatvar_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {796; SSE2-LABEL: splatvar_shift_v16i8:797; SSE2: # %bb.0:798; SSE2-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]799; SSE2-NEXT: psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero800; SSE2-NEXT: psrlw %xmm1, %xmm0801; SSE2-NEXT: pcmpeqd %xmm2, %xmm2802; SSE2-NEXT: psrlw %xmm1, %xmm2803; SSE2-NEXT: psrlw $8, %xmm2804; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]805; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,0,0,0,4,5,6,7]806; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,1,0,1]807; SSE2-NEXT: pand %xmm2, %xmm0808; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32896,32896,32896,32896,32896,32896,32896,32896]809; SSE2-NEXT: psrlw %xmm1, %xmm2810; SSE2-NEXT: pxor %xmm2, %xmm0811; SSE2-NEXT: psubb %xmm2, %xmm0812; SSE2-NEXT: retq813;814; SSE41-LABEL: splatvar_shift_v16i8:815; SSE41: # %bb.0:816; SSE41-NEXT: pmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero817; SSE41-NEXT: psrlw %xmm1, %xmm0818; SSE41-NEXT: pcmpeqd %xmm2, %xmm2819; SSE41-NEXT: psrlw %xmm1, %xmm2820; SSE41-NEXT: pshufb {{.*#+}} xmm2 = xmm2[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]821; SSE41-NEXT: pand %xmm2, %xmm0822; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [32896,32896,32896,32896,32896,32896,32896,32896]823; SSE41-NEXT: psrlw %xmm1, %xmm2824; SSE41-NEXT: pxor %xmm2, %xmm0825; SSE41-NEXT: psubb %xmm2, %xmm0826; SSE41-NEXT: retq827;828; AVX1-LABEL: splatvar_shift_v16i8:829; AVX1: # %bb.0:830; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero831; AVX1-NEXT: vpsrlw %xmm1, %xmm0, %xmm0832; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2833; AVX1-NEXT: vpsrlw %xmm1, %xmm2, %xmm2834; AVX1-NEXT: vpshufb {{.*#+}} xmm2 = xmm2[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]835; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0836; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [32896,32896,32896,32896,32896,32896,32896,32896]837; AVX1-NEXT: vpsrlw %xmm1, %xmm2, %xmm1838; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0839; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm0840; AVX1-NEXT: retq841;842; AVX2-LABEL: splatvar_shift_v16i8:843; AVX2: # %bb.0:844; AVX2-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero845; AVX2-NEXT: vpsrlw %xmm1, %xmm0, %xmm0846; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2847; AVX2-NEXT: vpsrlw %xmm1, %xmm2, %xmm2848; AVX2-NEXT: vpsrlw $8, %xmm2, %xmm2849; AVX2-NEXT: vpbroadcastb %xmm2, %xmm2850; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0851; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]852; AVX2-NEXT: vpsrlw %xmm1, %xmm2, %xmm1853; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0854; AVX2-NEXT: vpsubb %xmm1, %xmm0, %xmm0855; AVX2-NEXT: retq856;857; XOPAVX1-LABEL: splatvar_shift_v16i8:858; XOPAVX1: # %bb.0:859; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2860; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1861; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1862; XOPAVX1-NEXT: vpshab %xmm1, %xmm0, %xmm0863; XOPAVX1-NEXT: retq864;865; XOPAVX2-LABEL: splatvar_shift_v16i8:866; XOPAVX2: # %bb.0:867; XOPAVX2-NEXT: vpbroadcastb %xmm1, %xmm1868; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2869; XOPAVX2-NEXT: vpsubb %xmm1, %xmm2, %xmm1870; XOPAVX2-NEXT: vpshab %xmm1, %xmm0, %xmm0871; XOPAVX2-NEXT: retq872;873; AVX512DQ-LABEL: splatvar_shift_v16i8:874; AVX512DQ: # %bb.0:875; AVX512DQ-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero876; AVX512DQ-NEXT: vpmovsxbd %xmm0, %zmm0877; AVX512DQ-NEXT: vpsrad %xmm1, %zmm0, %zmm0878; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0879; AVX512DQ-NEXT: vzeroupper880; AVX512DQ-NEXT: retq881;882; AVX512BW-LABEL: splatvar_shift_v16i8:883; AVX512BW: # %bb.0:884; AVX512BW-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero885; AVX512BW-NEXT: vpmovsxbw %xmm0, %ymm0886; AVX512BW-NEXT: vpsraw %xmm1, %ymm0, %ymm0887; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0888; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0889; AVX512BW-NEXT: vzeroupper890; AVX512BW-NEXT: retq891;892; AVX512DQVL-LABEL: splatvar_shift_v16i8:893; AVX512DQVL: # %bb.0:894; AVX512DQVL-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero895; AVX512DQVL-NEXT: vpmovsxbd %xmm0, %zmm0896; AVX512DQVL-NEXT: vpsrad %xmm1, %zmm0, %zmm0897; AVX512DQVL-NEXT: vpmovdb %zmm0, %xmm0898; AVX512DQVL-NEXT: vzeroupper899; AVX512DQVL-NEXT: retq900;901; AVX512BWVL-LABEL: splatvar_shift_v16i8:902; AVX512BWVL: # %bb.0:903; AVX512BWVL-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero904; AVX512BWVL-NEXT: vpmovsxbw %xmm0, %ymm0905; AVX512BWVL-NEXT: vpsraw %xmm1, %ymm0, %ymm0906; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm0907; AVX512BWVL-NEXT: vzeroupper908; AVX512BWVL-NEXT: retq909;910; X86-SSE-LABEL: splatvar_shift_v16i8:911; X86-SSE: # %bb.0:912; X86-SSE-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]913; X86-SSE-NEXT: psrldq {{.*#+}} xmm1 = xmm1[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero914; X86-SSE-NEXT: psrlw %xmm1, %xmm0915; X86-SSE-NEXT: pcmpeqd %xmm2, %xmm2916; X86-SSE-NEXT: psrlw %xmm1, %xmm2917; X86-SSE-NEXT: psrlw $8, %xmm2918; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]919; X86-SSE-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,0,0,0,4,5,6,7]920; X86-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,1,0,1]921; X86-SSE-NEXT: pand %xmm2, %xmm0922; X86-SSE-NEXT: movdqa {{.*#+}} xmm2 = [32896,32896,32896,32896,32896,32896,32896,32896]923; X86-SSE-NEXT: psrlw %xmm1, %xmm2924; X86-SSE-NEXT: pxor %xmm2, %xmm0925; X86-SSE-NEXT: psubb %xmm2, %xmm0926; X86-SSE-NEXT: retl927 %splat = shufflevector <16 x i8> %b, <16 x i8> poison, <16 x i32> zeroinitializer928 %shift = ashr <16 x i8> %a, %splat929 ret <16 x i8> %shift930}931 932;933; Uniform Variable Modulo Shifts934;935 936define <2 x i64> @splatvar_modulo_shift_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {937; SSE-LABEL: splatvar_modulo_shift_v2i64:938; SSE: # %bb.0:939; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1940; SSE-NEXT: movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]941; SSE-NEXT: psrlq %xmm1, %xmm2942; SSE-NEXT: psrlq %xmm1, %xmm0943; SSE-NEXT: pxor %xmm2, %xmm0944; SSE-NEXT: psubq %xmm2, %xmm0945; SSE-NEXT: retq946;947; AVX1-LABEL: splatvar_modulo_shift_v2i64:948; AVX1: # %bb.0:949; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1950; AVX1-NEXT: vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]951; AVX1-NEXT: # xmm2 = mem[0,0]952; AVX1-NEXT: vpsrlq %xmm1, %xmm2, %xmm2953; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm0954; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0955; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0956; AVX1-NEXT: retq957;958; AVX2-LABEL: splatvar_modulo_shift_v2i64:959; AVX2: # %bb.0:960; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1961; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]962; AVX2-NEXT: vpsrlq %xmm1, %xmm2, %xmm2963; AVX2-NEXT: vpsrlq %xmm1, %xmm0, %xmm0964; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0965; AVX2-NEXT: vpsubq %xmm2, %xmm0, %xmm0966; AVX2-NEXT: retq967;968; XOPAVX1-LABEL: splatvar_modulo_shift_v2i64:969; XOPAVX1: # %bb.0:970; XOPAVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1971; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2972; XOPAVX1-NEXT: vpsubq %xmm1, %xmm2, %xmm1973; XOPAVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]974; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm0975; XOPAVX1-NEXT: retq976;977; XOPAVX2-LABEL: splatvar_modulo_shift_v2i64:978; XOPAVX2: # %bb.0:979; XOPAVX2-NEXT: vpbroadcastq %xmm1, %xmm1980; XOPAVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1981; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2982; XOPAVX2-NEXT: vpsubq %xmm1, %xmm2, %xmm1983; XOPAVX2-NEXT: vpshaq %xmm1, %xmm0, %xmm0984; XOPAVX2-NEXT: retq985;986; AVX512-LABEL: splatvar_modulo_shift_v2i64:987; AVX512: # %bb.0:988; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0989; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1990; AVX512-NEXT: vpsraq %xmm1, %zmm0, %zmm0991; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0992; AVX512-NEXT: vzeroupper993; AVX512-NEXT: retq994;995; AVX512VL-LABEL: splatvar_modulo_shift_v2i64:996; AVX512VL: # %bb.0:997; AVX512VL-NEXT: vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm1, %xmm1998; AVX512VL-NEXT: vpsraq %xmm1, %xmm0, %xmm0999; AVX512VL-NEXT: retq1000;1001; X86-SSE-LABEL: splatvar_modulo_shift_v2i64:1002; X86-SSE: # %bb.0:1003; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11004; X86-SSE-NEXT: movdqa {{.*#+}} xmm2 = [0,2147483648,0,2147483648]1005; X86-SSE-NEXT: psrlq %xmm1, %xmm21006; X86-SSE-NEXT: psrlq %xmm1, %xmm01007; X86-SSE-NEXT: pxor %xmm2, %xmm01008; X86-SSE-NEXT: psubq %xmm2, %xmm01009; X86-SSE-NEXT: retl1010 %mod = and <2 x i64> %b, <i64 63, i64 63>1011 %splat = shufflevector <2 x i64> %mod, <2 x i64> poison, <2 x i32> zeroinitializer1012 %shift = ashr <2 x i64> %a, %splat1013 ret <2 x i64> %shift1014}1015 1016define <4 x i32> @splatvar_modulo_shift_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {1017; SSE-LABEL: splatvar_modulo_shift_v4i32:1018; SSE: # %bb.0:1019; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11020; SSE-NEXT: psrad %xmm1, %xmm01021; SSE-NEXT: retq1022;1023; AVX-LABEL: splatvar_modulo_shift_v4i32:1024; AVX: # %bb.0:1025; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11026; AVX-NEXT: vpsrad %xmm1, %xmm0, %xmm01027; AVX-NEXT: retq1028;1029; XOP-LABEL: splatvar_modulo_shift_v4i32:1030; XOP: # %bb.0:1031; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11032; XOP-NEXT: vpsrad %xmm1, %xmm0, %xmm01033; XOP-NEXT: retq1034;1035; AVX512-LABEL: splatvar_modulo_shift_v4i32:1036; AVX512: # %bb.0:1037; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11038; AVX512-NEXT: vpsrad %xmm1, %xmm0, %xmm01039; AVX512-NEXT: retq1040;1041; AVX512VL-LABEL: splatvar_modulo_shift_v4i32:1042; AVX512VL: # %bb.0:1043; AVX512VL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11044; AVX512VL-NEXT: vpsrad %xmm1, %xmm0, %xmm01045; AVX512VL-NEXT: retq1046;1047; X86-SSE-LABEL: splatvar_modulo_shift_v4i32:1048; X86-SSE: # %bb.0:1049; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11050; X86-SSE-NEXT: psrad %xmm1, %xmm01051; X86-SSE-NEXT: retl1052 %mod = and <4 x i32> %b, <i32 31, i32 31, i32 31, i32 31>1053 %splat = shufflevector <4 x i32> %mod, <4 x i32> poison, <4 x i32> zeroinitializer1054 %shift = ashr <4 x i32> %a, %splat1055 ret <4 x i32> %shift1056}1057 1058define <8 x i16> @splatvar_modulo_shift_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {1059; SSE-LABEL: splatvar_modulo_shift_v8i16:1060; SSE: # %bb.0:1061; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11062; SSE-NEXT: psraw %xmm1, %xmm01063; SSE-NEXT: retq1064;1065; AVX-LABEL: splatvar_modulo_shift_v8i16:1066; AVX: # %bb.0:1067; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11068; AVX-NEXT: vpsraw %xmm1, %xmm0, %xmm01069; AVX-NEXT: retq1070;1071; XOP-LABEL: splatvar_modulo_shift_v8i16:1072; XOP: # %bb.0:1073; XOP-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11074; XOP-NEXT: vpsraw %xmm1, %xmm0, %xmm01075; XOP-NEXT: retq1076;1077; AVX512-LABEL: splatvar_modulo_shift_v8i16:1078; AVX512: # %bb.0:1079; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11080; AVX512-NEXT: vpsraw %xmm1, %xmm0, %xmm01081; AVX512-NEXT: retq1082;1083; AVX512VL-LABEL: splatvar_modulo_shift_v8i16:1084; AVX512VL: # %bb.0:1085; AVX512VL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11086; AVX512VL-NEXT: vpsraw %xmm1, %xmm0, %xmm01087; AVX512VL-NEXT: retq1088;1089; X86-SSE-LABEL: splatvar_modulo_shift_v8i16:1090; X86-SSE: # %bb.0:1091; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11092; X86-SSE-NEXT: psraw %xmm1, %xmm01093; X86-SSE-NEXT: retl1094 %mod = and <8 x i16> %b, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>1095 %splat = shufflevector <8 x i16> %mod, <8 x i16> poison, <8 x i32> zeroinitializer1096 %shift = ashr <8 x i16> %a, %splat1097 ret <8 x i16> %shift1098}1099 1100define <16 x i8> @splatvar_modulo_shift_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {1101; SSE2-LABEL: splatvar_modulo_shift_v16i8:1102; SSE2: # %bb.0:1103; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11104; SSE2-NEXT: psrlw %xmm1, %xmm01105; SSE2-NEXT: pcmpeqd %xmm2, %xmm21106; SSE2-NEXT: psrlw %xmm1, %xmm21107; SSE2-NEXT: psrlw $8, %xmm21108; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1109; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,0,0,0,4,5,6,7]1110; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,1,0,1]1111; SSE2-NEXT: pand %xmm2, %xmm01112; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32896,32896,32896,32896,32896,32896,32896,32896]1113; SSE2-NEXT: psrlw %xmm1, %xmm21114; SSE2-NEXT: pxor %xmm2, %xmm01115; SSE2-NEXT: psubb %xmm2, %xmm01116; SSE2-NEXT: retq1117;1118; SSE41-LABEL: splatvar_modulo_shift_v16i8:1119; SSE41: # %bb.0:1120; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11121; SSE41-NEXT: psrlw %xmm1, %xmm01122; SSE41-NEXT: pcmpeqd %xmm2, %xmm21123; SSE41-NEXT: psrlw %xmm1, %xmm21124; SSE41-NEXT: pshufb {{.*#+}} xmm2 = xmm2[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1125; SSE41-NEXT: pand %xmm2, %xmm01126; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [32896,32896,32896,32896,32896,32896,32896,32896]1127; SSE41-NEXT: psrlw %xmm1, %xmm21128; SSE41-NEXT: pxor %xmm2, %xmm01129; SSE41-NEXT: psubb %xmm2, %xmm01130; SSE41-NEXT: retq1131;1132; AVX1-LABEL: splatvar_modulo_shift_v16i8:1133; AVX1: # %bb.0:1134; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11135; AVX1-NEXT: vpsrlw %xmm1, %xmm0, %xmm01136; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm21137; AVX1-NEXT: vpsrlw %xmm1, %xmm2, %xmm21138; AVX1-NEXT: vpshufb {{.*#+}} xmm2 = xmm2[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1139; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm01140; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [32896,32896,32896,32896,32896,32896,32896,32896]1141; AVX1-NEXT: vpsrlw %xmm1, %xmm2, %xmm11142; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm01143; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm01144; AVX1-NEXT: retq1145;1146; AVX2-LABEL: splatvar_modulo_shift_v16i8:1147; AVX2: # %bb.0:1148; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11149; AVX2-NEXT: vpsrlw %xmm1, %xmm0, %xmm01150; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm21151; AVX2-NEXT: vpsrlw %xmm1, %xmm2, %xmm21152; AVX2-NEXT: vpsrlw $8, %xmm2, %xmm21153; AVX2-NEXT: vpbroadcastb %xmm2, %xmm21154; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm01155; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]1156; AVX2-NEXT: vpsrlw %xmm1, %xmm2, %xmm11157; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm01158; AVX2-NEXT: vpsubb %xmm1, %xmm0, %xmm01159; AVX2-NEXT: retq1160;1161; XOPAVX1-LABEL: splatvar_modulo_shift_v16i8:1162; XOPAVX1: # %bb.0:1163; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm21164; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm11165; XOPAVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11166; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm11167; XOPAVX1-NEXT: vpshab %xmm1, %xmm0, %xmm01168; XOPAVX1-NEXT: retq1169;1170; XOPAVX2-LABEL: splatvar_modulo_shift_v16i8:1171; XOPAVX2: # %bb.0:1172; XOPAVX2-NEXT: vpbroadcastb %xmm1, %xmm11173; XOPAVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11174; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm21175; XOPAVX2-NEXT: vpsubb %xmm1, %xmm2, %xmm11176; XOPAVX2-NEXT: vpshab %xmm1, %xmm0, %xmm01177; XOPAVX2-NEXT: retq1178;1179; AVX512DQ-LABEL: splatvar_modulo_shift_v16i8:1180; AVX512DQ: # %bb.0:1181; AVX512DQ-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11182; AVX512DQ-NEXT: vpmovsxbd %xmm0, %zmm01183; AVX512DQ-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1184; AVX512DQ-NEXT: vpsrad %xmm1, %zmm0, %zmm01185; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm01186; AVX512DQ-NEXT: vzeroupper1187; AVX512DQ-NEXT: retq1188;1189; AVX512BW-LABEL: splatvar_modulo_shift_v16i8:1190; AVX512BW: # %bb.0:1191; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11192; AVX512BW-NEXT: vpmovsxbw %xmm0, %ymm01193; AVX512BW-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1194; AVX512BW-NEXT: vpsraw %xmm1, %ymm0, %ymm01195; AVX512BW-NEXT: vpmovwb %zmm0, %ymm01196; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01197; AVX512BW-NEXT: vzeroupper1198; AVX512BW-NEXT: retq1199;1200; AVX512DQVL-LABEL: splatvar_modulo_shift_v16i8:1201; AVX512DQVL: # %bb.0:1202; AVX512DQVL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm11203; AVX512DQVL-NEXT: vpmovsxbd %xmm0, %zmm01204; AVX512DQVL-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1205; AVX512DQVL-NEXT: vpsrad %xmm1, %zmm0, %zmm01206; AVX512DQVL-NEXT: vpmovdb %zmm0, %xmm01207; AVX512DQVL-NEXT: vzeroupper1208; AVX512DQVL-NEXT: retq1209;1210; AVX512BWVL-LABEL: splatvar_modulo_shift_v16i8:1211; AVX512BWVL: # %bb.0:1212; AVX512BWVL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm11213; AVX512BWVL-NEXT: vpmovsxbw %xmm0, %ymm01214; AVX512BWVL-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1215; AVX512BWVL-NEXT: vpsraw %xmm1, %ymm0, %ymm01216; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm01217; AVX512BWVL-NEXT: vzeroupper1218; AVX512BWVL-NEXT: retq1219;1220; X86-SSE-LABEL: splatvar_modulo_shift_v16i8:1221; X86-SSE: # %bb.0:1222; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11223; X86-SSE-NEXT: psrlw %xmm1, %xmm01224; X86-SSE-NEXT: pcmpeqd %xmm2, %xmm21225; X86-SSE-NEXT: psrlw %xmm1, %xmm21226; X86-SSE-NEXT: psrlw $8, %xmm21227; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1228; X86-SSE-NEXT: pshuflw {{.*#+}} xmm2 = xmm2[0,0,0,0,4,5,6,7]1229; X86-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,1,0,1]1230; X86-SSE-NEXT: pand %xmm2, %xmm01231; X86-SSE-NEXT: movdqa {{.*#+}} xmm2 = [32896,32896,32896,32896,32896,32896,32896,32896]1232; X86-SSE-NEXT: psrlw %xmm1, %xmm21233; X86-SSE-NEXT: pxor %xmm2, %xmm01234; X86-SSE-NEXT: psubb %xmm2, %xmm01235; X86-SSE-NEXT: retl1236 %mod = and <16 x i8> %b, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>1237 %splat = shufflevector <16 x i8> %mod, <16 x i8> poison, <16 x i32> zeroinitializer1238 %shift = ashr <16 x i8> %a, %splat1239 ret <16 x i8> %shift1240}1241 1242;1243; Constant Shifts1244;1245 1246define <2 x i64> @constant_shift_v2i64(<2 x i64> %a) nounwind {1247; SSE2-LABEL: constant_shift_v2i64:1248; SSE2: # %bb.0:1249; SSE2-NEXT: movdqa %xmm0, %xmm11250; SSE2-NEXT: psrlq $1, %xmm11251; SSE2-NEXT: psrlq $7, %xmm01252; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]1253; SSE2-NEXT: movapd {{.*#+}} xmm1 = [4611686018427387904,72057594037927936]1254; SSE2-NEXT: xorpd %xmm1, %xmm01255; SSE2-NEXT: psubq %xmm1, %xmm01256; SSE2-NEXT: retq1257;1258; SSE41-LABEL: constant_shift_v2i64:1259; SSE41: # %bb.0:1260; SSE41-NEXT: movdqa %xmm0, %xmm11261; SSE41-NEXT: psrlq $7, %xmm11262; SSE41-NEXT: psrlq $1, %xmm01263; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]1264; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [4611686018427387904,72057594037927936]1265; SSE41-NEXT: pxor %xmm1, %xmm01266; SSE41-NEXT: psubq %xmm1, %xmm01267; SSE41-NEXT: retq1268;1269; AVX1-LABEL: constant_shift_v2i64:1270; AVX1: # %bb.0:1271; AVX1-NEXT: vpsrlq $7, %xmm0, %xmm11272; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm01273; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]1274; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [4611686018427387904,72057594037927936]1275; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm01276; AVX1-NEXT: vpsubq %xmm1, %xmm0, %xmm01277; AVX1-NEXT: retq1278;1279; AVX2-LABEL: constant_shift_v2i64:1280; AVX2: # %bb.0:1281; AVX2-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01282; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [4611686018427387904,72057594037927936]1283; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm01284; AVX2-NEXT: vpsubq %xmm1, %xmm0, %xmm01285; AVX2-NEXT: retq1286;1287; XOP-LABEL: constant_shift_v2i64:1288; XOP: # %bb.0:1289; XOP-NEXT: vpshaq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01290; XOP-NEXT: retq1291;1292; AVX512-LABEL: constant_shift_v2i64:1293; AVX512: # %bb.0:1294; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01295; AVX512-NEXT: vpmovsxbq {{.*#+}} xmm1 = [1,7]1296; AVX512-NEXT: vpsravq %zmm1, %zmm0, %zmm01297; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01298; AVX512-NEXT: vzeroupper1299; AVX512-NEXT: retq1300;1301; AVX512VL-LABEL: constant_shift_v2i64:1302; AVX512VL: # %bb.0:1303; AVX512VL-NEXT: vpsravq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01304; AVX512VL-NEXT: retq1305;1306; X86-SSE-LABEL: constant_shift_v2i64:1307; X86-SSE: # %bb.0:1308; X86-SSE-NEXT: movdqa %xmm0, %xmm11309; X86-SSE-NEXT: psrlq $1, %xmm11310; X86-SSE-NEXT: psrlq $7, %xmm01311; X86-SSE-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]1312; X86-SSE-NEXT: movapd {{.*#+}} xmm1 = [0,1073741824,0,16777216]1313; X86-SSE-NEXT: xorpd %xmm1, %xmm01314; X86-SSE-NEXT: psubq %xmm1, %xmm01315; X86-SSE-NEXT: retl1316 %shift = ashr <2 x i64> %a, <i64 1, i64 7>1317 ret <2 x i64> %shift1318}1319 1320define <4 x i32> @constant_shift_v4i32(<4 x i32> %a) nounwind {1321; SSE2-LABEL: constant_shift_v4i32:1322; SSE2: # %bb.0:1323; SSE2-NEXT: movdqa %xmm0, %xmm11324; SSE2-NEXT: psrad $7, %xmm11325; SSE2-NEXT: movdqa %xmm0, %xmm21326; SSE2-NEXT: psrad $6, %xmm21327; SSE2-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm1[1]1328; SSE2-NEXT: movdqa %xmm0, %xmm11329; SSE2-NEXT: psrad $5, %xmm11330; SSE2-NEXT: psrad $4, %xmm01331; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1332; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,3],xmm2[0,3]1333; SSE2-NEXT: retq1334;1335; SSE41-LABEL: constant_shift_v4i32:1336; SSE41: # %bb.0:1337; SSE41-NEXT: movdqa %xmm0, %xmm11338; SSE41-NEXT: psrad $7, %xmm11339; SSE41-NEXT: movdqa %xmm0, %xmm21340; SSE41-NEXT: psrad $5, %xmm21341; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7]1342; SSE41-NEXT: movdqa %xmm0, %xmm11343; SSE41-NEXT: psrad $6, %xmm11344; SSE41-NEXT: psrad $4, %xmm01345; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]1346; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]1347; SSE41-NEXT: retq1348;1349; AVX1-LABEL: constant_shift_v4i32:1350; AVX1: # %bb.0:1351; AVX1-NEXT: vpsrad $7, %xmm0, %xmm11352; AVX1-NEXT: vpsrad $5, %xmm0, %xmm21353; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]1354; AVX1-NEXT: vpsrad $6, %xmm0, %xmm21355; AVX1-NEXT: vpsrad $4, %xmm0, %xmm01356; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]1357; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]1358; AVX1-NEXT: retq1359;1360; AVX2-LABEL: constant_shift_v4i32:1361; AVX2: # %bb.0:1362; AVX2-NEXT: vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01363; AVX2-NEXT: retq1364;1365; XOPAVX1-LABEL: constant_shift_v4i32:1366; XOPAVX1: # %bb.0:1367; XOPAVX1-NEXT: vpshad {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01368; XOPAVX1-NEXT: retq1369;1370; XOPAVX2-LABEL: constant_shift_v4i32:1371; XOPAVX2: # %bb.0:1372; XOPAVX2-NEXT: vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01373; XOPAVX2-NEXT: retq1374;1375; AVX512-LABEL: constant_shift_v4i32:1376; AVX512: # %bb.0:1377; AVX512-NEXT: vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01378; AVX512-NEXT: retq1379;1380; AVX512VL-LABEL: constant_shift_v4i32:1381; AVX512VL: # %bb.0:1382; AVX512VL-NEXT: vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01383; AVX512VL-NEXT: retq1384;1385; X86-SSE-LABEL: constant_shift_v4i32:1386; X86-SSE: # %bb.0:1387; X86-SSE-NEXT: movdqa %xmm0, %xmm11388; X86-SSE-NEXT: psrad $7, %xmm11389; X86-SSE-NEXT: movdqa %xmm0, %xmm21390; X86-SSE-NEXT: psrad $6, %xmm21391; X86-SSE-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm1[1]1392; X86-SSE-NEXT: movdqa %xmm0, %xmm11393; X86-SSE-NEXT: psrad $5, %xmm11394; X86-SSE-NEXT: psrad $4, %xmm01395; X86-SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]1396; X86-SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,3],xmm2[0,3]1397; X86-SSE-NEXT: retl1398 %shift = ashr <4 x i32> %a, <i32 4, i32 5, i32 6, i32 7>1399 ret <4 x i32> %shift1400}1401 1402define <8 x i16> @constant_shift_v8i16(<8 x i16> %a) nounwind {1403; SSE2-LABEL: constant_shift_v8i16:1404; SSE2: # %bb.0:1405; SSE2-NEXT: movdqa %xmm0, %xmm11406; SSE2-NEXT: psraw $4, %xmm11407; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]1408; SSE2-NEXT: movapd %xmm1, %xmm21409; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm1[2,3]1410; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3,2,3]1411; SSE2-NEXT: psraw $2, %xmm11412; SSE2-NEXT: unpcklps {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]1413; SSE2-NEXT: movaps {{.*#+}} xmm0 = [65535,0,65535,0,65535,0,65535,0]1414; SSE2-NEXT: movaps %xmm2, %xmm11415; SSE2-NEXT: andps %xmm0, %xmm11416; SSE2-NEXT: psraw $1, %xmm21417; SSE2-NEXT: andnps %xmm2, %xmm01418; SSE2-NEXT: orps %xmm1, %xmm01419; SSE2-NEXT: retq1420;1421; SSE41-LABEL: constant_shift_v8i16:1422; SSE41: # %bb.0:1423; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [u,u,16384,8192,4096,2048,1024,512]1424; SSE41-NEXT: pmulhw %xmm0, %xmm11425; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5,6,7]1426; SSE41-NEXT: psraw $1, %xmm01427; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3,4,5,6,7]1428; SSE41-NEXT: retq1429;1430; AVX-LABEL: constant_shift_v8i16:1431; AVX: # %bb.0:1432; AVX-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [u,u,16384,8192,4096,2048,1024,512]1433; AVX-NEXT: vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5,6,7]1434; AVX-NEXT: vpsraw $1, %xmm0, %xmm01435; AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3,4,5,6,7]1436; AVX-NEXT: retq1437;1438; XOP-LABEL: constant_shift_v8i16:1439; XOP: # %bb.0:1440; XOP-NEXT: vpshaw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01441; XOP-NEXT: retq1442;1443; AVX512DQ-LABEL: constant_shift_v8i16:1444; AVX512DQ: # %bb.0:1445; AVX512DQ-NEXT: vpmovsxwd %xmm0, %ymm01446; AVX512DQ-NEXT: vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01447; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm01448; AVX512DQ-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01449; AVX512DQ-NEXT: vzeroupper1450; AVX512DQ-NEXT: retq1451;1452; AVX512BW-LABEL: constant_shift_v8i16:1453; AVX512BW: # %bb.0:1454; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01455; AVX512BW-NEXT: vpmovsxbw {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7]1456; AVX512BW-NEXT: vpsravw %zmm1, %zmm0, %zmm01457; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01458; AVX512BW-NEXT: vzeroupper1459; AVX512BW-NEXT: retq1460;1461; AVX512DQVL-LABEL: constant_shift_v8i16:1462; AVX512DQVL: # %bb.0:1463; AVX512DQVL-NEXT: vpmovsxwd %xmm0, %ymm01464; AVX512DQVL-NEXT: vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01465; AVX512DQVL-NEXT: vpmovdw %ymm0, %xmm01466; AVX512DQVL-NEXT: vzeroupper1467; AVX512DQVL-NEXT: retq1468;1469; AVX512BWVL-LABEL: constant_shift_v8i16:1470; AVX512BWVL: # %bb.0:1471; AVX512BWVL-NEXT: vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01472; AVX512BWVL-NEXT: retq1473;1474; X86-SSE-LABEL: constant_shift_v8i16:1475; X86-SSE: # %bb.0:1476; X86-SSE-NEXT: movdqa %xmm0, %xmm11477; X86-SSE-NEXT: psraw $4, %xmm11478; X86-SSE-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]1479; X86-SSE-NEXT: movapd %xmm1, %xmm21480; X86-SSE-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm1[2,3]1481; X86-SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3,2,3]1482; X86-SSE-NEXT: psraw $2, %xmm11483; X86-SSE-NEXT: unpcklps {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]1484; X86-SSE-NEXT: movaps {{.*#+}} xmm0 = [65535,0,65535,0,65535,0,65535,0]1485; X86-SSE-NEXT: movaps %xmm2, %xmm11486; X86-SSE-NEXT: andps %xmm0, %xmm11487; X86-SSE-NEXT: psraw $1, %xmm21488; X86-SSE-NEXT: andnps %xmm2, %xmm01489; X86-SSE-NEXT: orps %xmm1, %xmm01490; X86-SSE-NEXT: retl1491 %shift = ashr <8 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>1492 ret <8 x i16> %shift1493}1494 1495define <8 x i16> @constant_shift_v8i16_pairs(<8 x i16> %a) nounwind {1496; SSE2-LABEL: constant_shift_v8i16_pairs:1497; SSE2: # %bb.0:1498; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [512,512,u,u,8192,8192,1024,1024]1499; SSE2-NEXT: pmulhw %xmm0, %xmm11500; SSE2-NEXT: psraw $1, %xmm01501; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[0,0]1502; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]1503; SSE2-NEXT: retq1504;1505; SSE41-LABEL: constant_shift_v8i16_pairs:1506; SSE41: # %bb.0:1507; SSE41-NEXT: movdqa %xmm0, %xmm11508; SSE41-NEXT: psraw $1, %xmm11509; SSE41-NEXT: pmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [512,512,u,u,8192,8192,1024,1024]1510; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]1511; SSE41-NEXT: retq1512;1513; AVX1-LABEL: constant_shift_v8i16_pairs:1514; AVX1: # %bb.0:1515; AVX1-NEXT: vpsraw $1, %xmm0, %xmm11516; AVX1-NEXT: vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [512,512,u,u,8192,8192,1024,1024]1517; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]1518; AVX1-NEXT: retq1519;1520; AVX2-LABEL: constant_shift_v8i16_pairs:1521; AVX2: # %bb.0:1522; AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01523; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01524; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [256,256,16384,16384,4096,4096,512,512]1525; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm01526; AVX2-NEXT: vpsubw %xmm1, %xmm0, %xmm01527; AVX2-NEXT: retq1528;1529; XOP-LABEL: constant_shift_v8i16_pairs:1530; XOP: # %bb.0:1531; XOP-NEXT: vpshaw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01532; XOP-NEXT: retq1533;1534; AVX512DQ-LABEL: constant_shift_v8i16_pairs:1535; AVX512DQ: # %bb.0:1536; AVX512DQ-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01537; AVX512DQ-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01538; AVX512DQ-NEXT: vmovdqa {{.*#+}} xmm1 = [256,256,16384,16384,4096,4096,512,512]1539; AVX512DQ-NEXT: vpxor %xmm1, %xmm0, %xmm01540; AVX512DQ-NEXT: vpsubw %xmm1, %xmm0, %xmm01541; AVX512DQ-NEXT: retq1542;1543; AVX512BW-LABEL: constant_shift_v8i16_pairs:1544; AVX512BW: # %bb.0:1545; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01546; AVX512BW-NEXT: vpmovsxbw {{.*#+}} xmm1 = [7,7,1,1,3,3,6,6]1547; AVX512BW-NEXT: vpsravw %zmm1, %zmm0, %zmm01548; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01549; AVX512BW-NEXT: vzeroupper1550; AVX512BW-NEXT: retq1551;1552; AVX512DQVL-LABEL: constant_shift_v8i16_pairs:1553; AVX512DQVL: # %bb.0:1554; AVX512DQVL-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01555; AVX512DQVL-NEXT: vmovdqa {{.*#+}} xmm1 = [256,256,16384,16384,4096,4096,512,512]1556; AVX512DQVL-NEXT: vpternlogq {{.*#+}} xmm0 = xmm1 ^ (xmm0 & mem)1557; AVX512DQVL-NEXT: vpsubw %xmm1, %xmm0, %xmm01558; AVX512DQVL-NEXT: retq1559;1560; AVX512BWVL-LABEL: constant_shift_v8i16_pairs:1561; AVX512BWVL: # %bb.0:1562; AVX512BWVL-NEXT: vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01563; AVX512BWVL-NEXT: retq1564;1565; X86-SSE-LABEL: constant_shift_v8i16_pairs:1566; X86-SSE: # %bb.0:1567; X86-SSE-NEXT: movdqa {{.*#+}} xmm1 = [512,512,u,u,8192,8192,1024,1024]1568; X86-SSE-NEXT: pmulhw %xmm0, %xmm11569; X86-SSE-NEXT: psraw $1, %xmm01570; X86-SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[0,0]1571; X86-SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]1572; X86-SSE-NEXT: retl1573 %shift = ashr <8 x i16> %a, <i16 7, i16 7, i16 1, i16 1, i16 3, i16 3, i16 6, i16 6>1574 ret <8 x i16> %shift1575}1576 1577define <16 x i8> @constant_shift_v16i8(<16 x i8> %a) nounwind {1578; SSE-LABEL: constant_shift_v16i8:1579; SSE: # %bb.0:1580; SSE-NEXT: movdqa %xmm0, %xmm11581; SSE-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]1582; SSE-NEXT: psraw $8, %xmm11583; SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [2,4,8,16,32,64,128,256]1584; SSE-NEXT: psrlw $8, %xmm11585; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1586; SSE-NEXT: psraw $8, %xmm01587; SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [256,128,64,32,16,8,4,2]1588; SSE-NEXT: psrlw $8, %xmm01589; SSE-NEXT: packuswb %xmm1, %xmm01590; SSE-NEXT: retq1591;1592; AVX1-LABEL: constant_shift_v16i8:1593; AVX1: # %bb.0:1594; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1595; AVX1-NEXT: vpsraw $8, %xmm1, %xmm11596; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [2,4,8,16,32,64,128,256]1597; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm11598; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1599; AVX1-NEXT: vpsraw $8, %xmm0, %xmm01600; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [256,128,64,32,16,8,4,2]1601; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm01602; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm01603; AVX1-NEXT: retq1604;1605; AVX2-LABEL: constant_shift_v16i8:1606; AVX2: # %bb.0:1607; AVX2-NEXT: vpmovsxbw %xmm0, %ymm01608; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [256,128,64,32,16,8,4,2,2,4,8,16,32,64,128,256]1609; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm01610; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm11611; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm01612; AVX2-NEXT: vzeroupper1613; AVX2-NEXT: retq1614;1615; XOP-LABEL: constant_shift_v16i8:1616; XOP: # %bb.0:1617; XOP-NEXT: vpshab {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01618; XOP-NEXT: retq1619;1620; AVX512DQ-LABEL: constant_shift_v16i8:1621; AVX512DQ: # %bb.0:1622; AVX512DQ-NEXT: vpmovsxbd %xmm0, %zmm01623; AVX512DQ-NEXT: vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm01624; AVX512DQ-NEXT: vpmovdb %zmm0, %xmm01625; AVX512DQ-NEXT: vzeroupper1626; AVX512DQ-NEXT: retq1627;1628; AVX512BW-LABEL: constant_shift_v16i8:1629; AVX512BW: # %bb.0:1630; AVX512BW-NEXT: vpmovsxbw {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]1631; AVX512BW-NEXT: vpmovsxbw %xmm0, %ymm01632; AVX512BW-NEXT: vpsravw %zmm1, %zmm0, %zmm01633; AVX512BW-NEXT: vpmovwb %zmm0, %ymm01634; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm01635; AVX512BW-NEXT: vzeroupper1636; AVX512BW-NEXT: retq1637;1638; AVX512DQVL-LABEL: constant_shift_v16i8:1639; AVX512DQVL: # %bb.0:1640; AVX512DQVL-NEXT: vpmovsxbd %xmm0, %zmm01641; AVX512DQVL-NEXT: vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm01642; AVX512DQVL-NEXT: vpmovdb %zmm0, %xmm01643; AVX512DQVL-NEXT: vzeroupper1644; AVX512DQVL-NEXT: retq1645;1646; AVX512BWVL-LABEL: constant_shift_v16i8:1647; AVX512BWVL: # %bb.0:1648; AVX512BWVL-NEXT: vpmovsxbw %xmm0, %ymm01649; AVX512BWVL-NEXT: vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01650; AVX512BWVL-NEXT: vpmovwb %ymm0, %xmm01651; AVX512BWVL-NEXT: vzeroupper1652; AVX512BWVL-NEXT: retq1653;1654; X86-SSE-LABEL: constant_shift_v16i8:1655; X86-SSE: # %bb.0:1656; X86-SSE-NEXT: movdqa %xmm0, %xmm11657; X86-SSE-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]1658; X86-SSE-NEXT: psraw $8, %xmm11659; X86-SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 # [2,4,8,16,32,64,128,256]1660; X86-SSE-NEXT: psrlw $8, %xmm11661; X86-SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1662; X86-SSE-NEXT: psraw $8, %xmm01663; X86-SSE-NEXT: pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [256,128,64,32,16,8,4,2]1664; X86-SSE-NEXT: psrlw $8, %xmm01665; X86-SSE-NEXT: packuswb %xmm1, %xmm01666; X86-SSE-NEXT: retl1667 %shift = ashr <16 x i8> %a, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>1668 ret <16 x i8> %shift1669}1670 1671define <16 x i8> @constant_shift_v16i8_pairs(<16 x i8> %a) nounwind {1672; SSE2-LABEL: constant_shift_v16i8_pairs:1673; SSE2: # %bb.0:1674; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535,65535,0,65535,65535]1675; SSE2-NEXT: pandn %xmm0, %xmm11676; SSE2-NEXT: pmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [0,128,0,16,0,2,0,32,0,64,0,0,0,8,0,4]1677; SSE2-NEXT: por %xmm1, %xmm01678; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01679; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [64,64,8,8,1,1,16,16,32,32,128,128,4,4,2,2]1680; SSE2-NEXT: pxor %xmm1, %xmm01681; SSE2-NEXT: psubb %xmm1, %xmm01682; SSE2-NEXT: retq1683;1684; SSE41-LABEL: constant_shift_v16i8_pairs:1685; SSE41: # %bb.0:1686; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [32768,4096,512,8192,16384,u,2048,1024]1687; SSE41-NEXT: pmulhuw %xmm0, %xmm11688; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4],xmm0[5],xmm1[6,7]1689; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01690; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [64,64,8,8,1,1,16,16,32,32,128,128,4,4,2,2]1691; SSE41-NEXT: pxor %xmm1, %xmm01692; SSE41-NEXT: psubb %xmm1, %xmm01693; SSE41-NEXT: retq1694;1695; AVX-LABEL: constant_shift_v16i8_pairs:1696; AVX: # %bb.0:1697; AVX-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [32768,4096,512,8192,16384,u,2048,1024]1698; AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4],xmm0[5],xmm1[6,7]1699; AVX-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01700; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [64,64,8,8,1,1,16,16,32,32,128,128,4,4,2,2]1701; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm01702; AVX-NEXT: vpsubb %xmm1, %xmm0, %xmm01703; AVX-NEXT: retq1704;1705; XOP-LABEL: constant_shift_v16i8_pairs:1706; XOP: # %bb.0:1707; XOP-NEXT: vpshab {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01708; XOP-NEXT: retq1709;1710; AVX512DQ-LABEL: constant_shift_v16i8_pairs:1711; AVX512DQ: # %bb.0:1712; AVX512DQ-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [32768,4096,512,8192,16384,u,2048,1024]1713; AVX512DQ-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4],xmm0[5],xmm1[6,7]1714; AVX512DQ-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01715; AVX512DQ-NEXT: vmovdqa {{.*#+}} xmm1 = [64,64,8,8,1,1,16,16,32,32,128,128,4,4,2,2]1716; AVX512DQ-NEXT: vpxor %xmm1, %xmm0, %xmm01717; AVX512DQ-NEXT: vpsubb %xmm1, %xmm0, %xmm01718; AVX512DQ-NEXT: retq1719;1720; AVX512BW-LABEL: constant_shift_v16i8_pairs:1721; AVX512BW: # %bb.0:1722; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01723; AVX512BW-NEXT: vpmovsxbw {{.*#+}} xmm1 = [1,4,7,3,2,0,5,6]1724; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm01725; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01726; AVX512BW-NEXT: vmovdqa {{.*#+}} xmm1 = [64,64,8,8,1,1,16,16,32,32,128,128,4,4,2,2]1727; AVX512BW-NEXT: vpxor %xmm1, %xmm0, %xmm01728; AVX512BW-NEXT: vpsubb %xmm1, %xmm0, %xmm01729; AVX512BW-NEXT: vzeroupper1730; AVX512BW-NEXT: retq1731;1732; AVX512DQVL-LABEL: constant_shift_v16i8_pairs:1733; AVX512DQVL: # %bb.0:1734; AVX512DQVL-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [32768,4096,512,8192,16384,u,2048,1024]1735; AVX512DQVL-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4],xmm0[5],xmm1[6,7]1736; AVX512DQVL-NEXT: vmovdqa {{.*#+}} xmm1 = [64,64,8,8,1,1,16,16,32,32,128,128,4,4,2,2]1737; AVX512DQVL-NEXT: vpternlogq {{.*#+}} xmm0 = xmm1 ^ (xmm0 & mem)1738; AVX512DQVL-NEXT: vpsubb %xmm1, %xmm0, %xmm01739; AVX512DQVL-NEXT: retq1740;1741; AVX512BWVL-LABEL: constant_shift_v16i8_pairs:1742; AVX512BWVL: # %bb.0:1743; AVX512BWVL-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01744; AVX512BWVL-NEXT: vmovdqa {{.*#+}} xmm1 = [64,64,8,8,1,1,16,16,32,32,128,128,4,4,2,2]1745; AVX512BWVL-NEXT: vpternlogq {{.*#+}} xmm0 = xmm1 ^ (xmm0 & mem)1746; AVX512BWVL-NEXT: vpsubb %xmm1, %xmm0, %xmm01747; AVX512BWVL-NEXT: retq1748;1749; X86-SSE-LABEL: constant_shift_v16i8_pairs:1750; X86-SSE: # %bb.0:1751; X86-SSE-NEXT: movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535,65535,0,65535,65535]1752; X86-SSE-NEXT: pandn %xmm0, %xmm11753; X86-SSE-NEXT: pmulhuw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [0,128,0,16,0,2,0,32,0,64,0,0,0,8,0,4]1754; X86-SSE-NEXT: por %xmm1, %xmm01755; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01756; X86-SSE-NEXT: movdqa {{.*#+}} xmm1 = [64,64,8,8,1,1,16,16,32,32,128,128,4,4,2,2]1757; X86-SSE-NEXT: pxor %xmm1, %xmm01758; X86-SSE-NEXT: psubb %xmm1, %xmm01759; X86-SSE-NEXT: retl1760 %shift = ashr <16 x i8> %a, <i8 1, i8 1, i8 4, i8 4, i8 7, i8 7, i8 3, i8 3, i8 2, i8 2, i8 0, i8 0, i8 5, i8 5, i8 6, i8 6>1761 ret <16 x i8> %shift1762}1763 1764define <16 x i8> @constant_shift_v16i8_quads(<16 x i8> %a) nounwind {1765; SSE2-LABEL: constant_shift_v16i8_quads:1766; SSE2: # %bb.0:1767; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [u,u,32768,32768,8192,8192,16384,16384]1768; SSE2-NEXT: pmulhuw %xmm0, %xmm11769; SSE2-NEXT: movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]1770; SSE2-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11771; SSE2-NEXT: movaps {{.*#+}} xmm0 = [128,128,128,128,64,64,64,64,16,16,16,16,32,32,32,32]1772; SSE2-NEXT: xorps %xmm0, %xmm11773; SSE2-NEXT: psubb %xmm0, %xmm11774; SSE2-NEXT: movdqa %xmm1, %xmm01775; SSE2-NEXT: retq1776;1777; SSE41-LABEL: constant_shift_v16i8_quads:1778; SSE41: # %bb.0:1779; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [u,u,32768,32768,8192,8192,16384,16384]1780; SSE41-NEXT: pmulhuw %xmm0, %xmm11781; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]1782; SSE41-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01783; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [128,128,128,128,64,64,64,64,16,16,16,16,32,32,32,32]1784; SSE41-NEXT: pxor %xmm1, %xmm01785; SSE41-NEXT: psubb %xmm1, %xmm01786; SSE41-NEXT: retq1787;1788; AVX1-LABEL: constant_shift_v16i8_quads:1789; AVX1: # %bb.0:1790; AVX1-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [u,u,32768,32768,8192,8192,16384,16384]1791; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]1792; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01793; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [128,128,128,128,64,64,64,64,16,16,16,16,32,32,32,32]1794; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm01795; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm01796; AVX1-NEXT: retq1797;1798; AVX2-LABEL: constant_shift_v16i8_quads:1799; AVX2: # %bb.0:1800; AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01801; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01802; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [128,128,128,128,64,64,64,64,16,16,16,16,32,32,32,32]1803; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm01804; AVX2-NEXT: vpsubb %xmm1, %xmm0, %xmm01805; AVX2-NEXT: retq1806;1807; XOP-LABEL: constant_shift_v16i8_quads:1808; XOP: # %bb.0:1809; XOP-NEXT: vpshab {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01810; XOP-NEXT: retq1811;1812; AVX512-LABEL: constant_shift_v16i8_quads:1813; AVX512: # %bb.0:1814; AVX512-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01815; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01816; AVX512-NEXT: vmovdqa {{.*#+}} xmm1 = [128,128,128,128,64,64,64,64,16,16,16,16,32,32,32,32]1817; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm01818; AVX512-NEXT: vpsubb %xmm1, %xmm0, %xmm01819; AVX512-NEXT: retq1820;1821; AVX512VL-LABEL: constant_shift_v16i8_quads:1822; AVX512VL: # %bb.0:1823; AVX512VL-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01824; AVX512VL-NEXT: vmovdqa {{.*#+}} xmm1 = [128,128,128,128,64,64,64,64,16,16,16,16,32,32,32,32]1825; AVX512VL-NEXT: vpternlogq {{.*#+}} xmm0 = xmm1 ^ (xmm0 & mem)1826; AVX512VL-NEXT: vpsubb %xmm1, %xmm0, %xmm01827; AVX512VL-NEXT: retq1828;1829; X86-SSE-LABEL: constant_shift_v16i8_quads:1830; X86-SSE: # %bb.0:1831; X86-SSE-NEXT: movdqa {{.*#+}} xmm1 = [u,u,32768,32768,8192,8192,16384,16384]1832; X86-SSE-NEXT: pmulhuw %xmm0, %xmm11833; X86-SSE-NEXT: movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]1834; X86-SSE-NEXT: andps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm11835; X86-SSE-NEXT: movaps {{.*#+}} xmm0 = [128,128,128,128,64,64,64,64,16,16,16,16,32,32,32,32]1836; X86-SSE-NEXT: xorps %xmm0, %xmm11837; X86-SSE-NEXT: psubb %xmm0, %xmm11838; X86-SSE-NEXT: movdqa %xmm1, %xmm01839; X86-SSE-NEXT: retl1840 %shift = ashr <16 x i8> %a, <i8 0, i8 0, i8 0, i8 0, i8 1, i8 1, i8 1, i8 1, i8 3, i8 3, i8 3, i8 3, i8 2, i8 2, i8 2, i8 2>1841 ret <16 x i8> %shift1842}1843 1844;1845; Uniform Constant Shifts1846;1847 1848define <2 x i64> @splatconstant_shift_v2i64(<2 x i64> %a) nounwind {1849; SSE2-LABEL: splatconstant_shift_v2i64:1850; SSE2: # %bb.0:1851; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]1852; SSE2-NEXT: psrad $7, %xmm11853; SSE2-NEXT: psrlq $7, %xmm01854; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1855; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1856; SSE2-NEXT: retq1857;1858; SSE41-LABEL: splatconstant_shift_v2i64:1859; SSE41: # %bb.0:1860; SSE41-NEXT: movdqa %xmm0, %xmm11861; SSE41-NEXT: psrad $7, %xmm11862; SSE41-NEXT: psrlq $7, %xmm01863; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]1864; SSE41-NEXT: retq1865;1866; AVX1-LABEL: splatconstant_shift_v2i64:1867; AVX1: # %bb.0:1868; AVX1-NEXT: vpsrad $7, %xmm0, %xmm11869; AVX1-NEXT: vpsrlq $7, %xmm0, %xmm01870; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]1871; AVX1-NEXT: retq1872;1873; AVX2-LABEL: splatconstant_shift_v2i64:1874; AVX2: # %bb.0:1875; AVX2-NEXT: vpsrad $7, %xmm0, %xmm11876; AVX2-NEXT: vpsrlq $7, %xmm0, %xmm01877; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]1878; AVX2-NEXT: retq1879;1880; XOP-LABEL: splatconstant_shift_v2i64:1881; XOP: # %bb.0:1882; XOP-NEXT: vpshaq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01883; XOP-NEXT: retq1884;1885; AVX512-LABEL: splatconstant_shift_v2i64:1886; AVX512: # %bb.0:1887; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm01888; AVX512-NEXT: vpsraq $7, %zmm0, %zmm01889; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm01890; AVX512-NEXT: vzeroupper1891; AVX512-NEXT: retq1892;1893; AVX512VL-LABEL: splatconstant_shift_v2i64:1894; AVX512VL: # %bb.0:1895; AVX512VL-NEXT: vpsraq $7, %xmm0, %xmm01896; AVX512VL-NEXT: retq1897;1898; X86-SSE-LABEL: splatconstant_shift_v2i64:1899; X86-SSE: # %bb.0:1900; X86-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]1901; X86-SSE-NEXT: psrad $7, %xmm11902; X86-SSE-NEXT: psrlq $7, %xmm01903; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1904; X86-SSE-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]1905; X86-SSE-NEXT: retl1906 %shift = ashr <2 x i64> %a, <i64 7, i64 7>1907 ret <2 x i64> %shift1908}1909 1910define <4 x i32> @splatconstant_shift_v4i32(<4 x i32> %a) nounwind {1911; SSE-LABEL: splatconstant_shift_v4i32:1912; SSE: # %bb.0:1913; SSE-NEXT: psrad $5, %xmm01914; SSE-NEXT: retq1915;1916; AVX-LABEL: splatconstant_shift_v4i32:1917; AVX: # %bb.0:1918; AVX-NEXT: vpsrad $5, %xmm0, %xmm01919; AVX-NEXT: retq1920;1921; XOP-LABEL: splatconstant_shift_v4i32:1922; XOP: # %bb.0:1923; XOP-NEXT: vpsrad $5, %xmm0, %xmm01924; XOP-NEXT: retq1925;1926; AVX512-LABEL: splatconstant_shift_v4i32:1927; AVX512: # %bb.0:1928; AVX512-NEXT: vpsrad $5, %xmm0, %xmm01929; AVX512-NEXT: retq1930;1931; AVX512VL-LABEL: splatconstant_shift_v4i32:1932; AVX512VL: # %bb.0:1933; AVX512VL-NEXT: vpsrad $5, %xmm0, %xmm01934; AVX512VL-NEXT: retq1935;1936; X86-SSE-LABEL: splatconstant_shift_v4i32:1937; X86-SSE: # %bb.0:1938; X86-SSE-NEXT: psrad $5, %xmm01939; X86-SSE-NEXT: retl1940 %shift = ashr <4 x i32> %a, <i32 5, i32 5, i32 5, i32 5>1941 ret <4 x i32> %shift1942}1943 1944define <8 x i16> @splatconstant_shift_v8i16(<8 x i16> %a) nounwind {1945; SSE-LABEL: splatconstant_shift_v8i16:1946; SSE: # %bb.0:1947; SSE-NEXT: psraw $3, %xmm01948; SSE-NEXT: retq1949;1950; AVX-LABEL: splatconstant_shift_v8i16:1951; AVX: # %bb.0:1952; AVX-NEXT: vpsraw $3, %xmm0, %xmm01953; AVX-NEXT: retq1954;1955; XOP-LABEL: splatconstant_shift_v8i16:1956; XOP: # %bb.0:1957; XOP-NEXT: vpsraw $3, %xmm0, %xmm01958; XOP-NEXT: retq1959;1960; AVX512-LABEL: splatconstant_shift_v8i16:1961; AVX512: # %bb.0:1962; AVX512-NEXT: vpsraw $3, %xmm0, %xmm01963; AVX512-NEXT: retq1964;1965; AVX512VL-LABEL: splatconstant_shift_v8i16:1966; AVX512VL: # %bb.0:1967; AVX512VL-NEXT: vpsraw $3, %xmm0, %xmm01968; AVX512VL-NEXT: retq1969;1970; X86-SSE-LABEL: splatconstant_shift_v8i16:1971; X86-SSE: # %bb.0:1972; X86-SSE-NEXT: psraw $3, %xmm01973; X86-SSE-NEXT: retl1974 %shift = ashr <8 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>1975 ret <8 x i16> %shift1976}1977 1978define <16 x i8> @splatconstant_shift_v16i8(<16 x i8> %a) nounwind {1979; SSE-LABEL: splatconstant_shift_v16i8:1980; SSE: # %bb.0:1981; SSE-NEXT: psrlw $3, %xmm01982; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01983; SSE-NEXT: movdqa {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]1984; SSE-NEXT: pxor %xmm1, %xmm01985; SSE-NEXT: psubb %xmm1, %xmm01986; SSE-NEXT: retq1987;1988; AVX1-LABEL: splatconstant_shift_v16i8:1989; AVX1: # %bb.0:1990; AVX1-NEXT: vpsrlw $3, %xmm0, %xmm01991; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01992; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]1993; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm01994; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm01995; AVX1-NEXT: retq1996;1997; AVX2-LABEL: splatconstant_shift_v16i8:1998; AVX2: # %bb.0:1999; AVX2-NEXT: vpsrlw $3, %xmm0, %xmm02000; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02001; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2002; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm02003; AVX2-NEXT: vpsubb %xmm1, %xmm0, %xmm02004; AVX2-NEXT: retq2005;2006; XOP-LABEL: splatconstant_shift_v16i8:2007; XOP: # %bb.0:2008; XOP-NEXT: vpshab {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02009; XOP-NEXT: retq2010;2011; AVX512-LABEL: splatconstant_shift_v16i8:2012; AVX512: # %bb.0:2013; AVX512-NEXT: vpsrlw $3, %xmm0, %xmm02014; AVX512-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02015; AVX512-NEXT: vpbroadcastb {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2016; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm02017; AVX512-NEXT: vpsubb %xmm1, %xmm0, %xmm02018; AVX512-NEXT: retq2019;2020; AVX512DQVL-LABEL: splatconstant_shift_v16i8:2021; AVX512DQVL: # %bb.0:2022; AVX512DQVL-NEXT: vpsrlw $3, %xmm0, %xmm02023; AVX512DQVL-NEXT: vpbroadcastd {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2024; AVX512DQVL-NEXT: vpternlogd {{.*#+}} xmm0 = xmm1 ^ (xmm0 & m32bcst)2025; AVX512DQVL-NEXT: vpsubb %xmm1, %xmm0, %xmm02026; AVX512DQVL-NEXT: retq2027;2028; AVX512BWVL-LABEL: splatconstant_shift_v16i8:2029; AVX512BWVL: # %bb.0:2030; AVX512BWVL-NEXT: vpsrlw $3, %xmm0, %xmm02031; AVX512BWVL-NEXT: vpbroadcastb {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2032; AVX512BWVL-NEXT: vpternlogd {{.*#+}} xmm0 = xmm1 ^ (xmm0 & m32bcst)2033; AVX512BWVL-NEXT: vpsubb %xmm1, %xmm0, %xmm02034; AVX512BWVL-NEXT: retq2035;2036; X86-SSE-LABEL: splatconstant_shift_v16i8:2037; X86-SSE: # %bb.0:2038; X86-SSE-NEXT: psrlw $3, %xmm02039; X86-SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm02040; X86-SSE-NEXT: movdqa {{.*#+}} xmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2041; X86-SSE-NEXT: pxor %xmm1, %xmm02042; X86-SSE-NEXT: psubb %xmm1, %xmm02043; X86-SSE-NEXT: retl2044 %shift = ashr <16 x i8> %a, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>2045 ret <16 x i8> %shift2046}2047 2048define <2 x i64> @PR52719(<2 x i64> %a0, i32 %a1) {2049; SSE-LABEL: PR52719:2050; SSE: # %bb.0:2051; SSE-NEXT: movd %edi, %xmm12052; SSE-NEXT: movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]2053; SSE-NEXT: psrlq %xmm1, %xmm22054; SSE-NEXT: psrlq %xmm1, %xmm02055; SSE-NEXT: pxor %xmm2, %xmm02056; SSE-NEXT: psubq %xmm2, %xmm02057; SSE-NEXT: retq2058;2059; AVX1-LABEL: PR52719:2060; AVX1: # %bb.0:2061; AVX1-NEXT: vmovd %edi, %xmm12062; AVX1-NEXT: vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]2063; AVX1-NEXT: # xmm2 = mem[0,0]2064; AVX1-NEXT: vpsrlq %xmm1, %xmm2, %xmm22065; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm02066; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm02067; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm02068; AVX1-NEXT: retq2069;2070; AVX2-LABEL: PR52719:2071; AVX2: # %bb.0:2072; AVX2-NEXT: vmovd %edi, %xmm12073; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]2074; AVX2-NEXT: vpsrlq %xmm1, %xmm2, %xmm22075; AVX2-NEXT: vpsrlq %xmm1, %xmm0, %xmm02076; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm02077; AVX2-NEXT: vpsubq %xmm2, %xmm0, %xmm02078; AVX2-NEXT: retq2079;2080; XOPAVX1-LABEL: PR52719:2081; XOPAVX1: # %bb.0:2082; XOPAVX1-NEXT: vmovd %edi, %xmm12083; XOPAVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]2084; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm22085; XOPAVX1-NEXT: vpsubq %xmm1, %xmm2, %xmm12086; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm02087; XOPAVX1-NEXT: retq2088;2089; XOPAVX2-LABEL: PR52719:2090; XOPAVX2: # %bb.0:2091; XOPAVX2-NEXT: vmovd %edi, %xmm12092; XOPAVX2-NEXT: vpbroadcastq %xmm1, %xmm12093; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm22094; XOPAVX2-NEXT: vpsubq %xmm1, %xmm2, %xmm12095; XOPAVX2-NEXT: vpshaq %xmm1, %xmm0, %xmm02096; XOPAVX2-NEXT: retq2097;2098; AVX512-LABEL: PR52719:2099; AVX512: # %bb.0:2100; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm02101; AVX512-NEXT: vmovd %edi, %xmm12102; AVX512-NEXT: vpsraq %xmm1, %zmm0, %zmm02103; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm02104; AVX512-NEXT: vzeroupper2105; AVX512-NEXT: retq2106;2107; AVX512VL-LABEL: PR52719:2108; AVX512VL: # %bb.0:2109; AVX512VL-NEXT: vmovd %edi, %xmm12110; AVX512VL-NEXT: vpsraq %xmm1, %xmm0, %xmm02111; AVX512VL-NEXT: retq2112;2113; X86-SSE-LABEL: PR52719:2114; X86-SSE: # %bb.0:2115; X86-SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero2116; X86-SSE-NEXT: movdqa {{.*#+}} xmm2 = [0,2147483648,0,2147483648]2117; X86-SSE-NEXT: psrlq %xmm1, %xmm22118; X86-SSE-NEXT: psrlq %xmm1, %xmm02119; X86-SSE-NEXT: pxor %xmm2, %xmm02120; X86-SSE-NEXT: psubq %xmm2, %xmm02121; X86-SSE-NEXT: retl2122 %vec = insertelement <2 x i32> poison, i32 %a1, i64 02123 %splat = shufflevector <2 x i32> %vec, <2 x i32> poison, <2 x i32> zeroinitializer2124 %zext = zext <2 x i32> %splat to <2 x i64>2125 %ashr = ashr <2 x i64> %a0, %zext2126 ret <2 x i64> %ashr2127}2128