]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
Optimize zng_emit_dist by removing base and instead adding mask to extra tables
authorHans Kristian Rosbach <hk-git@circlestorm.org>
Thu, 16 Jul 2026 13:07:05 +0000 (15:07 +0200)
committerHans Kristian Rosbach <hk-github@circlestorm.org>
Mon, 20 Jul 2026 20:06:31 +0000 (22:06 +0200)
trees_emit.h
trees_tbl.h
utils/maketrees.c

index a182c0a117d7c0cc0485369cfde0fdb1c5ddbc9e..a398b2f2efa9eb4676bc1f6704391b4ad8af3d4b 100644 (file)
@@ -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);
index 16a47450b77001df6be8de17ae320eaac1444c5b..7771cfb2f6452d41da075b26b1ddd0e5ee273422 100644 (file)
@@ -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_ */
index 786f4fbee901835d489b41f3f14be996675af99b..00e01a7c886e5dbbc401ea78c9eb75dd617e04c1 100644 (file)
@@ -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");