xref: /isa-l/igzip/igzip_icf_body.c (revision e3c2d243a11ae31a19f090206cbe90c84b12ceb1)
14ae2d1beSRoy Oursler #include "igzip_lib.h"
24ae2d1beSRoy Oursler #include "huffman.h"
34ae2d1beSRoy Oursler #include "encode_df.h"
44ae2d1beSRoy Oursler #include "igzip_level_buf_structs.h"
54ae2d1beSRoy Oursler 
655fbfabfSMarcel Cornu extern uint64_t
7*e3c2d243SMattias Ellert gen_icf_map_lh1(struct isal_zstream *, struct deflate_icf *, uint64_t);
855fbfabfSMarcel Cornu extern void
955fbfabfSMarcel Cornu set_long_icf_fg(uint8_t *, uint64_t, uint64_t, struct deflate_icf *);
1055fbfabfSMarcel Cornu extern void
1155fbfabfSMarcel Cornu isal_deflate_icf_body_lvl1(struct isal_zstream *);
1255fbfabfSMarcel Cornu extern void
1355fbfabfSMarcel Cornu isal_deflate_icf_body_lvl2(struct isal_zstream *);
1455fbfabfSMarcel Cornu extern void
1555fbfabfSMarcel Cornu isal_deflate_icf_body_lvl3(struct isal_zstream *);
164ae2d1beSRoy Oursler /*
174ae2d1beSRoy Oursler *************************************************************
184ae2d1beSRoy Oursler * Helper functions
194ae2d1beSRoy Oursler ************************************************************
204ae2d1beSRoy Oursler */
2155fbfabfSMarcel Cornu static inline void
2255fbfabfSMarcel Cornu write_deflate_icf(struct deflate_icf *icf, uint32_t lit_len, uint32_t lit_dist, uint32_t extra_bits)
234ae2d1beSRoy Oursler {
244ae2d1beSRoy Oursler         /* icf->lit_len = lit_len; */
254ae2d1beSRoy Oursler         /* icf->lit_dist = lit_dist; */
264ae2d1beSRoy Oursler         /* icf->dist_extra = extra_bits; */
274ae2d1beSRoy Oursler 
2855fbfabfSMarcel Cornu         store_native_u32((uint8_t *) icf,
2955fbfabfSMarcel Cornu                          lit_len | (lit_dist << LIT_LEN_BIT_COUNT) |
3055fbfabfSMarcel Cornu                                  (extra_bits << (LIT_LEN_BIT_COUNT + DIST_LIT_BIT_COUNT)));
314ae2d1beSRoy Oursler }
324ae2d1beSRoy Oursler 
3355fbfabfSMarcel Cornu void
3455fbfabfSMarcel Cornu set_long_icf_fg_base(uint8_t *next_in, uint64_t processed, uint64_t input_size,
351fdc5941SRoy Oursler                      struct deflate_icf *match_lookup)
364ae2d1beSRoy Oursler {
371fdc5941SRoy Oursler         uint8_t *end_processed = next_in + processed;
381fdc5941SRoy Oursler         uint8_t *end_in = next_in + input_size;
394ae2d1beSRoy Oursler         uint32_t dist_code, dist_extra, dist, len;
404ae2d1beSRoy Oursler         uint32_t match_len;
4155fbfabfSMarcel Cornu         uint32_t dist_start[] = { 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0007, 0x0009, 0x000d,
424ae2d1beSRoy Oursler                                   0x0011, 0x0019, 0x0021, 0x0031, 0x0041, 0x0061, 0x0081, 0x00c1,
434ae2d1beSRoy Oursler                                   0x0101, 0x0181, 0x0201, 0x0301, 0x0401, 0x0601, 0x0801, 0x0c01,
4455fbfabfSMarcel Cornu                                   0x1001, 0x1801, 0x2001, 0x3001, 0x4001, 0x6001, 0x0000, 0x0000 };
454ae2d1beSRoy Oursler 
461fdc5941SRoy Oursler         if (end_in > end_processed + ISAL_LOOK_AHEAD)
471fdc5941SRoy Oursler                 end_in = end_processed + ISAL_LOOK_AHEAD;
481fdc5941SRoy Oursler 
491fdc5941SRoy Oursler         while (next_in < end_processed) {
504ae2d1beSRoy Oursler                 dist_code = match_lookup->lit_dist;
514ae2d1beSRoy Oursler                 dist_extra = match_lookup->dist_extra;
524ae2d1beSRoy Oursler                 dist = dist_start[dist_code] + dist_extra;
534ae2d1beSRoy Oursler                 len = match_lookup->lit_len;
544ae2d1beSRoy Oursler                 if (len >= 8 + LEN_OFFSET) {
5555fbfabfSMarcel Cornu                         match_len =
5655fbfabfSMarcel Cornu                                 compare((next_in + 8) - dist, next_in + 8, end_in - (next_in + 8)) +
5755fbfabfSMarcel Cornu                                 LEN_OFFSET + 8;
584ae2d1beSRoy Oursler 
5955fbfabfSMarcel Cornu                         while (match_len > match_lookup->lit_len &&
6055fbfabfSMarcel Cornu                                match_len >= LEN_OFFSET + SHORTEST_MATCH) {
61ba1a0006SRoy Oursler                                 write_deflate_icf(match_lookup,
62ba1a0006SRoy Oursler                                                   match_len > LEN_MAX ? LEN_MAX : match_len,
63ba1a0006SRoy Oursler                                                   dist_code, dist_extra);
644ae2d1beSRoy Oursler                                 match_lookup++;
654ae2d1beSRoy Oursler                                 next_in++;
664ae2d1beSRoy Oursler                                 match_len--;
674ae2d1beSRoy Oursler                         }
684ae2d1beSRoy Oursler                 }
694ae2d1beSRoy Oursler 
704ae2d1beSRoy Oursler                 match_lookup++;
714ae2d1beSRoy Oursler                 next_in++;
724ae2d1beSRoy Oursler         }
734ae2d1beSRoy Oursler }
744ae2d1beSRoy Oursler 
754ae2d1beSRoy Oursler /*
764ae2d1beSRoy Oursler *************************************************************
774ae2d1beSRoy Oursler * Methods for generating one pass match lookup table
784ae2d1beSRoy Oursler ************************************************************
794ae2d1beSRoy Oursler */
8055fbfabfSMarcel Cornu uint64_t
8155fbfabfSMarcel Cornu gen_icf_map_h1_base(struct isal_zstream *stream, struct deflate_icf *matches_icf_lookup,
8255fbfabfSMarcel Cornu                     uint64_t input_size)
834ae2d1beSRoy Oursler {
844ae2d1beSRoy Oursler 
854ae2d1beSRoy Oursler         uint32_t dist, len, extra_bits;
864ae2d1beSRoy Oursler         uint8_t *next_in = stream->next_in, *end_in = stream->next_in + input_size;
8753b92e83SRoy Oursler         uint8_t *file_start = (uint8_t *) ((uintptr_t) stream->next_in - stream->total_in);
884ae2d1beSRoy Oursler         uint32_t hash;
894ae2d1beSRoy Oursler         uint64_t next_bytes, match_bytes;
904ae2d1beSRoy Oursler         uint64_t match;
914ae2d1beSRoy Oursler         struct level_buf *level_buf = (struct level_buf *) stream->level_buf;
927a12bcb2SRoy Oursler         uint16_t *hash_table = level_buf->hash_map.hash_table;
936317ce2bSRoy Oursler         uint32_t hist_size = stream->internal_state.dist_mask;
9403bef684SRoy Oursler         uint32_t hash_mask = stream->internal_state.hash_mask;
954ae2d1beSRoy Oursler 
964ae2d1beSRoy Oursler         if (input_size < ISAL_LOOK_AHEAD)
97cd7b70ddSRoy Oursler                 return 0;
984ae2d1beSRoy Oursler 
99c1876a12SRoy Oursler         if (stream->internal_state.has_hist == IGZIP_NO_HIST) {
1004ae2d1beSRoy Oursler                 matches_icf_lookup->lit_len = *next_in;
1014ae2d1beSRoy Oursler                 matches_icf_lookup->lit_dist = 0x1e;
1024ae2d1beSRoy Oursler                 matches_icf_lookup->dist_extra = 0;
1034ae2d1beSRoy Oursler 
104d3cfb2fbSIlya Leoshkevich                 hash = compute_hash(load_le_u32(next_in)) & hash_mask;
1054ae2d1beSRoy Oursler                 hash_table[hash] = (uint64_t) (next_in - file_start);
1064ae2d1beSRoy Oursler 
1074ae2d1beSRoy Oursler                 next_in++;
1084ae2d1beSRoy Oursler                 matches_icf_lookup++;
109c1876a12SRoy Oursler                 stream->internal_state.has_hist = IGZIP_HIST;
110c1876a12SRoy Oursler         }
1114ae2d1beSRoy Oursler 
1124ae2d1beSRoy Oursler         while (next_in < end_in - ISAL_LOOK_AHEAD) {
113d3cfb2fbSIlya Leoshkevich                 hash = compute_hash(load_le_u32(next_in)) & hash_mask;
1144ae2d1beSRoy Oursler                 dist = (next_in - file_start - hash_table[hash]);
1156317ce2bSRoy Oursler                 dist = ((dist - 1) & hist_size) + 1;
1164ae2d1beSRoy Oursler                 hash_table[hash] = (uint64_t) (next_in - file_start);
1174ae2d1beSRoy Oursler 
118d3cfb2fbSIlya Leoshkevich                 match_bytes = load_le_u64(next_in - dist);
119d3cfb2fbSIlya Leoshkevich                 next_bytes = load_le_u64(next_in);
1204ae2d1beSRoy Oursler                 match = next_bytes ^ match_bytes;
1214ae2d1beSRoy Oursler 
1227faedc71SRoy Oursler                 len = tzbytecnt(match);
1234ae2d1beSRoy Oursler 
1244ae2d1beSRoy Oursler                 if (len >= SHORTEST_MATCH) {
1254ae2d1beSRoy Oursler                         len += LEN_OFFSET;
1264ae2d1beSRoy Oursler                         get_dist_icf_code(dist, &dist, &extra_bits);
1274ae2d1beSRoy Oursler                         write_deflate_icf(matches_icf_lookup, len, dist, extra_bits);
1284ae2d1beSRoy Oursler                 } else {
1294ae2d1beSRoy Oursler                         write_deflate_icf(matches_icf_lookup, *next_in, 0x1e, 0);
1304ae2d1beSRoy Oursler                 }
1314ae2d1beSRoy Oursler 
1324ae2d1beSRoy Oursler                 next_in++;
1334ae2d1beSRoy Oursler                 matches_icf_lookup++;
1344ae2d1beSRoy Oursler         }
135cd7b70ddSRoy Oursler         return next_in - stream->next_in;
1364ae2d1beSRoy Oursler }
1374ae2d1beSRoy Oursler 
1384ae2d1beSRoy Oursler /*
1394ae2d1beSRoy Oursler *************************************************************
1404ae2d1beSRoy Oursler * One pass methods for parsing provided match lookup table
1414ae2d1beSRoy Oursler ************************************************************
1424ae2d1beSRoy Oursler */
14355fbfabfSMarcel Cornu static struct deflate_icf *
14455fbfabfSMarcel Cornu compress_icf_map_g(struct isal_zstream *stream, struct deflate_icf *matches_next,
1454ae2d1beSRoy Oursler                    struct deflate_icf *matches_end)
1464ae2d1beSRoy Oursler {
1474ae2d1beSRoy Oursler         uint32_t lit_len, lit_len2, dist;
1484ae2d1beSRoy Oursler         uint64_t code;
1494ae2d1beSRoy Oursler         struct isal_zstate *state = &stream->internal_state;
1504ae2d1beSRoy Oursler         struct level_buf *level_buf = (struct level_buf *) stream->level_buf;
1514ae2d1beSRoy Oursler         struct deflate_icf *matches_start = matches_next;
1524ae2d1beSRoy Oursler         struct deflate_icf *icf_buf_end =
15355fbfabfSMarcel Cornu                 level_buf->icf_buf_next + level_buf->icf_buf_avail_out / sizeof(struct deflate_icf);
1544ae2d1beSRoy Oursler 
1555b1a519fSZhaiMo         while (matches_next + 1 < matches_end && level_buf->icf_buf_next + 1 < icf_buf_end) {
156d3cfb2fbSIlya Leoshkevich #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
157d3cfb2fbSIlya Leoshkevich                 code = load_native_u64((uint8_t *) matches_next);
158d3cfb2fbSIlya Leoshkevich #else
159d3cfb2fbSIlya Leoshkevich                 code = load_native_u32((uint8_t *) matches_next) |
160d3cfb2fbSIlya Leoshkevich                        ((uint64_t) load_native_u32((uint8_t *) (matches_next + 1)) << 32);
161d3cfb2fbSIlya Leoshkevich #endif
1624ae2d1beSRoy Oursler                 lit_len = code & LIT_LEN_MASK;
1634ae2d1beSRoy Oursler                 lit_len2 = (code >> ICF_CODE_LEN) & LIT_LEN_MASK;
164fe68f02dSRoy Oursler                 level_buf->hist.ll_hist[lit_len]++;
1654ae2d1beSRoy Oursler 
1664ae2d1beSRoy Oursler                 if (lit_len >= LEN_START) {
167d3cfb2fbSIlya Leoshkevich                         store_native_u32((uint8_t *) level_buf->icf_buf_next, code);
1684ae2d1beSRoy Oursler                         level_buf->icf_buf_next++;
1694ae2d1beSRoy Oursler 
1704ae2d1beSRoy Oursler                         dist = (code >> ICF_DIST_OFFSET) & DIST_LIT_MASK;
171fe68f02dSRoy Oursler                         level_buf->hist.d_hist[dist]++;
1724ae2d1beSRoy Oursler                         lit_len -= LEN_OFFSET;
1734ae2d1beSRoy Oursler                         matches_next += lit_len;
1744ae2d1beSRoy Oursler 
1754ae2d1beSRoy Oursler                 } else if (lit_len2 >= LEN_START) {
176d3cfb2fbSIlya Leoshkevich #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
177d3cfb2fbSIlya Leoshkevich                         store_native_u64((uint8_t *) level_buf->icf_buf_next, code);
178d3cfb2fbSIlya Leoshkevich #else
179d3cfb2fbSIlya Leoshkevich                         store_native_u32((uint8_t *) level_buf->icf_buf_next, (uint32_t) code);
180d3cfb2fbSIlya Leoshkevich                         store_native_u32((uint8_t *) (level_buf->icf_buf_next + 1),
181d3cfb2fbSIlya Leoshkevich                                          (uint32_t) (code >> 32));
182d3cfb2fbSIlya Leoshkevich #endif
1834ae2d1beSRoy Oursler                         level_buf->icf_buf_next += 2;
1844ae2d1beSRoy Oursler 
185fe68f02dSRoy Oursler                         level_buf->hist.ll_hist[lit_len2]++;
1864ae2d1beSRoy Oursler 
1874ae2d1beSRoy Oursler                         dist = (code >> (ICF_CODE_LEN + ICF_DIST_OFFSET)) & DIST_LIT_MASK;
188fe68f02dSRoy Oursler                         level_buf->hist.d_hist[dist]++;
1894ae2d1beSRoy Oursler                         lit_len2 -= LEN_OFFSET - 1;
1904ae2d1beSRoy Oursler                         matches_next += lit_len2;
1914ae2d1beSRoy Oursler 
1924ae2d1beSRoy Oursler                 } else {
1934ae2d1beSRoy Oursler                         code = ((lit_len2 + LIT_START) << ICF_DIST_OFFSET) | lit_len;
194d3cfb2fbSIlya Leoshkevich                         store_native_u32((uint8_t *) level_buf->icf_buf_next, code);
1954ae2d1beSRoy Oursler                         level_buf->icf_buf_next++;
1964ae2d1beSRoy Oursler 
197fe68f02dSRoy Oursler                         level_buf->hist.ll_hist[lit_len2]++;
1984ae2d1beSRoy Oursler 
1994ae2d1beSRoy Oursler                         matches_next += 2;
2004ae2d1beSRoy Oursler                 }
2014ae2d1beSRoy Oursler         }
2024ae2d1beSRoy Oursler 
2034ae2d1beSRoy Oursler         while (matches_next < matches_end && level_buf->icf_buf_next < icf_buf_end) {
204d3cfb2fbSIlya Leoshkevich                 code = load_native_u32((uint8_t *) matches_next);
2054ae2d1beSRoy Oursler                 lit_len = code & LIT_LEN_MASK;
206d3cfb2fbSIlya Leoshkevich                 store_native_u32((uint8_t *) level_buf->icf_buf_next, code);
2074ae2d1beSRoy Oursler                 level_buf->icf_buf_next++;
2084ae2d1beSRoy Oursler 
209fe68f02dSRoy Oursler                 level_buf->hist.ll_hist[lit_len]++;
2104ae2d1beSRoy Oursler                 if (lit_len >= LEN_START) {
2114ae2d1beSRoy Oursler                         dist = (code >> 10) & 0x1ff;
212fe68f02dSRoy Oursler                         level_buf->hist.d_hist[dist]++;
2134ae2d1beSRoy Oursler                         lit_len -= LEN_OFFSET;
2144ae2d1beSRoy Oursler                         matches_next += lit_len;
2154ae2d1beSRoy Oursler                 } else {
2164ae2d1beSRoy Oursler                         matches_next++;
2174ae2d1beSRoy Oursler                 }
2184ae2d1beSRoy Oursler         }
2194ae2d1beSRoy Oursler 
2204ae2d1beSRoy Oursler         level_buf->icf_buf_avail_out =
2214ae2d1beSRoy Oursler                 (icf_buf_end - level_buf->icf_buf_next) * sizeof(struct deflate_icf);
2224ae2d1beSRoy Oursler 
2234ae2d1beSRoy Oursler         state->block_end += matches_next - matches_start;
2244ae2d1beSRoy Oursler         if (matches_next > matches_end && matches_start < matches_end) {
2254ae2d1beSRoy Oursler                 stream->next_in += matches_next - matches_end;
2264ae2d1beSRoy Oursler                 stream->avail_in -= matches_next - matches_end;
2274ae2d1beSRoy Oursler                 stream->total_in += matches_next - matches_end;
2284ae2d1beSRoy Oursler         }
2294ae2d1beSRoy Oursler 
2304ae2d1beSRoy Oursler         return matches_next;
2314ae2d1beSRoy Oursler }
2324ae2d1beSRoy Oursler 
2334ae2d1beSRoy Oursler /*
2344ae2d1beSRoy Oursler *************************************************************
2354ae2d1beSRoy Oursler * Compression functions combining different methods
2364ae2d1beSRoy Oursler ************************************************************
2374ae2d1beSRoy Oursler */
23855fbfabfSMarcel Cornu static inline void
23955fbfabfSMarcel Cornu icf_body_next_state(struct isal_zstream *stream)
2404ae2d1beSRoy Oursler {
2414ae2d1beSRoy Oursler         struct level_buf *level_buf = (struct level_buf *) stream->level_buf;
2424ae2d1beSRoy Oursler         struct isal_zstate *state = &stream->internal_state;
2434ae2d1beSRoy Oursler 
2444ae2d1beSRoy Oursler         if (level_buf->icf_buf_avail_out <= 0)
2454ae2d1beSRoy Oursler                 state->state = ZSTATE_CREATE_HDR;
2464ae2d1beSRoy Oursler 
24755fbfabfSMarcel Cornu         else if (stream->avail_in <= ISAL_LOOK_AHEAD &&
24855fbfabfSMarcel Cornu                  (stream->end_of_stream || stream->flush != NO_FLUSH))
2494ae2d1beSRoy Oursler                 state->state = ZSTATE_FLUSH_READ_BUFFER;
2504ae2d1beSRoy Oursler }
2514ae2d1beSRoy Oursler 
25255fbfabfSMarcel Cornu void
25355fbfabfSMarcel Cornu icf_body_hash1_fillgreedy_lazy(struct isal_zstream *stream)
2544ae2d1beSRoy Oursler {
2554ae2d1beSRoy Oursler         struct deflate_icf *matches_icf, *matches_next_icf, *matches_end_icf;
2564ae2d1beSRoy Oursler         struct deflate_icf *matches_icf_lookup;
2574ae2d1beSRoy Oursler         struct level_buf *level_buf = (struct level_buf *) stream->level_buf;
258cd7b70ddSRoy Oursler         uint32_t input_size, processed;
2594ae2d1beSRoy Oursler 
2607a12bcb2SRoy Oursler         matches_icf = level_buf->hash_map.matches;
2614ae2d1beSRoy Oursler         matches_icf_lookup = matches_icf;
2627a12bcb2SRoy Oursler         matches_next_icf = level_buf->hash_map.matches_next;
2637a12bcb2SRoy Oursler         matches_end_icf = level_buf->hash_map.matches_end;
2644ae2d1beSRoy Oursler 
2654ae2d1beSRoy Oursler         matches_next_icf = compress_icf_map_g(stream, matches_next_icf, matches_end_icf);
2664ae2d1beSRoy Oursler 
2674ae2d1beSRoy Oursler         while (matches_next_icf >= matches_end_icf) {
2684ae2d1beSRoy Oursler                 input_size = MATCH_BUF_SIZE;
2694ae2d1beSRoy Oursler                 input_size = (input_size > stream->avail_in) ? stream->avail_in : input_size;
2704ae2d1beSRoy Oursler 
2714ae2d1beSRoy Oursler                 if (input_size <= ISAL_LOOK_AHEAD)
2724ae2d1beSRoy Oursler                         break;
2734ae2d1beSRoy Oursler 
274cd7b70ddSRoy Oursler                 processed = gen_icf_map_h1_base(stream, matches_icf_lookup, input_size);
2754ae2d1beSRoy Oursler 
2761fdc5941SRoy Oursler                 set_long_icf_fg(stream->next_in, processed, input_size, matches_icf_lookup);
2774ae2d1beSRoy Oursler 
278cd7b70ddSRoy Oursler                 stream->next_in += processed;
279cd7b70ddSRoy Oursler                 stream->avail_in -= processed;
280cd7b70ddSRoy Oursler                 stream->total_in += processed;
2814ae2d1beSRoy Oursler 
282cd7b70ddSRoy Oursler                 matches_end_icf = matches_icf + processed;
2834ae2d1beSRoy Oursler                 matches_next_icf = compress_icf_map_g(stream, matches_icf, matches_end_icf);
2844ae2d1beSRoy Oursler         }
2854ae2d1beSRoy Oursler 
2867a12bcb2SRoy Oursler         level_buf->hash_map.matches_next = matches_next_icf;
2877a12bcb2SRoy Oursler         level_buf->hash_map.matches_end = matches_end_icf;
2884ae2d1beSRoy Oursler 
2894ae2d1beSRoy Oursler         icf_body_next_state(stream);
2904ae2d1beSRoy Oursler }
2914ae2d1beSRoy Oursler 
29255fbfabfSMarcel Cornu void
29355fbfabfSMarcel Cornu icf_body_lazyhash1_fillgreedy_greedy(struct isal_zstream *stream)
2944ae2d1beSRoy Oursler {
2954ae2d1beSRoy Oursler         struct deflate_icf *matches_icf, *matches_next_icf, *matches_end_icf;
2964ae2d1beSRoy Oursler         struct deflate_icf *matches_icf_lookup;
2974ae2d1beSRoy Oursler         struct level_buf *level_buf = (struct level_buf *) stream->level_buf;
298cd7b70ddSRoy Oursler         uint32_t input_size, processed;
2994ae2d1beSRoy Oursler 
3007a12bcb2SRoy Oursler         matches_icf = level_buf->hash_map.matches;
3014ae2d1beSRoy Oursler         matches_icf_lookup = matches_icf;
3027a12bcb2SRoy Oursler         matches_next_icf = level_buf->hash_map.matches_next;
3037a12bcb2SRoy Oursler         matches_end_icf = level_buf->hash_map.matches_end;
3044ae2d1beSRoy Oursler 
3054ae2d1beSRoy Oursler         matches_next_icf = compress_icf_map_g(stream, matches_next_icf, matches_end_icf);
3064ae2d1beSRoy Oursler 
3074ae2d1beSRoy Oursler         while (matches_next_icf >= matches_end_icf) {
3084ae2d1beSRoy Oursler                 input_size = MATCH_BUF_SIZE;
3094ae2d1beSRoy Oursler                 input_size = (input_size > stream->avail_in) ? stream->avail_in : input_size;
3104ae2d1beSRoy Oursler 
3114ae2d1beSRoy Oursler                 if (input_size <= ISAL_LOOK_AHEAD)
3124ae2d1beSRoy Oursler                         break;
3134ae2d1beSRoy Oursler 
314cd7b70ddSRoy Oursler                 processed = gen_icf_map_lh1(stream, matches_icf_lookup, input_size);
3154ae2d1beSRoy Oursler 
3161fdc5941SRoy Oursler                 set_long_icf_fg(stream->next_in, processed, input_size, matches_icf_lookup);
3174ae2d1beSRoy Oursler 
318cd7b70ddSRoy Oursler                 stream->next_in += processed;
319cd7b70ddSRoy Oursler                 stream->avail_in -= processed;
320cd7b70ddSRoy Oursler                 stream->total_in += processed;
3214ae2d1beSRoy Oursler 
322cd7b70ddSRoy Oursler                 matches_end_icf = matches_icf + processed;
3234ae2d1beSRoy Oursler                 matches_next_icf = compress_icf_map_g(stream, matches_icf, matches_end_icf);
3244ae2d1beSRoy Oursler         }
3254ae2d1beSRoy Oursler 
3267a12bcb2SRoy Oursler         level_buf->hash_map.matches_next = matches_next_icf;
3277a12bcb2SRoy Oursler         level_buf->hash_map.matches_end = matches_end_icf;
3284ae2d1beSRoy Oursler 
3294ae2d1beSRoy Oursler         icf_body_next_state(stream);
3304ae2d1beSRoy Oursler }
3314ae2d1beSRoy Oursler 
33255fbfabfSMarcel Cornu void
33355fbfabfSMarcel Cornu isal_deflate_icf_body(struct isal_zstream *stream)
3344ae2d1beSRoy Oursler {
3354ae2d1beSRoy Oursler         switch (stream->level) {
3368965584aSRoy Oursler         case 3:
3374b45beffSRoy Oursler                 isal_deflate_icf_body_lvl3(stream);
3384ae2d1beSRoy Oursler                 break;
3398965584aSRoy Oursler         case 2:
3408965584aSRoy Oursler                 isal_deflate_icf_body_lvl2(stream);
3418965584aSRoy Oursler                 break;
3424ae2d1beSRoy Oursler         case 1:
3434ae2d1beSRoy Oursler         default:
3444ae2d1beSRoy Oursler                 isal_deflate_icf_body_lvl1(stream);
3454ae2d1beSRoy Oursler         }
3464ae2d1beSRoy Oursler }
347