Skip to content

Commit 8965584

Browse files
committed
igzip: Implement large hash table method as level 2
Move current level 2 compression to be level 3 and create a level 2 compression which is the same algorithm as level 1 but with a larger hashtable. Change-Id: I398a6017c2ff218dded24e229fb51c23ea69f314 Signed-off-by: Roy Oursler <[email protected]>
1 parent 7a12bcb commit 8965584

17 files changed

+470
-138
lines changed

Makefile.nmake

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,7 @@ objs = \
120120
bin\encode_df.obj \
121121
bin\encode_df_04.obj \
122122
bin\proc_heap.obj \
123-
bin\igzip_icf_body_h1_gr_bt_01.obj \
124-
bin\igzip_icf_body_h1_gr_bt_02.obj \
125-
bin\igzip_icf_body_h1_gr_bt_04.obj \
123+
bin\igzip_icf_body_h1_gr_bt.obj \
126124
bin\igzip_icf_finish.obj \
127125
bin\igzip_icf_base.obj \
128126
bin\igzip_inflate.obj \

igzip/Makefile.am

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,7 @@ lsrc_x86_64 += igzip/igzip_body_01.asm \
4343
igzip/igzip_body_02.asm \
4444
igzip/igzip_body_04.asm \
4545
igzip/igzip_finish.asm \
46-
igzip/igzip_icf_body_h1_gr_bt_01.asm \
47-
igzip/igzip_icf_body_h1_gr_bt_02.asm \
48-
igzip/igzip_icf_body_h1_gr_bt_04.asm \
46+
igzip/igzip_icf_body_h1_gr_bt.asm \
4947
igzip/igzip_icf_finish.asm \
5048
igzip/rfc1951_lookup.asm \
5149
igzip/crc32_gzip.asm igzip/detect_repeated_char.asm \
@@ -82,7 +80,6 @@ other_src += igzip/bitbuf2.asm \
8280
igzip/data_struct2.asm \
8381
igzip/inflate_data_structs.asm \
8482
igzip/igzip_body.asm \
85-
igzip/igzip_icf_body_h1_gr_bt.asm \
8683
igzip/igzip_finish.asm \
8784
igzip/lz0a_const.asm \
8885
igzip/options.asm \

igzip/huff_codes.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,13 @@
7777
#define INVALID_HUFFCODE 1
7878

7979
#define HASH8K_HASH_MASK (IGZIP_HASH8K_HASH_SIZE - 1)
80+
#define HASH_HIST_HASH_MASK (IGZIP_HASH_HIST_SIZE - 1)
8081
#define HASH_MAP_HASH_MASK (IGZIP_HASH_MAP_HASH_SIZE - 1)
8182

8283
#define LVL0_HASH_MASK (IGZIP_LVL0_HASH_SIZE - 1)
8384
#define LVL1_HASH_MASK (IGZIP_LVL1_HASH_SIZE - 1)
8485
#define LVL2_HASH_MASK (IGZIP_LVL2_HASH_SIZE - 1)
86+
#define LVL3_HASH_MASK (IGZIP_LVL3_HASH_SIZE - 1)
8587
#define SHORTEST_MATCH 4
8688

8789
#define LENGTH_BITS 5

igzip/igzip.c

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
extern void isal_deflate_hash_lvl0(uint16_t *, uint32_t, uint32_t, uint8_t *, uint32_t);
6868
extern void isal_deflate_hash_lvl1(uint16_t *, uint32_t, uint32_t, uint8_t *, uint32_t);
6969
extern void isal_deflate_hash_lvl2(uint16_t *, uint32_t, uint32_t, uint8_t *, uint32_t);
70+
extern void isal_deflate_hash_lvl3(uint16_t *, uint32_t, uint32_t, uint8_t *, uint32_t);
7071
extern const uint8_t gzip_hdr[];
7172
extern const uint32_t gzip_hdr_bytes;
7273
extern const uint32_t gzip_trl_bytes;
@@ -95,6 +96,7 @@ void isal_deflate_finish(struct isal_zstream *stream);
9596
void isal_deflate_icf_body(struct isal_zstream *stream);
9697
void isal_deflate_icf_finish_lvl1(struct isal_zstream *stream);
9798
void isal_deflate_icf_finish_lvl2(struct isal_zstream *stream);
99+
void isal_deflate_icf_finish_lvl3(struct isal_zstream *stream);
98100
/*****************************************************************/
99101

