Cache pointers to tables for speed

This commit is contained in:
Christian Sandberg
2020-06-23 11:51:26 +02:00
parent 3d000933a7
commit 524906517d

View File

@@ -109,6 +109,7 @@ extern "C" {
#define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \ #define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \
do \ do \
{ \ { \
mz_int16 *pTree; \
temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \ temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \
if (temp >= 0) \ if (temp >= 0) \
{ \ { \
@@ -118,10 +119,11 @@ extern "C" {
} \ } \
else if (num_bits > TINFL_FAST_LOOKUP_BITS) \ else if (num_bits > TINFL_FAST_LOOKUP_BITS) \
{ \ { \
pTree = (pHuff)->m_pTree; \
code_len = TINFL_FAST_LOOKUP_BITS; \ code_len = TINFL_FAST_LOOKUP_BITS; \
do \ do \
{ \ { \
temp = (pHuff)->m_pTree[~temp + ((bit_buf >> code_len++) & 1)];\ temp = pTree[~temp + ((bit_buf >> code_len++) & 1)]; \
} while ((temp < 0) && (num_bits >= (code_len + 1))); \ } while ((temp < 0) && (num_bits >= (code_len + 1))); \
if (temp >= 0) \ if (temp >= 0) \
break; \ break; \
@@ -142,6 +144,7 @@ extern "C" {
{ \ { \
int temp; \ int temp; \
mz_uint code_len, c; \ mz_uint code_len, c; \
mz_int16 *pTree; \
if (num_bits < 15) \ if (num_bits < 15) \
{ \ { \
if ((pIn_buf_end - pIn_buf_cur) < 2) \ if ((pIn_buf_end - pIn_buf_cur) < 2) \
@@ -159,10 +162,11 @@ extern "C" {
code_len = temp >> 9, temp &= 511; \ code_len = temp >> 9, temp &= 511; \
else \ else \
{ \ { \
pTree = (pHuff)->m_pTree; \
code_len = TINFL_FAST_LOOKUP_BITS; \ code_len = TINFL_FAST_LOOKUP_BITS; \
do \ do \
{ \ { \
temp = (pHuff)->m_pTree[~temp + ((bit_buf >> code_len++) & 1)]; \ temp = pTree[~temp + ((bit_buf >> code_len++) & 1)]; \
} while (temp < 0); \ } while (temp < 0); \
} \ } \
sym = temp; \ sym = temp; \
@@ -305,13 +309,17 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex
{ {
int tree_next, tree_cur; int tree_next, tree_cur;
tinfl_huff_table *pTable; tinfl_huff_table *pTable;
mz_int16 *pTree;
mz_uint8 *pCode_size;
mz_uint i, j, used_syms, total, sym_index, next_code[17], total_syms[16]; mz_uint i, j, used_syms, total, sym_index, next_code[17], total_syms[16];
pTable = &r->m_tables[r->m_type]; pTable = &r->m_tables[r->m_type];
pTree = pTable->m_pTree;
pCode_size = pTable->m_pCode_size;
MZ_CLEAR_OBJ(total_syms); MZ_CLEAR_OBJ(total_syms);
MZ_CLEAR_OBJ(pTable->m_look_up); MZ_CLEAR_OBJ(pTable->m_look_up);
TINFL_MEMSET(pTable->m_pTree, 0, r->m_table_sizes[r->m_type] * sizeof(pTable->m_pTree[0]) * 2); TINFL_MEMSET(pTree, 0, r->m_table_sizes[r->m_type] * sizeof(pTree[0]) * 2);
for (i = 0; i < r->m_table_sizes[r->m_type]; ++i) for (i = 0; i < r->m_table_sizes[r->m_type]; ++i)
total_syms[pTable->m_pCode_size[i]]++; total_syms[pCode_size[i]]++;
used_syms = 0, total = 0; used_syms = 0, total = 0;
next_code[0] = next_code[1] = 0; next_code[0] = next_code[1] = 0;
for (i = 1; i <= 15; ++i) for (i = 1; i <= 15; ++i)
@@ -325,7 +333,7 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex
} }
for (tree_next = -1, sym_index = 0; sym_index < r->m_table_sizes[r->m_type]; ++sym_index) for (tree_next = -1, sym_index = 0; sym_index < r->m_table_sizes[r->m_type]; ++sym_index)
{ {
mz_uint rev_code = 0, l, cur_code, code_size = pTable->m_pCode_size[sym_index]; mz_uint rev_code = 0, l, cur_code, code_size = pCode_size[sym_index];
if (!code_size) if (!code_size)
continue; continue;
cur_code = next_code[code_size]++; cur_code = next_code[code_size]++;
@@ -351,17 +359,17 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_nex
for (j = code_size; j > (TINFL_FAST_LOOKUP_BITS + 1); j--) for (j = code_size; j > (TINFL_FAST_LOOKUP_BITS + 1); j--)
{ {
tree_cur -= ((rev_code >>= 1) & 1); tree_cur -= ((rev_code >>= 1) & 1);
if (!pTable->m_pTree[-tree_cur - 1]) if (!pTree[-tree_cur - 1])
{ {
pTable->m_pTree[-tree_cur - 1] = (mz_int16)tree_next; pTree[-tree_cur - 1] = (mz_int16)tree_next;
tree_cur = tree_next; tree_cur = tree_next;
tree_next -= 2; tree_next -= 2;
} }
else else
tree_cur = pTable->m_pTree[-tree_cur - 1]; tree_cur = pTree[-tree_cur - 1];
} }
tree_cur -= ((rev_code >>= 1) & 1); tree_cur -= ((rev_code >>= 1) & 1);
pTable->m_pTree[-tree_cur - 1] = (mz_int16)sym_index; pTree[-tree_cur - 1] = (mz_int16)sym_index;
} }
if (r->m_type == 2) if (r->m_type == 2)
{ {