# include <x86intrin.h>
#endif
-#ifndef IGZIP_USE_GZIP_FORMAT
-# define DEFLATE 1
-#endif
-
-
-extern uint32_t CrcTable[256];
-
static inline uint32_t bsr(uint32_t val)
{
uint32_t msb;
static void compute_dist_code(struct isal_hufftables *hufftables, uint16_t dist, uint64_t *p_code, uint64_t *p_len)
{
- assert(dist > DIST_TABLE_SIZE);
+ assert(dist > IGZIP_DIST_TABLE_SIZE);
dist -= 1;
uint32_t msb;
dist >>= num_extra_bits;
sym = dist + 2 * num_extra_bits;
assert(sym < 30);
- code = hufftables->dcodes[sym - DECODE_OFFSET];
- len = hufftables->dcodes_sizes[sym - DECODE_OFFSET];
+ code = hufftables->dcodes[sym - IGZIP_DECODE_OFFSET];
+ len = hufftables->dcodes_sizes[sym - IGZIP_DECODE_OFFSET];
*p_code = code | (extra_bits << len);
*p_len = len + num_extra_bits;
}
dist = 0;
assert(dist >= 1);
assert(dist <= 32768);
- if (dist <= DIST_TABLE_SIZE) {
+ if (dist <= IGZIP_DIST_TABLE_SIZE) {
uint64_t code_len;
code_len = hufftables->dist_table[dist - 1];
*code = code_len >> 5;
*len = hufftables->lit_table_sizes[lit];
}
+static void compute_dist_icf_code(uint32_t dist, uint32_t *code, uint32_t *extra_bits)
+{
+ uint32_t msb;
+ uint32_t num_extra_bits;
+
+ dist -= 1;
+ msb = bsr(dist);
+ assert(msb >= 1);
+ num_extra_bits = msb - 2;
+ *extra_bits = dist & ((1 << num_extra_bits) - 1);
+ dist >>= num_extra_bits;
+ *code = dist + 2 * num_extra_bits;
+ assert(*code < 30);
+}
+
+static inline void get_dist_icf_code(uint32_t dist, uint32_t *code, uint32_t *extra_bits)
+{
+ assert(dist >= 1);
+ assert(dist <= 32768);
+ if (dist <= 2) {
+ *code = dist - 1;
+ *extra_bits = 0;
+ } else {
+ compute_dist_icf_code(dist, code, extra_bits);
+ }
+}
+
+static inline void get_len_icf_code(uint32_t length, uint32_t *code)
+{
+ assert(length >= 3);
+ assert(length <= 258);
+
+ *code = length + 254;
+}
+
+static inline void get_lit_icf_code(uint32_t lit, uint32_t *code)
+{
+ assert(lit <= 256);
+
+ *code = lit;
+}
+
/**
* @brief Returns a hash of the first 3 bytes of input data.
*/
static inline uint32_t compute_hash(uint32_t data)
{
- data &= 0x00FFFFFF;
-#ifdef __SSE4_1__
+#ifdef __SSE4_2__
return _mm_crc32_u32(0, data);
/* Use multiplication to create a hash, 0xBDD06057 is a prime number */
return ((uint64_t)data * 0xB2D06057) >> 16;
-#endif /* __SSE4_1__ */
+#endif /* __SSE4_2__ */
}
return count;
}
-
-static inline void update_crc(uint32_t* crc, uint8_t * start, uint32_t length)
-{
-#ifndef DEFLATE
- uint8_t *end = start + length;
-
- while (start < end)
- *crc = (*crc >> 8) ^ CrcTable[(*crc & 0x000000FF) ^ *start++];
-#else
- return;
-#endif
-}
-