From: Hans Kristian Rosbach Date: Thu, 16 Jul 2026 13:07:05 +0000 (+0200) Subject: Optimize zng_emit_dist by removing base and instead adding mask to extra tables X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bc4cbfdfb9b1673c2dbfabfe1f7369b623afcafb;p=thirdparty%2Fzlib-ng.git Optimize zng_emit_dist by removing base and instead adding mask to extra tables --- diff --git a/trees_emit.h b/trees_emit.h index a182c0a11..a398b2f2e 100644 --- a/trees_emit.h +++ b/trees_emit.h @@ -17,9 +17,9 @@ extern Z_INTERNAL const ct_data static_dtree[D_CODES]; extern const unsigned char Z_INTERNAL zng_dist_code[DIST_CODE_LEN]; extern const unsigned char Z_INTERNAL zng_length_code[STD_MAX_MATCH-STD_MIN_MATCH+1]; -/* Combined base + extra_bits tables for single-lookup optimization */ -extern Z_INTERNAL const uint16_t lbase_extra[LENGTH_CODES]; -extern Z_INTERNAL const uint32_t dbase_extra[D_CODES]; +/* Combined mask + extra_bits tables for single-lookup optimization */ +extern Z_INTERNAL const uint16_t lmask_extra[LENGTH_CODES]; +extern Z_INTERNAL const uint32_t dmask_extra[D_CODES]; /* Bit buffer and deflate code stderr tracing */ #ifdef ZLIB_DEBUG @@ -115,10 +115,10 @@ static inline void zng_emit_lit(deflate_state *s, const ct_data *ltree, unsigned */ static inline uint32_t zng_emit_dist(deflate_state *s, const ct_data *ltree, const ct_data *dtree, uint32_t lc, uint32_t dist, uint64_t *bi_buf, uint32_t *bi_valid) { - uint32_t c, extra, lext; - uint8_t code; uint64_t match_bits; uint32_t match_bits_len; + uint32_t c, extra, lext, mask; + uint8_t code; /* 1. Process Length Code */ code = zng_length_code[lc]; @@ -130,14 +130,13 @@ static inline uint32_t zng_emit_dist(deflate_state *s, const ct_data *ltree, con match_bits = ltree[c].Code; match_bits_len = ltree[c].Len; - /* 2. Get extra bits count and subtract base length */ - lext = lbase_extra[code]; + /* 2. Get extra bits count and mask */ + lext = lmask_extra[code]; extra = lext >> 8; - lc -= lext & 0xff; + mask = lext & 0xff; /* Send length extra bits */ - uint32_t l_mask = (1U << extra) - 1; - match_bits |= (uint64_t)(lc & l_mask) << match_bits_len; + match_bits |= (uint64_t)(lc & mask) << match_bits_len; match_bits_len += extra; /* 3. Process Distance Code */ @@ -150,14 +149,13 @@ static inline uint32_t zng_emit_dist(deflate_state *s, const ct_data *ltree, con match_bits |= ((uint64_t)dtree[code].Code << match_bits_len); match_bits_len += dtree[code].Len; - /* 4. Get extra bits count and subtract base distance */ - lext = dbase_extra[code]; + /* 4. Get extra bits count and mask */ + lext = dmask_extra[code]; extra = lext >> 16; - dist -= lext & 0xffff; + mask = lext & 0xffff; /* Send dist extra bits */ - uint32_t d_mask = (1U << extra) - 1; - match_bits |= ((uint64_t)(dist & d_mask) << match_bits_len); + match_bits |= ((uint64_t)(dist & mask) << match_bits_len); match_bits_len += extra; send_bits(s, match_bits, match_bits_len, *bi_buf, *bi_valid); diff --git a/trees_tbl.h b/trees_tbl.h index 16a47450b..7771cfb2f 100644 --- a/trees_tbl.h +++ b/trees_tbl.h @@ -118,33 +118,33 @@ const unsigned char Z_INTERNAL zng_length_code[STD_MAX_MATCH-STD_MIN_MATCH+1] = 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 }; -/* Combined base + extra_bits tables for single-lookup optimization. - * Length table: bits 0-7 = base_length, bits 8-11 = extra_lbits - * Distance table: bits 0-15 = base_dist, bits 16-19 = extra_dbits +/* Combined mask + extra_bits tables for single-lookup optimization. + * Length table: bits 0-7 = mask, bits 8-11 = extra_lbits + * Distance table: bits 0-15 = mask, bits 16-19 = extra_dbits */ -#define LBASE_EXTRA(base, extra) ((extra) << 8 | (base)) -#define DBASE_EXTRA(base, extra) ((extra) << 16 | (base)) +#define LMASK_EXTRA(mask, extra) ((extra) << 8 | (mask)) +#define DMASK_EXTRA(mask, extra) ((extra) << 16 | (mask)) -Z_INTERNAL const uint16_t lbase_extra[LENGTH_CODES] = { -LBASE_EXTRA( 0, 0), LBASE_EXTRA( 1, 0), LBASE_EXTRA( 2, 0), LBASE_EXTRA( 3, 0), -LBASE_EXTRA( 4, 0), LBASE_EXTRA( 5, 0), LBASE_EXTRA( 6, 0), LBASE_EXTRA( 7, 0), -LBASE_EXTRA( 8, 1), LBASE_EXTRA( 10, 1), LBASE_EXTRA( 12, 1), LBASE_EXTRA( 14, 1), -LBASE_EXTRA( 16, 2), LBASE_EXTRA( 20, 2), LBASE_EXTRA( 24, 2), LBASE_EXTRA( 28, 2), -LBASE_EXTRA( 32, 3), LBASE_EXTRA( 40, 3), LBASE_EXTRA( 48, 3), LBASE_EXTRA( 56, 3), -LBASE_EXTRA( 64, 4), LBASE_EXTRA( 80, 4), LBASE_EXTRA( 96, 4), LBASE_EXTRA(112, 4), -LBASE_EXTRA(128, 5), LBASE_EXTRA(160, 5), LBASE_EXTRA(192, 5), LBASE_EXTRA(224, 5), -LBASE_EXTRA( 0, 0) +Z_INTERNAL const uint16_t lmask_extra[LENGTH_CODES] = { +LMASK_EXTRA( 0, 0), LMASK_EXTRA( 0, 0), LMASK_EXTRA( 0, 0), LMASK_EXTRA( 0, 0), +LMASK_EXTRA( 0, 0), LMASK_EXTRA( 0, 0), LMASK_EXTRA( 0, 0), LMASK_EXTRA( 0, 0), +LMASK_EXTRA( 1, 1), LMASK_EXTRA( 1, 1), LMASK_EXTRA( 1, 1), LMASK_EXTRA( 1, 1), +LMASK_EXTRA( 3, 2), LMASK_EXTRA( 3, 2), LMASK_EXTRA( 3, 2), LMASK_EXTRA( 3, 2), +LMASK_EXTRA( 7, 3), LMASK_EXTRA( 7, 3), LMASK_EXTRA( 7, 3), LMASK_EXTRA( 7, 3), +LMASK_EXTRA( 15, 4), LMASK_EXTRA( 15, 4), LMASK_EXTRA( 15, 4), LMASK_EXTRA( 15, 4), +LMASK_EXTRA( 31, 5), LMASK_EXTRA( 31, 5), LMASK_EXTRA( 31, 5), LMASK_EXTRA( 31, 5), +LMASK_EXTRA( 0, 0) }; -Z_INTERNAL const uint32_t dbase_extra[D_CODES] = { -DBASE_EXTRA( 0, 0), DBASE_EXTRA( 1, 0), DBASE_EXTRA( 2, 0), DBASE_EXTRA( 3, 0), -DBASE_EXTRA( 4, 1), DBASE_EXTRA( 6, 1), DBASE_EXTRA( 8, 2), DBASE_EXTRA( 12, 2), -DBASE_EXTRA( 16, 3), DBASE_EXTRA( 24, 3), DBASE_EXTRA( 32, 4), DBASE_EXTRA( 48, 4), -DBASE_EXTRA( 64, 5), DBASE_EXTRA( 96, 5), DBASE_EXTRA( 128, 6), DBASE_EXTRA( 192, 6), -DBASE_EXTRA( 256, 7), DBASE_EXTRA( 384, 7), DBASE_EXTRA( 512, 8), DBASE_EXTRA( 768, 8), -DBASE_EXTRA( 1024, 9), DBASE_EXTRA( 1536, 9), DBASE_EXTRA( 2048, 10), DBASE_EXTRA( 3072, 10), -DBASE_EXTRA( 4096, 11), DBASE_EXTRA( 6144, 11), DBASE_EXTRA( 8192, 12), DBASE_EXTRA(12288, 12), -DBASE_EXTRA(16384, 13), DBASE_EXTRA(24576, 13) +Z_INTERNAL const uint32_t dmask_extra[D_CODES] = { +DMASK_EXTRA( 0, 0), DMASK_EXTRA( 0, 0), DMASK_EXTRA( 0, 0), DMASK_EXTRA( 0, 0), +DMASK_EXTRA( 1, 1), DMASK_EXTRA( 1, 1), DMASK_EXTRA( 3, 2), DMASK_EXTRA( 3, 2), +DMASK_EXTRA( 7, 3), DMASK_EXTRA( 7, 3), DMASK_EXTRA( 15, 4), DMASK_EXTRA( 15, 4), +DMASK_EXTRA( 31, 5), DMASK_EXTRA( 31, 5), DMASK_EXTRA( 63, 6), DMASK_EXTRA( 63, 6), +DMASK_EXTRA( 127, 7), DMASK_EXTRA( 127, 7), DMASK_EXTRA( 255, 8), DMASK_EXTRA( 255, 8), +DMASK_EXTRA( 511, 9), DMASK_EXTRA( 511, 9), DMASK_EXTRA( 1023, 10), DMASK_EXTRA( 1023, 10), +DMASK_EXTRA( 2047, 11), DMASK_EXTRA( 2047, 11), DMASK_EXTRA( 4095, 12), DMASK_EXTRA( 4095, 12), +DMASK_EXTRA( 8191, 13), DMASK_EXTRA( 8191, 13) }; #endif /* TREES_TBL_H_ */ diff --git a/utils/maketrees.c b/utils/maketrees.c index 786f4fbee..00e01a7c8 100644 --- a/utils/maketrees.c +++ b/utils/maketrees.c @@ -126,21 +126,23 @@ static void gen_trees_header(void) { printf("%2u%s", length_code[i], SEPARATOR(i, STD_MAX_MATCH-STD_MIN_MATCH, 20)); } - printf("/* Combined base + extra_bits tables for single-lookup optimization.\n"); - printf(" * Length table: bits 0-7 = base_length, bits 8-11 = extra_lbits\n"); - printf(" * Distance table: bits 0-15 = base_dist, bits 16-19 = extra_dbits\n"); + printf("/* Combined mask + extra_bits tables for single-lookup optimization.\n"); + printf(" * Length table: bits 0-7 = mask, bits 8-11 = extra_lbits\n"); + printf(" * Distance table: bits 0-15 = mask, bits 16-19 = extra_dbits\n"); printf(" */\n"); - printf("#define LBASE_EXTRA(base, extra) ((extra) << 8 | (base))\n"); - printf("#define DBASE_EXTRA(base, extra) ((extra) << 16 | (base))\n\n"); + printf("#define LMASK_EXTRA(mask, extra) ((extra) << 8 | (mask))\n"); + printf("#define DMASK_EXTRA(mask, extra) ((extra) << 16 | (mask))\n\n"); - printf("Z_INTERNAL const uint16_t lbase_extra[LENGTH_CODES] = {\n"); + printf("Z_INTERNAL const uint16_t lmask_extra[LENGTH_CODES] = {\n"); for (i = 0; i < LENGTH_CODES; i++) { - printf("LBASE_EXTRA(%3d, %d)%s", base_length[i], extra_lbits[i], SEPARATOR(i, LENGTH_CODES-1, 4)); + uint8_t mask = (1U << extra_lbits[i]) - 1; + printf("LMASK_EXTRA(%3u, %u)%s", mask, extra_lbits[i], SEPARATOR(i, LENGTH_CODES-1, 4)); } - printf("Z_INTERNAL const uint32_t dbase_extra[D_CODES] = {\n"); + printf("Z_INTERNAL const uint32_t dmask_extra[D_CODES] = {\n"); for (i = 0; i < D_CODES; i++) { - printf("DBASE_EXTRA(%5d, %2d)%s", base_dist[i], extra_dbits[i], SEPARATOR(i, D_CODES-1, 4)); + uint16_t mask = (1U << extra_dbits[i]) - 1; + printf("DMASK_EXTRA(%5u, %2u)%s", mask, extra_dbits[i], SEPARATOR(i, D_CODES-1, 4)); } printf("#endif /* TREES_TBL_H_ */\n");