mirror of
https://github.com/intel/isa-l.git
synced 2024-12-12 17:33:50 +01:00
igzip: reformat using new code style
Signed-off-by: Marcel Cornu <marcel.d.cornu@intel.com>
This commit is contained in:
parent
9d99f8215d
commit
55fbfabfc6
@ -31,221 +31,215 @@
|
|||||||
DEFINE_INTERFACE_DISPATCHER(isal_adler32)
|
DEFINE_INTERFACE_DISPATCHER(isal_adler32)
|
||||||
{
|
{
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
unsigned long auxval = getauxval(AT_HWCAP);
|
unsigned long auxval = getauxval(AT_HWCAP);
|
||||||
if (auxval & HWCAP_ASIMD)
|
if (auxval & HWCAP_ASIMD)
|
||||||
return PROVIDER_INFO(adler32_neon);
|
return PROVIDER_INFO(adler32_neon);
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
return PROVIDER_INFO(adler32_neon);
|
return PROVIDER_INFO(adler32_neon);
|
||||||
#endif
|
#endif
|
||||||
return PROVIDER_BASIC(adler32);
|
return PROVIDER_BASIC(adler32);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_INTERFACE_DISPATCHER(isal_deflate_body)
|
DEFINE_INTERFACE_DISPATCHER(isal_deflate_body)
|
||||||
{
|
{
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
unsigned long auxval = getauxval(AT_HWCAP);
|
unsigned long auxval = getauxval(AT_HWCAP);
|
||||||
|
|
||||||
if (auxval & HWCAP_CRC32)
|
if (auxval & HWCAP_CRC32)
|
||||||
return PROVIDER_INFO(isal_deflate_body_aarch64);
|
return PROVIDER_INFO(isal_deflate_body_aarch64);
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
||||||
return PROVIDER_INFO(isal_deflate_body_aarch64);
|
return PROVIDER_INFO(isal_deflate_body_aarch64);
|
||||||
#endif
|
#endif
|
||||||
return PROVIDER_BASIC(isal_deflate_body);
|
return PROVIDER_BASIC(isal_deflate_body);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_INTERFACE_DISPATCHER(isal_deflate_finish)
|
DEFINE_INTERFACE_DISPATCHER(isal_deflate_finish)
|
||||||
{
|
{
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
unsigned long auxval = getauxval(AT_HWCAP);
|
unsigned long auxval = getauxval(AT_HWCAP);
|
||||||
if (auxval & HWCAP_CRC32)
|
if (auxval & HWCAP_CRC32)
|
||||||
return PROVIDER_INFO(isal_deflate_finish_aarch64);
|
return PROVIDER_INFO(isal_deflate_finish_aarch64);
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
||||||
return PROVIDER_INFO(isal_deflate_finish_aarch64);
|
return PROVIDER_INFO(isal_deflate_finish_aarch64);
|
||||||
#endif
|
#endif
|
||||||
return PROVIDER_BASIC(isal_deflate_finish);
|
return PROVIDER_BASIC(isal_deflate_finish);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_INTERFACE_DISPATCHER(isal_deflate_icf_body_lvl1)
|
DEFINE_INTERFACE_DISPATCHER(isal_deflate_icf_body_lvl1)
|
||||||
{
|
{
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
unsigned long auxval = getauxval(AT_HWCAP);
|
unsigned long auxval = getauxval(AT_HWCAP);
|
||||||
if (auxval & HWCAP_CRC32)
|
if (auxval & HWCAP_CRC32)
|
||||||
return PROVIDER_INFO(isal_deflate_icf_body_hash_hist_aarch64);
|
return PROVIDER_INFO(isal_deflate_icf_body_hash_hist_aarch64);
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
||||||
return PROVIDER_INFO(isal_deflate_icf_body_hash_hist_aarch64);
|
return PROVIDER_INFO(isal_deflate_icf_body_hash_hist_aarch64);
|
||||||
#endif
|
#endif
|
||||||
return PROVIDER_BASIC(isal_deflate_icf_body_hash_hist);
|
return PROVIDER_BASIC(isal_deflate_icf_body_hash_hist);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_INTERFACE_DISPATCHER(isal_deflate_icf_finish_lvl1)
|
DEFINE_INTERFACE_DISPATCHER(isal_deflate_icf_finish_lvl1)
|
||||||
{
|
{
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
unsigned long auxval = getauxval(AT_HWCAP);
|
unsigned long auxval = getauxval(AT_HWCAP);
|
||||||
if (auxval & HWCAP_CRC32)
|
if (auxval & HWCAP_CRC32)
|
||||||
return PROVIDER_INFO(isal_deflate_icf_finish_hash_hist_aarch64);
|
return PROVIDER_INFO(isal_deflate_icf_finish_hash_hist_aarch64);
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
||||||
return PROVIDER_INFO(isal_deflate_icf_finish_hash_hist_aarch64);
|
return PROVIDER_INFO(isal_deflate_icf_finish_hash_hist_aarch64);
|
||||||
#endif
|
#endif
|
||||||
return PROVIDER_BASIC(isal_deflate_icf_finish_hash_hist);
|
return PROVIDER_BASIC(isal_deflate_icf_finish_hash_hist);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_INTERFACE_DISPATCHER(isal_deflate_icf_body_lvl2)
|
DEFINE_INTERFACE_DISPATCHER(isal_deflate_icf_body_lvl2)
|
||||||
{
|
{
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
unsigned long auxval = getauxval(AT_HWCAP);
|
unsigned long auxval = getauxval(AT_HWCAP);
|
||||||
if (auxval & HWCAP_CRC32)
|
if (auxval & HWCAP_CRC32)
|
||||||
return PROVIDER_INFO(isal_deflate_icf_body_hash_hist_aarch64);
|
return PROVIDER_INFO(isal_deflate_icf_body_hash_hist_aarch64);
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
||||||
return PROVIDER_INFO(isal_deflate_icf_body_hash_hist_aarch64);
|
return PROVIDER_INFO(isal_deflate_icf_body_hash_hist_aarch64);
|
||||||
#endif
|
#endif
|
||||||
return PROVIDER_BASIC(isal_deflate_icf_body_hash_hist);
|
return PROVIDER_BASIC(isal_deflate_icf_body_hash_hist);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_INTERFACE_DISPATCHER(isal_deflate_icf_finish_lvl2)
|
DEFINE_INTERFACE_DISPATCHER(isal_deflate_icf_finish_lvl2)
|
||||||
{
|
{
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
unsigned long auxval = getauxval(AT_HWCAP);
|
unsigned long auxval = getauxval(AT_HWCAP);
|
||||||
if (auxval & HWCAP_CRC32)
|
if (auxval & HWCAP_CRC32)
|
||||||
return PROVIDER_INFO(isal_deflate_icf_finish_hash_hist_aarch64);
|
return PROVIDER_INFO(isal_deflate_icf_finish_hash_hist_aarch64);
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
||||||
return PROVIDER_INFO(isal_deflate_icf_finish_hash_hist_aarch64);
|
return PROVIDER_INFO(isal_deflate_icf_finish_hash_hist_aarch64);
|
||||||
#endif
|
#endif
|
||||||
return PROVIDER_BASIC(isal_deflate_icf_finish_hash_hist);
|
return PROVIDER_BASIC(isal_deflate_icf_finish_hash_hist);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_INTERFACE_DISPATCHER(isal_deflate_icf_body_lvl3)
|
DEFINE_INTERFACE_DISPATCHER(isal_deflate_icf_body_lvl3)
|
||||||
{
|
{
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
unsigned long auxval = getauxval(AT_HWCAP);
|
unsigned long auxval = getauxval(AT_HWCAP);
|
||||||
if (auxval & HWCAP_CRC32)
|
if (auxval & HWCAP_CRC32)
|
||||||
return PROVIDER_INFO(icf_body_hash1_fillgreedy_lazy);
|
return PROVIDER_INFO(icf_body_hash1_fillgreedy_lazy);
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
||||||
return PROVIDER_INFO(icf_body_hash1_fillgreedy_lazy);
|
return PROVIDER_INFO(icf_body_hash1_fillgreedy_lazy);
|
||||||
#endif
|
#endif
|
||||||
return PROVIDER_INFO(icf_body_hash1_fillgreedy_lazy);
|
return PROVIDER_INFO(icf_body_hash1_fillgreedy_lazy);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_INTERFACE_DISPATCHER(isal_deflate_icf_finish_lvl3)
|
DEFINE_INTERFACE_DISPATCHER(isal_deflate_icf_finish_lvl3)
|
||||||
{
|
{
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
unsigned long auxval = getauxval(AT_HWCAP);
|
unsigned long auxval = getauxval(AT_HWCAP);
|
||||||
if (auxval & HWCAP_CRC32)
|
if (auxval & HWCAP_CRC32)
|
||||||
return PROVIDER_INFO(isal_deflate_icf_finish_hash_map_base);
|
return PROVIDER_INFO(isal_deflate_icf_finish_hash_map_base);
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
||||||
return PROVIDER_INFO(isal_deflate_icf_finish_hash_map_base);
|
return PROVIDER_INFO(isal_deflate_icf_finish_hash_map_base);
|
||||||
#endif
|
#endif
|
||||||
return PROVIDER_BASIC(isal_deflate_icf_finish_hash_map);
|
return PROVIDER_BASIC(isal_deflate_icf_finish_hash_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_INTERFACE_DISPATCHER(set_long_icf_fg)
|
DEFINE_INTERFACE_DISPATCHER(set_long_icf_fg) { return PROVIDER_INFO(set_long_icf_fg_aarch64); }
|
||||||
{
|
|
||||||
return PROVIDER_INFO(set_long_icf_fg_aarch64);
|
|
||||||
}
|
|
||||||
|
|
||||||
DEFINE_INTERFACE_DISPATCHER(encode_deflate_icf)
|
DEFINE_INTERFACE_DISPATCHER(encode_deflate_icf)
|
||||||
{
|
{
|
||||||
return PROVIDER_INFO(encode_deflate_icf_aarch64);
|
return PROVIDER_INFO(encode_deflate_icf_aarch64);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_INTERFACE_DISPATCHER(isal_update_histogram)
|
DEFINE_INTERFACE_DISPATCHER(isal_update_histogram)
|
||||||
{
|
{
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
unsigned long auxval = getauxval(AT_HWCAP);
|
unsigned long auxval = getauxval(AT_HWCAP);
|
||||||
if (auxval & HWCAP_CRC32)
|
if (auxval & HWCAP_CRC32)
|
||||||
return PROVIDER_INFO(isal_update_histogram_aarch64);
|
return PROVIDER_INFO(isal_update_histogram_aarch64);
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
||||||
return PROVIDER_INFO(isal_update_histogram_aarch64);
|
return PROVIDER_INFO(isal_update_histogram_aarch64);
|
||||||
#endif
|
#endif
|
||||||
return PROVIDER_BASIC(isal_update_histogram);
|
return PROVIDER_BASIC(isal_update_histogram);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_INTERFACE_DISPATCHER(gen_icf_map_lh1)
|
DEFINE_INTERFACE_DISPATCHER(gen_icf_map_lh1)
|
||||||
{
|
{
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
unsigned long auxval = getauxval(AT_HWCAP);
|
unsigned long auxval = getauxval(AT_HWCAP);
|
||||||
if (auxval & HWCAP_CRC32) {
|
if (auxval & HWCAP_CRC32) {
|
||||||
return PROVIDER_INFO(gen_icf_map_h1_aarch64);
|
return PROVIDER_INFO(gen_icf_map_h1_aarch64);
|
||||||
}
|
}
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
||||||
return PROVIDER_INFO(gen_icf_map_h1_aarch64);
|
return PROVIDER_INFO(gen_icf_map_h1_aarch64);
|
||||||
#endif
|
#endif
|
||||||
return PROVIDER_BASIC(gen_icf_map_h1);
|
return PROVIDER_BASIC(gen_icf_map_h1);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_INTERFACE_DISPATCHER(isal_deflate_hash_lvl0)
|
DEFINE_INTERFACE_DISPATCHER(isal_deflate_hash_lvl0)
|
||||||
{
|
{
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
unsigned long auxval = getauxval(AT_HWCAP);
|
unsigned long auxval = getauxval(AT_HWCAP);
|
||||||
if (auxval & HWCAP_CRC32)
|
if (auxval & HWCAP_CRC32)
|
||||||
return PROVIDER_INFO(isal_deflate_hash_aarch64);
|
return PROVIDER_INFO(isal_deflate_hash_aarch64);
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
||||||
return PROVIDER_INFO(isal_deflate_hash_aarch64);
|
return PROVIDER_INFO(isal_deflate_hash_aarch64);
|
||||||
#endif
|
#endif
|
||||||
return PROVIDER_BASIC(isal_deflate_hash);
|
return PROVIDER_BASIC(isal_deflate_hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_INTERFACE_DISPATCHER(isal_deflate_hash_lvl1)
|
DEFINE_INTERFACE_DISPATCHER(isal_deflate_hash_lvl1)
|
||||||
{
|
{
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
unsigned long auxval = getauxval(AT_HWCAP);
|
unsigned long auxval = getauxval(AT_HWCAP);
|
||||||
if (auxval & HWCAP_CRC32)
|
if (auxval & HWCAP_CRC32)
|
||||||
return PROVIDER_INFO(isal_deflate_hash_aarch64);
|
return PROVIDER_INFO(isal_deflate_hash_aarch64);
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
||||||
return PROVIDER_INFO(isal_deflate_hash_aarch64);
|
return PROVIDER_INFO(isal_deflate_hash_aarch64);
|
||||||
#endif
|
#endif
|
||||||
return PROVIDER_BASIC(isal_deflate_hash);
|
return PROVIDER_BASIC(isal_deflate_hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_INTERFACE_DISPATCHER(isal_deflate_hash_lvl2)
|
DEFINE_INTERFACE_DISPATCHER(isal_deflate_hash_lvl2)
|
||||||
{
|
{
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
unsigned long auxval = getauxval(AT_HWCAP);
|
unsigned long auxval = getauxval(AT_HWCAP);
|
||||||
if (auxval & HWCAP_CRC32)
|
if (auxval & HWCAP_CRC32)
|
||||||
return PROVIDER_INFO(isal_deflate_hash_aarch64);
|
return PROVIDER_INFO(isal_deflate_hash_aarch64);
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
||||||
return PROVIDER_INFO(isal_deflate_hash_aarch64);
|
return PROVIDER_INFO(isal_deflate_hash_aarch64);
|
||||||
#endif
|
#endif
|
||||||
return PROVIDER_BASIC(isal_deflate_hash);
|
return PROVIDER_BASIC(isal_deflate_hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_INTERFACE_DISPATCHER(isal_deflate_hash_lvl3)
|
DEFINE_INTERFACE_DISPATCHER(isal_deflate_hash_lvl3)
|
||||||
{
|
{
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
unsigned long auxval = getauxval(AT_HWCAP);
|
unsigned long auxval = getauxval(AT_HWCAP);
|
||||||
if (auxval & HWCAP_CRC32)
|
if (auxval & HWCAP_CRC32)
|
||||||
return PROVIDER_INFO(isal_deflate_hash_aarch64);
|
return PROVIDER_INFO(isal_deflate_hash_aarch64);
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
||||||
return PROVIDER_INFO(isal_deflate_hash_aarch64);
|
return PROVIDER_INFO(isal_deflate_hash_aarch64);
|
||||||
#endif
|
#endif
|
||||||
return PROVIDER_BASIC(isal_deflate_hash);
|
return PROVIDER_BASIC(isal_deflate_hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_INTERFACE_DISPATCHER(decode_huffman_code_block_stateless)
|
DEFINE_INTERFACE_DISPATCHER(decode_huffman_code_block_stateless)
|
||||||
{
|
{
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
unsigned long auxval = getauxval(AT_HWCAP);
|
unsigned long auxval = getauxval(AT_HWCAP);
|
||||||
if (auxval & HWCAP_CRC32)
|
if (auxval & HWCAP_CRC32)
|
||||||
return PROVIDER_INFO(decode_huffman_code_block_stateless_aarch64);
|
return PROVIDER_INFO(decode_huffman_code_block_stateless_aarch64);
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
if (sysctlEnabled(SYSCTL_CRC32_KEY))
|
||||||
return PROVIDER_INFO(decode_huffman_code_block_stateless_aarch64);
|
return PROVIDER_INFO(decode_huffman_code_block_stateless_aarch64);
|
||||||
#endif
|
#endif
|
||||||
return PROVIDER_BASIC(decode_huffman_code_block_stateless);
|
return PROVIDER_BASIC(decode_huffman_code_block_stateless);
|
||||||
}
|
}
|
||||||
|
@ -30,34 +30,35 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "igzip_checksums.h"
|
#include "igzip_checksums.h"
|
||||||
|
|
||||||
uint32_t adler32_base(uint32_t adler32, uint8_t * start, uint32_t length)
|
uint32_t
|
||||||
|
adler32_base(uint32_t adler32, uint8_t *start, uint32_t length)
|
||||||
{
|
{
|
||||||
uint8_t *end, *next = start;
|
uint8_t *end, *next = start;
|
||||||
uint64_t A, B;
|
uint64_t A, B;
|
||||||
|
|
||||||
A = adler32 & 0xffff;
|
A = adler32 & 0xffff;
|
||||||
B = adler32 >> 16;
|
B = adler32 >> 16;
|
||||||
|
|
||||||
while (length > MAX_ADLER_BUF) {
|
while (length > MAX_ADLER_BUF) {
|
||||||
end = next + MAX_ADLER_BUF;
|
end = next + MAX_ADLER_BUF;
|
||||||
for (; next < end; next++) {
|
for (; next < end; next++) {
|
||||||
A += *next;
|
A += *next;
|
||||||
B += A;
|
B += A;
|
||||||
}
|
}
|
||||||
|
|
||||||
A = A % ADLER_MOD;
|
A = A % ADLER_MOD;
|
||||||
B = B % ADLER_MOD;
|
B = B % ADLER_MOD;
|
||||||
length -= MAX_ADLER_BUF;
|
length -= MAX_ADLER_BUF;
|
||||||
}
|
}
|
||||||
|
|
||||||
end = next + length;
|
end = next + length;
|
||||||
for (; next < end; next++) {
|
for (; next < end; next++) {
|
||||||
A += *next;
|
A += *next;
|
||||||
B += A;
|
B += A;
|
||||||
}
|
}
|
||||||
|
|
||||||
A = A % ADLER_MOD;
|
A = A % ADLER_MOD;
|
||||||
B = B % ADLER_MOD;
|
B = B % ADLER_MOD;
|
||||||
|
|
||||||
return B << 16 | A;
|
return B << 16 | A;
|
||||||
}
|
}
|
||||||
|
@ -35,40 +35,41 @@
|
|||||||
#include "test.h"
|
#include "test.h"
|
||||||
|
|
||||||
#ifndef GT_L3_CACHE
|
#ifndef GT_L3_CACHE
|
||||||
# define GT_L3_CACHE 32*1024*1024 /* some number > last level cache */
|
#define GT_L3_CACHE 32 * 1024 * 1024 /* some number > last level cache */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(COLD_TEST) && !defined(TEST_CUSTOM)
|
#if !defined(COLD_TEST) && !defined(TEST_CUSTOM)
|
||||||
// Cached test, loop many times over small dataset
|
// Cached test, loop many times over small dataset
|
||||||
# define TEST_LEN 8*1024
|
#define TEST_LEN 8 * 1024
|
||||||
# define TEST_TYPE_STR "_warm"
|
#define TEST_TYPE_STR "_warm"
|
||||||
#elif defined (COLD_TEST)
|
#elif defined(COLD_TEST)
|
||||||
// Uncached test. Pull from large mem base.
|
// Uncached test. Pull from large mem base.
|
||||||
# define TEST_LEN (2 * GT_L3_CACHE)
|
#define TEST_LEN (2 * GT_L3_CACHE)
|
||||||
# define TEST_TYPE_STR "_cold"
|
#define TEST_TYPE_STR "_cold"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef TEST_SEED
|
#ifndef TEST_SEED
|
||||||
#define TEST_SEED 0x1234
|
#define TEST_SEED 0x1234
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
void *buf;
|
void *buf;
|
||||||
uint32_t checksum = 0;
|
uint32_t checksum = 0;
|
||||||
struct perf start;
|
struct perf start;
|
||||||
|
|
||||||
printf("adler32_perf:\n");
|
printf("adler32_perf:\n");
|
||||||
|
|
||||||
if (posix_memalign(&buf, 1024, TEST_LEN)) {
|
if (posix_memalign(&buf, 1024, TEST_LEN)) {
|
||||||
printf("alloc error: Fail");
|
printf("alloc error: Fail");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
memset(buf, 0, TEST_LEN);
|
memset(buf, 0, TEST_LEN);
|
||||||
|
|
||||||
BENCHMARK(&start, BENCHMARK_TIME, checksum |= isal_adler32(TEST_SEED, buf, TEST_LEN));
|
BENCHMARK(&start, BENCHMARK_TIME, checksum |= isal_adler32(TEST_SEED, buf, TEST_LEN));
|
||||||
printf("adler32" TEST_TYPE_STR ": ");
|
printf("adler32" TEST_TYPE_STR ": ");
|
||||||
perf_print(start, (long long)TEST_LEN);
|
perf_print(start, (long long) TEST_LEN);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
113
igzip/bitbuf2.h
113
igzip/bitbuf2.h
@ -41,89 +41,100 @@
|
|||||||
* state that is possible at the exit of write_bits */
|
* state that is possible at the exit of write_bits */
|
||||||
#define MAX_BITBUF_BIT_WRITE 56
|
#define MAX_BITBUF_BIT_WRITE 56
|
||||||
|
|
||||||
static inline void init(struct BitBuf2 *me)
|
static inline void
|
||||||
|
init(struct BitBuf2 *me)
|
||||||
{
|
{
|
||||||
me->m_bits = 0;
|
me->m_bits = 0;
|
||||||
me->m_bit_count = 0;
|
me->m_bit_count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void set_buf(struct BitBuf2 *me, unsigned char *buf, unsigned int len)
|
static inline void
|
||||||
|
set_buf(struct BitBuf2 *me, unsigned char *buf, unsigned int len)
|
||||||
{
|
{
|
||||||
unsigned int slop = 8;
|
unsigned int slop = 8;
|
||||||
me->m_out_buf = me->m_out_start = buf;
|
me->m_out_buf = me->m_out_start = buf;
|
||||||
me->m_out_end = buf + len - slop;
|
me->m_out_end = buf + len - slop;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int is_full(struct BitBuf2 *me)
|
static inline int
|
||||||
|
is_full(struct BitBuf2 *me)
|
||||||
{
|
{
|
||||||
return (me->m_out_buf > me->m_out_end);
|
return (me->m_out_buf > me->m_out_end);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint8_t *buffer_ptr(struct BitBuf2 *me)
|
static inline uint8_t *
|
||||||
|
buffer_ptr(struct BitBuf2 *me)
|
||||||
{
|
{
|
||||||
return me->m_out_buf;
|
return me->m_out_buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t buffer_used(struct BitBuf2 *me)
|
static inline uint32_t
|
||||||
|
buffer_used(struct BitBuf2 *me)
|
||||||
{
|
{
|
||||||
return (uint32_t) (me->m_out_buf - me->m_out_start);
|
return (uint32_t) (me->m_out_buf - me->m_out_start);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t buffer_bits_used(struct BitBuf2 *me)
|
static inline uint32_t
|
||||||
|
buffer_bits_used(struct BitBuf2 *me)
|
||||||
{
|
{
|
||||||
return (8 * (uint32_t) (me->m_out_buf - me->m_out_start) + me->m_bit_count);
|
return (8 * (uint32_t) (me->m_out_buf - me->m_out_start) + me->m_bit_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void flush_bits(struct BitBuf2 *me)
|
static inline void
|
||||||
|
flush_bits(struct BitBuf2 *me)
|
||||||
{
|
{
|
||||||
uint32_t bits;
|
uint32_t bits;
|
||||||
store_le_u64(me->m_out_buf, me->m_bits);
|
store_le_u64(me->m_out_buf, me->m_bits);
|
||||||
bits = me->m_bit_count & ~7;
|
bits = me->m_bit_count & ~7;
|
||||||
me->m_bit_count -= bits;
|
me->m_bit_count -= bits;
|
||||||
me->m_out_buf += bits / 8;
|
me->m_out_buf += bits / 8;
|
||||||
me->m_bits >>= bits;
|
me->m_bits >>= bits;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Can write up to 8 bytes to output buffer */
|
/* Can write up to 8 bytes to output buffer */
|
||||||
static inline void flush(struct BitBuf2 *me)
|
static inline void
|
||||||
|
flush(struct BitBuf2 *me)
|
||||||
{
|
{
|
||||||
uint32_t bytes;
|
uint32_t bytes;
|
||||||
if (me->m_bit_count) {
|
if (me->m_bit_count) {
|
||||||
store_le_u64(me->m_out_buf, me->m_bits);
|
store_le_u64(me->m_out_buf, me->m_bits);
|
||||||
bytes = (me->m_bit_count + 7) / 8;
|
bytes = (me->m_bit_count + 7) / 8;
|
||||||
me->m_out_buf += bytes;
|
me->m_out_buf += bytes;
|
||||||
}
|
}
|
||||||
me->m_bits = 0;
|
me->m_bits = 0;
|
||||||
me->m_bit_count = 0;
|
me->m_bit_count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void check_space(struct BitBuf2 *me, uint32_t num_bits)
|
static inline void
|
||||||
|
check_space(struct BitBuf2 *me, uint32_t num_bits)
|
||||||
{
|
{
|
||||||
/* Checks if bitbuf has num_bits extra space and flushes the bytes in
|
/* Checks if bitbuf has num_bits extra space and flushes the bytes in
|
||||||
* the bitbuf if it doesn't. */
|
* the bitbuf if it doesn't. */
|
||||||
if (63 - me->m_bit_count < num_bits)
|
if (63 - me->m_bit_count < num_bits)
|
||||||
flush_bits(me);
|
flush_bits(me);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void write_bits_unsafe(struct BitBuf2 *me, uint64_t code, uint32_t count)
|
static inline void
|
||||||
|
write_bits_unsafe(struct BitBuf2 *me, uint64_t code, uint32_t count)
|
||||||
{
|
{
|
||||||
me->m_bits |= code << me->m_bit_count;
|
me->m_bits |= code << me->m_bit_count;
|
||||||
me->m_bit_count += count;
|
me->m_bit_count += count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void write_bits(struct BitBuf2 *me, uint64_t code, uint32_t count)
|
static inline void
|
||||||
{ /* Assumes there is space to fit code into m_bits. */
|
write_bits(struct BitBuf2 *me, uint64_t code, uint32_t count)
|
||||||
me->m_bits |= code << me->m_bit_count;
|
{ /* Assumes there is space to fit code into m_bits. */
|
||||||
me->m_bit_count += count;
|
me->m_bits |= code << me->m_bit_count;
|
||||||
flush_bits(me);
|
me->m_bit_count += count;
|
||||||
|
flush_bits(me);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void write_bits_flush(struct BitBuf2 *me, uint64_t code, uint32_t count)
|
static inline void
|
||||||
{ /* Assumes there is space to fit code into m_bits. */
|
write_bits_flush(struct BitBuf2 *me, uint64_t code, uint32_t count)
|
||||||
me->m_bits |= code << me->m_bit_count;
|
{ /* Assumes there is space to fit code into m_bits. */
|
||||||
me->m_bit_count += count;
|
me->m_bits |= code << me->m_bit_count;
|
||||||
flush(me);
|
me->m_bit_count += count;
|
||||||
|
flush(me);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif //BITBUF2_H
|
#endif // BITBUF2_H
|
||||||
|
@ -36,294 +36,307 @@
|
|||||||
#include "test.h"
|
#include "test.h"
|
||||||
|
|
||||||
#ifndef TEST_SEED
|
#ifndef TEST_SEED
|
||||||
# define TEST_SEED 0x1234
|
#define TEST_SEED 0x1234
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MAX_BUF 512
|
#define MAX_BUF 512
|
||||||
#define TEST_SIZE 20
|
#define TEST_SIZE 20
|
||||||
|
|
||||||
typedef uint32_t(*checksum32_func_t) (uint32_t, const unsigned char *, uint64_t);
|
typedef uint32_t (*checksum32_func_t)(uint32_t, const unsigned char *, uint64_t);
|
||||||
|
|
||||||
typedef struct func_case {
|
typedef struct func_case {
|
||||||
char *note;
|
char *note;
|
||||||
checksum32_func_t checksum32_func_call;
|
checksum32_func_t checksum32_func_call;
|
||||||
checksum32_func_t checksum32_ref_call;
|
checksum32_func_t checksum32_ref_call;
|
||||||
} func_case_t;
|
} func_case_t;
|
||||||
|
|
||||||
func_case_t test_funcs[] = {
|
func_case_t test_funcs[] = {
|
||||||
{"checksum32_adler", isal_adler32, adler_ref},
|
{ "checksum32_adler", isal_adler32, adler_ref },
|
||||||
};
|
};
|
||||||
|
|
||||||
// Generates pseudo-random data
|
// Generates pseudo-random data
|
||||||
|
|
||||||
void rand_buffer(unsigned char *buf, long buffer_size)
|
void
|
||||||
|
rand_buffer(unsigned char *buf, long buffer_size)
|
||||||
{
|
{
|
||||||
long i;
|
long i;
|
||||||
for (i = 0; i < buffer_size; i++)
|
for (i = 0; i < buffer_size; i++)
|
||||||
buf[i] = rand();
|
buf[i] = rand();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test cases
|
// Test cases
|
||||||
int zeros_test(func_case_t * test_func);
|
int
|
||||||
int simple_pattern_test(func_case_t * test_func);
|
zeros_test(func_case_t *test_func);
|
||||||
int seeds_sizes_test(func_case_t * test_func);
|
int
|
||||||
int eob_test(func_case_t * test_func);
|
simple_pattern_test(func_case_t *test_func);
|
||||||
int update_test(func_case_t * test_func);
|
int
|
||||||
int update_over_mod_test(func_case_t * test_func);
|
seeds_sizes_test(func_case_t *test_func);
|
||||||
|
int
|
||||||
|
eob_test(func_case_t *test_func);
|
||||||
|
int
|
||||||
|
update_test(func_case_t *test_func);
|
||||||
|
int
|
||||||
|
update_over_mod_test(func_case_t *test_func);
|
||||||
|
|
||||||
void *buf_alloc = NULL;
|
void *buf_alloc = NULL;
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int fail = 0, fail_case;
|
int fail = 0, fail_case;
|
||||||
int i, ret;
|
int i, ret;
|
||||||
func_case_t *test_func;
|
func_case_t *test_func;
|
||||||
|
|
||||||
// Align to MAX_BUF boundary
|
// Align to MAX_BUF boundary
|
||||||
ret = posix_memalign(&buf_alloc, MAX_BUF, MAX_BUF * TEST_SIZE);
|
ret = posix_memalign(&buf_alloc, MAX_BUF, MAX_BUF * TEST_SIZE);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
printf("alloc error: Fail");
|
printf("alloc error: Fail");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
srand(TEST_SEED);
|
srand(TEST_SEED);
|
||||||
printf("CHECKSUM32 Tests seed=0x%x\n", TEST_SEED);
|
printf("CHECKSUM32 Tests seed=0x%x\n", TEST_SEED);
|
||||||
|
|
||||||
for (i = 0; i < sizeof(test_funcs) / sizeof(test_funcs[0]); i++) {
|
for (i = 0; i < sizeof(test_funcs) / sizeof(test_funcs[0]); i++) {
|
||||||
fail_case = 0;
|
fail_case = 0;
|
||||||
test_func = &test_funcs[i];
|
test_func = &test_funcs[i];
|
||||||
|
|
||||||
printf("Test %s ", test_func->note);
|
printf("Test %s ", test_func->note);
|
||||||
fail_case += zeros_test(test_func);
|
fail_case += zeros_test(test_func);
|
||||||
fail_case += simple_pattern_test(test_func);
|
fail_case += simple_pattern_test(test_func);
|
||||||
fail_case += seeds_sizes_test(test_func);
|
fail_case += seeds_sizes_test(test_func);
|
||||||
fail_case += eob_test(test_func);
|
fail_case += eob_test(test_func);
|
||||||
fail_case += update_test(test_func);
|
fail_case += update_test(test_func);
|
||||||
fail_case += update_over_mod_test(test_func);
|
fail_case += update_over_mod_test(test_func);
|
||||||
printf("Test %s done: %s\n", test_func->note, fail_case ? "Fail" : "Pass");
|
printf("Test %s done: %s\n", test_func->note, fail_case ? "Fail" : "Pass");
|
||||||
|
|
||||||
if (fail_case) {
|
if (fail_case) {
|
||||||
printf("\n%s Failed %d tests\n", test_func->note, fail_case);
|
printf("\n%s Failed %d tests\n", test_func->note, fail_case);
|
||||||
fail++;
|
fail++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("CHECKSUM32 Tests all done: %s\n", fail ? "Fail" : "Pass");
|
printf("CHECKSUM32 Tests all done: %s\n", fail ? "Fail" : "Pass");
|
||||||
|
|
||||||
aligned_free(buf_alloc);
|
aligned_free(buf_alloc);
|
||||||
|
|
||||||
return fail;
|
return fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test of all zeros
|
// Test of all zeros
|
||||||
int zeros_test(func_case_t * test_func)
|
int
|
||||||
|
zeros_test(func_case_t *test_func)
|
||||||
{
|
{
|
||||||
uint32_t c_dut, c_ref;
|
uint32_t c_dut, c_ref;
|
||||||
int fail = 0;
|
int fail = 0;
|
||||||
unsigned char *buf = NULL;
|
unsigned char *buf = NULL;
|
||||||
|
|
||||||
buf = (unsigned char *)buf_alloc;
|
buf = (unsigned char *) buf_alloc;
|
||||||
memset(buf, 0, MAX_BUF * 10);
|
memset(buf, 0, MAX_BUF * 10);
|
||||||
c_dut = test_func->checksum32_func_call(TEST_SEED, buf, MAX_BUF * 10);
|
c_dut = test_func->checksum32_func_call(TEST_SEED, buf, MAX_BUF * 10);
|
||||||
c_ref = test_func->checksum32_ref_call(TEST_SEED, buf, MAX_BUF * 10);
|
c_ref = test_func->checksum32_ref_call(TEST_SEED, buf, MAX_BUF * 10);
|
||||||
|
|
||||||
if (c_dut != c_ref) {
|
if (c_dut != c_ref) {
|
||||||
fail++;
|
fail++;
|
||||||
printf("\n opt ref\n");
|
printf("\n opt ref\n");
|
||||||
printf(" ------ ------\n");
|
printf(" ------ ------\n");
|
||||||
printf("checksum zero = 0x%8x 0x%8x \n", c_dut, c_ref);
|
printf("checksum zero = 0x%8x 0x%8x \n", c_dut, c_ref);
|
||||||
}
|
}
|
||||||
#ifdef TEST_VERBOSE
|
#ifdef TEST_VERBOSE
|
||||||
else
|
else
|
||||||
printf(".");
|
printf(".");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return fail;
|
return fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Another simple test pattern
|
// Another simple test pattern
|
||||||
int simple_pattern_test(func_case_t * test_func)
|
int
|
||||||
|
simple_pattern_test(func_case_t *test_func)
|
||||||
{
|
{
|
||||||
uint32_t c_dut, c_ref;
|
uint32_t c_dut, c_ref;
|
||||||
int fail = 0;
|
int fail = 0;
|
||||||
unsigned char *buf = NULL;
|
unsigned char *buf = NULL;
|
||||||
|
|
||||||
buf = (unsigned char *)buf_alloc;
|
buf = (unsigned char *) buf_alloc;
|
||||||
memset(buf, 0x8a, MAX_BUF);
|
memset(buf, 0x8a, MAX_BUF);
|
||||||
c_dut = test_func->checksum32_func_call(TEST_SEED, buf, MAX_BUF);
|
c_dut = test_func->checksum32_func_call(TEST_SEED, buf, MAX_BUF);
|
||||||
c_ref = test_func->checksum32_ref_call(TEST_SEED, buf, MAX_BUF);
|
c_ref = test_func->checksum32_ref_call(TEST_SEED, buf, MAX_BUF);
|
||||||
if (c_dut != c_ref) {
|
if (c_dut != c_ref) {
|
||||||
fail++;
|
fail++;
|
||||||
printf("fail checksum all 8a = 0x%8x 0x%8x\n", c_dut, c_ref);
|
printf("fail checksum all 8a = 0x%8x 0x%8x\n", c_dut, c_ref);
|
||||||
}
|
}
|
||||||
#ifdef TEST_VERBOSE
|
#ifdef TEST_VERBOSE
|
||||||
else
|
else
|
||||||
printf(".");
|
printf(".");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return fail;
|
return fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
int seeds_sizes_test(func_case_t * test_func)
|
int
|
||||||
|
seeds_sizes_test(func_case_t *test_func)
|
||||||
{
|
{
|
||||||
uint32_t c_dut, c_ref;
|
uint32_t c_dut, c_ref;
|
||||||
int fail = 0;
|
int fail = 0;
|
||||||
int i;
|
int i;
|
||||||
uint32_t r, s;
|
uint32_t r, s;
|
||||||
unsigned char *buf = NULL;
|
unsigned char *buf = NULL;
|
||||||
|
|
||||||
// Do a few random tests
|
// Do a few random tests
|
||||||
buf = (unsigned char *)buf_alloc; //reset buf
|
buf = (unsigned char *) buf_alloc; // reset buf
|
||||||
r = rand();
|
r = rand();
|
||||||
rand_buffer(buf, MAX_BUF * TEST_SIZE);
|
rand_buffer(buf, MAX_BUF * TEST_SIZE);
|
||||||
|
|
||||||
for (i = 0; i < TEST_SIZE; i++) {
|
for (i = 0; i < TEST_SIZE; i++) {
|
||||||
c_dut = test_func->checksum32_func_call(r, buf, MAX_BUF);
|
c_dut = test_func->checksum32_func_call(r, buf, MAX_BUF);
|
||||||
c_ref = test_func->checksum32_ref_call(r, buf, MAX_BUF);
|
c_ref = test_func->checksum32_ref_call(r, buf, MAX_BUF);
|
||||||
if (c_dut != c_ref) {
|
if (c_dut != c_ref) {
|
||||||
fail++;
|
fail++;
|
||||||
printf("fail checksum rand%3d = 0x%8x 0x%8x\n", i, c_dut, c_ref);
|
printf("fail checksum rand%3d = 0x%8x 0x%8x\n", i, c_dut, c_ref);
|
||||||
}
|
}
|
||||||
#ifdef TEST_VERBOSE
|
#ifdef TEST_VERBOSE
|
||||||
else
|
else
|
||||||
printf(".");
|
printf(".");
|
||||||
#endif
|
#endif
|
||||||
buf += MAX_BUF;
|
buf += MAX_BUF;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do a few random sizes
|
// Do a few random sizes
|
||||||
buf = (unsigned char *)buf_alloc; //reset buf
|
buf = (unsigned char *) buf_alloc; // reset buf
|
||||||
r = rand();
|
r = rand();
|
||||||
|
|
||||||
for (i = MAX_BUF; i >= 0; i--) {
|
for (i = MAX_BUF; i >= 0; i--) {
|
||||||
c_dut = test_func->checksum32_func_call(r, buf, i);
|
c_dut = test_func->checksum32_func_call(r, buf, i);
|
||||||
c_ref = test_func->checksum32_ref_call(r, buf, i);
|
c_ref = test_func->checksum32_ref_call(r, buf, i);
|
||||||
if (c_dut != c_ref) {
|
if (c_dut != c_ref) {
|
||||||
fail++;
|
fail++;
|
||||||
printf("fail random size%i 0x%8x 0x%8x\n", i, c_dut, c_ref);
|
printf("fail random size%i 0x%8x 0x%8x\n", i, c_dut, c_ref);
|
||||||
}
|
}
|
||||||
#ifdef TEST_VERBOSE
|
#ifdef TEST_VERBOSE
|
||||||
else
|
else
|
||||||
printf(".");
|
printf(".");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try different seeds
|
// Try different seeds
|
||||||
for (s = 0; s < 20; s++) {
|
for (s = 0; s < 20; s++) {
|
||||||
buf = (unsigned char *)buf_alloc; //reset buf
|
buf = (unsigned char *) buf_alloc; // reset buf
|
||||||
|
|
||||||
r = rand(); // just to get a new seed
|
r = rand(); // just to get a new seed
|
||||||
rand_buffer(buf, MAX_BUF * TEST_SIZE); // new pseudo-rand data
|
rand_buffer(buf, MAX_BUF * TEST_SIZE); // new pseudo-rand data
|
||||||
|
|
||||||
#ifdef TEST_VERBOSE
|
#ifdef TEST_VERBOSE
|
||||||
printf("seed = 0x%x\n", r);
|
printf("seed = 0x%x\n", r);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (i = 0; i < TEST_SIZE; i++) {
|
for (i = 0; i < TEST_SIZE; i++) {
|
||||||
c_dut = test_func->checksum32_func_call(r, buf, MAX_BUF);
|
c_dut = test_func->checksum32_func_call(r, buf, MAX_BUF);
|
||||||
c_ref = test_func->checksum32_ref_call(r, buf, MAX_BUF);
|
c_ref = test_func->checksum32_ref_call(r, buf, MAX_BUF);
|
||||||
if (c_dut != c_ref) {
|
if (c_dut != c_ref) {
|
||||||
fail++;
|
fail++;
|
||||||
printf("fail checksum rand%3d = 0x%8x 0x%8x\n", i, c_dut,
|
printf("fail checksum rand%3d = 0x%8x 0x%8x\n", i, c_dut, c_ref);
|
||||||
c_ref);
|
}
|
||||||
}
|
|
||||||
#ifdef TEST_VERBOSE
|
#ifdef TEST_VERBOSE
|
||||||
else
|
else
|
||||||
printf(".");
|
printf(".");
|
||||||
#endif
|
#endif
|
||||||
buf += MAX_BUF;
|
buf += MAX_BUF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return fail;
|
return fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run tests at end of buffer
|
// Run tests at end of buffer
|
||||||
int eob_test(func_case_t * test_func)
|
int
|
||||||
|
eob_test(func_case_t *test_func)
|
||||||
{
|
{
|
||||||
uint32_t c_dut, c_ref;
|
uint32_t c_dut, c_ref;
|
||||||
int fail = 0;
|
int fail = 0;
|
||||||
int i;
|
int i;
|
||||||
unsigned char *buf = NULL;
|
unsigned char *buf = NULL;
|
||||||
|
|
||||||
buf = (unsigned char *)buf_alloc; //reset buf
|
buf = (unsigned char *) buf_alloc; // reset buf
|
||||||
buf = buf + ((MAX_BUF - 1) * TEST_SIZE); //Line up TEST_SIZE from end
|
buf = buf + ((MAX_BUF - 1) * TEST_SIZE); // Line up TEST_SIZE from end
|
||||||
for (i = 0; i < TEST_SIZE; i++) {
|
for (i = 0; i < TEST_SIZE; i++) {
|
||||||
c_dut = test_func->checksum32_func_call(TEST_SEED, buf + i, TEST_SIZE - i);
|
c_dut = test_func->checksum32_func_call(TEST_SEED, buf + i, TEST_SIZE - i);
|
||||||
c_ref = test_func->checksum32_ref_call(TEST_SEED, buf + i, TEST_SIZE - i);
|
c_ref = test_func->checksum32_ref_call(TEST_SEED, buf + i, TEST_SIZE - i);
|
||||||
if (c_dut != c_ref) {
|
if (c_dut != c_ref) {
|
||||||
fail++;
|
fail++;
|
||||||
printf("fail checksum eob rand%3d = 0x%8x 0x%8x\n", i, c_dut, c_ref);
|
printf("fail checksum eob rand%3d = 0x%8x 0x%8x\n", i, c_dut, c_ref);
|
||||||
}
|
}
|
||||||
#ifdef TEST_VERBOSE
|
#ifdef TEST_VERBOSE
|
||||||
else
|
else
|
||||||
printf(".");
|
printf(".");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
return fail;
|
return fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
int update_test(func_case_t * test_func)
|
int
|
||||||
|
update_test(func_case_t *test_func)
|
||||||
{
|
{
|
||||||
uint32_t c_dut, c_ref;
|
uint32_t c_dut, c_ref;
|
||||||
int fail = 0;
|
int fail = 0;
|
||||||
int i;
|
int i;
|
||||||
uint32_t r;
|
uint32_t r;
|
||||||
unsigned char *buf = NULL;
|
unsigned char *buf = NULL;
|
||||||
|
|
||||||
buf = (unsigned char *)buf_alloc; //reset buf
|
buf = (unsigned char *) buf_alloc; // reset buf
|
||||||
r = rand();
|
r = rand();
|
||||||
// Process the whole buf with reference func single call.
|
// Process the whole buf with reference func single call.
|
||||||
c_ref = test_func->checksum32_ref_call(r, buf, MAX_BUF * TEST_SIZE);
|
c_ref = test_func->checksum32_ref_call(r, buf, MAX_BUF * TEST_SIZE);
|
||||||
// Process buf with update method.
|
// Process buf with update method.
|
||||||
for (i = 0; i < TEST_SIZE; i++) {
|
for (i = 0; i < TEST_SIZE; i++) {
|
||||||
c_dut = test_func->checksum32_func_call(r, buf, MAX_BUF);
|
c_dut = test_func->checksum32_func_call(r, buf, MAX_BUF);
|
||||||
// Update checksum seeds and buf pointer.
|
// Update checksum seeds and buf pointer.
|
||||||
r = c_dut;
|
r = c_dut;
|
||||||
buf += MAX_BUF;
|
buf += MAX_BUF;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c_dut != c_ref) {
|
if (c_dut != c_ref) {
|
||||||
fail++;
|
fail++;
|
||||||
printf("checksum rand%3d = 0x%8x 0x%8x\n", i, c_dut, c_ref);
|
printf("checksum rand%3d = 0x%8x 0x%8x\n", i, c_dut, c_ref);
|
||||||
}
|
}
|
||||||
#ifdef TEST_VERBOSE
|
#ifdef TEST_VERBOSE
|
||||||
else
|
else
|
||||||
printf(".");
|
printf(".");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return fail;
|
return fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
int update_over_mod_test(func_case_t * test_func)
|
int
|
||||||
|
update_over_mod_test(func_case_t *test_func)
|
||||||
{
|
{
|
||||||
uint32_t c_dut, c_ref;
|
uint32_t c_dut, c_ref;
|
||||||
int fail = 0;
|
int fail = 0;
|
||||||
int i;
|
int i;
|
||||||
unsigned char *buf = NULL;
|
unsigned char *buf = NULL;
|
||||||
|
|
||||||
buf = malloc(ADLER_MOD);
|
buf = malloc(ADLER_MOD);
|
||||||
if (buf == NULL)
|
if (buf == NULL)
|
||||||
return 1;
|
return 1;
|
||||||
memset(buf, 0xff, ADLER_MOD);
|
memset(buf, 0xff, ADLER_MOD);
|
||||||
|
|
||||||
c_ref = c_dut = rand();
|
c_ref = c_dut = rand();
|
||||||
|
|
||||||
// Process buf with update method.
|
// Process buf with update method.
|
||||||
for (i = 0; i < 20; i++) {
|
for (i = 0; i < 20; i++) {
|
||||||
c_ref = test_func->checksum32_ref_call(c_ref, buf, ADLER_MOD - 64);
|
c_ref = test_func->checksum32_ref_call(c_ref, buf, ADLER_MOD - 64);
|
||||||
c_dut = test_func->checksum32_func_call(c_dut, buf, ADLER_MOD - 64);
|
c_dut = test_func->checksum32_func_call(c_dut, buf, ADLER_MOD - 64);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c_dut != c_ref) {
|
if (c_dut != c_ref) {
|
||||||
fail++;
|
fail++;
|
||||||
printf("checksum rand%3d = 0x%8x 0x%8x\n", i, c_dut, c_ref);
|
printf("checksum rand%3d = 0x%8x 0x%8x\n", i, c_dut, c_ref);
|
||||||
}
|
}
|
||||||
#ifdef TEST_VERBOSE
|
#ifdef TEST_VERBOSE
|
||||||
else
|
else
|
||||||
printf(".");
|
printf(".");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
free(buf);
|
free(buf);
|
||||||
return fail;
|
return fail;
|
||||||
}
|
}
|
||||||
|
@ -8,95 +8,69 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
uint32_t inflate_crc_table[256] = {
|
uint32_t inflate_crc_table[256] = {
|
||||||
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
|
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535,
|
||||||
0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
|
0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd,
|
||||||
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
|
0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d,
|
||||||
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
|
0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
|
||||||
0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
|
0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
|
||||||
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
|
0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
|
||||||
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
|
0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac,
|
||||||
0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
|
0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
|
||||||
0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
|
0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab,
|
||||||
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
|
0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
|
||||||
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
|
0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb,
|
||||||
0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
|
0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
|
||||||
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
|
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea,
|
||||||
0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
|
0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce,
|
||||||
0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
|
0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
|
||||||
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
|
0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
|
||||||
0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
|
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409,
|
||||||
0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
|
0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
|
||||||
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
|
0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739,
|
||||||
0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
|
0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
|
||||||
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
|
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268,
|
||||||
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
|
0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0,
|
||||||
0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
|
0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8,
|
||||||
0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
|
0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
|
||||||
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
|
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
|
||||||
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
|
0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703,
|
||||||
0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
|
0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7,
|
||||||
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
|
0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
|
||||||
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
|
0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae,
|
||||||
0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
|
0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
|
||||||
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
|
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6,
|
||||||
0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
|
0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
|
||||||
0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
|
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d,
|
||||||
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
|
0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5,
|
||||||
0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
|
0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
|
||||||
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
|
0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
|
||||||
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
|
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
|
||||||
0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
|
};
|
||||||
0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
|
|
||||||
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
|
|
||||||
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
|
|
||||||
0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
|
|
||||||
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
|
|
||||||
0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
|
|
||||||
0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
|
|
||||||
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
|
|
||||||
0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
|
|
||||||
0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
|
|
||||||
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
|
|
||||||
0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
|
|
||||||
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
|
|
||||||
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
|
|
||||||
0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
|
|
||||||
0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
|
|
||||||
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
|
|
||||||
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
|
|
||||||
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
|
|
||||||
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
|
|
||||||
0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
|
|
||||||
0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
|
|
||||||
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
|
|
||||||
0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
|
|
||||||
0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
|
|
||||||
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d};
|
|
||||||
|
|
||||||
|
uint32_t
|
||||||
uint32_t crc32_gzip_refl_ref(uint32_t crc, const unsigned char *buf, uint64_t len)
|
crc32_gzip_refl_ref(uint32_t crc, const unsigned char *buf, uint64_t len)
|
||||||
{
|
{
|
||||||
uint64_t i;
|
uint64_t i;
|
||||||
crc = ~crc;
|
crc = ~crc;
|
||||||
for (i = 0; i < len; i++)
|
for (i = 0; i < len; i++)
|
||||||
crc = (crc >> 8) ^ inflate_crc_table[(crc & 0xff) ^ buf[i]];
|
crc = (crc >> 8) ^ inflate_crc_table[(crc & 0xff) ^ buf[i]];
|
||||||
return ~crc;
|
return ~crc;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ADLER_MOD 65521
|
#define ADLER_MOD 65521
|
||||||
|
|
||||||
|
uint32_t
|
||||||
uint32_t adler_ref(uint32_t init, const unsigned char *buf, uint64_t len)
|
adler_ref(uint32_t init, const unsigned char *buf, uint64_t len)
|
||||||
{
|
{
|
||||||
uint64_t i;
|
uint64_t i;
|
||||||
uint32_t a = init & 0xffff;
|
uint32_t a = init & 0xffff;
|
||||||
uint32_t b = init >> 16;
|
uint32_t b = init >> 16;
|
||||||
|
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
a = (a + buf[i]) % ADLER_MOD;
|
a = (a + buf[i]) % ADLER_MOD;
|
||||||
b = (b + a) % ADLER_MOD;
|
b = (b + a) % ADLER_MOD;
|
||||||
}
|
}
|
||||||
return (b << 16) | a;
|
return (b << 16) | a;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CHECKSUM_TEST_REF_H */
|
#endif /* CHECKSUM_TEST_REF_H */
|
||||||
|
@ -4,35 +4,35 @@
|
|||||||
#include <memory.h>
|
#include <memory.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#if __x86_64__ || __i386__ || _M_X64 || _M_IX86
|
#if __x86_64__ || __i386__ || _M_X64 || _M_IX86
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
# include <intrin.h>
|
#include <intrin.h>
|
||||||
#else
|
#else
|
||||||
# include <x86intrin.h>
|
#include <x86intrin.h>
|
||||||
#endif
|
#endif
|
||||||
#endif //__x86_64__ || __i386__ || _M_X64 || _M_IX86
|
#endif //__x86_64__ || __i386__ || _M_X64 || _M_IX86
|
||||||
|
|
||||||
#include "encode_df.h"
|
#include "encode_df.h"
|
||||||
#include "bitbuf2.h"
|
#include "bitbuf2.h"
|
||||||
|
|
||||||
struct deflate_icf *encode_deflate_icf_base(struct deflate_icf *next_in,
|
struct deflate_icf *
|
||||||
struct deflate_icf *end_in, struct BitBuf2 *bb,
|
encode_deflate_icf_base(struct deflate_icf *next_in, struct deflate_icf *end_in, struct BitBuf2 *bb,
|
||||||
struct hufftables_icf *hufftables)
|
struct hufftables_icf *hufftables)
|
||||||
{
|
{
|
||||||
struct huff_code lsym, dsym;
|
struct huff_code lsym, dsym;
|
||||||
|
|
||||||
while (next_in < end_in && !is_full(bb)) {
|
while (next_in < end_in && !is_full(bb)) {
|
||||||
lsym = hufftables->lit_len_table[next_in->lit_len];
|
lsym = hufftables->lit_len_table[next_in->lit_len];
|
||||||
dsym = hufftables->dist_lit_table[next_in->lit_dist];
|
dsym = hufftables->dist_lit_table[next_in->lit_dist];
|
||||||
|
|
||||||
// insert ll code, dist_code, and extra_bits
|
// insert ll code, dist_code, and extra_bits
|
||||||
write_bits_unsafe(bb, lsym.code_and_extra, lsym.length);
|
write_bits_unsafe(bb, lsym.code_and_extra, lsym.length);
|
||||||
write_bits_unsafe(bb, dsym.code, dsym.length);
|
write_bits_unsafe(bb, dsym.code, dsym.length);
|
||||||
write_bits_unsafe(bb, next_in->dist_extra, dsym.extra_bit_count);
|
write_bits_unsafe(bb, next_in->dist_extra, dsym.extra_bit_count);
|
||||||
flush_bits(bb);
|
flush_bits(bb);
|
||||||
|
|
||||||
next_in++;
|
next_in++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return next_in;
|
return next_in;
|
||||||
}
|
}
|
||||||
|
@ -6,31 +6,32 @@
|
|||||||
#include "huff_codes.h"
|
#include "huff_codes.h"
|
||||||
|
|
||||||
/* Deflate Intermediate Compression Format */
|
/* Deflate Intermediate Compression Format */
|
||||||
#define LIT_LEN_BIT_COUNT 10
|
#define LIT_LEN_BIT_COUNT 10
|
||||||
#define LIT_LEN_MASK ((1 << LIT_LEN_BIT_COUNT) - 1)
|
#define LIT_LEN_MASK ((1 << LIT_LEN_BIT_COUNT) - 1)
|
||||||
#define DIST_LIT_BIT_COUNT 9
|
#define DIST_LIT_BIT_COUNT 9
|
||||||
#define DIST_LIT_MASK ((1 << DIST_LIT_BIT_COUNT) - 1)
|
#define DIST_LIT_MASK ((1 << DIST_LIT_BIT_COUNT) - 1)
|
||||||
#define ICF_DIST_OFFSET LIT_LEN_BIT_COUNT
|
#define ICF_DIST_OFFSET LIT_LEN_BIT_COUNT
|
||||||
#define NULL_DIST_SYM 30
|
#define NULL_DIST_SYM 30
|
||||||
|
|
||||||
#define LEN_START ISAL_DEF_LIT_SYMBOLS
|
#define LEN_START ISAL_DEF_LIT_SYMBOLS
|
||||||
#define LEN_OFFSET (LEN_START - ISAL_DEF_MIN_MATCH)
|
#define LEN_OFFSET (LEN_START - ISAL_DEF_MIN_MATCH)
|
||||||
#define LEN_MAX (LEN_OFFSET + ISAL_DEF_MAX_MATCH)
|
#define LEN_MAX (LEN_OFFSET + ISAL_DEF_MAX_MATCH)
|
||||||
#define LIT_START (NULL_DIST_SYM + 1)
|
#define LIT_START (NULL_DIST_SYM + 1)
|
||||||
#define ICF_CODE_LEN 32
|
#define ICF_CODE_LEN 32
|
||||||
|
|
||||||
struct deflate_icf {
|
struct deflate_icf {
|
||||||
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
||||||
uint32_t lit_len:LIT_LEN_BIT_COUNT;
|
uint32_t lit_len : LIT_LEN_BIT_COUNT;
|
||||||
uint32_t lit_dist:DIST_LIT_BIT_COUNT;
|
uint32_t lit_dist : DIST_LIT_BIT_COUNT;
|
||||||
uint32_t dist_extra:ICF_CODE_LEN - DIST_LIT_BIT_COUNT - ICF_DIST_OFFSET;
|
uint32_t dist_extra : ICF_CODE_LEN - DIST_LIT_BIT_COUNT - ICF_DIST_OFFSET;
|
||||||
#else
|
#else
|
||||||
uint32_t dist_extra:ICF_CODE_LEN - DIST_LIT_BIT_COUNT - ICF_DIST_OFFSET;
|
uint32_t dist_extra : ICF_CODE_LEN - DIST_LIT_BIT_COUNT - ICF_DIST_OFFSET;
|
||||||
uint32_t lit_dist:DIST_LIT_BIT_COUNT;
|
uint32_t lit_dist : DIST_LIT_BIT_COUNT;
|
||||||
uint32_t lit_len:LIT_LEN_BIT_COUNT;
|
uint32_t lit_len : LIT_LEN_BIT_COUNT;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
struct deflate_icf *encode_deflate_icf(struct deflate_icf *next_in, struct deflate_icf *end_in,
|
struct deflate_icf *
|
||||||
struct BitBuf2 *bb, struct hufftables_icf *hufftables);
|
encode_deflate_icf(struct deflate_icf *next_in, struct deflate_icf *end_in, struct BitBuf2 *bb,
|
||||||
|
struct hufftables_icf *hufftables);
|
||||||
#endif
|
#endif
|
||||||
|
@ -4,38 +4,39 @@
|
|||||||
|
|
||||||
#include "flatten_ll.h"
|
#include "flatten_ll.h"
|
||||||
|
|
||||||
void flatten_ll(uint32_t * ll_hist)
|
void
|
||||||
|
flatten_ll(uint32_t *ll_hist)
|
||||||
{
|
{
|
||||||
uint32_t i, j;
|
uint32_t i, j;
|
||||||
uint32_t *s = ll_hist, x, *p;
|
uint32_t *s = ll_hist, x, *p;
|
||||||
|
|
||||||
s[265] += s[266];
|
s[265] += s[266];
|
||||||
s[266] = s[267] + s[268];
|
s[266] = s[267] + s[268];
|
||||||
s[267] = s[269] + s[270];
|
s[267] = s[269] + s[270];
|
||||||
s[268] = s[271] + s[272];
|
s[268] = s[271] + s[272];
|
||||||
s[269] = s[273] + s[274] + s[275] + s[276];
|
s[269] = s[273] + s[274] + s[275] + s[276];
|
||||||
s[270] = s[277] + s[278] + s[279] + s[280];
|
s[270] = s[277] + s[278] + s[279] + s[280];
|
||||||
s[271] = s[281] + s[282] + s[283] + s[284];
|
s[271] = s[281] + s[282] + s[283] + s[284];
|
||||||
s[272] = s[285] + s[286] + s[287] + s[288];
|
s[272] = s[285] + s[286] + s[287] + s[288];
|
||||||
p = s + 289;
|
p = s + 289;
|
||||||
for (i = 273; i < 277; i++) {
|
for (i = 273; i < 277; i++) {
|
||||||
x = *(p++);
|
x = *(p++);
|
||||||
for (j = 1; j < 8; j++)
|
for (j = 1; j < 8; j++)
|
||||||
x += *(p++);
|
x += *(p++);
|
||||||
s[i] = x;
|
s[i] = x;
|
||||||
}
|
}
|
||||||
for (; i < 281; i++) {
|
for (; i < 281; i++) {
|
||||||
x = *(p++);
|
x = *(p++);
|
||||||
for (j = 1; j < 16; j++)
|
for (j = 1; j < 16; j++)
|
||||||
x += *(p++);
|
x += *(p++);
|
||||||
s[i] = x;
|
s[i] = x;
|
||||||
}
|
}
|
||||||
for (; i < 285; i++) {
|
for (; i < 285; i++) {
|
||||||
x = *(p++);
|
x = *(p++);
|
||||||
for (j = 1; j < 32; j++)
|
for (j = 1; j < 32; j++)
|
||||||
x += *(p++);
|
x += *(p++);
|
||||||
s[i] = x;
|
s[i] = x;
|
||||||
}
|
}
|
||||||
s[284] -= s[512];
|
s[284] -= s[512];
|
||||||
s[285] = s[512];
|
s[285] = s[512];
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
void flatten_ll(uint32_t *ll_hist);
|
void
|
||||||
|
flatten_ll(uint32_t *ll_hist);
|
||||||
|
@ -72,9 +72,9 @@
|
|||||||
|
|
||||||
#define MAX_HEADER_SIZE ISAL_DEF_MAX_HDR_SIZE
|
#define MAX_HEADER_SIZE ISAL_DEF_MAX_HDR_SIZE
|
||||||
|
|
||||||
#define GZIP_HEADER_SIZE 10
|
#define GZIP_HEADER_SIZE 10
|
||||||
#define GZIP_TRAILER_SIZE 8
|
#define GZIP_TRAILER_SIZE 8
|
||||||
#define ZLIB_HEADER_SIZE 2
|
#define ZLIB_HEADER_SIZE 2
|
||||||
#define ZLIB_TRAILER_SIZE 4
|
#define ZLIB_TRAILER_SIZE 4
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -86,26 +86,26 @@
|
|||||||
* @param footer: footer to append at the end of the table.
|
* @param footer: footer to append at the end of the table.
|
||||||
* @param begin_line: string printed at beginning of new line
|
* @param begin_line: string printed at beginning of new line
|
||||||
*/
|
*/
|
||||||
void fprint_uint8_table(FILE * outfile, uint8_t * table, uint64_t length, char *header,
|
void
|
||||||
char *footer, char *begin_line)
|
fprint_uint8_table(FILE *outfile, uint8_t *table, uint64_t length, char *header, char *footer,
|
||||||
|
char *begin_line)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
fprintf(outfile, "%s", header);
|
fprintf(outfile, "%s", header);
|
||||||
for (i = 0; i < length - 1; i++) {
|
for (i = 0; i < length - 1; i++) {
|
||||||
if ((i & 7) == 0)
|
if ((i & 7) == 0)
|
||||||
fprintf(outfile, "\n%s", begin_line);
|
fprintf(outfile, "\n%s", begin_line);
|
||||||
else
|
else
|
||||||
fprintf(outfile, " ");
|
fprintf(outfile, " ");
|
||||||
fprintf(outfile, "0x%02x,", table[i]);
|
fprintf(outfile, "0x%02x,", table[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((i & 7) == 0)
|
|
||||||
fprintf(outfile, "\n%s", begin_line);
|
|
||||||
else
|
|
||||||
fprintf(outfile, " ");
|
|
||||||
fprintf(outfile, "0x%02x", table[i]);
|
|
||||||
fprintf(outfile, "%s", footer);
|
|
||||||
|
|
||||||
|
if ((i & 7) == 0)
|
||||||
|
fprintf(outfile, "\n%s", begin_line);
|
||||||
|
else
|
||||||
|
fprintf(outfile, " ");
|
||||||
|
fprintf(outfile, "0x%02x", table[i]);
|
||||||
|
fprintf(outfile, "%s", footer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -117,26 +117,26 @@ void fprint_uint8_table(FILE * outfile, uint8_t * table, uint64_t length, char *
|
|||||||
* @param footer: footer to append at the end of the table.
|
* @param footer: footer to append at the end of the table.
|
||||||
* @param begin_line: string printed at beginning of new line
|
* @param begin_line: string printed at beginning of new line
|
||||||
*/
|
*/
|
||||||
void fprint_uint16_table(FILE * outfile, uint16_t * table, uint64_t length, char *header,
|
void
|
||||||
char *footer, char *begin_line)
|
fprint_uint16_table(FILE *outfile, uint16_t *table, uint64_t length, char *header, char *footer,
|
||||||
|
char *begin_line)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
fprintf(outfile, "%s", header);
|
fprintf(outfile, "%s", header);
|
||||||
for (i = 0; i < length - 1; i++) {
|
for (i = 0; i < length - 1; i++) {
|
||||||
if ((i & 7) == 0)
|
if ((i & 7) == 0)
|
||||||
fprintf(outfile, "\n%s", begin_line);
|
fprintf(outfile, "\n%s", begin_line);
|
||||||
else
|
else
|
||||||
fprintf(outfile, " ");
|
fprintf(outfile, " ");
|
||||||
fprintf(outfile, "0x%04x,", table[i]);
|
fprintf(outfile, "0x%04x,", table[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((i & 7) == 0)
|
|
||||||
fprintf(outfile, "\n%s", begin_line);
|
|
||||||
else
|
|
||||||
fprintf(outfile, " ");
|
|
||||||
fprintf(outfile, "0x%04x", table[i]);
|
|
||||||
fprintf(outfile, "%s", footer);
|
|
||||||
|
|
||||||
|
if ((i & 7) == 0)
|
||||||
|
fprintf(outfile, "\n%s", begin_line);
|
||||||
|
else
|
||||||
|
fprintf(outfile, " ");
|
||||||
|
fprintf(outfile, "0x%04x", table[i]);
|
||||||
|
fprintf(outfile, "%s", footer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -148,341 +148,348 @@ void fprint_uint16_table(FILE * outfile, uint16_t * table, uint64_t length, char
|
|||||||
* @param footer: footer to append at the end of the table.
|
* @param footer: footer to append at the end of the table.
|
||||||
* @param begin_line: string printed at beginning of new line
|
* @param begin_line: string printed at beginning of new line
|
||||||
*/
|
*/
|
||||||
void fprint_uint32_table(FILE * outfile, uint32_t * table, uint64_t length, char *header,
|
void
|
||||||
char *footer, char *begin_line)
|
fprint_uint32_table(FILE *outfile, uint32_t *table, uint64_t length, char *header, char *footer,
|
||||||
|
char *begin_line)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
fprintf(outfile, "%s", header);
|
fprintf(outfile, "%s", header);
|
||||||
for (i = 0; i < length - 1; i++) {
|
for (i = 0; i < length - 1; i++) {
|
||||||
if ((i & 3) == 0)
|
if ((i & 3) == 0)
|
||||||
fprintf(outfile, "\n%s", begin_line);
|
fprintf(outfile, "\n%s", begin_line);
|
||||||
else
|
else
|
||||||
fprintf(outfile, " ");
|
fprintf(outfile, " ");
|
||||||
fprintf(outfile, "0x%08x,", table[i]);
|
fprintf(outfile, "0x%08x,", table[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((i & 3) == 0)
|
|
||||||
fprintf(outfile, "%s", begin_line);
|
|
||||||
else
|
|
||||||
fprintf(outfile, " ");
|
|
||||||
fprintf(outfile, "0x%08x", table[i]);
|
|
||||||
fprintf(outfile, "%s", footer);
|
|
||||||
|
|
||||||
|
if ((i & 3) == 0)
|
||||||
|
fprintf(outfile, "%s", begin_line);
|
||||||
|
else
|
||||||
|
fprintf(outfile, " ");
|
||||||
|
fprintf(outfile, "0x%08x", table[i]);
|
||||||
|
fprintf(outfile, "%s", footer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void fprint_hufftables(FILE * output_file, char *hufftables_name,
|
void
|
||||||
struct isal_hufftables *hufftables)
|
fprint_hufftables(FILE *output_file, char *hufftables_name, struct isal_hufftables *hufftables)
|
||||||
{
|
{
|
||||||
fprintf(output_file, "struct isal_hufftables %s = {\n\n", hufftables_name);
|
fprintf(output_file, "struct isal_hufftables %s = {\n\n", hufftables_name);
|
||||||
|
|
||||||
fprint_uint8_table(output_file, hufftables->deflate_hdr,
|
fprint_uint8_table(output_file, hufftables->deflate_hdr,
|
||||||
hufftables->deflate_hdr_count +
|
hufftables->deflate_hdr_count +
|
||||||
(hufftables->deflate_hdr_extra_bits + 7) / 8,
|
(hufftables->deflate_hdr_extra_bits + 7) / 8,
|
||||||
"\t.deflate_hdr = {", "},\n\n", "\t\t");
|
"\t.deflate_hdr = {", "},\n\n", "\t\t");
|
||||||
|
|
||||||
fprintf(output_file, "\t.deflate_hdr_count = %d,\n", hufftables->deflate_hdr_count);
|
fprintf(output_file, "\t.deflate_hdr_count = %d,\n", hufftables->deflate_hdr_count);
|
||||||
fprintf(output_file, "\t.deflate_hdr_extra_bits = %d,\n\n",
|
fprintf(output_file, "\t.deflate_hdr_extra_bits = %d,\n\n",
|
||||||
hufftables->deflate_hdr_extra_bits);
|
hufftables->deflate_hdr_extra_bits);
|
||||||
|
|
||||||
fprint_uint32_table(output_file, hufftables->dist_table, IGZIP_DIST_TABLE_SIZE,
|
fprint_uint32_table(output_file, hufftables->dist_table, IGZIP_DIST_TABLE_SIZE,
|
||||||
"\t.dist_table = {", "},\n\n", "\t\t");
|
"\t.dist_table = {", "},\n\n", "\t\t");
|
||||||
|
|
||||||
fprint_uint32_table(output_file, hufftables->len_table, IGZIP_LEN_TABLE_SIZE,
|
fprint_uint32_table(output_file, hufftables->len_table, IGZIP_LEN_TABLE_SIZE,
|
||||||
"\t.len_table = {", "},\n\n", "\t\t");
|
"\t.len_table = {", "},\n\n", "\t\t");
|
||||||
|
|
||||||
fprint_uint16_table(output_file, hufftables->lit_table, IGZIP_LIT_TABLE_SIZE,
|
fprint_uint16_table(output_file, hufftables->lit_table, IGZIP_LIT_TABLE_SIZE,
|
||||||
"\t.lit_table = {", "},\n\n", "\t\t");
|
"\t.lit_table = {", "},\n\n", "\t\t");
|
||||||
fprint_uint8_table(output_file, hufftables->lit_table_sizes, IGZIP_LIT_TABLE_SIZE,
|
fprint_uint8_table(output_file, hufftables->lit_table_sizes, IGZIP_LIT_TABLE_SIZE,
|
||||||
"\t.lit_table_sizes = {", "},\n\n", "\t\t");
|
"\t.lit_table_sizes = {", "},\n\n", "\t\t");
|
||||||
|
|
||||||
fprint_uint16_table(output_file, hufftables->dcodes,
|
fprint_uint16_table(output_file, hufftables->dcodes,
|
||||||
ISAL_DEF_DIST_SYMBOLS - IGZIP_DECODE_OFFSET,
|
ISAL_DEF_DIST_SYMBOLS - IGZIP_DECODE_OFFSET, "\t.dcodes = {", "},\n\n",
|
||||||
"\t.dcodes = {", "},\n\n", "\t\t");
|
"\t\t");
|
||||||
fprint_uint8_table(output_file, hufftables->dcodes_sizes,
|
fprint_uint8_table(output_file, hufftables->dcodes_sizes,
|
||||||
ISAL_DEF_DIST_SYMBOLS - IGZIP_DECODE_OFFSET,
|
ISAL_DEF_DIST_SYMBOLS - IGZIP_DECODE_OFFSET, "\t.dcodes_sizes = {",
|
||||||
"\t.dcodes_sizes = {", "}\n", "\t\t");
|
"}\n", "\t\t");
|
||||||
fprintf(output_file, "};\n");
|
fprintf(output_file, "};\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void fprint_header(FILE * output_file)
|
void
|
||||||
|
fprint_header(FILE *output_file)
|
||||||
{
|
{
|
||||||
|
|
||||||
fprintf(output_file, "#include <stdint.h>\n");
|
fprintf(output_file, "#include <stdint.h>\n");
|
||||||
fprintf(output_file, "#include <igzip_lib.h>\n\n");
|
fprintf(output_file, "#include <igzip_lib.h>\n\n");
|
||||||
|
|
||||||
fprintf(output_file, "#if IGZIP_HIST_SIZE > %d\n"
|
fprintf(output_file,
|
||||||
"# error \"Invalid history size for the custom hufftable\"\n"
|
"#if IGZIP_HIST_SIZE > %d\n"
|
||||||
"#endif\n", IGZIP_HIST_SIZE);
|
"# error \"Invalid history size for the custom hufftable\"\n"
|
||||||
|
"#endif\n",
|
||||||
|
IGZIP_HIST_SIZE);
|
||||||
|
|
||||||
#ifdef LONGER_HUFFTABLE
|
#ifdef LONGER_HUFFTABLE
|
||||||
fprintf(output_file, "#ifndef LONGER_HUFFTABLE\n"
|
fprintf(output_file,
|
||||||
"# error \"Custom hufftable requires LONGER_HUFFTABLE to be defined \"\n"
|
"#ifndef LONGER_HUFFTABLE\n"
|
||||||
"#endif\n");
|
"# error \"Custom hufftable requires LONGER_HUFFTABLE to be defined \"\n"
|
||||||
|
"#endif\n");
|
||||||
#else
|
#else
|
||||||
fprintf(output_file, "#ifdef LONGER_HUFFTABLE\n"
|
fprintf(output_file,
|
||||||
"# error \"Custom hufftable requires LONGER_HUFFTABLE to not be defined \"\n"
|
"#ifdef LONGER_HUFFTABLE\n"
|
||||||
"#endif\n");
|
"# error \"Custom hufftable requires LONGER_HUFFTABLE to not be defined \"\n"
|
||||||
|
"#endif\n");
|
||||||
#endif
|
#endif
|
||||||
fprintf(output_file, "\n");
|
fprintf(output_file, "\n");
|
||||||
|
|
||||||
fprintf(output_file, "const uint8_t gzip_hdr[] = {\n"
|
fprintf(output_file, "const uint8_t gzip_hdr[] = {\n"
|
||||||
"\t0x1f, 0x8b, 0x08, 0x00, 0x00,\n" "\t0x00, 0x00, 0x00, 0x00, 0xff\t};\n\n");
|
"\t0x1f, 0x8b, 0x08, 0x00, 0x00,\n"
|
||||||
|
"\t0x00, 0x00, 0x00, 0x00, 0xff\t};\n\n");
|
||||||
|
|
||||||
fprintf(output_file, "const uint32_t gzip_hdr_bytes = %d;\n", GZIP_HEADER_SIZE);
|
fprintf(output_file, "const uint32_t gzip_hdr_bytes = %d;\n", GZIP_HEADER_SIZE);
|
||||||
fprintf(output_file, "const uint32_t gzip_trl_bytes = %d;\n\n", GZIP_TRAILER_SIZE);
|
fprintf(output_file, "const uint32_t gzip_trl_bytes = %d;\n\n", GZIP_TRAILER_SIZE);
|
||||||
|
|
||||||
fprintf(output_file, "const uint8_t zlib_hdr[] = { 0x78, 0x01 };\n\n");
|
fprintf(output_file, "const uint8_t zlib_hdr[] = { 0x78, 0x01 };\n\n");
|
||||||
fprintf(output_file, "const uint32_t zlib_hdr_bytes = %d;\n", ZLIB_HEADER_SIZE);
|
fprintf(output_file, "const uint32_t zlib_hdr_bytes = %d;\n", ZLIB_HEADER_SIZE);
|
||||||
fprintf(output_file, "const uint32_t zlib_trl_bytes = %d;\n", ZLIB_TRAILER_SIZE);
|
fprintf(output_file, "const uint32_t zlib_trl_bytes = %d;\n", ZLIB_TRAILER_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t convert_dist_to_dist_sym(uint32_t dist)
|
static uint32_t
|
||||||
|
convert_dist_to_dist_sym(uint32_t dist)
|
||||||
{
|
{
|
||||||
assert(dist <= 32768 && dist > 0);
|
assert(dist <= 32768 && dist > 0);
|
||||||
if (dist <= 32768) {
|
if (dist <= 32768) {
|
||||||
uint32_t msb = dist > 4 ? bsr(dist - 1) - 2 : 0;
|
uint32_t msb = dist > 4 ? bsr(dist - 1) - 2 : 0;
|
||||||
return (msb * 2) + ((dist - 1) >> msb);
|
return (msb * 2) + ((dist - 1) >> msb);
|
||||||
} else {
|
} else {
|
||||||
return ~0;
|
return ~0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Returns the deflate symbol value for a repeat length.
|
* @brief Returns the deflate symbol value for a repeat length.
|
||||||
*/
|
*/
|
||||||
static uint32_t convert_length_to_len_sym(uint32_t length)
|
static uint32_t
|
||||||
|
convert_length_to_len_sym(uint32_t length)
|
||||||
{
|
{
|
||||||
assert(length > 2 && length < 259);
|
assert(length > 2 && length < 259);
|
||||||
|
|
||||||
/* Based on tables on page 11 in RFC 1951 */
|
/* Based on tables on page 11 in RFC 1951 */
|
||||||
if (length < 11)
|
if (length < 11)
|
||||||
return 257 + length - 3;
|
return 257 + length - 3;
|
||||||
else if (length < 19)
|
else if (length < 19)
|
||||||
return 261 + (length - 3) / 2;
|
return 261 + (length - 3) / 2;
|
||||||
else if (length < 35)
|
else if (length < 35)
|
||||||
return 265 + (length - 3) / 4;
|
return 265 + (length - 3) / 4;
|
||||||
else if (length < 67)
|
else if (length < 67)
|
||||||
return 269 + (length - 3) / 8;
|
return 269 + (length - 3) / 8;
|
||||||
else if (length < 131)
|
else if (length < 131)
|
||||||
return 273 + (length - 3) / 16;
|
return 273 + (length - 3) / 16;
|
||||||
else if (length < 258)
|
else if (length < 258)
|
||||||
return 277 + (length - 3) / 32;
|
return 277 + (length - 3) / 32;
|
||||||
else
|
else
|
||||||
return 285;
|
return 285;
|
||||||
}
|
}
|
||||||
|
|
||||||
void isal_update_histogram_dict(uint8_t * start_stream, int dict_length, int length,
|
void
|
||||||
struct isal_huff_histogram *histogram)
|
isal_update_histogram_dict(uint8_t *start_stream, int dict_length, int length,
|
||||||
|
struct isal_huff_histogram *histogram)
|
||||||
{
|
{
|
||||||
uint32_t literal = 0, hash;
|
uint32_t literal = 0, hash;
|
||||||
uint16_t seen, *last_seen = histogram->hash_table;
|
uint16_t seen, *last_seen = histogram->hash_table;
|
||||||
uint8_t *current, *end_stream, *next_hash, *end, *end_dict;
|
uint8_t *current, *end_stream, *next_hash, *end, *end_dict;
|
||||||
uint32_t match_length;
|
uint32_t match_length;
|
||||||
uint32_t dist;
|
uint32_t dist;
|
||||||
uint64_t *lit_len_histogram = histogram->lit_len_histogram;
|
uint64_t *lit_len_histogram = histogram->lit_len_histogram;
|
||||||
uint64_t *dist_histogram = histogram->dist_histogram;
|
uint64_t *dist_histogram = histogram->dist_histogram;
|
||||||
|
|
||||||
if (length <= 0)
|
if (length <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
end_stream = start_stream + dict_length + length;
|
end_stream = start_stream + dict_length + length;
|
||||||
end_dict = start_stream + dict_length;
|
end_dict = start_stream + dict_length;
|
||||||
|
|
||||||
memset(last_seen, 0, sizeof(histogram->hash_table)); /* Initialize last_seen to be 0. */
|
memset(last_seen, 0, sizeof(histogram->hash_table)); /* Initialize last_seen to be 0. */
|
||||||
|
|
||||||
for (current = start_stream; current < end_dict - 4; current++) {
|
for (current = start_stream; current < end_dict - 4; current++) {
|
||||||
literal = load_le_u32(current);
|
literal = load_le_u32(current);
|
||||||
hash = compute_hash(literal) & LVL0_HASH_MASK;
|
hash = compute_hash(literal) & LVL0_HASH_MASK;
|
||||||
last_seen[hash] = (current - start_stream) & 0xFFFF;
|
last_seen[hash] = (current - start_stream) & 0xFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (current = start_stream + dict_length; current < end_stream - 3; current++) {
|
for (current = start_stream + dict_length; current < end_stream - 3; current++) {
|
||||||
literal = load_le_u32(current);
|
literal = load_le_u32(current);
|
||||||
hash = compute_hash(literal) & LVL0_HASH_MASK;
|
hash = compute_hash(literal) & LVL0_HASH_MASK;
|
||||||
seen = last_seen[hash];
|
seen = last_seen[hash];
|
||||||
last_seen[hash] = (current - start_stream) & 0xFFFF;
|
last_seen[hash] = (current - start_stream) & 0xFFFF;
|
||||||
dist = (current - start_stream - seen) & 0xFFFF;
|
dist = (current - start_stream - seen) & 0xFFFF;
|
||||||
if (dist - 1 < D - 1) {
|
if (dist - 1 < D - 1) {
|
||||||
assert(start_stream <= current - dist);
|
assert(start_stream <= current - dist);
|
||||||
match_length =
|
match_length = compare258(current - dist, current, end_stream - current);
|
||||||
compare258(current - dist, current, end_stream - current);
|
if (match_length >= SHORTEST_MATCH) {
|
||||||
if (match_length >= SHORTEST_MATCH) {
|
next_hash = current;
|
||||||
next_hash = current;
|
|
||||||
#ifdef ISAL_LIMIT_HASH_UPDATE
|
#ifdef ISAL_LIMIT_HASH_UPDATE
|
||||||
end = next_hash + 3;
|
end = next_hash + 3;
|
||||||
#else
|
#else
|
||||||
end = next_hash + match_length;
|
end = next_hash + match_length;
|
||||||
#endif
|
#endif
|
||||||
if (end > end_stream - 3)
|
if (end > end_stream - 3)
|
||||||
end = end_stream - 3;
|
end = end_stream - 3;
|
||||||
next_hash++;
|
next_hash++;
|
||||||
for (; next_hash < end; next_hash++) {
|
for (; next_hash < end; next_hash++) {
|
||||||
literal = load_le_u32(next_hash);
|
literal = load_le_u32(next_hash);
|
||||||
hash = compute_hash(literal) & LVL0_HASH_MASK;
|
hash = compute_hash(literal) & LVL0_HASH_MASK;
|
||||||
last_seen[hash] = (next_hash - start_stream) & 0xFFFF;
|
last_seen[hash] = (next_hash - start_stream) & 0xFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
dist_histogram[convert_dist_to_dist_sym(dist)] += 1;
|
dist_histogram[convert_dist_to_dist_sym(dist)] += 1;
|
||||||
lit_len_histogram[convert_length_to_len_sym(match_length)] +=
|
lit_len_histogram[convert_length_to_len_sym(match_length)] += 1;
|
||||||
1;
|
current += match_length - 1;
|
||||||
current += match_length - 1;
|
continue;
|
||||||
continue;
|
}
|
||||||
}
|
}
|
||||||
}
|
lit_len_histogram[literal & 0xFF] += 1;
|
||||||
lit_len_histogram[literal & 0xFF] += 1;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
for (; current < end_stream; current++)
|
for (; current < end_stream; current++)
|
||||||
lit_len_histogram[*current] += 1;
|
lit_len_histogram[*current] += 1;
|
||||||
|
|
||||||
lit_len_histogram[256] += 1;
|
lit_len_histogram[256] += 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
long int file_length;
|
long int file_length;
|
||||||
int argi = 1;
|
int argi = 1;
|
||||||
uint8_t *stream = NULL;
|
uint8_t *stream = NULL;
|
||||||
struct isal_hufftables hufftables;
|
struct isal_hufftables hufftables;
|
||||||
struct isal_huff_histogram histogram;
|
struct isal_huff_histogram histogram;
|
||||||
struct isal_zstream tmp_stream;
|
struct isal_zstream tmp_stream;
|
||||||
FILE *file = NULL;
|
FILE *file = NULL;
|
||||||
FILE *dict_file = NULL;
|
FILE *dict_file = NULL;
|
||||||
FILE *hist_file = NULL;
|
FILE *hist_file = NULL;
|
||||||
long int dict_file_length = 0;
|
long int dict_file_length = 0;
|
||||||
long int hist_file_length = 0;
|
long int hist_file_length = 0;
|
||||||
uint8_t *dict_stream = NULL;
|
uint8_t *dict_stream = NULL;
|
||||||
|
|
||||||
if (argc == 1) {
|
if (argc == 1) {
|
||||||
printf("Error, no input file.\n");
|
printf("Error, no input file.\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (argc > 3 && argv[1][0] == '-' && argv[1][1] == 'd') {
|
if (argc > 3 && argv[1][0] == '-' && argv[1][1] == 'd') {
|
||||||
dict_file = fopen(argv[2], "r");
|
dict_file = fopen(argv[2], "r");
|
||||||
if (dict_file == NULL) {
|
if (dict_file == NULL) {
|
||||||
printf("File \"%s\" open error!\n", argv[2]);
|
printf("File \"%s\" open error!\n", argv[2]);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fseek(dict_file, 0, SEEK_END);
|
fseek(dict_file, 0, SEEK_END);
|
||||||
dict_file_length = ftell(dict_file);
|
dict_file_length = ftell(dict_file);
|
||||||
fseek(dict_file, 0, SEEK_SET);
|
fseek(dict_file, 0, SEEK_SET);
|
||||||
dict_file_length -= ftell(dict_file);
|
dict_file_length -= ftell(dict_file);
|
||||||
dict_stream = malloc(dict_file_length);
|
dict_stream = malloc(dict_file_length);
|
||||||
if (dict_stream == NULL) {
|
if (dict_stream == NULL) {
|
||||||
printf("Failed to allocate memory to read in dictionary file\n");
|
printf("Failed to allocate memory to read in dictionary file\n");
|
||||||
fclose(dict_file);
|
fclose(dict_file);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (fread(dict_stream, 1, dict_file_length, dict_file) != dict_file_length) {
|
if (fread(dict_stream, 1, dict_file_length, dict_file) != dict_file_length) {
|
||||||
printf("Error occurred when reading dictionary file");
|
printf("Error occurred when reading dictionary file");
|
||||||
fclose(dict_file);
|
fclose(dict_file);
|
||||||
free(dict_stream);
|
free(dict_stream);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
isal_update_histogram(dict_stream, dict_file_length, &histogram);
|
isal_update_histogram(dict_stream, dict_file_length, &histogram);
|
||||||
|
|
||||||
printf("Read %ld bytes of dictionary file %s\n", dict_file_length, argv[2]);
|
printf("Read %ld bytes of dictionary file %s\n", dict_file_length, argv[2]);
|
||||||
argi += 2;
|
argi += 2;
|
||||||
fclose(dict_file);
|
fclose(dict_file);
|
||||||
free(dict_stream);
|
free(dict_stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((argc > argi + 1) && argv[argi][0] == '-' && argv[argi][1] == 'h') {
|
if ((argc > argi + 1) && argv[argi][0] == '-' && argv[argi][1] == 'h') {
|
||||||
hist_file = fopen(argv[argi + 1], "r+");
|
hist_file = fopen(argv[argi + 1], "r+");
|
||||||
if (hist_file == NULL) {
|
if (hist_file == NULL) {
|
||||||
printf("File \"%s\" open error!\n", argv[argi + 1]);
|
printf("File \"%s\" open error!\n", argv[argi + 1]);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
fseek(hist_file, 0, SEEK_END);
|
fseek(hist_file, 0, SEEK_END);
|
||||||
hist_file_length = ftell(hist_file);
|
hist_file_length = ftell(hist_file);
|
||||||
fseek(hist_file, 0, SEEK_SET);
|
fseek(hist_file, 0, SEEK_SET);
|
||||||
hist_file_length -= ftell(hist_file);
|
hist_file_length -= ftell(hist_file);
|
||||||
if (hist_file_length > sizeof(histogram)) {
|
if (hist_file_length > sizeof(histogram)) {
|
||||||
printf("Histogram file too long\n");
|
printf("Histogram file too long\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (fread(&histogram, 1, hist_file_length, hist_file) != hist_file_length) {
|
if (fread(&histogram, 1, hist_file_length, hist_file) != hist_file_length) {
|
||||||
printf("Error occurred when reading history file");
|
printf("Error occurred when reading history file");
|
||||||
fclose(hist_file);
|
fclose(hist_file);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
fseek(hist_file, 0, SEEK_SET);
|
fseek(hist_file, 0, SEEK_SET);
|
||||||
|
|
||||||
printf("Read %ld bytes of history file %s\n", hist_file_length,
|
printf("Read %ld bytes of history file %s\n", hist_file_length, argv[argi + 1]);
|
||||||
argv[argi + 1]);
|
argi += 2;
|
||||||
argi += 2;
|
} else
|
||||||
} else
|
memset(&histogram, 0, sizeof(histogram)); /* Initialize histograms. */
|
||||||
memset(&histogram, 0, sizeof(histogram)); /* Initialize histograms. */
|
|
||||||
|
|
||||||
while (argi < argc) {
|
while (argi < argc) {
|
||||||
printf("Processing %s\n", argv[argi]);
|
printf("Processing %s\n", argv[argi]);
|
||||||
file = fopen(argv[argi], "r");
|
file = fopen(argv[argi], "r");
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
printf("Error opening file\n");
|
printf("Error opening file\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
fseek(file, 0, SEEK_END);
|
fseek(file, 0, SEEK_END);
|
||||||
file_length = ftell(file);
|
file_length = ftell(file);
|
||||||
fseek(file, 0, SEEK_SET);
|
fseek(file, 0, SEEK_SET);
|
||||||
file_length -= ftell(file);
|
file_length -= ftell(file);
|
||||||
stream = malloc(file_length + dict_file_length);
|
stream = malloc(file_length + dict_file_length);
|
||||||
if (stream == NULL) {
|
if (stream == NULL) {
|
||||||
printf("Failed to allocate memory to read in file\n");
|
printf("Failed to allocate memory to read in file\n");
|
||||||
fclose(file);
|
fclose(file);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (dict_file_length > 0)
|
if (dict_file_length > 0)
|
||||||
memcpy(stream, dict_stream, dict_file_length);
|
memcpy(stream, dict_stream, dict_file_length);
|
||||||
|
|
||||||
if (fread(&stream[dict_file_length], 1, file_length, file) != file_length) {
|
if (fread(&stream[dict_file_length], 1, file_length, file) != file_length) {
|
||||||
printf("Error occurred when reading file");
|
printf("Error occurred when reading file");
|
||||||
fclose(file);
|
fclose(file);
|
||||||
free(stream);
|
free(stream);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create a histogram of frequency of symbols found in stream to
|
/* Create a histogram of frequency of symbols found in stream to
|
||||||
* generate the huffman tree.*/
|
* generate the huffman tree.*/
|
||||||
if (0 == dict_file_length)
|
if (0 == dict_file_length)
|
||||||
isal_update_histogram(stream, file_length, &histogram);
|
isal_update_histogram(stream, file_length, &histogram);
|
||||||
else
|
else
|
||||||
isal_update_histogram_dict(stream, dict_file_length, file_length,
|
isal_update_histogram_dict(stream, dict_file_length, file_length,
|
||||||
&histogram);
|
&histogram);
|
||||||
|
|
||||||
fclose(file);
|
fclose(file);
|
||||||
free(stream);
|
free(stream);
|
||||||
argi++;
|
argi++;
|
||||||
}
|
}
|
||||||
|
|
||||||
isal_create_hufftables(&hufftables, &histogram);
|
isal_create_hufftables(&hufftables, &histogram);
|
||||||
|
|
||||||
file = fopen("hufftables_c.c", "w");
|
file = fopen("hufftables_c.c", "w");
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
printf("Error creating file hufftables_c.c\n");
|
printf("Error creating file hufftables_c.c\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprint_header(file);
|
fprint_header(file);
|
||||||
|
|
||||||
fprintf(file, "\n");
|
fprintf(file, "\n");
|
||||||
|
|
||||||
fprint_hufftables(file, "hufftables_default", &hufftables);
|
fprint_hufftables(file, "hufftables_default", &hufftables);
|
||||||
|
|
||||||
fprintf(file, "\n");
|
fprintf(file, "\n");
|
||||||
|
|
||||||
isal_deflate_stateless_init(&tmp_stream);
|
isal_deflate_stateless_init(&tmp_stream);
|
||||||
isal_deflate_set_hufftables(&tmp_stream, NULL, IGZIP_HUFFTABLE_STATIC);
|
isal_deflate_set_hufftables(&tmp_stream, NULL, IGZIP_HUFFTABLE_STATIC);
|
||||||
fprint_hufftables(file, "hufftables_static", tmp_stream.hufftables);
|
fprint_hufftables(file, "hufftables_static", tmp_stream.hufftables);
|
||||||
|
|
||||||
fclose(file);
|
fclose(file);
|
||||||
|
|
||||||
if (hist_file) {
|
if (hist_file) {
|
||||||
int len = fwrite(&histogram, 1, sizeof(histogram), hist_file);
|
int len = fwrite(&histogram, 1, sizeof(histogram), hist_file);
|
||||||
printf("wrote %d bytes of histogram file\n", len);
|
printf("wrote %d bytes of histogram file\n", len);
|
||||||
fclose(hist_file);
|
fclose(hist_file);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
#include "igzip_lib.h"
|
#include "igzip_lib.h"
|
||||||
|
|
||||||
#define STATIC_INFLATE_FILE "static_inflate.h"
|
#define STATIC_INFLATE_FILE "static_inflate.h"
|
||||||
#define DOUBLE_SYM_THRESH (4 * 1024)
|
#define DOUBLE_SYM_THRESH (4 * 1024)
|
||||||
|
|
||||||
extern struct isal_hufftables hufftables_default;
|
extern struct isal_hufftables hufftables_default;
|
||||||
|
|
||||||
@ -48,26 +48,26 @@ extern struct isal_hufftables hufftables_default;
|
|||||||
* @param footer: footer to append at the end of the table.
|
* @param footer: footer to append at the end of the table.
|
||||||
* @param begin_line: string printed at beginning of new line
|
* @param begin_line: string printed at beginning of new line
|
||||||
*/
|
*/
|
||||||
void fprint_uint16_table(FILE * outfile, uint16_t * table, uint64_t length, char *header,
|
void
|
||||||
char *footer, char *begin_line)
|
fprint_uint16_table(FILE *outfile, uint16_t *table, uint64_t length, char *header, char *footer,
|
||||||
|
char *begin_line)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
fprintf(outfile, "%s", header);
|
fprintf(outfile, "%s", header);
|
||||||
for (i = 0; i < length - 1; i++) {
|
for (i = 0; i < length - 1; i++) {
|
||||||
if ((i & 7) == 0)
|
if ((i & 7) == 0)
|
||||||
fprintf(outfile, "\n%s", begin_line);
|
fprintf(outfile, "\n%s", begin_line);
|
||||||
else
|
else
|
||||||
fprintf(outfile, " ");
|
fprintf(outfile, " ");
|
||||||
fprintf(outfile, "0x%04x,", table[i]);
|
fprintf(outfile, "0x%04x,", table[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((i & 7) == 0)
|
|
||||||
fprintf(outfile, "\n%s", begin_line);
|
|
||||||
else
|
|
||||||
fprintf(outfile, " ");
|
|
||||||
fprintf(outfile, "0x%04x", table[i]);
|
|
||||||
fprintf(outfile, "%s", footer);
|
|
||||||
|
|
||||||
|
if ((i & 7) == 0)
|
||||||
|
fprintf(outfile, "\n%s", begin_line);
|
||||||
|
else
|
||||||
|
fprintf(outfile, " ");
|
||||||
|
fprintf(outfile, "0x%04x", table[i]);
|
||||||
|
fprintf(outfile, "%s", footer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -79,127 +79,130 @@ void fprint_uint16_table(FILE * outfile, uint16_t * table, uint64_t length, char
|
|||||||
* @param footer: footer to append at the end of the table.
|
* @param footer: footer to append at the end of the table.
|
||||||
* @param begin_line: string printed at beginning of new line
|
* @param begin_line: string printed at beginning of new line
|
||||||
*/
|
*/
|
||||||
void fprint_uint32_table(FILE * outfile, uint32_t * table, uint64_t length, char *header,
|
void
|
||||||
char *footer, char *begin_line)
|
fprint_uint32_table(FILE *outfile, uint32_t *table, uint64_t length, char *header, char *footer,
|
||||||
|
char *begin_line)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
fprintf(outfile, "%s", header);
|
fprintf(outfile, "%s", header);
|
||||||
for (i = 0; i < length - 1; i++) {
|
for (i = 0; i < length - 1; i++) {
|
||||||
if ((i & 3) == 0)
|
if ((i & 3) == 0)
|
||||||
fprintf(outfile, "\n%s", begin_line);
|
fprintf(outfile, "\n%s", begin_line);
|
||||||
else
|
else
|
||||||
fprintf(outfile, " ");
|
fprintf(outfile, " ");
|
||||||
fprintf(outfile, "0x%08x,", table[i]);
|
fprintf(outfile, "0x%08x,", table[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((i & 3) == 0)
|
|
||||||
fprintf(outfile, "%s", begin_line);
|
|
||||||
else
|
|
||||||
fprintf(outfile, " ");
|
|
||||||
fprintf(outfile, "0x%08x", table[i]);
|
|
||||||
fprintf(outfile, "%s", footer);
|
|
||||||
|
|
||||||
|
if ((i & 3) == 0)
|
||||||
|
fprintf(outfile, "%s", begin_line);
|
||||||
|
else
|
||||||
|
fprintf(outfile, " ");
|
||||||
|
fprintf(outfile, "0x%08x", table[i]);
|
||||||
|
fprintf(outfile, "%s", footer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void fprint_header(FILE * output_file)
|
void
|
||||||
|
fprint_header(FILE *output_file)
|
||||||
{
|
{
|
||||||
fprintf(output_file, "#include \"igzip_lib.h\"\n\n");
|
fprintf(output_file, "#include \"igzip_lib.h\"\n\n");
|
||||||
fprintf(output_file, "#define LONG_BITS_CHECK %d\n", ISAL_DECODE_LONG_BITS);
|
fprintf(output_file, "#define LONG_BITS_CHECK %d\n", ISAL_DECODE_LONG_BITS);
|
||||||
fprintf(output_file, "#define SHORT_BITS_CHECK %d\n", ISAL_DECODE_SHORT_BITS);
|
fprintf(output_file, "#define SHORT_BITS_CHECK %d\n", ISAL_DECODE_SHORT_BITS);
|
||||||
fprintf(output_file,
|
fprintf(output_file, "#if (LONG_BITS_CHECK == ISAL_DECODE_LONG_BITS) && (SHORT_BITS_CHECK "
|
||||||
"#if (LONG_BITS_CHECK == ISAL_DECODE_LONG_BITS) && (SHORT_BITS_CHECK == ISAL_DECODE_SHORT_BITS)\n"
|
"== ISAL_DECODE_SHORT_BITS)\n"
|
||||||
"# define ISAL_STATIC_INFLATE_TABLE\n"
|
"# define ISAL_STATIC_INFLATE_TABLE\n"
|
||||||
"#else\n"
|
"#else\n"
|
||||||
"# warning \"Incompatible compile time defines for optimized static inflate table.\"\n"
|
"# warning \"Incompatible compile time defines for optimized static "
|
||||||
"#endif\n\n");
|
"inflate table.\"\n"
|
||||||
|
"#endif\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct inflate_state state;
|
struct inflate_state state;
|
||||||
FILE *file;
|
FILE *file;
|
||||||
uint8_t static_deflate_hdr = 3;
|
uint8_t static_deflate_hdr = 3;
|
||||||
uint8_t tmp_space[8], *in_buf;
|
uint8_t tmp_space[8], *in_buf;
|
||||||
|
|
||||||
if (NULL == (in_buf = malloc(DOUBLE_SYM_THRESH + 1))) {
|
if (NULL == (in_buf = malloc(DOUBLE_SYM_THRESH + 1))) {
|
||||||
printf("Can not allocote memory\n");
|
printf("Can not allocote memory\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
isal_inflate_init(&state);
|
isal_inflate_init(&state);
|
||||||
|
|
||||||
memcpy(in_buf, &static_deflate_hdr, sizeof(static_deflate_hdr));
|
memcpy(in_buf, &static_deflate_hdr, sizeof(static_deflate_hdr));
|
||||||
state.next_in = in_buf;
|
state.next_in = in_buf;
|
||||||
state.avail_in = DOUBLE_SYM_THRESH + 1;
|
state.avail_in = DOUBLE_SYM_THRESH + 1;
|
||||||
state.next_out = tmp_space;
|
state.next_out = tmp_space;
|
||||||
state.avail_out = sizeof(tmp_space);
|
state.avail_out = sizeof(tmp_space);
|
||||||
|
|
||||||
isal_inflate(&state);
|
isal_inflate(&state);
|
||||||
|
|
||||||
file = fopen(STATIC_INFLATE_FILE, "w");
|
file = fopen(STATIC_INFLATE_FILE, "w");
|
||||||
|
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
printf("Error creating file hufftables_c.c\n");
|
printf("Error creating file hufftables_c.c\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
// Add decode tables describing a type 2 static (fixed) header
|
// Add decode tables describing a type 2 static (fixed) header
|
||||||
|
|
||||||
fprintf(file, "#ifndef STATIC_HEADER_H\n" "#define STATIC_HEADER_H\n\n");
|
fprintf(file, "#ifndef STATIC_HEADER_H\n"
|
||||||
|
"#define STATIC_HEADER_H\n\n");
|
||||||
|
|
||||||
fprint_header(file);
|
fprint_header(file);
|
||||||
|
|
||||||
fprintf(file, "struct inflate_huff_code_large static_lit_huff_code = {\n");
|
fprintf(file, "struct inflate_huff_code_large static_lit_huff_code = {\n");
|
||||||
fprint_uint32_table(file, state.lit_huff_code.short_code_lookup,
|
fprint_uint32_table(file, state.lit_huff_code.short_code_lookup,
|
||||||
sizeof(state.lit_huff_code.short_code_lookup) / sizeof(uint32_t),
|
sizeof(state.lit_huff_code.short_code_lookup) / sizeof(uint32_t),
|
||||||
"\t.short_code_lookup = {", "\t},\n\n", "\t\t");
|
"\t.short_code_lookup = {", "\t},\n\n", "\t\t");
|
||||||
fprint_uint16_table(file, state.lit_huff_code.long_code_lookup,
|
fprint_uint16_table(file, state.lit_huff_code.long_code_lookup,
|
||||||
sizeof(state.lit_huff_code.long_code_lookup) / sizeof(uint16_t),
|
sizeof(state.lit_huff_code.long_code_lookup) / sizeof(uint16_t),
|
||||||
"\t.long_code_lookup = {", "\t}\n", "\t\t");
|
"\t.long_code_lookup = {", "\t}\n", "\t\t");
|
||||||
fprintf(file, "};\n\n");
|
fprintf(file, "};\n\n");
|
||||||
|
|
||||||
fprintf(file, "struct inflate_huff_code_small static_dist_huff_code = {\n");
|
fprintf(file, "struct inflate_huff_code_small static_dist_huff_code = {\n");
|
||||||
fprint_uint16_table(file, state.dist_huff_code.short_code_lookup,
|
fprint_uint16_table(file, state.dist_huff_code.short_code_lookup,
|
||||||
sizeof(state.dist_huff_code.short_code_lookup) / sizeof(uint16_t),
|
sizeof(state.dist_huff_code.short_code_lookup) / sizeof(uint16_t),
|
||||||
"\t.short_code_lookup = {", "\t},\n\n", "\t\t");
|
"\t.short_code_lookup = {", "\t},\n\n", "\t\t");
|
||||||
fprint_uint16_table(file, state.dist_huff_code.long_code_lookup,
|
fprint_uint16_table(file, state.dist_huff_code.long_code_lookup,
|
||||||
sizeof(state.dist_huff_code.long_code_lookup) / sizeof(uint16_t),
|
sizeof(state.dist_huff_code.long_code_lookup) / sizeof(uint16_t),
|
||||||
"\t.long_code_lookup = {", "\t}\n", "\t\t");
|
"\t.long_code_lookup = {", "\t}\n", "\t\t");
|
||||||
fprintf(file, "};\n\n");
|
fprintf(file, "};\n\n");
|
||||||
|
|
||||||
fprintf(file, "#endif\n");
|
fprintf(file, "#endif\n");
|
||||||
|
|
||||||
// Add other tables for known dynamic headers - level 0
|
// Add other tables for known dynamic headers - level 0
|
||||||
|
|
||||||
isal_inflate_init(&state);
|
isal_inflate_init(&state);
|
||||||
|
|
||||||
memcpy(in_buf, &hufftables_default.deflate_hdr,
|
memcpy(in_buf, &hufftables_default.deflate_hdr, sizeof(hufftables_default.deflate_hdr));
|
||||||
sizeof(hufftables_default.deflate_hdr));
|
state.next_in = in_buf;
|
||||||
state.next_in = in_buf;
|
state.avail_in = DOUBLE_SYM_THRESH + 1;
|
||||||
state.avail_in = DOUBLE_SYM_THRESH + 1;
|
state.next_out = tmp_space;
|
||||||
state.next_out = tmp_space;
|
state.avail_out = sizeof(tmp_space);
|
||||||
state.avail_out = sizeof(tmp_space);
|
|
||||||
|
|
||||||
isal_inflate(&state);
|
isal_inflate(&state);
|
||||||
|
|
||||||
fprintf(file, "struct inflate_huff_code_large pregen_lit_huff_code = {\n");
|
fprintf(file, "struct inflate_huff_code_large pregen_lit_huff_code = {\n");
|
||||||
fprint_uint32_table(file, state.lit_huff_code.short_code_lookup,
|
fprint_uint32_table(file, state.lit_huff_code.short_code_lookup,
|
||||||
sizeof(state.lit_huff_code.short_code_lookup) / sizeof(uint32_t),
|
sizeof(state.lit_huff_code.short_code_lookup) / sizeof(uint32_t),
|
||||||
"\t.short_code_lookup = {", "\t},\n\n", "\t\t");
|
"\t.short_code_lookup = {", "\t},\n\n", "\t\t");
|
||||||
fprint_uint16_table(file, state.lit_huff_code.long_code_lookup,
|
fprint_uint16_table(file, state.lit_huff_code.long_code_lookup,
|
||||||
sizeof(state.lit_huff_code.long_code_lookup) / sizeof(uint16_t),
|
sizeof(state.lit_huff_code.long_code_lookup) / sizeof(uint16_t),
|
||||||
"\t.long_code_lookup = {", "\t}\n", "\t\t");
|
"\t.long_code_lookup = {", "\t}\n", "\t\t");
|
||||||
fprintf(file, "};\n\n");
|
fprintf(file, "};\n\n");
|
||||||
|
|
||||||
fprintf(file, "struct inflate_huff_code_small pregen_dist_huff_code = {\n");
|
fprintf(file, "struct inflate_huff_code_small pregen_dist_huff_code = {\n");
|
||||||
fprint_uint16_table(file, state.dist_huff_code.short_code_lookup,
|
fprint_uint16_table(file, state.dist_huff_code.short_code_lookup,
|
||||||
sizeof(state.dist_huff_code.short_code_lookup) / sizeof(uint16_t),
|
sizeof(state.dist_huff_code.short_code_lookup) / sizeof(uint16_t),
|
||||||
"\t.short_code_lookup = {", "\t},\n\n", "\t\t");
|
"\t.short_code_lookup = {", "\t},\n\n", "\t\t");
|
||||||
fprint_uint16_table(file, state.dist_huff_code.long_code_lookup,
|
fprint_uint16_table(file, state.dist_huff_code.long_code_lookup,
|
||||||
sizeof(state.dist_huff_code.long_code_lookup) / sizeof(uint16_t),
|
sizeof(state.dist_huff_code.long_code_lookup) / sizeof(uint16_t),
|
||||||
"\t.long_code_lookup = {", "\t}\n", "\t\t");
|
"\t.long_code_lookup = {", "\t}\n", "\t\t");
|
||||||
fprintf(file, "};\n\n");
|
fprintf(file, "};\n\n");
|
||||||
|
|
||||||
fclose(file);
|
fclose(file);
|
||||||
free(in_buf);
|
free(in_buf);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
2678
igzip/huff_codes.c
2678
igzip/huff_codes.c
File diff suppressed because it is too large
Load Diff
@ -36,135 +36,135 @@
|
|||||||
#include "igzip_lib.h"
|
#include "igzip_lib.h"
|
||||||
#include "bitbuf2.h"
|
#include "bitbuf2.h"
|
||||||
|
|
||||||
#if __x86_64__ || __i386__ || _M_X64 || _M_IX86
|
#if __x86_64__ || __i386__ || _M_X64 || _M_IX86
|
||||||
# include <immintrin.h>
|
#include <immintrin.h>
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
# include <intrin.h>
|
#include <intrin.h>
|
||||||
#else
|
#else
|
||||||
# include <x86intrin.h>
|
#include <x86intrin.h>
|
||||||
#endif
|
#endif
|
||||||
#endif //__x86_64__ || __i386__ || _M_X64 || _M_IX86
|
#endif //__x86_64__ || __i386__ || _M_X64 || _M_IX86
|
||||||
|
|
||||||
#define LIT_LEN ISAL_DEF_LIT_LEN_SYMBOLS
|
#define LIT_LEN ISAL_DEF_LIT_LEN_SYMBOLS
|
||||||
#define DIST_LEN ISAL_DEF_DIST_SYMBOLS
|
#define DIST_LEN ISAL_DEF_DIST_SYMBOLS
|
||||||
#define CODE_LEN_CODES 19
|
#define CODE_LEN_CODES 19
|
||||||
#define HUFF_LEN 19
|
#define HUFF_LEN 19
|
||||||
#ifdef LONGER_HUFFTABLE
|
#ifdef LONGER_HUFFTABLE
|
||||||
# define DCODE_OFFSET 26
|
#define DCODE_OFFSET 26
|
||||||
#else
|
#else
|
||||||
# define DCODE_OFFSET 0
|
#define DCODE_OFFSET 0
|
||||||
#endif
|
#endif
|
||||||
#define DYN_HDR_START_LEN 17
|
#define DYN_HDR_START_LEN 17
|
||||||
#define MAX_HISTHEAP_SIZE LIT_LEN
|
#define MAX_HISTHEAP_SIZE LIT_LEN
|
||||||
#define MAX_HUFF_TREE_DEPTH 15
|
#define MAX_HUFF_TREE_DEPTH 15
|
||||||
#define D IGZIP_HIST_SIZE /* Amount of history */
|
#define D IGZIP_HIST_SIZE /* Amount of history */
|
||||||
|
|
||||||
#define MAX_DEFLATE_CODE_LEN 15
|
#define MAX_DEFLATE_CODE_LEN 15
|
||||||
#define MAX_SAFE_LIT_CODE_LEN 13
|
#define MAX_SAFE_LIT_CODE_LEN 13
|
||||||
#define MAX_SAFE_DIST_CODE_LEN 12
|
#define MAX_SAFE_DIST_CODE_LEN 12
|
||||||
|
|
||||||
#define LONG_DIST_TABLE_SIZE 8192
|
#define LONG_DIST_TABLE_SIZE 8192
|
||||||
#define SHORT_DIST_TABLE_SIZE 2
|
#define SHORT_DIST_TABLE_SIZE 2
|
||||||
#define LEN_TABLE_SIZE 256
|
#define LEN_TABLE_SIZE 256
|
||||||
#define LIT_TABLE_SIZE 257
|
#define LIT_TABLE_SIZE 257
|
||||||
#define LAST_BLOCK 1
|
#define LAST_BLOCK 1
|
||||||
|
|
||||||
#define LEN_EXTRA_BITS_START 264
|
#define LEN_EXTRA_BITS_START 264
|
||||||
#define LEN_EXTRA_BITS_INTERVAL 4
|
#define LEN_EXTRA_BITS_INTERVAL 4
|
||||||
#define DIST_EXTRA_BITS_START 3
|
#define DIST_EXTRA_BITS_START 3
|
||||||
#define DIST_EXTRA_BITS_INTERVAL 2
|
#define DIST_EXTRA_BITS_INTERVAL 2
|
||||||
|
|
||||||
#define INVALID_LIT_LEN_HUFFCODE 1
|
#define INVALID_LIT_LEN_HUFFCODE 1
|
||||||
#define INVALID_DIST_HUFFCODE 1
|
#define INVALID_DIST_HUFFCODE 1
|
||||||
#define INVALID_HUFFCODE 1
|
#define INVALID_HUFFCODE 1
|
||||||
|
|
||||||
#define HASH8K_HASH_MASK (IGZIP_HASH8K_HASH_SIZE - 1)
|
#define HASH8K_HASH_MASK (IGZIP_HASH8K_HASH_SIZE - 1)
|
||||||
#define HASH_HIST_HASH_MASK (IGZIP_HASH_HIST_SIZE - 1)
|
#define HASH_HIST_HASH_MASK (IGZIP_HASH_HIST_SIZE - 1)
|
||||||
#define HASH_MAP_HASH_MASK (IGZIP_HASH_MAP_HASH_SIZE - 1)
|
#define HASH_MAP_HASH_MASK (IGZIP_HASH_MAP_HASH_SIZE - 1)
|
||||||
|
|
||||||
#define LVL0_HASH_MASK (IGZIP_LVL0_HASH_SIZE - 1)
|
#define LVL0_HASH_MASK (IGZIP_LVL0_HASH_SIZE - 1)
|
||||||
#define LVL1_HASH_MASK (IGZIP_LVL1_HASH_SIZE - 1)
|
#define LVL1_HASH_MASK (IGZIP_LVL1_HASH_SIZE - 1)
|
||||||
#define LVL2_HASH_MASK (IGZIP_LVL2_HASH_SIZE - 1)
|
#define LVL2_HASH_MASK (IGZIP_LVL2_HASH_SIZE - 1)
|
||||||
#define LVL3_HASH_MASK (IGZIP_LVL3_HASH_SIZE - 1)
|
#define LVL3_HASH_MASK (IGZIP_LVL3_HASH_SIZE - 1)
|
||||||
#define SHORTEST_MATCH 4
|
#define SHORTEST_MATCH 4
|
||||||
|
|
||||||
#define LENGTH_BITS 5
|
#define LENGTH_BITS 5
|
||||||
#define FREQ_SHIFT 16
|
#define FREQ_SHIFT 16
|
||||||
#define FREQ_MASK_HI (0xFFFFFFFFFFFF0000)
|
#define FREQ_MASK_HI (0xFFFFFFFFFFFF0000)
|
||||||
#define DEPTH_SHIFT 24
|
#define DEPTH_SHIFT 24
|
||||||
#define DEPTH_MASK 0x7F
|
#define DEPTH_MASK 0x7F
|
||||||
#define DEPTH_MASK_HI (DEPTH_MASK << DEPTH_SHIFT)
|
#define DEPTH_MASK_HI (DEPTH_MASK << DEPTH_SHIFT)
|
||||||
#define DEPTH_1 (1 << DEPTH_SHIFT)
|
#define DEPTH_1 (1 << DEPTH_SHIFT)
|
||||||
#define HEAP_TREE_SIZE (3*MAX_HISTHEAP_SIZE + 1)
|
#define HEAP_TREE_SIZE (3 * MAX_HISTHEAP_SIZE + 1)
|
||||||
#define HEAP_TREE_NODE_START (HEAP_TREE_SIZE-1)
|
#define HEAP_TREE_NODE_START (HEAP_TREE_SIZE - 1)
|
||||||
#define MAX_BL_CODE_LEN 7
|
#define MAX_BL_CODE_LEN 7
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Structure used to store huffman codes
|
* @brief Structure used to store huffman codes
|
||||||
*/
|
*/
|
||||||
struct huff_code {
|
struct huff_code {
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
||||||
uint32_t code_and_extra:24;
|
uint32_t code_and_extra : 24;
|
||||||
uint32_t length2:8;
|
uint32_t length2 : 8;
|
||||||
#else
|
#else
|
||||||
uint32_t length2:8;
|
uint32_t length2 : 8;
|
||||||
uint32_t code_and_extra:24;
|
uint32_t code_and_extra : 24;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
||||||
uint16_t code;
|
uint16_t code;
|
||||||
uint8_t extra_bit_count;
|
uint8_t extra_bit_count;
|
||||||
uint8_t length;
|
uint8_t length;
|
||||||
#else
|
#else
|
||||||
uint8_t length;
|
uint8_t length;
|
||||||
uint8_t extra_bit_count;
|
uint8_t extra_bit_count;
|
||||||
uint16_t code;
|
uint16_t code;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
uint32_t code_and_length;
|
uint32_t code_and_length;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct tree_node {
|
struct tree_node {
|
||||||
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
||||||
uint32_t child;
|
uint32_t child;
|
||||||
uint32_t depth;
|
uint32_t depth;
|
||||||
#else
|
#else
|
||||||
uint32_t depth;
|
uint32_t depth;
|
||||||
uint32_t child;
|
uint32_t child;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
struct heap_tree {
|
struct heap_tree {
|
||||||
union {
|
union {
|
||||||
uint64_t heap[HEAP_TREE_SIZE];
|
uint64_t heap[HEAP_TREE_SIZE];
|
||||||
uint64_t code_len_count[MAX_HUFF_TREE_DEPTH + 1];
|
uint64_t code_len_count[MAX_HUFF_TREE_DEPTH + 1];
|
||||||
struct tree_node tree[HEAP_TREE_SIZE];
|
struct tree_node tree[HEAP_TREE_SIZE];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct rl_code {
|
struct rl_code {
|
||||||
uint8_t code;
|
uint8_t code;
|
||||||
uint8_t extra_bits;
|
uint8_t extra_bits;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct hufftables_icf {
|
struct hufftables_icf {
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
struct huff_code dist_lit_table[288];
|
struct huff_code dist_lit_table[288];
|
||||||
struct huff_code len_table[256];
|
struct huff_code len_table[256];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
struct huff_code dist_table[31];
|
struct huff_code dist_table[31];
|
||||||
struct huff_code lit_len_table[513];
|
struct huff_code lit_len_table[513];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -181,6 +181,6 @@ struct hufftables_icf {
|
|||||||
*/
|
*/
|
||||||
uint64_t
|
uint64_t
|
||||||
create_hufftables_icf(struct BitBuf2 *bb, struct hufftables_icf *hufftables,
|
create_hufftables_icf(struct BitBuf2 *bb, struct hufftables_icf *hufftables,
|
||||||
struct isal_mod_hist *hist, uint32_t end_of_block);
|
struct isal_mod_hist *hist, uint32_t end_of_block);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
438
igzip/huffman.h
438
igzip/huffman.h
@ -33,15 +33,15 @@
|
|||||||
#include "igzip_lib.h"
|
#include "igzip_lib.h"
|
||||||
#include "unaligned.h"
|
#include "unaligned.h"
|
||||||
|
|
||||||
#if __x86_64__ || __i386__ || _M_X64 || _M_IX86
|
#if __x86_64__ || __i386__ || _M_X64 || _M_IX86
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
# include <intrin.h>
|
#include <intrin.h>
|
||||||
# define inline __inline
|
#define inline __inline
|
||||||
#else
|
#else
|
||||||
# include <x86intrin.h>
|
#include <x86intrin.h>
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
# define inline __inline
|
#define inline __inline
|
||||||
#endif //__x86_64__ || __i386__ || _M_X64 || _M_IX86
|
#endif //__x86_64__ || __i386__ || _M_X64 || _M_IX86
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -50,195 +50,205 @@
|
|||||||
*
|
*
|
||||||
* @returns bit offset of msb starting at 1 for first bit
|
* @returns bit offset of msb starting at 1 for first bit
|
||||||
*/
|
*/
|
||||||
static inline uint32_t bsr(uint32_t val)
|
static inline uint32_t
|
||||||
|
bsr(uint32_t val)
|
||||||
{
|
{
|
||||||
uint32_t msb;
|
uint32_t msb;
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
unsigned long ret = 0;
|
unsigned long ret = 0;
|
||||||
if (val != 0) {
|
if (val != 0) {
|
||||||
_BitScanReverse(&ret, val);
|
_BitScanReverse(&ret, val);
|
||||||
msb = ret + 1;
|
msb = ret + 1;
|
||||||
} else
|
} else
|
||||||
msb = 0;
|
msb = 0;
|
||||||
#elif defined( __LZCNT__)
|
#elif defined(__LZCNT__)
|
||||||
msb = 32 - __lzcnt32(val);
|
msb = 32 - __lzcnt32(val);
|
||||||
#elif defined(__x86_64__) || defined(__aarch64__)
|
#elif defined(__x86_64__) || defined(__aarch64__)
|
||||||
msb = (val == 0) ? 0 : 32 - __builtin_clz(val);
|
msb = (val == 0) ? 0 : 32 - __builtin_clz(val);
|
||||||
#else
|
#else
|
||||||
for (msb = 0; val > 0; val >>= 1)
|
for (msb = 0; val > 0; val >>= 1)
|
||||||
msb++;
|
msb++;
|
||||||
#endif
|
#endif
|
||||||
return msb;
|
return msb;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t tzbytecnt(uint64_t val)
|
static inline uint32_t
|
||||||
|
tzbytecnt(uint64_t val)
|
||||||
{
|
{
|
||||||
uint32_t cnt;
|
uint32_t cnt;
|
||||||
|
|
||||||
#ifdef __BMI__
|
#ifdef __BMI__
|
||||||
cnt = __tzcnt_u64(val);
|
cnt = __tzcnt_u64(val);
|
||||||
cnt = cnt / 8;
|
cnt = cnt / 8;
|
||||||
#elif defined(__x86_64__) || defined(__aarch64__)
|
#elif defined(__x86_64__) || defined(__aarch64__)
|
||||||
|
|
||||||
cnt = (val == 0) ? 64 : __builtin_ctzll(val);
|
cnt = (val == 0) ? 64 : __builtin_ctzll(val);
|
||||||
cnt = cnt / 8;
|
cnt = cnt / 8;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
for (cnt = 8; val > 0; val <<= 8)
|
for (cnt = 8; val > 0; val <<= 8)
|
||||||
cnt -= 1;
|
cnt -= 1;
|
||||||
#endif
|
#endif
|
||||||
return cnt;
|
return cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void compute_dist_code(struct isal_hufftables *hufftables, uint16_t dist,
|
static void
|
||||||
uint64_t * p_code, uint64_t * p_len)
|
compute_dist_code(struct isal_hufftables *hufftables, uint16_t dist, uint64_t *p_code,
|
||||||
|
uint64_t *p_len)
|
||||||
{
|
{
|
||||||
assert(dist > IGZIP_DIST_TABLE_SIZE);
|
assert(dist > IGZIP_DIST_TABLE_SIZE);
|
||||||
|
|
||||||
dist -= 1;
|
dist -= 1;
|
||||||
uint32_t msb;
|
uint32_t msb;
|
||||||
uint32_t num_extra_bits;
|
uint32_t num_extra_bits;
|
||||||
uint32_t extra_bits;
|
uint32_t extra_bits;
|
||||||
uint32_t sym;
|
uint32_t sym;
|
||||||
uint32_t len;
|
uint32_t len;
|
||||||
uint32_t code;
|
uint32_t code;
|
||||||
|
|
||||||
msb = bsr(dist);
|
msb = bsr(dist);
|
||||||
assert(msb >= 2);
|
assert(msb >= 2);
|
||||||
num_extra_bits = msb - 2;
|
num_extra_bits = msb - 2;
|
||||||
extra_bits = dist & ((1 << num_extra_bits) - 1);
|
extra_bits = dist & ((1 << num_extra_bits) - 1);
|
||||||
dist >>= num_extra_bits;
|
dist >>= num_extra_bits;
|
||||||
sym = dist + 2 * num_extra_bits;
|
sym = dist + 2 * num_extra_bits;
|
||||||
assert(sym < 30);
|
assert(sym < 30);
|
||||||
code = hufftables->dcodes[sym - IGZIP_DECODE_OFFSET];
|
code = hufftables->dcodes[sym - IGZIP_DECODE_OFFSET];
|
||||||
len = hufftables->dcodes_sizes[sym - IGZIP_DECODE_OFFSET];
|
len = hufftables->dcodes_sizes[sym - IGZIP_DECODE_OFFSET];
|
||||||
*p_code = code | (extra_bits << len);
|
*p_code = code | (extra_bits << len);
|
||||||
*p_len = len + num_extra_bits;
|
*p_len = len + num_extra_bits;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void get_dist_code(struct isal_hufftables *hufftables, uint32_t dist,
|
static inline void
|
||||||
uint64_t * code, uint64_t * len)
|
get_dist_code(struct isal_hufftables *hufftables, uint32_t dist, uint64_t *code, uint64_t *len)
|
||||||
{
|
{
|
||||||
assert(dist >= 1);
|
assert(dist >= 1);
|
||||||
assert(dist <= 32768);
|
assert(dist <= 32768);
|
||||||
if (dist <= IGZIP_DIST_TABLE_SIZE) {
|
if (dist <= IGZIP_DIST_TABLE_SIZE) {
|
||||||
uint64_t code_len;
|
uint64_t code_len;
|
||||||
code_len = hufftables->dist_table[dist - 1];
|
code_len = hufftables->dist_table[dist - 1];
|
||||||
*code = code_len >> 5;
|
*code = code_len >> 5;
|
||||||
*len = code_len & 0x1F;
|
*len = code_len & 0x1F;
|
||||||
} else {
|
} else {
|
||||||
compute_dist_code(hufftables, dist, code, len);
|
compute_dist_code(hufftables, dist, code, len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void get_len_code(struct isal_hufftables *hufftables, uint32_t length,
|
static inline void
|
||||||
uint64_t * code, uint64_t * len)
|
get_len_code(struct isal_hufftables *hufftables, uint32_t length, uint64_t *code, uint64_t *len)
|
||||||
{
|
{
|
||||||
assert(length >= 3);
|
assert(length >= 3);
|
||||||
assert(length <= 258);
|
assert(length <= 258);
|
||||||
|
|
||||||
uint64_t code_len;
|
uint64_t code_len;
|
||||||
code_len = hufftables->len_table[length - 3];
|
code_len = hufftables->len_table[length - 3];
|
||||||
*code = code_len >> 5;
|
*code = code_len >> 5;
|
||||||
*len = code_len & 0x1F;
|
*len = code_len & 0x1F;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void get_lit_code(struct isal_hufftables *hufftables, uint32_t lit,
|
static inline void
|
||||||
uint64_t * code, uint64_t * len)
|
get_lit_code(struct isal_hufftables *hufftables, uint32_t lit, uint64_t *code, uint64_t *len)
|
||||||
{
|
{
|
||||||
assert(lit <= 256);
|
assert(lit <= 256);
|
||||||
|
|
||||||
*code = hufftables->lit_table[lit];
|
*code = hufftables->lit_table[lit];
|
||||||
*len = hufftables->lit_table_sizes[lit];
|
*len = hufftables->lit_table_sizes[lit];
|
||||||
}
|
}
|
||||||
|
|
||||||
static void compute_dist_icf_code(uint32_t dist, uint32_t * code, uint32_t * extra_bits)
|
static void
|
||||||
|
compute_dist_icf_code(uint32_t dist, uint32_t *code, uint32_t *extra_bits)
|
||||||
{
|
{
|
||||||
uint32_t msb;
|
uint32_t msb;
|
||||||
uint32_t num_extra_bits;
|
uint32_t num_extra_bits;
|
||||||
|
|
||||||
dist -= 1;
|
dist -= 1;
|
||||||
msb = bsr(dist);
|
msb = bsr(dist);
|
||||||
assert(msb >= 2);
|
assert(msb >= 2);
|
||||||
num_extra_bits = msb - 2;
|
num_extra_bits = msb - 2;
|
||||||
*extra_bits = dist & ((1 << num_extra_bits) - 1);
|
*extra_bits = dist & ((1 << num_extra_bits) - 1);
|
||||||
dist >>= num_extra_bits;
|
dist >>= num_extra_bits;
|
||||||
*code = dist + 2 * num_extra_bits;
|
*code = dist + 2 * num_extra_bits;
|
||||||
assert(*code < 30);
|
assert(*code < 30);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void get_dist_icf_code(uint32_t dist, uint32_t * code, uint32_t * extra_bits)
|
static inline void
|
||||||
|
get_dist_icf_code(uint32_t dist, uint32_t *code, uint32_t *extra_bits)
|
||||||
{
|
{
|
||||||
assert(dist >= 1);
|
assert(dist >= 1);
|
||||||
assert(dist <= 32768);
|
assert(dist <= 32768);
|
||||||
if (dist <= 2) {
|
if (dist <= 2) {
|
||||||
*code = dist - 1;
|
*code = dist - 1;
|
||||||
*extra_bits = 0;
|
*extra_bits = 0;
|
||||||
} else {
|
} else {
|
||||||
compute_dist_icf_code(dist, code, extra_bits);
|
compute_dist_icf_code(dist, code, extra_bits);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void get_len_icf_code(uint32_t length, uint32_t * code)
|
static inline void
|
||||||
|
get_len_icf_code(uint32_t length, uint32_t *code)
|
||||||
{
|
{
|
||||||
assert(length >= 3);
|
assert(length >= 3);
|
||||||
assert(length <= 258);
|
assert(length <= 258);
|
||||||
|
|
||||||
*code = length + 254;
|
*code = length + 254;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void get_lit_icf_code(uint32_t lit, uint32_t * code)
|
static inline void
|
||||||
|
get_lit_icf_code(uint32_t lit, uint32_t *code)
|
||||||
{
|
{
|
||||||
assert(lit <= 256);
|
assert(lit <= 256);
|
||||||
|
|
||||||
*code = lit;
|
*code = lit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Returns a hash of the first 3 bytes of input data.
|
* @brief Returns a hash of the first 3 bytes of input data.
|
||||||
*/
|
*/
|
||||||
static inline uint32_t compute_hash(uint32_t data)
|
static inline uint32_t
|
||||||
|
compute_hash(uint32_t data)
|
||||||
{
|
{
|
||||||
#ifdef __SSE4_2__
|
#ifdef __SSE4_2__
|
||||||
|
|
||||||
return _mm_crc32_u32(0, data);
|
return _mm_crc32_u32(0, data);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
uint64_t hash;
|
uint64_t hash;
|
||||||
/* Use multiplication to create a hash, 0xBDD06057 is a prime number */
|
/* Use multiplication to create a hash, 0xBDD06057 is a prime number */
|
||||||
hash = data;
|
hash = data;
|
||||||
hash *= 0xB2D06057;
|
hash *= 0xB2D06057;
|
||||||
hash >>= 16;
|
hash >>= 16;
|
||||||
hash *= 0xB2D06057;
|
hash *= 0xB2D06057;
|
||||||
hash >>= 16;
|
hash >>= 16;
|
||||||
|
|
||||||
return hash;
|
return hash;
|
||||||
|
|
||||||
#endif /* __SSE4_2__ */
|
#endif /* __SSE4_2__ */
|
||||||
}
|
}
|
||||||
|
|
||||||
#define PROD1 0xFFFFE84B
|
#define PROD1 0xFFFFE84B
|
||||||
#define PROD2 0xFFFF97B1
|
#define PROD2 0xFFFF97B1
|
||||||
static inline uint32_t compute_hash_mad(uint32_t data)
|
static inline uint32_t
|
||||||
|
compute_hash_mad(uint32_t data)
|
||||||
{
|
{
|
||||||
int16_t data_low;
|
int16_t data_low;
|
||||||
int16_t data_high;
|
int16_t data_high;
|
||||||
|
|
||||||
data_low = data;
|
data_low = data;
|
||||||
data_high = data >> 16;
|
data_high = data >> 16;
|
||||||
data = PROD1 * data_low + PROD2 * data_high;
|
data = PROD1 * data_low + PROD2 * data_high;
|
||||||
|
|
||||||
data_low = data;
|
data_low = data;
|
||||||
data_high = data >> 16;
|
data_high = data >> 16;
|
||||||
data = PROD1 * data_low + PROD2 * data_high;
|
data = PROD1 * data_low + PROD2 * data_high;
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t compute_long_hash(uint64_t data)
|
static inline uint32_t
|
||||||
|
compute_long_hash(uint64_t data)
|
||||||
{
|
{
|
||||||
|
|
||||||
return compute_hash(data >> 32) ^ compute_hash(data);
|
return compute_hash(data >> 32) ^ compute_hash(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -247,59 +257,60 @@ static inline uint32_t compute_long_hash(uint64_t data)
|
|||||||
* @param str2: Second input string.
|
* @param str2: Second input string.
|
||||||
* @param max_length: length of the smaller string.
|
* @param max_length: length of the smaller string.
|
||||||
*/
|
*/
|
||||||
static inline int compare258(uint8_t * str1, uint8_t * str2, uint32_t max_length)
|
static inline int
|
||||||
|
compare258(uint8_t *str1, uint8_t *str2, uint32_t max_length)
|
||||||
{
|
{
|
||||||
uint32_t count;
|
uint32_t count;
|
||||||
uint64_t test;
|
uint64_t test;
|
||||||
uint64_t loop_length;
|
uint64_t loop_length;
|
||||||
|
|
||||||
if (max_length > 258)
|
if (max_length > 258)
|
||||||
max_length = 258;
|
max_length = 258;
|
||||||
|
|
||||||
loop_length = max_length & ~0x7;
|
loop_length = max_length & ~0x7;
|
||||||
|
|
||||||
for (count = 0; count < loop_length; count += 8) {
|
for (count = 0; count < loop_length; count += 8) {
|
||||||
test = load_le_u64(str1);
|
test = load_le_u64(str1);
|
||||||
test ^= load_le_u64(str2);
|
test ^= load_le_u64(str2);
|
||||||
if (test != 0)
|
if (test != 0)
|
||||||
return count + tzbytecnt(test);
|
return count + tzbytecnt(test);
|
||||||
str1 += 8;
|
str1 += 8;
|
||||||
str2 += 8;
|
str2 += 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (max_length % 8) {
|
switch (max_length % 8) {
|
||||||
|
|
||||||
case 7:
|
case 7:
|
||||||
if (*str1++ != *str2++)
|
if (*str1++ != *str2++)
|
||||||
return count;
|
return count;
|
||||||
count++;
|
count++;
|
||||||
case 6:
|
case 6:
|
||||||
if (*str1++ != *str2++)
|
if (*str1++ != *str2++)
|
||||||
return count;
|
return count;
|
||||||
count++;
|
count++;
|
||||||
case 5:
|
case 5:
|
||||||
if (*str1++ != *str2++)
|
if (*str1++ != *str2++)
|
||||||
return count;
|
return count;
|
||||||
count++;
|
count++;
|
||||||
case 4:
|
case 4:
|
||||||
if (*str1++ != *str2++)
|
if (*str1++ != *str2++)
|
||||||
return count;
|
return count;
|
||||||
count++;
|
count++;
|
||||||
case 3:
|
case 3:
|
||||||
if (*str1++ != *str2++)
|
if (*str1++ != *str2++)
|
||||||
return count;
|
return count;
|
||||||
count++;
|
count++;
|
||||||
case 2:
|
case 2:
|
||||||
if (*str1++ != *str2++)
|
if (*str1++ != *str2++)
|
||||||
return count;
|
return count;
|
||||||
count++;
|
count++;
|
||||||
case 1:
|
case 1:
|
||||||
if (*str1 != *str2)
|
if (*str1 != *str2)
|
||||||
return count;
|
return count;
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -308,54 +319,55 @@ static inline int compare258(uint8_t * str1, uint8_t * str2, uint32_t max_length
|
|||||||
* @param str2: Second input string.
|
* @param str2: Second input string.
|
||||||
* @param max_length: length of the smaller string.
|
* @param max_length: length of the smaller string.
|
||||||
*/
|
*/
|
||||||
static inline int compare(uint8_t * str1, uint8_t * str2, uint32_t max_length)
|
static inline int
|
||||||
|
compare(uint8_t *str1, uint8_t *str2, uint32_t max_length)
|
||||||
{
|
{
|
||||||
uint32_t count;
|
uint32_t count;
|
||||||
uint64_t test;
|
uint64_t test;
|
||||||
uint64_t loop_length;
|
uint64_t loop_length;
|
||||||
|
|
||||||
loop_length = max_length & ~0x7;
|
loop_length = max_length & ~0x7;
|
||||||
|
|
||||||
for (count = 0; count < loop_length; count += 8) {
|
for (count = 0; count < loop_length; count += 8) {
|
||||||
test = load_le_u64(str1);
|
test = load_le_u64(str1);
|
||||||
test ^= load_le_u64(str2);
|
test ^= load_le_u64(str2);
|
||||||
if (test != 0)
|
if (test != 0)
|
||||||
return count + tzbytecnt(test);
|
return count + tzbytecnt(test);
|
||||||
str1 += 8;
|
str1 += 8;
|
||||||
str2 += 8;
|
str2 += 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (max_length % 8) {
|
switch (max_length % 8) {
|
||||||
|
|
||||||
case 7:
|
case 7:
|
||||||
if (*str1++ != *str2++)
|
if (*str1++ != *str2++)
|
||||||
return count;
|
return count;
|
||||||
count++;
|
count++;
|
||||||
case 6:
|
case 6:
|
||||||
if (*str1++ != *str2++)
|
if (*str1++ != *str2++)
|
||||||
return count;
|
return count;
|
||||||
count++;
|
count++;
|
||||||
case 5:
|
case 5:
|
||||||
if (*str1++ != *str2++)
|
if (*str1++ != *str2++)
|
||||||
return count;
|
return count;
|
||||||
count++;
|
count++;
|
||||||
case 4:
|
case 4:
|
||||||
if (*str1++ != *str2++)
|
if (*str1++ != *str2++)
|
||||||
return count;
|
return count;
|
||||||
count++;
|
count++;
|
||||||
case 3:
|
case 3:
|
||||||
if (*str1++ != *str2++)
|
if (*str1++ != *str2++)
|
||||||
return count;
|
return count;
|
||||||
count++;
|
count++;
|
||||||
case 2:
|
case 2:
|
||||||
if (*str1++ != *str2++)
|
if (*str1++ != *str2++)
|
||||||
return count;
|
return count;
|
||||||
count++;
|
count++;
|
||||||
case 1:
|
case 1:
|
||||||
if (*str1 != *str2)
|
if (*str1 != *str2)
|
||||||
return count;
|
return count;
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
11946
igzip/hufftables_c.c
11946
igzip/hufftables_c.c
File diff suppressed because it is too large
Load Diff
3047
igzip/igzip.c
3047
igzip/igzip.c
File diff suppressed because it is too large
Load Diff
@ -6,231 +6,229 @@
|
|||||||
|
|
||||||
extern const struct isal_hufftables hufftables_default;
|
extern const struct isal_hufftables hufftables_default;
|
||||||
|
|
||||||
static inline void update_state(struct isal_zstream *stream, uint8_t * start_in,
|
static inline void
|
||||||
uint8_t * next_in, uint8_t * end_in)
|
update_state(struct isal_zstream *stream, uint8_t *start_in, uint8_t *next_in, uint8_t *end_in)
|
||||||
{
|
{
|
||||||
struct isal_zstate *state = &stream->internal_state;
|
struct isal_zstate *state = &stream->internal_state;
|
||||||
uint32_t bytes_written;
|
uint32_t bytes_written;
|
||||||
|
|
||||||
if (next_in - start_in > 0)
|
if (next_in - start_in > 0)
|
||||||
state->has_hist = IGZIP_HIST;
|
state->has_hist = IGZIP_HIST;
|
||||||
|
|
||||||
stream->next_in = next_in;
|
stream->next_in = next_in;
|
||||||
stream->total_in += next_in - start_in;
|
stream->total_in += next_in - start_in;
|
||||||
stream->avail_in = end_in - next_in;
|
stream->avail_in = end_in - next_in;
|
||||||
|
|
||||||
bytes_written = buffer_used(&state->bitbuf);
|
|
||||||
stream->total_out += bytes_written;
|
|
||||||
stream->next_out += bytes_written;
|
|
||||||
stream->avail_out -= bytes_written;
|
|
||||||
|
|
||||||
|
bytes_written = buffer_used(&state->bitbuf);
|
||||||
|
stream->total_out += bytes_written;
|
||||||
|
stream->next_out += bytes_written;
|
||||||
|
stream->avail_out -= bytes_written;
|
||||||
}
|
}
|
||||||
|
|
||||||
void isal_deflate_body_base(struct isal_zstream *stream)
|
void
|
||||||
|
isal_deflate_body_base(struct isal_zstream *stream)
|
||||||
{
|
{
|
||||||
uint32_t literal, hash;
|
uint32_t literal, hash;
|
||||||
uint8_t *start_in, *next_in, *end_in, *end, *next_hash;
|
uint8_t *start_in, *next_in, *end_in, *end, *next_hash;
|
||||||
uint16_t match_length;
|
uint16_t match_length;
|
||||||
uint32_t dist;
|
uint32_t dist;
|
||||||
uint64_t code, code_len, code2, code_len2;
|
uint64_t code, code_len, code2, code_len2;
|
||||||
struct isal_zstate *state = &stream->internal_state;
|
struct isal_zstate *state = &stream->internal_state;
|
||||||
uint16_t *last_seen = state->head;
|
uint16_t *last_seen = state->head;
|
||||||
uint8_t *file_start = (uint8_t *) ((uintptr_t) stream->next_in - stream->total_in);
|
uint8_t *file_start = (uint8_t *) ((uintptr_t) stream->next_in - stream->total_in);
|
||||||
uint32_t hist_size = state->dist_mask;
|
uint32_t hist_size = state->dist_mask;
|
||||||
uint32_t hash_mask = state->hash_mask;
|
uint32_t hash_mask = state->hash_mask;
|
||||||
|
|
||||||
if (stream->avail_in == 0) {
|
if (stream->avail_in == 0) {
|
||||||
if (stream->end_of_stream || stream->flush != NO_FLUSH)
|
if (stream->end_of_stream || stream->flush != NO_FLUSH)
|
||||||
state->state = ZSTATE_FLUSH_READ_BUFFER;
|
state->state = ZSTATE_FLUSH_READ_BUFFER;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
set_buf(&state->bitbuf, stream->next_out, stream->avail_out);
|
set_buf(&state->bitbuf, stream->next_out, stream->avail_out);
|
||||||
|
|
||||||
start_in = stream->next_in;
|
start_in = stream->next_in;
|
||||||
end_in = start_in + stream->avail_in;
|
end_in = start_in + stream->avail_in;
|
||||||
next_in = start_in;
|
next_in = start_in;
|
||||||
|
|
||||||
while (next_in + ISAL_LOOK_AHEAD < end_in) {
|
while (next_in + ISAL_LOOK_AHEAD < end_in) {
|
||||||
|
|
||||||
if (is_full(&state->bitbuf)) {
|
if (is_full(&state->bitbuf)) {
|
||||||
update_state(stream, start_in, next_in, end_in);
|
update_state(stream, start_in, next_in, end_in);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
literal = load_le_u32(next_in);
|
literal = load_le_u32(next_in);
|
||||||
hash = compute_hash(literal) & hash_mask;
|
hash = compute_hash(literal) & hash_mask;
|
||||||
dist = (next_in - file_start - last_seen[hash]) & 0xFFFF;
|
dist = (next_in - file_start - last_seen[hash]) & 0xFFFF;
|
||||||
last_seen[hash] = (uint64_t) (next_in - file_start);
|
last_seen[hash] = (uint64_t) (next_in - file_start);
|
||||||
|
|
||||||
/* The -1 are to handle the case when dist = 0 */
|
/* The -1 are to handle the case when dist = 0 */
|
||||||
if (dist - 1 < hist_size) {
|
if (dist - 1 < hist_size) {
|
||||||
assert(dist != 0);
|
assert(dist != 0);
|
||||||
|
|
||||||
match_length = compare258(next_in - dist, next_in, 258);
|
match_length = compare258(next_in - dist, next_in, 258);
|
||||||
|
|
||||||
if (match_length >= SHORTEST_MATCH) {
|
if (match_length >= SHORTEST_MATCH) {
|
||||||
next_hash = next_in;
|
next_hash = next_in;
|
||||||
#ifdef ISAL_LIMIT_HASH_UPDATE
|
#ifdef ISAL_LIMIT_HASH_UPDATE
|
||||||
end = next_hash + 3;
|
end = next_hash + 3;
|
||||||
#else
|
#else
|
||||||
end = next_hash + match_length;
|
end = next_hash + match_length;
|
||||||
#endif
|
#endif
|
||||||
next_hash++;
|
next_hash++;
|
||||||
|
|
||||||
for (; next_hash < end; next_hash++) {
|
for (; next_hash < end; next_hash++) {
|
||||||
literal = load_le_u32(next_hash);
|
literal = load_le_u32(next_hash);
|
||||||
hash = compute_hash(literal) & hash_mask;
|
hash = compute_hash(literal) & hash_mask;
|
||||||
last_seen[hash] = (uint64_t) (next_hash - file_start);
|
last_seen[hash] = (uint64_t) (next_hash - file_start);
|
||||||
}
|
}
|
||||||
|
|
||||||
get_len_code(stream->hufftables, match_length, &code,
|
get_len_code(stream->hufftables, match_length, &code, &code_len);
|
||||||
&code_len);
|
get_dist_code(stream->hufftables, dist, &code2, &code_len2);
|
||||||
get_dist_code(stream->hufftables, dist, &code2, &code_len2);
|
|
||||||
|
|
||||||
code |= code2 << code_len;
|
code |= code2 << code_len;
|
||||||
code_len += code_len2;
|
code_len += code_len2;
|
||||||
|
|
||||||
write_bits(&state->bitbuf, code, code_len);
|
write_bits(&state->bitbuf, code, code_len);
|
||||||
|
|
||||||
next_in += match_length;
|
next_in += match_length;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
get_lit_code(stream->hufftables, literal & 0xFF, &code, &code_len);
|
get_lit_code(stream->hufftables, literal & 0xFF, &code, &code_len);
|
||||||
write_bits(&state->bitbuf, code, code_len);
|
write_bits(&state->bitbuf, code, code_len);
|
||||||
next_in++;
|
next_in++;
|
||||||
}
|
}
|
||||||
|
|
||||||
update_state(stream, start_in, next_in, end_in);
|
update_state(stream, start_in, next_in, end_in);
|
||||||
|
|
||||||
assert(stream->avail_in <= ISAL_LOOK_AHEAD);
|
assert(stream->avail_in <= ISAL_LOOK_AHEAD);
|
||||||
if (stream->end_of_stream || stream->flush != NO_FLUSH)
|
if (stream->end_of_stream || stream->flush != NO_FLUSH)
|
||||||
state->state = ZSTATE_FLUSH_READ_BUFFER;
|
state->state = ZSTATE_FLUSH_READ_BUFFER;
|
||||||
|
|
||||||
return;
|
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void isal_deflate_finish_base(struct isal_zstream *stream)
|
void
|
||||||
|
isal_deflate_finish_base(struct isal_zstream *stream)
|
||||||
{
|
{
|
||||||
uint32_t literal = 0, hash;
|
uint32_t literal = 0, hash;
|
||||||
uint8_t *start_in, *next_in, *end_in, *end, *next_hash;
|
uint8_t *start_in, *next_in, *end_in, *end, *next_hash;
|
||||||
uint16_t match_length;
|
uint16_t match_length;
|
||||||
uint32_t dist;
|
uint32_t dist;
|
||||||
uint64_t code, code_len, code2, code_len2;
|
uint64_t code, code_len, code2, code_len2;
|
||||||
struct isal_zstate *state = &stream->internal_state;
|
struct isal_zstate *state = &stream->internal_state;
|
||||||
uint16_t *last_seen = state->head;
|
uint16_t *last_seen = state->head;
|
||||||
uint8_t *file_start = (uint8_t *) ((uintptr_t) stream->next_in - stream->total_in);
|
uint8_t *file_start = (uint8_t *) ((uintptr_t) stream->next_in - stream->total_in);
|
||||||
uint32_t hist_size = state->dist_mask;
|
uint32_t hist_size = state->dist_mask;
|
||||||
uint32_t hash_mask = state->hash_mask;
|
uint32_t hash_mask = state->hash_mask;
|
||||||
|
|
||||||
set_buf(&state->bitbuf, stream->next_out, stream->avail_out);
|
set_buf(&state->bitbuf, stream->next_out, stream->avail_out);
|
||||||
|
|
||||||
start_in = stream->next_in;
|
start_in = stream->next_in;
|
||||||
end_in = start_in + stream->avail_in;
|
end_in = start_in + stream->avail_in;
|
||||||
next_in = start_in;
|
next_in = start_in;
|
||||||
|
|
||||||
if (stream->avail_in != 0) {
|
if (stream->avail_in != 0) {
|
||||||
while (next_in + 3 < end_in) {
|
while (next_in + 3 < end_in) {
|
||||||
if (is_full(&state->bitbuf)) {
|
if (is_full(&state->bitbuf)) {
|
||||||
update_state(stream, start_in, next_in, end_in);
|
update_state(stream, start_in, next_in, end_in);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
literal = load_le_u32(next_in);
|
literal = load_le_u32(next_in);
|
||||||
hash = compute_hash(literal) & hash_mask;
|
hash = compute_hash(literal) & hash_mask;
|
||||||
dist = (next_in - file_start - last_seen[hash]) & 0xFFFF;
|
dist = (next_in - file_start - last_seen[hash]) & 0xFFFF;
|
||||||
last_seen[hash] = (uint64_t) (next_in - file_start);
|
last_seen[hash] = (uint64_t) (next_in - file_start);
|
||||||
|
|
||||||
if (dist - 1 < hist_size) { /* The -1 are to handle the case when dist = 0 */
|
if (dist - 1 <
|
||||||
match_length =
|
hist_size) { /* The -1 are to handle the case when dist = 0 */
|
||||||
compare258(next_in - dist, next_in, end_in - next_in);
|
match_length =
|
||||||
|
compare258(next_in - dist, next_in, end_in - next_in);
|
||||||
|
|
||||||
if (match_length >= SHORTEST_MATCH) {
|
if (match_length >= SHORTEST_MATCH) {
|
||||||
next_hash = next_in;
|
next_hash = next_in;
|
||||||
#ifdef ISAL_LIMIT_HASH_UPDATE
|
#ifdef ISAL_LIMIT_HASH_UPDATE
|
||||||
end = next_hash + 3;
|
end = next_hash + 3;
|
||||||
#else
|
#else
|
||||||
end = next_hash + match_length;
|
end = next_hash + match_length;
|
||||||
#endif
|
#endif
|
||||||
next_hash++;
|
next_hash++;
|
||||||
|
|
||||||
for (; next_hash < end - 3; next_hash++) {
|
for (; next_hash < end - 3; next_hash++) {
|
||||||
literal = load_le_u32(next_hash);
|
literal = load_le_u32(next_hash);
|
||||||
hash = compute_hash(literal) & hash_mask;
|
hash = compute_hash(literal) & hash_mask;
|
||||||
last_seen[hash] =
|
last_seen[hash] =
|
||||||
(uint64_t) (next_hash - file_start);
|
(uint64_t) (next_hash - file_start);
|
||||||
}
|
}
|
||||||
|
|
||||||
get_len_code(stream->hufftables, match_length, &code,
|
get_len_code(stream->hufftables, match_length, &code,
|
||||||
&code_len);
|
&code_len);
|
||||||
get_dist_code(stream->hufftables, dist, &code2,
|
get_dist_code(stream->hufftables, dist, &code2, &code_len2);
|
||||||
&code_len2);
|
|
||||||
|
|
||||||
code |= code2 << code_len;
|
code |= code2 << code_len;
|
||||||
code_len += code_len2;
|
code_len += code_len2;
|
||||||
|
|
||||||
write_bits(&state->bitbuf, code, code_len);
|
write_bits(&state->bitbuf, code, code_len);
|
||||||
|
|
||||||
next_in += match_length;
|
next_in += match_length;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
get_lit_code(stream->hufftables, literal & 0xFF, &code, &code_len);
|
get_lit_code(stream->hufftables, literal & 0xFF, &code, &code_len);
|
||||||
write_bits(&state->bitbuf, code, code_len);
|
write_bits(&state->bitbuf, code, code_len);
|
||||||
next_in++;
|
next_in++;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
while (next_in < end_in) {
|
||||||
|
if (is_full(&state->bitbuf)) {
|
||||||
|
update_state(stream, start_in, next_in, end_in);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
while (next_in < end_in) {
|
literal = *next_in;
|
||||||
if (is_full(&state->bitbuf)) {
|
get_lit_code(stream->hufftables, literal & 0xFF, &code, &code_len);
|
||||||
update_state(stream, start_in, next_in, end_in);
|
write_bits(&state->bitbuf, code, code_len);
|
||||||
return;
|
next_in++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
literal = *next_in;
|
if (!is_full(&state->bitbuf)) {
|
||||||
get_lit_code(stream->hufftables, literal & 0xFF, &code, &code_len);
|
get_lit_code(stream->hufftables, 256, &code, &code_len);
|
||||||
write_bits(&state->bitbuf, code, code_len);
|
write_bits(&state->bitbuf, code, code_len);
|
||||||
next_in++;
|
state->has_eob = 1;
|
||||||
|
|
||||||
}
|
if (stream->end_of_stream == 1)
|
||||||
}
|
state->state = ZSTATE_TRL;
|
||||||
|
else
|
||||||
|
state->state = ZSTATE_SYNC_FLUSH;
|
||||||
|
}
|
||||||
|
|
||||||
if (!is_full(&state->bitbuf)) {
|
update_state(stream, start_in, next_in, end_in);
|
||||||
get_lit_code(stream->hufftables, 256, &code, &code_len);
|
|
||||||
write_bits(&state->bitbuf, code, code_len);
|
|
||||||
state->has_eob = 1;
|
|
||||||
|
|
||||||
if (stream->end_of_stream == 1)
|
return;
|
||||||
state->state = ZSTATE_TRL;
|
|
||||||
else
|
|
||||||
state->state = ZSTATE_SYNC_FLUSH;
|
|
||||||
}
|
|
||||||
|
|
||||||
update_state(stream, start_in, next_in, end_in);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void isal_deflate_hash_base(uint16_t * hash_table, uint32_t hash_mask,
|
void
|
||||||
uint32_t current_index, uint8_t * dict, uint32_t dict_len)
|
isal_deflate_hash_base(uint16_t *hash_table, uint32_t hash_mask, uint32_t current_index,
|
||||||
|
uint8_t *dict, uint32_t dict_len)
|
||||||
{
|
{
|
||||||
uint8_t *next_in = dict;
|
uint8_t *next_in = dict;
|
||||||
uint8_t *end_in = dict + dict_len - SHORTEST_MATCH;
|
uint8_t *end_in = dict + dict_len - SHORTEST_MATCH;
|
||||||
uint32_t literal;
|
uint32_t literal;
|
||||||
uint32_t hash;
|
uint32_t hash;
|
||||||
uint16_t index = current_index - dict_len;
|
uint16_t index = current_index - dict_len;
|
||||||
|
|
||||||
while (next_in <= end_in) {
|
while (next_in <= end_in) {
|
||||||
literal = load_le_u32(next_in);
|
literal = load_le_u32(next_in);
|
||||||
hash = compute_hash(literal) & hash_mask;
|
hash = compute_hash(literal) & hash_mask;
|
||||||
hash_table[hash] = index;
|
hash_table[hash] = index;
|
||||||
index++;
|
index++;
|
||||||
next_in++;
|
next_in++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,122 +32,150 @@
|
|||||||
#include "encode_df.h"
|
#include "encode_df.h"
|
||||||
#include "igzip_level_buf_structs.h"
|
#include "igzip_level_buf_structs.h"
|
||||||
|
|
||||||
void isal_deflate_body_base(struct isal_zstream *stream);
|
void
|
||||||
void isal_deflate_finish_base(struct isal_zstream *stream);
|
isal_deflate_body_base(struct isal_zstream *stream);
|
||||||
void isal_deflate_icf_body_hash_hist_base(struct isal_zstream *stream);
|
void
|
||||||
void icf_body_hash1_fillgreedy_lazy(struct isal_zstream *stream);
|
isal_deflate_finish_base(struct isal_zstream *stream);
|
||||||
void isal_deflate_icf_finish_hash_hist_base(struct isal_zstream *stream);
|
void
|
||||||
void isal_deflate_icf_finish_hash_map_base(struct isal_zstream *stream);
|
isal_deflate_icf_body_hash_hist_base(struct isal_zstream *stream);
|
||||||
void isal_update_histogram_base(uint8_t * start_stream, int length,
|
void
|
||||||
struct isal_huff_histogram *histogram);
|
icf_body_hash1_fillgreedy_lazy(struct isal_zstream *stream);
|
||||||
struct deflate_icf *encode_deflate_icf_base(struct deflate_icf *next_in,
|
void
|
||||||
struct deflate_icf *end_in, struct BitBuf2 *bb,
|
isal_deflate_icf_finish_hash_hist_base(struct isal_zstream *stream);
|
||||||
struct hufftables_icf *hufftables);
|
void
|
||||||
uint32_t adler32_base(uint32_t init, const unsigned char *buf, uint64_t len);
|
isal_deflate_icf_finish_hash_map_base(struct isal_zstream *stream);
|
||||||
int decode_huffman_code_block_stateless_base(struct inflate_state *s, uint8_t * start_out);
|
void
|
||||||
|
isal_update_histogram_base(uint8_t *start_stream, int length,
|
||||||
|
struct isal_huff_histogram *histogram);
|
||||||
|
struct deflate_icf *
|
||||||
|
encode_deflate_icf_base(struct deflate_icf *next_in, struct deflate_icf *end_in, struct BitBuf2 *bb,
|
||||||
|
struct hufftables_icf *hufftables);
|
||||||
|
uint32_t
|
||||||
|
adler32_base(uint32_t init, const unsigned char *buf, uint64_t len);
|
||||||
|
int
|
||||||
|
decode_huffman_code_block_stateless_base(struct inflate_state *s, uint8_t *start_out);
|
||||||
|
|
||||||
extern void isal_deflate_hash_base(uint16_t *, uint32_t, uint32_t, uint8_t *, uint32_t);
|
extern void
|
||||||
|
isal_deflate_hash_base(uint16_t *, uint32_t, uint32_t, uint8_t *, uint32_t);
|
||||||
|
|
||||||
void set_long_icf_fg_base(uint8_t * next_in, uint8_t * end_in,
|
void
|
||||||
struct deflate_icf *match_lookup, struct level_buf *level_buf);
|
set_long_icf_fg_base(uint8_t *next_in, uint8_t *end_in, struct deflate_icf *match_lookup,
|
||||||
void gen_icf_map_h1_base(struct isal_zstream *stream,
|
struct level_buf *level_buf);
|
||||||
struct deflate_icf *matches_icf_lookup, uint64_t input_size);
|
void
|
||||||
|
gen_icf_map_h1_base(struct isal_zstream *stream, struct deflate_icf *matches_icf_lookup,
|
||||||
|
uint64_t input_size);
|
||||||
|
|
||||||
void isal_deflate_body(struct isal_zstream *stream)
|
void
|
||||||
|
isal_deflate_body(struct isal_zstream *stream)
|
||||||
{
|
{
|
||||||
isal_deflate_body_base(stream);
|
isal_deflate_body_base(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
void isal_deflate_finish(struct isal_zstream *stream)
|
void
|
||||||
|
isal_deflate_finish(struct isal_zstream *stream)
|
||||||
{
|
{
|
||||||
isal_deflate_finish_base(stream);
|
isal_deflate_finish_base(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
void isal_deflate_icf_body_lvl1(struct isal_zstream *stream)
|
void
|
||||||
|
isal_deflate_icf_body_lvl1(struct isal_zstream *stream)
|
||||||
{
|
{
|
||||||
isal_deflate_icf_body_hash_hist_base(stream);
|
isal_deflate_icf_body_hash_hist_base(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
void isal_deflate_icf_body_lvl2(struct isal_zstream *stream)
|
void
|
||||||
|
isal_deflate_icf_body_lvl2(struct isal_zstream *stream)
|
||||||
{
|
{
|
||||||
isal_deflate_icf_body_hash_hist_base(stream);
|
isal_deflate_icf_body_hash_hist_base(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
void isal_deflate_icf_body_lvl3(struct isal_zstream *stream)
|
void
|
||||||
|
isal_deflate_icf_body_lvl3(struct isal_zstream *stream)
|
||||||
{
|
{
|
||||||
icf_body_hash1_fillgreedy_lazy(stream);
|
icf_body_hash1_fillgreedy_lazy(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
void isal_deflate_icf_finish_lvl1(struct isal_zstream *stream)
|
void
|
||||||
|
isal_deflate_icf_finish_lvl1(struct isal_zstream *stream)
|
||||||
{
|
{
|
||||||
isal_deflate_icf_finish_hash_hist_base(stream);
|
isal_deflate_icf_finish_hash_hist_base(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
void isal_deflate_icf_finish_lvl2(struct isal_zstream *stream)
|
void
|
||||||
|
isal_deflate_icf_finish_lvl2(struct isal_zstream *stream)
|
||||||
{
|
{
|
||||||
isal_deflate_icf_finish_hash_hist_base(stream);
|
isal_deflate_icf_finish_hash_hist_base(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
void isal_deflate_icf_finish_lvl3(struct isal_zstream *stream)
|
void
|
||||||
|
isal_deflate_icf_finish_lvl3(struct isal_zstream *stream)
|
||||||
{
|
{
|
||||||
isal_deflate_icf_finish_hash_map_base(stream);
|
isal_deflate_icf_finish_hash_map_base(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
void isal_update_histogram(uint8_t * start_stream, int length,
|
void
|
||||||
struct isal_huff_histogram *histogram)
|
isal_update_histogram(uint8_t *start_stream, int length, struct isal_huff_histogram *histogram)
|
||||||
{
|
{
|
||||||
isal_update_histogram_base(start_stream, length, histogram);
|
isal_update_histogram_base(start_stream, length, histogram);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct deflate_icf *encode_deflate_icf(struct deflate_icf *next_in,
|
struct deflate_icf *
|
||||||
struct deflate_icf *end_in, struct BitBuf2 *bb,
|
encode_deflate_icf(struct deflate_icf *next_in, struct deflate_icf *end_in, struct BitBuf2 *bb,
|
||||||
struct hufftables_icf *hufftables)
|
struct hufftables_icf *hufftables)
|
||||||
{
|
{
|
||||||
return encode_deflate_icf_base(next_in, end_in, bb, hufftables);
|
return encode_deflate_icf_base(next_in, end_in, bb, hufftables);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t isal_adler32(uint32_t init, const unsigned char *buf, uint64_t len)
|
uint32_t
|
||||||
|
isal_adler32(uint32_t init, const unsigned char *buf, uint64_t len)
|
||||||
{
|
{
|
||||||
return adler32_base(init, buf, len);
|
return adler32_base(init, buf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
int decode_huffman_code_block_stateless(struct inflate_state *s, uint8_t * start_out)
|
int
|
||||||
|
decode_huffman_code_block_stateless(struct inflate_state *s, uint8_t *start_out)
|
||||||
{
|
{
|
||||||
return decode_huffman_code_block_stateless_base(s, start_out);
|
return decode_huffman_code_block_stateless_base(s, start_out);
|
||||||
}
|
}
|
||||||
|
|
||||||
void isal_deflate_hash_lvl0(uint16_t * hash_table, uint32_t hash_mask,
|
void
|
||||||
uint32_t current_index, uint8_t * dict, uint32_t dict_len)
|
isal_deflate_hash_lvl0(uint16_t *hash_table, uint32_t hash_mask, uint32_t current_index,
|
||||||
|
uint8_t *dict, uint32_t dict_len)
|
||||||
{
|
{
|
||||||
isal_deflate_hash_base(hash_table, hash_mask, current_index, dict, dict_len);
|
isal_deflate_hash_base(hash_table, hash_mask, current_index, dict, dict_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void isal_deflate_hash_lvl1(uint16_t * hash_table, uint32_t hash_mask,
|
void
|
||||||
uint32_t current_index, uint8_t * dict, uint32_t dict_len)
|
isal_deflate_hash_lvl1(uint16_t *hash_table, uint32_t hash_mask, uint32_t current_index,
|
||||||
|
uint8_t *dict, uint32_t dict_len)
|
||||||
{
|
{
|
||||||
isal_deflate_hash_base(hash_table, hash_mask, current_index, dict, dict_len);
|
isal_deflate_hash_base(hash_table, hash_mask, current_index, dict, dict_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void isal_deflate_hash_lvl2(uint16_t * hash_table, uint32_t hash_mask,
|
void
|
||||||
uint32_t current_index, uint8_t * dict, uint32_t dict_len)
|
isal_deflate_hash_lvl2(uint16_t *hash_table, uint32_t hash_mask, uint32_t current_index,
|
||||||
|
uint8_t *dict, uint32_t dict_len)
|
||||||
{
|
{
|
||||||
isal_deflate_hash_base(hash_table, hash_mask, current_index, dict, dict_len);
|
isal_deflate_hash_base(hash_table, hash_mask, current_index, dict, dict_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void isal_deflate_hash_lvl3(uint16_t * hash_table, uint32_t hash_mask,
|
void
|
||||||
uint32_t current_index, uint8_t * dict, uint32_t dict_len)
|
isal_deflate_hash_lvl3(uint16_t *hash_table, uint32_t hash_mask, uint32_t current_index,
|
||||||
|
uint8_t *dict, uint32_t dict_len)
|
||||||
{
|
{
|
||||||
isal_deflate_hash_base(hash_table, hash_mask, current_index, dict, dict_len);
|
isal_deflate_hash_base(hash_table, hash_mask, current_index, dict, dict_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_long_icf_fg(uint8_t * next_in, uint8_t * end_in,
|
void
|
||||||
struct deflate_icf *match_lookup, struct level_buf *level_buf)
|
set_long_icf_fg(uint8_t *next_in, uint8_t *end_in, struct deflate_icf *match_lookup,
|
||||||
|
struct level_buf *level_buf)
|
||||||
{
|
{
|
||||||
set_long_icf_fg_base(next_in, end_in, match_lookup, level_buf);
|
set_long_icf_fg_base(next_in, end_in, match_lookup, level_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void gen_icf_map_lh1(struct isal_zstream *stream,
|
void
|
||||||
struct deflate_icf *matches_icf_lookup, uint64_t input_size)
|
gen_icf_map_lh1(struct isal_zstream *stream, struct deflate_icf *matches_icf_lookup,
|
||||||
|
uint64_t input_size)
|
||||||
{
|
{
|
||||||
gen_icf_map_h1_base(stream, matches_icf_lookup, input_size);
|
gen_icf_map_h1_base(stream, matches_icf_lookup, input_size);
|
||||||
}
|
}
|
||||||
|
@ -7,34 +7,37 @@
|
|||||||
#include "test.h"
|
#include "test.h"
|
||||||
#include "huff_codes.h"
|
#include "huff_codes.h"
|
||||||
|
|
||||||
#define DICT_LEN 32*1024
|
#define DICT_LEN 32 * 1024
|
||||||
|
|
||||||
extern void isal_deflate_hash(struct isal_zstream *stream, uint8_t * dict, int dict_len);
|
extern void
|
||||||
|
isal_deflate_hash(struct isal_zstream *stream, uint8_t *dict, int dict_len);
|
||||||
|
|
||||||
void create_rand_data(uint8_t * data, uint32_t size)
|
void
|
||||||
|
create_rand_data(uint8_t *data, uint32_t size)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < size; i++) {
|
for (i = 0; i < size; i++) {
|
||||||
data[i] = rand() % 256;
|
data[i] = rand() % 256;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int time = BENCHMARK_TIME;
|
int time = BENCHMARK_TIME;
|
||||||
struct isal_zstream stream;
|
struct isal_zstream stream;
|
||||||
uint8_t dict[DICT_LEN];
|
uint8_t dict[DICT_LEN];
|
||||||
uint32_t dict_len = DICT_LEN;
|
uint32_t dict_len = DICT_LEN;
|
||||||
|
|
||||||
stream.level = 0;
|
stream.level = 0;
|
||||||
stream.internal_state.hash_mask = LVL0_HASH_MASK;
|
stream.internal_state.hash_mask = LVL0_HASH_MASK;
|
||||||
create_rand_data(dict, dict_len);
|
create_rand_data(dict, dict_len);
|
||||||
|
|
||||||
struct perf start;
|
struct perf start;
|
||||||
BENCHMARK(&start, time, isal_deflate_hash(&stream, dict, dict_len));
|
BENCHMARK(&start, time, isal_deflate_hash(&stream, dict, dict_len));
|
||||||
|
|
||||||
printf("igzip_build_hash_table_perf: in_size=%u ", dict_len);
|
printf("igzip_build_hash_table_perf: in_size=%u ", dict_len);
|
||||||
perf_print(start, (long long)dict_len);
|
perf_print(start, (long long) dict_len);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -4,9 +4,11 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#define MAX_ADLER_BUF (1 << 28)
|
#define MAX_ADLER_BUF (1 << 28)
|
||||||
#define ADLER_MOD 65521
|
#define ADLER_MOD 65521
|
||||||
|
|
||||||
uint32_t isal_adler32(uint32_t init_crc, const unsigned char *buf, uint64_t len);
|
uint32_t
|
||||||
uint32_t isal_adler32_bam1(uint32_t init_crc, const unsigned char *buf, uint64_t len);
|
isal_adler32(uint32_t init_crc, const unsigned char *buf, uint64_t len);
|
||||||
|
uint32_t
|
||||||
|
isal_adler32_bam1(uint32_t init_crc, const unsigned char *buf, uint64_t len);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -33,69 +33,70 @@
|
|||||||
|
|
||||||
#define BUF_SIZE 8192
|
#define BUF_SIZE 8192
|
||||||
#ifndef LEVEL
|
#ifndef LEVEL
|
||||||
# define LEVEL 0
|
#define LEVEL 0
|
||||||
#else
|
#else
|
||||||
# define LEVEL 1
|
#define LEVEL 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct isal_zstream stream;
|
struct isal_zstream stream;
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
uint8_t inbuf[BUF_SIZE], outbuf[BUF_SIZE];
|
uint8_t inbuf[BUF_SIZE], outbuf[BUF_SIZE];
|
||||||
FILE *in, *out;
|
FILE *in, *out;
|
||||||
|
|
||||||
if (argc != 3) {
|
if (argc != 3) {
|
||||||
fprintf(stderr, "Usage: igzip_example infile outfile\n");
|
fprintf(stderr, "Usage: igzip_example infile outfile\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
in = fopen(argv[1], "rb");
|
in = fopen(argv[1], "rb");
|
||||||
if (!in) {
|
if (!in) {
|
||||||
fprintf(stderr, "Can't open %s for reading\n", argv[1]);
|
fprintf(stderr, "Can't open %s for reading\n", argv[1]);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
out = fopen(argv[2], "wb");
|
out = fopen(argv[2], "wb");
|
||||||
if (!out) {
|
if (!out) {
|
||||||
fprintf(stderr, "Can't open %s for writing\n", argv[2]);
|
fprintf(stderr, "Can't open %s for writing\n", argv[2]);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("igzip_example\nWindow Size: %d K\n", IGZIP_HIST_SIZE / 1024);
|
printf("igzip_example\nWindow Size: %d K\n", IGZIP_HIST_SIZE / 1024);
|
||||||
fflush(0);
|
fflush(0);
|
||||||
|
|
||||||
isal_deflate_init(&stream);
|
isal_deflate_init(&stream);
|
||||||
stream.end_of_stream = 0;
|
stream.end_of_stream = 0;
|
||||||
stream.flush = NO_FLUSH;
|
stream.flush = NO_FLUSH;
|
||||||
|
|
||||||
if (LEVEL == 1) {
|
if (LEVEL == 1) {
|
||||||
stream.level = 1;
|
stream.level = 1;
|
||||||
stream.level_buf = malloc(ISAL_DEF_LVL1_DEFAULT);
|
stream.level_buf = malloc(ISAL_DEF_LVL1_DEFAULT);
|
||||||
stream.level_buf_size = ISAL_DEF_LVL1_DEFAULT;
|
stream.level_buf_size = ISAL_DEF_LVL1_DEFAULT;
|
||||||
if (stream.level_buf == 0) {
|
if (stream.level_buf == 0) {
|
||||||
printf("Failed to allocate level compression buffer\n");
|
printf("Failed to allocate level compression buffer\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
stream.avail_in = (uint32_t) fread(inbuf, 1, BUF_SIZE, in);
|
stream.avail_in = (uint32_t) fread(inbuf, 1, BUF_SIZE, in);
|
||||||
stream.end_of_stream = feof(in) ? 1 : 0;
|
stream.end_of_stream = feof(in) ? 1 : 0;
|
||||||
stream.next_in = inbuf;
|
stream.next_in = inbuf;
|
||||||
do {
|
do {
|
||||||
stream.avail_out = BUF_SIZE;
|
stream.avail_out = BUF_SIZE;
|
||||||
stream.next_out = outbuf;
|
stream.next_out = outbuf;
|
||||||
|
|
||||||
isal_deflate(&stream);
|
isal_deflate(&stream);
|
||||||
|
|
||||||
fwrite(outbuf, 1, BUF_SIZE - stream.avail_out, out);
|
fwrite(outbuf, 1, BUF_SIZE - stream.avail_out, out);
|
||||||
} while (stream.avail_out == 0);
|
} while (stream.avail_out == 0);
|
||||||
|
|
||||||
assert(stream.avail_in == 0);
|
assert(stream.avail_in == 0);
|
||||||
} while (stream.internal_state.state != ZSTATE_END);
|
} while (stream.internal_state.state != ZSTATE_END);
|
||||||
|
|
||||||
fclose(out);
|
fclose(out);
|
||||||
fclose(in);
|
fclose(in);
|
||||||
|
|
||||||
printf("End of igzip_example\n\n");
|
printf("End of igzip_example\n\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -40,309 +40,309 @@
|
|||||||
|
|
||||||
int level_size_buf[10] = {
|
int level_size_buf[10] = {
|
||||||
#ifdef ISAL_DEF_LVL0_DEFAULT
|
#ifdef ISAL_DEF_LVL0_DEFAULT
|
||||||
ISAL_DEF_LVL0_DEFAULT,
|
ISAL_DEF_LVL0_DEFAULT,
|
||||||
#else
|
#else
|
||||||
0,
|
0,
|
||||||
#endif
|
#endif
|
||||||
#ifdef ISAL_DEF_LVL1_DEFAULT
|
#ifdef ISAL_DEF_LVL1_DEFAULT
|
||||||
ISAL_DEF_LVL1_DEFAULT,
|
ISAL_DEF_LVL1_DEFAULT,
|
||||||
#else
|
#else
|
||||||
0,
|
0,
|
||||||
#endif
|
#endif
|
||||||
#ifdef ISAL_DEF_LVL2_DEFAULT
|
#ifdef ISAL_DEF_LVL2_DEFAULT
|
||||||
ISAL_DEF_LVL2_DEFAULT,
|
ISAL_DEF_LVL2_DEFAULT,
|
||||||
#else
|
#else
|
||||||
0,
|
0,
|
||||||
#endif
|
#endif
|
||||||
#ifdef ISAL_DEF_LVL3_DEFAULT
|
#ifdef ISAL_DEF_LVL3_DEFAULT
|
||||||
ISAL_DEF_LVL3_DEFAULT,
|
ISAL_DEF_LVL3_DEFAULT,
|
||||||
#else
|
#else
|
||||||
0,
|
0,
|
||||||
#endif
|
#endif
|
||||||
#ifdef ISAL_DEF_LVL4_DEFAULT
|
#ifdef ISAL_DEF_LVL4_DEFAULT
|
||||||
ISAL_DEF_LVL4_DEFAULT,
|
ISAL_DEF_LVL4_DEFAULT,
|
||||||
#else
|
#else
|
||||||
0,
|
0,
|
||||||
#endif
|
#endif
|
||||||
#ifdef ISAL_DEF_LVL5_DEFAULT
|
#ifdef ISAL_DEF_LVL5_DEFAULT
|
||||||
ISAL_DEF_LVL5_DEFAULT,
|
ISAL_DEF_LVL5_DEFAULT,
|
||||||
#else
|
#else
|
||||||
0,
|
0,
|
||||||
#endif
|
#endif
|
||||||
#ifdef ISAL_DEF_LVL6_DEFAULT
|
#ifdef ISAL_DEF_LVL6_DEFAULT
|
||||||
ISAL_DEF_LVL6_DEFAULT,
|
ISAL_DEF_LVL6_DEFAULT,
|
||||||
#else
|
#else
|
||||||
0,
|
0,
|
||||||
#endif
|
#endif
|
||||||
#ifdef ISAL_DEF_LVL7_DEFAULT
|
#ifdef ISAL_DEF_LVL7_DEFAULT
|
||||||
ISAL_DEF_LVL7_DEFAULT,
|
ISAL_DEF_LVL7_DEFAULT,
|
||||||
#else
|
#else
|
||||||
0,
|
0,
|
||||||
#endif
|
#endif
|
||||||
#ifdef ISAL_DEF_LVL8_DEFAULT
|
#ifdef ISAL_DEF_LVL8_DEFAULT
|
||||||
ISAL_DEF_LVL8_DEFAULT,
|
ISAL_DEF_LVL8_DEFAULT,
|
||||||
#else
|
#else
|
||||||
0,
|
0,
|
||||||
#endif
|
#endif
|
||||||
#ifdef ISAL_DEF_LVL9_DEFAULT
|
#ifdef ISAL_DEF_LVL9_DEFAULT
|
||||||
ISAL_DEF_LVL9_DEFAULT,
|
ISAL_DEF_LVL9_DEFAULT,
|
||||||
#else
|
#else
|
||||||
0,
|
0,
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
int usage(void)
|
int
|
||||||
|
usage(void)
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr, "Usage: igzip_file_perf [options] <infile>\n"
|
||||||
"Usage: igzip_file_perf [options] <infile>\n"
|
" -h help\n"
|
||||||
" -h help\n"
|
" -X use compression level X with 0 <= X <= 1\n"
|
||||||
" -X use compression level X with 0 <= X <= 1\n"
|
" -b <size> input buffer size, 0 buffers all the input\n"
|
||||||
" -b <size> input buffer size, 0 buffers all the input\n"
|
" -i <time> time in seconds to benchmark (at least 0)\n"
|
||||||
" -i <time> time in seconds to benchmark (at least 0)\n"
|
" -o <file> output file for compressed data\n"
|
||||||
" -o <file> output file for compressed data\n"
|
" -d <file> dictionary file used by compression\n"
|
||||||
" -d <file> dictionary file used by compression\n"
|
" -w <size> log base 2 size of history window, between 8 and 15\n");
|
||||||
" -w <size> log base 2 size of history window, between 8 and 15\n");
|
|
||||||
|
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void deflate_perf(struct isal_zstream *stream, uint8_t * inbuf, size_t infile_size,
|
void
|
||||||
size_t inbuf_size, uint8_t * outbuf, size_t outbuf_size, int level,
|
deflate_perf(struct isal_zstream *stream, uint8_t *inbuf, size_t infile_size, size_t inbuf_size,
|
||||||
uint8_t * level_buf, int level_size, uint32_t hist_bits, uint8_t * dictbuf,
|
uint8_t *outbuf, size_t outbuf_size, int level, uint8_t *level_buf, int level_size,
|
||||||
size_t dictfile_size, struct isal_dict *dict_str,
|
uint32_t hist_bits, uint8_t *dictbuf, size_t dictfile_size, struct isal_dict *dict_str,
|
||||||
struct isal_hufftables *hufftables_custom)
|
struct isal_hufftables *hufftables_custom)
|
||||||
{
|
{
|
||||||
int avail_in;
|
int avail_in;
|
||||||
isal_deflate_init(stream);
|
isal_deflate_init(stream);
|
||||||
stream->level = level;
|
stream->level = level;
|
||||||
stream->level_buf = level_buf;
|
stream->level_buf = level_buf;
|
||||||
stream->level_buf_size = level_size;
|
stream->level_buf_size = level_size;
|
||||||
|
|
||||||
if (COMP_OK != isal_deflate_reset_dict(stream, dict_str))
|
if (COMP_OK != isal_deflate_reset_dict(stream, dict_str))
|
||||||
if (dictbuf != NULL)
|
if (dictbuf != NULL)
|
||||||
isal_deflate_set_dict(stream, dictbuf, dictfile_size);
|
isal_deflate_set_dict(stream, dictbuf, dictfile_size);
|
||||||
|
|
||||||
stream->end_of_stream = 0;
|
stream->end_of_stream = 0;
|
||||||
stream->flush = NO_FLUSH;
|
stream->flush = NO_FLUSH;
|
||||||
stream->next_out = outbuf;
|
stream->next_out = outbuf;
|
||||||
stream->avail_out = outbuf_size;
|
stream->avail_out = outbuf_size;
|
||||||
stream->next_in = inbuf;
|
stream->next_in = inbuf;
|
||||||
if (hufftables_custom != NULL)
|
if (hufftables_custom != NULL)
|
||||||
stream->hufftables = hufftables_custom;
|
stream->hufftables = hufftables_custom;
|
||||||
stream->hist_bits = hist_bits;
|
stream->hist_bits = hist_bits;
|
||||||
avail_in = infile_size;
|
avail_in = infile_size;
|
||||||
|
|
||||||
while (avail_in > 0) {
|
while (avail_in > 0) {
|
||||||
stream->avail_in = avail_in >= inbuf_size ? inbuf_size : avail_in;
|
stream->avail_in = avail_in >= inbuf_size ? inbuf_size : avail_in;
|
||||||
avail_in -= inbuf_size;
|
avail_in -= inbuf_size;
|
||||||
|
|
||||||
if (avail_in <= 0)
|
if (avail_in <= 0)
|
||||||
stream->end_of_stream = 1;
|
stream->end_of_stream = 1;
|
||||||
|
|
||||||
isal_deflate(stream);
|
isal_deflate(stream);
|
||||||
|
|
||||||
if (stream->avail_in != 0)
|
if (stream->avail_in != 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
FILE *in = NULL, *out = NULL, *dict = NULL;
|
FILE *in = NULL, *out = NULL, *dict = NULL;
|
||||||
unsigned char *inbuf, *outbuf, *level_buf = NULL, *dictbuf = NULL;
|
unsigned char *inbuf, *outbuf, *level_buf = NULL, *dictbuf = NULL;
|
||||||
int c, time = BENCHMARK_TIME, inbuf_size = 0;
|
int c, time = BENCHMARK_TIME, inbuf_size = 0;
|
||||||
size_t infile_size, outbuf_size, dictfile_size;
|
size_t infile_size, outbuf_size, dictfile_size;
|
||||||
struct isal_huff_histogram histogram;
|
struct isal_huff_histogram histogram;
|
||||||
struct isal_hufftables hufftables_custom;
|
struct isal_hufftables hufftables_custom;
|
||||||
int level = 0, level_size = 0;
|
int level = 0, level_size = 0;
|
||||||
char *in_file_name = NULL, *out_file_name = NULL, *dict_file_name = NULL;
|
char *in_file_name = NULL, *out_file_name = NULL, *dict_file_name = NULL;
|
||||||
uint32_t hist_bits = 0;
|
uint32_t hist_bits = 0;
|
||||||
struct isal_zstream stream;
|
struct isal_zstream stream;
|
||||||
|
|
||||||
while ((c = getopt(argc, argv, "h0123456789i:b:o:d:w:")) != -1) {
|
while ((c = getopt(argc, argv, "h0123456789i:b:o:d:w:")) != -1) {
|
||||||
if (c >= '0' && c <= '9') {
|
if (c >= '0' && c <= '9') {
|
||||||
if (c > '0' + ISAL_DEF_MAX_LEVEL)
|
if (c > '0' + ISAL_DEF_MAX_LEVEL)
|
||||||
usage();
|
usage();
|
||||||
else {
|
else {
|
||||||
level = c - '0';
|
level = c - '0';
|
||||||
level_size = level_size_buf[level];
|
level_size = level_size_buf[level];
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'o':
|
case 'o':
|
||||||
out_file_name = optarg;
|
out_file_name = optarg;
|
||||||
break;
|
break;
|
||||||
case 'd':
|
case 'd':
|
||||||
dict_file_name = optarg;
|
dict_file_name = optarg;
|
||||||
break;
|
break;
|
||||||
case 'i':
|
case 'i':
|
||||||
time = atoi(optarg);
|
time = atoi(optarg);
|
||||||
if (time < 0)
|
if (time < 0)
|
||||||
usage();
|
usage();
|
||||||
break;
|
break;
|
||||||
case 'b':
|
case 'b':
|
||||||
inbuf_size = atoi(optarg);
|
inbuf_size = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
case 'w':
|
case 'w':
|
||||||
hist_bits = atoi(optarg);
|
hist_bits = atoi(optarg);
|
||||||
if (hist_bits > 15 || hist_bits < 8)
|
if (hist_bits > 15 || hist_bits < 8)
|
||||||
usage();
|
usage();
|
||||||
break;
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
default:
|
default:
|
||||||
usage();
|
usage();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (optind < argc) {
|
if (optind < argc) {
|
||||||
in_file_name = argv[optind];
|
in_file_name = argv[optind];
|
||||||
in = fopen(in_file_name, "rb");
|
in = fopen(in_file_name, "rb");
|
||||||
} else
|
} else
|
||||||
usage();
|
usage();
|
||||||
|
|
||||||
if (!in) {
|
if (!in) {
|
||||||
fprintf(stderr, "Can't open %s for reading\n", in_file_name);
|
fprintf(stderr, "Can't open %s for reading\n", in_file_name);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
if (out_file_name != NULL) {
|
if (out_file_name != NULL) {
|
||||||
out = fopen(out_file_name, "wb");
|
out = fopen(out_file_name, "wb");
|
||||||
if (!out) {
|
if (!out) {
|
||||||
fprintf(stderr, "Can't open %s for writing\n", out_file_name);
|
fprintf(stderr, "Can't open %s for writing\n", out_file_name);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
printf("outfile=%s\n", out_file_name);
|
printf("outfile=%s\n", out_file_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dict_file_name != NULL) {
|
if (dict_file_name != NULL) {
|
||||||
dict = fopen(dict_file_name, "rb");
|
dict = fopen(dict_file_name, "rb");
|
||||||
if (!dict) {
|
if (!dict) {
|
||||||
fprintf(stderr, "Can't open %s for reading\n", dict_file_name);
|
fprintf(stderr, "Can't open %s for reading\n", dict_file_name);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
printf("outfile=%s\n", dict_file_name);
|
printf("outfile=%s\n", dict_file_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hist_bits == 0)
|
if (hist_bits == 0)
|
||||||
printf("Window Size: %d K\n", IGZIP_HIST_SIZE / 1024);
|
printf("Window Size: %d K\n", IGZIP_HIST_SIZE / 1024);
|
||||||
|
|
||||||
else if (hist_bits < 10)
|
else if (hist_bits < 10)
|
||||||
printf("Window Size: %.2f K\n", 1.0 * (1 << hist_bits) / 1024);
|
printf("Window Size: %.2f K\n", 1.0 * (1 << hist_bits) / 1024);
|
||||||
else
|
else
|
||||||
printf("Window Size: %d K\n", (1 << hist_bits) / 1024);
|
printf("Window Size: %d K\n", (1 << hist_bits) / 1024);
|
||||||
|
|
||||||
printf("igzip_file_perf: \n");
|
printf("igzip_file_perf: \n");
|
||||||
fflush(0);
|
fflush(0);
|
||||||
|
|
||||||
/* Allocate space for entire input file and output
|
/* Allocate space for entire input file and output
|
||||||
* (assuming some possible expansion on output size)
|
* (assuming some possible expansion on output size)
|
||||||
*/
|
*/
|
||||||
infile_size = get_filesize(in);
|
infile_size = get_filesize(in);
|
||||||
|
|
||||||
outbuf_size = 2 * infile_size + BUF_SIZE;
|
outbuf_size = 2 * infile_size + BUF_SIZE;
|
||||||
|
|
||||||
dictfile_size = (dict_file_name != NULL) ? get_filesize(dict) : 0;
|
dictfile_size = (dict_file_name != NULL) ? get_filesize(dict) : 0;
|
||||||
|
|
||||||
inbuf = malloc(infile_size);
|
inbuf = malloc(infile_size);
|
||||||
if (inbuf == NULL) {
|
if (inbuf == NULL) {
|
||||||
fprintf(stderr, "Can't allocate input buffer memory\n");
|
fprintf(stderr, "Can't allocate input buffer memory\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
outbuf = malloc(outbuf_size);
|
outbuf = malloc(outbuf_size);
|
||||||
if (outbuf == NULL) {
|
if (outbuf == NULL) {
|
||||||
fprintf(stderr, "Can't allocate output buffer memory\n");
|
fprintf(stderr, "Can't allocate output buffer memory\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dictfile_size != 0) {
|
if (dictfile_size != 0) {
|
||||||
dictbuf = malloc(dictfile_size);
|
dictbuf = malloc(dictfile_size);
|
||||||
if (dictbuf == NULL) {
|
if (dictbuf == NULL) {
|
||||||
fprintf(stderr, "Can't allocate dictionary buffer memory\n");
|
fprintf(stderr, "Can't allocate dictionary buffer memory\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (level_size != 0) {
|
if (level_size != 0) {
|
||||||
level_buf = malloc(level_size);
|
level_buf = malloc(level_size);
|
||||||
if (level_buf == NULL) {
|
if (level_buf == NULL) {
|
||||||
fprintf(stderr, "Can't allocate level buffer memory\n");
|
fprintf(stderr, "Can't allocate level buffer memory\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inbuf_size = inbuf_size ? inbuf_size : infile_size;
|
inbuf_size = inbuf_size ? inbuf_size : infile_size;
|
||||||
|
|
||||||
printf("igzip_file_perf: %s\n", in_file_name);
|
printf("igzip_file_perf: %s\n", in_file_name);
|
||||||
|
|
||||||
/* Read complete input file into buffer */
|
/* Read complete input file into buffer */
|
||||||
stream.avail_in = (uint32_t) fread(inbuf, 1, infile_size, in);
|
stream.avail_in = (uint32_t) fread(inbuf, 1, infile_size, in);
|
||||||
if (stream.avail_in != infile_size) {
|
if (stream.avail_in != infile_size) {
|
||||||
fprintf(stderr, "Couldn't fit all of input file into buffer\n");
|
fprintf(stderr, "Couldn't fit all of input file into buffer\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read complete dictionary into buffer */
|
/* Read complete dictionary into buffer */
|
||||||
if ((dictfile_size != 0) && (dictfile_size != fread(dictbuf, 1, dictfile_size, dict))) {
|
if ((dictfile_size != 0) && (dictfile_size != fread(dictbuf, 1, dictfile_size, dict))) {
|
||||||
fprintf(stderr, "Couldn't fit all of dictionary file into buffer\n");
|
fprintf(stderr, "Couldn't fit all of dictionary file into buffer\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct isal_dict dict_str;
|
struct isal_dict dict_str;
|
||||||
stream.level = level;
|
stream.level = level;
|
||||||
isal_deflate_process_dict(&stream, &dict_str, dictbuf, dictfile_size);
|
isal_deflate_process_dict(&stream, &dict_str, dictbuf, dictfile_size);
|
||||||
|
|
||||||
struct perf start;
|
struct perf start;
|
||||||
if (time > 0) {
|
if (time > 0) {
|
||||||
BENCHMARK(&start, time,
|
BENCHMARK(&start, time,
|
||||||
deflate_perf(&stream, inbuf, infile_size, inbuf_size, outbuf,
|
deflate_perf(&stream, inbuf, infile_size, inbuf_size, outbuf, outbuf_size,
|
||||||
outbuf_size, level, level_buf, level_size, hist_bits,
|
level, level_buf, level_size, hist_bits, dictbuf,
|
||||||
dictbuf, dictfile_size, &dict_str, NULL));
|
dictfile_size, &dict_str, NULL));
|
||||||
} else {
|
} else {
|
||||||
deflate_perf(&stream, inbuf, infile_size, inbuf_size, outbuf, outbuf_size,
|
deflate_perf(&stream, inbuf, infile_size, inbuf_size, outbuf, outbuf_size, level,
|
||||||
level, level_buf, level_size, hist_bits, dictbuf,
|
level_buf, level_size, hist_bits, dictbuf, dictfile_size, &dict_str,
|
||||||
dictfile_size, &dict_str, NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
if (stream.avail_in != 0) {
|
if (stream.avail_in != 0) {
|
||||||
fprintf(stderr, "Could not compress all of inbuf\n");
|
fprintf(stderr, "Could not compress all of inbuf\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf(" file %s - in_size=%lu out_size=%d ratio=%3.1f%%",
|
printf(" file %s - in_size=%lu out_size=%d ratio=%3.1f%%", in_file_name, infile_size,
|
||||||
in_file_name, infile_size, stream.total_out,
|
stream.total_out, 100.0 * stream.total_out / infile_size);
|
||||||
100.0 * stream.total_out / infile_size);
|
|
||||||
|
|
||||||
if (level == 0) {
|
if (level == 0) {
|
||||||
memset(&histogram, 0, sizeof(histogram));
|
memset(&histogram, 0, sizeof(histogram));
|
||||||
|
|
||||||
isal_update_histogram(inbuf, infile_size, &histogram);
|
isal_update_histogram(inbuf, infile_size, &histogram);
|
||||||
isal_create_hufftables(&hufftables_custom, &histogram);
|
isal_create_hufftables(&hufftables_custom, &histogram);
|
||||||
|
|
||||||
deflate_perf(&stream, inbuf, infile_size, inbuf_size, outbuf, outbuf_size,
|
deflate_perf(&stream, inbuf, infile_size, inbuf_size, outbuf, outbuf_size, level,
|
||||||
level, level_buf, level_size, hist_bits, dictbuf,
|
level_buf, level_size, hist_bits, dictbuf, dictfile_size, &dict_str,
|
||||||
dictfile_size, &dict_str, &hufftables_custom);
|
&hufftables_custom);
|
||||||
|
|
||||||
printf(" ratio_custom=%3.1f%%", 100.0 * stream.total_out / infile_size);
|
printf(" ratio_custom=%3.1f%%", 100.0 * stream.total_out / infile_size);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
if (stream.avail_in != 0) {
|
if (stream.avail_in != 0) {
|
||||||
fprintf(stderr, "Could not compress all of inbuf\n");
|
fprintf(stderr, "Could not compress all of inbuf\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("igzip_file: ");
|
printf("igzip_file: ");
|
||||||
perf_print(start, (long long)infile_size);
|
perf_print(start, (long long) infile_size);
|
||||||
|
|
||||||
if (argc > 2 && out) {
|
if (argc > 2 && out) {
|
||||||
printf("writing %s\n", out_file_name);
|
printf("writing %s\n", out_file_name);
|
||||||
fwrite(outbuf, 1, stream.total_out, out);
|
fwrite(outbuf, 1, stream.total_out, out);
|
||||||
fclose(out);
|
fclose(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(in);
|
fclose(in);
|
||||||
printf("End of igzip_file_perf\n\n");
|
printf("End of igzip_file_perf\n\n");
|
||||||
fflush(0);
|
fflush(0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -35,95 +35,96 @@
|
|||||||
#include "igzip_lib.h"
|
#include "igzip_lib.h"
|
||||||
#include "test.h"
|
#include "test.h"
|
||||||
|
|
||||||
#define BUF_SIZE 1024
|
#define BUF_SIZE 1024
|
||||||
#define MIN_TEST_LOOPS 8
|
#define MIN_TEST_LOOPS 8
|
||||||
#ifndef RUN_MEM_SIZE
|
#ifndef RUN_MEM_SIZE
|
||||||
# define RUN_MEM_SIZE 2000000000
|
#define RUN_MEM_SIZE 2000000000
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void print_histogram(struct isal_huff_histogram *histogram)
|
void
|
||||||
|
print_histogram(struct isal_huff_histogram *histogram)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
printf("Lit Len histogram");
|
printf("Lit Len histogram");
|
||||||
for (i = 0; i < ISAL_DEF_LIT_LEN_SYMBOLS; i++) {
|
for (i = 0; i < ISAL_DEF_LIT_LEN_SYMBOLS; i++) {
|
||||||
if (i % 16 == 0)
|
if (i % 16 == 0)
|
||||||
printf("\n");
|
printf("\n");
|
||||||
else
|
else
|
||||||
printf(", ");
|
printf(", ");
|
||||||
printf("%4lu", histogram->lit_len_histogram[i]);
|
printf("%4lu", histogram->lit_len_histogram[i]);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
printf("Dist histogram");
|
printf("Dist histogram");
|
||||||
for (i = 0; i < ISAL_DEF_DIST_SYMBOLS; i++) {
|
for (i = 0; i < ISAL_DEF_DIST_SYMBOLS; i++) {
|
||||||
if (i % 16 == 0)
|
if (i % 16 == 0)
|
||||||
printf("\n");
|
printf("\n");
|
||||||
else
|
else
|
||||||
printf(", ");
|
printf(", ");
|
||||||
printf("%4lu", histogram->dist_histogram[i]);
|
printf("%4lu", histogram->dist_histogram[i]);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
FILE *in;
|
FILE *in;
|
||||||
unsigned char *inbuf;
|
unsigned char *inbuf;
|
||||||
int iterations, avail_in;
|
int iterations, avail_in;
|
||||||
uint64_t infile_size;
|
uint64_t infile_size;
|
||||||
struct isal_huff_histogram histogram1, histogram2;
|
struct isal_huff_histogram histogram1, histogram2;
|
||||||
|
|
||||||
memset(&histogram1, 0, sizeof(histogram1));
|
memset(&histogram1, 0, sizeof(histogram1));
|
||||||
memset(&histogram2, 0, sizeof(histogram2));
|
memset(&histogram2, 0, sizeof(histogram2));
|
||||||
|
|
||||||
if (argc > 3 || argc < 2) {
|
if (argc > 3 || argc < 2) {
|
||||||
fprintf(stderr, "Usage: igzip_file_perf infile [outfile]\n"
|
fprintf(stderr, "Usage: igzip_file_perf infile [outfile]\n"
|
||||||
"\t - Runs multiple iterations of igzip on a file to "
|
"\t - Runs multiple iterations of igzip on a file to "
|
||||||
"get more accurate time results.\n");
|
"get more accurate time results.\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
in = fopen(argv[1], "rb");
|
in = fopen(argv[1], "rb");
|
||||||
if (!in) {
|
if (!in) {
|
||||||
fprintf(stderr, "Can't open %s for reading\n", argv[1]);
|
fprintf(stderr, "Can't open %s for reading\n", argv[1]);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate space for entire input file and output
|
/* Allocate space for entire input file and output
|
||||||
* (assuming some possible expansion on output size)
|
* (assuming some possible expansion on output size)
|
||||||
*/
|
*/
|
||||||
infile_size = get_filesize(in);
|
infile_size = get_filesize(in);
|
||||||
|
|
||||||
if (infile_size != 0)
|
if (infile_size != 0)
|
||||||
iterations = RUN_MEM_SIZE / infile_size;
|
iterations = RUN_MEM_SIZE / infile_size;
|
||||||
else
|
else
|
||||||
iterations = MIN_TEST_LOOPS;
|
iterations = MIN_TEST_LOOPS;
|
||||||
|
|
||||||
if (iterations < MIN_TEST_LOOPS)
|
if (iterations < MIN_TEST_LOOPS)
|
||||||
iterations = MIN_TEST_LOOPS;
|
iterations = MIN_TEST_LOOPS;
|
||||||
|
|
||||||
inbuf = malloc(infile_size);
|
inbuf = malloc(infile_size);
|
||||||
if (inbuf == NULL) {
|
if (inbuf == NULL) {
|
||||||
fprintf(stderr, "Can't allocate input buffer memory\n");
|
fprintf(stderr, "Can't allocate input buffer memory\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
avail_in = fread(inbuf, 1, infile_size, in);
|
avail_in = fread(inbuf, 1, infile_size, in);
|
||||||
if (avail_in != infile_size) {
|
if (avail_in != infile_size) {
|
||||||
free(inbuf);
|
free(inbuf);
|
||||||
fprintf(stderr, "Couldn't fit all of input file into buffer\n");
|
fprintf(stderr, "Couldn't fit all of input file into buffer\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct perf start;
|
struct perf start;
|
||||||
BENCHMARK(&start, BENCHMARK_TIME,
|
BENCHMARK(&start, BENCHMARK_TIME, isal_update_histogram(inbuf, infile_size, &histogram1));
|
||||||
isal_update_histogram(inbuf, infile_size, &histogram1));
|
printf(" file %s - in_size=%lu\n", argv[1], infile_size);
|
||||||
printf(" file %s - in_size=%lu\n", argv[1], infile_size);
|
printf("igzip_hist_file: ");
|
||||||
printf("igzip_hist_file: ");
|
perf_print(start, (long long) infile_size);
|
||||||
perf_print(start, (long long)infile_size);
|
|
||||||
|
|
||||||
fclose(in);
|
fclose(in);
|
||||||
fflush(0);
|
fflush(0);
|
||||||
free(inbuf);
|
free(inbuf);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -6,365 +6,363 @@
|
|||||||
#include "igzip_level_buf_structs.h"
|
#include "igzip_level_buf_structs.h"
|
||||||
#include "unaligned.h"
|
#include "unaligned.h"
|
||||||
|
|
||||||
static inline void write_deflate_icf(struct deflate_icf *icf, uint32_t lit_len,
|
static inline void
|
||||||
uint32_t lit_dist, uint32_t extra_bits)
|
write_deflate_icf(struct deflate_icf *icf, uint32_t lit_len, uint32_t lit_dist, uint32_t extra_bits)
|
||||||
{
|
{
|
||||||
icf->lit_len = lit_len;
|
icf->lit_len = lit_len;
|
||||||
icf->lit_dist = lit_dist;
|
icf->lit_dist = lit_dist;
|
||||||
icf->dist_extra = extra_bits;
|
icf->dist_extra = extra_bits;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void update_state(struct isal_zstream *stream, uint8_t * start_in,
|
static inline void
|
||||||
uint8_t * next_in, uint8_t * end_in,
|
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 *start_out, struct deflate_icf *next_out,
|
||||||
struct deflate_icf *end_out)
|
struct deflate_icf *end_out)
|
||||||
{
|
{
|
||||||
struct level_buf *level_buf = (struct level_buf *)stream->level_buf;
|
struct level_buf *level_buf = (struct level_buf *) stream->level_buf;
|
||||||
|
|
||||||
if (next_in - start_in > 0)
|
if (next_in - start_in > 0)
|
||||||
stream->internal_state.has_hist = IGZIP_HIST;
|
stream->internal_state.has_hist = IGZIP_HIST;
|
||||||
|
|
||||||
stream->next_in = next_in;
|
stream->next_in = next_in;
|
||||||
stream->total_in += next_in - start_in;
|
stream->total_in += next_in - start_in;
|
||||||
stream->internal_state.block_end = stream->total_in;
|
stream->internal_state.block_end = stream->total_in;
|
||||||
stream->avail_in = end_in - next_in;
|
stream->avail_in = end_in - next_in;
|
||||||
|
|
||||||
level_buf->icf_buf_next = next_out;
|
level_buf->icf_buf_next = next_out;
|
||||||
level_buf->icf_buf_avail_out = end_out - next_out;
|
level_buf->icf_buf_avail_out = end_out - next_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
void isal_deflate_icf_body_hash_hist_base(struct isal_zstream *stream)
|
void
|
||||||
|
isal_deflate_icf_body_hash_hist_base(struct isal_zstream *stream)
|
||||||
{
|
{
|
||||||
uint32_t literal, hash;
|
uint32_t literal, hash;
|
||||||
uint8_t *start_in, *next_in, *end_in, *end, *next_hash;
|
uint8_t *start_in, *next_in, *end_in, *end, *next_hash;
|
||||||
struct deflate_icf *start_out, *next_out, *end_out;
|
struct deflate_icf *start_out, *next_out, *end_out;
|
||||||
uint16_t match_length;
|
uint16_t match_length;
|
||||||
uint32_t dist;
|
uint32_t dist;
|
||||||
uint32_t code, code2, extra_bits;
|
uint32_t code, code2, extra_bits;
|
||||||
struct isal_zstate *state = &stream->internal_state;
|
struct isal_zstate *state = &stream->internal_state;
|
||||||
struct level_buf *level_buf = (struct level_buf *)stream->level_buf;
|
struct level_buf *level_buf = (struct level_buf *) stream->level_buf;
|
||||||
uint16_t *last_seen = level_buf->hash_hist.hash_table;
|
uint16_t *last_seen = level_buf->hash_hist.hash_table;
|
||||||
uint8_t *file_start = (uint8_t *) ((uintptr_t) stream->next_in - stream->total_in);
|
uint8_t *file_start = (uint8_t *) ((uintptr_t) stream->next_in - stream->total_in);
|
||||||
uint32_t hist_size = state->dist_mask;
|
uint32_t hist_size = state->dist_mask;
|
||||||
uint32_t hash_mask = state->hash_mask;
|
uint32_t hash_mask = state->hash_mask;
|
||||||
|
|
||||||
if (stream->avail_in == 0) {
|
if (stream->avail_in == 0) {
|
||||||
if (stream->end_of_stream || stream->flush != NO_FLUSH)
|
if (stream->end_of_stream || stream->flush != NO_FLUSH)
|
||||||
state->state = ZSTATE_FLUSH_READ_BUFFER;
|
state->state = ZSTATE_FLUSH_READ_BUFFER;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
start_in = stream->next_in;
|
start_in = stream->next_in;
|
||||||
end_in = start_in + stream->avail_in;
|
end_in = start_in + stream->avail_in;
|
||||||
next_in = start_in;
|
next_in = start_in;
|
||||||
|
|
||||||
start_out = ((struct level_buf *)stream->level_buf)->icf_buf_next;
|
start_out = ((struct level_buf *) stream->level_buf)->icf_buf_next;
|
||||||
end_out =
|
end_out = start_out + ((struct level_buf *) stream->level_buf)->icf_buf_avail_out /
|
||||||
start_out + ((struct level_buf *)stream->level_buf)->icf_buf_avail_out /
|
sizeof(struct deflate_icf);
|
||||||
sizeof(struct deflate_icf);
|
next_out = start_out;
|
||||||
next_out = start_out;
|
|
||||||
|
|
||||||
while (next_in + ISAL_LOOK_AHEAD < end_in) {
|
while (next_in + ISAL_LOOK_AHEAD < end_in) {
|
||||||
|
|
||||||
if (next_out >= end_out) {
|
if (next_out >= end_out) {
|
||||||
state->state = ZSTATE_CREATE_HDR;
|
state->state = ZSTATE_CREATE_HDR;
|
||||||
update_state(stream, start_in, next_in, end_in, start_out, next_out,
|
update_state(stream, start_in, next_in, end_in, start_out, next_out,
|
||||||
end_out);
|
end_out);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
literal = load_le_u32(next_in);
|
literal = load_le_u32(next_in);
|
||||||
hash = compute_hash(literal) & hash_mask;
|
hash = compute_hash(literal) & hash_mask;
|
||||||
dist = (next_in - file_start - last_seen[hash]) & 0xFFFF;
|
dist = (next_in - file_start - last_seen[hash]) & 0xFFFF;
|
||||||
last_seen[hash] = (uint64_t) (next_in - file_start);
|
last_seen[hash] = (uint64_t) (next_in - file_start);
|
||||||
|
|
||||||
/* The -1 are to handle the case when dist = 0 */
|
/* The -1 are to handle the case when dist = 0 */
|
||||||
if (dist - 1 < hist_size) {
|
if (dist - 1 < hist_size) {
|
||||||
assert(dist != 0);
|
assert(dist != 0);
|
||||||
|
|
||||||
match_length = compare258(next_in - dist, next_in, 258);
|
match_length = compare258(next_in - dist, next_in, 258);
|
||||||
|
|
||||||
if (match_length >= SHORTEST_MATCH) {
|
if (match_length >= SHORTEST_MATCH) {
|
||||||
next_hash = next_in;
|
next_hash = next_in;
|
||||||
#ifdef ISAL_LIMIT_HASH_UPDATE
|
#ifdef ISAL_LIMIT_HASH_UPDATE
|
||||||
end = next_hash + 3;
|
end = next_hash + 3;
|
||||||
#else
|
#else
|
||||||
end = next_hash + match_length;
|
end = next_hash + match_length;
|
||||||
#endif
|
#endif
|
||||||
next_hash++;
|
next_hash++;
|
||||||
|
|
||||||
for (; next_hash < end; next_hash++) {
|
for (; next_hash < end; next_hash++) {
|
||||||
literal = load_le_u32(next_hash);
|
literal = load_le_u32(next_hash);
|
||||||
hash = compute_hash(literal) & hash_mask;
|
hash = compute_hash(literal) & hash_mask;
|
||||||
last_seen[hash] = (uint64_t) (next_hash - file_start);
|
last_seen[hash] = (uint64_t) (next_hash - file_start);
|
||||||
}
|
}
|
||||||
|
|
||||||
get_len_icf_code(match_length, &code);
|
get_len_icf_code(match_length, &code);
|
||||||
get_dist_icf_code(dist, &code2, &extra_bits);
|
get_dist_icf_code(dist, &code2, &extra_bits);
|
||||||
|
|
||||||
level_buf->hist.ll_hist[code]++;
|
level_buf->hist.ll_hist[code]++;
|
||||||
level_buf->hist.d_hist[code2]++;
|
level_buf->hist.d_hist[code2]++;
|
||||||
|
|
||||||
write_deflate_icf(next_out, code, code2, extra_bits);
|
write_deflate_icf(next_out, code, code2, extra_bits);
|
||||||
next_out++;
|
next_out++;
|
||||||
next_in += match_length;
|
next_in += match_length;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
get_lit_icf_code(literal & 0xFF, &code);
|
get_lit_icf_code(literal & 0xFF, &code);
|
||||||
level_buf->hist.ll_hist[code]++;
|
level_buf->hist.ll_hist[code]++;
|
||||||
write_deflate_icf(next_out, code, NULL_DIST_SYM, 0);
|
write_deflate_icf(next_out, code, NULL_DIST_SYM, 0);
|
||||||
next_out++;
|
next_out++;
|
||||||
next_in++;
|
next_in++;
|
||||||
}
|
}
|
||||||
|
|
||||||
update_state(stream, start_in, next_in, end_in, start_out, next_out, end_out);
|
update_state(stream, start_in, next_in, end_in, start_out, next_out, end_out);
|
||||||
|
|
||||||
assert(stream->avail_in <= ISAL_LOOK_AHEAD);
|
assert(stream->avail_in <= ISAL_LOOK_AHEAD);
|
||||||
if (stream->end_of_stream || stream->flush != NO_FLUSH)
|
if (stream->end_of_stream || stream->flush != NO_FLUSH)
|
||||||
state->state = ZSTATE_FLUSH_READ_BUFFER;
|
state->state = ZSTATE_FLUSH_READ_BUFFER;
|
||||||
|
|
||||||
return;
|
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void isal_deflate_icf_finish_hash_hist_base(struct isal_zstream *stream)
|
void
|
||||||
|
isal_deflate_icf_finish_hash_hist_base(struct isal_zstream *stream)
|
||||||
{
|
{
|
||||||
uint32_t literal = 0, hash;
|
uint32_t literal = 0, hash;
|
||||||
uint8_t *start_in, *next_in, *end_in, *end, *next_hash;
|
uint8_t *start_in, *next_in, *end_in, *end, *next_hash;
|
||||||
struct deflate_icf *start_out, *next_out, *end_out;
|
struct deflate_icf *start_out, *next_out, *end_out;
|
||||||
uint16_t match_length;
|
uint16_t match_length;
|
||||||
uint32_t dist;
|
uint32_t dist;
|
||||||
uint32_t code, code2, extra_bits;
|
uint32_t code, code2, extra_bits;
|
||||||
struct isal_zstate *state = &stream->internal_state;
|
struct isal_zstate *state = &stream->internal_state;
|
||||||
struct level_buf *level_buf = (struct level_buf *)stream->level_buf;
|
struct level_buf *level_buf = (struct level_buf *) stream->level_buf;
|
||||||
uint16_t *last_seen = level_buf->hash_hist.hash_table;
|
uint16_t *last_seen = level_buf->hash_hist.hash_table;
|
||||||
uint8_t *file_start = (uint8_t *) ((uintptr_t) stream->next_in - stream->total_in);
|
uint8_t *file_start = (uint8_t *) ((uintptr_t) stream->next_in - stream->total_in);
|
||||||
uint32_t hist_size = state->dist_mask;
|
uint32_t hist_size = state->dist_mask;
|
||||||
uint32_t hash_mask = state->hash_mask;
|
uint32_t hash_mask = state->hash_mask;
|
||||||
|
|
||||||
start_in = stream->next_in;
|
start_in = stream->next_in;
|
||||||
end_in = start_in + stream->avail_in;
|
end_in = start_in + stream->avail_in;
|
||||||
next_in = start_in;
|
next_in = start_in;
|
||||||
|
|
||||||
start_out = ((struct level_buf *)stream->level_buf)->icf_buf_next;
|
start_out = ((struct level_buf *) stream->level_buf)->icf_buf_next;
|
||||||
end_out = start_out + ((struct level_buf *)stream->level_buf)->icf_buf_avail_out /
|
end_out = start_out + ((struct level_buf *) stream->level_buf)->icf_buf_avail_out /
|
||||||
sizeof(struct deflate_icf);
|
sizeof(struct deflate_icf);
|
||||||
next_out = start_out;
|
next_out = start_out;
|
||||||
|
|
||||||
if (stream->avail_in == 0) {
|
if (stream->avail_in == 0) {
|
||||||
if (stream->end_of_stream || stream->flush != NO_FLUSH)
|
if (stream->end_of_stream || stream->flush != NO_FLUSH)
|
||||||
state->state = ZSTATE_CREATE_HDR;
|
state->state = ZSTATE_CREATE_HDR;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (next_in + 3 < end_in) {
|
while (next_in + 3 < end_in) {
|
||||||
if (next_out >= end_out) {
|
if (next_out >= end_out) {
|
||||||
state->state = ZSTATE_CREATE_HDR;
|
state->state = ZSTATE_CREATE_HDR;
|
||||||
update_state(stream, start_in, next_in, end_in, start_out, next_out,
|
update_state(stream, start_in, next_in, end_in, start_out, next_out,
|
||||||
end_out);
|
end_out);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
literal = load_le_u32(next_in);
|
literal = load_le_u32(next_in);
|
||||||
hash = compute_hash(literal) & hash_mask;
|
hash = compute_hash(literal) & hash_mask;
|
||||||
dist = (next_in - file_start - last_seen[hash]) & 0xFFFF;
|
dist = (next_in - file_start - last_seen[hash]) & 0xFFFF;
|
||||||
last_seen[hash] = (uint64_t) (next_in - file_start);
|
last_seen[hash] = (uint64_t) (next_in - file_start);
|
||||||
|
|
||||||
if (dist - 1 < hist_size) { /* The -1 are to handle the case when dist = 0 */
|
if (dist - 1 < hist_size) { /* The -1 are to handle the case when dist = 0 */
|
||||||
match_length = compare258(next_in - dist, next_in, end_in - next_in);
|
match_length = compare258(next_in - dist, next_in, end_in - next_in);
|
||||||
|
|
||||||
if (match_length >= SHORTEST_MATCH) {
|
if (match_length >= SHORTEST_MATCH) {
|
||||||
next_hash = next_in;
|
next_hash = next_in;
|
||||||
#ifdef ISAL_LIMIT_HASH_UPDATE
|
#ifdef ISAL_LIMIT_HASH_UPDATE
|
||||||
end = next_hash + 3;
|
end = next_hash + 3;
|
||||||
#else
|
#else
|
||||||
end = next_hash + match_length;
|
end = next_hash + match_length;
|
||||||
#endif
|
#endif
|
||||||
next_hash++;
|
next_hash++;
|
||||||
|
|
||||||
for (; next_hash < end - 3; next_hash++) {
|
for (; next_hash < end - 3; next_hash++) {
|
||||||
literal = load_le_u32(next_hash);
|
literal = load_le_u32(next_hash);
|
||||||
hash = compute_hash(literal) & hash_mask;
|
hash = compute_hash(literal) & hash_mask;
|
||||||
last_seen[hash] = (uint64_t) (next_hash - file_start);
|
last_seen[hash] = (uint64_t) (next_hash - file_start);
|
||||||
}
|
}
|
||||||
|
|
||||||
get_len_icf_code(match_length, &code);
|
get_len_icf_code(match_length, &code);
|
||||||
get_dist_icf_code(dist, &code2, &extra_bits);
|
get_dist_icf_code(dist, &code2, &extra_bits);
|
||||||
|
|
||||||
level_buf->hist.ll_hist[code]++;
|
level_buf->hist.ll_hist[code]++;
|
||||||
level_buf->hist.d_hist[code2]++;
|
level_buf->hist.d_hist[code2]++;
|
||||||
|
|
||||||
write_deflate_icf(next_out, code, code2, extra_bits);
|
write_deflate_icf(next_out, code, code2, extra_bits);
|
||||||
|
|
||||||
next_out++;
|
next_out++;
|
||||||
next_in += match_length;
|
next_in += match_length;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
get_lit_icf_code(literal & 0xFF, &code);
|
get_lit_icf_code(literal & 0xFF, &code);
|
||||||
level_buf->hist.ll_hist[code]++;
|
level_buf->hist.ll_hist[code]++;
|
||||||
write_deflate_icf(next_out, code, NULL_DIST_SYM, 0);
|
write_deflate_icf(next_out, code, NULL_DIST_SYM, 0);
|
||||||
next_out++;
|
next_out++;
|
||||||
next_in++;
|
next_in++;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
while (next_in < end_in) {
|
||||||
|
if (next_out >= end_out) {
|
||||||
|
state->state = ZSTATE_CREATE_HDR;
|
||||||
|
update_state(stream, start_in, next_in, end_in, start_out, next_out,
|
||||||
|
end_out);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
while (next_in < end_in) {
|
literal = *next_in;
|
||||||
if (next_out >= end_out) {
|
get_lit_icf_code(literal & 0xFF, &code);
|
||||||
state->state = ZSTATE_CREATE_HDR;
|
level_buf->hist.ll_hist[code]++;
|
||||||
update_state(stream, start_in, next_in, end_in, start_out, next_out,
|
write_deflate_icf(next_out, code, NULL_DIST_SYM, 0);
|
||||||
end_out);
|
next_out++;
|
||||||
return;
|
next_in++;
|
||||||
}
|
}
|
||||||
|
|
||||||
literal = *next_in;
|
if (next_in == end_in) {
|
||||||
get_lit_icf_code(literal & 0xFF, &code);
|
if (stream->end_of_stream || stream->flush != NO_FLUSH)
|
||||||
level_buf->hist.ll_hist[code]++;
|
state->state = ZSTATE_CREATE_HDR;
|
||||||
write_deflate_icf(next_out, code, NULL_DIST_SYM, 0);
|
}
|
||||||
next_out++;
|
|
||||||
next_in++;
|
|
||||||
|
|
||||||
}
|
update_state(stream, start_in, next_in, end_in, start_out, next_out, end_out);
|
||||||
|
|
||||||
if (next_in == end_in) {
|
return;
|
||||||
if (stream->end_of_stream || stream->flush != NO_FLUSH)
|
|
||||||
state->state = ZSTATE_CREATE_HDR;
|
|
||||||
}
|
|
||||||
|
|
||||||
update_state(stream, start_in, next_in, end_in, start_out, next_out, end_out);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void isal_deflate_icf_finish_hash_map_base(struct isal_zstream *stream)
|
void
|
||||||
|
isal_deflate_icf_finish_hash_map_base(struct isal_zstream *stream)
|
||||||
{
|
{
|
||||||
uint32_t literal = 0, hash;
|
uint32_t literal = 0, hash;
|
||||||
uint8_t *start_in, *next_in, *end_in, *end, *next_hash;
|
uint8_t *start_in, *next_in, *end_in, *end, *next_hash;
|
||||||
struct deflate_icf *start_out, *next_out, *end_out;
|
struct deflate_icf *start_out, *next_out, *end_out;
|
||||||
uint16_t match_length;
|
uint16_t match_length;
|
||||||
uint32_t dist;
|
uint32_t dist;
|
||||||
uint32_t code, code2, extra_bits;
|
uint32_t code, code2, extra_bits;
|
||||||
struct isal_zstate *state = &stream->internal_state;
|
struct isal_zstate *state = &stream->internal_state;
|
||||||
struct level_buf *level_buf = (struct level_buf *)stream->level_buf;
|
struct level_buf *level_buf = (struct level_buf *) stream->level_buf;
|
||||||
uint16_t *last_seen = level_buf->hash_map.hash_table;
|
uint16_t *last_seen = level_buf->hash_map.hash_table;
|
||||||
uint8_t *file_start = (uint8_t *) ((uintptr_t) stream->next_in - stream->total_in);
|
uint8_t *file_start = (uint8_t *) ((uintptr_t) stream->next_in - stream->total_in);
|
||||||
uint32_t hist_size = state->dist_mask;
|
uint32_t hist_size = state->dist_mask;
|
||||||
uint32_t hash_mask = state->hash_mask;
|
uint32_t hash_mask = state->hash_mask;
|
||||||
|
|
||||||
start_in = stream->next_in;
|
start_in = stream->next_in;
|
||||||
end_in = start_in + stream->avail_in;
|
end_in = start_in + stream->avail_in;
|
||||||
next_in = start_in;
|
next_in = start_in;
|
||||||
|
|
||||||
start_out = level_buf->icf_buf_next;
|
start_out = level_buf->icf_buf_next;
|
||||||
end_out = start_out + level_buf->icf_buf_avail_out / sizeof(struct deflate_icf);
|
end_out = start_out + level_buf->icf_buf_avail_out / sizeof(struct deflate_icf);
|
||||||
next_out = start_out;
|
next_out = start_out;
|
||||||
|
|
||||||
if (stream->avail_in == 0) {
|
if (stream->avail_in == 0) {
|
||||||
if (stream->end_of_stream || stream->flush != NO_FLUSH)
|
if (stream->end_of_stream || stream->flush != NO_FLUSH)
|
||||||
state->state = ZSTATE_CREATE_HDR;
|
state->state = ZSTATE_CREATE_HDR;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (next_in + 3 < end_in) {
|
while (next_in + 3 < end_in) {
|
||||||
if (next_out >= end_out) {
|
if (next_out >= end_out) {
|
||||||
state->state = ZSTATE_CREATE_HDR;
|
state->state = ZSTATE_CREATE_HDR;
|
||||||
update_state(stream, start_in, next_in, end_in, start_out, next_out,
|
update_state(stream, start_in, next_in, end_in, start_out, next_out,
|
||||||
end_out);
|
end_out);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
literal = load_le_u32(next_in);
|
literal = load_le_u32(next_in);
|
||||||
hash = compute_hash_mad(literal) & hash_mask;
|
hash = compute_hash_mad(literal) & hash_mask;
|
||||||
dist = (next_in - file_start - last_seen[hash]) & 0xFFFF;
|
dist = (next_in - file_start - last_seen[hash]) & 0xFFFF;
|
||||||
last_seen[hash] = (uint64_t) (next_in - file_start);
|
last_seen[hash] = (uint64_t) (next_in - file_start);
|
||||||
|
|
||||||
if (dist - 1 < hist_size) { /* The -1 are to handle the case when dist = 0 */
|
if (dist - 1 < hist_size) { /* The -1 are to handle the case when dist = 0 */
|
||||||
match_length = compare258(next_in - dist, next_in, end_in - next_in);
|
match_length = compare258(next_in - dist, next_in, end_in - next_in);
|
||||||
|
|
||||||
if (match_length >= SHORTEST_MATCH) {
|
if (match_length >= SHORTEST_MATCH) {
|
||||||
next_hash = next_in;
|
next_hash = next_in;
|
||||||
#ifdef ISAL_LIMIT_HASH_UPDATE
|
#ifdef ISAL_LIMIT_HASH_UPDATE
|
||||||
end = next_hash + 3;
|
end = next_hash + 3;
|
||||||
#else
|
#else
|
||||||
end = next_hash + match_length;
|
end = next_hash + match_length;
|
||||||
#endif
|
#endif
|
||||||
next_hash++;
|
next_hash++;
|
||||||
|
|
||||||
for (; next_hash < end - 3; next_hash++) {
|
for (; next_hash < end - 3; next_hash++) {
|
||||||
literal = load_le_u32(next_hash);
|
literal = load_le_u32(next_hash);
|
||||||
hash = compute_hash_mad(literal) & hash_mask;
|
hash = compute_hash_mad(literal) & hash_mask;
|
||||||
last_seen[hash] = (uint64_t) (next_hash - file_start);
|
last_seen[hash] = (uint64_t) (next_hash - file_start);
|
||||||
}
|
}
|
||||||
|
|
||||||
get_len_icf_code(match_length, &code);
|
get_len_icf_code(match_length, &code);
|
||||||
get_dist_icf_code(dist, &code2, &extra_bits);
|
get_dist_icf_code(dist, &code2, &extra_bits);
|
||||||
|
|
||||||
level_buf->hist.ll_hist[code]++;
|
level_buf->hist.ll_hist[code]++;
|
||||||
level_buf->hist.d_hist[code2]++;
|
level_buf->hist.d_hist[code2]++;
|
||||||
|
|
||||||
write_deflate_icf(next_out, code, code2, extra_bits);
|
write_deflate_icf(next_out, code, code2, extra_bits);
|
||||||
|
|
||||||
next_out++;
|
next_out++;
|
||||||
next_in += match_length;
|
next_in += match_length;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
get_lit_icf_code(literal & 0xFF, &code);
|
get_lit_icf_code(literal & 0xFF, &code);
|
||||||
level_buf->hist.ll_hist[code]++;
|
level_buf->hist.ll_hist[code]++;
|
||||||
write_deflate_icf(next_out, code, NULL_DIST_SYM, 0);
|
write_deflate_icf(next_out, code, NULL_DIST_SYM, 0);
|
||||||
next_out++;
|
next_out++;
|
||||||
next_in++;
|
next_in++;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
while (next_in < end_in) {
|
||||||
|
if (next_out >= end_out) {
|
||||||
|
state->state = ZSTATE_CREATE_HDR;
|
||||||
|
update_state(stream, start_in, next_in, end_in, start_out, next_out,
|
||||||
|
end_out);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
while (next_in < end_in) {
|
literal = *next_in;
|
||||||
if (next_out >= end_out) {
|
get_lit_icf_code(literal & 0xFF, &code);
|
||||||
state->state = ZSTATE_CREATE_HDR;
|
level_buf->hist.ll_hist[code]++;
|
||||||
update_state(stream, start_in, next_in, end_in, start_out, next_out,
|
write_deflate_icf(next_out, code, NULL_DIST_SYM, 0);
|
||||||
end_out);
|
next_out++;
|
||||||
return;
|
next_in++;
|
||||||
}
|
}
|
||||||
|
|
||||||
literal = *next_in;
|
if (next_in == end_in) {
|
||||||
get_lit_icf_code(literal & 0xFF, &code);
|
if (stream->end_of_stream || stream->flush != NO_FLUSH)
|
||||||
level_buf->hist.ll_hist[code]++;
|
state->state = ZSTATE_CREATE_HDR;
|
||||||
write_deflate_icf(next_out, code, NULL_DIST_SYM, 0);
|
}
|
||||||
next_out++;
|
|
||||||
next_in++;
|
|
||||||
|
|
||||||
}
|
update_state(stream, start_in, next_in, end_in, start_out, next_out, end_out);
|
||||||
|
|
||||||
if (next_in == end_in) {
|
return;
|
||||||
if (stream->end_of_stream || stream->flush != NO_FLUSH)
|
|
||||||
state->state = ZSTATE_CREATE_HDR;
|
|
||||||
}
|
|
||||||
|
|
||||||
update_state(stream, start_in, next_in, end_in, start_out, next_out, end_out);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void isal_deflate_hash_mad_base(uint16_t * hash_table, uint32_t hash_mask,
|
void
|
||||||
uint32_t current_index, uint8_t * dict, uint32_t dict_len)
|
isal_deflate_hash_mad_base(uint16_t *hash_table, uint32_t hash_mask, uint32_t current_index,
|
||||||
|
uint8_t *dict, uint32_t dict_len)
|
||||||
{
|
{
|
||||||
uint8_t *next_in = dict;
|
uint8_t *next_in = dict;
|
||||||
uint8_t *end_in = dict + dict_len - SHORTEST_MATCH;
|
uint8_t *end_in = dict + dict_len - SHORTEST_MATCH;
|
||||||
uint32_t literal;
|
uint32_t literal;
|
||||||
uint32_t hash;
|
uint32_t hash;
|
||||||
uint16_t index = current_index - dict_len;
|
uint16_t index = current_index - dict_len;
|
||||||
|
|
||||||
while (next_in <= end_in) {
|
while (next_in <= end_in) {
|
||||||
literal = load_le_u32(next_in);
|
literal = load_le_u32(next_in);
|
||||||
hash = compute_hash_mad(literal) & hash_mask;
|
hash = compute_hash_mad(literal) & hash_mask;
|
||||||
hash_table[hash] = index;
|
hash_table[hash] = index;
|
||||||
index++;
|
index++;
|
||||||
next_in++;
|
next_in++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,335 +3,344 @@
|
|||||||
#include "encode_df.h"
|
#include "encode_df.h"
|
||||||
#include "igzip_level_buf_structs.h"
|
#include "igzip_level_buf_structs.h"
|
||||||
|
|
||||||
extern uint64_t gen_icf_map_lh1(struct isal_zstream *, struct deflate_icf *, uint32_t);
|
extern uint64_t
|
||||||
extern void set_long_icf_fg(uint8_t *, uint64_t, uint64_t, struct deflate_icf *);
|
gen_icf_map_lh1(struct isal_zstream *, struct deflate_icf *, uint32_t);
|
||||||
extern void isal_deflate_icf_body_lvl1(struct isal_zstream *);
|
extern void
|
||||||
extern void isal_deflate_icf_body_lvl2(struct isal_zstream *);
|
set_long_icf_fg(uint8_t *, uint64_t, uint64_t, struct deflate_icf *);
|
||||||
extern void isal_deflate_icf_body_lvl3(struct isal_zstream *);
|
extern void
|
||||||
|
isal_deflate_icf_body_lvl1(struct isal_zstream *);
|
||||||
|
extern void
|
||||||
|
isal_deflate_icf_body_lvl2(struct isal_zstream *);
|
||||||
|
extern void
|
||||||
|
isal_deflate_icf_body_lvl3(struct isal_zstream *);
|
||||||
/*
|
/*
|
||||||
*************************************************************
|
*************************************************************
|
||||||
* Helper functions
|
* Helper functions
|
||||||
************************************************************
|
************************************************************
|
||||||
*/
|
*/
|
||||||
static inline void write_deflate_icf(struct deflate_icf *icf, uint32_t lit_len,
|
static inline void
|
||||||
uint32_t lit_dist, uint32_t extra_bits)
|
write_deflate_icf(struct deflate_icf *icf, uint32_t lit_len, uint32_t lit_dist, uint32_t extra_bits)
|
||||||
{
|
{
|
||||||
/* icf->lit_len = lit_len; */
|
/* icf->lit_len = lit_len; */
|
||||||
/* icf->lit_dist = lit_dist; */
|
/* icf->lit_dist = lit_dist; */
|
||||||
/* icf->dist_extra = extra_bits; */
|
/* icf->dist_extra = extra_bits; */
|
||||||
|
|
||||||
store_native_u32((uint8_t *) icf, lit_len | (lit_dist << LIT_LEN_BIT_COUNT)
|
store_native_u32((uint8_t *) icf,
|
||||||
| (extra_bits << (LIT_LEN_BIT_COUNT + DIST_LIT_BIT_COUNT)));
|
lit_len | (lit_dist << LIT_LEN_BIT_COUNT) |
|
||||||
|
(extra_bits << (LIT_LEN_BIT_COUNT + DIST_LIT_BIT_COUNT)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_long_icf_fg_base(uint8_t * next_in, uint64_t processed, uint64_t input_size,
|
void
|
||||||
struct deflate_icf *match_lookup)
|
set_long_icf_fg_base(uint8_t *next_in, uint64_t processed, uint64_t input_size,
|
||||||
|
struct deflate_icf *match_lookup)
|
||||||
{
|
{
|
||||||
uint8_t *end_processed = next_in + processed;
|
uint8_t *end_processed = next_in + processed;
|
||||||
uint8_t *end_in = next_in + input_size;
|
uint8_t *end_in = next_in + input_size;
|
||||||
uint32_t dist_code, dist_extra, dist, len;
|
uint32_t dist_code, dist_extra, dist, len;
|
||||||
uint32_t match_len;
|
uint32_t match_len;
|
||||||
uint32_t dist_start[] = {
|
uint32_t dist_start[] = { 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0007, 0x0009, 0x000d,
|
||||||
0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0007, 0x0009, 0x000d,
|
0x0011, 0x0019, 0x0021, 0x0031, 0x0041, 0x0061, 0x0081, 0x00c1,
|
||||||
0x0011, 0x0019, 0x0021, 0x0031, 0x0041, 0x0061, 0x0081, 0x00c1,
|
0x0101, 0x0181, 0x0201, 0x0301, 0x0401, 0x0601, 0x0801, 0x0c01,
|
||||||
0x0101, 0x0181, 0x0201, 0x0301, 0x0401, 0x0601, 0x0801, 0x0c01,
|
0x1001, 0x1801, 0x2001, 0x3001, 0x4001, 0x6001, 0x0000, 0x0000 };
|
||||||
0x1001, 0x1801, 0x2001, 0x3001, 0x4001, 0x6001, 0x0000, 0x0000
|
|
||||||
};
|
|
||||||
|
|
||||||
if (end_in > end_processed + ISAL_LOOK_AHEAD)
|
if (end_in > end_processed + ISAL_LOOK_AHEAD)
|
||||||
end_in = end_processed + ISAL_LOOK_AHEAD;
|
end_in = end_processed + ISAL_LOOK_AHEAD;
|
||||||
|
|
||||||
while (next_in < end_processed) {
|
while (next_in < end_processed) {
|
||||||
dist_code = match_lookup->lit_dist;
|
dist_code = match_lookup->lit_dist;
|
||||||
dist_extra = match_lookup->dist_extra;
|
dist_extra = match_lookup->dist_extra;
|
||||||
dist = dist_start[dist_code] + dist_extra;
|
dist = dist_start[dist_code] + dist_extra;
|
||||||
len = match_lookup->lit_len;
|
len = match_lookup->lit_len;
|
||||||
if (len >= 8 + LEN_OFFSET) {
|
if (len >= 8 + LEN_OFFSET) {
|
||||||
match_len = compare((next_in + 8) - dist, next_in + 8,
|
match_len =
|
||||||
end_in - (next_in + 8)) + LEN_OFFSET + 8;
|
compare((next_in + 8) - dist, next_in + 8, end_in - (next_in + 8)) +
|
||||||
|
LEN_OFFSET + 8;
|
||||||
|
|
||||||
while (match_len > match_lookup->lit_len
|
while (match_len > match_lookup->lit_len &&
|
||||||
&& match_len >= LEN_OFFSET + SHORTEST_MATCH) {
|
match_len >= LEN_OFFSET + SHORTEST_MATCH) {
|
||||||
write_deflate_icf(match_lookup,
|
write_deflate_icf(match_lookup,
|
||||||
match_len > LEN_MAX ? LEN_MAX : match_len,
|
match_len > LEN_MAX ? LEN_MAX : match_len,
|
||||||
dist_code, dist_extra);
|
dist_code, dist_extra);
|
||||||
match_lookup++;
|
match_lookup++;
|
||||||
next_in++;
|
next_in++;
|
||||||
match_len--;
|
match_len--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
match_lookup++;
|
match_lookup++;
|
||||||
next_in++;
|
next_in++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*************************************************************
|
*************************************************************
|
||||||
* Methods for generating one pass match lookup table
|
* Methods for generating one pass match lookup table
|
||||||
************************************************************
|
************************************************************
|
||||||
*/
|
*/
|
||||||
uint64_t gen_icf_map_h1_base(struct isal_zstream *stream,
|
uint64_t
|
||||||
struct deflate_icf *matches_icf_lookup, uint64_t input_size)
|
gen_icf_map_h1_base(struct isal_zstream *stream, struct deflate_icf *matches_icf_lookup,
|
||||||
|
uint64_t input_size)
|
||||||
{
|
{
|
||||||
|
|
||||||
uint32_t dist, len, extra_bits;
|
uint32_t dist, len, extra_bits;
|
||||||
uint8_t *next_in = stream->next_in, *end_in = stream->next_in + input_size;
|
uint8_t *next_in = stream->next_in, *end_in = stream->next_in + input_size;
|
||||||
uint8_t *file_start = (uint8_t *) ((uintptr_t) stream->next_in - stream->total_in);
|
uint8_t *file_start = (uint8_t *) ((uintptr_t) stream->next_in - stream->total_in);
|
||||||
uint32_t hash;
|
uint32_t hash;
|
||||||
uint64_t next_bytes, match_bytes;
|
uint64_t next_bytes, match_bytes;
|
||||||
uint64_t match;
|
uint64_t match;
|
||||||
struct level_buf *level_buf = (struct level_buf *)stream->level_buf;
|
struct level_buf *level_buf = (struct level_buf *) stream->level_buf;
|
||||||
uint16_t *hash_table = level_buf->hash_map.hash_table;
|
uint16_t *hash_table = level_buf->hash_map.hash_table;
|
||||||
uint32_t hist_size = stream->internal_state.dist_mask;
|
uint32_t hist_size = stream->internal_state.dist_mask;
|
||||||
uint32_t hash_mask = stream->internal_state.hash_mask;
|
uint32_t hash_mask = stream->internal_state.hash_mask;
|
||||||
|
|
||||||
if (input_size < ISAL_LOOK_AHEAD)
|
if (input_size < ISAL_LOOK_AHEAD)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (stream->internal_state.has_hist == IGZIP_NO_HIST) {
|
if (stream->internal_state.has_hist == IGZIP_NO_HIST) {
|
||||||
matches_icf_lookup->lit_len = *next_in;
|
matches_icf_lookup->lit_len = *next_in;
|
||||||
matches_icf_lookup->lit_dist = 0x1e;
|
matches_icf_lookup->lit_dist = 0x1e;
|
||||||
matches_icf_lookup->dist_extra = 0;
|
matches_icf_lookup->dist_extra = 0;
|
||||||
|
|
||||||
hash = compute_hash(load_le_u32(next_in)) & hash_mask;
|
hash = compute_hash(load_le_u32(next_in)) & hash_mask;
|
||||||
hash_table[hash] = (uint64_t) (next_in - file_start);
|
hash_table[hash] = (uint64_t) (next_in - file_start);
|
||||||
|
|
||||||
next_in++;
|
next_in++;
|
||||||
matches_icf_lookup++;
|
matches_icf_lookup++;
|
||||||
stream->internal_state.has_hist = IGZIP_HIST;
|
stream->internal_state.has_hist = IGZIP_HIST;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (next_in < end_in - ISAL_LOOK_AHEAD) {
|
while (next_in < end_in - ISAL_LOOK_AHEAD) {
|
||||||
hash = compute_hash(load_le_u32(next_in)) & hash_mask;
|
hash = compute_hash(load_le_u32(next_in)) & hash_mask;
|
||||||
dist = (next_in - file_start - hash_table[hash]);
|
dist = (next_in - file_start - hash_table[hash]);
|
||||||
dist = ((dist - 1) & hist_size) + 1;
|
dist = ((dist - 1) & hist_size) + 1;
|
||||||
hash_table[hash] = (uint64_t) (next_in - file_start);
|
hash_table[hash] = (uint64_t) (next_in - file_start);
|
||||||
|
|
||||||
match_bytes = load_le_u64(next_in - dist);
|
match_bytes = load_le_u64(next_in - dist);
|
||||||
next_bytes = load_le_u64(next_in);
|
next_bytes = load_le_u64(next_in);
|
||||||
match = next_bytes ^ match_bytes;
|
match = next_bytes ^ match_bytes;
|
||||||
|
|
||||||
len = tzbytecnt(match);
|
len = tzbytecnt(match);
|
||||||
|
|
||||||
if (len >= SHORTEST_MATCH) {
|
if (len >= SHORTEST_MATCH) {
|
||||||
len += LEN_OFFSET;
|
len += LEN_OFFSET;
|
||||||
get_dist_icf_code(dist, &dist, &extra_bits);
|
get_dist_icf_code(dist, &dist, &extra_bits);
|
||||||
write_deflate_icf(matches_icf_lookup, len, dist, extra_bits);
|
write_deflate_icf(matches_icf_lookup, len, dist, extra_bits);
|
||||||
} else {
|
} else {
|
||||||
write_deflate_icf(matches_icf_lookup, *next_in, 0x1e, 0);
|
write_deflate_icf(matches_icf_lookup, *next_in, 0x1e, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
next_in++;
|
next_in++;
|
||||||
matches_icf_lookup++;
|
matches_icf_lookup++;
|
||||||
}
|
}
|
||||||
return next_in - stream->next_in;
|
return next_in - stream->next_in;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*************************************************************
|
*************************************************************
|
||||||
* One pass methods for parsing provided match lookup table
|
* One pass methods for parsing provided match lookup table
|
||||||
************************************************************
|
************************************************************
|
||||||
*/
|
*/
|
||||||
static struct deflate_icf *compress_icf_map_g(struct isal_zstream *stream,
|
static struct deflate_icf *
|
||||||
struct deflate_icf *matches_next,
|
compress_icf_map_g(struct isal_zstream *stream, struct deflate_icf *matches_next,
|
||||||
struct deflate_icf *matches_end)
|
struct deflate_icf *matches_end)
|
||||||
{
|
{
|
||||||
uint32_t lit_len, lit_len2, dist;
|
uint32_t lit_len, lit_len2, dist;
|
||||||
uint64_t code;
|
uint64_t code;
|
||||||
struct isal_zstate *state = &stream->internal_state;
|
struct isal_zstate *state = &stream->internal_state;
|
||||||
struct level_buf *level_buf = (struct level_buf *)stream->level_buf;
|
struct level_buf *level_buf = (struct level_buf *) stream->level_buf;
|
||||||
struct deflate_icf *matches_start = matches_next;
|
struct deflate_icf *matches_start = matches_next;
|
||||||
struct deflate_icf *icf_buf_end =
|
struct deflate_icf *icf_buf_end =
|
||||||
level_buf->icf_buf_next +
|
level_buf->icf_buf_next + level_buf->icf_buf_avail_out / sizeof(struct deflate_icf);
|
||||||
level_buf->icf_buf_avail_out / sizeof(struct deflate_icf);
|
|
||||||
|
|
||||||
while (matches_next + 1 < matches_end && level_buf->icf_buf_next + 1 < icf_buf_end) {
|
while (matches_next + 1 < matches_end && level_buf->icf_buf_next + 1 < icf_buf_end) {
|
||||||
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
||||||
code = load_native_u64((uint8_t *) matches_next);
|
code = load_native_u64((uint8_t *) matches_next);
|
||||||
#else
|
#else
|
||||||
code = load_native_u32((uint8_t *) matches_next) |
|
code = load_native_u32((uint8_t *) matches_next) |
|
||||||
((uint64_t) load_native_u32((uint8_t *) (matches_next + 1)) << 32);
|
((uint64_t) load_native_u32((uint8_t *) (matches_next + 1)) << 32);
|
||||||
#endif
|
#endif
|
||||||
lit_len = code & LIT_LEN_MASK;
|
lit_len = code & LIT_LEN_MASK;
|
||||||
lit_len2 = (code >> ICF_CODE_LEN) & LIT_LEN_MASK;
|
lit_len2 = (code >> ICF_CODE_LEN) & LIT_LEN_MASK;
|
||||||
level_buf->hist.ll_hist[lit_len]++;
|
level_buf->hist.ll_hist[lit_len]++;
|
||||||
|
|
||||||
if (lit_len >= LEN_START) {
|
if (lit_len >= LEN_START) {
|
||||||
store_native_u32((uint8_t *) level_buf->icf_buf_next, code);
|
store_native_u32((uint8_t *) level_buf->icf_buf_next, code);
|
||||||
level_buf->icf_buf_next++;
|
level_buf->icf_buf_next++;
|
||||||
|
|
||||||
dist = (code >> ICF_DIST_OFFSET) & DIST_LIT_MASK;
|
dist = (code >> ICF_DIST_OFFSET) & DIST_LIT_MASK;
|
||||||
level_buf->hist.d_hist[dist]++;
|
level_buf->hist.d_hist[dist]++;
|
||||||
lit_len -= LEN_OFFSET;
|
lit_len -= LEN_OFFSET;
|
||||||
matches_next += lit_len;
|
matches_next += lit_len;
|
||||||
|
|
||||||
} else if (lit_len2 >= LEN_START) {
|
} else if (lit_len2 >= LEN_START) {
|
||||||
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
||||||
store_native_u64((uint8_t *) level_buf->icf_buf_next, code);
|
store_native_u64((uint8_t *) level_buf->icf_buf_next, code);
|
||||||
#else
|
#else
|
||||||
store_native_u32((uint8_t *) level_buf->icf_buf_next, (uint32_t) code);
|
store_native_u32((uint8_t *) level_buf->icf_buf_next, (uint32_t) code);
|
||||||
store_native_u32((uint8_t *) (level_buf->icf_buf_next + 1),
|
store_native_u32((uint8_t *) (level_buf->icf_buf_next + 1),
|
||||||
(uint32_t) (code >> 32));
|
(uint32_t) (code >> 32));
|
||||||
#endif
|
#endif
|
||||||
level_buf->icf_buf_next += 2;
|
level_buf->icf_buf_next += 2;
|
||||||
|
|
||||||
level_buf->hist.ll_hist[lit_len2]++;
|
level_buf->hist.ll_hist[lit_len2]++;
|
||||||
|
|
||||||
dist = (code >> (ICF_CODE_LEN + ICF_DIST_OFFSET)) & DIST_LIT_MASK;
|
dist = (code >> (ICF_CODE_LEN + ICF_DIST_OFFSET)) & DIST_LIT_MASK;
|
||||||
level_buf->hist.d_hist[dist]++;
|
level_buf->hist.d_hist[dist]++;
|
||||||
lit_len2 -= LEN_OFFSET - 1;
|
lit_len2 -= LEN_OFFSET - 1;
|
||||||
matches_next += lit_len2;
|
matches_next += lit_len2;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
code = ((lit_len2 + LIT_START) << ICF_DIST_OFFSET) | lit_len;
|
code = ((lit_len2 + LIT_START) << ICF_DIST_OFFSET) | lit_len;
|
||||||
store_native_u32((uint8_t *) level_buf->icf_buf_next, code);
|
store_native_u32((uint8_t *) level_buf->icf_buf_next, code);
|
||||||
level_buf->icf_buf_next++;
|
level_buf->icf_buf_next++;
|
||||||
|
|
||||||
level_buf->hist.ll_hist[lit_len2]++;
|
level_buf->hist.ll_hist[lit_len2]++;
|
||||||
|
|
||||||
matches_next += 2;
|
matches_next += 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while (matches_next < matches_end && level_buf->icf_buf_next < icf_buf_end) {
|
while (matches_next < matches_end && level_buf->icf_buf_next < icf_buf_end) {
|
||||||
code = load_native_u32((uint8_t *) matches_next);
|
code = load_native_u32((uint8_t *) matches_next);
|
||||||
lit_len = code & LIT_LEN_MASK;
|
lit_len = code & LIT_LEN_MASK;
|
||||||
store_native_u32((uint8_t *) level_buf->icf_buf_next, code);
|
store_native_u32((uint8_t *) level_buf->icf_buf_next, code);
|
||||||
level_buf->icf_buf_next++;
|
level_buf->icf_buf_next++;
|
||||||
|
|
||||||
level_buf->hist.ll_hist[lit_len]++;
|
level_buf->hist.ll_hist[lit_len]++;
|
||||||
if (lit_len >= LEN_START) {
|
if (lit_len >= LEN_START) {
|
||||||
dist = (code >> 10) & 0x1ff;
|
dist = (code >> 10) & 0x1ff;
|
||||||
level_buf->hist.d_hist[dist]++;
|
level_buf->hist.d_hist[dist]++;
|
||||||
lit_len -= LEN_OFFSET;
|
lit_len -= LEN_OFFSET;
|
||||||
matches_next += lit_len;
|
matches_next += lit_len;
|
||||||
} else {
|
} else {
|
||||||
matches_next++;
|
matches_next++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
level_buf->icf_buf_avail_out =
|
level_buf->icf_buf_avail_out =
|
||||||
(icf_buf_end - level_buf->icf_buf_next) * sizeof(struct deflate_icf);
|
(icf_buf_end - level_buf->icf_buf_next) * sizeof(struct deflate_icf);
|
||||||
|
|
||||||
state->block_end += matches_next - matches_start;
|
state->block_end += matches_next - matches_start;
|
||||||
if (matches_next > matches_end && matches_start < matches_end) {
|
if (matches_next > matches_end && matches_start < matches_end) {
|
||||||
stream->next_in += matches_next - matches_end;
|
stream->next_in += matches_next - matches_end;
|
||||||
stream->avail_in -= matches_next - matches_end;
|
stream->avail_in -= matches_next - matches_end;
|
||||||
stream->total_in += matches_next - matches_end;
|
stream->total_in += matches_next - matches_end;
|
||||||
}
|
}
|
||||||
|
|
||||||
return matches_next;
|
|
||||||
|
|
||||||
|
return matches_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*************************************************************
|
*************************************************************
|
||||||
* Compression functions combining different methods
|
* Compression functions combining different methods
|
||||||
************************************************************
|
************************************************************
|
||||||
*/
|
*/
|
||||||
static inline void icf_body_next_state(struct isal_zstream *stream)
|
static inline void
|
||||||
|
icf_body_next_state(struct isal_zstream *stream)
|
||||||
{
|
{
|
||||||
struct level_buf *level_buf = (struct level_buf *)stream->level_buf;
|
struct level_buf *level_buf = (struct level_buf *) stream->level_buf;
|
||||||
struct isal_zstate *state = &stream->internal_state;
|
struct isal_zstate *state = &stream->internal_state;
|
||||||
|
|
||||||
if (level_buf->icf_buf_avail_out <= 0)
|
if (level_buf->icf_buf_avail_out <= 0)
|
||||||
state->state = ZSTATE_CREATE_HDR;
|
state->state = ZSTATE_CREATE_HDR;
|
||||||
|
|
||||||
else if (stream->avail_in <= ISAL_LOOK_AHEAD
|
else if (stream->avail_in <= ISAL_LOOK_AHEAD &&
|
||||||
&& (stream->end_of_stream || stream->flush != NO_FLUSH))
|
(stream->end_of_stream || stream->flush != NO_FLUSH))
|
||||||
state->state = ZSTATE_FLUSH_READ_BUFFER;
|
state->state = ZSTATE_FLUSH_READ_BUFFER;
|
||||||
}
|
}
|
||||||
|
|
||||||
void icf_body_hash1_fillgreedy_lazy(struct isal_zstream *stream)
|
void
|
||||||
|
icf_body_hash1_fillgreedy_lazy(struct isal_zstream *stream)
|
||||||
{
|
{
|
||||||
struct deflate_icf *matches_icf, *matches_next_icf, *matches_end_icf;
|
struct deflate_icf *matches_icf, *matches_next_icf, *matches_end_icf;
|
||||||
struct deflate_icf *matches_icf_lookup;
|
struct deflate_icf *matches_icf_lookup;
|
||||||
struct level_buf *level_buf = (struct level_buf *)stream->level_buf;
|
struct level_buf *level_buf = (struct level_buf *) stream->level_buf;
|
||||||
uint32_t input_size, processed;
|
uint32_t input_size, processed;
|
||||||
|
|
||||||
matches_icf = level_buf->hash_map.matches;
|
matches_icf = level_buf->hash_map.matches;
|
||||||
matches_icf_lookup = matches_icf;
|
matches_icf_lookup = matches_icf;
|
||||||
matches_next_icf = level_buf->hash_map.matches_next;
|
matches_next_icf = level_buf->hash_map.matches_next;
|
||||||
matches_end_icf = level_buf->hash_map.matches_end;
|
matches_end_icf = level_buf->hash_map.matches_end;
|
||||||
|
|
||||||
matches_next_icf = compress_icf_map_g(stream, matches_next_icf, matches_end_icf);
|
matches_next_icf = compress_icf_map_g(stream, matches_next_icf, matches_end_icf);
|
||||||
|
|
||||||
while (matches_next_icf >= matches_end_icf) {
|
while (matches_next_icf >= matches_end_icf) {
|
||||||
input_size = MATCH_BUF_SIZE;
|
input_size = MATCH_BUF_SIZE;
|
||||||
input_size = (input_size > stream->avail_in) ? stream->avail_in : input_size;
|
input_size = (input_size > stream->avail_in) ? stream->avail_in : input_size;
|
||||||
|
|
||||||
if (input_size <= ISAL_LOOK_AHEAD)
|
if (input_size <= ISAL_LOOK_AHEAD)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
processed = gen_icf_map_h1_base(stream, matches_icf_lookup, input_size);
|
processed = gen_icf_map_h1_base(stream, matches_icf_lookup, input_size);
|
||||||
|
|
||||||
set_long_icf_fg(stream->next_in, processed, input_size, matches_icf_lookup);
|
set_long_icf_fg(stream->next_in, processed, input_size, matches_icf_lookup);
|
||||||
|
|
||||||
stream->next_in += processed;
|
stream->next_in += processed;
|
||||||
stream->avail_in -= processed;
|
stream->avail_in -= processed;
|
||||||
stream->total_in += processed;
|
stream->total_in += processed;
|
||||||
|
|
||||||
matches_end_icf = matches_icf + processed;
|
matches_end_icf = matches_icf + processed;
|
||||||
matches_next_icf = compress_icf_map_g(stream, matches_icf, matches_end_icf);
|
matches_next_icf = compress_icf_map_g(stream, matches_icf, matches_end_icf);
|
||||||
}
|
}
|
||||||
|
|
||||||
level_buf->hash_map.matches_next = matches_next_icf;
|
level_buf->hash_map.matches_next = matches_next_icf;
|
||||||
level_buf->hash_map.matches_end = matches_end_icf;
|
level_buf->hash_map.matches_end = matches_end_icf;
|
||||||
|
|
||||||
icf_body_next_state(stream);
|
icf_body_next_state(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
void icf_body_lazyhash1_fillgreedy_greedy(struct isal_zstream *stream)
|
void
|
||||||
|
icf_body_lazyhash1_fillgreedy_greedy(struct isal_zstream *stream)
|
||||||
{
|
{
|
||||||
struct deflate_icf *matches_icf, *matches_next_icf, *matches_end_icf;
|
struct deflate_icf *matches_icf, *matches_next_icf, *matches_end_icf;
|
||||||
struct deflate_icf *matches_icf_lookup;
|
struct deflate_icf *matches_icf_lookup;
|
||||||
struct level_buf *level_buf = (struct level_buf *)stream->level_buf;
|
struct level_buf *level_buf = (struct level_buf *) stream->level_buf;
|
||||||
uint32_t input_size, processed;
|
uint32_t input_size, processed;
|
||||||
|
|
||||||
matches_icf = level_buf->hash_map.matches;
|
matches_icf = level_buf->hash_map.matches;
|
||||||
matches_icf_lookup = matches_icf;
|
matches_icf_lookup = matches_icf;
|
||||||
matches_next_icf = level_buf->hash_map.matches_next;
|
matches_next_icf = level_buf->hash_map.matches_next;
|
||||||
matches_end_icf = level_buf->hash_map.matches_end;
|
matches_end_icf = level_buf->hash_map.matches_end;
|
||||||
|
|
||||||
matches_next_icf = compress_icf_map_g(stream, matches_next_icf, matches_end_icf);
|
matches_next_icf = compress_icf_map_g(stream, matches_next_icf, matches_end_icf);
|
||||||
|
|
||||||
while (matches_next_icf >= matches_end_icf) {
|
while (matches_next_icf >= matches_end_icf) {
|
||||||
input_size = MATCH_BUF_SIZE;
|
input_size = MATCH_BUF_SIZE;
|
||||||
input_size = (input_size > stream->avail_in) ? stream->avail_in : input_size;
|
input_size = (input_size > stream->avail_in) ? stream->avail_in : input_size;
|
||||||
|
|
||||||
if (input_size <= ISAL_LOOK_AHEAD)
|
if (input_size <= ISAL_LOOK_AHEAD)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
processed = gen_icf_map_lh1(stream, matches_icf_lookup, input_size);
|
processed = gen_icf_map_lh1(stream, matches_icf_lookup, input_size);
|
||||||
|
|
||||||
set_long_icf_fg(stream->next_in, processed, input_size, matches_icf_lookup);
|
set_long_icf_fg(stream->next_in, processed, input_size, matches_icf_lookup);
|
||||||
|
|
||||||
stream->next_in += processed;
|
stream->next_in += processed;
|
||||||
stream->avail_in -= processed;
|
stream->avail_in -= processed;
|
||||||
stream->total_in += processed;
|
stream->total_in += processed;
|
||||||
|
|
||||||
matches_end_icf = matches_icf + processed;
|
matches_end_icf = matches_icf + processed;
|
||||||
matches_next_icf = compress_icf_map_g(stream, matches_icf, matches_end_icf);
|
matches_next_icf = compress_icf_map_g(stream, matches_icf, matches_end_icf);
|
||||||
}
|
}
|
||||||
|
|
||||||
level_buf->hash_map.matches_next = matches_next_icf;
|
level_buf->hash_map.matches_next = matches_next_icf;
|
||||||
level_buf->hash_map.matches_end = matches_end_icf;
|
level_buf->hash_map.matches_end = matches_end_icf;
|
||||||
|
|
||||||
icf_body_next_state(stream);
|
icf_body_next_state(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
void isal_deflate_icf_body(struct isal_zstream *stream)
|
void
|
||||||
|
isal_deflate_icf_body(struct isal_zstream *stream)
|
||||||
{
|
{
|
||||||
switch (stream->level) {
|
switch (stream->level) {
|
||||||
case 3:
|
case 3:
|
||||||
isal_deflate_icf_body_lvl3(stream);
|
isal_deflate_icf_body_lvl3(stream);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
isal_deflate_icf_body_lvl2(stream);
|
isal_deflate_icf_body_lvl2(stream);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
default:
|
default:
|
||||||
isal_deflate_icf_body_lvl1(stream);
|
isal_deflate_icf_body_lvl1(stream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -39,272 +39,270 @@
|
|||||||
/*Don't use file larger memory can support because compression and decompression
|
/*Don't use file larger memory can support because compression and decompression
|
||||||
* are done in a stateless manner. */
|
* are done in a stateless manner. */
|
||||||
#if __WORDSIZE == 64
|
#if __WORDSIZE == 64
|
||||||
#define MAX_INPUT_FILE_SIZE 2L*1024L*1024L*1024L
|
#define MAX_INPUT_FILE_SIZE 2L * 1024L * 1024L * 1024L
|
||||||
#else
|
#else
|
||||||
#define MAX_INPUT_FILE_SIZE 512L*1024L*1024L
|
#define MAX_INPUT_FILE_SIZE 512L * 1024L * 1024L
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int inflate_multi_pass(uint8_t * compress_buf, uint64_t compress_len,
|
int
|
||||||
uint8_t * uncompress_buf, uint32_t * uncompress_len)
|
inflate_multi_pass(uint8_t *compress_buf, uint64_t compress_len, uint8_t *uncompress_buf,
|
||||||
|
uint32_t *uncompress_len)
|
||||||
{
|
{
|
||||||
struct inflate_state *state = NULL;
|
struct inflate_state *state = NULL;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
uint8_t *comp_tmp = NULL, *uncomp_tmp = NULL;
|
uint8_t *comp_tmp = NULL, *uncomp_tmp = NULL;
|
||||||
uint32_t comp_tmp_size = 0, uncomp_tmp_size = 0;
|
uint32_t comp_tmp_size = 0, uncomp_tmp_size = 0;
|
||||||
uint32_t comp_processed = 0, uncomp_processed = 0;
|
uint32_t comp_processed = 0, uncomp_processed = 0;
|
||||||
|
|
||||||
state = malloc(sizeof(struct inflate_state));
|
state = malloc(sizeof(struct inflate_state));
|
||||||
if (state == NULL) {
|
if (state == NULL) {
|
||||||
printf("Failed to allocate memory\n");
|
printf("Failed to allocate memory\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
isal_inflate_init(state);
|
isal_inflate_init(state);
|
||||||
|
|
||||||
state->next_in = NULL;
|
state->next_in = NULL;
|
||||||
state->next_out = NULL;
|
state->next_out = NULL;
|
||||||
state->avail_in = 0;
|
state->avail_in = 0;
|
||||||
state->avail_out = 0;
|
state->avail_out = 0;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
if (state->avail_in == 0) {
|
if (state->avail_in == 0) {
|
||||||
comp_tmp_size = rand() % (compress_len + 1);
|
comp_tmp_size = rand() % (compress_len + 1);
|
||||||
|
|
||||||
if (comp_tmp_size >= compress_len - comp_processed)
|
if (comp_tmp_size >= compress_len - comp_processed)
|
||||||
comp_tmp_size = compress_len - comp_processed;
|
comp_tmp_size = compress_len - comp_processed;
|
||||||
|
|
||||||
if (comp_tmp_size != 0) {
|
if (comp_tmp_size != 0) {
|
||||||
if (comp_tmp != NULL)
|
if (comp_tmp != NULL)
|
||||||
free(comp_tmp);
|
free(comp_tmp);
|
||||||
|
|
||||||
comp_tmp = malloc(comp_tmp_size);
|
comp_tmp = malloc(comp_tmp_size);
|
||||||
|
|
||||||
if (comp_tmp == NULL) {
|
if (comp_tmp == NULL) {
|
||||||
printf("Failed to allocate memory\n");
|
printf("Failed to allocate memory\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(comp_tmp, compress_buf + comp_processed, comp_tmp_size);
|
memcpy(comp_tmp, compress_buf + comp_processed, comp_tmp_size);
|
||||||
comp_processed += comp_tmp_size;
|
comp_processed += comp_tmp_size;
|
||||||
|
|
||||||
state->next_in = comp_tmp;
|
state->next_in = comp_tmp;
|
||||||
state->avail_in = comp_tmp_size;
|
state->avail_in = comp_tmp_size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state->avail_out == 0) {
|
if (state->avail_out == 0) {
|
||||||
/* Save uncompressed data into uncompress_buf */
|
/* Save uncompressed data into uncompress_buf */
|
||||||
if (uncomp_tmp != NULL) {
|
if (uncomp_tmp != NULL) {
|
||||||
memcpy(uncompress_buf + uncomp_processed, uncomp_tmp,
|
memcpy(uncompress_buf + uncomp_processed, uncomp_tmp,
|
||||||
uncomp_tmp_size);
|
uncomp_tmp_size);
|
||||||
uncomp_processed += uncomp_tmp_size;
|
uncomp_processed += uncomp_tmp_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
uncomp_tmp_size = rand() % (*uncompress_len + 1);
|
uncomp_tmp_size = rand() % (*uncompress_len + 1);
|
||||||
|
|
||||||
/* Limit size of buffer to be smaller than maximum */
|
/* Limit size of buffer to be smaller than maximum */
|
||||||
if (uncomp_tmp_size > *uncompress_len - uncomp_processed)
|
if (uncomp_tmp_size > *uncompress_len - uncomp_processed)
|
||||||
uncomp_tmp_size = *uncompress_len - uncomp_processed;
|
uncomp_tmp_size = *uncompress_len - uncomp_processed;
|
||||||
|
|
||||||
if (uncomp_tmp_size != 0) {
|
if (uncomp_tmp_size != 0) {
|
||||||
|
|
||||||
if (uncomp_tmp != NULL) {
|
if (uncomp_tmp != NULL) {
|
||||||
fflush(0);
|
fflush(0);
|
||||||
free(uncomp_tmp);
|
free(uncomp_tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
uncomp_tmp = malloc(uncomp_tmp_size);
|
uncomp_tmp = malloc(uncomp_tmp_size);
|
||||||
if (uncomp_tmp == NULL) {
|
if (uncomp_tmp == NULL) {
|
||||||
printf("Failed to allocate memory\n");
|
printf("Failed to allocate memory\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
state->avail_out = uncomp_tmp_size;
|
state->avail_out = uncomp_tmp_size;
|
||||||
state->next_out = uncomp_tmp;
|
state->next_out = uncomp_tmp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = isal_inflate(state);
|
ret = isal_inflate(state);
|
||||||
|
|
||||||
if (state->block_state == ISAL_BLOCK_FINISH || ret != 0) {
|
if (state->block_state == ISAL_BLOCK_FINISH || ret != 0) {
|
||||||
memcpy(uncompress_buf + uncomp_processed, uncomp_tmp, uncomp_tmp_size);
|
memcpy(uncompress_buf + uncomp_processed, uncomp_tmp, uncomp_tmp_size);
|
||||||
*uncompress_len = state->total_out;
|
*uncompress_len = state->total_out;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (comp_tmp != NULL) {
|
if (comp_tmp != NULL) {
|
||||||
free(comp_tmp);
|
free(comp_tmp);
|
||||||
comp_tmp = NULL;
|
comp_tmp = NULL;
|
||||||
}
|
}
|
||||||
if (uncomp_tmp != NULL) {
|
if (uncomp_tmp != NULL) {
|
||||||
free(uncomp_tmp);
|
free(uncomp_tmp);
|
||||||
uncomp_tmp = NULL;
|
uncomp_tmp = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(state);
|
free(state);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int test(uint8_t * compressed_stream,
|
int
|
||||||
uint64_t * compressed_length,
|
test(uint8_t *compressed_stream, uint64_t *compressed_length, uint8_t *uncompressed_stream,
|
||||||
uint8_t * uncompressed_stream, uint32_t uncompressed_length,
|
uint32_t uncompressed_length, uint8_t *uncompressed_test_stream,
|
||||||
uint8_t * uncompressed_test_stream, uint32_t uncompressed_test_stream_length)
|
uint32_t uncompressed_test_stream_length)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
ret =
|
ret = compress2(compressed_stream, (uLongf *) compressed_length, uncompressed_stream,
|
||||||
compress2(compressed_stream, (uLongf *) compressed_length,
|
uncompressed_length, 6);
|
||||||
uncompressed_stream, uncompressed_length, 6);
|
if (ret) {
|
||||||
if (ret) {
|
printf("Failed compressing input with exit code %d", ret);
|
||||||
printf("Failed compressing input with exit code %d", ret);
|
return ret;
|
||||||
return ret;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
ret =
|
ret = inflate_multi_pass(compressed_stream + 2, *compressed_length - 2 - 4,
|
||||||
inflate_multi_pass(compressed_stream + 2,
|
uncompressed_test_stream, &uncompressed_test_stream_length);
|
||||||
*compressed_length - 2 - 4,
|
switch (ret) {
|
||||||
uncompressed_test_stream, &uncompressed_test_stream_length);
|
case 0:
|
||||||
switch (ret) {
|
break;
|
||||||
case 0:
|
case ISAL_END_INPUT:
|
||||||
break;
|
printf(" did not decompress all input\n");
|
||||||
case ISAL_END_INPUT:
|
return ISAL_END_INPUT;
|
||||||
printf(" did not decompress all input\n");
|
break;
|
||||||
return ISAL_END_INPUT;
|
case ISAL_INVALID_BLOCK:
|
||||||
break;
|
printf(" invalid header\n");
|
||||||
case ISAL_INVALID_BLOCK:
|
return ISAL_INVALID_BLOCK;
|
||||||
printf(" invalid header\n");
|
break;
|
||||||
return ISAL_INVALID_BLOCK;
|
case ISAL_INVALID_SYMBOL:
|
||||||
break;
|
printf(" invalid symbol\n");
|
||||||
case ISAL_INVALID_SYMBOL:
|
return ISAL_INVALID_SYMBOL;
|
||||||
printf(" invalid symbol\n");
|
break;
|
||||||
return ISAL_INVALID_SYMBOL;
|
case ISAL_OUT_OVERFLOW:
|
||||||
break;
|
printf(" out buffer overflow\n");
|
||||||
case ISAL_OUT_OVERFLOW:
|
return ISAL_OUT_OVERFLOW;
|
||||||
printf(" out buffer overflow\n");
|
break;
|
||||||
return ISAL_OUT_OVERFLOW;
|
case ISAL_INVALID_LOOKBACK:
|
||||||
break;
|
printf("Invalid lookback distance");
|
||||||
case ISAL_INVALID_LOOKBACK:
|
return ISAL_INVALID_LOOKBACK;
|
||||||
printf("Invalid lookback distance");
|
break;
|
||||||
return ISAL_INVALID_LOOKBACK;
|
default:
|
||||||
break;
|
printf(" error\n");
|
||||||
default:
|
return -1;
|
||||||
printf(" error\n");
|
break;
|
||||||
return -1;
|
}
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (uncompressed_test_stream_length != uncompressed_length) {
|
if (uncompressed_test_stream_length != uncompressed_length) {
|
||||||
printf("incorrect amount of data was decompressed from compressed data\n");
|
printf("incorrect amount of data was decompressed from compressed data\n");
|
||||||
printf("%d decompressed of %d compressed",
|
printf("%d decompressed of %d compressed", uncompressed_test_stream_length,
|
||||||
uncompressed_test_stream_length, uncompressed_length);
|
uncompressed_length);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (memcmp(uncompressed_stream, uncompressed_test_stream, uncompressed_length)) {
|
if (memcmp(uncompressed_stream, uncompressed_test_stream, uncompressed_length)) {
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < uncompressed_length; i++) {
|
for (i = 0; i < uncompressed_length; i++) {
|
||||||
if (uncompressed_stream[i] != uncompressed_test_stream[i]) {
|
if (uncompressed_stream[i] != uncompressed_test_stream[i]) {
|
||||||
printf("first error at %d, 0x%x != 0x%x\n", i,
|
printf("first error at %d, 0x%x != 0x%x\n", i,
|
||||||
uncompressed_stream[i], uncompressed_test_stream[i]);
|
uncompressed_stream[i], uncompressed_test_stream[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printf(" decompressed data is not the same as the compressed data\n");
|
printf(" decompressed data is not the same as the compressed data\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int i, j, ret = 0, fin_ret = 0;
|
int i, j, ret = 0, fin_ret = 0;
|
||||||
FILE *file = NULL;
|
FILE *file = NULL;
|
||||||
uint64_t compressed_length, file_length;
|
uint64_t compressed_length, file_length;
|
||||||
uint64_t uncompressed_length, uncompressed_test_stream_length;
|
uint64_t uncompressed_length, uncompressed_test_stream_length;
|
||||||
uint8_t *uncompressed_stream = NULL;
|
uint8_t *uncompressed_stream = NULL;
|
||||||
uint8_t *compressed_stream = NULL;
|
uint8_t *compressed_stream = NULL;
|
||||||
uint8_t *uncompressed_test_stream = NULL;
|
uint8_t *uncompressed_test_stream = NULL;
|
||||||
|
|
||||||
if (argc == 1)
|
if (argc == 1)
|
||||||
printf("Error, no input file\n");
|
printf("Error, no input file\n");
|
||||||
for (i = 1; i < argc; i++) {
|
for (i = 1; i < argc; i++) {
|
||||||
|
|
||||||
file = NULL;
|
file = NULL;
|
||||||
uncompressed_stream = NULL;
|
uncompressed_stream = NULL;
|
||||||
compressed_stream = NULL;
|
compressed_stream = NULL;
|
||||||
uncompressed_test_stream = NULL;
|
uncompressed_test_stream = NULL;
|
||||||
|
|
||||||
file = fopen(argv[i], "r");
|
file = fopen(argv[i], "r");
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
printf("Error opening file %s\n", argv[i]);
|
printf("Error opening file %s\n", argv[i]);
|
||||||
return 1;
|
return 1;
|
||||||
} else
|
} else
|
||||||
printf("Starting file %s", argv[i]);
|
printf("Starting file %s", argv[i]);
|
||||||
fflush(0);
|
fflush(0);
|
||||||
file_length = get_filesize(file);
|
file_length = get_filesize(file);
|
||||||
if (file_length > MAX_INPUT_FILE_SIZE) {
|
if (file_length > MAX_INPUT_FILE_SIZE) {
|
||||||
printf("\nFile too large to run on this test,"
|
printf("\nFile too large to run on this test,"
|
||||||
" Max 512MB for 32bit OS, 2GB for 64bit OS.\n");
|
" Max 512MB for 32bit OS, 2GB for 64bit OS.\n");
|
||||||
printf(" ... Fail\n");
|
printf(" ... Fail\n");
|
||||||
fclose(file);
|
fclose(file);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
compressed_length = compressBound(file_length);
|
compressed_length = compressBound(file_length);
|
||||||
|
|
||||||
if (file_length != 0) {
|
if (file_length != 0) {
|
||||||
uncompressed_stream = malloc(file_length);
|
uncompressed_stream = malloc(file_length);
|
||||||
uncompressed_test_stream = malloc(file_length);
|
uncompressed_test_stream = malloc(file_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
compressed_stream = malloc(compressed_length);
|
compressed_stream = malloc(compressed_length);
|
||||||
if (uncompressed_stream == NULL && file_length != 0) {
|
if (uncompressed_stream == NULL && file_length != 0) {
|
||||||
printf("\nFailed to allocate input memory\n");
|
printf("\nFailed to allocate input memory\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (compressed_stream == NULL) {
|
if (compressed_stream == NULL) {
|
||||||
printf("\nFailed to allocate output memory\n");
|
printf("\nFailed to allocate output memory\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (uncompressed_test_stream == NULL && file_length != 0) {
|
if (uncompressed_test_stream == NULL && file_length != 0) {
|
||||||
printf("\nFailed to allocate decompressed memory\n");
|
printf("\nFailed to allocate decompressed memory\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
uncompressed_length =
|
uncompressed_length = (uncompressed_stream == NULL)
|
||||||
(uncompressed_stream == NULL) ? 0 : fread(uncompressed_stream, 1,
|
? 0
|
||||||
file_length, file);
|
: fread(uncompressed_stream, 1, file_length, file);
|
||||||
uncompressed_test_stream_length = uncompressed_length;
|
uncompressed_test_stream_length = uncompressed_length;
|
||||||
ret =
|
ret = test(compressed_stream, &compressed_length, uncompressed_stream,
|
||||||
test(compressed_stream, &compressed_length, uncompressed_stream,
|
uncompressed_length, uncompressed_test_stream,
|
||||||
uncompressed_length, uncompressed_test_stream,
|
uncompressed_test_stream_length);
|
||||||
uncompressed_test_stream_length);
|
if (ret) {
|
||||||
if (ret) {
|
for (j = 0; j < compressed_length; j++) {
|
||||||
for (j = 0; j < compressed_length; j++) {
|
if ((j & 31) == 0)
|
||||||
if ((j & 31) == 0)
|
printf("\n");
|
||||||
printf("\n");
|
else
|
||||||
else
|
printf(" ");
|
||||||
printf(" ");
|
printf("0x%02x,", compressed_stream[j]);
|
||||||
printf("0x%02x,", compressed_stream[j]);
|
}
|
||||||
}
|
printf("\n");
|
||||||
printf("\n");
|
}
|
||||||
}
|
|
||||||
|
|
||||||
fflush(0);
|
fflush(0);
|
||||||
fclose(file);
|
fclose(file);
|
||||||
if (compressed_stream != NULL)
|
if (compressed_stream != NULL)
|
||||||
free(compressed_stream);
|
free(compressed_stream);
|
||||||
if (uncompressed_stream != NULL)
|
if (uncompressed_stream != NULL)
|
||||||
free(uncompressed_stream);
|
free(uncompressed_stream);
|
||||||
if (uncompressed_test_stream != NULL)
|
if (uncompressed_test_stream != NULL)
|
||||||
free(uncompressed_test_stream);
|
free(uncompressed_test_stream);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
printf(" ... Fail with exit code %d\n", ret);
|
printf(" ... Fail with exit code %d\n", ret);
|
||||||
return ret;
|
return ret;
|
||||||
} else
|
} else
|
||||||
printf(" ... Pass\n");
|
printf(" ... Pass\n");
|
||||||
fin_ret |= ret;
|
fin_ret |= ret;
|
||||||
}
|
}
|
||||||
return fin_ret;
|
return fin_ret;
|
||||||
}
|
}
|
||||||
|
@ -8,41 +8,41 @@
|
|||||||
#define MATCH_BUF_SIZE (4 * 1024)
|
#define MATCH_BUF_SIZE (4 * 1024)
|
||||||
|
|
||||||
struct hash8k_buf {
|
struct hash8k_buf {
|
||||||
uint16_t hash_table[IGZIP_HASH8K_HASH_SIZE];
|
uint16_t hash_table[IGZIP_HASH8K_HASH_SIZE];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct hash_hist_buf {
|
struct hash_hist_buf {
|
||||||
uint16_t hash_table[IGZIP_HASH_HIST_SIZE];
|
uint16_t hash_table[IGZIP_HASH_HIST_SIZE];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct hash_map_buf {
|
struct hash_map_buf {
|
||||||
uint16_t hash_table[IGZIP_HASH_MAP_HASH_SIZE];
|
uint16_t hash_table[IGZIP_HASH_MAP_HASH_SIZE];
|
||||||
struct deflate_icf *matches_next;
|
struct deflate_icf *matches_next;
|
||||||
struct deflate_icf *matches_end;
|
struct deflate_icf *matches_end;
|
||||||
struct deflate_icf matches[MATCH_BUF_SIZE];
|
struct deflate_icf matches[MATCH_BUF_SIZE];
|
||||||
struct deflate_icf overflow[ISAL_LOOK_AHEAD];
|
struct deflate_icf overflow[ISAL_LOOK_AHEAD];
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAX_LVL_BUF_SIZE sizeof(struct hash_map_buf)
|
#define MAX_LVL_BUF_SIZE sizeof(struct hash_map_buf)
|
||||||
|
|
||||||
struct level_buf {
|
struct level_buf {
|
||||||
struct hufftables_icf encode_tables;
|
struct hufftables_icf encode_tables;
|
||||||
struct isal_mod_hist hist;
|
struct isal_mod_hist hist;
|
||||||
uint32_t deflate_hdr_count;
|
uint32_t deflate_hdr_count;
|
||||||
uint32_t deflate_hdr_extra_bits;
|
uint32_t deflate_hdr_extra_bits;
|
||||||
uint8_t deflate_hdr[ISAL_DEF_MAX_HDR_SIZE];
|
uint8_t deflate_hdr[ISAL_DEF_MAX_HDR_SIZE];
|
||||||
struct deflate_icf *icf_buf_next;
|
struct deflate_icf *icf_buf_next;
|
||||||
uint64_t icf_buf_avail_out;
|
uint64_t icf_buf_avail_out;
|
||||||
struct deflate_icf *icf_buf_start;
|
struct deflate_icf *icf_buf_start;
|
||||||
union {
|
union {
|
||||||
struct hash8k_buf hash8k;
|
struct hash8k_buf hash8k;
|
||||||
struct hash_hist_buf hash_hist;
|
struct hash_hist_buf hash_hist;
|
||||||
struct hash_map_buf hash_map;
|
struct hash_map_buf hash_map;
|
||||||
|
|
||||||
struct hash8k_buf lvl1;
|
struct hash8k_buf lvl1;
|
||||||
struct hash_hist_buf lvl2;
|
struct hash_hist_buf lvl2;
|
||||||
struct hash_map_buf lvl3;
|
struct hash_map_buf lvl3;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
1379
igzip/igzip_perf.c
1379
igzip/igzip_perf.c
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -35,300 +35,303 @@
|
|||||||
#include "igzip_lib.h"
|
#include "igzip_lib.h"
|
||||||
#include "test.h"
|
#include "test.h"
|
||||||
|
|
||||||
#define MIN_BUF_SIZE (4 * 1024)
|
#define MIN_BUF_SIZE (4 * 1024)
|
||||||
#define MIN_TEST_LOOPS 10
|
#define MIN_TEST_LOOPS 10
|
||||||
#ifndef RUN_MEM_SIZE
|
#ifndef RUN_MEM_SIZE
|
||||||
# define RUN_MEM_SIZE 500000000
|
#define RUN_MEM_SIZE 500000000
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define DEFAULT_SEG_SIZE (512 * 1024)
|
#define DEFAULT_SEG_SIZE (512 * 1024)
|
||||||
#define DEFAULT_SAMPLE_SIZE (32 * 1024)
|
#define DEFAULT_SAMPLE_SIZE (32 * 1024)
|
||||||
|
|
||||||
int usage(void)
|
int
|
||||||
|
usage(void)
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Usage: igzip_semi_dynamic [options] <infile>\n"
|
"Usage: igzip_semi_dynamic [options] <infile>\n"
|
||||||
" -h help\n"
|
" -h help\n"
|
||||||
" -v (don't) validate output by inflate and compare\n"
|
" -v (don't) validate output by inflate and compare\n"
|
||||||
" -t <type> 1:stateless 0:(default)stateful\n"
|
" -t <type> 1:stateless 0:(default)stateful\n"
|
||||||
" -c <size> chunk size default=%d\n"
|
" -c <size> chunk size default=%d\n"
|
||||||
" -s <size> sample size default=%d\n"
|
" -s <size> sample size default=%d\n"
|
||||||
" -o <file> output file\n", DEFAULT_SEG_SIZE, DEFAULT_SAMPLE_SIZE);
|
" -o <file> output file\n",
|
||||||
exit(0);
|
DEFAULT_SEG_SIZE, DEFAULT_SAMPLE_SIZE);
|
||||||
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int str_to_i(char *s)
|
int
|
||||||
|
str_to_i(char *s)
|
||||||
{
|
{
|
||||||
#define ARG_MAX 32
|
#define ARG_MAX 32
|
||||||
|
|
||||||
int i = atoi(s);
|
int i = atoi(s);
|
||||||
int len = strnlen(s, ARG_MAX);
|
int len = strnlen(s, ARG_MAX);
|
||||||
if (len < 2 || len == ARG_MAX)
|
if (len < 2 || len == ARG_MAX)
|
||||||
return i;
|
return i;
|
||||||
|
|
||||||
switch (s[len - 1]) {
|
switch (s[len - 1]) {
|
||||||
case 'k':
|
case 'k':
|
||||||
i *= 1024;
|
i *= 1024;
|
||||||
break;
|
break;
|
||||||
case 'K':
|
case 'K':
|
||||||
i *= 1000;
|
i *= 1000;
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
i *= (1024 * 1024);
|
i *= (1024 * 1024);
|
||||||
break;
|
break;
|
||||||
case 'M':
|
case 'M':
|
||||||
i *= (1000 * 1000);
|
i *= (1000 * 1000);
|
||||||
break;
|
break;
|
||||||
case 'g':
|
case 'g':
|
||||||
i *= (1024 * 1024 * 1024);
|
i *= (1024 * 1024 * 1024);
|
||||||
break;
|
break;
|
||||||
case 'G':
|
case 'G':
|
||||||
i *= (1000 * 1000 * 1000);
|
i *= (1000 * 1000 * 1000);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
void semi_dyn_stateless_perf(struct isal_zstream *stream, uint8_t * inbuf,
|
void
|
||||||
uint64_t infile_size, uint8_t * outbuf, uint64_t outbuf_size,
|
semi_dyn_stateless_perf(struct isal_zstream *stream, uint8_t *inbuf, uint64_t infile_size,
|
||||||
int segment_size, int hist_size)
|
uint8_t *outbuf, uint64_t outbuf_size, int segment_size, int hist_size)
|
||||||
{
|
{
|
||||||
struct isal_huff_histogram histogram;
|
struct isal_huff_histogram histogram;
|
||||||
struct isal_hufftables hufftable;
|
struct isal_hufftables hufftable;
|
||||||
|
|
||||||
isal_deflate_stateless_init(stream);
|
isal_deflate_stateless_init(stream);
|
||||||
stream->end_of_stream = 0;
|
stream->end_of_stream = 0;
|
||||||
stream->flush = FULL_FLUSH;
|
stream->flush = FULL_FLUSH;
|
||||||
stream->next_in = inbuf;
|
stream->next_in = inbuf;
|
||||||
stream->next_out = outbuf;
|
stream->next_out = outbuf;
|
||||||
int remaining = infile_size;
|
int remaining = infile_size;
|
||||||
int chunk_size = segment_size;
|
int chunk_size = segment_size;
|
||||||
|
|
||||||
while (remaining > 0) {
|
while (remaining > 0) {
|
||||||
// Generate custom hufftables on sample
|
// Generate custom hufftables on sample
|
||||||
memset(&histogram, 0, sizeof(struct isal_huff_histogram));
|
memset(&histogram, 0, sizeof(struct isal_huff_histogram));
|
||||||
if (remaining < segment_size * 2) {
|
if (remaining < segment_size * 2) {
|
||||||
chunk_size = remaining;
|
chunk_size = remaining;
|
||||||
stream->end_of_stream = 1;
|
stream->end_of_stream = 1;
|
||||||
}
|
}
|
||||||
int hist_rem = (hist_size > chunk_size) ? chunk_size : hist_size;
|
int hist_rem = (hist_size > chunk_size) ? chunk_size : hist_size;
|
||||||
isal_update_histogram(stream->next_in, hist_rem, &histogram);
|
isal_update_histogram(stream->next_in, hist_rem, &histogram);
|
||||||
|
|
||||||
if (hist_rem == chunk_size)
|
if (hist_rem == chunk_size)
|
||||||
isal_create_hufftables_subset(&hufftable, &histogram);
|
isal_create_hufftables_subset(&hufftable, &histogram);
|
||||||
else
|
else
|
||||||
isal_create_hufftables(&hufftable, &histogram);
|
isal_create_hufftables(&hufftable, &histogram);
|
||||||
|
|
||||||
// Compress with custom table
|
// Compress with custom table
|
||||||
stream->avail_in = chunk_size;
|
stream->avail_in = chunk_size;
|
||||||
stream->avail_out = chunk_size + 8 * (1 + (chunk_size >> 16));
|
stream->avail_out = chunk_size + 8 * (1 + (chunk_size >> 16));
|
||||||
stream->hufftables = &hufftable;
|
stream->hufftables = &hufftable;
|
||||||
remaining -= chunk_size;
|
remaining -= chunk_size;
|
||||||
isal_deflate_stateless(stream);
|
isal_deflate_stateless(stream);
|
||||||
if (stream->avail_in != 0)
|
if (stream->avail_in != 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void semi_dyn_stateful_perf(struct isal_zstream *stream, uint8_t * inbuf,
|
void
|
||||||
uint64_t infile_size, uint8_t * outbuf, uint64_t outbuf_size,
|
semi_dyn_stateful_perf(struct isal_zstream *stream, uint8_t *inbuf, uint64_t infile_size,
|
||||||
int segment_size, int hist_size)
|
uint8_t *outbuf, uint64_t outbuf_size, int segment_size, int hist_size)
|
||||||
{
|
{
|
||||||
struct isal_huff_histogram histogram;
|
struct isal_huff_histogram histogram;
|
||||||
struct isal_hufftables hufftable;
|
struct isal_hufftables hufftable;
|
||||||
|
|
||||||
isal_deflate_init(stream);
|
isal_deflate_init(stream);
|
||||||
stream->end_of_stream = 0;
|
stream->end_of_stream = 0;
|
||||||
stream->flush = SYNC_FLUSH;
|
stream->flush = SYNC_FLUSH;
|
||||||
stream->next_in = inbuf;
|
stream->next_in = inbuf;
|
||||||
stream->next_out = outbuf;
|
stream->next_out = outbuf;
|
||||||
stream->avail_out = outbuf_size;
|
stream->avail_out = outbuf_size;
|
||||||
int remaining = infile_size;
|
int remaining = infile_size;
|
||||||
int chunk_size = segment_size;
|
int chunk_size = segment_size;
|
||||||
|
|
||||||
while (remaining > 0) {
|
while (remaining > 0) {
|
||||||
// Generate custom hufftables on sample
|
// Generate custom hufftables on sample
|
||||||
memset(&histogram, 0, sizeof(struct isal_huff_histogram));
|
memset(&histogram, 0, sizeof(struct isal_huff_histogram));
|
||||||
if (remaining < segment_size * 2) {
|
if (remaining < segment_size * 2) {
|
||||||
chunk_size = remaining;
|
chunk_size = remaining;
|
||||||
stream->end_of_stream = 1;
|
stream->end_of_stream = 1;
|
||||||
}
|
}
|
||||||
int hist_rem = (hist_size > chunk_size) ? chunk_size : hist_size;
|
int hist_rem = (hist_size > chunk_size) ? chunk_size : hist_size;
|
||||||
isal_update_histogram(stream->next_in, hist_rem, &histogram);
|
isal_update_histogram(stream->next_in, hist_rem, &histogram);
|
||||||
|
|
||||||
if (hist_rem == chunk_size)
|
if (hist_rem == chunk_size)
|
||||||
isal_create_hufftables_subset(&hufftable, &histogram);
|
isal_create_hufftables_subset(&hufftable, &histogram);
|
||||||
else
|
else
|
||||||
isal_create_hufftables(&hufftable, &histogram);
|
isal_create_hufftables(&hufftable, &histogram);
|
||||||
|
|
||||||
// Compress with custom table
|
// Compress with custom table
|
||||||
stream->avail_in = chunk_size;
|
stream->avail_in = chunk_size;
|
||||||
stream->hufftables = &hufftable;
|
stream->hufftables = &hufftable;
|
||||||
remaining -= chunk_size;
|
remaining -= chunk_size;
|
||||||
isal_deflate(stream);
|
isal_deflate(stream);
|
||||||
if (stream->internal_state.state != ZSTATE_NEW_HDR)
|
if (stream->internal_state.state != ZSTATE_NEW_HDR)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
FILE *in = stdin, *out = NULL;
|
FILE *in = stdin, *out = NULL;
|
||||||
unsigned char *inbuf, *outbuf;
|
unsigned char *inbuf, *outbuf;
|
||||||
int i = 0, c;
|
int i = 0, c;
|
||||||
uint64_t infile_size, outbuf_size;
|
uint64_t infile_size, outbuf_size;
|
||||||
int segment_size = DEFAULT_SEG_SIZE;
|
int segment_size = DEFAULT_SEG_SIZE;
|
||||||
int sample_size = DEFAULT_SAMPLE_SIZE;
|
int sample_size = DEFAULT_SAMPLE_SIZE;
|
||||||
int check_output = 1;
|
int check_output = 1;
|
||||||
int do_stateless = 0, do_stateful = 1;
|
int do_stateless = 0, do_stateful = 1;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
char *out_file_name = NULL;
|
char *out_file_name = NULL;
|
||||||
struct isal_zstream stream;
|
struct isal_zstream stream;
|
||||||
|
|
||||||
while ((c = getopt(argc, argv, "vht:c:s:o:")) != -1) {
|
while ((c = getopt(argc, argv, "vht:c:s:o:")) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'v':
|
case 'v':
|
||||||
check_output ^= 1;
|
check_output ^= 1;
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
if (atoi(optarg) == 1) {
|
if (atoi(optarg) == 1) {
|
||||||
do_stateful = 0;
|
do_stateful = 0;
|
||||||
do_stateless = 1;
|
do_stateless = 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'c':
|
case 'c':
|
||||||
segment_size = str_to_i(optarg);
|
segment_size = str_to_i(optarg);
|
||||||
break;
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
sample_size = str_to_i(optarg);
|
sample_size = str_to_i(optarg);
|
||||||
break;
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
out_file_name = optarg;
|
out_file_name = optarg;
|
||||||
break;
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
default:
|
default:
|
||||||
usage();
|
usage();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open input file
|
// Open input file
|
||||||
if (optind < argc) {
|
if (optind < argc) {
|
||||||
if (!(in = fopen(argv[optind], "rb"))) {
|
if (!(in = fopen(argv[optind], "rb"))) {
|
||||||
fprintf(stderr, "Can't open %s for reading\n", argv[optind]);
|
fprintf(stderr, "Can't open %s for reading\n", argv[optind]);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
usage();
|
usage();
|
||||||
|
|
||||||
// Optionally open output file
|
// Optionally open output file
|
||||||
if (out_file_name != NULL) {
|
if (out_file_name != NULL) {
|
||||||
if (!(out = fopen(out_file_name, "wb"))) {
|
if (!(out = fopen(out_file_name, "wb"))) {
|
||||||
fprintf(stderr, "Can't open %s for writing\n", out_file_name);
|
fprintf(stderr, "Can't open %s for writing\n", out_file_name);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Window Size: %d K\n", IGZIP_HIST_SIZE / 1024);
|
printf("Window Size: %d K\n", IGZIP_HIST_SIZE / 1024);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocate space for entire input file and output
|
* Allocate space for entire input file and output
|
||||||
* (assuming some possible expansion on output size)
|
* (assuming some possible expansion on output size)
|
||||||
*/
|
*/
|
||||||
infile_size = get_filesize(in);
|
infile_size = get_filesize(in);
|
||||||
if (infile_size == 0) {
|
if (infile_size == 0) {
|
||||||
printf("Input file has zero length\n");
|
printf("Input file has zero length\n");
|
||||||
usage();
|
usage();
|
||||||
}
|
}
|
||||||
|
|
||||||
outbuf_size = infile_size * 1.30 > MIN_BUF_SIZE ? infile_size * 1.30 : MIN_BUF_SIZE;
|
outbuf_size = infile_size * 1.30 > MIN_BUF_SIZE ? infile_size * 1.30 : MIN_BUF_SIZE;
|
||||||
|
|
||||||
if (NULL == (inbuf = malloc(infile_size))) {
|
if (NULL == (inbuf = malloc(infile_size))) {
|
||||||
fprintf(stderr, "Can't allocate input buffer memory\n");
|
fprintf(stderr, "Can't allocate input buffer memory\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
if (NULL == (outbuf = malloc(outbuf_size))) {
|
if (NULL == (outbuf = malloc(outbuf_size))) {
|
||||||
fprintf(stderr, "Can't allocate output buffer memory\n");
|
fprintf(stderr, "Can't allocate output buffer memory\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int hist_size = sample_size > segment_size ? segment_size : sample_size;
|
int hist_size = sample_size > segment_size ? segment_size : sample_size;
|
||||||
|
|
||||||
printf("semi-dynamic sample=%d segment=%d %s\n", hist_size, segment_size,
|
printf("semi-dynamic sample=%d segment=%d %s\n", hist_size, segment_size,
|
||||||
do_stateful ? "stateful" : "stateless");
|
do_stateful ? "stateful" : "stateless");
|
||||||
printf("igzip_file_perf: %s\n", argv[optind]);
|
printf("igzip_file_perf: %s\n", argv[optind]);
|
||||||
|
|
||||||
// Read complete input file into buffer
|
// Read complete input file into buffer
|
||||||
stream.avail_in = (uint32_t) fread(inbuf, 1, infile_size, in);
|
stream.avail_in = (uint32_t) fread(inbuf, 1, infile_size, in);
|
||||||
if (stream.avail_in != infile_size) {
|
if (stream.avail_in != infile_size) {
|
||||||
fprintf(stderr, "Couldn't fit all of input file into buffer\n");
|
fprintf(stderr, "Couldn't fit all of input file into buffer\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct perf start;
|
struct perf start;
|
||||||
|
|
||||||
if (do_stateful) {
|
if (do_stateful) {
|
||||||
BENCHMARK(&start, BENCHMARK_TIME,
|
BENCHMARK(&start, BENCHMARK_TIME,
|
||||||
semi_dyn_stateful_perf(&stream, inbuf, infile_size, outbuf,
|
semi_dyn_stateful_perf(&stream, inbuf, infile_size, outbuf, outbuf_size,
|
||||||
outbuf_size, segment_size, hist_size)
|
segment_size, hist_size));
|
||||||
);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (do_stateless) {
|
if (do_stateless) {
|
||||||
BENCHMARK(&start, BENCHMARK_TIME,
|
BENCHMARK(&start, BENCHMARK_TIME,
|
||||||
semi_dyn_stateless_perf(&stream, inbuf, infile_size, outbuf,
|
semi_dyn_stateless_perf(&stream, inbuf, infile_size, outbuf, outbuf_size,
|
||||||
outbuf_size, segment_size, hist_size));
|
segment_size, hist_size));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stream.avail_in != 0) {
|
if (stream.avail_in != 0) {
|
||||||
printf("Could not compress all of inbuf\n");
|
printf("Could not compress all of inbuf\n");
|
||||||
ret = 1;
|
ret = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf(" file %s - in_size=%lu out_size=%d iter=%d ratio=%3.1f%%\n", argv[optind],
|
printf(" file %s - in_size=%lu out_size=%d iter=%d ratio=%3.1f%%\n", argv[optind],
|
||||||
infile_size, stream.total_out, i, 100.0 * stream.total_out / infile_size);
|
infile_size, stream.total_out, i, 100.0 * stream.total_out / infile_size);
|
||||||
|
|
||||||
printf("igzip_semi_dyn_file: ");
|
printf("igzip_semi_dyn_file: ");
|
||||||
perf_print(start, (long long)infile_size);
|
perf_print(start, (long long) infile_size);
|
||||||
|
|
||||||
if (out != NULL) {
|
if (out != NULL) {
|
||||||
printf("writing %s\n", out_file_name);
|
printf("writing %s\n", out_file_name);
|
||||||
fwrite(outbuf, 1, stream.total_out, out);
|
fwrite(outbuf, 1, stream.total_out, out);
|
||||||
fclose(out);
|
fclose(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(in);
|
fclose(in);
|
||||||
|
|
||||||
if (check_output) {
|
if (check_output) {
|
||||||
unsigned char *inflate_buf;
|
unsigned char *inflate_buf;
|
||||||
struct inflate_state istate;
|
struct inflate_state istate;
|
||||||
|
|
||||||
if (NULL == (inflate_buf = malloc(infile_size))) {
|
if (NULL == (inflate_buf = malloc(infile_size))) {
|
||||||
fprintf(stderr, "Can't allocate reconstruct buffer memory\n");
|
fprintf(stderr, "Can't allocate reconstruct buffer memory\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
isal_inflate_init(&istate);
|
isal_inflate_init(&istate);
|
||||||
istate.next_in = outbuf;
|
istate.next_in = outbuf;
|
||||||
istate.avail_in = stream.total_out;
|
istate.avail_in = stream.total_out;
|
||||||
istate.next_out = inflate_buf;
|
istate.next_out = inflate_buf;
|
||||||
istate.avail_out = infile_size;
|
istate.avail_out = infile_size;
|
||||||
int check = isal_inflate(&istate);
|
int check = isal_inflate(&istate);
|
||||||
|
|
||||||
if (memcmp(inflate_buf, inbuf, infile_size)) {
|
if (memcmp(inflate_buf, inbuf, infile_size)) {
|
||||||
printf("inflate check Fail\n");
|
printf("inflate check Fail\n");
|
||||||
printf(" ret %d total_inflate=%d\n", check, istate.total_out);
|
printf(" ret %d total_inflate=%d\n", check, istate.total_out);
|
||||||
for (i = 0; i < infile_size; i++) {
|
for (i = 0; i < infile_size; i++) {
|
||||||
if (inbuf[i] != inflate_buf[i]) {
|
if (inbuf[i] != inflate_buf[i]) {
|
||||||
printf(" first diff at offset=%d\n", i);
|
printf(" first diff at offset=%d\n", i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret = 1;
|
ret = 1;
|
||||||
} else
|
} else
|
||||||
printf("inflate check Pass\n");
|
printf("inflate check Pass\n");
|
||||||
free(inflate_buf);
|
free(inflate_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("End of igzip_semi_dyn_file_perf\n\n");
|
printf("End of igzip_semi_dyn_file_perf\n\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -36,51 +36,52 @@
|
|||||||
|
|
||||||
struct isal_zstream stream;
|
struct isal_zstream stream;
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
uint8_t inbuf[BUF_SIZE], outbuf[BUF_SIZE];
|
uint8_t inbuf[BUF_SIZE], outbuf[BUF_SIZE];
|
||||||
FILE *in, *out;
|
FILE *in, *out;
|
||||||
|
|
||||||
if (argc != 3) {
|
if (argc != 3) {
|
||||||
fprintf(stderr, "Usage: igzip_sync_flush_example infile outfile\n");
|
fprintf(stderr, "Usage: igzip_sync_flush_example infile outfile\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
in = fopen(argv[1], "rb");
|
in = fopen(argv[1], "rb");
|
||||||
if (!in) {
|
if (!in) {
|
||||||
fprintf(stderr, "Can't open %s for reading\n", argv[1]);
|
fprintf(stderr, "Can't open %s for reading\n", argv[1]);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
out = fopen(argv[2], "wb");
|
out = fopen(argv[2], "wb");
|
||||||
if (!out) {
|
if (!out) {
|
||||||
fprintf(stderr, "Can't open %s for writing\n", argv[2]);
|
fprintf(stderr, "Can't open %s for writing\n", argv[2]);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("igzip_sync_flush_example\nWindow Size: %d K\n", IGZIP_HIST_SIZE / 1024);
|
printf("igzip_sync_flush_example\nWindow Size: %d K\n", IGZIP_HIST_SIZE / 1024);
|
||||||
fflush(0);
|
fflush(0);
|
||||||
|
|
||||||
isal_deflate_init(&stream);
|
isal_deflate_init(&stream);
|
||||||
stream.end_of_stream = 0;
|
stream.end_of_stream = 0;
|
||||||
stream.flush = SYNC_FLUSH;
|
stream.flush = SYNC_FLUSH;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (stream.internal_state.state == ZSTATE_NEW_HDR) {
|
if (stream.internal_state.state == ZSTATE_NEW_HDR) {
|
||||||
stream.avail_in = (uint32_t) fread(inbuf, 1, BUF_SIZE, in);
|
stream.avail_in = (uint32_t) fread(inbuf, 1, BUF_SIZE, in);
|
||||||
stream.end_of_stream = feof(in) ? 1 : 0;
|
stream.end_of_stream = feof(in) ? 1 : 0;
|
||||||
stream.next_in = inbuf;
|
stream.next_in = inbuf;
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
stream.avail_out = BUF_SIZE;
|
stream.avail_out = BUF_SIZE;
|
||||||
stream.next_out = outbuf;
|
stream.next_out = outbuf;
|
||||||
isal_deflate(&stream);
|
isal_deflate(&stream);
|
||||||
fwrite(outbuf, 1, BUF_SIZE - stream.avail_out, out);
|
fwrite(outbuf, 1, BUF_SIZE - stream.avail_out, out);
|
||||||
} while (stream.avail_out == 0);
|
} while (stream.avail_out == 0);
|
||||||
|
|
||||||
} while (stream.internal_state.state != ZSTATE_END);
|
} while (stream.internal_state.state != ZSTATE_END);
|
||||||
|
|
||||||
fclose(out);
|
fclose(out);
|
||||||
fclose(in);
|
fclose(in);
|
||||||
|
|
||||||
printf("End of igzip_sync_flush_example\n\n");
|
printf("End of igzip_sync_flush_example\n\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -31,22 +31,22 @@
|
|||||||
|
|
||||||
#define DEFLATE_METHOD 8
|
#define DEFLATE_METHOD 8
|
||||||
#define ZLIB_DICT_FLAG (1 << 5)
|
#define ZLIB_DICT_FLAG (1 << 5)
|
||||||
#define TEXT_FLAG (1 << 0)
|
#define TEXT_FLAG (1 << 0)
|
||||||
#define HCRC_FLAG (1 << 1)
|
#define HCRC_FLAG (1 << 1)
|
||||||
#define EXTRA_FLAG (1 << 2)
|
#define EXTRA_FLAG (1 << 2)
|
||||||
#define NAME_FLAG (1 << 3)
|
#define NAME_FLAG (1 << 3)
|
||||||
#define COMMENT_FLAG (1 << 4)
|
#define COMMENT_FLAG (1 << 4)
|
||||||
#define UNDEFINED_FLAG (-1)
|
#define UNDEFINED_FLAG (-1)
|
||||||
|
|
||||||
#define GZIP_HDR_BASE 10
|
#define GZIP_HDR_BASE 10
|
||||||
#define GZIP_EXTRA_LEN 2
|
#define GZIP_EXTRA_LEN 2
|
||||||
#define GZIP_HCRC_LEN 2
|
#define GZIP_HCRC_LEN 2
|
||||||
#define GZIP_TRAILER_LEN 8
|
#define GZIP_TRAILER_LEN 8
|
||||||
|
|
||||||
#define ZLIB_HDR_BASE 2
|
#define ZLIB_HDR_BASE 2
|
||||||
#define ZLIB_DICT_LEN 4
|
#define ZLIB_DICT_LEN 4
|
||||||
#define ZLIB_INFO_OFFSET 4
|
#define ZLIB_INFO_OFFSET 4
|
||||||
#define ZLIB_LEVEL_OFFSET 6
|
#define ZLIB_LEVEL_OFFSET 6
|
||||||
#define ZLIB_TRAILER_LEN 4
|
#define ZLIB_TRAILER_LEN 4
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -31,55 +31,56 @@
|
|||||||
#include "huff_codes.h"
|
#include "huff_codes.h"
|
||||||
#include "unaligned.h"
|
#include "unaligned.h"
|
||||||
|
|
||||||
static inline void heapify(uint64_t * heap, uint64_t heap_size, uint64_t index)
|
static inline void
|
||||||
|
heapify(uint64_t *heap, uint64_t heap_size, uint64_t index)
|
||||||
{
|
{
|
||||||
uint64_t child = 2 * index, tmp;
|
uint64_t child = 2 * index, tmp;
|
||||||
while (child <= heap_size) {
|
while (child <= heap_size) {
|
||||||
child = (heap[child] <= heap[child + 1]) ? child : child + 1;
|
child = (heap[child] <= heap[child + 1]) ? child : child + 1;
|
||||||
|
|
||||||
if (heap[index] > heap[child]) {
|
if (heap[index] > heap[child]) {
|
||||||
tmp = heap[index];
|
tmp = heap[index];
|
||||||
heap[index] = heap[child];
|
heap[index] = heap[child];
|
||||||
heap[child] = tmp;
|
heap[child] = tmp;
|
||||||
index = child;
|
index = child;
|
||||||
child = 2 * index;
|
child = 2 * index;
|
||||||
} else
|
} else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void build_heap(uint64_t * heap, uint64_t heap_size)
|
void
|
||||||
|
build_heap(uint64_t *heap, uint64_t heap_size)
|
||||||
{
|
{
|
||||||
uint64_t i;
|
uint64_t i;
|
||||||
heap[heap_size + 1] = -1;
|
heap[heap_size + 1] = -1;
|
||||||
for (i = heap_size / 2; i > 0; i--)
|
for (i = heap_size / 2; i > 0; i--)
|
||||||
heapify(heap, heap_size, i);
|
heapify(heap, heap_size, i);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t build_huff_tree(struct heap_tree *heap_space, uint64_t heap_size, uint64_t node_ptr)
|
uint32_t
|
||||||
|
build_huff_tree(struct heap_tree *heap_space, uint64_t heap_size, uint64_t node_ptr)
|
||||||
{
|
{
|
||||||
uint64_t *heap = (uint64_t *) heap_space;
|
uint64_t *heap = (uint64_t *) heap_space;
|
||||||
uint64_t h1, h2;
|
uint64_t h1, h2;
|
||||||
|
|
||||||
while (heap_size > 1) {
|
while (heap_size > 1) {
|
||||||
h1 = heap[1];
|
h1 = heap[1];
|
||||||
heap[1] = heap[heap_size];
|
heap[1] = heap[heap_size];
|
||||||
heap[heap_size--] = -1;
|
heap[heap_size--] = -1;
|
||||||
|
|
||||||
heapify(heap, heap_size, 1);
|
heapify(heap, heap_size, 1);
|
||||||
|
|
||||||
h2 = heap[1];
|
h2 = heap[1];
|
||||||
heap[1] = ((h1 + h2) & ~0xFFFFull) | node_ptr;
|
heap[1] = ((h1 + h2) & ~0xFFFFull) | node_ptr;
|
||||||
|
|
||||||
heapify(heap, heap_size, 1);
|
heapify(heap, heap_size, 1);
|
||||||
|
|
||||||
store_native_u16_to_u64(&heap[node_ptr], h1);
|
store_native_u16_to_u64(&heap[node_ptr], h1);
|
||||||
store_native_u16_to_u64(&heap[node_ptr - 1], h2);
|
store_native_u16_to_u64(&heap[node_ptr - 1], h2);
|
||||||
node_ptr -= 2;
|
node_ptr -= 2;
|
||||||
|
}
|
||||||
}
|
h1 = heap[1];
|
||||||
h1 = heap[1];
|
store_native_u16_to_u64(&heap[node_ptr], h1);
|
||||||
store_native_u16_to_u64(&heap[node_ptr], h1);
|
return node_ptr;
|
||||||
return node_ptr;
|
|
||||||
}
|
}
|
||||||
|
@ -30,25 +30,25 @@
|
|||||||
#define _IGZIP_REPEATED_8K_CHAR_RESULT_H_
|
#define _IGZIP_REPEATED_8K_CHAR_RESULT_H_
|
||||||
|
|
||||||
/* The code for the literal being encoded */
|
/* The code for the literal being encoded */
|
||||||
#define CODE_LIT 0x1
|
#define CODE_LIT 0x1
|
||||||
#define CODE_LIT_LENGTH 0x2
|
#define CODE_LIT_LENGTH 0x2
|
||||||
|
|
||||||
/* The code for repeat 10. The Length includes the distance code length*/
|
/* The code for repeat 10. The Length includes the distance code length*/
|
||||||
#define CODE_10 0x3
|
#define CODE_10 0x3
|
||||||
#define CODE_10_LENGTH 0x4
|
#define CODE_10_LENGTH 0x4
|
||||||
|
|
||||||
/* The code for repeat 115-130. The Length includes the distance code length*/
|
/* The code for repeat 115-130. The Length includes the distance code length*/
|
||||||
#define CODE_280 0x0f
|
#define CODE_280 0x0f
|
||||||
#define CODE_280_LENGTH 0x4
|
#define CODE_280_LENGTH 0x4
|
||||||
#define CODE_280_TOTAL_LENGTH CODE_280_LENGTH + 4 + 1
|
#define CODE_280_TOTAL_LENGTH CODE_280_LENGTH + 4 + 1
|
||||||
|
|
||||||
/* Code representing the end of block. */
|
/* Code representing the end of block. */
|
||||||
#define END_OF_BLOCK 0x7
|
#define END_OF_BLOCK 0x7
|
||||||
#define END_OF_BLOCK_LEN 0x4
|
#define END_OF_BLOCK_LEN 0x4
|
||||||
|
|
||||||
/* MIN_REPEAT_LEN currently optimizes storage space, another possibility is to
|
/* MIN_REPEAT_LEN currently optimizes storage space, another possibility is to
|
||||||
* find the size which optimizes speed instead.*/
|
* find the size which optimizes speed instead.*/
|
||||||
#define MIN_REPEAT_LEN 4*1024
|
#define MIN_REPEAT_LEN 4 * 1024
|
||||||
|
|
||||||
#define HEADER_LENGTH 16
|
#define HEADER_LENGTH 16
|
||||||
|
|
||||||
@ -56,12 +56,11 @@
|
|||||||
* smaller than 258 */
|
* smaller than 258 */
|
||||||
#define MAX_FIXUP_CODE_LENGTH 8
|
#define MAX_FIXUP_CODE_LENGTH 8
|
||||||
|
|
||||||
|
|
||||||
/* Headers for constant 0x00 and 0xFF blocks
|
/* Headers for constant 0x00 and 0xFF blocks
|
||||||
* This also contains the first literal character. */
|
* This also contains the first literal character. */
|
||||||
const uint32_t repeated_char_header[2][5] = {
|
const uint32_t repeated_char_header[2][5] = {
|
||||||
{ 0x0121c0ec, 0xc30c0000, 0x7d57fab0, 0x49270938}, /* Deflate header for 0x00 */
|
{ 0x0121c0ec, 0xc30c0000, 0x7d57fab0, 0x49270938 }, /* Deflate header for 0x00 */
|
||||||
{ 0x0121c0ec, 0xc30c0000, 0x7baaff30, 0x49270938} /* Deflate header for 0xFF */
|
{ 0x0121c0ec, 0xc30c0000, 0x7baaff30, 0x49270938 } /* Deflate header for 0xFF */
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user