101dfbcc4SRoy Oursler #include <stdint.h>
201dfbcc4SRoy Oursler #include "igzip_lib.h"
301dfbcc4SRoy Oursler #include "huffman.h"
401dfbcc4SRoy Oursler #include "huff_codes.h"
501dfbcc4SRoy Oursler #include "encode_df.h"
601dfbcc4SRoy Oursler #include "igzip_level_buf_structs.h"
75be1ba22SRoy Oursler #include "unaligned.h"
801dfbcc4SRoy Oursler
9*55fbfabfSMarcel Cornu static inline void
write_deflate_icf(struct deflate_icf * icf,uint32_t lit_len,uint32_t lit_dist,uint32_t extra_bits)10*55fbfabfSMarcel Cornu write_deflate_icf(struct deflate_icf *icf, uint32_t lit_len, uint32_t lit_dist, uint32_t extra_bits)
1101dfbcc4SRoy Oursler {
1201dfbcc4SRoy Oursler icf->lit_len = lit_len;
1301dfbcc4SRoy Oursler icf->lit_dist = lit_dist;
1401dfbcc4SRoy Oursler icf->dist_extra = extra_bits;
1501dfbcc4SRoy Oursler }
1601dfbcc4SRoy Oursler
17*55fbfabfSMarcel Cornu static inline void
update_state(struct isal_zstream * stream,uint8_t * start_in,uint8_t * next_in,uint8_t * end_in,struct deflate_icf * start_out,struct deflate_icf * next_out,struct deflate_icf * end_out)18*55fbfabfSMarcel Cornu update_state(struct isal_zstream *stream, uint8_t *start_in, uint8_t *next_in, uint8_t *end_in,
1901dfbcc4SRoy Oursler struct deflate_icf *start_out, struct deflate_icf *next_out,
2001dfbcc4SRoy Oursler struct deflate_icf *end_out)
2101dfbcc4SRoy Oursler {
22fe68f02dSRoy Oursler struct level_buf *level_buf = (struct level_buf *) stream->level_buf;
23fe68f02dSRoy Oursler
2449156c35SRoy Oursler if (next_in - start_in > 0)
2549156c35SRoy Oursler stream->internal_state.has_hist = IGZIP_HIST;
2649156c35SRoy Oursler
2701dfbcc4SRoy Oursler stream->next_in = next_in;
2801dfbcc4SRoy Oursler stream->total_in += next_in - start_in;
2949156c35SRoy Oursler stream->internal_state.block_end = stream->total_in;
3001dfbcc4SRoy Oursler stream->avail_in = end_in - next_in;
3101dfbcc4SRoy Oursler
32fe68f02dSRoy Oursler level_buf->icf_buf_next = next_out;
33fe68f02dSRoy Oursler level_buf->icf_buf_avail_out = end_out - next_out;
3401dfbcc4SRoy Oursler }
3501dfbcc4SRoy Oursler
36*55fbfabfSMarcel Cornu void
isal_deflate_icf_body_hash_hist_base(struct isal_zstream * stream)37*55fbfabfSMarcel Cornu isal_deflate_icf_body_hash_hist_base(struct isal_zstream *stream)
388965584aSRoy Oursler {
398965584aSRoy Oursler uint32_t literal, hash;
408965584aSRoy Oursler uint8_t *start_in, *next_in, *end_in, *end, *next_hash;
418965584aSRoy Oursler struct deflate_icf *start_out, *next_out, *end_out;
428965584aSRoy Oursler uint16_t match_length;
438965584aSRoy Oursler uint32_t dist;
448965584aSRoy Oursler uint32_t code, code2, extra_bits;
458965584aSRoy Oursler struct isal_zstate *state = &stream->internal_state;
468965584aSRoy Oursler struct level_buf *level_buf = (struct level_buf *) stream->level_buf;
478965584aSRoy Oursler uint16_t *last_seen = level_buf->hash_hist.hash_table;
4853b92e83SRoy Oursler uint8_t *file_start = (uint8_t *) ((uintptr_t) stream->next_in - stream->total_in);
496317ce2bSRoy Oursler uint32_t hist_size = state->dist_mask;
5003bef684SRoy Oursler uint32_t hash_mask = state->hash_mask;
518965584aSRoy Oursler
528965584aSRoy Oursler if (stream->avail_in == 0) {
538965584aSRoy Oursler if (stream->end_of_stream || stream->flush != NO_FLUSH)
548965584aSRoy Oursler state->state = ZSTATE_FLUSH_READ_BUFFER;
558965584aSRoy Oursler return;
568965584aSRoy Oursler }
578965584aSRoy Oursler
588965584aSRoy Oursler start_in = stream->next_in;
598965584aSRoy Oursler end_in = start_in + stream->avail_in;
608965584aSRoy Oursler next_in = start_in;
618965584aSRoy Oursler
628965584aSRoy Oursler start_out = ((struct level_buf *) stream->level_buf)->icf_buf_next;
63*55fbfabfSMarcel Cornu end_out = start_out + ((struct level_buf *) stream->level_buf)->icf_buf_avail_out /
648965584aSRoy Oursler sizeof(struct deflate_icf);
658965584aSRoy Oursler next_out = start_out;
668965584aSRoy Oursler
678965584aSRoy Oursler while (next_in + ISAL_LOOK_AHEAD < end_in) {
688965584aSRoy Oursler
698965584aSRoy Oursler if (next_out >= end_out) {
708965584aSRoy Oursler state->state = ZSTATE_CREATE_HDR;
718965584aSRoy Oursler update_state(stream, start_in, next_in, end_in, start_out, next_out,
728965584aSRoy Oursler end_out);
738965584aSRoy Oursler return;
748965584aSRoy Oursler }
758965584aSRoy Oursler
76d3cfb2fbSIlya Leoshkevich literal = load_le_u32(next_in);
7703bef684SRoy Oursler hash = compute_hash(literal) & hash_mask;
788965584aSRoy Oursler dist = (next_in - file_start - last_seen[hash]) & 0xFFFF;
798965584aSRoy Oursler last_seen[hash] = (uint64_t) (next_in - file_start);
808965584aSRoy Oursler
818965584aSRoy Oursler /* The -1 are to handle the case when dist = 0 */
826317ce2bSRoy Oursler if (dist - 1 < hist_size) {
838965584aSRoy Oursler assert(dist != 0);
848965584aSRoy Oursler
858965584aSRoy Oursler match_length = compare258(next_in - dist, next_in, 258);
868965584aSRoy Oursler
878965584aSRoy Oursler if (match_length >= SHORTEST_MATCH) {
888965584aSRoy Oursler next_hash = next_in;
898965584aSRoy Oursler #ifdef ISAL_LIMIT_HASH_UPDATE
908965584aSRoy Oursler end = next_hash + 3;
918965584aSRoy Oursler #else
928965584aSRoy Oursler end = next_hash + match_length;
938965584aSRoy Oursler #endif
948965584aSRoy Oursler next_hash++;
958965584aSRoy Oursler
968965584aSRoy Oursler for (; next_hash < end; next_hash++) {
97d3cfb2fbSIlya Leoshkevich literal = load_le_u32(next_hash);
9803bef684SRoy Oursler hash = compute_hash(literal) & hash_mask;
998965584aSRoy Oursler last_seen[hash] = (uint64_t) (next_hash - file_start);
1008965584aSRoy Oursler }
1018965584aSRoy Oursler
1028965584aSRoy Oursler get_len_icf_code(match_length, &code);
1038965584aSRoy Oursler get_dist_icf_code(dist, &code2, &extra_bits);
1048965584aSRoy Oursler
1058965584aSRoy Oursler level_buf->hist.ll_hist[code]++;
1068965584aSRoy Oursler level_buf->hist.d_hist[code2]++;
1078965584aSRoy Oursler
1088965584aSRoy Oursler write_deflate_icf(next_out, code, code2, extra_bits);
1098965584aSRoy Oursler next_out++;
1108965584aSRoy Oursler next_in += match_length;
1118965584aSRoy Oursler
1128965584aSRoy Oursler continue;
1138965584aSRoy Oursler }
1148965584aSRoy Oursler }
1158965584aSRoy Oursler
1168965584aSRoy Oursler get_lit_icf_code(literal & 0xFF, &code);
1178965584aSRoy Oursler level_buf->hist.ll_hist[code]++;
1188965584aSRoy Oursler write_deflate_icf(next_out, code, NULL_DIST_SYM, 0);
1198965584aSRoy Oursler next_out++;
1208965584aSRoy Oursler next_in++;
1218965584aSRoy Oursler }
1228965584aSRoy Oursler
1238965584aSRoy Oursler update_state(stream, start_in, next_in, end_in, start_out, next_out, end_out);
1248965584aSRoy Oursler
1258965584aSRoy Oursler assert(stream->avail_in <= ISAL_LOOK_AHEAD);
1268965584aSRoy Oursler if (stream->end_of_stream || stream->flush != NO_FLUSH)
1278965584aSRoy Oursler state->state = ZSTATE_FLUSH_READ_BUFFER;
1288965584aSRoy Oursler
1298965584aSRoy Oursler return;
1308965584aSRoy Oursler }
1318965584aSRoy Oursler
132*55fbfabfSMarcel Cornu void
isal_deflate_icf_finish_hash_hist_base(struct isal_zstream * stream)133*55fbfabfSMarcel Cornu isal_deflate_icf_finish_hash_hist_base(struct isal_zstream *stream)
1348965584aSRoy Oursler {
1358965584aSRoy Oursler uint32_t literal = 0, hash;
1368965584aSRoy Oursler uint8_t *start_in, *next_in, *end_in, *end, *next_hash;
1378965584aSRoy Oursler struct deflate_icf *start_out, *next_out, *end_out;
1388965584aSRoy Oursler uint16_t match_length;
1398965584aSRoy Oursler uint32_t dist;
1408965584aSRoy Oursler uint32_t code, code2, extra_bits;
1418965584aSRoy Oursler struct isal_zstate *state = &stream->internal_state;
1428965584aSRoy Oursler struct level_buf *level_buf = (struct level_buf *) stream->level_buf;
1438965584aSRoy Oursler uint16_t *last_seen = level_buf->hash_hist.hash_table;
14453b92e83SRoy Oursler uint8_t *file_start = (uint8_t *) ((uintptr_t) stream->next_in - stream->total_in);
1456317ce2bSRoy Oursler uint32_t hist_size = state->dist_mask;
14603bef684SRoy Oursler uint32_t hash_mask = state->hash_mask;
1478965584aSRoy Oursler
1488965584aSRoy Oursler start_in = stream->next_in;
1498965584aSRoy Oursler end_in = start_in + stream->avail_in;
1508965584aSRoy Oursler next_in = start_in;
1518965584aSRoy Oursler
1528965584aSRoy Oursler start_out = ((struct level_buf *) stream->level_buf)->icf_buf_next;
1538965584aSRoy Oursler end_out = start_out + ((struct level_buf *) stream->level_buf)->icf_buf_avail_out /
1548965584aSRoy Oursler sizeof(struct deflate_icf);
1558965584aSRoy Oursler next_out = start_out;
1568965584aSRoy Oursler
1578965584aSRoy Oursler if (stream->avail_in == 0) {
1588965584aSRoy Oursler if (stream->end_of_stream || stream->flush != NO_FLUSH)
1598965584aSRoy Oursler state->state = ZSTATE_CREATE_HDR;
1608965584aSRoy Oursler return;
1618965584aSRoy Oursler }
1628965584aSRoy Oursler
1638965584aSRoy Oursler while (next_in + 3 < end_in) {
1648965584aSRoy Oursler if (next_out >= end_out) {
1658965584aSRoy Oursler state->state = ZSTATE_CREATE_HDR;
1668965584aSRoy Oursler update_state(stream, start_in, next_in, end_in, start_out, next_out,
1678965584aSRoy Oursler end_out);
1688965584aSRoy Oursler return;
1698965584aSRoy Oursler }
1708965584aSRoy Oursler
171d3cfb2fbSIlya Leoshkevich literal = load_le_u32(next_in);
17203bef684SRoy Oursler hash = compute_hash(literal) & hash_mask;
1738965584aSRoy Oursler dist = (next_in - file_start - last_seen[hash]) & 0xFFFF;
1748965584aSRoy Oursler last_seen[hash] = (uint64_t) (next_in - file_start);
1758965584aSRoy Oursler
1766317ce2bSRoy Oursler if (dist - 1 < hist_size) { /* The -1 are to handle the case when dist = 0 */
1778965584aSRoy Oursler match_length = compare258(next_in - dist, next_in, end_in - next_in);
1788965584aSRoy Oursler
1798965584aSRoy Oursler if (match_length >= SHORTEST_MATCH) {
1808965584aSRoy Oursler next_hash = next_in;
1818965584aSRoy Oursler #ifdef ISAL_LIMIT_HASH_UPDATE
1828965584aSRoy Oursler end = next_hash + 3;
1838965584aSRoy Oursler #else
1848965584aSRoy Oursler end = next_hash + match_length;
1858965584aSRoy Oursler #endif
1868965584aSRoy Oursler next_hash++;
1878965584aSRoy Oursler
1888965584aSRoy Oursler for (; next_hash < end - 3; next_hash++) {
189d3cfb2fbSIlya Leoshkevich literal = load_le_u32(next_hash);
19003bef684SRoy Oursler hash = compute_hash(literal) & hash_mask;
1918965584aSRoy Oursler last_seen[hash] = (uint64_t) (next_hash - file_start);
1928965584aSRoy Oursler }
1938965584aSRoy Oursler
1948965584aSRoy Oursler get_len_icf_code(match_length, &code);
1958965584aSRoy Oursler get_dist_icf_code(dist, &code2, &extra_bits);
1968965584aSRoy Oursler
1978965584aSRoy Oursler level_buf->hist.ll_hist[code]++;
1988965584aSRoy Oursler level_buf->hist.d_hist[code2]++;
1998965584aSRoy Oursler
2008965584aSRoy Oursler write_deflate_icf(next_out, code, code2, extra_bits);
2018965584aSRoy Oursler
2028965584aSRoy Oursler next_out++;
2038965584aSRoy Oursler next_in += match_length;
2048965584aSRoy Oursler
2058965584aSRoy Oursler continue;
2068965584aSRoy Oursler }
2078965584aSRoy Oursler }
2088965584aSRoy Oursler
2098965584aSRoy Oursler get_lit_icf_code(literal & 0xFF, &code);
2108965584aSRoy Oursler level_buf->hist.ll_hist[code]++;
2118965584aSRoy Oursler write_deflate_icf(next_out, code, NULL_DIST_SYM, 0);
2128965584aSRoy Oursler next_out++;
2138965584aSRoy Oursler next_in++;
2148965584aSRoy Oursler }
2158965584aSRoy Oursler
2168965584aSRoy Oursler while (next_in < end_in) {
2178965584aSRoy Oursler if (next_out >= end_out) {
2188965584aSRoy Oursler state->state = ZSTATE_CREATE_HDR;
2198965584aSRoy Oursler update_state(stream, start_in, next_in, end_in, start_out, next_out,
2208965584aSRoy Oursler end_out);
2218965584aSRoy Oursler return;
2228965584aSRoy Oursler }
2238965584aSRoy Oursler
2248965584aSRoy Oursler literal = *next_in;
2258965584aSRoy Oursler get_lit_icf_code(literal & 0xFF, &code);
2268965584aSRoy Oursler level_buf->hist.ll_hist[code]++;
2278965584aSRoy Oursler write_deflate_icf(next_out, code, NULL_DIST_SYM, 0);
2288965584aSRoy Oursler next_out++;
2298965584aSRoy Oursler next_in++;
2308965584aSRoy Oursler }
2318965584aSRoy Oursler
2328965584aSRoy Oursler if (next_in == end_in) {
2338965584aSRoy Oursler if (stream->end_of_stream || stream->flush != NO_FLUSH)
2348965584aSRoy Oursler state->state = ZSTATE_CREATE_HDR;
2358965584aSRoy Oursler }
2368965584aSRoy Oursler
2378965584aSRoy Oursler update_state(stream, start_in, next_in, end_in, start_out, next_out, end_out);
2388965584aSRoy Oursler
2398965584aSRoy Oursler return;
2408965584aSRoy Oursler }
2418965584aSRoy Oursler
242*55fbfabfSMarcel Cornu void
isal_deflate_icf_finish_hash_map_base(struct isal_zstream * stream)243*55fbfabfSMarcel Cornu isal_deflate_icf_finish_hash_map_base(struct isal_zstream *stream)
2444ae2d1beSRoy Oursler {
2454ae2d1beSRoy Oursler uint32_t literal = 0, hash;
2464ae2d1beSRoy Oursler uint8_t *start_in, *next_in, *end_in, *end, *next_hash;
2474ae2d1beSRoy Oursler struct deflate_icf *start_out, *next_out, *end_out;
2484ae2d1beSRoy Oursler uint16_t match_length;
2494ae2d1beSRoy Oursler uint32_t dist;
2504ae2d1beSRoy Oursler uint32_t code, code2, extra_bits;
2514ae2d1beSRoy Oursler struct isal_zstate *state = &stream->internal_state;
2524ae2d1beSRoy Oursler struct level_buf *level_buf = (struct level_buf *) stream->level_buf;
2537a12bcb2SRoy Oursler uint16_t *last_seen = level_buf->hash_map.hash_table;
25453b92e83SRoy Oursler uint8_t *file_start = (uint8_t *) ((uintptr_t) stream->next_in - stream->total_in);
2556317ce2bSRoy Oursler uint32_t hist_size = state->dist_mask;
25603bef684SRoy Oursler uint32_t hash_mask = state->hash_mask;
2574ae2d1beSRoy Oursler
2584ae2d1beSRoy Oursler start_in = stream->next_in;
2594ae2d1beSRoy Oursler end_in = start_in + stream->avail_in;
2604ae2d1beSRoy Oursler next_in = start_in;
2614ae2d1beSRoy Oursler
2624ae2d1beSRoy Oursler start_out = level_buf->icf_buf_next;
2634ae2d1beSRoy Oursler end_out = start_out + level_buf->icf_buf_avail_out / sizeof(struct deflate_icf);
2644ae2d1beSRoy Oursler next_out = start_out;
2654ae2d1beSRoy Oursler
2664ae2d1beSRoy Oursler if (stream->avail_in == 0) {
2674ae2d1beSRoy Oursler if (stream->end_of_stream || stream->flush != NO_FLUSH)
2684ae2d1beSRoy Oursler state->state = ZSTATE_CREATE_HDR;
2694ae2d1beSRoy Oursler return;
2704ae2d1beSRoy Oursler }
2714ae2d1beSRoy Oursler
2724ae2d1beSRoy Oursler while (next_in + 3 < end_in) {
2734ae2d1beSRoy Oursler if (next_out >= end_out) {
2744ae2d1beSRoy Oursler state->state = ZSTATE_CREATE_HDR;
2754ae2d1beSRoy Oursler update_state(stream, start_in, next_in, end_in, start_out, next_out,
2764ae2d1beSRoy Oursler end_out);
2774ae2d1beSRoy Oursler return;
2784ae2d1beSRoy Oursler }
2794ae2d1beSRoy Oursler
280d3cfb2fbSIlya Leoshkevich literal = load_le_u32(next_in);
28103bef684SRoy Oursler hash = compute_hash_mad(literal) & hash_mask;
2824ae2d1beSRoy Oursler dist = (next_in - file_start - last_seen[hash]) & 0xFFFF;
2834ae2d1beSRoy Oursler last_seen[hash] = (uint64_t) (next_in - file_start);
2844ae2d1beSRoy Oursler
2856317ce2bSRoy Oursler if (dist - 1 < hist_size) { /* The -1 are to handle the case when dist = 0 */
2864ae2d1beSRoy Oursler match_length = compare258(next_in - dist, next_in, end_in - next_in);
2874ae2d1beSRoy Oursler
2884ae2d1beSRoy Oursler if (match_length >= SHORTEST_MATCH) {
2894ae2d1beSRoy Oursler next_hash = next_in;
2904ae2d1beSRoy Oursler #ifdef ISAL_LIMIT_HASH_UPDATE
2914ae2d1beSRoy Oursler end = next_hash + 3;
2924ae2d1beSRoy Oursler #else
2934ae2d1beSRoy Oursler end = next_hash + match_length;
2944ae2d1beSRoy Oursler #endif
2954ae2d1beSRoy Oursler next_hash++;
2964ae2d1beSRoy Oursler
2974ae2d1beSRoy Oursler for (; next_hash < end - 3; next_hash++) {
298d3cfb2fbSIlya Leoshkevich literal = load_le_u32(next_hash);
29903bef684SRoy Oursler hash = compute_hash_mad(literal) & hash_mask;
3004ae2d1beSRoy Oursler last_seen[hash] = (uint64_t) (next_hash - file_start);
3014ae2d1beSRoy Oursler }
3024ae2d1beSRoy Oursler
3034ae2d1beSRoy Oursler get_len_icf_code(match_length, &code);
3044ae2d1beSRoy Oursler get_dist_icf_code(dist, &code2, &extra_bits);
3054ae2d1beSRoy Oursler
306fe68f02dSRoy Oursler level_buf->hist.ll_hist[code]++;
307fe68f02dSRoy Oursler level_buf->hist.d_hist[code2]++;
3084ae2d1beSRoy Oursler
3094ae2d1beSRoy Oursler write_deflate_icf(next_out, code, code2, extra_bits);
3104ae2d1beSRoy Oursler
3114ae2d1beSRoy Oursler next_out++;
3124ae2d1beSRoy Oursler next_in += match_length;
3134ae2d1beSRoy Oursler
3144ae2d1beSRoy Oursler continue;
3154ae2d1beSRoy Oursler }
3164ae2d1beSRoy Oursler }
3174ae2d1beSRoy Oursler
3184ae2d1beSRoy Oursler get_lit_icf_code(literal & 0xFF, &code);
319fe68f02dSRoy Oursler level_buf->hist.ll_hist[code]++;
3204ae2d1beSRoy Oursler write_deflate_icf(next_out, code, NULL_DIST_SYM, 0);
3214ae2d1beSRoy Oursler next_out++;
3224ae2d1beSRoy Oursler next_in++;
3234ae2d1beSRoy Oursler }
3244ae2d1beSRoy Oursler
3254ae2d1beSRoy Oursler while (next_in < end_in) {
3264ae2d1beSRoy Oursler if (next_out >= end_out) {
3274ae2d1beSRoy Oursler state->state = ZSTATE_CREATE_HDR;
3284ae2d1beSRoy Oursler update_state(stream, start_in, next_in, end_in, start_out, next_out,
3294ae2d1beSRoy Oursler end_out);
3304ae2d1beSRoy Oursler return;
3314ae2d1beSRoy Oursler }
3324ae2d1beSRoy Oursler
3334ae2d1beSRoy Oursler literal = *next_in;
3344ae2d1beSRoy Oursler get_lit_icf_code(literal & 0xFF, &code);
335fe68f02dSRoy Oursler level_buf->hist.ll_hist[code]++;
3364ae2d1beSRoy Oursler write_deflate_icf(next_out, code, NULL_DIST_SYM, 0);
3374ae2d1beSRoy Oursler next_out++;
3384ae2d1beSRoy Oursler next_in++;
3394ae2d1beSRoy Oursler }
3404ae2d1beSRoy Oursler
3414ae2d1beSRoy Oursler if (next_in == end_in) {
3424ae2d1beSRoy Oursler if (stream->end_of_stream || stream->flush != NO_FLUSH)
3434ae2d1beSRoy Oursler state->state = ZSTATE_CREATE_HDR;
3444ae2d1beSRoy Oursler }
3454ae2d1beSRoy Oursler
3464ae2d1beSRoy Oursler update_state(stream, start_in, next_in, end_in, start_out, next_out, end_out);
3474ae2d1beSRoy Oursler
3484ae2d1beSRoy Oursler return;
3494ae2d1beSRoy Oursler }
3504ae2d1beSRoy Oursler
351*55fbfabfSMarcel Cornu void
isal_deflate_hash_mad_base(uint16_t * hash_table,uint32_t hash_mask,uint32_t current_index,uint8_t * dict,uint32_t dict_len)352*55fbfabfSMarcel Cornu isal_deflate_hash_mad_base(uint16_t *hash_table, uint32_t hash_mask, uint32_t current_index,
353*55fbfabfSMarcel Cornu uint8_t *dict, uint32_t dict_len)
3544ae2d1beSRoy Oursler {
3554ae2d1beSRoy Oursler uint8_t *next_in = dict;
3564ae2d1beSRoy Oursler uint8_t *end_in = dict + dict_len - SHORTEST_MATCH;
3574ae2d1beSRoy Oursler uint32_t literal;
3584ae2d1beSRoy Oursler uint32_t hash;
3599203f96cSRoy Oursler uint16_t index = current_index - dict_len;
3604ae2d1beSRoy Oursler
3614ae2d1beSRoy Oursler while (next_in <= end_in) {
362d3cfb2fbSIlya Leoshkevich literal = load_le_u32(next_in);
3639203f96cSRoy Oursler hash = compute_hash_mad(literal) & hash_mask;
3649203f96cSRoy Oursler hash_table[hash] = index;
3659203f96cSRoy Oursler index++;
3664ae2d1beSRoy Oursler next_in++;
3674ae2d1beSRoy Oursler }
3684ae2d1beSRoy Oursler }
369