brintos

brintos / llvm-project-archived public Read only

0
0
Text · 52.5 KiB · b8a131e Raw
660 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX --check-prefix=AVX512F3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=AVX --check-prefix=AVX512BW4 5;6; udiv by 77;8 9define <8 x i64> @test_div7_8i64(<8 x i64> %a) nounwind {10; AVX-LABEL: test_div7_8i64:11; AVX:       # %bb.0:12; AVX-NEXT:    vextracti32x4 $3, %zmm0, %xmm113; AVX-NEXT:    vpextrq $1, %xmm1, %rcx14; AVX-NEXT:    movabsq $2635249153387078803, %rsi # imm = 0x249249249249249315; AVX-NEXT:    movq %rcx, %rax16; AVX-NEXT:    mulq %rsi17; AVX-NEXT:    subq %rdx, %rcx18; AVX-NEXT:    shrq %rcx19; AVX-NEXT:    addq %rdx, %rcx20; AVX-NEXT:    vmovq %rcx, %xmm221; AVX-NEXT:    vmovq %xmm1, %rcx22; AVX-NEXT:    movq %rcx, %rax23; AVX-NEXT:    mulq %rsi24; AVX-NEXT:    subq %rdx, %rcx25; AVX-NEXT:    shrq %rcx26; AVX-NEXT:    addq %rdx, %rcx27; AVX-NEXT:    vmovq %rcx, %xmm128; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]29; AVX-NEXT:    vextracti32x4 $2, %zmm0, %xmm230; AVX-NEXT:    vpextrq $1, %xmm2, %rcx31; AVX-NEXT:    movq %rcx, %rax32; AVX-NEXT:    mulq %rsi33; AVX-NEXT:    subq %rdx, %rcx34; AVX-NEXT:    shrq %rcx35; AVX-NEXT:    addq %rdx, %rcx36; AVX-NEXT:    vmovq %rcx, %xmm337; AVX-NEXT:    vmovq %xmm2, %rcx38; AVX-NEXT:    movq %rcx, %rax39; AVX-NEXT:    mulq %rsi40; AVX-NEXT:    subq %rdx, %rcx41; AVX-NEXT:    shrq %rcx42; AVX-NEXT:    addq %rdx, %rcx43; AVX-NEXT:    vmovq %rcx, %xmm244; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]45; AVX-NEXT:    vinserti128 $1, %xmm1, %ymm2, %ymm146; AVX-NEXT:    vextracti128 $1, %ymm0, %xmm247; AVX-NEXT:    vpextrq $1, %xmm2, %rcx48; AVX-NEXT:    movq %rcx, %rax49; AVX-NEXT:    mulq %rsi50; AVX-NEXT:    subq %rdx, %rcx51; AVX-NEXT:    shrq %rcx52; AVX-NEXT:    addq %rdx, %rcx53; AVX-NEXT:    vmovq %rcx, %xmm354; AVX-NEXT:    vmovq %xmm2, %rcx55; AVX-NEXT:    movq %rcx, %rax56; AVX-NEXT:    mulq %rsi57; AVX-NEXT:    subq %rdx, %rcx58; AVX-NEXT:    shrq %rcx59; AVX-NEXT:    addq %rdx, %rcx60; AVX-NEXT:    vmovq %rcx, %xmm261; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]62; AVX-NEXT:    vpextrq $1, %xmm0, %rcx63; AVX-NEXT:    movq %rcx, %rax64; AVX-NEXT:    mulq %rsi65; AVX-NEXT:    subq %rdx, %rcx66; AVX-NEXT:    shrq %rcx67; AVX-NEXT:    addq %rdx, %rcx68; AVX-NEXT:    vmovq %rcx, %xmm369; AVX-NEXT:    vmovq %xmm0, %rcx70; AVX-NEXT:    movq %rcx, %rax71; AVX-NEXT:    mulq %rsi72; AVX-NEXT:    subq %rdx, %rcx73; AVX-NEXT:    shrq %rcx74; AVX-NEXT:    addq %rdx, %rcx75; AVX-NEXT:    vmovq %rcx, %xmm076; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]77; AVX-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm078; AVX-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm079; AVX-NEXT:    vpsrlq $2, %zmm0, %zmm080; AVX-NEXT:    retq81  %res = udiv <8 x i64> %a, <i64 7, i64 7, i64 7, i64 7, i64 7, i64 7, i64 7, i64 7>82  ret <8 x i64> %res83}84 85define <16 x i32> @test_div7_16i32(<16 x i32> %a) nounwind {86; AVX-LABEL: test_div7_16i32:87; AVX:       # %bb.0:88; AVX-NEXT:    vpbroadcastd {{.*#+}} zmm1 = [613566757,613566757,613566757,613566757,613566757,613566757,613566757,613566757,613566757,613566757,613566757,613566757,613566757,613566757,613566757,613566757]89; AVX-NEXT:    vpmuludq %zmm1, %zmm0, %zmm290; AVX-NEXT:    vpshufd {{.*#+}} zmm3 = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]91; AVX-NEXT:    vpmuludq %zmm1, %zmm3, %zmm192; AVX-NEXT:    vpmovsxbd {{.*#+}} zmm3 = [1,17,3,19,5,21,7,23,9,25,11,27,13,29,15,31]93; AVX-NEXT:    vpermi2d %zmm1, %zmm2, %zmm394; AVX-NEXT:    vpsubd %zmm3, %zmm0, %zmm095; AVX-NEXT:    vpsrld $1, %zmm0, %zmm096; AVX-NEXT:    vpaddd %zmm3, %zmm0, %zmm097; AVX-NEXT:    vpsrld $2, %zmm0, %zmm098; AVX-NEXT:    retq99  %res = udiv <16 x i32> %a, <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>100  ret <16 x i32> %res101}102 103define <32 x i16> @test_div7_32i16(<32 x i16> %a) nounwind {104; AVX512F-LABEL: test_div7_32i16:105; AVX512F:       # %bb.0:106; AVX512F-NEXT:    vpbroadcastw {{.*#+}} ymm1 = [9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363]107; AVX512F-NEXT:    vpmulhuw %ymm1, %ymm0, %ymm2108; AVX512F-NEXT:    vpsubw %ymm2, %ymm0, %ymm3109; AVX512F-NEXT:    vpsrlw $1, %ymm3, %ymm3110; AVX512F-NEXT:    vpaddw %ymm2, %ymm3, %ymm2111; AVX512F-NEXT:    vpsrlw $2, %ymm2, %ymm2112; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm0113; AVX512F-NEXT:    vpmulhuw %ymm1, %ymm0, %ymm1114; AVX512F-NEXT:    vpsubw %ymm1, %ymm0, %ymm0115; AVX512F-NEXT:    vpsrlw $1, %ymm0, %ymm0116; AVX512F-NEXT:    vpaddw %ymm1, %ymm0, %ymm0117; AVX512F-NEXT:    vpsrlw $2, %ymm0, %ymm0118; AVX512F-NEXT:    vinserti64x4 $1, %ymm0, %zmm2, %zmm0119; AVX512F-NEXT:    retq120;121; AVX512BW-LABEL: test_div7_32i16:122; AVX512BW:       # %bb.0:123; AVX512BW-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm1 # [9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363]124; AVX512BW-NEXT:    vpsubw %zmm1, %zmm0, %zmm0125; AVX512BW-NEXT:    vpsrlw $1, %zmm0, %zmm0126; AVX512BW-NEXT:    vpaddw %zmm1, %zmm0, %zmm0127; AVX512BW-NEXT:    vpsrlw $2, %zmm0, %zmm0128; AVX512BW-NEXT:    retq129  %res = udiv <32 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, 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>130  ret <32 x i16> %res131}132 133define <64 x i8> @test_div7_64i8(<64 x i8> %a) nounwind {134; AVX512F-LABEL: test_div7_64i8:135; AVX512F:       # %bb.0:136; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1137; AVX512F-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]138; AVX512F-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]139; AVX512F-NEXT:    vpmullw %ymm3, %ymm2, %ymm2140; AVX512F-NEXT:    vpsrlw $8, %ymm2, %ymm2141; AVX512F-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]142; AVX512F-NEXT:    vpmullw %ymm3, %ymm4, %ymm4143; AVX512F-NEXT:    vpsrlw $8, %ymm4, %ymm4144; AVX512F-NEXT:    vpackuswb %ymm2, %ymm4, %ymm2145; AVX512F-NEXT:    vpsubb %ymm2, %ymm0, %ymm4146; AVX512F-NEXT:    vpsrlw $1, %ymm4, %ymm4147; AVX512F-NEXT:    vpbroadcastb {{.*#+}} ymm5 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]148; AVX512F-NEXT:    vpand %ymm5, %ymm4, %ymm4149; AVX512F-NEXT:    vpaddb %ymm2, %ymm4, %ymm2150; AVX512F-NEXT:    vpsrlw $2, %ymm2, %ymm2151; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm0152; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm4 = 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]153; AVX512F-NEXT:    vpmullw %ymm3, %ymm4, %ymm4154; AVX512F-NEXT:    vpsrlw $8, %ymm4, %ymm4155; AVX512F-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]156; AVX512F-NEXT:    vpmullw %ymm3, %ymm1, %ymm1157; AVX512F-NEXT:    vpsrlw $8, %ymm1, %ymm1158; AVX512F-NEXT:    vpackuswb %ymm4, %ymm1, %ymm1159; AVX512F-NEXT:    vpsubb %ymm1, %ymm0, %ymm0160; AVX512F-NEXT:    vpsrlw $1, %ymm0, %ymm0161; AVX512F-NEXT:    vpand %ymm5, %ymm0, %ymm0162; AVX512F-NEXT:    vpaddb %ymm1, %ymm0, %ymm0163; AVX512F-NEXT:    vpsrlw $2, %ymm0, %ymm0164; AVX512F-NEXT:    vinserti64x4 $1, %ymm0, %zmm2, %zmm0165; AVX512F-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0166; AVX512F-NEXT:    retq167;168; AVX512BW-LABEL: test_div7_64i8:169; AVX512BW:       # %bb.0:170; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1171; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm2 = zmm0[8],zmm1[8],zmm0[9],zmm1[9],zmm0[10],zmm1[10],zmm0[11],zmm1[11],zmm0[12],zmm1[12],zmm0[13],zmm1[13],zmm0[14],zmm1[14],zmm0[15],zmm1[15],zmm0[24],zmm1[24],zmm0[25],zmm1[25],zmm0[26],zmm1[26],zmm0[27],zmm1[27],zmm0[28],zmm1[28],zmm0[29],zmm1[29],zmm0[30],zmm1[30],zmm0[31],zmm1[31],zmm0[40],zmm1[40],zmm0[41],zmm1[41],zmm0[42],zmm1[42],zmm0[43],zmm1[43],zmm0[44],zmm1[44],zmm0[45],zmm1[45],zmm0[46],zmm1[46],zmm0[47],zmm1[47],zmm0[56],zmm1[56],zmm0[57],zmm1[57],zmm0[58],zmm1[58],zmm0[59],zmm1[59],zmm0[60],zmm1[60],zmm0[61],zmm1[61],zmm0[62],zmm1[62],zmm0[63],zmm1[63]172; AVX512BW-NEXT:    vpbroadcastw {{.*#+}} zmm3 = [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,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]173; AVX512BW-NEXT:    vpmullw %zmm3, %zmm2, %zmm2174; AVX512BW-NEXT:    vpsrlw $8, %zmm2, %zmm2175; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm0[0],zmm1[0],zmm0[1],zmm1[1],zmm0[2],zmm1[2],zmm0[3],zmm1[3],zmm0[4],zmm1[4],zmm0[5],zmm1[5],zmm0[6],zmm1[6],zmm0[7],zmm1[7],zmm0[16],zmm1[16],zmm0[17],zmm1[17],zmm0[18],zmm1[18],zmm0[19],zmm1[19],zmm0[20],zmm1[20],zmm0[21],zmm1[21],zmm0[22],zmm1[22],zmm0[23],zmm1[23],zmm0[32],zmm1[32],zmm0[33],zmm1[33],zmm0[34],zmm1[34],zmm0[35],zmm1[35],zmm0[36],zmm1[36],zmm0[37],zmm1[37],zmm0[38],zmm1[38],zmm0[39],zmm1[39],zmm0[48],zmm1[48],zmm0[49],zmm1[49],zmm0[50],zmm1[50],zmm0[51],zmm1[51],zmm0[52],zmm1[52],zmm0[53],zmm1[53],zmm0[54],zmm1[54],zmm0[55],zmm1[55]176; AVX512BW-NEXT:    vpmullw %zmm3, %zmm1, %zmm1177; AVX512BW-NEXT:    vpsrlw $8, %zmm1, %zmm1178; AVX512BW-NEXT:    vpackuswb %zmm2, %zmm1, %zmm1179; AVX512BW-NEXT:    vpsubb %zmm1, %zmm0, %zmm0180; AVX512BW-NEXT:    vpsrlw $1, %zmm0, %zmm0181; AVX512BW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0182; AVX512BW-NEXT:    vpaddb %zmm1, %zmm0, %zmm0183; AVX512BW-NEXT:    vpsrlw $2, %zmm0, %zmm0184; AVX512BW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0185; AVX512BW-NEXT:    retq186  %res = udiv <64 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, 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>187  ret <64 x i8> %res188}189 190;191; udiv by non-splat constant192;193 194define <64 x i8> @test_divconstant_64i8(<64 x i8> %a) nounwind {195; AVX512F-LABEL: test_divconstant_64i8:196; AVX512F:       # %bb.0:197; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm2198; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1199; AVX512F-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]200; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [256,256,64,256,256,256,256,256,128,256,256,256,256,256,256,256]201; AVX512F-NEXT:    vpsrlw $8, %ymm3, %ymm3202; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [137,0,27,0,37,0,19,0,79,0,41,0,171,0,101,0,147,0,79,0,171,0,117,0,205,0,57,0,32,0,37,0]203; AVX512F-NEXT:    vpsrlw $8, %ymm3, %ymm3204; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm4 = 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]205; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4 # [256,256,256,256,256,256,256,256,128,256,256,256,256,256,256,256]206; AVX512F-NEXT:    vpsrlw $8, %ymm4, %ymm4207; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4 # [27,0,111,0,57,0,235,0,241,0,249,0,8,0,9,0,187,0,135,0,205,0,27,0,57,0,241,0,16,0,137,0]208; AVX512F-NEXT:    vpsrlw $8, %ymm4, %ymm4209; AVX512F-NEXT:    vpackuswb %ymm3, %ymm4, %ymm3210; AVX512F-NEXT:    vpsubb %ymm3, %ymm2, %ymm2211; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm4 = 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]212; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4 # [0,0,128,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0]213; AVX512F-NEXT:    vpsrlw $8, %ymm4, %ymm4214; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm2 = 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]215; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 # [0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0]216; AVX512F-NEXT:    vpsrlw $8, %ymm2, %ymm2217; AVX512F-NEXT:    vpackuswb %ymm4, %ymm2, %ymm2218; AVX512F-NEXT:    vpaddb %ymm3, %ymm2, %ymm2219; AVX512F-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]220; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [16,16,256,128,32,64,16,16,64,64,32,32,32,128,256,64]221; AVX512F-NEXT:    vpsrlw $8, %ymm3, %ymm3222; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm2 = 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]223; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 # [64,16,32,8,8,8,256,16,32,16,16,128,64,16,256,32]224; AVX512F-NEXT:    vpsrlw $8, %ymm2, %ymm2225; AVX512F-NEXT:    vpackuswb %ymm3, %ymm2, %ymm2226; AVX512F-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]227; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [256,256,256,256,256,256,256,128,256,256,256,256,256,256,256,256]228; AVX512F-NEXT:    vpsrlw $8, %ymm3, %ymm3229; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [137,0,16,0,241,0,57,0,27,0,205,0,135,0,187,0,9,0,8,0,249,0,241,0,235,0,57,0,111,0,27,0]230; AVX512F-NEXT:    vpsrlw $8, %ymm3, %ymm3231; AVX512F-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]232; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4 # [256,256,256,256,256,256,256,128,256,256,256,256,256,64,256,256]233; AVX512F-NEXT:    vpsrlw $8, %ymm4, %ymm4234; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4 # [37,0,32,0,57,0,205,0,117,0,171,0,79,0,147,0,101,0,171,0,41,0,79,0,19,0,37,0,27,0,137,0]235; AVX512F-NEXT:    vpsrlw $8, %ymm4, %ymm4236; AVX512F-NEXT:    vpackuswb %ymm3, %ymm4, %ymm3237; AVX512F-NEXT:    vpsubb %ymm3, %ymm0, %ymm0238; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm4 = 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]239; AVX512F-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,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]240; AVX512F-NEXT:    vpsrlw $8, %ymm4, %ymm4241; AVX512F-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]242; AVX512F-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,128,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0]243; AVX512F-NEXT:    vpsrlw $8, %ymm0, %ymm0244; AVX512F-NEXT:    vpackuswb %ymm4, %ymm0, %ymm0245; AVX512F-NEXT:    vpaddb %ymm3, %ymm0, %ymm0246; AVX512F-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]247; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [32,256,16,64,128,16,16,32,16,256,8,8,8,32,16,64]248; AVX512F-NEXT:    vpsrlw $8, %ymm3, %ymm3249; AVX512F-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]250; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 # [64,256,128,32,32,32,64,64,16,16,64,32,128,256,16,16]251; AVX512F-NEXT:    vpsrlw $8, %ymm0, %ymm0252; AVX512F-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0253; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0254; AVX512F-NEXT:    retq255;256; AVX512BW-LABEL: test_divconstant_64i8:257; AVX512BW:       # %bb.0:258; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1259; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm2 = zmm0[8],zmm1[8],zmm0[9],zmm1[9],zmm0[10],zmm1[10],zmm0[11],zmm1[11],zmm0[12],zmm1[12],zmm0[13],zmm1[13],zmm0[14],zmm1[14],zmm0[15],zmm1[15],zmm0[24],zmm1[24],zmm0[25],zmm1[25],zmm0[26],zmm1[26],zmm0[27],zmm1[27],zmm0[28],zmm1[28],zmm0[29],zmm1[29],zmm0[30],zmm1[30],zmm0[31],zmm1[31],zmm0[40],zmm1[40],zmm0[41],zmm1[41],zmm0[42],zmm1[42],zmm0[43],zmm1[43],zmm0[44],zmm1[44],zmm0[45],zmm1[45],zmm0[46],zmm1[46],zmm0[47],zmm1[47],zmm0[56],zmm1[56],zmm0[57],zmm1[57],zmm0[58],zmm1[58],zmm0[59],zmm1[59],zmm0[60],zmm1[60],zmm0[61],zmm1[61],zmm0[62],zmm1[62],zmm0[63],zmm1[63]260; AVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm2261; AVX512BW-NEXT:    vpsrlw $8, %zmm2, %zmm2262; AVX512BW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm2 # [137,0,16,0,241,0,57,0,27,0,205,0,135,0,187,0,9,0,8,0,249,0,241,0,235,0,57,0,111,0,27,0,137,0,27,0,37,0,19,0,79,0,41,0,171,0,101,0,147,0,79,0,171,0,117,0,205,0,57,0,32,0,37,0]263; AVX512BW-NEXT:    vpsrlw $8, %zmm2, %zmm2264; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm3 = zmm0[0],zmm1[0],zmm0[1],zmm1[1],zmm0[2],zmm1[2],zmm0[3],zmm1[3],zmm0[4],zmm1[4],zmm0[5],zmm1[5],zmm0[6],zmm1[6],zmm0[7],zmm1[7],zmm0[16],zmm1[16],zmm0[17],zmm1[17],zmm0[18],zmm1[18],zmm0[19],zmm1[19],zmm0[20],zmm1[20],zmm0[21],zmm1[21],zmm0[22],zmm1[22],zmm0[23],zmm1[23],zmm0[32],zmm1[32],zmm0[33],zmm1[33],zmm0[34],zmm1[34],zmm0[35],zmm1[35],zmm0[36],zmm1[36],zmm0[37],zmm1[37],zmm0[38],zmm1[38],zmm0[39],zmm1[39],zmm0[48],zmm1[48],zmm0[49],zmm1[49],zmm0[50],zmm1[50],zmm0[51],zmm1[51],zmm0[52],zmm1[52],zmm0[53],zmm1[53],zmm0[54],zmm1[54],zmm0[55],zmm1[55]265; AVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm3, %zmm3266; AVX512BW-NEXT:    vpsrlw $8, %zmm3, %zmm3267; AVX512BW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm3, %zmm3 # [37,0,32,0,57,0,205,0,117,0,171,0,79,0,147,0,101,0,171,0,41,0,79,0,19,0,37,0,27,0,137,0,27,0,111,0,57,0,235,0,241,0,249,0,8,0,9,0,187,0,135,0,205,0,27,0,57,0,241,0,16,0,137,0]268; AVX512BW-NEXT:    vpsrlw $8, %zmm3, %zmm3269; AVX512BW-NEXT:    vpackuswb %zmm2, %zmm3, %zmm2270; AVX512BW-NEXT:    vpsubb %zmm2, %zmm0, %zmm0271; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm3 = zmm0[8],zmm1[8],zmm0[9],zmm1[9],zmm0[10],zmm1[10],zmm0[11],zmm1[11],zmm0[12],zmm1[12],zmm0[13],zmm1[13],zmm0[14],zmm1[14],zmm0[15],zmm1[15],zmm0[24],zmm1[24],zmm0[25],zmm1[25],zmm0[26],zmm1[26],zmm0[27],zmm1[27],zmm0[28],zmm1[28],zmm0[29],zmm1[29],zmm0[30],zmm1[30],zmm0[31],zmm1[31],zmm0[40],zmm1[40],zmm0[41],zmm1[41],zmm0[42],zmm1[42],zmm0[43],zmm1[43],zmm0[44],zmm1[44],zmm0[45],zmm1[45],zmm0[46],zmm1[46],zmm0[47],zmm1[47],zmm0[56],zmm1[56],zmm0[57],zmm1[57],zmm0[58],zmm1[58],zmm0[59],zmm1[59],zmm0[60],zmm1[60],zmm0[61],zmm1[61],zmm0[62],zmm1[62],zmm0[63],zmm1[63]272; AVX512BW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm3, %zmm3 # [0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0]273; AVX512BW-NEXT:    vpsrlw $8, %zmm3, %zmm3274; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[0],zmm1[0],zmm0[1],zmm1[1],zmm0[2],zmm1[2],zmm0[3],zmm1[3],zmm0[4],zmm1[4],zmm0[5],zmm1[5],zmm0[6],zmm1[6],zmm0[7],zmm1[7],zmm0[16],zmm1[16],zmm0[17],zmm1[17],zmm0[18],zmm1[18],zmm0[19],zmm1[19],zmm0[20],zmm1[20],zmm0[21],zmm1[21],zmm0[22],zmm1[22],zmm0[23],zmm1[23],zmm0[32],zmm1[32],zmm0[33],zmm1[33],zmm0[34],zmm1[34],zmm0[35],zmm1[35],zmm0[36],zmm1[36],zmm0[37],zmm1[37],zmm0[38],zmm1[38],zmm0[39],zmm1[39],zmm0[48],zmm1[48],zmm0[49],zmm1[49],zmm0[50],zmm1[50],zmm0[51],zmm1[51],zmm0[52],zmm1[52],zmm0[53],zmm1[53],zmm0[54],zmm1[54],zmm0[55],zmm1[55]275; AVX512BW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0 # [128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0]276; AVX512BW-NEXT:    vpsrlw $8, %zmm0, %zmm0277; AVX512BW-NEXT:    vpackuswb %zmm3, %zmm0, %zmm0278; AVX512BW-NEXT:    vpaddb %zmm2, %zmm0, %zmm0279; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm2 = zmm0[8],zmm1[8],zmm0[9],zmm1[9],zmm0[10],zmm1[10],zmm0[11],zmm1[11],zmm0[12],zmm1[12],zmm0[13],zmm1[13],zmm0[14],zmm1[14],zmm0[15],zmm1[15],zmm0[24],zmm1[24],zmm0[25],zmm1[25],zmm0[26],zmm1[26],zmm0[27],zmm1[27],zmm0[28],zmm1[28],zmm0[29],zmm1[29],zmm0[30],zmm1[30],zmm0[31],zmm1[31],zmm0[40],zmm1[40],zmm0[41],zmm1[41],zmm0[42],zmm1[42],zmm0[43],zmm1[43],zmm0[44],zmm1[44],zmm0[45],zmm1[45],zmm0[46],zmm1[46],zmm0[47],zmm1[47],zmm0[56],zmm1[56],zmm0[57],zmm1[57],zmm0[58],zmm1[58],zmm0[59],zmm1[59],zmm0[60],zmm1[60],zmm0[61],zmm1[61],zmm0[62],zmm1[62],zmm0[63],zmm1[63]280; AVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm2281; AVX512BW-NEXT:    vpsrlw $8, %zmm2, %zmm2282; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[0],zmm1[0],zmm0[1],zmm1[1],zmm0[2],zmm1[2],zmm0[3],zmm1[3],zmm0[4],zmm1[4],zmm0[5],zmm1[5],zmm0[6],zmm1[6],zmm0[7],zmm1[7],zmm0[16],zmm1[16],zmm0[17],zmm1[17],zmm0[18],zmm1[18],zmm0[19],zmm1[19],zmm0[20],zmm1[20],zmm0[21],zmm1[21],zmm0[22],zmm1[22],zmm0[23],zmm1[23],zmm0[32],zmm1[32],zmm0[33],zmm1[33],zmm0[34],zmm1[34],zmm0[35],zmm1[35],zmm0[36],zmm1[36],zmm0[37],zmm1[37],zmm0[38],zmm1[38],zmm0[39],zmm1[39],zmm0[48],zmm1[48],zmm0[49],zmm1[49],zmm0[50],zmm1[50],zmm0[51],zmm1[51],zmm0[52],zmm1[52],zmm0[53],zmm1[53],zmm0[54],zmm1[54],zmm0[55],zmm1[55]283; AVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0284; AVX512BW-NEXT:    vpsrlw $8, %zmm0, %zmm0285; AVX512BW-NEXT:    vpackuswb %zmm2, %zmm0, %zmm0286; AVX512BW-NEXT:    retq287  %res = udiv <64 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 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31, i8 32, i8 33, i8 34, i8 35, i8 36, i8 37, i8 38, i8 38, i8 37, i8 36, i8 35, i8 34, i8 33, i8 32, i8 31, i8 30, i8 29, i8 28, i8 27, i8 26, i8 25, i8 24, i8 23, 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>288  ret <64 x i8> %res289}290 291;292; urem by 7293;294 295define <8 x i64> @test_rem7_8i64(<8 x i64> %a) nounwind {296; AVX-LABEL: test_rem7_8i64:297; AVX:       # %bb.0:298; AVX-NEXT:    vextracti32x4 $3, %zmm0, %xmm1299; AVX-NEXT:    vpextrq $1, %xmm1, %rcx300; AVX-NEXT:    movabsq $2635249153387078803, %rsi # imm = 0x2492492492492493301; AVX-NEXT:    movq %rcx, %rax302; AVX-NEXT:    mulq %rsi303; AVX-NEXT:    movq %rcx, %rax304; AVX-NEXT:    subq %rdx, %rax305; AVX-NEXT:    shrq %rax306; AVX-NEXT:    addq %rdx, %rax307; AVX-NEXT:    shrq $2, %rax308; AVX-NEXT:    leaq (,%rax,8), %rdx309; AVX-NEXT:    subq %rdx, %rax310; AVX-NEXT:    addq %rcx, %rax311; AVX-NEXT:    vmovq %rax, %xmm2312; AVX-NEXT:    vmovq %xmm1, %rcx313; AVX-NEXT:    movq %rcx, %rax314; AVX-NEXT:    mulq %rsi315; AVX-NEXT:    movq %rcx, %rax316; AVX-NEXT:    subq %rdx, %rax317; AVX-NEXT:    shrq %rax318; AVX-NEXT:    addq %rdx, %rax319; AVX-NEXT:    shrq $2, %rax320; AVX-NEXT:    leaq (,%rax,8), %rdx321; AVX-NEXT:    subq %rdx, %rax322; AVX-NEXT:    addq %rcx, %rax323; AVX-NEXT:    vmovq %rax, %xmm1324; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]325; AVX-NEXT:    vextracti32x4 $2, %zmm0, %xmm2326; AVX-NEXT:    vpextrq $1, %xmm2, %rcx327; AVX-NEXT:    movq %rcx, %rax328; AVX-NEXT:    mulq %rsi329; AVX-NEXT:    movq %rcx, %rax330; AVX-NEXT:    subq %rdx, %rax331; AVX-NEXT:    shrq %rax332; AVX-NEXT:    addq %rdx, %rax333; AVX-NEXT:    shrq $2, %rax334; AVX-NEXT:    leaq (,%rax,8), %rdx335; AVX-NEXT:    subq %rdx, %rax336; AVX-NEXT:    addq %rcx, %rax337; AVX-NEXT:    vmovq %rax, %xmm3338; AVX-NEXT:    vmovq %xmm2, %rcx339; AVX-NEXT:    movq %rcx, %rax340; AVX-NEXT:    mulq %rsi341; AVX-NEXT:    movq %rcx, %rax342; AVX-NEXT:    subq %rdx, %rax343; AVX-NEXT:    shrq %rax344; AVX-NEXT:    addq %rdx, %rax345; AVX-NEXT:    shrq $2, %rax346; AVX-NEXT:    leaq (,%rax,8), %rdx347; AVX-NEXT:    subq %rdx, %rax348; AVX-NEXT:    addq %rcx, %rax349; AVX-NEXT:    vmovq %rax, %xmm2350; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]351; AVX-NEXT:    vinserti128 $1, %xmm1, %ymm2, %ymm1352; AVX-NEXT:    vextracti128 $1, %ymm0, %xmm2353; AVX-NEXT:    vpextrq $1, %xmm2, %rcx354; AVX-NEXT:    movq %rcx, %rax355; AVX-NEXT:    mulq %rsi356; AVX-NEXT:    movq %rcx, %rax357; AVX-NEXT:    subq %rdx, %rax358; AVX-NEXT:    shrq %rax359; AVX-NEXT:    addq %rdx, %rax360; AVX-NEXT:    shrq $2, %rax361; AVX-NEXT:    leaq (,%rax,8), %rdx362; AVX-NEXT:    subq %rdx, %rax363; AVX-NEXT:    addq %rcx, %rax364; AVX-NEXT:    vmovq %rax, %xmm3365; AVX-NEXT:    vmovq %xmm2, %rcx366; AVX-NEXT:    movq %rcx, %rax367; AVX-NEXT:    mulq %rsi368; AVX-NEXT:    movq %rcx, %rax369; AVX-NEXT:    subq %rdx, %rax370; AVX-NEXT:    shrq %rax371; AVX-NEXT:    addq %rdx, %rax372; AVX-NEXT:    shrq $2, %rax373; AVX-NEXT:    leaq (,%rax,8), %rdx374; AVX-NEXT:    subq %rdx, %rax375; AVX-NEXT:    addq %rcx, %rax376; AVX-NEXT:    vmovq %rax, %xmm2377; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]378; AVX-NEXT:    vpextrq $1, %xmm0, %rcx379; AVX-NEXT:    movq %rcx, %rax380; AVX-NEXT:    mulq %rsi381; AVX-NEXT:    movq %rcx, %rax382; AVX-NEXT:    subq %rdx, %rax383; AVX-NEXT:    shrq %rax384; AVX-NEXT:    addq %rdx, %rax385; AVX-NEXT:    shrq $2, %rax386; AVX-NEXT:    leaq (,%rax,8), %rdx387; AVX-NEXT:    subq %rdx, %rax388; AVX-NEXT:    addq %rcx, %rax389; AVX-NEXT:    vmovq %rax, %xmm3390; AVX-NEXT:    vmovq %xmm0, %rcx391; AVX-NEXT:    movq %rcx, %rax392; AVX-NEXT:    mulq %rsi393; AVX-NEXT:    movq %rcx, %rax394; AVX-NEXT:    subq %rdx, %rax395; AVX-NEXT:    shrq %rax396; AVX-NEXT:    addq %rdx, %rax397; AVX-NEXT:    shrq $2, %rax398; AVX-NEXT:    leaq (,%rax,8), %rdx399; AVX-NEXT:    subq %rdx, %rax400; AVX-NEXT:    addq %rcx, %rax401; AVX-NEXT:    vmovq %rax, %xmm0402; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]403; AVX-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0404; AVX-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0405; AVX-NEXT:    retq406  %res = urem <8 x i64> %a, <i64 7, i64 7, i64 7, i64 7, i64 7, i64 7, i64 7, i64 7>407  ret <8 x i64> %res408}409 410define <16 x i32> @test_rem7_16i32(<16 x i32> %a) nounwind {411; AVX-LABEL: test_rem7_16i32:412; AVX:       # %bb.0:413; AVX-NEXT:    vpbroadcastd {{.*#+}} zmm1 = [613566757,613566757,613566757,613566757,613566757,613566757,613566757,613566757,613566757,613566757,613566757,613566757,613566757,613566757,613566757,613566757]414; AVX-NEXT:    vpmuludq %zmm1, %zmm0, %zmm2415; AVX-NEXT:    vpshufd {{.*#+}} zmm3 = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]416; AVX-NEXT:    vpmuludq %zmm1, %zmm3, %zmm1417; AVX-NEXT:    vpmovsxbd {{.*#+}} zmm3 = [1,17,3,19,5,21,7,23,9,25,11,27,13,29,15,31]418; AVX-NEXT:    vpermi2d %zmm1, %zmm2, %zmm3419; AVX-NEXT:    vpsubd %zmm3, %zmm0, %zmm1420; AVX-NEXT:    vpsrld $1, %zmm1, %zmm1421; AVX-NEXT:    vpaddd %zmm3, %zmm1, %zmm1422; AVX-NEXT:    vpsrld $2, %zmm1, %zmm1423; AVX-NEXT:    vpslld $3, %zmm1, %zmm2424; AVX-NEXT:    vpsubd %zmm2, %zmm1, %zmm1425; AVX-NEXT:    vpaddd %zmm1, %zmm0, %zmm0426; AVX-NEXT:    retq427  %res = urem <16 x i32> %a, <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>428  ret <16 x i32> %res429}430 431define <32 x i16> @test_rem7_32i16(<32 x i16> %a) nounwind {432; AVX512F-LABEL: test_rem7_32i16:433; AVX512F:       # %bb.0:434; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1435; AVX512F-NEXT:    vpbroadcastw {{.*#+}} ymm2 = [9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363]436; AVX512F-NEXT:    vpmulhuw %ymm2, %ymm1, %ymm3437; AVX512F-NEXT:    vpsubw %ymm3, %ymm1, %ymm4438; AVX512F-NEXT:    vpsrlw $1, %ymm4, %ymm4439; AVX512F-NEXT:    vpaddw %ymm3, %ymm4, %ymm3440; AVX512F-NEXT:    vpsrlw $2, %ymm3, %ymm3441; AVX512F-NEXT:    vpsllw $3, %ymm3, %ymm4442; AVX512F-NEXT:    vpsubw %ymm4, %ymm3, %ymm3443; AVX512F-NEXT:    vpaddw %ymm3, %ymm1, %ymm1444; AVX512F-NEXT:    vpmulhuw %ymm2, %ymm0, %ymm2445; AVX512F-NEXT:    vpsubw %ymm2, %ymm0, %ymm3446; AVX512F-NEXT:    vpsrlw $1, %ymm3, %ymm3447; AVX512F-NEXT:    vpaddw %ymm2, %ymm3, %ymm2448; AVX512F-NEXT:    vpsrlw $2, %ymm2, %ymm2449; AVX512F-NEXT:    vpsllw $3, %ymm2, %ymm3450; AVX512F-NEXT:    vpsubw %ymm3, %ymm2, %ymm2451; AVX512F-NEXT:    vpaddw %ymm2, %ymm0, %ymm0452; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0453; AVX512F-NEXT:    retq454;455; AVX512BW-LABEL: test_rem7_32i16:456; AVX512BW:       # %bb.0:457; AVX512BW-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm1 # [9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363,9363]458; AVX512BW-NEXT:    vpsubw %zmm1, %zmm0, %zmm2459; AVX512BW-NEXT:    vpsrlw $1, %zmm2, %zmm2460; AVX512BW-NEXT:    vpaddw %zmm1, %zmm2, %zmm1461; AVX512BW-NEXT:    vpsrlw $2, %zmm1, %zmm1462; AVX512BW-NEXT:    vpsllw $3, %zmm1, %zmm2463; AVX512BW-NEXT:    vpsubw %zmm2, %zmm1, %zmm1464; AVX512BW-NEXT:    vpaddw %zmm1, %zmm0, %zmm0465; AVX512BW-NEXT:    retq466  %res = urem <32 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, 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>467  ret <32 x i16> %res468}469 470define <64 x i8> @test_rem7_64i8(<64 x i8> %a) nounwind {471; AVX512F-LABEL: test_rem7_64i8:472; AVX512F:       # %bb.0:473; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1474; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2475; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15],ymm1[24],ymm2[24],ymm1[25],ymm2[25],ymm1[26],ymm2[26],ymm1[27],ymm2[27],ymm1[28],ymm2[28],ymm1[29],ymm2[29],ymm1[30],ymm2[30],ymm1[31],ymm2[31]476; AVX512F-NEXT:    vpbroadcastw {{.*#+}} ymm4 = [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]477; AVX512F-NEXT:    vpmullw %ymm4, %ymm3, %ymm3478; AVX512F-NEXT:    vpsrlw $8, %ymm3, %ymm3479; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm5 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[16],ymm2[16],ymm1[17],ymm2[17],ymm1[18],ymm2[18],ymm1[19],ymm2[19],ymm1[20],ymm2[20],ymm1[21],ymm2[21],ymm1[22],ymm2[22],ymm1[23],ymm2[23]480; AVX512F-NEXT:    vpmullw %ymm4, %ymm5, %ymm5481; AVX512F-NEXT:    vpsrlw $8, %ymm5, %ymm5482; AVX512F-NEXT:    vpackuswb %ymm3, %ymm5, %ymm3483; AVX512F-NEXT:    vpsubb %ymm3, %ymm1, %ymm5484; AVX512F-NEXT:    vpsrlw $1, %ymm5, %ymm5485; AVX512F-NEXT:    vpbroadcastb {{.*#+}} ymm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]486; AVX512F-NEXT:    vpand %ymm6, %ymm5, %ymm5487; AVX512F-NEXT:    vpaddb %ymm3, %ymm5, %ymm3488; AVX512F-NEXT:    vpaddw %ymm3, %ymm3, %ymm5489; AVX512F-NEXT:    vpbroadcastb {{.*#+}} ymm7 = [248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248]490; AVX512F-NEXT:    vpand %ymm7, %ymm5, %ymm5491; AVX512F-NEXT:    vpsrlw $2, %ymm3, %ymm3492; AVX512F-NEXT:    vpbroadcastb {{.*#+}} ymm8 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]493; AVX512F-NEXT:    vpand %ymm3, %ymm8, %ymm3494; AVX512F-NEXT:    vpsubb %ymm5, %ymm3, %ymm3495; AVX512F-NEXT:    vpaddb %ymm3, %ymm1, %ymm1496; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31]497; AVX512F-NEXT:    vpmullw %ymm4, %ymm3, %ymm3498; AVX512F-NEXT:    vpsrlw $8, %ymm3, %ymm3499; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23]500; AVX512F-NEXT:    vpmullw %ymm4, %ymm2, %ymm2501; AVX512F-NEXT:    vpsrlw $8, %ymm2, %ymm2502; AVX512F-NEXT:    vpackuswb %ymm3, %ymm2, %ymm2503; AVX512F-NEXT:    vpsubb %ymm2, %ymm0, %ymm3504; AVX512F-NEXT:    vpsrlw $1, %ymm3, %ymm3505; AVX512F-NEXT:    vpand %ymm6, %ymm3, %ymm3506; AVX512F-NEXT:    vpaddb %ymm2, %ymm3, %ymm2507; AVX512F-NEXT:    vpaddw %ymm2, %ymm2, %ymm3508; AVX512F-NEXT:    vpand %ymm7, %ymm3, %ymm3509; AVX512F-NEXT:    vpsrlw $2, %ymm2, %ymm2510; AVX512F-NEXT:    vpand %ymm2, %ymm8, %ymm2511; AVX512F-NEXT:    vpsubb %ymm3, %ymm2, %ymm2512; AVX512F-NEXT:    vpaddb %ymm2, %ymm0, %ymm0513; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0514; AVX512F-NEXT:    retq515;516; AVX512BW-LABEL: test_rem7_64i8:517; AVX512BW:       # %bb.0:518; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1519; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm2 = zmm0[8],zmm1[8],zmm0[9],zmm1[9],zmm0[10],zmm1[10],zmm0[11],zmm1[11],zmm0[12],zmm1[12],zmm0[13],zmm1[13],zmm0[14],zmm1[14],zmm0[15],zmm1[15],zmm0[24],zmm1[24],zmm0[25],zmm1[25],zmm0[26],zmm1[26],zmm0[27],zmm1[27],zmm0[28],zmm1[28],zmm0[29],zmm1[29],zmm0[30],zmm1[30],zmm0[31],zmm1[31],zmm0[40],zmm1[40],zmm0[41],zmm1[41],zmm0[42],zmm1[42],zmm0[43],zmm1[43],zmm0[44],zmm1[44],zmm0[45],zmm1[45],zmm0[46],zmm1[46],zmm0[47],zmm1[47],zmm0[56],zmm1[56],zmm0[57],zmm1[57],zmm0[58],zmm1[58],zmm0[59],zmm1[59],zmm0[60],zmm1[60],zmm0[61],zmm1[61],zmm0[62],zmm1[62],zmm0[63],zmm1[63]520; AVX512BW-NEXT:    vpbroadcastw {{.*#+}} zmm3 = [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,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]521; AVX512BW-NEXT:    vpmullw %zmm3, %zmm2, %zmm2522; AVX512BW-NEXT:    vpsrlw $8, %zmm2, %zmm2523; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm0[0],zmm1[0],zmm0[1],zmm1[1],zmm0[2],zmm1[2],zmm0[3],zmm1[3],zmm0[4],zmm1[4],zmm0[5],zmm1[5],zmm0[6],zmm1[6],zmm0[7],zmm1[7],zmm0[16],zmm1[16],zmm0[17],zmm1[17],zmm0[18],zmm1[18],zmm0[19],zmm1[19],zmm0[20],zmm1[20],zmm0[21],zmm1[21],zmm0[22],zmm1[22],zmm0[23],zmm1[23],zmm0[32],zmm1[32],zmm0[33],zmm1[33],zmm0[34],zmm1[34],zmm0[35],zmm1[35],zmm0[36],zmm1[36],zmm0[37],zmm1[37],zmm0[38],zmm1[38],zmm0[39],zmm1[39],zmm0[48],zmm1[48],zmm0[49],zmm1[49],zmm0[50],zmm1[50],zmm0[51],zmm1[51],zmm0[52],zmm1[52],zmm0[53],zmm1[53],zmm0[54],zmm1[54],zmm0[55],zmm1[55]524; AVX512BW-NEXT:    vpmullw %zmm3, %zmm1, %zmm1525; AVX512BW-NEXT:    vpsrlw $8, %zmm1, %zmm1526; AVX512BW-NEXT:    vpackuswb %zmm2, %zmm1, %zmm1527; AVX512BW-NEXT:    vpsubb %zmm1, %zmm0, %zmm2528; AVX512BW-NEXT:    vpsrlw $1, %zmm2, %zmm2529; AVX512BW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm2, %zmm2530; AVX512BW-NEXT:    vpaddb %zmm1, %zmm2, %zmm1531; AVX512BW-NEXT:    vpaddw %zmm1, %zmm1, %zmm2532; AVX512BW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm2, %zmm2533; AVX512BW-NEXT:    vpsrlw $2, %zmm1, %zmm1534; AVX512BW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm1, %zmm1535; AVX512BW-NEXT:    vpsubb %zmm2, %zmm1, %zmm1536; AVX512BW-NEXT:    vpaddb %zmm1, %zmm0, %zmm0537; AVX512BW-NEXT:    retq538  %res = urem <64 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, 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>539  ret <64 x i8> %res540}541 542;543; urem by non-splat constant544;545 546define <64 x i8> @test_remconstant_64i8(<64 x i8> %a) nounwind {547; AVX512F-LABEL: test_remconstant_64i8:548; AVX512F:       # %bb.0:549; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm2550; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1551; AVX512F-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]552; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [256,256,64,256,256,256,256,256,128,256,256,256,256,256,256,256]553; AVX512F-NEXT:    vpsrlw $8, %ymm3, %ymm3554; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [137,0,27,0,37,0,19,0,79,0,41,0,171,0,101,0,147,0,79,0,171,0,117,0,205,0,57,0,32,0,37,0]555; AVX512F-NEXT:    vpsrlw $8, %ymm3, %ymm3556; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm4 = 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]557; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4 # [256,256,256,256,256,256,256,256,128,256,256,256,256,256,256,256]558; AVX512F-NEXT:    vpsrlw $8, %ymm4, %ymm4559; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4 # [27,0,111,0,57,0,235,0,241,0,249,0,8,0,9,0,187,0,135,0,205,0,27,0,57,0,241,0,16,0,137,0]560; AVX512F-NEXT:    vpsrlw $8, %ymm4, %ymm4561; AVX512F-NEXT:    vpackuswb %ymm3, %ymm4, %ymm3562; AVX512F-NEXT:    vpsubb %ymm3, %ymm2, %ymm4563; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm5 = ymm4[8],ymm1[8],ymm4[9],ymm1[9],ymm4[10],ymm1[10],ymm4[11],ymm1[11],ymm4[12],ymm1[12],ymm4[13],ymm1[13],ymm4[14],ymm1[14],ymm4[15],ymm1[15],ymm4[24],ymm1[24],ymm4[25],ymm1[25],ymm4[26],ymm1[26],ymm4[27],ymm1[27],ymm4[28],ymm1[28],ymm4[29],ymm1[29],ymm4[30],ymm1[30],ymm4[31],ymm1[31]564; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm5, %ymm5 # [0,0,128,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0]565; AVX512F-NEXT:    vpsrlw $8, %ymm5, %ymm5566; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm4 = ymm4[0],ymm1[0],ymm4[1],ymm1[1],ymm4[2],ymm1[2],ymm4[3],ymm1[3],ymm4[4],ymm1[4],ymm4[5],ymm1[5],ymm4[6],ymm1[6],ymm4[7],ymm1[7],ymm4[16],ymm1[16],ymm4[17],ymm1[17],ymm4[18],ymm1[18],ymm4[19],ymm1[19],ymm4[20],ymm1[20],ymm4[21],ymm1[21],ymm4[22],ymm1[22],ymm4[23],ymm1[23]567; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4 # [0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0]568; AVX512F-NEXT:    vpsrlw $8, %ymm4, %ymm4569; AVX512F-NEXT:    vpackuswb %ymm5, %ymm4, %ymm4570; AVX512F-NEXT:    vpaddb %ymm3, %ymm4, %ymm3571; AVX512F-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]572; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4 # [16,16,256,128,32,64,16,16,64,64,32,32,32,128,256,64]573; AVX512F-NEXT:    vpsrlw $8, %ymm4, %ymm4574; AVX512F-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]575; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [64,16,32,8,8,8,256,16,32,16,16,128,64,16,256,32]576; AVX512F-NEXT:    vpsrlw $8, %ymm3, %ymm3577; AVX512F-NEXT:    vpackuswb %ymm4, %ymm3, %ymm4578; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm5 # [38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7]579; AVX512F-NEXT:    vpbroadcastw {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]580; AVX512F-NEXT:    vpand %ymm3, %ymm5, %ymm5581; AVX512F-NEXT:    vpmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4 # [0,37,0,35,0,33,0,31,0,29,0,27,0,25,0,23,0,21,0,19,0,17,0,15,0,13,0,11,0,9,0,7]582; AVX512F-NEXT:    vpsllw $8, %ymm4, %ymm4583; AVX512F-NEXT:    vpor %ymm4, %ymm5, %ymm4584; AVX512F-NEXT:    vpsubb %ymm4, %ymm2, %ymm2585; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm4 = 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]586; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4 # [256,256,256,256,256,256,256,128,256,256,256,256,256,256,256,256]587; AVX512F-NEXT:    vpsrlw $8, %ymm4, %ymm4588; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4 # [137,0,16,0,241,0,57,0,27,0,205,0,135,0,187,0,9,0,8,0,249,0,241,0,235,0,57,0,111,0,27,0]589; AVX512F-NEXT:    vpsrlw $8, %ymm4, %ymm4590; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm5 = 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]591; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm5, %ymm5 # [256,256,256,256,256,256,256,128,256,256,256,256,256,64,256,256]592; AVX512F-NEXT:    vpsrlw $8, %ymm5, %ymm5593; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm5, %ymm5 # [37,0,32,0,57,0,205,0,117,0,171,0,79,0,147,0,101,0,171,0,41,0,79,0,19,0,37,0,27,0,137,0]594; AVX512F-NEXT:    vpsrlw $8, %ymm5, %ymm5595; AVX512F-NEXT:    vpackuswb %ymm4, %ymm5, %ymm4596; AVX512F-NEXT:    vpsubb %ymm4, %ymm0, %ymm5597; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm6 = ymm5[8],ymm1[8],ymm5[9],ymm1[9],ymm5[10],ymm1[10],ymm5[11],ymm1[11],ymm5[12],ymm1[12],ymm5[13],ymm1[13],ymm5[14],ymm1[14],ymm5[15],ymm1[15],ymm5[24],ymm1[24],ymm5[25],ymm1[25],ymm5[26],ymm1[26],ymm5[27],ymm1[27],ymm5[28],ymm1[28],ymm5[29],ymm1[29],ymm5[30],ymm1[30],ymm5[31],ymm1[31]598; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm6, %ymm6 # [0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]599; AVX512F-NEXT:    vpsrlw $8, %ymm6, %ymm6600; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm5 = ymm5[0],ymm1[0],ymm5[1],ymm1[1],ymm5[2],ymm1[2],ymm5[3],ymm1[3],ymm5[4],ymm1[4],ymm5[5],ymm1[5],ymm5[6],ymm1[6],ymm5[7],ymm1[7],ymm5[16],ymm1[16],ymm5[17],ymm1[17],ymm5[18],ymm1[18],ymm5[19],ymm1[19],ymm5[20],ymm1[20],ymm5[21],ymm1[21],ymm5[22],ymm1[22],ymm5[23],ymm1[23]601; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm5, %ymm5 # [128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0]602; AVX512F-NEXT:    vpsrlw $8, %ymm5, %ymm5603; AVX512F-NEXT:    vpackuswb %ymm6, %ymm5, %ymm5604; AVX512F-NEXT:    vpaddb %ymm4, %ymm5, %ymm4605; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm5 = ymm4[8],ymm1[8],ymm4[9],ymm1[9],ymm4[10],ymm1[10],ymm4[11],ymm1[11],ymm4[12],ymm1[12],ymm4[13],ymm1[13],ymm4[14],ymm1[14],ymm4[15],ymm1[15],ymm4[24],ymm1[24],ymm4[25],ymm1[25],ymm4[26],ymm1[26],ymm4[27],ymm1[27],ymm4[28],ymm1[28],ymm4[29],ymm1[29],ymm4[30],ymm1[30],ymm4[31],ymm1[31]606; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm5, %ymm5 # [32,256,16,64,128,16,16,32,16,256,8,8,8,32,16,64]607; AVX512F-NEXT:    vpsrlw $8, %ymm5, %ymm5608; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm4[0],ymm1[0],ymm4[1],ymm1[1],ymm4[2],ymm1[2],ymm4[3],ymm1[3],ymm4[4],ymm1[4],ymm4[5],ymm1[5],ymm4[6],ymm1[6],ymm4[7],ymm1[7],ymm4[16],ymm1[16],ymm4[17],ymm1[17],ymm4[18],ymm1[18],ymm4[19],ymm1[19],ymm4[20],ymm1[20],ymm4[21],ymm1[21],ymm4[22],ymm1[22],ymm4[23],ymm1[23]609; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [64,256,128,32,32,32,64,64,16,16,64,32,128,256,16,16]610; AVX512F-NEXT:    vpsrlw $8, %ymm1, %ymm1611; AVX512F-NEXT:    vpackuswb %ymm5, %ymm1, %ymm1612; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm4 # [7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38]613; AVX512F-NEXT:    vpand %ymm3, %ymm4, %ymm3614; AVX512F-NEXT:    vpmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [0,8,0,10,0,12,0,14,0,16,0,18,0,20,0,22,0,24,0,26,0,28,0,30,0,32,0,34,0,36,0,38]615; AVX512F-NEXT:    vpsllw $8, %ymm1, %ymm1616; AVX512F-NEXT:    vpor %ymm1, %ymm3, %ymm1617; AVX512F-NEXT:    vpsubb %ymm1, %ymm0, %ymm0618; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0619; AVX512F-NEXT:    retq620;621; AVX512BW-LABEL: test_remconstant_64i8:622; AVX512BW:       # %bb.0:623; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1624; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm2 = zmm0[8],zmm1[8],zmm0[9],zmm1[9],zmm0[10],zmm1[10],zmm0[11],zmm1[11],zmm0[12],zmm1[12],zmm0[13],zmm1[13],zmm0[14],zmm1[14],zmm0[15],zmm1[15],zmm0[24],zmm1[24],zmm0[25],zmm1[25],zmm0[26],zmm1[26],zmm0[27],zmm1[27],zmm0[28],zmm1[28],zmm0[29],zmm1[29],zmm0[30],zmm1[30],zmm0[31],zmm1[31],zmm0[40],zmm1[40],zmm0[41],zmm1[41],zmm0[42],zmm1[42],zmm0[43],zmm1[43],zmm0[44],zmm1[44],zmm0[45],zmm1[45],zmm0[46],zmm1[46],zmm0[47],zmm1[47],zmm0[56],zmm1[56],zmm0[57],zmm1[57],zmm0[58],zmm1[58],zmm0[59],zmm1[59],zmm0[60],zmm1[60],zmm0[61],zmm1[61],zmm0[62],zmm1[62],zmm0[63],zmm1[63]625; AVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm2626; AVX512BW-NEXT:    vpsrlw $8, %zmm2, %zmm2627; AVX512BW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm2 # [137,0,16,0,241,0,57,0,27,0,205,0,135,0,187,0,9,0,8,0,249,0,241,0,235,0,57,0,111,0,27,0,137,0,27,0,37,0,19,0,79,0,41,0,171,0,101,0,147,0,79,0,171,0,117,0,205,0,57,0,32,0,37,0]628; AVX512BW-NEXT:    vpsrlw $8, %zmm2, %zmm2629; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm3 = zmm0[0],zmm1[0],zmm0[1],zmm1[1],zmm0[2],zmm1[2],zmm0[3],zmm1[3],zmm0[4],zmm1[4],zmm0[5],zmm1[5],zmm0[6],zmm1[6],zmm0[7],zmm1[7],zmm0[16],zmm1[16],zmm0[17],zmm1[17],zmm0[18],zmm1[18],zmm0[19],zmm1[19],zmm0[20],zmm1[20],zmm0[21],zmm1[21],zmm0[22],zmm1[22],zmm0[23],zmm1[23],zmm0[32],zmm1[32],zmm0[33],zmm1[33],zmm0[34],zmm1[34],zmm0[35],zmm1[35],zmm0[36],zmm1[36],zmm0[37],zmm1[37],zmm0[38],zmm1[38],zmm0[39],zmm1[39],zmm0[48],zmm1[48],zmm0[49],zmm1[49],zmm0[50],zmm1[50],zmm0[51],zmm1[51],zmm0[52],zmm1[52],zmm0[53],zmm1[53],zmm0[54],zmm1[54],zmm0[55],zmm1[55]630; AVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm3, %zmm3631; AVX512BW-NEXT:    vpsrlw $8, %zmm3, %zmm3632; AVX512BW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm3, %zmm3 # [37,0,32,0,57,0,205,0,117,0,171,0,79,0,147,0,101,0,171,0,41,0,79,0,19,0,37,0,27,0,137,0,27,0,111,0,57,0,235,0,241,0,249,0,8,0,9,0,187,0,135,0,205,0,27,0,57,0,241,0,16,0,137,0]633; AVX512BW-NEXT:    vpsrlw $8, %zmm3, %zmm3634; AVX512BW-NEXT:    vpackuswb %zmm2, %zmm3, %zmm2635; AVX512BW-NEXT:    vpsubb %zmm2, %zmm0, %zmm3636; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm4 = zmm3[8],zmm1[8],zmm3[9],zmm1[9],zmm3[10],zmm1[10],zmm3[11],zmm1[11],zmm3[12],zmm1[12],zmm3[13],zmm1[13],zmm3[14],zmm1[14],zmm3[15],zmm1[15],zmm3[24],zmm1[24],zmm3[25],zmm1[25],zmm3[26],zmm1[26],zmm3[27],zmm1[27],zmm3[28],zmm1[28],zmm3[29],zmm1[29],zmm3[30],zmm1[30],zmm3[31],zmm1[31],zmm3[40],zmm1[40],zmm3[41],zmm1[41],zmm3[42],zmm1[42],zmm3[43],zmm1[43],zmm3[44],zmm1[44],zmm3[45],zmm1[45],zmm3[46],zmm1[46],zmm3[47],zmm1[47],zmm3[56],zmm1[56],zmm3[57],zmm1[57],zmm3[58],zmm1[58],zmm3[59],zmm1[59],zmm3[60],zmm1[60],zmm3[61],zmm1[61],zmm3[62],zmm1[62],zmm3[63],zmm1[63]637; AVX512BW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm4, %zmm4 # [0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0]638; AVX512BW-NEXT:    vpsrlw $8, %zmm4, %zmm4639; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm3 = zmm3[0],zmm1[0],zmm3[1],zmm1[1],zmm3[2],zmm1[2],zmm3[3],zmm1[3],zmm3[4],zmm1[4],zmm3[5],zmm1[5],zmm3[6],zmm1[6],zmm3[7],zmm1[7],zmm3[16],zmm1[16],zmm3[17],zmm1[17],zmm3[18],zmm1[18],zmm3[19],zmm1[19],zmm3[20],zmm1[20],zmm3[21],zmm1[21],zmm3[22],zmm1[22],zmm3[23],zmm1[23],zmm3[32],zmm1[32],zmm3[33],zmm1[33],zmm3[34],zmm1[34],zmm3[35],zmm1[35],zmm3[36],zmm1[36],zmm3[37],zmm1[37],zmm3[38],zmm1[38],zmm3[39],zmm1[39],zmm3[48],zmm1[48],zmm3[49],zmm1[49],zmm3[50],zmm1[50],zmm3[51],zmm1[51],zmm3[52],zmm1[52],zmm3[53],zmm1[53],zmm3[54],zmm1[54],zmm3[55],zmm1[55]640; AVX512BW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm3, %zmm3 # [128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0]641; AVX512BW-NEXT:    vpsrlw $8, %zmm3, %zmm3642; AVX512BW-NEXT:    vpackuswb %zmm4, %zmm3, %zmm3643; AVX512BW-NEXT:    vpaddb %zmm2, %zmm3, %zmm2644; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm3 = zmm2[8],zmm1[8],zmm2[9],zmm1[9],zmm2[10],zmm1[10],zmm2[11],zmm1[11],zmm2[12],zmm1[12],zmm2[13],zmm1[13],zmm2[14],zmm1[14],zmm2[15],zmm1[15],zmm2[24],zmm1[24],zmm2[25],zmm1[25],zmm2[26],zmm1[26],zmm2[27],zmm1[27],zmm2[28],zmm1[28],zmm2[29],zmm1[29],zmm2[30],zmm1[30],zmm2[31],zmm1[31],zmm2[40],zmm1[40],zmm2[41],zmm1[41],zmm2[42],zmm1[42],zmm2[43],zmm1[43],zmm2[44],zmm1[44],zmm2[45],zmm1[45],zmm2[46],zmm1[46],zmm2[47],zmm1[47],zmm2[56],zmm1[56],zmm2[57],zmm1[57],zmm2[58],zmm1[58],zmm2[59],zmm1[59],zmm2[60],zmm1[60],zmm2[61],zmm1[61],zmm2[62],zmm1[62],zmm2[63],zmm1[63]645; AVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm3, %zmm3646; AVX512BW-NEXT:    vpsrlw $8, %zmm3, %zmm3647; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm2[0],zmm1[0],zmm2[1],zmm1[1],zmm2[2],zmm1[2],zmm2[3],zmm1[3],zmm2[4],zmm1[4],zmm2[5],zmm1[5],zmm2[6],zmm1[6],zmm2[7],zmm1[7],zmm2[16],zmm1[16],zmm2[17],zmm1[17],zmm2[18],zmm1[18],zmm2[19],zmm1[19],zmm2[20],zmm1[20],zmm2[21],zmm1[21],zmm2[22],zmm1[22],zmm2[23],zmm1[23],zmm2[32],zmm1[32],zmm2[33],zmm1[33],zmm2[34],zmm1[34],zmm2[35],zmm1[35],zmm2[36],zmm1[36],zmm2[37],zmm1[37],zmm2[38],zmm1[38],zmm2[39],zmm1[39],zmm2[48],zmm1[48],zmm2[49],zmm1[49],zmm2[50],zmm1[50],zmm2[51],zmm1[51],zmm2[52],zmm1[52],zmm2[53],zmm1[53],zmm2[54],zmm1[54],zmm2[55],zmm1[55]648; AVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1649; AVX512BW-NEXT:    vpsrlw $8, %zmm1, %zmm1650; AVX512BW-NEXT:    vpackuswb %zmm3, %zmm1, %zmm1651; AVX512BW-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm2 # [7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7]652; AVX512BW-NEXT:    vpmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1 # [0,8,0,10,0,12,0,14,0,16,0,18,0,20,0,22,0,24,0,26,0,28,0,30,0,32,0,34,0,36,0,38,0,37,0,35,0,33,0,31,0,29,0,27,0,25,0,23,0,21,0,19,0,17,0,15,0,13,0,11,0,9,0,7]653; AVX512BW-NEXT:    vpsllw $8, %zmm1, %zmm1654; AVX512BW-NEXT:    vpternlogd {{.*#+}} zmm1 = zmm1 | (zmm2 & m32bcst)655; AVX512BW-NEXT:    vpsubb %zmm1, %zmm0, %zmm0656; AVX512BW-NEXT:    retq657  %res = urem <64 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 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31, i8 32, i8 33, i8 34, i8 35, i8 36, i8 37, i8 38, i8 38, i8 37, i8 36, i8 35, i8 34, i8 33, i8 32, i8 31, i8 30, i8 29, i8 28, i8 27, i8 26, i8 25, i8 24, i8 23, 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>658  ret <64 x i8> %res659}660