xref: /isa-l/igzip/igzip_perf.c (revision 55fbfabfc60f1002bc8133b730a59f6abd22cfce)
18e4f1a1aSRoy Oursler /**********************************************************************
28e4f1a1aSRoy Oursler   Copyright(c) 2011-2018 Intel Corporation All rights reserved.
38e4f1a1aSRoy Oursler 
48e4f1a1aSRoy Oursler   Redistribution and use in source and binary forms, with or without
58e4f1a1aSRoy Oursler   modification, are permitted provided that the following conditions
68e4f1a1aSRoy Oursler   are met:
78e4f1a1aSRoy Oursler     * Redistributions of source code must retain the above copyright
88e4f1a1aSRoy Oursler       notice, this list of conditions and the following disclaimer.
98e4f1a1aSRoy Oursler     * Redistributions in binary form must reproduce the above copyright
108e4f1a1aSRoy Oursler       notice, this list of conditions and the following disclaimer in
118e4f1a1aSRoy Oursler       the documentation and/or other materials provided with the
128e4f1a1aSRoy Oursler       distribution.
138e4f1a1aSRoy Oursler     * Neither the name of Intel Corporation nor the names of its
148e4f1a1aSRoy Oursler       contributors may be used to endorse or promote products derived
158e4f1a1aSRoy Oursler       from this software without specific prior written permission.
168e4f1a1aSRoy Oursler 
178e4f1a1aSRoy Oursler   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
188e4f1a1aSRoy Oursler   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
198e4f1a1aSRoy Oursler   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
208e4f1a1aSRoy Oursler   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
218e4f1a1aSRoy Oursler   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
228e4f1a1aSRoy Oursler   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
238e4f1a1aSRoy Oursler   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
248e4f1a1aSRoy Oursler   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
258e4f1a1aSRoy Oursler   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
268e4f1a1aSRoy Oursler   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
278e4f1a1aSRoy Oursler   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
288e4f1a1aSRoy Oursler **********************************************************************/
298e4f1a1aSRoy Oursler 
308e4f1a1aSRoy Oursler #define _FILE_OFFSET_BITS 64
318e4f1a1aSRoy Oursler #include <stdio.h>
3257eed2f0SYibo Cai #include <stdlib.h>
338e4f1a1aSRoy Oursler #include <assert.h>
348e4f1a1aSRoy Oursler #include <getopt.h>
358e4f1a1aSRoy Oursler #include "huff_codes.h"
368e4f1a1aSRoy Oursler #include "igzip_lib.h"
378e4f1a1aSRoy Oursler #include "test.h"
388e4f1a1aSRoy Oursler 
398e4f1a1aSRoy Oursler #include <zlib.h>
408e4f1a1aSRoy Oursler 
418e4f1a1aSRoy Oursler #define BUF_SIZE 1024
428e4f1a1aSRoy Oursler 
431db0363cSGreg Tucker #define OPTARGS "hl:f:z:i:d:stub:y:w:o:D:"
448e4f1a1aSRoy Oursler 
458e4f1a1aSRoy Oursler #define COMPRESSION_QUEUE_LIMIT 32
465793a851SRoy Oursler #define UNSET                   -1
478e4f1a1aSRoy Oursler 
48fc9f7493SGreg Tucker #define xstr(a) str(a)
49fc9f7493SGreg Tucker #define str(a)  #a
50fc9f7493SGreg Tucker 
512458a651SRoy Oursler /* Limit output buffer size to 2 Gigabytes. Since stream->avail_out is a
522458a651SRoy Oursler  * uint32_t and there is no logic for handling an overflowed output buffer in
532458a651SRoy Oursler  * the perf test, this define must be less then 4 Gigabytes */
54f430953fSZhiyuan Zhu #define MAX_COMPRESS_BUF_SIZE (1U << 31)
552458a651SRoy Oursler 
568e4f1a1aSRoy Oursler int level_size_buf[10] = {
578e4f1a1aSRoy Oursler #ifdef ISAL_DEF_LVL0_DEFAULT
588e4f1a1aSRoy Oursler         ISAL_DEF_LVL0_DEFAULT,
598e4f1a1aSRoy Oursler #else
608e4f1a1aSRoy Oursler         0,
618e4f1a1aSRoy Oursler #endif
628e4f1a1aSRoy Oursler #ifdef ISAL_DEF_LVL1_DEFAULT
638e4f1a1aSRoy Oursler         ISAL_DEF_LVL1_DEFAULT,
648e4f1a1aSRoy Oursler #else
658e4f1a1aSRoy Oursler         0,
668e4f1a1aSRoy Oursler #endif
678e4f1a1aSRoy Oursler #ifdef ISAL_DEF_LVL2_DEFAULT
688e4f1a1aSRoy Oursler         ISAL_DEF_LVL2_DEFAULT,
698e4f1a1aSRoy Oursler #else
708e4f1a1aSRoy Oursler         0,
718e4f1a1aSRoy Oursler #endif
728e4f1a1aSRoy Oursler #ifdef ISAL_DEF_LVL3_DEFAULT
738e4f1a1aSRoy Oursler         ISAL_DEF_LVL3_DEFAULT,
748e4f1a1aSRoy Oursler #else
758e4f1a1aSRoy Oursler         0,
768e4f1a1aSRoy Oursler #endif
778e4f1a1aSRoy Oursler #ifdef ISAL_DEF_LVL4_DEFAULT
788e4f1a1aSRoy Oursler         ISAL_DEF_LVL4_DEFAULT,
798e4f1a1aSRoy Oursler #else
808e4f1a1aSRoy Oursler         0,
818e4f1a1aSRoy Oursler #endif
828e4f1a1aSRoy Oursler #ifdef ISAL_DEF_LVL5_DEFAULT
838e4f1a1aSRoy Oursler         ISAL_DEF_LVL5_DEFAULT,
848e4f1a1aSRoy Oursler #else
858e4f1a1aSRoy Oursler         0,
868e4f1a1aSRoy Oursler #endif
878e4f1a1aSRoy Oursler #ifdef ISAL_DEF_LVL6_DEFAULT
888e4f1a1aSRoy Oursler         ISAL_DEF_LVL6_DEFAULT,
898e4f1a1aSRoy Oursler #else
908e4f1a1aSRoy Oursler         0,
918e4f1a1aSRoy Oursler #endif
928e4f1a1aSRoy Oursler #ifdef ISAL_DEF_LVL7_DEFAULT
938e4f1a1aSRoy Oursler         ISAL_DEF_LVL7_DEFAULT,
948e4f1a1aSRoy Oursler #else
958e4f1a1aSRoy Oursler         0,
968e4f1a1aSRoy Oursler #endif
978e4f1a1aSRoy Oursler #ifdef ISAL_DEF_LVL8_DEFAULT
988e4f1a1aSRoy Oursler         ISAL_DEF_LVL8_DEFAULT,
998e4f1a1aSRoy Oursler #else
1008e4f1a1aSRoy Oursler         0,
1018e4f1a1aSRoy Oursler #endif
1028e4f1a1aSRoy Oursler #ifdef ISAL_DEF_LVL9_DEFAULT
1038e4f1a1aSRoy Oursler         ISAL_DEF_LVL9_DEFAULT,
1048e4f1a1aSRoy Oursler #else
1058e4f1a1aSRoy Oursler         0,
1068e4f1a1aSRoy Oursler #endif
1078e4f1a1aSRoy Oursler };
1088e4f1a1aSRoy Oursler 
109*55fbfabfSMarcel Cornu enum { ISAL_STATELESS, ISAL_STATEFUL, ISAL_WITH_DICTIONARY, ZLIB };
1108e4f1a1aSRoy Oursler 
1118e4f1a1aSRoy Oursler struct compress_strategy {
1128e4f1a1aSRoy Oursler         int32_t mode;
1138e4f1a1aSRoy Oursler         int32_t level;
1148e4f1a1aSRoy Oursler };
1158e4f1a1aSRoy Oursler 
1168e4f1a1aSRoy Oursler struct inflate_modes {
1178e4f1a1aSRoy Oursler         int32_t stateless;
1188e4f1a1aSRoy Oursler         int32_t stateful;
1198e4f1a1aSRoy Oursler         int32_t zlib;
1208e4f1a1aSRoy Oursler };
1218e4f1a1aSRoy Oursler 
1228e4f1a1aSRoy Oursler struct perf_info {
1238e4f1a1aSRoy Oursler         char *file_name;
1248e4f1a1aSRoy Oursler         size_t file_size;
1258e4f1a1aSRoy Oursler         size_t deflate_size;
1268e4f1a1aSRoy Oursler         uint32_t inblock_size;
12718fd9965SRoy Oursler         uint32_t flush_type;
128d90220d9SRoy Oursler         int32_t hist_bits;
129699bb5bdSRoy Oursler         int32_t deflate_time;
130699bb5bdSRoy Oursler         int32_t inflate_time;
1318e4f1a1aSRoy Oursler         struct compress_strategy strategy;
1328e4f1a1aSRoy Oursler         uint32_t inflate_mode;
1338e4f1a1aSRoy Oursler         struct perf start;
1348e4f1a1aSRoy Oursler };
1358e4f1a1aSRoy Oursler 
136*55fbfabfSMarcel Cornu void
init_perf_info(struct perf_info * info)137*55fbfabfSMarcel Cornu init_perf_info(struct perf_info *info)
1385793a851SRoy Oursler {
1395793a851SRoy Oursler         memset(info, 0, sizeof(*info));
140699bb5bdSRoy Oursler         info->deflate_time = BENCHMARK_TIME;
141699bb5bdSRoy Oursler         info->inflate_time = BENCHMARK_TIME;
1425793a851SRoy Oursler }
1435793a851SRoy Oursler 
144*55fbfabfSMarcel Cornu int
usage(void)145*55fbfabfSMarcel Cornu usage(void)
1468e4f1a1aSRoy Oursler {
1478e4f1a1aSRoy Oursler         fprintf(stderr,
148fc9f7493SGreg Tucker                 "Usage: igzip_perf [options] <infile>\n"
1498e4f1a1aSRoy Oursler                 "  -h          help, print this message\n"
150*55fbfabfSMarcel Cornu                 "  The options -l, -f, -z may be used up to " xstr(
151*55fbfabfSMarcel Cornu                         COMPRESSION_QUEUE_LIMIT) " times\n"
152*55fbfabfSMarcel Cornu                                                  "  -l <level>  isa-l stateless deflate level to "
153*55fbfabfSMarcel Cornu                                                  "test (" xstr(ISAL_DEF_MIN_LEVEL) "-" xstr(
154*55fbfabfSMarcel Cornu                                                          ISAL_DEF_MAX_LEVEL) ")\n"
155*55fbfabfSMarcel Cornu                                                                              "  -f <level>  isa-l "
156*55fbfabfSMarcel Cornu                                                                              "stateful deflate "
157*55fbfabfSMarcel Cornu                                                                              "level to test (" xstr(ISAL_DEF_MIN_LEVEL) "-" xstr(
158*55fbfabfSMarcel Cornu                                                                                      ISAL_DEF_MAX_LEVEL) ")\n"
1598e4f1a1aSRoy Oursler                                                                                                          "  -z <level>  zlib  deflate level to test\n"
160699bb5bdSRoy Oursler                                                                                                          "  -d <time>   approx time in seconds for deflate (at least 0)\n"
161699bb5bdSRoy Oursler                                                                                                          "  -i <time>   approx time in seconds for inflate (at least 0)\n"
1628e4f1a1aSRoy Oursler                                                                                                          "  -s          performance test isa-l stateful inflate\n"
1638e4f1a1aSRoy Oursler                                                                                                          "  -t          performance test isa-l stateless inflate\n"
1648e4f1a1aSRoy Oursler                                                                                                          "  -u          performance test zlib inflate\n"
1651db0363cSGreg Tucker                                                                                                          "  -D <file>   use dictionary file\n"
16635e90e73SRoy Oursler                                                                                                          "  -o <file>   output file to store compressed data (last one if multiple)\n"
167cb176252SRoy Oursler                                                                                                          "  -b <size>   input buffer size, applies to stateful options (-f,-z,-s)\n"
168d90220d9SRoy Oursler                                                                                                          "  -y <type>   flush type: 0 (default: no flush), 1 (sync flush), 2 (full flush)\n"
169fc9f7493SGreg Tucker                                                                                                          "  -w <size>   log base 2 size of history window, between 9 and 15\n");
1708e4f1a1aSRoy Oursler         exit(0);
1718e4f1a1aSRoy Oursler }
1728e4f1a1aSRoy Oursler 
173*55fbfabfSMarcel Cornu void
print_perf_info_line(struct perf_info * info)174*55fbfabfSMarcel Cornu print_perf_info_line(struct perf_info *info)
1758e4f1a1aSRoy Oursler {
176699bb5bdSRoy Oursler         printf("igzip_perf-> compress level: %d flush_type: %d block_size: %d\n",
177699bb5bdSRoy Oursler                info->strategy.level, info->flush_type, info->inblock_size);
1788e4f1a1aSRoy Oursler }
1798e4f1a1aSRoy Oursler 
180*55fbfabfSMarcel Cornu void
print_file_line(struct perf_info * info)181*55fbfabfSMarcel Cornu print_file_line(struct perf_info *info)
1828e4f1a1aSRoy Oursler {
1838e4f1a1aSRoy Oursler         printf("  file info-> name: %s file_size: %lu compress_size: %lu ratio: %2.02f%%\n",
1848e4f1a1aSRoy Oursler                info->file_name, info->file_size, info->deflate_size,
1858e4f1a1aSRoy Oursler                100.0 * info->deflate_size / info->file_size);
1868e4f1a1aSRoy Oursler }
1878e4f1a1aSRoy Oursler 
188*55fbfabfSMarcel Cornu void
print_deflate_perf_line(struct perf_info * info)189*55fbfabfSMarcel Cornu print_deflate_perf_line(struct perf_info *info)
1908e4f1a1aSRoy Oursler {
1918e4f1a1aSRoy Oursler         if (info->strategy.mode == ISAL_STATELESS)
1928e4f1a1aSRoy Oursler                 printf("    isal_stateless_deflate-> ");
1938e4f1a1aSRoy Oursler         else if (info->strategy.mode == ISAL_STATEFUL)
1948e4f1a1aSRoy Oursler                 printf("    isal_stateful_deflate->  ");
1951db0363cSGreg Tucker         else if (info->strategy.mode == ISAL_WITH_DICTIONARY)
1961db0363cSGreg Tucker                 printf("    isal_dictionary_deflate-> ");
1978e4f1a1aSRoy Oursler         else if (info->strategy.mode == ZLIB)
1988e4f1a1aSRoy Oursler                 printf("    zlib_deflate->           ");
1998e4f1a1aSRoy Oursler 
200699bb5bdSRoy Oursler         perf_print(info->start, info->file_size);
2018e4f1a1aSRoy Oursler }
2028e4f1a1aSRoy Oursler 
203*55fbfabfSMarcel Cornu void
print_inflate_perf_line(struct perf_info * info)204*55fbfabfSMarcel Cornu print_inflate_perf_line(struct perf_info *info)
2058e4f1a1aSRoy Oursler {
2068e4f1a1aSRoy Oursler         if (info->inflate_mode == ISAL_STATELESS)
2078e4f1a1aSRoy Oursler                 printf("    isal_stateless_inflate-> ");
2088e4f1a1aSRoy Oursler         else if (info->inflate_mode == ISAL_STATEFUL)
2098e4f1a1aSRoy Oursler                 printf("    isal_stateful_inflate->  ");
2101db0363cSGreg Tucker         else if (info->inflate_mode == ISAL_WITH_DICTIONARY)
2111db0363cSGreg Tucker                 printf("    isal_dictionary_inflate-> ");
2128e4f1a1aSRoy Oursler         else if (info->inflate_mode == ZLIB)
2138e4f1a1aSRoy Oursler                 printf("    zlib_inflate->           ");
2148e4f1a1aSRoy Oursler 
215699bb5bdSRoy Oursler         perf_print(info->start, info->file_size);
2168e4f1a1aSRoy Oursler }
2178e4f1a1aSRoy Oursler 
218*55fbfabfSMarcel Cornu int
isal_deflate_round(struct isal_zstream * stream,uint8_t * outbuf,uint32_t outbuf_size,uint8_t * inbuf,uint32_t inbuf_size,uint32_t level,uint8_t * level_buf,uint32_t level_buf_size,int flush_type,int hist_bits)219*55fbfabfSMarcel Cornu isal_deflate_round(struct isal_zstream *stream, uint8_t *outbuf, uint32_t outbuf_size,
220*55fbfabfSMarcel Cornu                    uint8_t *inbuf, uint32_t inbuf_size, uint32_t level, uint8_t *level_buf,
221*55fbfabfSMarcel Cornu                    uint32_t level_buf_size, int flush_type, int hist_bits)
222412abd81SRoy Oursler {
223412abd81SRoy Oursler         int check;
224412abd81SRoy Oursler 
225412abd81SRoy Oursler         /* Setup stream for stateless compression */
226412abd81SRoy Oursler         isal_deflate_init(stream);
227412abd81SRoy Oursler         stream->end_of_stream = 1; /* Do the entire file at once */
228412abd81SRoy Oursler         stream->flush = flush_type;
229412abd81SRoy Oursler         stream->next_in = inbuf;
230412abd81SRoy Oursler         stream->avail_in = inbuf_size;
231412abd81SRoy Oursler         stream->next_out = outbuf;
232412abd81SRoy Oursler         stream->avail_out = outbuf_size;
233412abd81SRoy Oursler         stream->level = level;
234412abd81SRoy Oursler         stream->level_buf = level_buf;
235412abd81SRoy Oursler         stream->level_buf_size = level_buf_size;
236d90220d9SRoy Oursler         stream->hist_bits = hist_bits;
237412abd81SRoy Oursler 
238412abd81SRoy Oursler         /* Compress stream */
239412abd81SRoy Oursler         check = isal_deflate_stateless(stream);
240412abd81SRoy Oursler 
241412abd81SRoy Oursler         /* Verify compression success */
242412abd81SRoy Oursler         if (check || stream->avail_in)
243412abd81SRoy Oursler                 return 1;
244412abd81SRoy Oursler 
245412abd81SRoy Oursler         return 0;
246412abd81SRoy Oursler }
247412abd81SRoy Oursler 
248*55fbfabfSMarcel Cornu int
isal_deflate_dict_round(struct isal_zstream * stream,uint8_t * outbuf,uint32_t outbuf_size,uint8_t * inbuf,uint32_t inbuf_size,uint32_t level,uint8_t * level_buf,uint32_t level_buf_size,int flush_type,int hist_bits,struct isal_dict * dict_str)249*55fbfabfSMarcel Cornu isal_deflate_dict_round(struct isal_zstream *stream, uint8_t *outbuf, uint32_t outbuf_size,
250*55fbfabfSMarcel Cornu                         uint8_t *inbuf, uint32_t inbuf_size, uint32_t level, uint8_t *level_buf,
251*55fbfabfSMarcel Cornu                         uint32_t level_buf_size, int flush_type, int hist_bits,
252*55fbfabfSMarcel Cornu                         struct isal_dict *dict_str)
2531db0363cSGreg Tucker {
2541db0363cSGreg Tucker         int check;
2551db0363cSGreg Tucker 
2561db0363cSGreg Tucker         /* Setup stream for compression with dictionary */
2571db0363cSGreg Tucker         isal_deflate_init(stream);
2581db0363cSGreg Tucker         stream->level = level;
2591db0363cSGreg Tucker         stream->level_buf = level_buf;
2601db0363cSGreg Tucker         stream->level_buf_size = level_buf_size;
2611db0363cSGreg Tucker 
2621db0363cSGreg Tucker         if (COMP_OK != isal_deflate_reset_dict(stream, dict_str))
2631db0363cSGreg Tucker                 return 1;
2641db0363cSGreg Tucker 
2651db0363cSGreg Tucker         stream->end_of_stream = 1;
2661db0363cSGreg Tucker         stream->flush = flush_type;
2671db0363cSGreg Tucker         stream->next_in = inbuf;
2681db0363cSGreg Tucker         stream->avail_in = inbuf_size;
2691db0363cSGreg Tucker         stream->next_out = outbuf;
2701db0363cSGreg Tucker         stream->avail_out = outbuf_size;
2711db0363cSGreg Tucker         stream->hist_bits = hist_bits;
2721db0363cSGreg Tucker 
2731db0363cSGreg Tucker         check = isal_deflate(stream);
2741db0363cSGreg Tucker 
2751db0363cSGreg Tucker         /* Verify Compression Success */
2761db0363cSGreg Tucker         if (COMP_OK != check || stream->avail_in > 0)
2771db0363cSGreg Tucker                 return 1;
2781db0363cSGreg Tucker 
2791db0363cSGreg Tucker         return 0;
2801db0363cSGreg Tucker }
2811db0363cSGreg Tucker 
282*55fbfabfSMarcel Cornu int
isal_inflate_round(struct inflate_state * state,uint8_t * inbuf,uint32_t inbuf_size,uint8_t * outbuf,uint32_t outbuf_size,int hist_bits)283*55fbfabfSMarcel Cornu isal_inflate_round(struct inflate_state *state, uint8_t *inbuf, uint32_t inbuf_size,
284d90220d9SRoy Oursler                    uint8_t *outbuf, uint32_t outbuf_size, int hist_bits)
285412abd81SRoy Oursler {
286412abd81SRoy Oursler         int check = 0;
287412abd81SRoy Oursler 
288412abd81SRoy Oursler         /* Setup for stateless inflate */
289412abd81SRoy Oursler         state->next_in = inbuf;
290412abd81SRoy Oursler         state->avail_in = inbuf_size;
291412abd81SRoy Oursler         state->next_out = outbuf;
292412abd81SRoy Oursler         state->avail_out = outbuf_size;
293412abd81SRoy Oursler         state->crc_flag = ISAL_DEFLATE;
294d90220d9SRoy Oursler         state->hist_bits = hist_bits;
295412abd81SRoy Oursler 
296412abd81SRoy Oursler         /* Inflate data */
297412abd81SRoy Oursler         check = isal_inflate_stateless(state);
298412abd81SRoy Oursler 
299412abd81SRoy Oursler         /* Verify inflate was successful */
300412abd81SRoy Oursler         if (check)
301412abd81SRoy Oursler                 return 1;
302412abd81SRoy Oursler 
303412abd81SRoy Oursler         return 0;
304412abd81SRoy Oursler }
305412abd81SRoy Oursler 
306*55fbfabfSMarcel Cornu int
isal_deflate_stateful_round(struct isal_zstream * stream,uint8_t * outbuf,uint32_t outbuf_size,uint8_t * inbuf,uint32_t inbuf_size,uint32_t in_block_size,uint32_t level,uint8_t * level_buf,uint32_t level_buf_size,int flush_type,int hist_bits)307*55fbfabfSMarcel Cornu isal_deflate_stateful_round(struct isal_zstream *stream, uint8_t *outbuf, uint32_t outbuf_size,
308*55fbfabfSMarcel Cornu                             uint8_t *inbuf, uint32_t inbuf_size, uint32_t in_block_size,
309*55fbfabfSMarcel Cornu                             uint32_t level, uint8_t *level_buf, uint32_t level_buf_size,
310*55fbfabfSMarcel Cornu                             int flush_type, int hist_bits)
311412abd81SRoy Oursler {
312412abd81SRoy Oursler         uint64_t inbuf_remaining;
313940515d5SGreg Tucker         int check = COMP_OK;
314412abd81SRoy Oursler 
315412abd81SRoy Oursler         /* Setup stream for stateful compression */
316412abd81SRoy Oursler         inbuf_remaining = inbuf_size;
317412abd81SRoy Oursler         isal_deflate_init(stream);
318412abd81SRoy Oursler         stream->flush = flush_type;
319412abd81SRoy Oursler         stream->next_in = inbuf;
320412abd81SRoy Oursler         stream->next_out = outbuf;
321412abd81SRoy Oursler         stream->avail_out = outbuf_size;
322412abd81SRoy Oursler         stream->level = level;
323412abd81SRoy Oursler         stream->level_buf = level_buf;
324412abd81SRoy Oursler         stream->level_buf_size = level_buf_size;
325d90220d9SRoy Oursler         stream->hist_bits = hist_bits;
326412abd81SRoy Oursler 
327412abd81SRoy Oursler         /* Keep compressing so long as more data is available and no error has
328412abd81SRoy Oursler          * been hit */
329940515d5SGreg Tucker         while (COMP_OK == check && inbuf_remaining > in_block_size) {
330412abd81SRoy Oursler                 /* Setup next in buffer, assumes out buffer is sufficiently
331412abd81SRoy Oursler                  * large */
332412abd81SRoy Oursler                 stream->avail_in = in_block_size;
333412abd81SRoy Oursler                 inbuf_remaining -= in_block_size;
334412abd81SRoy Oursler 
335412abd81SRoy Oursler                 /* Compress stream */
336412abd81SRoy Oursler                 check = isal_deflate(stream);
337412abd81SRoy Oursler         }
338412abd81SRoy Oursler 
339412abd81SRoy Oursler         /* Finish compressing all remaining input */
340940515d5SGreg Tucker         if (COMP_OK == check) {
341412abd81SRoy Oursler                 stream->avail_in = inbuf_remaining;
342412abd81SRoy Oursler                 stream->end_of_stream = 1;
343412abd81SRoy Oursler                 check = isal_deflate(stream);
344412abd81SRoy Oursler         }
345412abd81SRoy Oursler 
346412abd81SRoy Oursler         /* Verify Compression Success */
347940515d5SGreg Tucker         if (COMP_OK != check || stream->avail_in > 0)
348412abd81SRoy Oursler                 return 1;
349412abd81SRoy Oursler 
350412abd81SRoy Oursler         return 0;
351412abd81SRoy Oursler }
352412abd81SRoy Oursler 
353*55fbfabfSMarcel Cornu int
isal_inflate_stateful_round(struct inflate_state * state,uint8_t * inbuf,uint32_t inbuf_size,uint32_t in_block_size,uint8_t * outbuf,uint32_t outbuf_size,int hist_bits,uint8_t * dict_buf,int dict_file_size)354*55fbfabfSMarcel Cornu isal_inflate_stateful_round(struct inflate_state *state, uint8_t *inbuf, uint32_t inbuf_size,
355*55fbfabfSMarcel Cornu                             uint32_t in_block_size, uint8_t *outbuf, uint32_t outbuf_size,
356*55fbfabfSMarcel Cornu                             int hist_bits, uint8_t *dict_buf, int dict_file_size)
357412abd81SRoy Oursler {
358940515d5SGreg Tucker         int check = ISAL_DECOMP_OK;
359412abd81SRoy Oursler         uint64_t inbuf_remaining;
360412abd81SRoy Oursler 
361412abd81SRoy Oursler         isal_inflate_init(state);
362412abd81SRoy Oursler         state->next_in = inbuf;
363412abd81SRoy Oursler         state->next_out = outbuf;
364412abd81SRoy Oursler         state->avail_out = outbuf_size;
365d90220d9SRoy Oursler         state->hist_bits = hist_bits;
3661db0363cSGreg Tucker         if (dict_file_size != 0)
3671db0363cSGreg Tucker                 isal_inflate_set_dict(state, dict_buf, dict_file_size);
3681db0363cSGreg Tucker 
369412abd81SRoy Oursler         inbuf_remaining = inbuf_size;
370412abd81SRoy Oursler 
371412abd81SRoy Oursler         while (ISAL_DECOMP_OK == check && inbuf_remaining >= in_block_size) {
372412abd81SRoy Oursler                 state->avail_in = in_block_size;
373412abd81SRoy Oursler                 inbuf_remaining -= in_block_size;
374412abd81SRoy Oursler                 check = isal_inflate(state);
375412abd81SRoy Oursler         }
376412abd81SRoy Oursler         if (ISAL_DECOMP_OK == check && inbuf_remaining > 0) {
377412abd81SRoy Oursler                 state->avail_in = inbuf_remaining;
378412abd81SRoy Oursler                 check = isal_inflate(state);
379412abd81SRoy Oursler         }
380412abd81SRoy Oursler 
381412abd81SRoy Oursler         if (ISAL_DECOMP_OK != check || state->avail_in > 0)
382412abd81SRoy Oursler                 return 1;
383412abd81SRoy Oursler 
384412abd81SRoy Oursler         return 0;
385412abd81SRoy Oursler }
386412abd81SRoy Oursler 
387*55fbfabfSMarcel Cornu int
zlib_deflate_round(z_stream * gstream,uint8_t * outbuf,uInt outbuf_size,uint8_t * inbuf,uLong inbuf_size,uLong in_block_size,int level,int flush_type)388*55fbfabfSMarcel Cornu zlib_deflate_round(z_stream *gstream, uint8_t *outbuf, uInt outbuf_size, uint8_t *inbuf,
389*55fbfabfSMarcel Cornu                    uLong inbuf_size, uLong in_block_size, int level, int flush_type)
390412abd81SRoy Oursler {
391412abd81SRoy Oursler         uLong inbuf_remaining;
392412abd81SRoy Oursler         int check = Z_OK;
393412abd81SRoy Oursler 
394412abd81SRoy Oursler         inbuf_remaining = inbuf_size;
395412abd81SRoy Oursler 
396412abd81SRoy Oursler         /* Setup stream for stateful compression */
397412abd81SRoy Oursler         if (0 != deflateReset(gstream))
398412abd81SRoy Oursler                 return 1;
399412abd81SRoy Oursler 
400412abd81SRoy Oursler         gstream->next_in = inbuf;
401412abd81SRoy Oursler         gstream->next_out = outbuf;
402412abd81SRoy Oursler         gstream->avail_out = outbuf_size;
403412abd81SRoy Oursler 
404412abd81SRoy Oursler         /* Keep compressing so long as more data is available and no error has
405412abd81SRoy Oursler          * been hit */
406412abd81SRoy Oursler         while (Z_OK == check && inbuf_remaining > in_block_size) {
407412abd81SRoy Oursler                 gstream->avail_in = in_block_size;
408412abd81SRoy Oursler                 inbuf_remaining -= in_block_size;
409412abd81SRoy Oursler                 check = deflate(gstream, flush_type);
410412abd81SRoy Oursler         }
411412abd81SRoy Oursler 
412412abd81SRoy Oursler         /* Finish compressing all remaining input */
413412abd81SRoy Oursler         if (Z_OK == check) {
414412abd81SRoy Oursler                 gstream->avail_in = inbuf_remaining;
415412abd81SRoy Oursler                 check = deflate(gstream, Z_FINISH);
416412abd81SRoy Oursler         }
417412abd81SRoy Oursler 
418412abd81SRoy Oursler         /* Verify Compression Success */
419412abd81SRoy Oursler         if (Z_STREAM_END != check)
420412abd81SRoy Oursler                 return 1;
421412abd81SRoy Oursler 
422412abd81SRoy Oursler         return 0;
423412abd81SRoy Oursler }
424412abd81SRoy Oursler 
425*55fbfabfSMarcel Cornu int
zlib_inflate_round(z_stream * gstream,uint8_t * inbuf,uLong inbuf_size,uint8_t * outbuf,uInt outbuf_size)426*55fbfabfSMarcel Cornu zlib_inflate_round(z_stream *gstream, uint8_t *inbuf, uLong inbuf_size, uint8_t *outbuf,
427*55fbfabfSMarcel Cornu                    uInt outbuf_size)
428412abd81SRoy Oursler {
429412abd81SRoy Oursler         int check = 0;
430412abd81SRoy Oursler 
431412abd81SRoy Oursler         if (0 != inflateReset(gstream))
432412abd81SRoy Oursler                 return 1;
433412abd81SRoy Oursler 
434412abd81SRoy Oursler         gstream->next_in = inbuf;
435412abd81SRoy Oursler         gstream->avail_in = inbuf_size;
436412abd81SRoy Oursler         gstream->next_out = outbuf;
437412abd81SRoy Oursler         gstream->avail_out = outbuf_size;
438412abd81SRoy Oursler         check = inflate(gstream, Z_FINISH);
439412abd81SRoy Oursler         if (check != Z_STREAM_END)
440412abd81SRoy Oursler                 return 1;
441412abd81SRoy Oursler 
442412abd81SRoy Oursler         return 0;
443412abd81SRoy Oursler }
444412abd81SRoy Oursler 
445*55fbfabfSMarcel Cornu int
isal_deflate_perf(uint8_t * outbuf,uint64_t * outbuf_size,uint8_t * inbuf,uint64_t inbuf_size,int level,int flush_type,int hist_bits,int time,struct perf * start)446*55fbfabfSMarcel Cornu isal_deflate_perf(uint8_t *outbuf, uint64_t *outbuf_size, uint8_t *inbuf, uint64_t inbuf_size,
447*55fbfabfSMarcel Cornu                   int level, int flush_type, int hist_bits, int time, struct perf *start)
4488e4f1a1aSRoy Oursler {
4498e4f1a1aSRoy Oursler         struct isal_zstream stream;
4508e4f1a1aSRoy Oursler         uint8_t *level_buf = NULL;
451699bb5bdSRoy Oursler         int check;
4528e4f1a1aSRoy Oursler 
4538e4f1a1aSRoy Oursler         if (level_size_buf[level] > 0) {
4548e4f1a1aSRoy Oursler                 level_buf = malloc(level_size_buf[level]);
4558e4f1a1aSRoy Oursler                 if (level_buf == NULL)
4568e4f1a1aSRoy Oursler                         return 1;
4578e4f1a1aSRoy Oursler         }
4588e4f1a1aSRoy Oursler 
459*55fbfabfSMarcel Cornu         BENCHMARK(start, time,
460*55fbfabfSMarcel Cornu                   check = isal_deflate_round(&stream, outbuf, *outbuf_size, inbuf, inbuf_size,
461*55fbfabfSMarcel Cornu                                              level, level_buf, level_size_buf[level], flush_type,
462*55fbfabfSMarcel Cornu                                              hist_bits));
4638e4f1a1aSRoy Oursler         *outbuf_size = stream.total_out;
464412abd81SRoy Oursler         return check;
4658e4f1a1aSRoy Oursler }
4668e4f1a1aSRoy Oursler 
467*55fbfabfSMarcel Cornu int
isal_deflate_dict_perf(uint8_t * outbuf,uint64_t * outbuf_size,uint8_t * inbuf,uint64_t inbuf_size,int level,int flush_type,int hist_bits,int time,struct perf * start,uint8_t * dict_buf,int dict_file_size)468*55fbfabfSMarcel Cornu isal_deflate_dict_perf(uint8_t *outbuf, uint64_t *outbuf_size, uint8_t *inbuf, uint64_t inbuf_size,
469*55fbfabfSMarcel Cornu                        int level, int flush_type, int hist_bits, int time, struct perf *start,
470*55fbfabfSMarcel Cornu                        uint8_t *dict_buf, int dict_file_size)
4711db0363cSGreg Tucker {
4721db0363cSGreg Tucker         struct isal_zstream stream;
4731db0363cSGreg Tucker         struct isal_dict dict_str;
4741db0363cSGreg Tucker         uint8_t *level_buf = NULL;
4751db0363cSGreg Tucker         int check;
4761db0363cSGreg Tucker 
4771db0363cSGreg Tucker         if (level_size_buf[level] > 0) {
4781db0363cSGreg Tucker                 level_buf = malloc(level_size_buf[level]);
4791db0363cSGreg Tucker                 if (level_buf == NULL)
4801db0363cSGreg Tucker                         return 1;
4811db0363cSGreg Tucker         }
4821db0363cSGreg Tucker 
4831db0363cSGreg Tucker         stream.level = level;
4845a00eaecSTomasz Kantecki         if (isal_deflate_process_dict(&stream, &dict_str, dict_buf, dict_file_size) != COMP_OK) {
4855a00eaecSTomasz Kantecki                 if (level_buf != NULL)
4865a00eaecSTomasz Kantecki                         free(level_buf);
4875a00eaecSTomasz Kantecki                 return 1;
4885a00eaecSTomasz Kantecki         }
4891db0363cSGreg Tucker 
490*55fbfabfSMarcel Cornu         BENCHMARK(start, time,
491*55fbfabfSMarcel Cornu                   check = isal_deflate_dict_round(&stream, outbuf, *outbuf_size, inbuf, inbuf_size,
492*55fbfabfSMarcel Cornu                                                   level, level_buf, level_size_buf[level],
493*55fbfabfSMarcel Cornu                                                   flush_type, hist_bits, &dict_str));
4945a00eaecSTomasz Kantecki         if (level_buf != NULL)
4955a00eaecSTomasz Kantecki                 free(level_buf);
4961db0363cSGreg Tucker         *outbuf_size = stream.total_out;
4971db0363cSGreg Tucker         return check;
4981db0363cSGreg Tucker }
4991db0363cSGreg Tucker 
500*55fbfabfSMarcel Cornu int
isal_deflate_stateful_perf(uint8_t * outbuf,uint64_t * outbuf_size,uint8_t * inbuf,uint64_t inbuf_size,int level,int flush_type,uint64_t in_block_size,int hist_bits,int time,struct perf * start)501*55fbfabfSMarcel Cornu isal_deflate_stateful_perf(uint8_t *outbuf, uint64_t *outbuf_size, uint8_t *inbuf,
502*55fbfabfSMarcel Cornu                            uint64_t inbuf_size, int level, int flush_type, uint64_t in_block_size,
503*55fbfabfSMarcel Cornu                            int hist_bits, int time, struct perf *start)
5048e4f1a1aSRoy Oursler {
5058e4f1a1aSRoy Oursler         struct isal_zstream stream;
5068e4f1a1aSRoy Oursler         uint8_t *level_buf = NULL;
507699bb5bdSRoy Oursler         int check;
5088e4f1a1aSRoy Oursler 
5098e4f1a1aSRoy Oursler         if (in_block_size == 0)
5108e4f1a1aSRoy Oursler                 in_block_size = inbuf_size;
5118e4f1a1aSRoy Oursler 
5128e4f1a1aSRoy Oursler         if (level_size_buf[level] > 0) {
5138e4f1a1aSRoy Oursler                 level_buf = malloc(level_size_buf[level]);
5148e4f1a1aSRoy Oursler                 if (level_buf == NULL)
5158e4f1a1aSRoy Oursler                         return 1;
5168e4f1a1aSRoy Oursler         }
5178e4f1a1aSRoy Oursler 
518*55fbfabfSMarcel Cornu         BENCHMARK(start, time,
519*55fbfabfSMarcel Cornu                   check = isal_deflate_stateful_round(
520*55fbfabfSMarcel Cornu                           &stream, outbuf, *outbuf_size, inbuf, inbuf_size, in_block_size, level,
521*55fbfabfSMarcel Cornu                           level_buf, level_size_buf[level], flush_type, hist_bits));
5228e4f1a1aSRoy Oursler         *outbuf_size = stream.total_out;
523699bb5bdSRoy Oursler         return check;
5248e4f1a1aSRoy Oursler }
5258e4f1a1aSRoy Oursler 
526*55fbfabfSMarcel Cornu int
zlib_deflate_perf(uint8_t * outbuf,uint64_t * outbuf_size,uint8_t * inbuf,uint64_t inbuf_size,int level,int flush_type,uint64_t in_block_size,int hist_bits,int time,struct perf * start)527*55fbfabfSMarcel Cornu zlib_deflate_perf(uint8_t *outbuf, uint64_t *outbuf_size, uint8_t *inbuf, uint64_t inbuf_size,
528*55fbfabfSMarcel Cornu                   int level, int flush_type, uint64_t in_block_size, int hist_bits, int time,
529*55fbfabfSMarcel Cornu                   struct perf *start)
5308e4f1a1aSRoy Oursler {
531699bb5bdSRoy Oursler         int check;
5328e4f1a1aSRoy Oursler         z_stream gstream;
533cb176252SRoy Oursler         int flush_translator[] = { Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FULL_FLUSH };
534cb176252SRoy Oursler 
535cb176252SRoy Oursler         if (in_block_size == 0)
536cb176252SRoy Oursler                 in_block_size = inbuf_size;
537cb176252SRoy Oursler 
538cb176252SRoy Oursler         flush_type = flush_translator[flush_type];
5398e4f1a1aSRoy Oursler 
540412abd81SRoy Oursler         /* Initialize the gstream buffer */
5418e4f1a1aSRoy Oursler         gstream.next_in = inbuf;
5428e4f1a1aSRoy Oursler         gstream.avail_in = inbuf_size;
5438e4f1a1aSRoy Oursler         gstream.zalloc = Z_NULL;
5448e4f1a1aSRoy Oursler         gstream.zfree = Z_NULL;
5458e4f1a1aSRoy Oursler         gstream.opaque = Z_NULL;
546d90220d9SRoy Oursler 
547d90220d9SRoy Oursler         if (hist_bits == 0)
548d90220d9SRoy Oursler                 hist_bits = -15;
549d90220d9SRoy Oursler         else
550d90220d9SRoy Oursler                 hist_bits = -hist_bits;
551d90220d9SRoy Oursler 
552d90220d9SRoy Oursler         if (0 != deflateInit2(&gstream, level, Z_DEFLATED, hist_bits, 9, Z_DEFAULT_STRATEGY))
5538e4f1a1aSRoy Oursler                 return 1;
5548e4f1a1aSRoy Oursler 
555*55fbfabfSMarcel Cornu         BENCHMARK(start, time,
556*55fbfabfSMarcel Cornu                   check = zlib_deflate_round(&gstream, outbuf, *outbuf_size, inbuf, inbuf_size,
557699bb5bdSRoy Oursler                                              in_block_size, level, flush_type));
5588e4f1a1aSRoy Oursler 
5598e4f1a1aSRoy Oursler         *outbuf_size = gstream.total_out;
560412abd81SRoy Oursler         deflateEnd(&gstream);
561412abd81SRoy Oursler 
562412abd81SRoy Oursler         return check;
5638e4f1a1aSRoy Oursler }
5648e4f1a1aSRoy Oursler 
565*55fbfabfSMarcel Cornu int
isal_inflate_perf(uint8_t * inbuf,uint64_t inbuf_size,uint8_t * outbuf,uint64_t outbuf_size,uint8_t * filebuf,uint64_t file_size,int hist_bits,int time,struct perf * start)566*55fbfabfSMarcel Cornu isal_inflate_perf(uint8_t *inbuf, uint64_t inbuf_size, uint8_t *outbuf, uint64_t outbuf_size,
567*55fbfabfSMarcel Cornu                   uint8_t *filebuf, uint64_t file_size, int hist_bits, int time, struct perf *start)
5688e4f1a1aSRoy Oursler {
5698e4f1a1aSRoy Oursler         struct inflate_state state;
570699bb5bdSRoy Oursler         int check;
5718e4f1a1aSRoy Oursler 
5728e4f1a1aSRoy Oursler         /* Check that data decompresses */
573d90220d9SRoy Oursler         check = isal_inflate_round(&state, inbuf, inbuf_size, outbuf, outbuf_size, hist_bits);
5748e4f1a1aSRoy Oursler         if (check || state.total_out != file_size || memcmp(outbuf, filebuf, file_size))
5758e4f1a1aSRoy Oursler                 return 1;
5768e4f1a1aSRoy Oursler 
577*55fbfabfSMarcel Cornu         BENCHMARK(start, time,
578*55fbfabfSMarcel Cornu                   isal_inflate_round(&state, inbuf, inbuf_size, outbuf, outbuf_size, hist_bits));
5798e4f1a1aSRoy Oursler 
580412abd81SRoy Oursler         return check;
5818e4f1a1aSRoy Oursler }
5828e4f1a1aSRoy Oursler 
583*55fbfabfSMarcel Cornu int
isal_inflate_stateful_perf(uint8_t * inbuf,uint64_t inbuf_size,uint8_t * outbuf,uint64_t outbuf_size,uint8_t * filebuf,uint64_t file_size,uint64_t in_block_size,int hist_bits,int time,struct perf * start,uint8_t * dict_buf,int dict_file_size)584*55fbfabfSMarcel Cornu isal_inflate_stateful_perf(uint8_t *inbuf, uint64_t inbuf_size, uint8_t *outbuf,
5858e4f1a1aSRoy Oursler                            uint64_t outbuf_size, uint8_t *filebuf, uint64_t file_size,
586*55fbfabfSMarcel Cornu                            uint64_t in_block_size, int hist_bits, int time, struct perf *start,
587*55fbfabfSMarcel Cornu                            uint8_t *dict_buf, int dict_file_size)
5888e4f1a1aSRoy Oursler {
5898e4f1a1aSRoy Oursler         struct inflate_state state;
590699bb5bdSRoy Oursler         int check;
5918e4f1a1aSRoy Oursler 
5928e4f1a1aSRoy Oursler         if (in_block_size == 0)
5938e4f1a1aSRoy Oursler                 in_block_size = inbuf_size;
5948e4f1a1aSRoy Oursler 
5951db0363cSGreg Tucker         check = isal_inflate_stateful_round(&state, inbuf, inbuf_size, in_block_size, outbuf,
5961db0363cSGreg Tucker                                             outbuf_size, hist_bits, dict_buf, dict_file_size);
5978e4f1a1aSRoy Oursler         if (check || state.total_out != file_size || memcmp(outbuf, filebuf, file_size))
5988e4f1a1aSRoy Oursler                 return 1;
5998e4f1a1aSRoy Oursler 
600699bb5bdSRoy Oursler         BENCHMARK(start, time,
601699bb5bdSRoy Oursler                   isal_inflate_stateful_round(&state, inbuf, inbuf_size, in_block_size, outbuf,
602*55fbfabfSMarcel Cornu                                               outbuf_size, hist_bits, dict_buf, dict_file_size));
6038e4f1a1aSRoy Oursler 
6048e4f1a1aSRoy Oursler         return 0;
6058e4f1a1aSRoy Oursler }
6068e4f1a1aSRoy Oursler 
607*55fbfabfSMarcel Cornu int
zlib_inflate_perf(uint8_t * inbuf,uint64_t inbuf_size,uint8_t * outbuf,uint64_t outbuf_size,uint8_t * filebuf,uint64_t file_size,int hist_bits,int time,struct perf * start)608*55fbfabfSMarcel Cornu zlib_inflate_perf(uint8_t *inbuf, uint64_t inbuf_size, uint8_t *outbuf, uint64_t outbuf_size,
609*55fbfabfSMarcel Cornu                   uint8_t *filebuf, uint64_t file_size, int hist_bits, int time, struct perf *start)
6108e4f1a1aSRoy Oursler {
611699bb5bdSRoy Oursler         int check;
6128e4f1a1aSRoy Oursler         z_stream gstream;
6138e4f1a1aSRoy Oursler 
6148e4f1a1aSRoy Oursler         gstream.next_in = inbuf;
6158e4f1a1aSRoy Oursler         gstream.avail_in = inbuf_size;
6168e4f1a1aSRoy Oursler         gstream.zalloc = Z_NULL;
6178e4f1a1aSRoy Oursler         gstream.zfree = Z_NULL;
6188e4f1a1aSRoy Oursler         gstream.opaque = Z_NULL;
619d90220d9SRoy Oursler 
620d90220d9SRoy Oursler         if (hist_bits == 0)
621d90220d9SRoy Oursler                 hist_bits = -15;
622d90220d9SRoy Oursler         else
623d90220d9SRoy Oursler                 hist_bits = -hist_bits;
624d90220d9SRoy Oursler 
625d90220d9SRoy Oursler         if (0 != inflateInit2(&gstream, hist_bits))
6268e4f1a1aSRoy Oursler                 return 1;
6278e4f1a1aSRoy Oursler 
628412abd81SRoy Oursler         check = zlib_inflate_round(&gstream, inbuf, inbuf_size, outbuf, outbuf_size);
629412abd81SRoy Oursler         if (check || gstream.total_out != file_size || memcmp(outbuf, filebuf, file_size))
6308e4f1a1aSRoy Oursler                 return 1;
6318e4f1a1aSRoy Oursler 
632699bb5bdSRoy Oursler         BENCHMARK(start, time,
633699bb5bdSRoy Oursler                   zlib_inflate_round(&gstream, inbuf, inbuf_size, outbuf, outbuf_size));
6348e4f1a1aSRoy Oursler 
6358e4f1a1aSRoy Oursler         inflateEnd(&gstream);
6368e4f1a1aSRoy Oursler         return 0;
6378e4f1a1aSRoy Oursler }
6388e4f1a1aSRoy Oursler 
639*55fbfabfSMarcel Cornu int
main(int argc,char * argv[])640*55fbfabfSMarcel Cornu main(int argc, char *argv[])
6418e4f1a1aSRoy Oursler {
6428e4f1a1aSRoy Oursler         FILE *in = NULL;
6431db0363cSGreg Tucker         FILE *dict_fn = NULL;
6448e4f1a1aSRoy Oursler         unsigned char *compressbuf, *decompbuf, *filebuf;
64535e90e73SRoy Oursler         char *outfile = NULL;
6468e4f1a1aSRoy Oursler         int i, c, ret = 0;
6471db0363cSGreg Tucker         int dict_file_size = 0;
6481db0363cSGreg Tucker         uint8_t *dict_buf = NULL;
6498e4f1a1aSRoy Oursler         uint64_t decompbuf_size, compressbuf_size;
6502458a651SRoy Oursler         uint64_t block_count;
6518e4f1a1aSRoy Oursler 
6528e4f1a1aSRoy Oursler         struct compress_strategy compression_queue[COMPRESSION_QUEUE_LIMIT];
6538e4f1a1aSRoy Oursler 
6548e4f1a1aSRoy Oursler         int compression_queue_size = 0;
6558e4f1a1aSRoy Oursler         struct compress_strategy compress_strat;
6568e4f1a1aSRoy Oursler         struct inflate_modes inflate_strat = { 0 };
6578e4f1a1aSRoy Oursler         struct perf_info info;
6585793a851SRoy Oursler         init_perf_info(&info);
6598e4f1a1aSRoy Oursler 
6608e4f1a1aSRoy Oursler         while ((c = getopt(argc, argv, OPTARGS)) != -1) {
6618e4f1a1aSRoy Oursler                 switch (c) {
6628e4f1a1aSRoy Oursler                 case 'l':
6638e4f1a1aSRoy Oursler                         if (compression_queue_size >= COMPRESSION_QUEUE_LIMIT) {
6648e4f1a1aSRoy Oursler                                 printf("Too many levels specified");
6658e4f1a1aSRoy Oursler                                 exit(0);
6668e4f1a1aSRoy Oursler                         }
6678e4f1a1aSRoy Oursler 
6688e4f1a1aSRoy Oursler                         compress_strat.mode = ISAL_STATELESS;
6698e4f1a1aSRoy Oursler                         compress_strat.level = atoi(optarg);
6708e4f1a1aSRoy Oursler                         if (compress_strat.level > ISAL_DEF_MAX_LEVEL) {
6718e4f1a1aSRoy Oursler                                 printf("Unsupported isa-l compression level\n");
6728e4f1a1aSRoy Oursler                                 exit(0);
6738e4f1a1aSRoy Oursler                         }
6748e4f1a1aSRoy Oursler 
6758e4f1a1aSRoy Oursler                         compression_queue[compression_queue_size] = compress_strat;
6768e4f1a1aSRoy Oursler                         compression_queue_size++;
6778e4f1a1aSRoy Oursler                         break;
6788e4f1a1aSRoy Oursler                 case 'f':
6798e4f1a1aSRoy Oursler                         if (compression_queue_size >= COMPRESSION_QUEUE_LIMIT) {
6808e4f1a1aSRoy Oursler                                 printf("Too many levels specified");
6818e4f1a1aSRoy Oursler                                 exit(0);
6828e4f1a1aSRoy Oursler                         }
6838e4f1a1aSRoy Oursler 
6848e4f1a1aSRoy Oursler                         compress_strat.mode = ISAL_STATEFUL;
6858e4f1a1aSRoy Oursler                         compress_strat.level = atoi(optarg);
6868e4f1a1aSRoy Oursler                         if (compress_strat.level > ISAL_DEF_MAX_LEVEL) {
6878e4f1a1aSRoy Oursler                                 printf("Unsupported isa-l compression level\n");
6888e4f1a1aSRoy Oursler                                 exit(0);
6898e4f1a1aSRoy Oursler                         }
6908e4f1a1aSRoy Oursler 
6918e4f1a1aSRoy Oursler                         compression_queue[compression_queue_size] = compress_strat;
6928e4f1a1aSRoy Oursler                         compression_queue_size++;
6938e4f1a1aSRoy Oursler                         break;
6948e4f1a1aSRoy Oursler                 case 'z':
6958e4f1a1aSRoy Oursler                         if (compression_queue_size >= COMPRESSION_QUEUE_LIMIT) {
6968e4f1a1aSRoy Oursler                                 printf("Too many levels specified");
6978e4f1a1aSRoy Oursler                                 exit(0);
6988e4f1a1aSRoy Oursler                         }
6998e4f1a1aSRoy Oursler 
7008e4f1a1aSRoy Oursler                         compress_strat.mode = ZLIB;
7018e4f1a1aSRoy Oursler                         compress_strat.level = atoi(optarg);
7028e4f1a1aSRoy Oursler                         if (compress_strat.level > Z_BEST_COMPRESSION) {
7038e4f1a1aSRoy Oursler                                 printf("Unsupported zlib compression level\n");
7048e4f1a1aSRoy Oursler                                 exit(0);
7058e4f1a1aSRoy Oursler                         }
7068e4f1a1aSRoy Oursler                         compression_queue[compression_queue_size] = compress_strat;
7078e4f1a1aSRoy Oursler                         compression_queue_size++;
7088e4f1a1aSRoy Oursler                         break;
7098e4f1a1aSRoy Oursler                 case 'i':
710699bb5bdSRoy Oursler                         info.inflate_time = atoi(optarg);
711699bb5bdSRoy Oursler                         if (info.inflate_time < 0)
7128e4f1a1aSRoy Oursler                                 usage();
7138e4f1a1aSRoy Oursler                         break;
7148e4f1a1aSRoy Oursler                 case 'd':
715699bb5bdSRoy Oursler                         info.deflate_time = atoi(optarg);
716699bb5bdSRoy Oursler                         if (info.deflate_time < 0)
7178e4f1a1aSRoy Oursler                                 usage();
7188e4f1a1aSRoy Oursler                         break;
7191db0363cSGreg Tucker                 case 'D':
7201db0363cSGreg Tucker                         dict_fn = fopen(optarg, "rb");
7211db0363cSGreg Tucker                         if (!dict_fn) {
7221db0363cSGreg Tucker                                 printf("Can't open dictionary for reading\n");
7231db0363cSGreg Tucker                                 exit(0);
7241db0363cSGreg Tucker                         }
7251db0363cSGreg Tucker                         dict_file_size = get_filesize(dict_fn);
7261db0363cSGreg Tucker                         dict_buf = malloc(dict_file_size);
7271db0363cSGreg Tucker                         if (dict_buf == NULL || dict_file_size == 0) {
7281db0363cSGreg Tucker                                 printf("Can't allocate mem for dictionary buffer\n");
7291db0363cSGreg Tucker                                 exit(0);
7301db0363cSGreg Tucker                         }
7311db0363cSGreg Tucker                         if (dict_file_size != fread(dict_buf, 1, dict_file_size, dict_fn)) {
7321db0363cSGreg Tucker                                 printf("Couldn't read all of dictionary file\n");
7331db0363cSGreg Tucker                                 exit(0);
7341db0363cSGreg Tucker                         }
7351db0363cSGreg Tucker                         fclose(dict_fn);
7361db0363cSGreg Tucker                         break;
7378e4f1a1aSRoy Oursler                 case 's':
7388e4f1a1aSRoy Oursler                         inflate_strat.stateful = 1;
7398e4f1a1aSRoy Oursler                         break;
7408e4f1a1aSRoy Oursler                 case 't':
7418e4f1a1aSRoy Oursler                         inflate_strat.stateless = 1;
7428e4f1a1aSRoy Oursler                         break;
7438e4f1a1aSRoy Oursler                 case 'u':
7448e4f1a1aSRoy Oursler                         inflate_strat.zlib = 1;
7458e4f1a1aSRoy Oursler                         break;
7468e4f1a1aSRoy Oursler                 case 'b':
7478e4f1a1aSRoy Oursler                         inflate_strat.stateful = 1;
7488e4f1a1aSRoy Oursler                         info.inblock_size = atoi(optarg);
7498e4f1a1aSRoy Oursler                         break;
75018fd9965SRoy Oursler                 case 'y':
75118fd9965SRoy Oursler                         info.flush_type = atoi(optarg);
752*55fbfabfSMarcel Cornu                         if (info.flush_type != NO_FLUSH && info.flush_type != SYNC_FLUSH &&
753*55fbfabfSMarcel Cornu                             info.flush_type != FULL_FLUSH) {
75418fd9965SRoy Oursler                                 printf("Unsupported flush type\n");
75518fd9965SRoy Oursler                                 exit(0);
75618fd9965SRoy Oursler                         }
75718fd9965SRoy Oursler                         break;
758d90220d9SRoy Oursler 
759d90220d9SRoy Oursler                 case 'w':
760d90220d9SRoy Oursler                         info.hist_bits = atoi(optarg);
761d90220d9SRoy Oursler                         if (info.hist_bits > 15 || info.hist_bits < 9)
762d90220d9SRoy Oursler                                 usage();
763d90220d9SRoy Oursler                         break;
76435e90e73SRoy Oursler                 case 'o':
76535e90e73SRoy Oursler                         outfile = optarg;
76635e90e73SRoy Oursler                         break;
7678e4f1a1aSRoy Oursler                 case 'h':
7688e4f1a1aSRoy Oursler                 default:
7698e4f1a1aSRoy Oursler                         usage();
7708e4f1a1aSRoy Oursler                         break;
7718e4f1a1aSRoy Oursler                 }
7728e4f1a1aSRoy Oursler         }
7738e4f1a1aSRoy Oursler 
7748e4f1a1aSRoy Oursler         if (optind >= argc)
7758e4f1a1aSRoy Oursler                 usage();
7768e4f1a1aSRoy Oursler 
7778e4f1a1aSRoy Oursler         if (!inflate_strat.stateless && !inflate_strat.stateful && !inflate_strat.zlib) {
7788e4f1a1aSRoy Oursler                 if (info.inblock_size == 0)
7798e4f1a1aSRoy Oursler                         inflate_strat.stateless = 1;
7808e4f1a1aSRoy Oursler                 else
7818e4f1a1aSRoy Oursler                         inflate_strat.stateful = 1;
7828e4f1a1aSRoy Oursler         }
7838e4f1a1aSRoy Oursler 
7848e4f1a1aSRoy Oursler         /* Allocate space for entire input file and output
7858e4f1a1aSRoy Oursler          * (assuming some possible expansion on output size)
7868e4f1a1aSRoy Oursler          */
7878e4f1a1aSRoy Oursler         info.file_name = argv[optind];
7888e4f1a1aSRoy Oursler         in = fopen(info.file_name, "rb");
7898e4f1a1aSRoy Oursler         if (NULL == in) {
7908e4f1a1aSRoy Oursler                 printf("Error: Can not find file %s\n", info.file_name);
7918e4f1a1aSRoy Oursler                 exit(0);
7928e4f1a1aSRoy Oursler         }
7938e4f1a1aSRoy Oursler 
7948e4f1a1aSRoy Oursler         info.file_size = get_filesize(in);
7958e4f1a1aSRoy Oursler         if (info.file_size == 0) {
7968e4f1a1aSRoy Oursler                 printf("Error: input file has 0 size\n");
7978e4f1a1aSRoy Oursler                 exit(0);
7988e4f1a1aSRoy Oursler         }
7998e4f1a1aSRoy Oursler 
8008e4f1a1aSRoy Oursler         decompbuf_size = info.file_size;
8018e4f1a1aSRoy Oursler 
8028e4f1a1aSRoy Oursler         if (compression_queue_size == 0) {
8038e4f1a1aSRoy Oursler                 if (info.inblock_size == 0)
8048e4f1a1aSRoy Oursler                         compression_queue[0].mode = ISAL_STATELESS;
8058e4f1a1aSRoy Oursler                 else
8068e4f1a1aSRoy Oursler                         compression_queue[0].mode = ISAL_STATEFUL;
8078e4f1a1aSRoy Oursler                 compression_queue[0].level = 1;
8088e4f1a1aSRoy Oursler                 compression_queue_size = 1;
8098e4f1a1aSRoy Oursler         }
8108e4f1a1aSRoy Oursler 
8118e4f1a1aSRoy Oursler         filebuf = malloc(info.file_size);
8128e4f1a1aSRoy Oursler         if (filebuf == NULL) {
8138e4f1a1aSRoy Oursler                 fprintf(stderr, "Can't allocate temp buffer memory\n");
8148e4f1a1aSRoy Oursler                 exit(0);
8158e4f1a1aSRoy Oursler         }
8168e4f1a1aSRoy Oursler 
8172458a651SRoy Oursler         block_count = 1;
8182458a651SRoy Oursler         if (info.flush_type > 0)
8192458a651SRoy Oursler                 block_count = (info.file_size + info.inblock_size - 1) / info.inblock_size;
8202458a651SRoy Oursler 
8212458a651SRoy Oursler         /* Way overestimate likely compressed size to handle bad type 0 and
8222458a651SRoy Oursler          * small block_size case */
8232458a651SRoy Oursler         compressbuf_size = block_count * ISAL_DEF_MAX_HDR_SIZE + 2 * info.file_size;
8242458a651SRoy Oursler         if (compressbuf_size >= MAX_COMPRESS_BUF_SIZE)
8252458a651SRoy Oursler                 compressbuf_size = MAX_COMPRESS_BUF_SIZE;
8262458a651SRoy Oursler 
8278e4f1a1aSRoy Oursler         compressbuf = malloc(compressbuf_size);
8288e4f1a1aSRoy Oursler         if (compressbuf == NULL) {
8298e4f1a1aSRoy Oursler                 fprintf(stderr, "Can't allocate input buffer memory\n");
8308e4f1a1aSRoy Oursler                 exit(0);
8318e4f1a1aSRoy Oursler         }
8322458a651SRoy Oursler 
8338e4f1a1aSRoy Oursler         decompbuf = malloc(decompbuf_size);
8348e4f1a1aSRoy Oursler         if (decompbuf == NULL) {
8358e4f1a1aSRoy Oursler                 fprintf(stderr, "Can't allocate output buffer memory\n");
8368e4f1a1aSRoy Oursler                 exit(0);
8378e4f1a1aSRoy Oursler         }
8388e4f1a1aSRoy Oursler 
8398e4f1a1aSRoy Oursler         if (info.file_size != fread(filebuf, 1, info.file_size, in)) {
8408e4f1a1aSRoy Oursler                 fprintf(stderr, "Could not read in all input\n");
8418e4f1a1aSRoy Oursler                 exit(0);
8428e4f1a1aSRoy Oursler         }
8438e4f1a1aSRoy Oursler         fclose(in);
8448e4f1a1aSRoy Oursler 
8458e4f1a1aSRoy Oursler         for (i = 0; i < compression_queue_size; i++) {
8468e4f1a1aSRoy Oursler                 if (i > 0)
8478e4f1a1aSRoy Oursler                         printf("\n\n");
8488e4f1a1aSRoy Oursler 
8498e4f1a1aSRoy Oursler                 info.strategy = compression_queue[i];
8508e4f1a1aSRoy Oursler                 print_perf_info_line(&info);
8518e4f1a1aSRoy Oursler 
8528e4f1a1aSRoy Oursler                 info.deflate_size = compressbuf_size;
8538e4f1a1aSRoy Oursler 
8541db0363cSGreg Tucker                 if (dict_file_size != 0) {
8551db0363cSGreg Tucker                         info.strategy.mode = ISAL_WITH_DICTIONARY;
856*55fbfabfSMarcel Cornu                         ret = isal_deflate_dict_perf(
857*55fbfabfSMarcel Cornu                                 compressbuf, &info.deflate_size, filebuf, info.file_size,
858*55fbfabfSMarcel Cornu                                 compression_queue[i].level, info.flush_type, info.hist_bits,
859*55fbfabfSMarcel Cornu                                 info.deflate_time, &info.start, dict_buf, dict_file_size);
8601db0363cSGreg Tucker                 } else if (info.strategy.mode == ISAL_STATELESS)
8618e4f1a1aSRoy Oursler                         ret = isal_deflate_perf(compressbuf, &info.deflate_size, filebuf,
862*55fbfabfSMarcel Cornu                                                 info.file_size, compression_queue[i].level,
863*55fbfabfSMarcel Cornu                                                 info.flush_type, info.hist_bits, info.deflate_time,
864*55fbfabfSMarcel Cornu                                                 &info.start);
8651db0363cSGreg Tucker 
8668e4f1a1aSRoy Oursler                 else if (info.strategy.mode == ISAL_STATEFUL)
867*55fbfabfSMarcel Cornu                         ret = isal_deflate_stateful_perf(
868*55fbfabfSMarcel Cornu                                 compressbuf, &info.deflate_size, filebuf, info.file_size,
869*55fbfabfSMarcel Cornu                                 compression_queue[i].level, info.flush_type, info.inblock_size,
870*55fbfabfSMarcel Cornu                                 info.hist_bits, info.deflate_time, &info.start);
8718e4f1a1aSRoy Oursler                 else if (info.strategy.mode == ZLIB)
8728e4f1a1aSRoy Oursler                         ret = zlib_deflate_perf(compressbuf, &info.deflate_size, filebuf,
8738e4f1a1aSRoy Oursler                                                 info.file_size, compression_queue[i].level,
874*55fbfabfSMarcel Cornu                                                 info.flush_type, info.inblock_size, info.hist_bits,
875*55fbfabfSMarcel Cornu                                                 info.deflate_time, &info.start);
8768e4f1a1aSRoy Oursler                 if (ret) {
8778e4f1a1aSRoy Oursler                         printf("  Error in compression\n");
8788e4f1a1aSRoy Oursler                         continue;
8798e4f1a1aSRoy Oursler                 }
8808e4f1a1aSRoy Oursler 
8818e4f1a1aSRoy Oursler                 print_file_line(&info);
8828e4f1a1aSRoy Oursler                 printf("\n");
8838e4f1a1aSRoy Oursler                 print_deflate_perf_line(&info);
8848e4f1a1aSRoy Oursler                 printf("\n");
8858e4f1a1aSRoy Oursler 
88635e90e73SRoy Oursler                 if (outfile != NULL && i + 1 == compression_queue_size) {
8875a00eaecSTomasz Kantecki                         FILE *out = fopen(outfile, "wb");
8885a00eaecSTomasz Kantecki 
8895a00eaecSTomasz Kantecki                         if (out == NULL) {
8905a00eaecSTomasz Kantecki                                 fprintf(stderr, "Could not write to the output file \"%s\"\n",
8915a00eaecSTomasz Kantecki                                         outfile);
8925a00eaecSTomasz Kantecki                                 exit(0);
8935a00eaecSTomasz Kantecki                         }
89435e90e73SRoy Oursler                         fwrite(compressbuf, 1, info.deflate_size, out);
89535e90e73SRoy Oursler                         fclose(out);
89635e90e73SRoy Oursler                 }
89735e90e73SRoy Oursler 
898699bb5bdSRoy Oursler                 if (info.inflate_time == 0)
8995793a851SRoy Oursler                         continue;
9005793a851SRoy Oursler 
9018e4f1a1aSRoy Oursler                 if (inflate_strat.stateless) {
9021db0363cSGreg Tucker                         if (dict_file_size != 0)
9031db0363cSGreg Tucker                                 continue;
9041db0363cSGreg Tucker 
9058e4f1a1aSRoy Oursler                         info.inflate_mode = ISAL_STATELESS;
9068e4f1a1aSRoy Oursler                         ret = isal_inflate_perf(compressbuf, info.deflate_size, decompbuf,
9078e4f1a1aSRoy Oursler                                                 decompbuf_size, filebuf, info.file_size,
908*55fbfabfSMarcel Cornu                                                 info.hist_bits, info.inflate_time, &info.start);
9098e4f1a1aSRoy Oursler                         if (ret)
9108e4f1a1aSRoy Oursler                                 printf("    Error in isal stateless inflate\n");
9118e4f1a1aSRoy Oursler                         else
9128e4f1a1aSRoy Oursler                                 print_inflate_perf_line(&info);
9138e4f1a1aSRoy Oursler                 }
9148e4f1a1aSRoy Oursler 
9158e4f1a1aSRoy Oursler                 if (inflate_strat.stateful) {
9161db0363cSGreg Tucker                         info.inflate_mode =
9171db0363cSGreg Tucker                                 (dict_file_size == 0) ? ISAL_STATEFUL : ISAL_WITH_DICTIONARY;
9181db0363cSGreg Tucker 
919*55fbfabfSMarcel Cornu                         ret = isal_inflate_stateful_perf(
920*55fbfabfSMarcel Cornu                                 compressbuf, info.deflate_size, decompbuf, decompbuf_size, filebuf,
921*55fbfabfSMarcel Cornu                                 info.file_size, info.inblock_size, info.hist_bits,
922*55fbfabfSMarcel Cornu                                 info.inflate_time, &info.start, dict_buf, dict_file_size);
9238e4f1a1aSRoy Oursler 
9248e4f1a1aSRoy Oursler                         if (ret)
9258e4f1a1aSRoy Oursler                                 printf("    Error in isal stateful inflate\n");
9268e4f1a1aSRoy Oursler                         else
9278e4f1a1aSRoy Oursler                                 print_inflate_perf_line(&info);
9288e4f1a1aSRoy Oursler                 }
9298e4f1a1aSRoy Oursler 
9308e4f1a1aSRoy Oursler                 if (inflate_strat.zlib) {
9318e4f1a1aSRoy Oursler                         info.inflate_mode = ZLIB;
9328e4f1a1aSRoy Oursler                         ret = zlib_inflate_perf(compressbuf, info.deflate_size, decompbuf,
9338e4f1a1aSRoy Oursler                                                 decompbuf_size, filebuf, info.file_size,
934*55fbfabfSMarcel Cornu                                                 info.hist_bits, info.inflate_time, &info.start);
9358e4f1a1aSRoy Oursler                         if (ret)
9368e4f1a1aSRoy Oursler                                 printf("    Error in zlib inflate\n");
9378e4f1a1aSRoy Oursler                         else
9388e4f1a1aSRoy Oursler                                 print_inflate_perf_line(&info);
9398e4f1a1aSRoy Oursler                 }
9408e4f1a1aSRoy Oursler         }
9418e4f1a1aSRoy Oursler 
9428e4f1a1aSRoy Oursler         free(compressbuf);
9438e4f1a1aSRoy Oursler         free(decompbuf);
9448e4f1a1aSRoy Oursler         free(filebuf);
9451db0363cSGreg Tucker         if (dict_buf != NULL)
9461db0363cSGreg Tucker                 free(dict_buf);
9478e4f1a1aSRoy Oursler         return 0;
9488e4f1a1aSRoy Oursler }
949