812 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=AVX2 --check-prefix=AVX2NOBW4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=AVX2 --check-prefix=AVX512BW5 6;7; udiv by 78;9 10define <4 x i64> @test_div7_4i64(<4 x i64> %a) nounwind {11; AVX1-LABEL: test_div7_4i64:12; AVX1: # %bb.0:13; AVX1-NEXT: vpextrq $1, %xmm0, %rcx14; AVX1-NEXT: movabsq $2635249153387078803, %rsi # imm = 0x249249249249249315; AVX1-NEXT: movq %rcx, %rax16; AVX1-NEXT: mulq %rsi17; AVX1-NEXT: subq %rdx, %rcx18; AVX1-NEXT: shrq %rcx19; AVX1-NEXT: addq %rdx, %rcx20; AVX1-NEXT: vmovq %rcx, %xmm121; AVX1-NEXT: vmovq %xmm0, %rcx22; AVX1-NEXT: movq %rcx, %rax23; AVX1-NEXT: mulq %rsi24; AVX1-NEXT: subq %rdx, %rcx25; AVX1-NEXT: shrq %rcx26; AVX1-NEXT: addq %rdx, %rcx27; AVX1-NEXT: vmovq %rcx, %xmm228; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]29; AVX1-NEXT: vpsrlq $2, %xmm1, %xmm130; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm031; AVX1-NEXT: vpextrq $1, %xmm0, %rcx32; AVX1-NEXT: movq %rcx, %rax33; AVX1-NEXT: mulq %rsi34; AVX1-NEXT: subq %rdx, %rcx35; AVX1-NEXT: shrq %rcx36; AVX1-NEXT: addq %rdx, %rcx37; AVX1-NEXT: vmovq %rcx, %xmm238; AVX1-NEXT: vmovq %xmm0, %rcx39; AVX1-NEXT: movq %rcx, %rax40; AVX1-NEXT: mulq %rsi41; AVX1-NEXT: subq %rdx, %rcx42; AVX1-NEXT: shrq %rcx43; AVX1-NEXT: addq %rdx, %rcx44; AVX1-NEXT: vmovq %rcx, %xmm045; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]46; AVX1-NEXT: vpsrlq $2, %xmm0, %xmm047; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm048; AVX1-NEXT: retq49;50; AVX2-LABEL: test_div7_4i64:51; AVX2: # %bb.0:52; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm153; AVX2-NEXT: vpextrq $1, %xmm1, %rcx54; AVX2-NEXT: movabsq $2635249153387078803, %rsi # imm = 0x249249249249249355; AVX2-NEXT: movq %rcx, %rax56; AVX2-NEXT: mulq %rsi57; AVX2-NEXT: subq %rdx, %rcx58; AVX2-NEXT: shrq %rcx59; AVX2-NEXT: addq %rdx, %rcx60; AVX2-NEXT: vmovq %rcx, %xmm261; AVX2-NEXT: vmovq %xmm1, %rcx62; AVX2-NEXT: movq %rcx, %rax63; AVX2-NEXT: mulq %rsi64; AVX2-NEXT: subq %rdx, %rcx65; AVX2-NEXT: shrq %rcx66; AVX2-NEXT: addq %rdx, %rcx67; AVX2-NEXT: vmovq %rcx, %xmm168; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]69; AVX2-NEXT: vpextrq $1, %xmm0, %rcx70; AVX2-NEXT: movq %rcx, %rax71; AVX2-NEXT: mulq %rsi72; AVX2-NEXT: subq %rdx, %rcx73; AVX2-NEXT: shrq %rcx74; AVX2-NEXT: addq %rdx, %rcx75; AVX2-NEXT: vmovq %rcx, %xmm276; AVX2-NEXT: vmovq %xmm0, %rcx77; AVX2-NEXT: movq %rcx, %rax78; AVX2-NEXT: mulq %rsi79; AVX2-NEXT: subq %rdx, %rcx80; AVX2-NEXT: shrq %rcx81; AVX2-NEXT: addq %rdx, %rcx82; AVX2-NEXT: vmovq %rcx, %xmm083; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]84; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm085; AVX2-NEXT: vpsrlq $2, %ymm0, %ymm086; AVX2-NEXT: retq87 %res = udiv <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>88 ret <4 x i64> %res89}90 91define <8 x i32> @test_div7_8i32(<8 x i32> %a) nounwind {92; AVX1-LABEL: test_div7_8i32:93; AVX1: # %bb.0:94; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]95; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]96; AVX1-NEXT: vpmuludq %xmm2, %xmm1, %xmm197; AVX1-NEXT: vpmuludq %xmm2, %xmm0, %xmm398; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]99; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm3[0,1],xmm1[2,3],xmm3[4,5],xmm1[6,7]100; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm3101; AVX1-NEXT: vpsrld $1, %xmm3, %xmm3102; AVX1-NEXT: vpaddd %xmm1, %xmm3, %xmm1103; AVX1-NEXT: vpsrld $2, %xmm1, %xmm1104; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0105; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]106; AVX1-NEXT: vpmuludq %xmm2, %xmm3, %xmm3107; AVX1-NEXT: vpmuludq %xmm2, %xmm0, %xmm2108; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]109; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]110; AVX1-NEXT: vpsubd %xmm2, %xmm0, %xmm0111; AVX1-NEXT: vpsrld $1, %xmm0, %xmm0112; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm0113; AVX1-NEXT: vpsrld $2, %xmm0, %xmm0114; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0115; AVX1-NEXT: retq116;117; AVX2-LABEL: test_div7_8i32:118; AVX2: # %bb.0:119; AVX2-NEXT: vpshufd {{.*#+}} ymm1 = ymm0[1,1,3,3,5,5,7,7]120; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [613566757,613566757,613566757,613566757,613566757,613566757,613566757,613566757]121; AVX2-NEXT: vpmuludq %ymm2, %ymm1, %ymm1122; AVX2-NEXT: vpmuludq %ymm2, %ymm0, %ymm2123; AVX2-NEXT: vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7]124; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0],ymm1[1],ymm2[2],ymm1[3],ymm2[4],ymm1[5],ymm2[6],ymm1[7]125; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm0126; AVX2-NEXT: vpsrld $1, %ymm0, %ymm0127; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0128; AVX2-NEXT: vpsrld $2, %ymm0, %ymm0129; AVX2-NEXT: retq130 %res = udiv <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>131 ret <8 x i32> %res132}133 134define <16 x i16> @test_div7_16i16(<16 x i16> %a) nounwind {135; AVX1-LABEL: test_div7_16i16:136; AVX1: # %bb.0:137; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [9363,9363,9363,9363,9363,9363,9363,9363]138; AVX1-NEXT: vpmulhuw %xmm1, %xmm0, %xmm2139; AVX1-NEXT: vpsubw %xmm2, %xmm0, %xmm3140; AVX1-NEXT: vpsrlw $1, %xmm3, %xmm3141; AVX1-NEXT: vpaddw %xmm2, %xmm3, %xmm2142; AVX1-NEXT: vpsrlw $2, %xmm2, %xmm2143; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0144; AVX1-NEXT: vpmulhuw %xmm1, %xmm0, %xmm1145; AVX1-NEXT: vpsubw %xmm1, %xmm0, %xmm0146; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm0147; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm0148; AVX1-NEXT: vpsrlw $2, %xmm0, %xmm0149; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0150; AVX1-NEXT: retq151;152; AVX2-LABEL: test_div7_16i16:153; AVX2: # %bb.0:154; AVX2-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1 # [9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363]155; AVX2-NEXT: vpsubw %ymm1, %ymm0, %ymm0156; AVX2-NEXT: vpsrlw $1, %ymm0, %ymm0157; AVX2-NEXT: vpaddw %ymm1, %ymm0, %ymm0158; AVX2-NEXT: vpsrlw $2, %ymm0, %ymm0159; AVX2-NEXT: retq160 %res = udiv <16 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>161 ret <16 x i16> %res162}163 164define <32 x i8> @test_div7_32i8(<32 x i8> %a) nounwind {165; AVX1-LABEL: test_div7_32i8:166; AVX1: # %bb.0:167; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1168; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]169; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0]170; AVX1-NEXT: vpmullw %xmm3, %xmm2, %xmm2171; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2172; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm4 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero173; AVX1-NEXT: vpmullw %xmm3, %xmm4, %xmm4174; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4175; AVX1-NEXT: vpackuswb %xmm2, %xmm4, %xmm2176; AVX1-NEXT: vpsubb %xmm2, %xmm0, %xmm4177; AVX1-NEXT: vpsrlw $1, %xmm4, %xmm4178; AVX1-NEXT: vbroadcastss {{.*#+}} xmm5 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]179; AVX1-NEXT: vpand %xmm5, %xmm4, %xmm4180; AVX1-NEXT: vpaddb %xmm2, %xmm4, %xmm2181; AVX1-NEXT: vpsrlw $2, %xmm2, %xmm2182; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0183; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]184; AVX1-NEXT: vpmullw %xmm3, %xmm1, %xmm1185; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm1186; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm4 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero187; AVX1-NEXT: vpmullw %xmm3, %xmm4, %xmm3188; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3189; AVX1-NEXT: vpackuswb %xmm1, %xmm3, %xmm1190; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm0191; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm0192; AVX1-NEXT: vpand %xmm5, %xmm0, %xmm0193; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm0194; AVX1-NEXT: vpsrlw $2, %xmm0, %xmm0195; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0196; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0197; AVX1-NEXT: retq198;199; AVX2NOBW-LABEL: test_div7_32i8:200; AVX2NOBW: # %bb.0:201; AVX2NOBW-NEXT: vpxor %xmm1, %xmm1, %xmm1202; AVX2NOBW-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]203; AVX2NOBW-NEXT: vpbroadcastw {{.*#+}} ymm3 = [37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0]204; AVX2NOBW-NEXT: vpmullw %ymm3, %ymm2, %ymm2205; AVX2NOBW-NEXT: vpsrlw $8, %ymm2, %ymm2206; AVX2NOBW-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]207; AVX2NOBW-NEXT: vpmullw %ymm3, %ymm1, %ymm1208; AVX2NOBW-NEXT: vpsrlw $8, %ymm1, %ymm1209; AVX2NOBW-NEXT: vpackuswb %ymm2, %ymm1, %ymm1210; AVX2NOBW-NEXT: vpsubb %ymm1, %ymm0, %ymm0211; AVX2NOBW-NEXT: vpsrlw $1, %ymm0, %ymm0212; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0213; AVX2NOBW-NEXT: vpaddb %ymm1, %ymm0, %ymm0214; AVX2NOBW-NEXT: vpsrlw $2, %ymm0, %ymm0215; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0216; AVX2NOBW-NEXT: retq217;218; AVX512BW-LABEL: test_div7_32i8:219; AVX512BW: # %bb.0:220; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero221; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1 # [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37]222; AVX512BW-NEXT: vpsrlw $8, %zmm1, %zmm1223; AVX512BW-NEXT: vpmovwb %zmm1, %ymm1224; AVX512BW-NEXT: vpsubb %ymm1, %ymm0, %ymm0225; AVX512BW-NEXT: vpsrlw $1, %ymm0, %ymm0226; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0227; AVX512BW-NEXT: vpaddb %ymm1, %ymm0, %ymm0228; AVX512BW-NEXT: vpsrlw $2, %ymm0, %ymm0229; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0230; AVX512BW-NEXT: retq231 %res = udiv <32 x i8> %a, <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>232 ret <32 x i8> %res233}234 235;236; udiv by non-splat constant237;238 239define <32 x i8> @test_divconstant_32i8(<32 x i8> %a) nounwind {240; AVX1-LABEL: test_divconstant_32i8:241; AVX1: # %bb.0:242; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2243; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1244; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]245; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]246; AVX1-NEXT: vpsllw $7, %xmm4, %xmm4247; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0],xmm3[1,2,3,4,5,6,7]248; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3249; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [147,0,79,0,171,0,117,0,205,0,57,0,32,0,37,0]250; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3251; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm4 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]252; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm5 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero253; AVX1-NEXT: vpsllw $7, %xmm5, %xmm5254; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm5[0],xmm4[1,2,3,4,5,6,7]255; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4256; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4 # [187,0,135,0,205,0,27,0,57,0,241,0,16,0,137,0]257; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4258; AVX1-NEXT: vpackuswb %xmm3, %xmm4, %xmm3259; AVX1-NEXT: vpsubb %xmm3, %xmm2, %xmm2260; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]261; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4 # [0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0]262; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4263; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero264; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0]265; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2266; AVX1-NEXT: vpackuswb %xmm4, %xmm2, %xmm2267; AVX1-NEXT: vpaddb %xmm3, %xmm2, %xmm2268; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]269; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [64,64,32,32,32,128,256,64]270; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3271; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero272; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2 # [32,16,16,128,64,16,256,32]273; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2274; AVX1-NEXT: vpackuswb %xmm3, %xmm2, %xmm2275; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]276; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm4277; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,5,6],xmm4[7]278; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3279; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [137,0,16,0,241,0,57,0,27,0,205,0,135,0,187,0]280; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3281; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm4 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]282; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero283; AVX1-NEXT: vpsllw $7, %xmm5, %xmm5284; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,5,6],xmm5[7]285; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4286; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4 # [37,0,32,0,57,0,205,0,117,0,171,0,79,0,147,0]287; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4288; AVX1-NEXT: vpackuswb %xmm3, %xmm4, %xmm3289; AVX1-NEXT: vpsubb %xmm3, %xmm0, %xmm0290; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]291; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4 # [0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0]292; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4293; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero294; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0]295; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0296; AVX1-NEXT: vpackuswb %xmm4, %xmm0, %xmm0297; AVX1-NEXT: vpaddb %xmm3, %xmm0, %xmm0298; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]299; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [32,256,16,64,128,16,16,32]300; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm1301; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero302; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 # [64,256,128,32,32,32,64,64]303; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0304; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0305; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0306; AVX1-NEXT: retq307;308; AVX2NOBW-LABEL: test_divconstant_32i8:309; AVX2NOBW: # %bb.0:310; AVX2NOBW-NEXT: vpxor %xmm1, %xmm1, %xmm1311; AVX2NOBW-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]312; AVX2NOBW-NEXT: vmovdqa {{.*#+}} ymm3 = [256,256,256,256,256,256,256,128,128,256,256,256,256,256,256,256]313; AVX2NOBW-NEXT: vpmullw %ymm3, %ymm2, %ymm2314; AVX2NOBW-NEXT: vpsrlw $8, %ymm2, %ymm2315; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 # [137,0,16,0,241,0,57,0,27,0,205,0,135,0,187,0,147,0,79,0,171,0,117,0,205,0,57,0,32,0,37,0]316; AVX2NOBW-NEXT: vpsrlw $8, %ymm2, %ymm2317; AVX2NOBW-NEXT: vpunpcklbw {{.*#+}} ymm4 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]318; AVX2NOBW-NEXT: vpmullw %ymm3, %ymm4, %ymm3319; AVX2NOBW-NEXT: vpsrlw $8, %ymm3, %ymm3320; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [37,0,32,0,57,0,205,0,117,0,171,0,79,0,147,0,187,0,135,0,205,0,27,0,57,0,241,0,16,0,137,0]321; AVX2NOBW-NEXT: vpsrlw $8, %ymm3, %ymm3322; AVX2NOBW-NEXT: vpackuswb %ymm2, %ymm3, %ymm2323; AVX2NOBW-NEXT: vpsubb %ymm2, %ymm0, %ymm0324; AVX2NOBW-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]325; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0]326; AVX2NOBW-NEXT: vpsrlw $8, %ymm3, %ymm3327; AVX2NOBW-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]328; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0]329; AVX2NOBW-NEXT: vpsrlw $8, %ymm0, %ymm0330; AVX2NOBW-NEXT: vpackuswb %ymm3, %ymm0, %ymm0331; AVX2NOBW-NEXT: vpaddb %ymm2, %ymm0, %ymm0332; AVX2NOBW-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]333; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 # [32,256,16,64,128,16,16,32,64,64,32,32,32,128,256,64]334; AVX2NOBW-NEXT: vpsrlw $8, %ymm2, %ymm2335; AVX2NOBW-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]336; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [64,256,128,32,32,32,64,64,32,16,16,128,64,16,256,32]337; AVX2NOBW-NEXT: vpsrlw $8, %ymm0, %ymm0338; AVX2NOBW-NEXT: vpackuswb %ymm2, %ymm0, %ymm0339; AVX2NOBW-NEXT: retq340;341; AVX512BW-LABEL: test_divconstant_32i8:342; AVX512BW: # %bb.0:343; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero344; AVX512BW-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1345; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1 # [37,32,57,205,117,171,79,147,137,16,241,57,27,205,135,187,187,135,205,27,57,241,16,137,147,79,171,117,205,57,32,37]346; AVX512BW-NEXT: vpsrlw $8, %zmm1, %zmm1347; AVX512BW-NEXT: vpmovwb %zmm1, %ymm1348; AVX512BW-NEXT: vpsubb %ymm1, %ymm0, %ymm0349; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero350; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0 # [128,0,0,0,128,0,0,0,0,0,0,0,0,0,128,0,0,128,0,0,0,0,0,0,0,0,0,128,0,0,0,128]351; AVX512BW-NEXT: vpsrlw $8, %zmm0, %zmm0352; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0353; AVX512BW-NEXT: vpaddb %ymm1, %ymm0, %ymm0354; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero355; AVX512BW-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0356; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0357; AVX512BW-NEXT: retq358 %res = udiv <32 x i8> %a, <i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15, i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 22, i8 21, i8 20, i8 19, i8 18, i8 17, i8 16, i8 15, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8, i8 7>359 ret <32 x i8> %res360}361 362;363; urem by 7364;365 366define <4 x i64> @test_rem7_4i64(<4 x i64> %a) nounwind {367; AVX1-LABEL: test_rem7_4i64:368; AVX1: # %bb.0:369; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1370; AVX1-NEXT: vpextrq $1, %xmm1, %rcx371; AVX1-NEXT: movabsq $2635249153387078803, %rsi # imm = 0x2492492492492493372; AVX1-NEXT: movq %rcx, %rax373; AVX1-NEXT: mulq %rsi374; AVX1-NEXT: movq %rcx, %rax375; AVX1-NEXT: subq %rdx, %rax376; AVX1-NEXT: shrq %rax377; AVX1-NEXT: addq %rdx, %rax378; AVX1-NEXT: shrq $2, %rax379; AVX1-NEXT: leaq (,%rax,8), %rdx380; AVX1-NEXT: subq %rdx, %rax381; AVX1-NEXT: addq %rcx, %rax382; AVX1-NEXT: vmovq %rax, %xmm2383; AVX1-NEXT: vmovq %xmm1, %rcx384; AVX1-NEXT: movq %rcx, %rax385; AVX1-NEXT: mulq %rsi386; AVX1-NEXT: movq %rcx, %rax387; AVX1-NEXT: subq %rdx, %rax388; AVX1-NEXT: shrq %rax389; AVX1-NEXT: addq %rdx, %rax390; AVX1-NEXT: shrq $2, %rax391; AVX1-NEXT: leaq (,%rax,8), %rdx392; AVX1-NEXT: subq %rdx, %rax393; AVX1-NEXT: addq %rcx, %rax394; AVX1-NEXT: vmovq %rax, %xmm1395; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]396; AVX1-NEXT: vpextrq $1, %xmm0, %rcx397; AVX1-NEXT: movq %rcx, %rax398; AVX1-NEXT: mulq %rsi399; AVX1-NEXT: movq %rcx, %rax400; AVX1-NEXT: subq %rdx, %rax401; AVX1-NEXT: shrq %rax402; AVX1-NEXT: addq %rdx, %rax403; AVX1-NEXT: shrq $2, %rax404; AVX1-NEXT: leaq (,%rax,8), %rdx405; AVX1-NEXT: subq %rdx, %rax406; AVX1-NEXT: addq %rcx, %rax407; AVX1-NEXT: vmovq %rax, %xmm2408; AVX1-NEXT: vmovq %xmm0, %rcx409; AVX1-NEXT: movq %rcx, %rax410; AVX1-NEXT: mulq %rsi411; AVX1-NEXT: movq %rcx, %rax412; AVX1-NEXT: subq %rdx, %rax413; AVX1-NEXT: shrq %rax414; AVX1-NEXT: addq %rdx, %rax415; AVX1-NEXT: shrq $2, %rax416; AVX1-NEXT: leaq (,%rax,8), %rdx417; AVX1-NEXT: subq %rdx, %rax418; AVX1-NEXT: addq %rcx, %rax419; AVX1-NEXT: vmovq %rax, %xmm0420; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]421; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0422; AVX1-NEXT: retq423;424; AVX2-LABEL: test_rem7_4i64:425; AVX2: # %bb.0:426; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1427; AVX2-NEXT: vpextrq $1, %xmm1, %rcx428; AVX2-NEXT: movabsq $2635249153387078803, %rsi # imm = 0x2492492492492493429; AVX2-NEXT: movq %rcx, %rax430; AVX2-NEXT: mulq %rsi431; AVX2-NEXT: movq %rcx, %rax432; AVX2-NEXT: subq %rdx, %rax433; AVX2-NEXT: shrq %rax434; AVX2-NEXT: addq %rdx, %rax435; AVX2-NEXT: shrq $2, %rax436; AVX2-NEXT: leaq (,%rax,8), %rdx437; AVX2-NEXT: subq %rdx, %rax438; AVX2-NEXT: addq %rcx, %rax439; AVX2-NEXT: vmovq %rax, %xmm2440; AVX2-NEXT: vmovq %xmm1, %rcx441; AVX2-NEXT: movq %rcx, %rax442; AVX2-NEXT: mulq %rsi443; AVX2-NEXT: movq %rcx, %rax444; AVX2-NEXT: subq %rdx, %rax445; AVX2-NEXT: shrq %rax446; AVX2-NEXT: addq %rdx, %rax447; AVX2-NEXT: shrq $2, %rax448; AVX2-NEXT: leaq (,%rax,8), %rdx449; AVX2-NEXT: subq %rdx, %rax450; AVX2-NEXT: addq %rcx, %rax451; AVX2-NEXT: vmovq %rax, %xmm1452; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]453; AVX2-NEXT: vpextrq $1, %xmm0, %rcx454; AVX2-NEXT: movq %rcx, %rax455; AVX2-NEXT: mulq %rsi456; AVX2-NEXT: movq %rcx, %rax457; AVX2-NEXT: subq %rdx, %rax458; AVX2-NEXT: shrq %rax459; AVX2-NEXT: addq %rdx, %rax460; AVX2-NEXT: shrq $2, %rax461; AVX2-NEXT: leaq (,%rax,8), %rdx462; AVX2-NEXT: subq %rdx, %rax463; AVX2-NEXT: addq %rcx, %rax464; AVX2-NEXT: vmovq %rax, %xmm2465; AVX2-NEXT: vmovq %xmm0, %rcx466; AVX2-NEXT: movq %rcx, %rax467; AVX2-NEXT: mulq %rsi468; AVX2-NEXT: movq %rcx, %rax469; AVX2-NEXT: subq %rdx, %rax470; AVX2-NEXT: shrq %rax471; AVX2-NEXT: addq %rdx, %rax472; AVX2-NEXT: shrq $2, %rax473; AVX2-NEXT: leaq (,%rax,8), %rdx474; AVX2-NEXT: subq %rdx, %rax475; AVX2-NEXT: addq %rcx, %rax476; AVX2-NEXT: vmovq %rax, %xmm0477; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]478; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0479; AVX2-NEXT: retq480 %res = urem <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>481 ret <4 x i64> %res482}483 484define <8 x i32> @test_rem7_8i32(<8 x i32> %a) nounwind {485; AVX1-LABEL: test_rem7_8i32:486; AVX1: # %bb.0:487; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1488; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]489; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [613566757,613566757,613566757,613566757]490; AVX1-NEXT: vpmuludq %xmm3, %xmm2, %xmm2491; AVX1-NEXT: vpmuludq %xmm3, %xmm1, %xmm4492; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]493; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm4[0,1],xmm2[2,3],xmm4[4,5],xmm2[6,7]494; AVX1-NEXT: vpsubd %xmm2, %xmm1, %xmm4495; AVX1-NEXT: vpsrld $1, %xmm4, %xmm4496; AVX1-NEXT: vpaddd %xmm2, %xmm4, %xmm2497; AVX1-NEXT: vpsrld $2, %xmm2, %xmm2498; AVX1-NEXT: vpslld $3, %xmm2, %xmm4499; AVX1-NEXT: vpsubd %xmm4, %xmm2, %xmm2500; AVX1-NEXT: vpaddd %xmm2, %xmm1, %xmm1501; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]502; AVX1-NEXT: vpmuludq %xmm3, %xmm2, %xmm2503; AVX1-NEXT: vpmuludq %xmm3, %xmm0, %xmm3504; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]505; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]506; AVX1-NEXT: vpsubd %xmm2, %xmm0, %xmm3507; AVX1-NEXT: vpsrld $1, %xmm3, %xmm3508; AVX1-NEXT: vpaddd %xmm2, %xmm3, %xmm2509; AVX1-NEXT: vpsrld $2, %xmm2, %xmm2510; AVX1-NEXT: vpslld $3, %xmm2, %xmm3511; AVX1-NEXT: vpsubd %xmm3, %xmm2, %xmm2512; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm0513; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0514; AVX1-NEXT: retq515;516; AVX2-LABEL: test_rem7_8i32:517; AVX2: # %bb.0:518; AVX2-NEXT: vpshufd {{.*#+}} ymm1 = ymm0[1,1,3,3,5,5,7,7]519; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [613566757,613566757,613566757,613566757,613566757,613566757,613566757,613566757]520; AVX2-NEXT: vpmuludq %ymm2, %ymm1, %ymm1521; AVX2-NEXT: vpmuludq %ymm2, %ymm0, %ymm2522; AVX2-NEXT: vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7]523; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0],ymm1[1],ymm2[2],ymm1[3],ymm2[4],ymm1[5],ymm2[6],ymm1[7]524; AVX2-NEXT: vpsubd %ymm1, %ymm0, %ymm2525; AVX2-NEXT: vpsrld $1, %ymm2, %ymm2526; AVX2-NEXT: vpaddd %ymm1, %ymm2, %ymm1527; AVX2-NEXT: vpsrld $2, %ymm1, %ymm1528; AVX2-NEXT: vpslld $3, %ymm1, %ymm2529; AVX2-NEXT: vpsubd %ymm2, %ymm1, %ymm1530; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0531; AVX2-NEXT: retq532 %res = urem <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>533 ret <8 x i32> %res534}535 536define <16 x i16> @test_rem7_16i16(<16 x i16> %a) nounwind {537; AVX1-LABEL: test_rem7_16i16:538; AVX1: # %bb.0:539; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1540; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [9363,9363,9363,9363,9363,9363,9363,9363]541; AVX1-NEXT: vpmulhuw %xmm2, %xmm1, %xmm3542; AVX1-NEXT: vpsubw %xmm3, %xmm1, %xmm4543; AVX1-NEXT: vpsrlw $1, %xmm4, %xmm4544; AVX1-NEXT: vpaddw %xmm3, %xmm4, %xmm3545; AVX1-NEXT: vpsrlw $2, %xmm3, %xmm3546; AVX1-NEXT: vpsllw $3, %xmm3, %xmm4547; AVX1-NEXT: vpsubw %xmm4, %xmm3, %xmm3548; AVX1-NEXT: vpaddw %xmm3, %xmm1, %xmm1549; AVX1-NEXT: vpmulhuw %xmm2, %xmm0, %xmm2550; AVX1-NEXT: vpsubw %xmm2, %xmm0, %xmm3551; AVX1-NEXT: vpsrlw $1, %xmm3, %xmm3552; AVX1-NEXT: vpaddw %xmm2, %xmm3, %xmm2553; AVX1-NEXT: vpsrlw $2, %xmm2, %xmm2554; AVX1-NEXT: vpsllw $3, %xmm2, %xmm3555; AVX1-NEXT: vpsubw %xmm3, %xmm2, %xmm2556; AVX1-NEXT: vpaddw %xmm2, %xmm0, %xmm0557; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0558; AVX1-NEXT: retq559;560; AVX2-LABEL: test_rem7_16i16:561; AVX2: # %bb.0:562; AVX2-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1 # [9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363]563; AVX2-NEXT: vpsubw %ymm1, %ymm0, %ymm2564; AVX2-NEXT: vpsrlw $1, %ymm2, %ymm2565; AVX2-NEXT: vpaddw %ymm1, %ymm2, %ymm1566; AVX2-NEXT: vpsrlw $2, %ymm1, %ymm1567; AVX2-NEXT: vpsllw $3, %ymm1, %ymm2568; AVX2-NEXT: vpsubw %ymm2, %ymm1, %ymm1569; AVX2-NEXT: vpaddw %ymm1, %ymm0, %ymm0570; AVX2-NEXT: retq571 %res = urem <16 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>572 ret <16 x i16> %res573}574 575define <32 x i8> @test_rem7_32i8(<32 x i8> %a) nounwind {576; AVX1-LABEL: test_rem7_32i8:577; AVX1: # %bb.0:578; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1579; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2580; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]581; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0]582; AVX1-NEXT: vpmullw %xmm4, %xmm3, %xmm3583; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3584; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm5 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero585; AVX1-NEXT: vpmullw %xmm4, %xmm5, %xmm5586; AVX1-NEXT: vpsrlw $8, %xmm5, %xmm5587; AVX1-NEXT: vpackuswb %xmm3, %xmm5, %xmm3588; AVX1-NEXT: vpsubb %xmm3, %xmm1, %xmm5589; AVX1-NEXT: vpsrlw $1, %xmm5, %xmm5590; AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]591; AVX1-NEXT: vpand %xmm6, %xmm5, %xmm5592; AVX1-NEXT: vpaddb %xmm3, %xmm5, %xmm3593; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm5594; AVX1-NEXT: vbroadcastss {{.*#+}} xmm7 = [248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248]595; AVX1-NEXT: vpand %xmm7, %xmm5, %xmm5596; AVX1-NEXT: vpsrlw $2, %xmm3, %xmm3597; AVX1-NEXT: vbroadcastss {{.*#+}} xmm8 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]598; AVX1-NEXT: vpand %xmm3, %xmm8, %xmm3599; AVX1-NEXT: vpsubb %xmm5, %xmm3, %xmm3600; AVX1-NEXT: vpaddb %xmm3, %xmm1, %xmm1601; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8],xmm2[8],xmm0[9],xmm2[9],xmm0[10],xmm2[10],xmm0[11],xmm2[11],xmm0[12],xmm2[12],xmm0[13],xmm2[13],xmm0[14],xmm2[14],xmm0[15],xmm2[15]602; AVX1-NEXT: vpmullw %xmm4, %xmm2, %xmm2603; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2604; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero605; AVX1-NEXT: vpmullw %xmm4, %xmm3, %xmm3606; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3607; AVX1-NEXT: vpackuswb %xmm2, %xmm3, %xmm2608; AVX1-NEXT: vpsubb %xmm2, %xmm0, %xmm3609; AVX1-NEXT: vpsrlw $1, %xmm3, %xmm3610; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3611; AVX1-NEXT: vpaddb %xmm2, %xmm3, %xmm2612; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm3613; AVX1-NEXT: vpand %xmm7, %xmm3, %xmm3614; AVX1-NEXT: vpsrlw $2, %xmm2, %xmm2615; AVX1-NEXT: vpand %xmm2, %xmm8, %xmm2616; AVX1-NEXT: vpsubb %xmm3, %xmm2, %xmm2617; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0618; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0619; AVX1-NEXT: retq620;621; AVX2NOBW-LABEL: test_rem7_32i8:622; AVX2NOBW: # %bb.0:623; AVX2NOBW-NEXT: vpxor %xmm1, %xmm1, %xmm1624; AVX2NOBW-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]625; AVX2NOBW-NEXT: vpbroadcastw {{.*#+}} ymm3 = [37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0,37,0]626; AVX2NOBW-NEXT: vpmullw %ymm3, %ymm2, %ymm2627; AVX2NOBW-NEXT: vpsrlw $8, %ymm2, %ymm2628; AVX2NOBW-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]629; AVX2NOBW-NEXT: vpmullw %ymm3, %ymm1, %ymm1630; AVX2NOBW-NEXT: vpsrlw $8, %ymm1, %ymm1631; AVX2NOBW-NEXT: vpackuswb %ymm2, %ymm1, %ymm1632; AVX2NOBW-NEXT: vpsubb %ymm1, %ymm0, %ymm2633; AVX2NOBW-NEXT: vpsrlw $1, %ymm2, %ymm2634; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2635; AVX2NOBW-NEXT: vpaddb %ymm1, %ymm2, %ymm1636; AVX2NOBW-NEXT: vpaddw %ymm1, %ymm1, %ymm2637; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2638; AVX2NOBW-NEXT: vpsrlw $2, %ymm1, %ymm1639; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1640; AVX2NOBW-NEXT: vpsubb %ymm2, %ymm1, %ymm1641; AVX2NOBW-NEXT: vpaddb %ymm1, %ymm0, %ymm0642; AVX2NOBW-NEXT: retq643;644; AVX512BW-LABEL: test_rem7_32i8:645; AVX512BW: # %bb.0:646; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero647; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1 # [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37]648; AVX512BW-NEXT: vpsrlw $8, %zmm1, %zmm1649; AVX512BW-NEXT: vpmovwb %zmm1, %ymm1650; AVX512BW-NEXT: vpsubb %ymm1, %ymm0, %ymm2651; AVX512BW-NEXT: vpsrlw $1, %ymm2, %ymm2652; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2653; AVX512BW-NEXT: vpaddb %ymm1, %ymm2, %ymm1654; AVX512BW-NEXT: vpaddw %ymm1, %ymm1, %ymm2655; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2656; AVX512BW-NEXT: vpsrlw $2, %ymm1, %ymm1657; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1658; AVX512BW-NEXT: vpsubb %ymm2, %ymm1, %ymm1659; AVX512BW-NEXT: vpaddb %ymm1, %ymm0, %ymm0660; AVX512BW-NEXT: retq661 %res = urem <32 x i8> %a, <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>662 ret <32 x i8> %res663}664 665;666; urem by non-splat constant667;668 669define <32 x i8> @test_remconstant_32i8(<32 x i8> %a) nounwind {670; AVX1-LABEL: test_remconstant_32i8:671; AVX1: # %bb.0:672; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2673; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1674; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]675; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]676; AVX1-NEXT: vpsllw $7, %xmm4, %xmm4677; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0],xmm3[1,2,3,4,5,6,7]678; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3679; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [147,0,79,0,171,0,117,0,205,0,57,0,32,0,37,0]680; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3681; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm4 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]682; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm5 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero683; AVX1-NEXT: vpsllw $7, %xmm5, %xmm5684; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm5[0],xmm4[1,2,3,4,5,6,7]685; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4686; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4 # [187,0,135,0,205,0,27,0,57,0,241,0,16,0,137,0]687; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4688; AVX1-NEXT: vpackuswb %xmm3, %xmm4, %xmm3689; AVX1-NEXT: vpsubb %xmm3, %xmm2, %xmm4690; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm4[8],xmm1[8],xmm4[9],xmm1[9],xmm4[10],xmm1[10],xmm4[11],xmm1[11],xmm4[12],xmm1[12],xmm4[13],xmm1[13],xmm4[14],xmm1[14],xmm4[15],xmm1[15]691; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5, %xmm5 # [0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0]692; AVX1-NEXT: vpsrlw $8, %xmm5, %xmm5693; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero694; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4 # [0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0]695; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4696; AVX1-NEXT: vpackuswb %xmm5, %xmm4, %xmm4697; AVX1-NEXT: vpaddb %xmm3, %xmm4, %xmm3698; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]699; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4 # [64,64,32,32,32,128,256,64]700; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4701; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero702; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3 # [32,16,16,128,64,16,256,32]703; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3704; AVX1-NEXT: vpackuswb %xmm4, %xmm3, %xmm4705; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm5 # [22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7]706; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]707; AVX1-NEXT: vpand %xmm3, %xmm5, %xmm5708; AVX1-NEXT: vpmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4 # [0,21,0,19,0,17,0,15,0,13,0,11,0,9,0,7]709; AVX1-NEXT: vpsllw $8, %xmm4, %xmm4710; AVX1-NEXT: vpor %xmm4, %xmm5, %xmm4711; AVX1-NEXT: vpsubb %xmm4, %xmm2, %xmm2712; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]713; AVX1-NEXT: vpsrlw $1, %xmm0, %xmm5714; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,5,6],xmm5[7]715; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4716; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4 # [137,0,16,0,241,0,57,0,27,0,205,0,135,0,187,0]717; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4718; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm5 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]719; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm6 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero720; AVX1-NEXT: vpsllw $7, %xmm6, %xmm6721; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm5[0,1,2,3,4,5,6],xmm6[7]722; AVX1-NEXT: vpsrlw $8, %xmm5, %xmm5723; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5, %xmm5 # [37,0,32,0,57,0,205,0,117,0,171,0,79,0,147,0]724; AVX1-NEXT: vpsrlw $8, %xmm5, %xmm5725; AVX1-NEXT: vpackuswb %xmm4, %xmm5, %xmm4726; AVX1-NEXT: vpsubb %xmm4, %xmm0, %xmm5727; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm6 = xmm5[8],xmm1[8],xmm5[9],xmm1[9],xmm5[10],xmm1[10],xmm5[11],xmm1[11],xmm5[12],xmm1[12],xmm5[13],xmm1[13],xmm5[14],xmm1[14],xmm5[15],xmm1[15]728; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6, %xmm6 # [0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0]729; AVX1-NEXT: vpsrlw $8, %xmm6, %xmm6730; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero731; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5, %xmm5 # [128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0]732; AVX1-NEXT: vpsrlw $8, %xmm5, %xmm5733; AVX1-NEXT: vpackuswb %xmm6, %xmm5, %xmm5734; AVX1-NEXT: vpaddb %xmm4, %xmm5, %xmm4735; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm4[8],xmm1[8],xmm4[9],xmm1[9],xmm4[10],xmm1[10],xmm4[11],xmm1[11],xmm4[12],xmm1[12],xmm4[13],xmm1[13],xmm4[14],xmm1[14],xmm4[15],xmm1[15]736; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [32,256,16,64,128,16,16,32]737; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm1738; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero739; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4 # [64,256,128,32,32,32,64,64]740; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4741; AVX1-NEXT: vpackuswb %xmm1, %xmm4, %xmm1742; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm4 # [7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]743; AVX1-NEXT: vpand %xmm3, %xmm4, %xmm3744; AVX1-NEXT: vpmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1 # [0,8,0,10,0,12,0,14,0,16,0,18,0,20,0,22]745; AVX1-NEXT: vpsllw $8, %xmm1, %xmm1746; AVX1-NEXT: vpor %xmm1, %xmm3, %xmm1747; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm0748; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0749; AVX1-NEXT: retq750;751; AVX2NOBW-LABEL: test_remconstant_32i8:752; AVX2NOBW: # %bb.0:753; AVX2NOBW-NEXT: vpxor %xmm1, %xmm1, %xmm1754; AVX2NOBW-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]755; AVX2NOBW-NEXT: vmovdqa {{.*#+}} ymm3 = [256,256,256,256,256,256,256,128,128,256,256,256,256,256,256,256]756; AVX2NOBW-NEXT: vpmullw %ymm3, %ymm2, %ymm2757; AVX2NOBW-NEXT: vpsrlw $8, %ymm2, %ymm2758; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 # [137,0,16,0,241,0,57,0,27,0,205,0,135,0,187,0,147,0,79,0,171,0,117,0,205,0,57,0,32,0,37,0]759; AVX2NOBW-NEXT: vpsrlw $8, %ymm2, %ymm2760; AVX2NOBW-NEXT: vpunpcklbw {{.*#+}} ymm4 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]761; AVX2NOBW-NEXT: vpmullw %ymm3, %ymm4, %ymm3762; AVX2NOBW-NEXT: vpsrlw $8, %ymm3, %ymm3763; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [37,0,32,0,57,0,205,0,117,0,171,0,79,0,147,0,187,0,135,0,205,0,27,0,57,0,241,0,16,0,137,0]764; AVX2NOBW-NEXT: vpsrlw $8, %ymm3, %ymm3765; AVX2NOBW-NEXT: vpackuswb %ymm2, %ymm3, %ymm2766; AVX2NOBW-NEXT: vpsubb %ymm2, %ymm0, %ymm3767; AVX2NOBW-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm3[8],ymm1[8],ymm3[9],ymm1[9],ymm3[10],ymm1[10],ymm3[11],ymm1[11],ymm3[12],ymm1[12],ymm3[13],ymm1[13],ymm3[14],ymm1[14],ymm3[15],ymm1[15],ymm3[24],ymm1[24],ymm3[25],ymm1[25],ymm3[26],ymm1[26],ymm3[27],ymm1[27],ymm3[28],ymm1[28],ymm3[29],ymm1[29],ymm3[30],ymm1[30],ymm3[31],ymm1[31]768; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4 # [0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0]769; AVX2NOBW-NEXT: vpsrlw $8, %ymm4, %ymm4770; AVX2NOBW-NEXT: vpunpcklbw {{.*#+}} ymm3 = ymm3[0],ymm1[0],ymm3[1],ymm1[1],ymm3[2],ymm1[2],ymm3[3],ymm1[3],ymm3[4],ymm1[4],ymm3[5],ymm1[5],ymm3[6],ymm1[6],ymm3[7],ymm1[7],ymm3[16],ymm1[16],ymm3[17],ymm1[17],ymm3[18],ymm1[18],ymm3[19],ymm1[19],ymm3[20],ymm1[20],ymm3[21],ymm1[21],ymm3[22],ymm1[22],ymm3[23],ymm1[23]771; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0]772; AVX2NOBW-NEXT: vpsrlw $8, %ymm3, %ymm3773; AVX2NOBW-NEXT: vpackuswb %ymm4, %ymm3, %ymm3774; AVX2NOBW-NEXT: vpaddb %ymm2, %ymm3, %ymm2775; AVX2NOBW-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm2[8],ymm1[8],ymm2[9],ymm1[9],ymm2[10],ymm1[10],ymm2[11],ymm1[11],ymm2[12],ymm1[12],ymm2[13],ymm1[13],ymm2[14],ymm1[14],ymm2[15],ymm1[15],ymm2[24],ymm1[24],ymm2[25],ymm1[25],ymm2[26],ymm1[26],ymm2[27],ymm1[27],ymm2[28],ymm1[28],ymm2[29],ymm1[29],ymm2[30],ymm1[30],ymm2[31],ymm1[31]776; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [32,256,16,64,128,16,16,32,64,64,32,32,32,128,256,64]777; AVX2NOBW-NEXT: vpsrlw $8, %ymm3, %ymm3778; AVX2NOBW-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm2[0],ymm1[0],ymm2[1],ymm1[1],ymm2[2],ymm1[2],ymm2[3],ymm1[3],ymm2[4],ymm1[4],ymm2[5],ymm1[5],ymm2[6],ymm1[6],ymm2[7],ymm1[7],ymm2[16],ymm1[16],ymm2[17],ymm1[17],ymm2[18],ymm1[18],ymm2[19],ymm1[19],ymm2[20],ymm1[20],ymm2[21],ymm1[21],ymm2[22],ymm1[22],ymm2[23],ymm1[23]779; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [64,256,128,32,32,32,64,64,32,16,16,128,64,16,256,32]780; AVX2NOBW-NEXT: vpsrlw $8, %ymm1, %ymm1781; AVX2NOBW-NEXT: vpackuswb %ymm3, %ymm1, %ymm1782; AVX2NOBW-NEXT: vpmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm2 # [0,8,0,10,0,12,0,14,0,16,0,18,0,20,0,22,0,21,0,19,0,17,0,15,0,13,0,11,0,9,0,7]783; AVX2NOBW-NEXT: vpsllw $8, %ymm2, %ymm2784; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7]785; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1786; AVX2NOBW-NEXT: vpor %ymm2, %ymm1, %ymm1787; AVX2NOBW-NEXT: vpsubb %ymm1, %ymm0, %ymm0788; AVX2NOBW-NEXT: retq789;790; AVX512BW-LABEL: test_remconstant_32i8:791; AVX512BW: # %bb.0:792; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm1 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero793; AVX512BW-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1794; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1 # [37,32,57,205,117,171,79,147,137,16,241,57,27,205,135,187,187,135,205,27,57,241,16,137,147,79,171,117,205,57,32,37]795; AVX512BW-NEXT: vpsrlw $8, %zmm1, %zmm1796; AVX512BW-NEXT: vpmovwb %zmm1, %ymm1797; AVX512BW-NEXT: vpsubb %ymm1, %ymm0, %ymm2798; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm2 = ymm2[0],zero,ymm2[1],zero,ymm2[2],zero,ymm2[3],zero,ymm2[4],zero,ymm2[5],zero,ymm2[6],zero,ymm2[7],zero,ymm2[8],zero,ymm2[9],zero,ymm2[10],zero,ymm2[11],zero,ymm2[12],zero,ymm2[13],zero,ymm2[14],zero,ymm2[15],zero,ymm2[16],zero,ymm2[17],zero,ymm2[18],zero,ymm2[19],zero,ymm2[20],zero,ymm2[21],zero,ymm2[22],zero,ymm2[23],zero,ymm2[24],zero,ymm2[25],zero,ymm2[26],zero,ymm2[27],zero,ymm2[28],zero,ymm2[29],zero,ymm2[30],zero,ymm2[31],zero799; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm2 # [128,0,0,0,128,0,0,0,0,0,0,0,0,0,128,0,0,128,0,0,0,0,0,0,0,0,0,128,0,0,0,128]800; AVX512BW-NEXT: vpsrlw $8, %zmm2, %zmm2801; AVX512BW-NEXT: vpmovwb %zmm2, %ymm2802; AVX512BW-NEXT: vpaddb %ymm1, %ymm2, %ymm1803; 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],zero804; AVX512BW-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1805; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1 # [7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7]806; AVX512BW-NEXT: vpmovwb %zmm1, %ymm1807; AVX512BW-NEXT: vpsubb %ymm1, %ymm0, %ymm0808; AVX512BW-NEXT: retq809 %res = urem <32 x i8> %a, <i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15, i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 22, i8 21, i8 20, i8 19, i8 18, i8 17, i8 16, i8 15, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8, i8 7>810 ret <32 x i8> %res811}812