100102
/* Forward declarations */
@@ -253,6 +255,11 @@ static int check_level_req(struct isal_zstream *stream)
253255
return ISAL_INVALID_LEVEL_BUF;
254256

255257
switch (stream->level) {
258+
case 3:
259+
if (stream->level_buf_size < ISAL_DEF_LVL3_MIN)
260+
return ISAL_INVALID_LEVEL;
261+
break;
262+
256263
case 2:
257264
if (stream->level_buf_size < ISAL_DEF_LVL2_MIN)
258265
return ISAL_INVALID_LEVEL;
@@ -276,6 +283,14 @@ static int init_hash8k_buf(struct isal_zstream *stream)
276283
return sizeof(struct level_buf) - MAX_LVL_BUF_SIZE + sizeof(level_buf->hash8k);
277284
}
278285

286+
static int init_hash_hist_buf(struct isal_zstream *stream)
287+
{
288+
struct isal_zstate *state = &stream->internal_state;
289+
struct level_buf *level_buf = (struct level_buf *)stream->level_buf;
290+
state->has_level_buf_init = 1;
291+
return sizeof(struct level_buf) - MAX_LVL_BUF_SIZE + sizeof(level_buf->hash_hist);
292+
}
293+
279294
static int init_hash_map_buf(struct isal_zstream *stream)
280295
{
281296
struct isal_zstate *state = &stream->internal_state;
@@ -294,8 +309,10 @@ static int init_hash_map_buf(struct isal_zstream *stream)
294309
static int init_lvlX_buf(struct isal_zstream *stream)
295310
{
296311
switch (stream->level) {
297-
case 2:
312+
case 3:
298313
return init_hash_map_buf(stream);
314+
case 2:
315+
return init_hash_hist_buf(stream);
299316
default:
300317
return init_hash8k_buf(stream);
301318
}
@@ -339,8 +356,10 @@ static int are_buffers_empty(struct isal_zstream *stream)
339356
{
340357

341358
switch (stream->level) {
342-
case 2:
359+
case 3:
343360
return are_buffers_empty_hash_map(stream);
361+
case 2:
362+
return are_buffers_empty_hashX(stream);
344363
default:
345364
return are_buffers_empty_hashX(stream);
346365
}
@@ -455,6 +474,9 @@ static void isal_deflate_pass(struct isal_zstream *stream)
455474
static void isal_deflate_icf_finish(struct isal_zstream *stream)
456475
{
457476
switch (stream->level) {
477+
case 3:
478+
isal_deflate_icf_finish_lvl3(stream);
479+
break;
458480
case 2:
459481
isal_deflate_icf_finish_lvl2(stream);
460482
break;
@@ -855,6 +877,11 @@ static inline void reset_match_history(struct isal_zstream *stream)
855877
int i = 0;
856878

857879
switch (stream->level) {
880+
case 3:
881+
hash_table = level_buf->lvl3.hash_table;
882+
hash_table_size = sizeof(level_buf->lvl3.hash_table);
883+
break;
884+
858885
case 2:
859886
hash_table = level_buf->lvl2.hash_table;
860887
hash_table_size = sizeof(level_buf->lvl2.hash_table);
@@ -992,14 +1019,22 @@ void isal_deflate_hash(struct isal_zstream *stream, uint8_t * dict, uint32_t dic
9921019
* dictionary must set at least 1 element in the history */
9931020
struct level_buf *level_buf = (struct level_buf *)stream->level_buf;
9941021
switch (stream->level) {
1022+
case 3:
1023+
memset(level_buf->lvl3.hash_table, -1, sizeof(level_buf->lvl3.hash_table));
1024+
isal_deflate_hash_lvl3(level_buf->lvl3.hash_table, LVL3_HASH_MASK,
1025+
stream->total_in, dict, dict_len);
1026+
break;
1027+
9951028
case 2:
9961029
memset(level_buf->lvl2.hash_table, -1, sizeof(level_buf->lvl2.hash_table));
9971030
isal_deflate_hash_lvl2(level_buf->lvl2.hash_table, LVL2_HASH_MASK,
9981031
stream->total_in, dict, dict_len);
1032+
break;
9991033
case 1:
10001034
memset(level_buf->lvl1.hash_table, -1, sizeof(level_buf->lvl1.hash_table));
10011035
isal_deflate_hash_lvl1(level_buf->lvl1.hash_table, LVL1_HASH_MASK,
10021036
stream->total_in, dict, dict_len);
1037+
break;
10031038
default:
10041039
memset(stream->internal_state.head, -1, sizeof(stream->internal_state.head));
10051040
isal_deflate_hash_lvl0(stream->internal_state.head, LVL0_HASH_MASK,

igzip/igzip_base_aliases.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ void isal_deflate_body_base(struct isal_zstream *stream);
3636
void isal_deflate_finish_base(struct isal_zstream *stream);
3737
void isal_deflate_icf_body_base(struct isal_zstream *stream);
3838
void isal_deflate_icf_body_hash8k_base(struct isal_zstream *stream);
39+
void isal_deflate_icf_body_hash_hist_base(struct isal_zstream *stream);
3940
void isal_deflate_icf_finish_hash8k_base(struct isal_zstream *stream);
41+
void isal_deflate_icf_finish_hash_hist_base(struct isal_zstream *stream);
4042
void isal_deflate_icf_finish_hash_map_base(struct isal_zstream *stream);
4143
void isal_update_histogram_base(uint8_t * start_stream, int length,
4244
struct isal_huff_histogram *histogram);
@@ -74,12 +76,22 @@ void isal_deflate_icf_body_lvl1(struct isal_zstream *stream)
7476
isal_deflate_icf_body_hash8k_base(stream);
7577
}
7678

79+
void isal_deflate_icf_body_lvl2(struct isal_zstream *stream)
80+
{
81+
isal_deflate_icf_body_hash_hist_base(stream);
82+
}
83+
7784
void isal_deflate_icf_finish_lvl1(struct isal_zstream *stream)
7885
{
7986
isal_deflate_icf_finish_hash8k_base(stream);
8087
}
8188

8289
void isal_deflate_icf_finish_lvl2(struct isal_zstream *stream)
90+
{
91+
isal_deflate_icf_finish_hash_hist_base(stream);
92+
}
93+
94+
void isal_deflate_icf_finish_lvl3(struct isal_zstream *stream)
8395
{
8496
isal_deflate_icf_finish_hash_map_base(stream);
8597
}
@@ -130,6 +142,12 @@ void isal_deflate_hash_lvl2(uint16_t * hash_table, uint32_t hash_mask,
130142
isal_deflate_hash_base(hash_table, hash_mask, current_index, dict, dict_len);
131143
}
132144

145+
void isal_deflate_hash_lvl3(uint16_t * hash_table, uint32_t hash_mask,
146+
uint32_t current_index, uint8_t * dict, uint32_t dict_len)
147+
{
148+
isal_deflate_hash_base(hash_table, hash_mask, current_index, dict, dict_len);
149+
}
150+
133151
void set_long_icf_fg(uint8_t * next_in, uint8_t * end_in,
134152
struct deflate_icf *match_lookup, struct level_buf *level_buf)
135153
{

0 commit comments

Comments
 (0)