brintos

brintos / llvm-project-archived public Read only

0
0
Text · 113.7 KiB · 249bcba Raw
2505 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:    vmovddup {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]24; AVX1-NEXT:    # xmm3 = mem[0,0]25; AVX1-NEXT:    vpsrlq %xmm2, %xmm3, %xmm426; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm2[2,3,2,3]27; AVX1-NEXT:    vpsrlq %xmm5, %xmm3, %xmm628; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm6[4,5,6,7]29; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm630; AVX1-NEXT:    vpsrlq %xmm2, %xmm6, %xmm231; AVX1-NEXT:    vpsrlq %xmm5, %xmm6, %xmm532; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm5[4,5,6,7]33; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm234; AVX1-NEXT:    vpsubq %xmm4, %xmm2, %xmm235; AVX1-NEXT:    vpsrlq %xmm1, %xmm3, %xmm436; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm1[2,3,2,3]37; AVX1-NEXT:    vpsrlq %xmm5, %xmm3, %xmm338; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]39; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm140; AVX1-NEXT:    vpsrlq %xmm5, %xmm0, %xmm041; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]42; AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm043; AVX1-NEXT:    vpsubq %xmm3, %xmm0, %xmm044; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm045; AVX1-NEXT:    retq46;47; AVX2-LABEL: var_shift_v4i64:48; AVX2:       # %bb.0:49; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]50; AVX2-NEXT:    vpsrlvq %ymm1, %ymm2, %ymm251; AVX2-NEXT:    vpsrlvq %ymm1, %ymm0, %ymm052; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm053; AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm054; AVX2-NEXT:    retq55;56; XOPAVX1-LABEL: var_shift_v4i64:57; XOPAVX1:       # %bb.0:58; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm259; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm360; XOPAVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm261; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm462; XOPAVX1-NEXT:    vpshaq %xmm2, %xmm4, %xmm263; XOPAVX1-NEXT:    vpsubq %xmm1, %xmm3, %xmm164; XOPAVX1-NEXT:    vpshaq %xmm1, %xmm0, %xmm065; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm066; XOPAVX1-NEXT:    retq67;68; XOPAVX2-LABEL: var_shift_v4i64:69; XOPAVX2:       # %bb.0:70; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]71; XOPAVX2-NEXT:    vpsrlvq %ymm1, %ymm2, %ymm272; XOPAVX2-NEXT:    vpsrlvq %ymm1, %ymm0, %ymm073; XOPAVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm074; XOPAVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm075; XOPAVX2-NEXT:    retq76;77; AVX512-LABEL: var_shift_v4i64:78; AVX512:       # %bb.0:79; AVX512-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm180; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm081; AVX512-NEXT:    vpsravq %zmm1, %zmm0, %zmm082; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm083; AVX512-NEXT:    retq84;85; AVX512VL-LABEL: var_shift_v4i64:86; AVX512VL:       # %bb.0:87; AVX512VL-NEXT:    vpsravq %ymm1, %ymm0, %ymm088; AVX512VL-NEXT:    retq89;90; X86-AVX1-LABEL: var_shift_v4i64:91; X86-AVX1:       # %bb.0:92; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm293; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm3 = [0,2147483648,0,2147483648]94; X86-AVX1-NEXT:    # xmm3 = mem[0,0]95; X86-AVX1-NEXT:    vpsrlq %xmm2, %xmm3, %xmm496; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm2[2,3,2,3]97; X86-AVX1-NEXT:    vpsrlq %xmm5, %xmm3, %xmm698; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm6[4,5,6,7]99; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6100; X86-AVX1-NEXT:    vpsrlq %xmm2, %xmm6, %xmm2101; X86-AVX1-NEXT:    vpsrlq %xmm5, %xmm6, %xmm5102; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm5[4,5,6,7]103; X86-AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2104; X86-AVX1-NEXT:    vpsubq %xmm4, %xmm2, %xmm2105; X86-AVX1-NEXT:    vpsrlq %xmm1, %xmm3, %xmm4106; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm1[2,3,2,3]107; X86-AVX1-NEXT:    vpsrlq %xmm5, %xmm3, %xmm3108; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]109; X86-AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm1110; X86-AVX1-NEXT:    vpsrlq %xmm5, %xmm0, %xmm0111; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]112; X86-AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm0113; X86-AVX1-NEXT:    vpsubq %xmm3, %xmm0, %xmm0114; X86-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0115; X86-AVX1-NEXT:    retl116;117; X86-AVX2-LABEL: var_shift_v4i64:118; X86-AVX2:       # %bb.0:119; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648]120; X86-AVX2-NEXT:    vpsrlvq %ymm1, %ymm2, %ymm2121; X86-AVX2-NEXT:    vpsrlvq %ymm1, %ymm0, %ymm0122; X86-AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0123; X86-AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0124; X86-AVX2-NEXT:    retl125  %shift = ashr <4 x i64> %a, %b126  ret <4 x i64> %shift127}128 129define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {130; AVX1-LABEL: var_shift_v8i32:131; AVX1:       # %bb.0:132; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2133; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3134; AVX1-NEXT:    vpsrldq {{.*#+}} xmm4 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero135; AVX1-NEXT:    vpsrad %xmm4, %xmm2, %xmm4136; AVX1-NEXT:    vpsrlq $32, %xmm3, %xmm5137; AVX1-NEXT:    vpsrad %xmm5, %xmm2, %xmm5138; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]139; AVX1-NEXT:    vpxor %xmm5, %xmm5, %xmm5140; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm6 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]141; AVX1-NEXT:    vpsrad %xmm6, %xmm2, %xmm6142; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero143; AVX1-NEXT:    vpsrad %xmm3, %xmm2, %xmm2144; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7]145; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]146; AVX1-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero147; AVX1-NEXT:    vpsrad %xmm3, %xmm0, %xmm3148; AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm4149; AVX1-NEXT:    vpsrad %xmm4, %xmm0, %xmm4150; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]151; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm4 = xmm1[2],xmm5[2],xmm1[3],xmm5[3]152; AVX1-NEXT:    vpsrad %xmm4, %xmm0, %xmm4153; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero154; AVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm0155; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]156; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]157; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0158; AVX1-NEXT:    retq159;160; AVX2-LABEL: var_shift_v8i32:161; AVX2:       # %bb.0:162; AVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0163; AVX2-NEXT:    retq164;165; XOPAVX1-LABEL: var_shift_v8i32:166; XOPAVX1:       # %bb.0:167; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2168; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3169; XOPAVX1-NEXT:    vpsubd %xmm2, %xmm3, %xmm2170; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4171; XOPAVX1-NEXT:    vpshad %xmm2, %xmm4, %xmm2172; XOPAVX1-NEXT:    vpsubd %xmm1, %xmm3, %xmm1173; XOPAVX1-NEXT:    vpshad %xmm1, %xmm0, %xmm0174; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0175; XOPAVX1-NEXT:    retq176;177; XOPAVX2-LABEL: var_shift_v8i32:178; XOPAVX2:       # %bb.0:179; XOPAVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0180; XOPAVX2-NEXT:    retq181;182; AVX512-LABEL: var_shift_v8i32:183; AVX512:       # %bb.0:184; AVX512-NEXT:    vpsravd %ymm1, %ymm0, %ymm0185; AVX512-NEXT:    retq186;187; AVX512VL-LABEL: var_shift_v8i32:188; AVX512VL:       # %bb.0:189; AVX512VL-NEXT:    vpsravd %ymm1, %ymm0, %ymm0190; AVX512VL-NEXT:    retq191;192; X86-AVX1-LABEL: var_shift_v8i32:193; X86-AVX1:       # %bb.0:194; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2195; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3196; X86-AVX1-NEXT:    vpsrldq {{.*#+}} xmm4 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero197; X86-AVX1-NEXT:    vpsrad %xmm4, %xmm2, %xmm4198; X86-AVX1-NEXT:    vpsrlq $32, %xmm3, %xmm5199; X86-AVX1-NEXT:    vpsrad %xmm5, %xmm2, %xmm5200; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]201; X86-AVX1-NEXT:    vpxor %xmm5, %xmm5, %xmm5202; X86-AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm6 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]203; X86-AVX1-NEXT:    vpsrad %xmm6, %xmm2, %xmm6204; X86-AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero205; X86-AVX1-NEXT:    vpsrad %xmm3, %xmm2, %xmm2206; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7]207; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]208; X86-AVX1-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero209; X86-AVX1-NEXT:    vpsrad %xmm3, %xmm0, %xmm3210; X86-AVX1-NEXT:    vpsrlq $32, %xmm1, %xmm4211; X86-AVX1-NEXT:    vpsrad %xmm4, %xmm0, %xmm4212; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]213; X86-AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm4 = xmm1[2],xmm5[2],xmm1[3],xmm5[3]214; X86-AVX1-NEXT:    vpsrad %xmm4, %xmm0, %xmm4215; X86-AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero216; X86-AVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm0217; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]218; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]219; X86-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0220; X86-AVX1-NEXT:    retl221;222; X86-AVX2-LABEL: var_shift_v8i32:223; X86-AVX2:       # %bb.0:224; X86-AVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0225; X86-AVX2-NEXT:    retl226  %shift = ashr <8 x i32> %a, %b227  ret <8 x i32> %shift228}229 230define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {231; AVX1-LABEL: var_shift_v16i16:232; AVX1:       # %bb.0:233; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2234; AVX1-NEXT:    vpsllw $12, %xmm2, %xmm3235; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm2236; AVX1-NEXT:    vpor %xmm3, %xmm2, %xmm2237; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm3238; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4239; AVX1-NEXT:    vpsraw $8, %xmm4, %xmm5240; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm4241; AVX1-NEXT:    vpsraw $4, %xmm4, %xmm5242; AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm4, %xmm3243; AVX1-NEXT:    vpsraw $2, %xmm3, %xmm4244; AVX1-NEXT:    vpsllw $2, %xmm2, %xmm5245; AVX1-NEXT:    vpblendvb %xmm5, %xmm4, %xmm3, %xmm3246; AVX1-NEXT:    vpsraw $1, %xmm3, %xmm4247; AVX1-NEXT:    vpsllw $3, %xmm2, %xmm2248; AVX1-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm2249; AVX1-NEXT:    vpsllw $12, %xmm1, %xmm3250; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1251; AVX1-NEXT:    vpor %xmm3, %xmm1, %xmm1252; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm3253; AVX1-NEXT:    vpsraw $8, %xmm0, %xmm4254; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0255; AVX1-NEXT:    vpsraw $4, %xmm0, %xmm4256; AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm0, %xmm0257; AVX1-NEXT:    vpsraw $2, %xmm0, %xmm3258; AVX1-NEXT:    vpsllw $2, %xmm1, %xmm4259; AVX1-NEXT:    vpblendvb %xmm4, %xmm3, %xmm0, %xmm0260; AVX1-NEXT:    vpsraw $1, %xmm0, %xmm3261; AVX1-NEXT:    vpsllw $3, %xmm1, %xmm1262; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0263; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0264; AVX1-NEXT:    retq265;266; AVX2-LABEL: var_shift_v16i16:267; AVX2:       # %bb.0:268; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2269; 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]270; 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]271; AVX2-NEXT:    vpsravd %ymm3, %ymm4, %ymm3272; AVX2-NEXT:    vpsrld $16, %ymm3, %ymm3273; 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]274; 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]275; AVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0276; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0277; AVX2-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0278; AVX2-NEXT:    retq279;280; XOPAVX1-LABEL: var_shift_v16i16:281; XOPAVX1:       # %bb.0:282; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2283; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3284; XOPAVX1-NEXT:    vpsubw %xmm2, %xmm3, %xmm2285; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4286; XOPAVX1-NEXT:    vpshaw %xmm2, %xmm4, %xmm2287; XOPAVX1-NEXT:    vpsubw %xmm1, %xmm3, %xmm1288; XOPAVX1-NEXT:    vpshaw %xmm1, %xmm0, %xmm0289; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0290; XOPAVX1-NEXT:    retq291;292; XOPAVX2-LABEL: var_shift_v16i16:293; XOPAVX2:       # %bb.0:294; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2295; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3296; XOPAVX2-NEXT:    vpsubw %xmm2, %xmm3, %xmm2297; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4298; XOPAVX2-NEXT:    vpshaw %xmm2, %xmm4, %xmm2299; XOPAVX2-NEXT:    vpsubw %xmm1, %xmm3, %xmm1300; XOPAVX2-NEXT:    vpshaw %xmm1, %xmm0, %xmm0301; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0302; XOPAVX2-NEXT:    retq303;304; AVX512DQ-LABEL: var_shift_v16i16:305; AVX512DQ:       # %bb.0:306; 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],zero307; AVX512DQ-NEXT:    vpmovsxwd %ymm0, %zmm0308; AVX512DQ-NEXT:    vpsravd %zmm1, %zmm0, %zmm0309; AVX512DQ-NEXT:    vpmovdw %zmm0, %ymm0310; AVX512DQ-NEXT:    retq311;312; AVX512BW-LABEL: var_shift_v16i16:313; AVX512BW:       # %bb.0:314; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1315; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0316; AVX512BW-NEXT:    vpsravw %zmm1, %zmm0, %zmm0317; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0318; AVX512BW-NEXT:    retq319;320; AVX512DQVL-LABEL: var_shift_v16i16:321; AVX512DQVL:       # %bb.0:322; 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],zero323; AVX512DQVL-NEXT:    vpmovsxwd %ymm0, %zmm0324; AVX512DQVL-NEXT:    vpsravd %zmm1, %zmm0, %zmm0325; AVX512DQVL-NEXT:    vpmovdw %zmm0, %ymm0326; AVX512DQVL-NEXT:    retq327;328; AVX512BWVL-LABEL: var_shift_v16i16:329; AVX512BWVL:       # %bb.0:330; AVX512BWVL-NEXT:    vpsravw %ymm1, %ymm0, %ymm0331; AVX512BWVL-NEXT:    retq332;333; X86-AVX1-LABEL: var_shift_v16i16:334; X86-AVX1:       # %bb.0:335; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2336; X86-AVX1-NEXT:    vpsllw $12, %xmm2, %xmm3337; X86-AVX1-NEXT:    vpsllw $4, %xmm2, %xmm2338; X86-AVX1-NEXT:    vpor %xmm3, %xmm2, %xmm2339; X86-AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm3340; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4341; X86-AVX1-NEXT:    vpsraw $8, %xmm4, %xmm5342; X86-AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm4343; X86-AVX1-NEXT:    vpsraw $4, %xmm4, %xmm5344; X86-AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm4, %xmm3345; X86-AVX1-NEXT:    vpsraw $2, %xmm3, %xmm4346; X86-AVX1-NEXT:    vpsllw $2, %xmm2, %xmm5347; X86-AVX1-NEXT:    vpblendvb %xmm5, %xmm4, %xmm3, %xmm3348; X86-AVX1-NEXT:    vpsraw $1, %xmm3, %xmm4349; X86-AVX1-NEXT:    vpsllw $3, %xmm2, %xmm2350; X86-AVX1-NEXT:    vpblendvb %xmm2, %xmm4, %xmm3, %xmm2351; X86-AVX1-NEXT:    vpsllw $12, %xmm1, %xmm3352; X86-AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1353; X86-AVX1-NEXT:    vpor %xmm3, %xmm1, %xmm1354; X86-AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm3355; X86-AVX1-NEXT:    vpsraw $8, %xmm0, %xmm4356; X86-AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0357; X86-AVX1-NEXT:    vpsraw $4, %xmm0, %xmm4358; X86-AVX1-NEXT:    vpblendvb %xmm3, %xmm4, %xmm0, %xmm0359; X86-AVX1-NEXT:    vpsraw $2, %xmm0, %xmm3360; X86-AVX1-NEXT:    vpsllw $2, %xmm1, %xmm4361; X86-AVX1-NEXT:    vpblendvb %xmm4, %xmm3, %xmm0, %xmm0362; X86-AVX1-NEXT:    vpsraw $1, %xmm0, %xmm3363; X86-AVX1-NEXT:    vpsllw $3, %xmm1, %xmm1364; X86-AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0365; X86-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0366; X86-AVX1-NEXT:    retl367;368; X86-AVX2-LABEL: var_shift_v16i16:369; X86-AVX2:       # %bb.0:370; X86-AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2371; 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]372; 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]373; X86-AVX2-NEXT:    vpsravd %ymm3, %ymm4, %ymm3374; X86-AVX2-NEXT:    vpsrld $16, %ymm3, %ymm3375; 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]376; 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]377; X86-AVX2-NEXT:    vpsravd %ymm1, %ymm0, %ymm0378; X86-AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0379; X86-AVX2-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0380; X86-AVX2-NEXT:    retl381  %shift = ashr <16 x i16> %a, %b382  ret <16 x i16> %shift383}384 385define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {386; AVX1-LABEL: var_shift_v32i8:387; AVX1:       # %bb.0:388; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2389; AVX1-NEXT:    vpsllw $5, %xmm2, %xmm2390; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]391; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4392; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]393; AVX1-NEXT:    vpsraw $4, %xmm5, %xmm6394; AVX1-NEXT:    vpblendvb %xmm3, %xmm6, %xmm5, %xmm5395; AVX1-NEXT:    vpsraw $2, %xmm5, %xmm6396; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm7397; AVX1-NEXT:    vpblendvb %xmm7, %xmm6, %xmm5, %xmm5398; AVX1-NEXT:    vpsraw $1, %xmm5, %xmm6399; AVX1-NEXT:    vpsllw $2, %xmm3, %xmm3400; AVX1-NEXT:    vpblendvb %xmm3, %xmm6, %xmm5, %xmm3401; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3402; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]403; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]404; AVX1-NEXT:    vpsraw $4, %xmm4, %xmm5405; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm4406; AVX1-NEXT:    vpsraw $2, %xmm4, %xmm5407; AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm6408; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm4, %xmm4409; AVX1-NEXT:    vpsraw $1, %xmm4, %xmm5410; AVX1-NEXT:    vpsllw $2, %xmm2, %xmm2411; AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm2412; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2413; AVX1-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2414; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1415; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]416; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]417; AVX1-NEXT:    vpsraw $4, %xmm4, %xmm5418; AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm4, %xmm4419; AVX1-NEXT:    vpsraw $2, %xmm4, %xmm5420; AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm6421; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm4, %xmm4422; AVX1-NEXT:    vpsraw $1, %xmm4, %xmm5423; AVX1-NEXT:    vpsllw $2, %xmm3, %xmm3424; AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm4, %xmm3425; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3426; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]427; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]428; AVX1-NEXT:    vpsraw $4, %xmm0, %xmm4429; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0430; AVX1-NEXT:    vpsraw $2, %xmm0, %xmm4431; AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm5432; AVX1-NEXT:    vpblendvb %xmm5, %xmm4, %xmm0, %xmm0433; AVX1-NEXT:    vpsraw $1, %xmm0, %xmm4434; AVX1-NEXT:    vpsllw $2, %xmm1, %xmm1435; AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0436; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0437; AVX1-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0438; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0439; AVX1-NEXT:    retq440;441; AVX2-LABEL: var_shift_v32i8:442; AVX2:       # %bb.0:443; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1444; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]445; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]446; AVX2-NEXT:    vpsraw $4, %ymm3, %ymm4447; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3448; AVX2-NEXT:    vpsraw $2, %ymm3, %ymm4449; AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm5450; AVX2-NEXT:    vpblendvb %ymm5, %ymm4, %ymm3, %ymm3451; AVX2-NEXT:    vpsraw $1, %ymm3, %ymm4452; AVX2-NEXT:    vpsllw $2, %ymm2, %ymm2453; AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2454; AVX2-NEXT:    vpsrlw $8, %ymm2, %ymm2455; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]456; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]457; AVX2-NEXT:    vpsraw $4, %ymm0, %ymm3458; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0459; AVX2-NEXT:    vpsraw $2, %ymm0, %ymm3460; AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm4461; AVX2-NEXT:    vpblendvb %ymm4, %ymm3, %ymm0, %ymm0462; AVX2-NEXT:    vpsraw $1, %ymm0, %ymm3463; AVX2-NEXT:    vpsllw $2, %ymm1, %ymm1464; AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0465; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0466; AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0467; AVX2-NEXT:    retq468;469; XOPAVX1-LABEL: var_shift_v32i8:470; XOPAVX1:       # %bb.0:471; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2472; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3473; XOPAVX1-NEXT:    vpsubb %xmm2, %xmm3, %xmm2474; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4475; XOPAVX1-NEXT:    vpshab %xmm2, %xmm4, %xmm2476; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm3, %xmm1477; XOPAVX1-NEXT:    vpshab %xmm1, %xmm0, %xmm0478; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0479; XOPAVX1-NEXT:    retq480;481; XOPAVX2-LABEL: var_shift_v32i8:482; XOPAVX2:       # %bb.0:483; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2484; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3485; XOPAVX2-NEXT:    vpsubb %xmm2, %xmm3, %xmm2486; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4487; XOPAVX2-NEXT:    vpshab %xmm2, %xmm4, %xmm2488; XOPAVX2-NEXT:    vpsubb %xmm1, %xmm3, %xmm1489; XOPAVX2-NEXT:    vpshab %xmm1, %xmm0, %xmm0490; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0491; XOPAVX2-NEXT:    retq492;493; AVX512DQ-LABEL: var_shift_v32i8:494; AVX512DQ:       # %bb.0:495; AVX512DQ-NEXT:    vpsllw $5, %ymm1, %ymm1496; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]497; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]498; AVX512DQ-NEXT:    vpsraw $4, %ymm3, %ymm4499; AVX512DQ-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3500; AVX512DQ-NEXT:    vpsraw $2, %ymm3, %ymm4501; AVX512DQ-NEXT:    vpaddw %ymm2, %ymm2, %ymm5502; AVX512DQ-NEXT:    vpblendvb %ymm5, %ymm4, %ymm3, %ymm3503; AVX512DQ-NEXT:    vpsraw $1, %ymm3, %ymm4504; AVX512DQ-NEXT:    vpsllw $2, %ymm2, %ymm2505; AVX512DQ-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2506; AVX512DQ-NEXT:    vpsrlw $8, %ymm2, %ymm2507; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]508; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]509; AVX512DQ-NEXT:    vpsraw $4, %ymm0, %ymm3510; AVX512DQ-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0511; AVX512DQ-NEXT:    vpsraw $2, %ymm0, %ymm3512; AVX512DQ-NEXT:    vpaddw %ymm1, %ymm1, %ymm4513; AVX512DQ-NEXT:    vpblendvb %ymm4, %ymm3, %ymm0, %ymm0514; AVX512DQ-NEXT:    vpsraw $1, %ymm0, %ymm3515; AVX512DQ-NEXT:    vpsllw $2, %ymm1, %ymm1516; AVX512DQ-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0517; AVX512DQ-NEXT:    vpsrlw $8, %ymm0, %ymm0518; AVX512DQ-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0519; AVX512DQ-NEXT:    retq520;521; AVX512BW-LABEL: var_shift_v32i8:522; AVX512BW:       # %bb.0:523; 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],zero524; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm0525; AVX512BW-NEXT:    vpsravw %zmm1, %zmm0, %zmm0526; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0527; AVX512BW-NEXT:    retq528;529; AVX512DQVL-LABEL: var_shift_v32i8:530; AVX512DQVL:       # %bb.0:531; AVX512DQVL-NEXT:    vpsllw $5, %ymm1, %ymm1532; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]533; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]534; AVX512DQVL-NEXT:    vpsraw $4, %ymm3, %ymm4535; AVX512DQVL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3536; AVX512DQVL-NEXT:    vpsraw $2, %ymm3, %ymm4537; AVX512DQVL-NEXT:    vpaddw %ymm2, %ymm2, %ymm5538; AVX512DQVL-NEXT:    vpblendvb %ymm5, %ymm4, %ymm3, %ymm3539; AVX512DQVL-NEXT:    vpsraw $1, %ymm3, %ymm4540; AVX512DQVL-NEXT:    vpsllw $2, %ymm2, %ymm2541; AVX512DQVL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2542; AVX512DQVL-NEXT:    vpsrlw $8, %ymm2, %ymm2543; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]544; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]545; AVX512DQVL-NEXT:    vpsraw $4, %ymm0, %ymm3546; AVX512DQVL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0547; AVX512DQVL-NEXT:    vpsraw $2, %ymm0, %ymm3548; AVX512DQVL-NEXT:    vpaddw %ymm1, %ymm1, %ymm4549; AVX512DQVL-NEXT:    vpblendvb %ymm4, %ymm3, %ymm0, %ymm0550; AVX512DQVL-NEXT:    vpsraw $1, %ymm0, %ymm3551; AVX512DQVL-NEXT:    vpsllw $2, %ymm1, %ymm1552; AVX512DQVL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0553; AVX512DQVL-NEXT:    vpsrlw $8, %ymm0, %ymm0554; AVX512DQVL-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0555; AVX512DQVL-NEXT:    retq556;557; AVX512BWVL-LABEL: var_shift_v32i8:558; AVX512BWVL:       # %bb.0:559; 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],zero560; AVX512BWVL-NEXT:    vpmovsxbw %ymm0, %zmm0561; AVX512BWVL-NEXT:    vpsravw %zmm1, %zmm0, %zmm0562; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm0563; AVX512BWVL-NEXT:    retq564;565; X86-AVX1-LABEL: var_shift_v32i8:566; X86-AVX1:       # %bb.0:567; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2568; X86-AVX1-NEXT:    vpsllw $5, %xmm2, %xmm2569; X86-AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]570; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4571; X86-AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]572; X86-AVX1-NEXT:    vpsraw $4, %xmm5, %xmm6573; X86-AVX1-NEXT:    vpblendvb %xmm3, %xmm6, %xmm5, %xmm5574; X86-AVX1-NEXT:    vpsraw $2, %xmm5, %xmm6575; X86-AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm7576; X86-AVX1-NEXT:    vpblendvb %xmm7, %xmm6, %xmm5, %xmm5577; X86-AVX1-NEXT:    vpsraw $1, %xmm5, %xmm6578; X86-AVX1-NEXT:    vpsllw $2, %xmm3, %xmm3579; X86-AVX1-NEXT:    vpblendvb %xmm3, %xmm6, %xmm5, %xmm3580; X86-AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3581; X86-AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]582; X86-AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]583; X86-AVX1-NEXT:    vpsraw $4, %xmm4, %xmm5584; X86-AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm4585; X86-AVX1-NEXT:    vpsraw $2, %xmm4, %xmm5586; X86-AVX1-NEXT:    vpaddw %xmm2, %xmm2, %xmm6587; X86-AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm4, %xmm4588; X86-AVX1-NEXT:    vpsraw $1, %xmm4, %xmm5589; X86-AVX1-NEXT:    vpsllw $2, %xmm2, %xmm2590; X86-AVX1-NEXT:    vpblendvb %xmm2, %xmm5, %xmm4, %xmm2591; X86-AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2592; X86-AVX1-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2593; X86-AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1594; X86-AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]595; X86-AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]596; X86-AVX1-NEXT:    vpsraw $4, %xmm4, %xmm5597; X86-AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm4, %xmm4598; X86-AVX1-NEXT:    vpsraw $2, %xmm4, %xmm5599; X86-AVX1-NEXT:    vpaddw %xmm3, %xmm3, %xmm6600; X86-AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm4, %xmm4601; X86-AVX1-NEXT:    vpsraw $1, %xmm4, %xmm5602; X86-AVX1-NEXT:    vpsllw $2, %xmm3, %xmm3603; X86-AVX1-NEXT:    vpblendvb %xmm3, %xmm5, %xmm4, %xmm3604; X86-AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3605; X86-AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]606; X86-AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]607; X86-AVX1-NEXT:    vpsraw $4, %xmm0, %xmm4608; X86-AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0609; X86-AVX1-NEXT:    vpsraw $2, %xmm0, %xmm4610; X86-AVX1-NEXT:    vpaddw %xmm1, %xmm1, %xmm5611; X86-AVX1-NEXT:    vpblendvb %xmm5, %xmm4, %xmm0, %xmm0612; X86-AVX1-NEXT:    vpsraw $1, %xmm0, %xmm4613; X86-AVX1-NEXT:    vpsllw $2, %xmm1, %xmm1614; X86-AVX1-NEXT:    vpblendvb %xmm1, %xmm4, %xmm0, %xmm0615; X86-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0616; X86-AVX1-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0617; X86-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0618; X86-AVX1-NEXT:    retl619;620; X86-AVX2-LABEL: var_shift_v32i8:621; X86-AVX2:       # %bb.0:622; X86-AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1623; X86-AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]624; X86-AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]625; X86-AVX2-NEXT:    vpsraw $4, %ymm3, %ymm4626; X86-AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3627; X86-AVX2-NEXT:    vpsraw $2, %ymm3, %ymm4628; X86-AVX2-NEXT:    vpaddw %ymm2, %ymm2, %ymm5629; X86-AVX2-NEXT:    vpblendvb %ymm5, %ymm4, %ymm3, %ymm3630; X86-AVX2-NEXT:    vpsraw $1, %ymm3, %ymm4631; X86-AVX2-NEXT:    vpsllw $2, %ymm2, %ymm2632; X86-AVX2-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2633; X86-AVX2-NEXT:    vpsrlw $8, %ymm2, %ymm2634; X86-AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]635; X86-AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]636; X86-AVX2-NEXT:    vpsraw $4, %ymm0, %ymm3637; X86-AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0638; X86-AVX2-NEXT:    vpsraw $2, %ymm0, %ymm3639; X86-AVX2-NEXT:    vpaddw %ymm1, %ymm1, %ymm4640; X86-AVX2-NEXT:    vpblendvb %ymm4, %ymm3, %ymm0, %ymm0641; X86-AVX2-NEXT:    vpsraw $1, %ymm0, %ymm3642; X86-AVX2-NEXT:    vpsllw $2, %ymm1, %ymm1643; X86-AVX2-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0644; X86-AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0645; X86-AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0646; X86-AVX2-NEXT:    retl647  %shift = ashr <32 x i8> %a, %b648  ret <32 x i8> %shift649}650 651;652; Uniform Variable Shifts653;654 655define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {656; AVX1-LABEL: splatvar_shift_v4i64:657; AVX1:       # %bb.0:658; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]659; AVX1-NEXT:    # xmm2 = mem[0,0]660; AVX1-NEXT:    vpsrlq %xmm1, %xmm2, %xmm2661; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3662; AVX1-NEXT:    vpsrlq %xmm1, %xmm3, %xmm3663; AVX1-NEXT:    vpxor %xmm2, %xmm3, %xmm3664; AVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm3665; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0666; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0667; AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0668; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0669; AVX1-NEXT:    retq670;671; AVX2-LABEL: splatvar_shift_v4i64:672; AVX2:       # %bb.0:673; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]674; AVX2-NEXT:    vpsrlq %xmm1, %ymm2, %ymm2675; AVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm0676; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0677; AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0678; AVX2-NEXT:    retq679;680; XOPAVX1-LABEL: splatvar_shift_v4i64:681; XOPAVX1:       # %bb.0:682; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2683; XOPAVX1-NEXT:    vpsubq %xmm1, %xmm2, %xmm1684; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]685; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2686; XOPAVX1-NEXT:    vpshaq %xmm1, %xmm2, %xmm2687; XOPAVX1-NEXT:    vpshaq %xmm1, %xmm0, %xmm0688; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0689; XOPAVX1-NEXT:    retq690;691; XOPAVX2-LABEL: splatvar_shift_v4i64:692; XOPAVX2:       # %bb.0:693; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]694; XOPAVX2-NEXT:    vpsrlq %xmm1, %ymm2, %ymm2695; XOPAVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm0696; XOPAVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0697; XOPAVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0698; XOPAVX2-NEXT:    retq699;700; AVX512-LABEL: splatvar_shift_v4i64:701; AVX512:       # %bb.0:702; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0703; AVX512-NEXT:    vpsraq %xmm1, %zmm0, %zmm0704; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0705; AVX512-NEXT:    retq706;707; AVX512VL-LABEL: splatvar_shift_v4i64:708; AVX512VL:       # %bb.0:709; AVX512VL-NEXT:    vpsraq %xmm1, %ymm0, %ymm0710; AVX512VL-NEXT:    retq711;712; X86-AVX1-LABEL: splatvar_shift_v4i64:713; X86-AVX1:       # %bb.0:714; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [0,2147483648,0,2147483648]715; X86-AVX1-NEXT:    # xmm2 = mem[0,0]716; X86-AVX1-NEXT:    vpsrlq %xmm1, %xmm2, %xmm2717; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3718; X86-AVX1-NEXT:    vpsrlq %xmm1, %xmm3, %xmm3719; X86-AVX1-NEXT:    vpxor %xmm2, %xmm3, %xmm3720; X86-AVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm3721; X86-AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0722; X86-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0723; X86-AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0724; X86-AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0725; X86-AVX1-NEXT:    retl726;727; X86-AVX2-LABEL: splatvar_shift_v4i64:728; X86-AVX2:       # %bb.0:729; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648]730; X86-AVX2-NEXT:    vpsrlq %xmm1, %ymm2, %ymm2731; X86-AVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm0732; X86-AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0733; X86-AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm0734; X86-AVX2-NEXT:    retl735  %splat = shufflevector <4 x i64> %b, <4 x i64> poison, <4 x i32> zeroinitializer736  %shift = ashr <4 x i64> %a, %splat737  ret <4 x i64> %shift738}739 740define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {741; AVX1-LABEL: splatvar_shift_v8i32:742; AVX1:       # %bb.0:743; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2744; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero745; AVX1-NEXT:    vpsrad %xmm1, %xmm2, %xmm2746; AVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm0747; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0748; AVX1-NEXT:    retq749;750; AVX2-LABEL: splatvar_shift_v8i32:751; AVX2:       # %bb.0:752; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero753; AVX2-NEXT:    vpsrad %xmm1, %ymm0, %ymm0754; AVX2-NEXT:    retq755;756; XOPAVX1-LABEL: splatvar_shift_v8i32:757; XOPAVX1:       # %bb.0:758; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2759; XOPAVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero760; XOPAVX1-NEXT:    vpsrad %xmm1, %xmm2, %xmm2761; XOPAVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm0762; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0763; XOPAVX1-NEXT:    retq764;765; XOPAVX2-LABEL: splatvar_shift_v8i32:766; XOPAVX2:       # %bb.0:767; XOPAVX2-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero768; XOPAVX2-NEXT:    vpsrad %xmm1, %ymm0, %ymm0769; XOPAVX2-NEXT:    retq770;771; AVX512-LABEL: splatvar_shift_v8i32:772; AVX512:       # %bb.0:773; AVX512-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero774; AVX512-NEXT:    vpsrad %xmm1, %ymm0, %ymm0775; AVX512-NEXT:    retq776;777; AVX512VL-LABEL: splatvar_shift_v8i32:778; AVX512VL:       # %bb.0:779; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero780; AVX512VL-NEXT:    vpsrad %xmm1, %ymm0, %ymm0781; AVX512VL-NEXT:    retq782;783; X86-AVX1-LABEL: splatvar_shift_v8i32:784; X86-AVX1:       # %bb.0:785; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2786; X86-AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero787; X86-AVX1-NEXT:    vpsrad %xmm1, %xmm2, %xmm2788; X86-AVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm0789; X86-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0790; X86-AVX1-NEXT:    retl791;792; X86-AVX2-LABEL: splatvar_shift_v8i32:793; X86-AVX2:       # %bb.0:794; X86-AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero795; X86-AVX2-NEXT:    vpsrad %xmm1, %ymm0, %ymm0796; X86-AVX2-NEXT:    retl797  %splat = shufflevector <8 x i32> %b, <8 x i32> poison, <8 x i32> zeroinitializer798  %shift = ashr <8 x i32> %a, %splat799  ret <8 x i32> %shift800}801 802define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {803; AVX1-LABEL: splatvar_shift_v16i16:804; AVX1:       # %bb.0:805; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2806; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero807; AVX1-NEXT:    vpsraw %xmm1, %xmm2, %xmm2808; AVX1-NEXT:    vpsraw %xmm1, %xmm0, %xmm0809; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0810; AVX1-NEXT:    retq811;812; AVX2-LABEL: splatvar_shift_v16i16:813; AVX2:       # %bb.0:814; AVX2-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero815; AVX2-NEXT:    vpsraw %xmm1, %ymm0, %ymm0816; AVX2-NEXT:    retq817;818; XOPAVX1-LABEL: splatvar_shift_v16i16:819; XOPAVX1:       # %bb.0:820; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2821; XOPAVX1-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero822; XOPAVX1-NEXT:    vpsraw %xmm1, %xmm2, %xmm2823; XOPAVX1-NEXT:    vpsraw %xmm1, %xmm0, %xmm0824; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0825; XOPAVX1-NEXT:    retq826;827; XOPAVX2-LABEL: splatvar_shift_v16i16:828; XOPAVX2:       # %bb.0:829; XOPAVX2-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero830; XOPAVX2-NEXT:    vpsraw %xmm1, %ymm0, %ymm0831; XOPAVX2-NEXT:    retq832;833; AVX512-LABEL: splatvar_shift_v16i16:834; AVX512:       # %bb.0:835; AVX512-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero836; AVX512-NEXT:    vpsraw %xmm1, %ymm0, %ymm0837; AVX512-NEXT:    retq838;839; AVX512VL-LABEL: splatvar_shift_v16i16:840; AVX512VL:       # %bb.0:841; AVX512VL-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero842; AVX512VL-NEXT:    vpsraw %xmm1, %ymm0, %ymm0843; AVX512VL-NEXT:    retq844;845; X86-AVX1-LABEL: splatvar_shift_v16i16:846; X86-AVX1:       # %bb.0:847; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2848; X86-AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero849; X86-AVX1-NEXT:    vpsraw %xmm1, %xmm2, %xmm2850; X86-AVX1-NEXT:    vpsraw %xmm1, %xmm0, %xmm0851; X86-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0852; X86-AVX1-NEXT:    retl853;854; X86-AVX2-LABEL: splatvar_shift_v16i16:855; X86-AVX2:       # %bb.0:856; X86-AVX2-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero857; X86-AVX2-NEXT:    vpsraw %xmm1, %ymm0, %ymm0858; X86-AVX2-NEXT:    retl859  %splat = shufflevector <16 x i16> %b, <16 x i16> poison, <16 x i32> zeroinitializer860  %shift = ashr <16 x i16> %a, %splat861  ret <16 x i16> %shift862}863 864define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {865; AVX1-LABEL: splatvar_shift_v32i8:866; AVX1:       # %bb.0:867; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2868; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero869; AVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2870; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3871; AVX1-NEXT:    vpsrlw %xmm1, %xmm3, %xmm3872; AVX1-NEXT:    vpshufb {{.*#+}} xmm3 = xmm3[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]873; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2874; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm4 = [32896,32896,32896,32896,32896,32896,32896,32896]875; AVX1-NEXT:    vpsrlw %xmm1, %xmm4, %xmm4876; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2877; AVX1-NEXT:    vpsubb %xmm4, %xmm2, %xmm2878; AVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0879; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0880; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0881; AVX1-NEXT:    vpsubb %xmm4, %xmm0, %xmm0882; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0883; AVX1-NEXT:    retq884;885; AVX2-LABEL: splatvar_shift_v32i8:886; AVX2:       # %bb.0:887; AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero888; AVX2-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0889; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2890; AVX2-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2891; AVX2-NEXT:    vpsrlw $8, %xmm2, %xmm2892; AVX2-NEXT:    vpbroadcastb %xmm2, %ymm2893; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0894; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]895; AVX2-NEXT:    vpsrlw %xmm1, %ymm2, %ymm1896; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0897; AVX2-NEXT:    vpsubb %ymm1, %ymm0, %ymm0898; AVX2-NEXT:    retq899;900; XOPAVX1-LABEL: splatvar_shift_v32i8:901; XOPAVX1:       # %bb.0:902; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2903; XOPAVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1904; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm2, %xmm1905; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2906; XOPAVX1-NEXT:    vpshab %xmm1, %xmm2, %xmm2907; XOPAVX1-NEXT:    vpshab %xmm1, %xmm0, %xmm0908; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0909; XOPAVX1-NEXT:    retq910;911; XOPAVX2-LABEL: splatvar_shift_v32i8:912; XOPAVX2:       # %bb.0:913; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %xmm1914; XOPAVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2915; XOPAVX2-NEXT:    vpsubb %xmm1, %xmm2, %xmm1916; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2917; XOPAVX2-NEXT:    vpshab %xmm1, %xmm2, %xmm2918; XOPAVX2-NEXT:    vpshab %xmm1, %xmm0, %xmm0919; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0920; XOPAVX2-NEXT:    retq921;922; AVX512DQ-LABEL: splatvar_shift_v32i8:923; AVX512DQ:       # %bb.0:924; AVX512DQ-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero925; AVX512DQ-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0926; AVX512DQ-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2927; AVX512DQ-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2928; AVX512DQ-NEXT:    vpsrlw $8, %xmm2, %xmm2929; AVX512DQ-NEXT:    vpbroadcastb %xmm2, %ymm2930; AVX512DQ-NEXT:    vpand %ymm2, %ymm0, %ymm0931; AVX512DQ-NEXT:    vpbroadcastb {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]932; AVX512DQ-NEXT:    vpsrlw %xmm1, %ymm2, %ymm1933; AVX512DQ-NEXT:    vpxor %ymm1, %ymm0, %ymm0934; AVX512DQ-NEXT:    vpsubb %ymm1, %ymm0, %ymm0935; AVX512DQ-NEXT:    retq936;937; AVX512BW-LABEL: splatvar_shift_v32i8:938; AVX512BW:       # %bb.0:939; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm0940; AVX512BW-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero941; AVX512BW-NEXT:    vpsraw %xmm1, %zmm0, %zmm0942; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0943; AVX512BW-NEXT:    retq944;945; AVX512DQVL-LABEL: splatvar_shift_v32i8:946; AVX512DQVL:       # %bb.0:947; AVX512DQVL-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero948; AVX512DQVL-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0949; AVX512DQVL-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896]950; AVX512DQVL-NEXT:    vpsrlw %xmm1, %ymm2, %ymm2951; AVX512DQVL-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3952; AVX512DQVL-NEXT:    vpsrlw %xmm1, %xmm3, %xmm1953; AVX512DQVL-NEXT:    vpsrlw $8, %xmm1, %xmm1954; AVX512DQVL-NEXT:    vpbroadcastb %xmm1, %ymm1955; AVX512DQVL-NEXT:    vpternlogq {{.*#+}} ymm1 = ymm2 ^ (ymm1 & ymm0)956; AVX512DQVL-NEXT:    vpsubb %ymm2, %ymm1, %ymm0957; AVX512DQVL-NEXT:    retq958;959; AVX512BWVL-LABEL: splatvar_shift_v32i8:960; AVX512BWVL:       # %bb.0:961; AVX512BWVL-NEXT:    vpmovsxbw %ymm0, %zmm0962; AVX512BWVL-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero963; AVX512BWVL-NEXT:    vpsraw %xmm1, %zmm0, %zmm0964; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm0965; AVX512BWVL-NEXT:    retq966;967; X86-AVX1-LABEL: splatvar_shift_v32i8:968; X86-AVX1:       # %bb.0:969; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2970; X86-AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero971; X86-AVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2972; X86-AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3973; X86-AVX1-NEXT:    vpsrlw %xmm1, %xmm3, %xmm3974; X86-AVX1-NEXT:    vpshufb {{.*#+}} xmm3 = xmm3[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]975; X86-AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2976; X86-AVX1-NEXT:    vbroadcastss {{.*#+}} xmm4 = [32896,32896,32896,32896,32896,32896,32896,32896]977; X86-AVX1-NEXT:    vpsrlw %xmm1, %xmm4, %xmm4978; X86-AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm2979; X86-AVX1-NEXT:    vpsubb %xmm4, %xmm2, %xmm2980; X86-AVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0981; X86-AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0982; X86-AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0983; X86-AVX1-NEXT:    vpsubb %xmm4, %xmm0, %xmm0984; X86-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0985; X86-AVX1-NEXT:    retl986;987; X86-AVX2-LABEL: splatvar_shift_v32i8:988; X86-AVX2:       # %bb.0:989; X86-AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero990; X86-AVX2-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0991; X86-AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2992; X86-AVX2-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2993; X86-AVX2-NEXT:    vpsrlw $8, %xmm2, %xmm2994; X86-AVX2-NEXT:    vpbroadcastb %xmm2, %ymm2995; X86-AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0996; X86-AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]997; X86-AVX2-NEXT:    vpsrlw %xmm1, %ymm2, %ymm1998; X86-AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0999; X86-AVX2-NEXT:    vpsubb %ymm1, %ymm0, %ymm01000; X86-AVX2-NEXT:    retl1001  %splat = shufflevector <32 x i8> %b, <32 x i8> poison, <32 x i32> zeroinitializer1002  %shift = ashr <32 x i8> %a, %splat1003  ret <32 x i8> %shift1004}1005 1006;1007; Uniform Variable Modulo Shifts1008;1009 1010define <4 x i64> @splatvar_modulo_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {1011; AVX1-LABEL: splatvar_modulo_shift_v4i64:1012; AVX1:       # %bb.0:1013; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11014; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]1015; AVX1-NEXT:    # xmm2 = mem[0,0]1016; AVX1-NEXT:    vpsrlq %xmm1, %xmm2, %xmm21017; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm31018; AVX1-NEXT:    vpsrlq %xmm1, %xmm3, %xmm31019; AVX1-NEXT:    vpxor %xmm2, %xmm3, %xmm31020; AVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm31021; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm01022; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm01023; AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm01024; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm01025; AVX1-NEXT:    retq1026;1027; AVX2-LABEL: splatvar_modulo_shift_v4i64:1028; AVX2:       # %bb.0:1029; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11030; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]1031; AVX2-NEXT:    vpsrlq %xmm1, %ymm2, %ymm21032; AVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm01033; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm01034; AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm01035; AVX2-NEXT:    retq1036;1037; XOPAVX1-LABEL: splatvar_modulo_shift_v4i64:1038; XOPAVX1:       # %bb.0:1039; XOPAVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11040; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm21041; XOPAVX1-NEXT:    vpsubq %xmm1, %xmm2, %xmm11042; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]1043; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21044; XOPAVX1-NEXT:    vpshaq %xmm1, %xmm2, %xmm21045; XOPAVX1-NEXT:    vpshaq %xmm1, %xmm0, %xmm01046; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm01047; XOPAVX1-NEXT:    retq1048;1049; XOPAVX2-LABEL: splatvar_modulo_shift_v4i64:1050; XOPAVX2:       # %bb.0:1051; XOPAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11052; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]1053; XOPAVX2-NEXT:    vpsrlq %xmm1, %ymm2, %ymm21054; XOPAVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm01055; XOPAVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm01056; XOPAVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm01057; XOPAVX2-NEXT:    retq1058;1059; AVX512-LABEL: splatvar_modulo_shift_v4i64:1060; AVX512:       # %bb.0:1061; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01062; AVX512-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11063; AVX512-NEXT:    vpsraq %xmm1, %zmm0, %zmm01064; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm01065; AVX512-NEXT:    retq1066;1067; AVX512VL-LABEL: splatvar_modulo_shift_v4i64:1068; AVX512VL:       # %bb.0:1069; AVX512VL-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm1, %xmm11070; AVX512VL-NEXT:    vpsraq %xmm1, %ymm0, %ymm01071; AVX512VL-NEXT:    retq1072;1073; X86-AVX1-LABEL: splatvar_modulo_shift_v4i64:1074; X86-AVX1:       # %bb.0:1075; X86-AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm11076; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [0,2147483648,0,2147483648]1077; X86-AVX1-NEXT:    # xmm2 = mem[0,0]1078; X86-AVX1-NEXT:    vpsrlq %xmm1, %xmm2, %xmm21079; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm31080; X86-AVX1-NEXT:    vpsrlq %xmm1, %xmm3, %xmm31081; X86-AVX1-NEXT:    vpxor %xmm2, %xmm3, %xmm31082; X86-AVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm31083; X86-AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm01084; X86-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm01085; X86-AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm01086; X86-AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm01087; X86-AVX1-NEXT:    retl1088;1089; X86-AVX2-LABEL: splatvar_modulo_shift_v4i64:1090; X86-AVX2:       # %bb.0:1091; X86-AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm11092; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648]1093; X86-AVX2-NEXT:    vpsrlq %xmm1, %ymm2, %ymm21094; X86-AVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm01095; X86-AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm01096; X86-AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm01097; X86-AVX2-NEXT:    retl1098  %mod = and <4 x i64> %b, <i64 63, i64 63, i64 63, i64 63>1099  %splat = shufflevector <4 x i64> %mod, <4 x i64> poison, <4 x i32> zeroinitializer1100  %shift = ashr <4 x i64> %a, %splat1101  ret <4 x i64> %shift1102}1103 1104define <8 x i32> @splatvar_modulo_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {1105; AVX1-LABEL: splatvar_modulo_shift_v8i32:1106; AVX1:       # %bb.0:1107; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21108; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11109; AVX1-NEXT:    vpsrad %xmm1, %xmm2, %xmm21110; AVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm01111; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm01112; AVX1-NEXT:    retq1113;1114; AVX2-LABEL: splatvar_modulo_shift_v8i32:1115; AVX2:       # %bb.0:1116; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11117; AVX2-NEXT:    vpsrad %xmm1, %ymm0, %ymm01118; AVX2-NEXT:    retq1119;1120; XOPAVX1-LABEL: splatvar_modulo_shift_v8i32:1121; XOPAVX1:       # %bb.0:1122; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21123; XOPAVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11124; XOPAVX1-NEXT:    vpsrad %xmm1, %xmm2, %xmm21125; XOPAVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm01126; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm01127; XOPAVX1-NEXT:    retq1128;1129; XOPAVX2-LABEL: splatvar_modulo_shift_v8i32:1130; XOPAVX2:       # %bb.0:1131; XOPAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11132; XOPAVX2-NEXT:    vpsrad %xmm1, %ymm0, %ymm01133; XOPAVX2-NEXT:    retq1134;1135; AVX512-LABEL: splatvar_modulo_shift_v8i32:1136; AVX512:       # %bb.0:1137; AVX512-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11138; AVX512-NEXT:    vpsrad %xmm1, %ymm0, %ymm01139; AVX512-NEXT:    retq1140;1141; AVX512VL-LABEL: splatvar_modulo_shift_v8i32:1142; AVX512VL:       # %bb.0:1143; AVX512VL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11144; AVX512VL-NEXT:    vpsrad %xmm1, %ymm0, %ymm01145; AVX512VL-NEXT:    retq1146;1147; X86-AVX1-LABEL: splatvar_modulo_shift_v8i32:1148; X86-AVX1:       # %bb.0:1149; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21150; X86-AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm11151; X86-AVX1-NEXT:    vpsrad %xmm1, %xmm2, %xmm21152; X86-AVX1-NEXT:    vpsrad %xmm1, %xmm0, %xmm01153; X86-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm01154; X86-AVX1-NEXT:    retl1155;1156; X86-AVX2-LABEL: splatvar_modulo_shift_v8i32:1157; X86-AVX2:       # %bb.0:1158; X86-AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm11159; X86-AVX2-NEXT:    vpsrad %xmm1, %ymm0, %ymm01160; X86-AVX2-NEXT:    retl1161  %mod = and <8 x i32> %b, <i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31>1162  %splat = shufflevector <8 x i32> %mod, <8 x i32> poison, <8 x i32> zeroinitializer1163  %shift = ashr <8 x i32> %a, %splat1164  ret <8 x i32> %shift1165}1166 1167define <16 x i16> @splatvar_modulo_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {1168; AVX1-LABEL: splatvar_modulo_shift_v16i16:1169; AVX1:       # %bb.0:1170; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21171; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11172; AVX1-NEXT:    vpsraw %xmm1, %xmm2, %xmm21173; AVX1-NEXT:    vpsraw %xmm1, %xmm0, %xmm01174; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm01175; AVX1-NEXT:    retq1176;1177; AVX2-LABEL: splatvar_modulo_shift_v16i16:1178; AVX2:       # %bb.0:1179; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11180; AVX2-NEXT:    vpsraw %xmm1, %ymm0, %ymm01181; AVX2-NEXT:    retq1182;1183; XOPAVX1-LABEL: splatvar_modulo_shift_v16i16:1184; XOPAVX1:       # %bb.0:1185; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21186; XOPAVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11187; XOPAVX1-NEXT:    vpsraw %xmm1, %xmm2, %xmm21188; XOPAVX1-NEXT:    vpsraw %xmm1, %xmm0, %xmm01189; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm01190; XOPAVX1-NEXT:    retq1191;1192; XOPAVX2-LABEL: splatvar_modulo_shift_v16i16:1193; XOPAVX2:       # %bb.0:1194; XOPAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11195; XOPAVX2-NEXT:    vpsraw %xmm1, %ymm0, %ymm01196; XOPAVX2-NEXT:    retq1197;1198; AVX512-LABEL: splatvar_modulo_shift_v16i16:1199; AVX512:       # %bb.0:1200; AVX512-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11201; AVX512-NEXT:    vpsraw %xmm1, %ymm0, %ymm01202; AVX512-NEXT:    retq1203;1204; AVX512VL-LABEL: splatvar_modulo_shift_v16i16:1205; AVX512VL:       # %bb.0:1206; AVX512VL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11207; AVX512VL-NEXT:    vpsraw %xmm1, %ymm0, %ymm01208; AVX512VL-NEXT:    retq1209;1210; X86-AVX1-LABEL: splatvar_modulo_shift_v16i16:1211; X86-AVX1:       # %bb.0:1212; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21213; X86-AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm11214; X86-AVX1-NEXT:    vpsraw %xmm1, %xmm2, %xmm21215; X86-AVX1-NEXT:    vpsraw %xmm1, %xmm0, %xmm01216; X86-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm01217; X86-AVX1-NEXT:    retl1218;1219; X86-AVX2-LABEL: splatvar_modulo_shift_v16i16:1220; X86-AVX2:       # %bb.0:1221; X86-AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm11222; X86-AVX2-NEXT:    vpsraw %xmm1, %ymm0, %ymm01223; X86-AVX2-NEXT:    retl1224  %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>1225  %splat = shufflevector <16 x i16> %mod, <16 x i16> poison, <16 x i32> zeroinitializer1226  %shift = ashr <16 x i16> %a, %splat1227  ret <16 x i16> %shift1228}1229 1230define <32 x i8> @splatvar_modulo_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {1231; AVX1-LABEL: splatvar_modulo_shift_v32i8:1232; AVX1:       # %bb.0:1233; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21234; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11235; AVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm21236; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm31237; AVX1-NEXT:    vpsrlw %xmm1, %xmm3, %xmm31238; AVX1-NEXT:    vpshufb {{.*#+}} xmm3 = xmm3[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1239; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm21240; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm4 = [32896,32896,32896,32896,32896,32896,32896,32896]1241; AVX1-NEXT:    vpsrlw %xmm1, %xmm4, %xmm41242; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm21243; AVX1-NEXT:    vpsubb %xmm4, %xmm2, %xmm21244; AVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm01245; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm01246; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm01247; AVX1-NEXT:    vpsubb %xmm4, %xmm0, %xmm01248; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm01249; AVX1-NEXT:    retq1250;1251; AVX2-LABEL: splatvar_modulo_shift_v32i8:1252; AVX2:       # %bb.0:1253; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11254; AVX2-NEXT:    vpsrlw %xmm1, %ymm0, %ymm01255; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm21256; AVX2-NEXT:    vpsrlw %xmm1, %xmm2, %xmm21257; AVX2-NEXT:    vpsrlw $8, %xmm2, %xmm21258; AVX2-NEXT:    vpbroadcastb %xmm2, %ymm21259; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm01260; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]1261; AVX2-NEXT:    vpsrlw %xmm1, %ymm2, %ymm11262; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm01263; AVX2-NEXT:    vpsubb %ymm1, %ymm0, %ymm01264; AVX2-NEXT:    retq1265;1266; XOPAVX1-LABEL: splatvar_modulo_shift_v32i8:1267; XOPAVX1:       # %bb.0:1268; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm21269; XOPAVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm11270; XOPAVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11271; XOPAVX1-NEXT:    vpsubb %xmm1, %xmm2, %xmm11272; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21273; XOPAVX1-NEXT:    vpshab %xmm1, %xmm2, %xmm21274; XOPAVX1-NEXT:    vpshab %xmm1, %xmm0, %xmm01275; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm01276; XOPAVX1-NEXT:    retq1277;1278; XOPAVX2-LABEL: splatvar_modulo_shift_v32i8:1279; XOPAVX2:       # %bb.0:1280; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %xmm11281; XOPAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11282; XOPAVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm21283; XOPAVX2-NEXT:    vpsubb %xmm1, %xmm2, %xmm11284; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm21285; XOPAVX2-NEXT:    vpshab %xmm1, %xmm2, %xmm21286; XOPAVX2-NEXT:    vpshab %xmm1, %xmm0, %xmm01287; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm01288; XOPAVX2-NEXT:    retq1289;1290; AVX512DQ-LABEL: splatvar_modulo_shift_v32i8:1291; AVX512DQ:       # %bb.0:1292; AVX512DQ-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11293; AVX512DQ-NEXT:    vpsrlw %xmm1, %ymm0, %ymm01294; AVX512DQ-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm21295; AVX512DQ-NEXT:    vpsrlw %xmm1, %xmm2, %xmm21296; AVX512DQ-NEXT:    vpsrlw $8, %xmm2, %xmm21297; AVX512DQ-NEXT:    vpbroadcastb %xmm2, %ymm21298; AVX512DQ-NEXT:    vpand %ymm2, %ymm0, %ymm01299; AVX512DQ-NEXT:    vpbroadcastb {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]1300; AVX512DQ-NEXT:    vpsrlw %xmm1, %ymm2, %ymm11301; AVX512DQ-NEXT:    vpxor %ymm1, %ymm0, %ymm01302; AVX512DQ-NEXT:    vpsubb %ymm1, %ymm0, %ymm01303; AVX512DQ-NEXT:    retq1304;1305; AVX512BW-LABEL: splatvar_modulo_shift_v32i8:1306; AVX512BW:       # %bb.0:1307; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm01308; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11309; AVX512BW-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1310; AVX512BW-NEXT:    vpsraw %xmm1, %zmm0, %zmm01311; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm01312; AVX512BW-NEXT:    retq1313;1314; AVX512DQVL-LABEL: splatvar_modulo_shift_v32i8:1315; AVX512DQVL:       # %bb.0:1316; AVX512DQVL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11317; AVX512DQVL-NEXT:    vpsrlw %xmm1, %ymm0, %ymm01318; AVX512DQVL-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896,32896]1319; AVX512DQVL-NEXT:    vpsrlw %xmm1, %ymm2, %ymm21320; AVX512DQVL-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm31321; AVX512DQVL-NEXT:    vpsrlw %xmm1, %xmm3, %xmm11322; AVX512DQVL-NEXT:    vpsrlw $8, %xmm1, %xmm11323; AVX512DQVL-NEXT:    vpbroadcastb %xmm1, %ymm11324; AVX512DQVL-NEXT:    vpternlogq {{.*#+}} ymm1 = ymm2 ^ (ymm1 & ymm0)1325; AVX512DQVL-NEXT:    vpsubb %ymm2, %ymm1, %ymm01326; AVX512DQVL-NEXT:    retq1327;1328; AVX512BWVL-LABEL: splatvar_modulo_shift_v32i8:1329; AVX512BWVL:       # %bb.0:1330; AVX512BWVL-NEXT:    vpmovsxbw %ymm0, %zmm01331; AVX512BWVL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm11332; AVX512BWVL-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero1333; AVX512BWVL-NEXT:    vpsraw %xmm1, %zmm0, %zmm01334; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm01335; AVX512BWVL-NEXT:    retq1336;1337; X86-AVX1-LABEL: splatvar_modulo_shift_v32i8:1338; X86-AVX1:       # %bb.0:1339; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm21340; X86-AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm11341; X86-AVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm21342; X86-AVX1-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm31343; X86-AVX1-NEXT:    vpsrlw %xmm1, %xmm3, %xmm31344; X86-AVX1-NEXT:    vpshufb {{.*#+}} xmm3 = xmm3[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]1345; X86-AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm21346; X86-AVX1-NEXT:    vbroadcastss {{.*#+}} xmm4 = [32896,32896,32896,32896,32896,32896,32896,32896]1347; X86-AVX1-NEXT:    vpsrlw %xmm1, %xmm4, %xmm41348; X86-AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm21349; X86-AVX1-NEXT:    vpsubb %xmm4, %xmm2, %xmm21350; X86-AVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm01351; X86-AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm01352; X86-AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm01353; X86-AVX1-NEXT:    vpsubb %xmm4, %xmm0, %xmm01354; X86-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm01355; X86-AVX1-NEXT:    retl1356;1357; X86-AVX2-LABEL: splatvar_modulo_shift_v32i8:1358; X86-AVX2:       # %bb.0:1359; X86-AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm11360; X86-AVX2-NEXT:    vpsrlw %xmm1, %ymm0, %ymm01361; X86-AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm21362; X86-AVX2-NEXT:    vpsrlw %xmm1, %xmm2, %xmm21363; X86-AVX2-NEXT:    vpsrlw $8, %xmm2, %xmm21364; X86-AVX2-NEXT:    vpbroadcastb %xmm2, %ymm21365; X86-AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm01366; X86-AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]1367; X86-AVX2-NEXT:    vpsrlw %xmm1, %ymm2, %ymm11368; X86-AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm01369; X86-AVX2-NEXT:    vpsubb %ymm1, %ymm0, %ymm01370; X86-AVX2-NEXT:    retl1371  %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>1372  %splat = shufflevector <32 x i8> %mod, <32 x i8> poison, <32 x i32> zeroinitializer1373  %shift = ashr <32 x i8> %a, %splat1374  ret <32 x i8> %shift1375}1376 1377;1378; Constant Shifts1379;1380 1381define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind {1382; AVX1-LABEL: constant_shift_v4i64:1383; AVX1:       # %bb.0:1384; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11385; AVX1-NEXT:    vpsrlq $62, %xmm1, %xmm21386; AVX1-NEXT:    vpsrlq $31, %xmm1, %xmm11387; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]1388; AVX1-NEXT:    vpmovsxbd {{.*#+}} xmm2 = [0,1,2,0]1389; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm11390; AVX1-NEXT:    vpsubq %xmm2, %xmm1, %xmm11391; AVX1-NEXT:    vpsrlq $7, %xmm0, %xmm21392; AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm01393; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]1394; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [4611686018427387904,72057594037927936]1395; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm01396; AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm01397; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01398; AVX1-NEXT:    retq1399;1400; AVX2-LABEL: constant_shift_v4i64:1401; AVX2:       # %bb.0:1402; AVX2-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01403; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [4611686018427387904,72057594037927936,4294967296,2]1404; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm01405; AVX2-NEXT:    vpsubq %ymm1, %ymm0, %ymm01406; AVX2-NEXT:    retq1407;1408; XOPAVX1-LABEL: constant_shift_v4i64:1409; XOPAVX1:       # %bb.0:1410; XOPAVX1-NEXT:    vpshaq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11411; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01412; XOPAVX1-NEXT:    vpshaq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01413; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm01414; XOPAVX1-NEXT:    retq1415;1416; XOPAVX2-LABEL: constant_shift_v4i64:1417; XOPAVX2:       # %bb.0:1418; XOPAVX2-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01419; XOPAVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [4611686018427387904,72057594037927936,4294967296,2]1420; XOPAVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm01421; XOPAVX2-NEXT:    vpsubq %ymm1, %ymm0, %ymm01422; XOPAVX2-NEXT:    retq1423;1424; AVX512-LABEL: constant_shift_v4i64:1425; AVX512:       # %bb.0:1426; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01427; AVX512-NEXT:    vpmovsxbq {{.*#+}} ymm1 = [1,7,31,62]1428; AVX512-NEXT:    vpsravq %zmm1, %zmm0, %zmm01429; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm01430; AVX512-NEXT:    retq1431;1432; AVX512VL-LABEL: constant_shift_v4i64:1433; AVX512VL:       # %bb.0:1434; AVX512VL-NEXT:    vpsravq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01435; AVX512VL-NEXT:    retq1436;1437; X86-AVX1-LABEL: constant_shift_v4i64:1438; X86-AVX1:       # %bb.0:1439; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11440; X86-AVX1-NEXT:    vpsrlq $62, %xmm1, %xmm21441; X86-AVX1-NEXT:    vpsrlq $31, %xmm1, %xmm11442; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]1443; X86-AVX1-NEXT:    vpmovsxbd {{.*#+}} xmm2 = [0,1,2,0]1444; X86-AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm11445; X86-AVX1-NEXT:    vpsubq %xmm2, %xmm1, %xmm11446; X86-AVX1-NEXT:    vpsrlq $7, %xmm0, %xmm21447; X86-AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm01448; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]1449; X86-AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1073741824,0,16777216]1450; X86-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm01451; X86-AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm01452; X86-AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01453; X86-AVX1-NEXT:    retl1454;1455; X86-AVX2-LABEL: constant_shift_v4i64:1456; X86-AVX2:       # %bb.0:1457; X86-AVX2-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm01458; X86-AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,1073741824,0,16777216,0,1,2,0]1459; X86-AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm01460; X86-AVX2-NEXT:    vpsubq %ymm1, %ymm0, %ymm01461; X86-AVX2-NEXT:    retl1462  %shift = ashr <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62>1463  ret <4 x i64> %shift1464}1465 1466define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind {1467; AVX1-LABEL: constant_shift_v8i32:1468; AVX1:       # %bb.0:1469; AVX1-NEXT:    vpsrad $7, %xmm0, %xmm11470; AVX1-NEXT:    vpsrad $5, %xmm0, %xmm21471; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]1472; AVX1-NEXT:    vpsrad $6, %xmm0, %xmm21473; AVX1-NEXT:    vpsrad $4, %xmm0, %xmm31474; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]1475; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]1476; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01477; AVX1-NEXT:    vpsrad $7, %xmm0, %xmm21478; AVX1-NEXT:    vpsrad $9, %xmm0, %xmm31479; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]1480; AVX1-NEXT:    vpsrad $8, %xmm0, %xmm01481; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]1482; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm01483; AVX1-NEXT:    retq1484;1485; AVX2-LABEL: constant_shift_v8i32:1486; AVX2:       # %bb.0:1487; AVX2-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01488; AVX2-NEXT:    retq1489;1490; XOPAVX1-LABEL: constant_shift_v8i32:1491; XOPAVX1:       # %bb.0:1492; XOPAVX1-NEXT:    vpshad {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11493; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01494; XOPAVX1-NEXT:    vpshad {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01495; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm01496; XOPAVX1-NEXT:    retq1497;1498; XOPAVX2-LABEL: constant_shift_v8i32:1499; XOPAVX2:       # %bb.0:1500; XOPAVX2-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01501; XOPAVX2-NEXT:    retq1502;1503; AVX512-LABEL: constant_shift_v8i32:1504; AVX512:       # %bb.0:1505; AVX512-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01506; AVX512-NEXT:    retq1507;1508; AVX512VL-LABEL: constant_shift_v8i32:1509; AVX512VL:       # %bb.0:1510; AVX512VL-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01511; AVX512VL-NEXT:    retq1512;1513; X86-AVX1-LABEL: constant_shift_v8i32:1514; X86-AVX1:       # %bb.0:1515; X86-AVX1-NEXT:    vpsrad $7, %xmm0, %xmm11516; X86-AVX1-NEXT:    vpsrad $5, %xmm0, %xmm21517; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]1518; X86-AVX1-NEXT:    vpsrad $6, %xmm0, %xmm21519; X86-AVX1-NEXT:    vpsrad $4, %xmm0, %xmm31520; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]1521; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]1522; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01523; X86-AVX1-NEXT:    vpsrad $7, %xmm0, %xmm21524; X86-AVX1-NEXT:    vpsrad $9, %xmm0, %xmm31525; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]1526; X86-AVX1-NEXT:    vpsrad $8, %xmm0, %xmm01527; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]1528; X86-AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm01529; X86-AVX1-NEXT:    retl1530;1531; X86-AVX2-LABEL: constant_shift_v8i32:1532; X86-AVX2:       # %bb.0:1533; X86-AVX2-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm01534; X86-AVX2-NEXT:    retl1535  %shift = ashr <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>1536  ret <8 x i32> %shift1537}1538 1539define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind {1540; AVX1-LABEL: constant_shift_v16i16:1541; AVX1:       # %bb.0:1542; AVX1-NEXT:    vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [u,u,16384,8192,4096,2048,1024,512]1543; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5,6,7]1544; AVX1-NEXT:    vpsraw $1, %xmm0, %xmm21545; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2,3,4,5,6,7]1546; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01547; AVX1-NEXT:    vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [256,128,64,32,16,8,4,2]1548; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm01549; AVX1-NEXT:    retq1550;1551; AVX2-LABEL: constant_shift_v16i16:1552; AVX2:       # %bb.0:1553; AVX2-NEXT:    vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1 # [u,u,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2]1554; AVX2-NEXT:    vpblendw {{.*#+}} xmm2 = xmm0[0],xmm1[1,2,3,4,5,6,7]1555; AVX2-NEXT:    vpsraw $1, %xmm0, %xmm01556; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0],xmm0[1],xmm2[2,3,4,5,6,7]1557; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]1558; AVX2-NEXT:    retq1559;1560; XOPAVX1-LABEL: constant_shift_v16i16:1561; XOPAVX1:       # %bb.0:1562; XOPAVX1-NEXT:    vpshaw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11563; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01564; XOPAVX1-NEXT:    vpshaw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01565; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm01566; XOPAVX1-NEXT:    retq1567;1568; XOPAVX2-LABEL: constant_shift_v16i16:1569; XOPAVX2:       # %bb.0:1570; XOPAVX2-NEXT:    vpshaw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11571; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm01572; XOPAVX2-NEXT:    vpshaw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01573; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm01574; XOPAVX2-NEXT:    retq1575;1576; AVX512DQ-LABEL: constant_shift_v16i16:1577; AVX512DQ:       # %bb.0:1578; AVX512DQ-NEXT:    vpmovsxwd %ymm0, %zmm01579; AVX512DQ-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm01580; AVX512DQ-NEXT:    vpmovdw %zmm0, %ymm01581; AVX512DQ-NEXT:    retq1582;1583; AVX512BW-LABEL: constant_shift_v16i16:1584; AVX512BW:       # %bb.0:1585; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01586; AVX512BW-NEXT:    vpmovsxbw {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]1587; AVX512BW-NEXT:    vpsravw %zmm1, %zmm0, %zmm01588; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm01589; AVX512BW-NEXT:    retq1590;1591; AVX512DQVL-LABEL: constant_shift_v16i16:1592; AVX512DQVL:       # %bb.0:1593; AVX512DQVL-NEXT:    vpmovsxwd %ymm0, %zmm01594; AVX512DQVL-NEXT:    vpsravd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm01595; AVX512DQVL-NEXT:    vpmovdw %zmm0, %ymm01596; AVX512DQVL-NEXT:    retq1597;1598; AVX512BWVL-LABEL: constant_shift_v16i16:1599; AVX512BWVL:       # %bb.0:1600; AVX512BWVL-NEXT:    vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01601; AVX512BWVL-NEXT:    retq1602;1603; X86-AVX1-LABEL: constant_shift_v16i16:1604; X86-AVX1:       # %bb.0:1605; X86-AVX1-NEXT:    vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm1 # [u,u,16384,8192,4096,2048,1024,512]1606; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5,6,7]1607; X86-AVX1-NEXT:    vpsraw $1, %xmm0, %xmm21608; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2,3,4,5,6,7]1609; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01610; X86-AVX1-NEXT:    vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 # [256,128,64,32,16,8,4,2]1611; X86-AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm01612; X86-AVX1-NEXT:    retl1613;1614; X86-AVX2-LABEL: constant_shift_v16i16:1615; X86-AVX2:       # %bb.0:1616; X86-AVX2-NEXT:    vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm1 # [u,u,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2]1617; X86-AVX2-NEXT:    vpblendw {{.*#+}} xmm2 = xmm0[0],xmm1[1,2,3,4,5,6,7]1618; X86-AVX2-NEXT:    vpsraw $1, %xmm0, %xmm01619; X86-AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0],xmm0[1],xmm2[2,3,4,5,6,7]1620; X86-AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]1621; X86-AVX2-NEXT:    retl1622  %shift = ashr <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>1623  ret <16 x i16> %shift1624}1625 1626define <16 x i16> @constant_shift_v16i16_pairs(<16 x i16> %a) nounwind {1627; AVX1-LABEL: constant_shift_v16i16_pairs:1628; AVX1:       # %bb.0:1629; AVX1-NEXT:    vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # [u,u,u,u,8192,8192,16384,16384]1630; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3,4,5,6,7]1631; AVX1-NEXT:    vpsraw $1, %xmm0, %xmm21632; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5,6,7]1633; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01634; AVX1-NEXT:    vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [1024,1024,512,512,2048,2048,4096,4096]1635; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm01636; AVX1-NEXT:    retq1637;1638; AVX2-LABEL: constant_shift_v16i16_pairs:1639; AVX2:       # %bb.0:1640; AVX2-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01641; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01642; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [32768,32768,16384,16384,4096,4096,8192,8192,512,512,256,256,1024,1024,2048,2048]1643; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm01644; AVX2-NEXT:    vpsubw %ymm1, %ymm0, %ymm01645; AVX2-NEXT:    retq1646;1647; XOPAVX1-LABEL: constant_shift_v16i16_pairs:1648; XOPAVX1:       # %bb.0:1649; XOPAVX1-NEXT:    vpshaw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11650; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01651; XOPAVX1-NEXT:    vpshaw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01652; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm01653; XOPAVX1-NEXT:    retq1654;1655; XOPAVX2-LABEL: constant_shift_v16i16_pairs:1656; XOPAVX2:       # %bb.0:1657; XOPAVX2-NEXT:    vpshaw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11658; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm01659; XOPAVX2-NEXT:    vpshaw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01660; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm01661; XOPAVX2-NEXT:    retq1662;1663; AVX512DQ-LABEL: constant_shift_v16i16_pairs:1664; AVX512DQ:       # %bb.0:1665; AVX512DQ-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01666; AVX512DQ-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01667; AVX512DQ-NEXT:    vmovdqa {{.*#+}} ymm1 = [32768,32768,16384,16384,4096,4096,8192,8192,512,512,256,256,1024,1024,2048,2048]1668; AVX512DQ-NEXT:    vpxor %ymm1, %ymm0, %ymm01669; AVX512DQ-NEXT:    vpsubw %ymm1, %ymm0, %ymm01670; AVX512DQ-NEXT:    retq1671;1672; AVX512BW-LABEL: constant_shift_v16i16_pairs:1673; AVX512BW:       # %bb.0:1674; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01675; AVX512BW-NEXT:    vpmovsxbw {{.*#+}} ymm1 = [0,0,1,1,3,3,2,2,6,6,7,7,5,5,4,4]1676; AVX512BW-NEXT:    vpsravw %zmm1, %zmm0, %zmm01677; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm01678; AVX512BW-NEXT:    retq1679;1680; AVX512DQVL-LABEL: constant_shift_v16i16_pairs:1681; AVX512DQVL:       # %bb.0:1682; AVX512DQVL-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01683; AVX512DQVL-NEXT:    vmovdqa {{.*#+}} ymm1 = [32768,32768,16384,16384,4096,4096,8192,8192,512,512,256,256,1024,1024,2048,2048]1684; AVX512DQVL-NEXT:    vpternlogq {{.*#+}} ymm0 = ymm1 ^ (ymm0 & mem)1685; AVX512DQVL-NEXT:    vpsubw %ymm1, %ymm0, %ymm01686; AVX512DQVL-NEXT:    retq1687;1688; AVX512BWVL-LABEL: constant_shift_v16i16_pairs:1689; AVX512BWVL:       # %bb.0:1690; AVX512BWVL-NEXT:    vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01691; AVX512BWVL-NEXT:    retq1692;1693; X86-AVX1-LABEL: constant_shift_v16i16_pairs:1694; X86-AVX1:       # %bb.0:1695; X86-AVX1-NEXT:    vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm1 # [u,u,u,u,8192,8192,16384,16384]1696; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3,4,5,6,7]1697; X86-AVX1-NEXT:    vpsraw $1, %xmm0, %xmm21698; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5,6,7]1699; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01700; X86-AVX1-NEXT:    vpmulhw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0 # [1024,1024,512,512,2048,2048,4096,4096]1701; X86-AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm01702; X86-AVX1-NEXT:    retl1703;1704; X86-AVX2-LABEL: constant_shift_v16i16_pairs:1705; X86-AVX2:       # %bb.0:1706; X86-AVX2-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm01707; X86-AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm01708; X86-AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [32768,32768,16384,16384,4096,4096,8192,8192,512,512,256,256,1024,1024,2048,2048]1709; X86-AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm01710; X86-AVX2-NEXT:    vpsubw %ymm1, %ymm0, %ymm01711; X86-AVX2-NEXT:    retl1712  %shift = ashr <16 x i16> %a, <i16 0, i16 0, i16 1, i16 1, i16 3, i16 3, i16 2, i16 2, i16 6, i16 6, i16 7, i16 7, i16 5, i16 5, i16 4, i16 4>1713  ret <16 x i16> %shift1714}1715 1716define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind {1717; AVX1-LABEL: constant_shift_v32i8:1718; AVX1:       # %bb.0:1719; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11720; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1721; AVX1-NEXT:    vpsraw $8, %xmm2, %xmm21722; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [2,4,8,16,32,64,128,256]1723; AVX1-NEXT:    vpmullw %xmm3, %xmm2, %xmm21724; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm21725; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1726; AVX1-NEXT:    vpsraw $8, %xmm1, %xmm11727; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [256,128,64,32,16,8,4,2]1728; AVX1-NEXT:    vpmullw %xmm4, %xmm1, %xmm11729; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm11730; AVX1-NEXT:    vpackuswb %xmm2, %xmm1, %xmm11731; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1732; AVX1-NEXT:    vpsraw $8, %xmm2, %xmm21733; AVX1-NEXT:    vpmullw %xmm3, %xmm2, %xmm21734; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm21735; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1736; AVX1-NEXT:    vpsraw $8, %xmm0, %xmm01737; AVX1-NEXT:    vpmullw %xmm4, %xmm0, %xmm01738; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm01739; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm01740; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01741; AVX1-NEXT:    retq1742;1743; AVX2-LABEL: constant_shift_v32i8:1744; AVX2:       # %bb.0:1745; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm1 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]1746; AVX2-NEXT:    vpsraw $8, %ymm1, %ymm11747; AVX2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [2,4,8,16,32,64,128,256,2,4,8,16,32,64,128,256]1748; AVX2-NEXT:    vpsrlw $8, %ymm1, %ymm11749; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]1750; AVX2-NEXT:    vpsraw $8, %ymm0, %ymm01751; 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]1752; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm01753; AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm01754; AVX2-NEXT:    retq1755;1756; XOPAVX1-LABEL: constant_shift_v32i8:1757; XOPAVX1:       # %bb.0:1758; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11759; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,255,254,253,252,251,250,249,249,250,251,252,253,254,255,0]1760; XOPAVX1-NEXT:    vpshab %xmm2, %xmm1, %xmm11761; XOPAVX1-NEXT:    vpshab %xmm2, %xmm0, %xmm01762; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01763; XOPAVX1-NEXT:    retq1764;1765; XOPAVX2-LABEL: constant_shift_v32i8:1766; XOPAVX2:       # %bb.0:1767; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm11768; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,255,254,253,252,251,250,249,249,250,251,252,253,254,255,0]1769; XOPAVX2-NEXT:    vpshab %xmm2, %xmm1, %xmm11770; XOPAVX2-NEXT:    vpshab %xmm2, %xmm0, %xmm01771; XOPAVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm01772; XOPAVX2-NEXT:    retq1773;1774; AVX512DQ-LABEL: constant_shift_v32i8:1775; AVX512DQ:       # %bb.0:1776; AVX512DQ-NEXT:    vpunpckhbw {{.*#+}} ymm1 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]1777; AVX512DQ-NEXT:    vpsraw $8, %ymm1, %ymm11778; AVX512DQ-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [2,4,8,16,32,64,128,256,2,4,8,16,32,64,128,256]1779; AVX512DQ-NEXT:    vpsrlw $8, %ymm1, %ymm11780; AVX512DQ-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]1781; AVX512DQ-NEXT:    vpsraw $8, %ymm0, %ymm01782; 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]1783; AVX512DQ-NEXT:    vpsrlw $8, %ymm0, %ymm01784; AVX512DQ-NEXT:    vpackuswb %ymm1, %ymm0, %ymm01785; AVX512DQ-NEXT:    retq1786;1787; AVX512BW-LABEL: constant_shift_v32i8:1788; AVX512BW:       # %bb.0:1789; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm01790; AVX512BW-NEXT:    vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm01791; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm01792; AVX512BW-NEXT:    retq1793;1794; AVX512DQVL-LABEL: constant_shift_v32i8:1795; AVX512DQVL:       # %bb.0:1796; AVX512DQVL-NEXT:    vpunpckhbw {{.*#+}} ymm1 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]1797; AVX512DQVL-NEXT:    vpsraw $8, %ymm1, %ymm11798; AVX512DQVL-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [2,4,8,16,32,64,128,256,2,4,8,16,32,64,128,256]1799; AVX512DQVL-NEXT:    vpsrlw $8, %ymm1, %ymm11800; AVX512DQVL-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]1801; AVX512DQVL-NEXT:    vpsraw $8, %ymm0, %ymm01802; 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]1803; AVX512DQVL-NEXT:    vpsrlw $8, %ymm0, %ymm01804; AVX512DQVL-NEXT:    vpackuswb %ymm1, %ymm0, %ymm01805; AVX512DQVL-NEXT:    retq1806;1807; AVX512BWVL-LABEL: constant_shift_v32i8:1808; AVX512BWVL:       # %bb.0:1809; AVX512BWVL-NEXT:    vpmovsxbw %ymm0, %zmm01810; AVX512BWVL-NEXT:    vpsravw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm01811; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm01812; AVX512BWVL-NEXT:    retq1813;1814; X86-AVX1-LABEL: constant_shift_v32i8:1815; X86-AVX1:       # %bb.0:1816; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11817; X86-AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1818; X86-AVX1-NEXT:    vpsraw $8, %xmm2, %xmm21819; X86-AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [2,4,8,16,32,64,128,256]1820; X86-AVX1-NEXT:    vpmullw %xmm3, %xmm2, %xmm21821; X86-AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm21822; X86-AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1823; X86-AVX1-NEXT:    vpsraw $8, %xmm1, %xmm11824; X86-AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [256,128,64,32,16,8,4,2]1825; X86-AVX1-NEXT:    vpmullw %xmm4, %xmm1, %xmm11826; X86-AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm11827; X86-AVX1-NEXT:    vpackuswb %xmm2, %xmm1, %xmm11828; X86-AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]1829; X86-AVX1-NEXT:    vpsraw $8, %xmm2, %xmm21830; X86-AVX1-NEXT:    vpmullw %xmm3, %xmm2, %xmm21831; X86-AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm21832; X86-AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]1833; X86-AVX1-NEXT:    vpsraw $8, %xmm0, %xmm01834; X86-AVX1-NEXT:    vpmullw %xmm4, %xmm0, %xmm01835; X86-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm01836; X86-AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm01837; X86-AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01838; X86-AVX1-NEXT:    retl1839;1840; X86-AVX2-LABEL: constant_shift_v32i8:1841; X86-AVX2:       # %bb.0:1842; X86-AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm1 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]1843; X86-AVX2-NEXT:    vpsraw $8, %ymm1, %ymm11844; X86-AVX2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}, %ymm1, %ymm1 # [2,4,8,16,32,64,128,256,2,4,8,16,32,64,128,256]1845; X86-AVX2-NEXT:    vpsrlw $8, %ymm1, %ymm11846; X86-AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]1847; X86-AVX2-NEXT:    vpsraw $8, %ymm0, %ymm01848; 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]1849; X86-AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm01850; X86-AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm01851; X86-AVX2-NEXT:    retl1852  %shift = ashr <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>1853  ret <32 x i8> %shift1854}1855 1856define <32 x i8> @constant_shift_v32i8_pairs(<32 x i8> %a) nounwind {1857; AVX1-LABEL: constant_shift_v32i8_pairs:1858; AVX1:       # %bb.0:1859; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11860; AVX1-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [512,16384,4096,1024,8192,2048,4096,32768]1861; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11862; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [1,1,32,32,8,8,2,2,16,16,4,4,8,8,64,64]1863; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm11864; AVX1-NEXT:    vpsubb %xmm2, %xmm1, %xmm11865; AVX1-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2 # [2048,1024,2048,4096,16384,1024,16384,u]1866; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0,1,2,3,4,5,6],xmm0[7]1867; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01868; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [4,4,2,2,4,4,8,8,32,32,2,2,32,32,128,128]1869; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm01870; AVX1-NEXT:    vpsubb %xmm2, %xmm0, %xmm01871; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01872; AVX1-NEXT:    retq1873;1874; AVX2-LABEL: constant_shift_v32i8_pairs:1875; AVX2:       # %bb.0:1876; AVX2-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1 # [2048,1024,2048,4096,16384,1024,16384,u,512,16384,4096,1024,8192,2048,4096,32768]1877; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4,5,6],xmm0[7]1878; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]1879; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01880; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [4,4,2,2,4,4,8,8,32,32,2,2,32,32,128,128,1,1,32,32,8,8,2,2,16,16,4,4,8,8,64,64]1881; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm01882; AVX2-NEXT:    vpsubb %ymm1, %ymm0, %ymm01883; AVX2-NEXT:    retq1884;1885; XOPAVX1-LABEL: constant_shift_v32i8_pairs:1886; XOPAVX1:       # %bb.0:1887; XOPAVX1-NEXT:    vpshab {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11888; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm01889; XOPAVX1-NEXT:    vpshab {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01890; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm01891; XOPAVX1-NEXT:    retq1892;1893; XOPAVX2-LABEL: constant_shift_v32i8_pairs:1894; XOPAVX2:       # %bb.0:1895; XOPAVX2-NEXT:    vpshab {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm11896; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm01897; XOPAVX2-NEXT:    vpshab {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01898; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm01899; XOPAVX2-NEXT:    retq1900;1901; AVX512DQ-LABEL: constant_shift_v32i8_pairs:1902; AVX512DQ:       # %bb.0:1903; AVX512DQ-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1 # [2048,1024,2048,4096,16384,1024,16384,u,512,16384,4096,1024,8192,2048,4096,32768]1904; AVX512DQ-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4,5,6],xmm0[7]1905; AVX512DQ-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]1906; AVX512DQ-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01907; AVX512DQ-NEXT:    vmovdqa {{.*#+}} ymm1 = [4,4,2,2,4,4,8,8,32,32,2,2,32,32,128,128,1,1,32,32,8,8,2,2,16,16,4,4,8,8,64,64]1908; AVX512DQ-NEXT:    vpxor %ymm1, %ymm0, %ymm01909; AVX512DQ-NEXT:    vpsubb %ymm1, %ymm0, %ymm01910; AVX512DQ-NEXT:    retq1911;1912; AVX512BW-LABEL: constant_shift_v32i8_pairs:1913; AVX512BW:       # %bb.0:1914; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm01915; AVX512BW-NEXT:    vpmovsxbw {{.*#+}} ymm1 = [5,6,5,4,2,6,2,0,7,2,4,6,3,5,4,1]1916; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm01917; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01918; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm1 = [4,4,2,2,4,4,8,8,32,32,2,2,32,32,128,128,1,1,32,32,8,8,2,2,16,16,4,4,8,8,64,64]1919; AVX512BW-NEXT:    vpxor %ymm1, %ymm0, %ymm01920; AVX512BW-NEXT:    vpsubb %ymm1, %ymm0, %ymm01921; AVX512BW-NEXT:    retq1922;1923; AVX512DQVL-LABEL: constant_shift_v32i8_pairs:1924; AVX512DQVL:       # %bb.0:1925; AVX512DQVL-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1 # [2048,1024,2048,4096,16384,1024,16384,u,512,16384,4096,1024,8192,2048,4096,32768]1926; AVX512DQVL-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4,5,6],xmm0[7]1927; AVX512DQVL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]1928; AVX512DQVL-NEXT:    vmovdqa {{.*#+}} ymm1 = [4,4,2,2,4,4,8,8,32,32,2,2,32,32,128,128,1,1,32,32,8,8,2,2,16,16,4,4,8,8,64,64]1929; AVX512DQVL-NEXT:    vpternlogq {{.*#+}} ymm0 = ymm1 ^ (ymm0 & mem)1930; AVX512DQVL-NEXT:    vpsubb %ymm1, %ymm0, %ymm01931; AVX512DQVL-NEXT:    retq1932;1933; AVX512BWVL-LABEL: constant_shift_v32i8_pairs:1934; AVX512BWVL:       # %bb.0:1935; AVX512BWVL-NEXT:    vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01936; AVX512BWVL-NEXT:    vmovdqa {{.*#+}} ymm1 = [4,4,2,2,4,4,8,8,32,32,2,2,32,32,128,128,1,1,32,32,8,8,2,2,16,16,4,4,8,8,64,64]1937; AVX512BWVL-NEXT:    vpternlogq {{.*#+}} ymm0 = ymm1 ^ (ymm0 & mem)1938; AVX512BWVL-NEXT:    vpsubb %ymm1, %ymm0, %ymm01939; AVX512BWVL-NEXT:    retq1940;1941; X86-AVX1-LABEL: constant_shift_v32i8_pairs:1942; X86-AVX1:       # %bb.0:1943; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11944; X86-AVX1-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1 # [512,16384,4096,1024,8192,2048,4096,32768]1945; X86-AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm11946; X86-AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [1,1,32,32,8,8,2,2,16,16,4,4,8,8,64,64]1947; X86-AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm11948; X86-AVX1-NEXT:    vpsubb %xmm2, %xmm1, %xmm11949; X86-AVX1-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm2 # [2048,1024,2048,4096,16384,1024,16384,u]1950; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0,1,2,3,4,5,6],xmm0[7]1951; X86-AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm01952; X86-AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [4,4,2,2,4,4,8,8,32,32,2,2,32,32,128,128]1953; X86-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm01954; X86-AVX1-NEXT:    vpsubb %xmm2, %xmm0, %xmm01955; X86-AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01956; X86-AVX1-NEXT:    retl1957;1958; X86-AVX2-LABEL: constant_shift_v32i8_pairs:1959; X86-AVX2:       # %bb.0:1960; X86-AVX2-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm1 # [2048,1024,2048,4096,16384,1024,16384,u,512,16384,4096,1024,8192,2048,4096,32768]1961; X86-AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4,5,6],xmm0[7]1962; X86-AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]1963; X86-AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm01964; X86-AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [4,4,2,2,4,4,8,8,32,32,2,2,32,32,128,128,1,1,32,32,8,8,2,2,16,16,4,4,8,8,64,64]1965; X86-AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm01966; X86-AVX2-NEXT:    vpsubb %ymm1, %ymm0, %ymm01967; X86-AVX2-NEXT:    retl1968  %shift = ashr <32 x i8> %a, <i8 5, i8 5, i8 6, i8 6, i8 5, i8 5, i8 4, i8 4, i8 2, i8 2, i8 6, i8 6, i8 2, i8 2, i8 0, i8 0, i8 7, i8 7, i8 2, i8 2, i8 4, i8 4, i8 6, i8 6, i8 3, i8 3, i8 5, i8 5, i8 4, i8 4, i8 1, i8 1>1969  ret <32 x i8> %shift1970}1971 1972define <32 x i8> @constant_shift_v32i8_quads(<32 x i8> %a) nounwind {1973; AVX1-LABEL: constant_shift_v32i8_quads:1974; AVX1:       # %bb.0:1975; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm11976; AVX1-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [1024,1024,512,512,2048,2048,4096,4096]1977; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11978; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [2,2,2,2,1,1,1,1,4,4,4,4,8,8,8,8]1979; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm11980; AVX1-NEXT:    vpsubb %xmm2, %xmm1, %xmm11981; AVX1-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2 # [u,u,32768,32768,8192,8192,16384,16384]1982; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3,4,5,6,7]1983; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01984; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [128,128,128,128,64,64,64,64,16,16,16,16,32,32,32,32]1985; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm01986; AVX1-NEXT:    vpsubb %xmm2, %xmm0, %xmm01987; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm01988; AVX1-NEXT:    retq1989;1990; AVX2-LABEL: constant_shift_v32i8_quads:1991; AVX2:       # %bb.0:1992; AVX2-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01993; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm01994; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [128,128,128,128,64,64,64,64,16,16,16,16,32,32,32,32,2,2,2,2,1,1,1,1,4,4,4,4,8,8,8,8]1995; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm01996; AVX2-NEXT:    vpsubb %ymm1, %ymm0, %ymm01997; AVX2-NEXT:    retq1998;1999; XOPAVX1-LABEL: constant_shift_v32i8_quads:2000; XOPAVX1:       # %bb.0:2001; XOPAVX1-NEXT:    vpshab {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm12002; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm02003; XOPAVX1-NEXT:    vpshab {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02004; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm02005; XOPAVX1-NEXT:    retq2006;2007; XOPAVX2-LABEL: constant_shift_v32i8_quads:2008; XOPAVX2:       # %bb.0:2009; XOPAVX2-NEXT:    vpshab {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm12010; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm02011; XOPAVX2-NEXT:    vpshab {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02012; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm02013; XOPAVX2-NEXT:    retq2014;2015; AVX512-LABEL: constant_shift_v32i8_quads:2016; AVX512:       # %bb.0:2017; AVX512-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02018; AVX512-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02019; AVX512-NEXT:    vmovdqa {{.*#+}} ymm1 = [128,128,128,128,64,64,64,64,16,16,16,16,32,32,32,32,2,2,2,2,1,1,1,1,4,4,4,4,8,8,8,8]2020; AVX512-NEXT:    vpxor %ymm1, %ymm0, %ymm02021; AVX512-NEXT:    vpsubb %ymm1, %ymm0, %ymm02022; AVX512-NEXT:    retq2023;2024; AVX512VL-LABEL: constant_shift_v32i8_quads:2025; AVX512VL:       # %bb.0:2026; AVX512VL-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02027; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm1 = [128,128,128,128,64,64,64,64,16,16,16,16,32,32,32,32,2,2,2,2,1,1,1,1,4,4,4,4,8,8,8,8]2028; AVX512VL-NEXT:    vpternlogq {{.*#+}} ymm0 = ymm1 ^ (ymm0 & mem)2029; AVX512VL-NEXT:    vpsubb %ymm1, %ymm0, %ymm02030; AVX512VL-NEXT:    retq2031;2032; X86-AVX1-LABEL: constant_shift_v32i8_quads:2033; X86-AVX1:       # %bb.0:2034; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm12035; X86-AVX1-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1 # [1024,1024,512,512,2048,2048,4096,4096]2036; X86-AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm12037; X86-AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [2,2,2,2,1,1,1,1,4,4,4,4,8,8,8,8]2038; X86-AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm12039; X86-AVX1-NEXT:    vpsubb %xmm2, %xmm1, %xmm12040; X86-AVX1-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm2 # [u,u,32768,32768,8192,8192,16384,16384]2041; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3,4,5,6,7]2042; X86-AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm02043; X86-AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [128,128,128,128,64,64,64,64,16,16,16,16,32,32,32,32]2044; X86-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm02045; X86-AVX1-NEXT:    vpsubb %xmm2, %xmm0, %xmm02046; X86-AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm02047; X86-AVX1-NEXT:    retl2048;2049; X86-AVX2-LABEL: constant_shift_v32i8_quads:2050; X86-AVX2:       # %bb.0:2051; X86-AVX2-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm02052; X86-AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm02053; X86-AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [128,128,128,128,64,64,64,64,16,16,16,16,32,32,32,32,2,2,2,2,1,1,1,1,4,4,4,4,8,8,8,8]2054; X86-AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm02055; X86-AVX2-NEXT:    vpsubb %ymm1, %ymm0, %ymm02056; X86-AVX2-NEXT:    retl2057  %shift = ashr <32 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, i8 6, i8 6, i8 6, i8 6, i8 7, i8 7, i8 7, i8 7, i8 5, i8 5, i8 5, i8 5, i8 4, i8 4, i8 4, i8 4>2058  ret <32 x i8> %shift2059}2060 2061;2062; Uniform Constant Shifts2063;2064 2065define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind {2066; AVX1-LABEL: splatconstant_shift_v4i64:2067; AVX1:       # %bb.0:2068; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm12069; AVX1-NEXT:    vpsrad $7, %xmm1, %xmm22070; AVX1-NEXT:    vpsrlq $7, %xmm1, %xmm12071; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]2072; AVX1-NEXT:    vpsrad $7, %xmm0, %xmm22073; AVX1-NEXT:    vpsrlq $7, %xmm0, %xmm02074; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]2075; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm02076; AVX1-NEXT:    retq2077;2078; AVX2-LABEL: splatconstant_shift_v4i64:2079; AVX2:       # %bb.0:2080; AVX2-NEXT:    vpsrad $7, %ymm0, %ymm12081; AVX2-NEXT:    vpsrlq $7, %ymm0, %ymm02082; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]2083; AVX2-NEXT:    retq2084;2085; XOPAVX1-LABEL: splatconstant_shift_v4i64:2086; XOPAVX1:       # %bb.0:2087; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm12088; XOPAVX1-NEXT:    vpmovsxbq {{.*#+}} xmm2 = [18446744073709551609,18446744073709551609]2089; XOPAVX1-NEXT:    vpshaq %xmm2, %xmm1, %xmm12090; XOPAVX1-NEXT:    vpshaq %xmm2, %xmm0, %xmm02091; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm02092; XOPAVX1-NEXT:    retq2093;2094; XOPAVX2-LABEL: splatconstant_shift_v4i64:2095; XOPAVX2:       # %bb.0:2096; XOPAVX2-NEXT:    vpsrad $7, %ymm0, %ymm12097; XOPAVX2-NEXT:    vpsrlq $7, %ymm0, %ymm02098; XOPAVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]2099; XOPAVX2-NEXT:    retq2100;2101; AVX512-LABEL: splatconstant_shift_v4i64:2102; AVX512:       # %bb.0:2103; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm02104; AVX512-NEXT:    vpsraq $7, %zmm0, %zmm02105; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm02106; AVX512-NEXT:    retq2107;2108; AVX512VL-LABEL: splatconstant_shift_v4i64:2109; AVX512VL:       # %bb.0:2110; AVX512VL-NEXT:    vpsraq $7, %ymm0, %ymm02111; AVX512VL-NEXT:    retq2112;2113; X86-AVX1-LABEL: splatconstant_shift_v4i64:2114; X86-AVX1:       # %bb.0:2115; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm12116; X86-AVX1-NEXT:    vpsrad $7, %xmm1, %xmm22117; X86-AVX1-NEXT:    vpsrlq $7, %xmm1, %xmm12118; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]2119; X86-AVX1-NEXT:    vpsrad $7, %xmm0, %xmm22120; X86-AVX1-NEXT:    vpsrlq $7, %xmm0, %xmm02121; X86-AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]2122; X86-AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm02123; X86-AVX1-NEXT:    retl2124;2125; X86-AVX2-LABEL: splatconstant_shift_v4i64:2126; X86-AVX2:       # %bb.0:2127; X86-AVX2-NEXT:    vpsrad $7, %ymm0, %ymm12128; X86-AVX2-NEXT:    vpsrlq $7, %ymm0, %ymm02129; X86-AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]2130; X86-AVX2-NEXT:    retl2131  %shift = ashr <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>2132  ret <4 x i64> %shift2133}2134 2135define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind {2136; AVX1-LABEL: splatconstant_shift_v8i32:2137; AVX1:       # %bb.0:2138; AVX1-NEXT:    vpsrad $5, %xmm0, %xmm12139; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm02140; AVX1-NEXT:    vpsrad $5, %xmm0, %xmm02141; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm02142; AVX1-NEXT:    retq2143;2144; AVX2-LABEL: splatconstant_shift_v8i32:2145; AVX2:       # %bb.0:2146; AVX2-NEXT:    vpsrad $5, %ymm0, %ymm02147; AVX2-NEXT:    retq2148;2149; XOPAVX1-LABEL: splatconstant_shift_v8i32:2150; XOPAVX1:       # %bb.0:2151; XOPAVX1-NEXT:    vpsrad $5, %xmm0, %xmm12152; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm02153; XOPAVX1-NEXT:    vpsrad $5, %xmm0, %xmm02154; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm02155; XOPAVX1-NEXT:    retq2156;2157; XOPAVX2-LABEL: splatconstant_shift_v8i32:2158; XOPAVX2:       # %bb.0:2159; XOPAVX2-NEXT:    vpsrad $5, %ymm0, %ymm02160; XOPAVX2-NEXT:    retq2161;2162; AVX512-LABEL: splatconstant_shift_v8i32:2163; AVX512:       # %bb.0:2164; AVX512-NEXT:    vpsrad $5, %ymm0, %ymm02165; AVX512-NEXT:    retq2166;2167; AVX512VL-LABEL: splatconstant_shift_v8i32:2168; AVX512VL:       # %bb.0:2169; AVX512VL-NEXT:    vpsrad $5, %ymm0, %ymm02170; AVX512VL-NEXT:    retq2171;2172; X86-AVX1-LABEL: splatconstant_shift_v8i32:2173; X86-AVX1:       # %bb.0:2174; X86-AVX1-NEXT:    vpsrad $5, %xmm0, %xmm12175; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm02176; X86-AVX1-NEXT:    vpsrad $5, %xmm0, %xmm02177; X86-AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm02178; X86-AVX1-NEXT:    retl2179;2180; X86-AVX2-LABEL: splatconstant_shift_v8i32:2181; X86-AVX2:       # %bb.0:2182; X86-AVX2-NEXT:    vpsrad $5, %ymm0, %ymm02183; X86-AVX2-NEXT:    retl2184  %shift = ashr <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>2185  ret <8 x i32> %shift2186}2187 2188define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind {2189; AVX1-LABEL: splatconstant_shift_v16i16:2190; AVX1:       # %bb.0:2191; AVX1-NEXT:    vpsraw $3, %xmm0, %xmm12192; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm02193; AVX1-NEXT:    vpsraw $3, %xmm0, %xmm02194; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm02195; AVX1-NEXT:    retq2196;2197; AVX2-LABEL: splatconstant_shift_v16i16:2198; AVX2:       # %bb.0:2199; AVX2-NEXT:    vpsraw $3, %ymm0, %ymm02200; AVX2-NEXT:    retq2201;2202; XOPAVX1-LABEL: splatconstant_shift_v16i16:2203; XOPAVX1:       # %bb.0:2204; XOPAVX1-NEXT:    vpsraw $3, %xmm0, %xmm12205; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm02206; XOPAVX1-NEXT:    vpsraw $3, %xmm0, %xmm02207; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm02208; XOPAVX1-NEXT:    retq2209;2210; XOPAVX2-LABEL: splatconstant_shift_v16i16:2211; XOPAVX2:       # %bb.0:2212; XOPAVX2-NEXT:    vpsraw $3, %ymm0, %ymm02213; XOPAVX2-NEXT:    retq2214;2215; AVX512-LABEL: splatconstant_shift_v16i16:2216; AVX512:       # %bb.0:2217; AVX512-NEXT:    vpsraw $3, %ymm0, %ymm02218; AVX512-NEXT:    retq2219;2220; AVX512VL-LABEL: splatconstant_shift_v16i16:2221; AVX512VL:       # %bb.0:2222; AVX512VL-NEXT:    vpsraw $3, %ymm0, %ymm02223; AVX512VL-NEXT:    retq2224;2225; X86-AVX1-LABEL: splatconstant_shift_v16i16:2226; X86-AVX1:       # %bb.0:2227; X86-AVX1-NEXT:    vpsraw $3, %xmm0, %xmm12228; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm02229; X86-AVX1-NEXT:    vpsraw $3, %xmm0, %xmm02230; X86-AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm02231; X86-AVX1-NEXT:    retl2232;2233; X86-AVX2-LABEL: splatconstant_shift_v16i16:2234; X86-AVX2:       # %bb.0:2235; X86-AVX2-NEXT:    vpsraw $3, %ymm0, %ymm02236; X86-AVX2-NEXT:    retl2237  %shift = ashr <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>2238  ret <16 x i16> %shift2239}2240 2241define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind {2242; AVX1-LABEL: splatconstant_shift_v32i8:2243; AVX1:       # %bb.0:2244; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm12245; AVX1-NEXT:    vpsrlw $3, %xmm1, %xmm12246; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31]2247; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm12248; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2249; AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm12250; AVX1-NEXT:    vpsubb %xmm3, %xmm1, %xmm12251; AVX1-NEXT:    vpsrlw $3, %xmm0, %xmm02252; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm02253; AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm02254; AVX1-NEXT:    vpsubb %xmm3, %xmm0, %xmm02255; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm02256; AVX1-NEXT:    retq2257;2258; AVX2-LABEL: splatconstant_shift_v32i8:2259; AVX2:       # %bb.0:2260; AVX2-NEXT:    vpsrlw $3, %ymm0, %ymm02261; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02262; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2263; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm02264; AVX2-NEXT:    vpsubb %ymm1, %ymm0, %ymm02265; AVX2-NEXT:    retq2266;2267; XOPAVX1-LABEL: splatconstant_shift_v32i8:2268; XOPAVX1:       # %bb.0:2269; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm12270; XOPAVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253]2271; XOPAVX1-NEXT:    vpshab %xmm2, %xmm1, %xmm12272; XOPAVX1-NEXT:    vpshab %xmm2, %xmm0, %xmm02273; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm02274; XOPAVX1-NEXT:    retq2275;2276; XOPAVX2-LABEL: splatconstant_shift_v32i8:2277; XOPAVX2:       # %bb.0:2278; XOPAVX2-NEXT:    vpsrlw $3, %ymm0, %ymm02279; XOPAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02280; XOPAVX2-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2281; XOPAVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm02282; XOPAVX2-NEXT:    vpsubb %ymm1, %ymm0, %ymm02283; XOPAVX2-NEXT:    retq2284;2285; AVX512-LABEL: splatconstant_shift_v32i8:2286; AVX512:       # %bb.0:2287; AVX512-NEXT:    vpsrlw $3, %ymm0, %ymm02288; AVX512-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm02289; AVX512-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2290; AVX512-NEXT:    vpxor %ymm1, %ymm0, %ymm02291; AVX512-NEXT:    vpsubb %ymm1, %ymm0, %ymm02292; AVX512-NEXT:    retq2293;2294; AVX512DQVL-LABEL: splatconstant_shift_v32i8:2295; AVX512DQVL:       # %bb.0:2296; AVX512DQVL-NEXT:    vpsrlw $3, %ymm0, %ymm02297; AVX512DQVL-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2298; AVX512DQVL-NEXT:    vpternlogd {{.*#+}} ymm0 = ymm1 ^ (ymm0 & m32bcst)2299; AVX512DQVL-NEXT:    vpsubb %ymm1, %ymm0, %ymm02300; AVX512DQVL-NEXT:    retq2301;2302; AVX512BWVL-LABEL: splatconstant_shift_v32i8:2303; AVX512BWVL:       # %bb.0:2304; AVX512BWVL-NEXT:    vpsrlw $3, %ymm0, %ymm02305; AVX512BWVL-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2306; AVX512BWVL-NEXT:    vpternlogd {{.*#+}} ymm0 = ymm1 ^ (ymm0 & m32bcst)2307; AVX512BWVL-NEXT:    vpsubb %ymm1, %ymm0, %ymm02308; AVX512BWVL-NEXT:    retq2309;2310; X86-AVX1-LABEL: splatconstant_shift_v32i8:2311; X86-AVX1:       # %bb.0:2312; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm12313; X86-AVX1-NEXT:    vpsrlw $3, %xmm1, %xmm12314; X86-AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31]2315; X86-AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm12316; X86-AVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2317; X86-AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm12318; X86-AVX1-NEXT:    vpsubb %xmm3, %xmm1, %xmm12319; X86-AVX1-NEXT:    vpsrlw $3, %xmm0, %xmm02320; X86-AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm02321; X86-AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm02322; X86-AVX1-NEXT:    vpsubb %xmm3, %xmm0, %xmm02323; X86-AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm02324; X86-AVX1-NEXT:    retl2325;2326; X86-AVX2-LABEL: splatconstant_shift_v32i8:2327; X86-AVX2:       # %bb.0:2328; X86-AVX2-NEXT:    vpsrlw $3, %ymm0, %ymm02329; X86-AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm02330; X86-AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]2331; X86-AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm02332; X86-AVX2-NEXT:    vpsubb %ymm1, %ymm0, %ymm02333; X86-AVX2-NEXT:    retl2334  %shift = ashr <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>2335  ret <32 x i8> %shift2336}2337 2338;2339; Special Cases2340;2341 2342define <4 x i64> @shift32_v4i64(<4 x i64> %a) nounwind {2343; AVX1-LABEL: shift32_v4i64:2344; AVX1:       # %bb.0:2345; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm12346; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm22347; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm22348; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm12349; AVX1-NEXT:    vmovshdup {{.*#+}} ymm0 = ymm0[1,1,3,3,5,5,7,7]2350; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]2351; AVX1-NEXT:    retq2352;2353; AVX2-LABEL: shift32_v4i64:2354; AVX2:       # %bb.0:2355; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm12356; AVX2-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[1,1,3,3,5,5,7,7]2357; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]2358; AVX2-NEXT:    retq2359;2360; XOPAVX1-LABEL: shift32_v4i64:2361; XOPAVX1:       # %bb.0:2362; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm12363; XOPAVX1-NEXT:    vpmovsxbq {{.*#+}} xmm2 = [18446744073709551584,18446744073709551584]2364; XOPAVX1-NEXT:    vpshaq %xmm2, %xmm1, %xmm12365; XOPAVX1-NEXT:    vpshaq %xmm2, %xmm0, %xmm02366; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm02367; XOPAVX1-NEXT:    retq2368;2369; XOPAVX2-LABEL: shift32_v4i64:2370; XOPAVX2:       # %bb.0:2371; XOPAVX2-NEXT:    vpsrad $31, %ymm0, %ymm12372; XOPAVX2-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[1,1,3,3,5,5,7,7]2373; XOPAVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]2374; XOPAVX2-NEXT:    retq2375;2376; AVX512-LABEL: shift32_v4i64:2377; AVX512:       # %bb.0:2378; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm02379; AVX512-NEXT:    vpsraq $32, %zmm0, %zmm02380; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm02381; AVX512-NEXT:    retq2382;2383; AVX512VL-LABEL: shift32_v4i64:2384; AVX512VL:       # %bb.0:2385; AVX512VL-NEXT:    vpsraq $32, %ymm0, %ymm02386; AVX512VL-NEXT:    retq2387;2388; X86-AVX1-LABEL: shift32_v4i64:2389; X86-AVX1:       # %bb.0:2390; X86-AVX1-NEXT:    vpsrad $31, %xmm0, %xmm12391; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm22392; X86-AVX1-NEXT:    vpsrad $31, %xmm2, %xmm22393; X86-AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm12394; X86-AVX1-NEXT:    vmovshdup {{.*#+}} ymm0 = ymm0[1,1,3,3,5,5,7,7]2395; X86-AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]2396; X86-AVX1-NEXT:    retl2397;2398; X86-AVX2-LABEL: shift32_v4i64:2399; X86-AVX2:       # %bb.0:2400; X86-AVX2-NEXT:    vpsrad $31, %ymm0, %ymm12401; X86-AVX2-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[1,1,3,3,5,5,7,7]2402; X86-AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]2403; X86-AVX2-NEXT:    retl2404  %shift = ashr <4 x i64> %a, <i64 32, i64 32, i64 32, i64 32>2405  ret <4 x i64> %shift2406}2407 2408define <4 x i64> @PR52719(<4 x i64> %a0, i32 %a1) {2409; AVX1-LABEL: PR52719:2410; AVX1:       # %bb.0:2411; AVX1-NEXT:    vmovd %edi, %xmm12412; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]2413; AVX1-NEXT:    # xmm2 = mem[0,0]2414; AVX1-NEXT:    vpsrlq %xmm1, %xmm2, %xmm22415; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm32416; AVX1-NEXT:    vpsrlq %xmm1, %xmm3, %xmm32417; AVX1-NEXT:    vpxor %xmm2, %xmm3, %xmm32418; AVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm32419; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm02420; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm02421; AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm02422; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm02423; AVX1-NEXT:    retq2424;2425; AVX2-LABEL: PR52719:2426; AVX2:       # %bb.0:2427; AVX2-NEXT:    vmovd %edi, %xmm12428; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]2429; AVX2-NEXT:    vpsrlq %xmm1, %ymm2, %ymm22430; AVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm02431; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm02432; AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm02433; AVX2-NEXT:    retq2434;2435; XOPAVX1-LABEL: PR52719:2436; XOPAVX1:       # %bb.0:2437; XOPAVX1-NEXT:    vmovd %edi, %xmm12438; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]2439; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm22440; XOPAVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]2441; XOPAVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero2442; XOPAVX1-NEXT:    vpsubq %xmm3, %xmm2, %xmm32443; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm42444; XOPAVX1-NEXT:    vpshaq %xmm3, %xmm4, %xmm32445; XOPAVX1-NEXT:    vpsubq %xmm1, %xmm2, %xmm12446; XOPAVX1-NEXT:    vpshaq %xmm1, %xmm0, %xmm02447; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm02448; XOPAVX1-NEXT:    retq2449;2450; XOPAVX2-LABEL: PR52719:2451; XOPAVX2:       # %bb.0:2452; XOPAVX2-NEXT:    vmovd %edi, %xmm12453; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]2454; XOPAVX2-NEXT:    vpsrlq %xmm1, %ymm2, %ymm22455; XOPAVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm02456; XOPAVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm02457; XOPAVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm02458; XOPAVX2-NEXT:    retq2459;2460; AVX512-LABEL: PR52719:2461; AVX512:       # %bb.0:2462; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm02463; AVX512-NEXT:    vmovd %edi, %xmm12464; AVX512-NEXT:    vpsraq %xmm1, %zmm0, %zmm02465; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm02466; AVX512-NEXT:    retq2467;2468; AVX512VL-LABEL: PR52719:2469; AVX512VL:       # %bb.0:2470; AVX512VL-NEXT:    vmovd %edi, %xmm12471; AVX512VL-NEXT:    vpsraq %xmm1, %ymm0, %ymm02472; AVX512VL-NEXT:    retq2473;2474; X86-AVX1-LABEL: PR52719:2475; X86-AVX1:       # %bb.0:2476; X86-AVX1-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero2477; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [0,2147483648,0,2147483648]2478; X86-AVX1-NEXT:    # xmm2 = mem[0,0]2479; X86-AVX1-NEXT:    vpsrlq %xmm1, %xmm2, %xmm22480; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm32481; X86-AVX1-NEXT:    vpsrlq %xmm1, %xmm3, %xmm32482; X86-AVX1-NEXT:    vpxor %xmm2, %xmm3, %xmm32483; X86-AVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm32484; X86-AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm02485; X86-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm02486; X86-AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm02487; X86-AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm02488; X86-AVX1-NEXT:    retl2489;2490; X86-AVX2-LABEL: PR52719:2491; X86-AVX2:       # %bb.0:2492; X86-AVX2-NEXT:    vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero2493; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648]2494; X86-AVX2-NEXT:    vpsrlq %xmm1, %ymm2, %ymm22495; X86-AVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm02496; X86-AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm02497; X86-AVX2-NEXT:    vpsubq %ymm2, %ymm0, %ymm02498; X86-AVX2-NEXT:    retl2499  %vec = insertelement <4 x i32> poison, i32 %a1, i64 02500  %splat = shufflevector <4 x i32> %vec, <4 x i32> poison, <4 x i32> zeroinitializer2501  %zext = zext <4 x i32> %splat to <4 x i64>2502  %ashr = ashr <4 x i64> %a0, %zext2503  ret <4 x i64> %ashr2504}2505