diff --git a/src/bt_matchfinder.h b/src/bt_matchfinder.h index 9ef6e7e..62ca635 100644 --- a/src/bt_matchfinder.h +++ b/src/bt_matchfinder.h @@ -47,7 +47,6 @@ #include "matchfinder_common.h" -#include "lz_extend.h" #define BT_MATCHFINDER_HASH3_ORDER 15 #define BT_MATCHFINDER_HASH3_WAYS 1 diff --git a/src/hc_matchfinder.h b/src/hc_matchfinder.h index 1c22046..9b53477 100644 --- a/src/hc_matchfinder.h +++ b/src/hc_matchfinder.h @@ -87,9 +87,7 @@ * ---------------------------------------------------------------------------- */ -#include "lz_extend.h" #include "matchfinder_common.h" -#include "unaligned.h" #define HC_MATCHFINDER_HASH3_ORDER 15 #define HC_MATCHFINDER_HASH4_ORDER 16 diff --git a/src/lz_extend.h b/src/lz_extend.h deleted file mode 100644 index b122e66..0000000 --- a/src/lz_extend.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * lz_extend.h - fast match extension for Lempel-Ziv matchfinding - */ - -#pragma once - -#include "bitops.h" -#include "unaligned.h" - -/* - * Return the number of bytes at @matchptr that match the bytes at @strptr, up - * to a maximum of @max_len. Initially, @start_len bytes are matched. - */ -static forceinline unsigned -lz_extend(const u8 * const strptr, const u8 * const matchptr, - const unsigned start_len, const unsigned max_len) -{ - unsigned len = start_len; - machine_word_t v_word; - - if (UNALIGNED_ACCESS_IS_FAST) { - - if (likely(max_len - len >= 4 * WORDSIZE)) { - - #define COMPARE_WORD_STEP \ - v_word = load_word_unaligned(&matchptr[len]) ^ \ - load_word_unaligned(&strptr[len]); \ - if (v_word != 0) \ - goto word_differs; \ - len += WORDSIZE; \ - - COMPARE_WORD_STEP - COMPARE_WORD_STEP - COMPARE_WORD_STEP - COMPARE_WORD_STEP - #undef COMPARE_WORD_STEP - } - - while (len + WORDSIZE <= max_len) { - v_word = load_word_unaligned(&matchptr[len]) ^ - load_word_unaligned(&strptr[len]); - if (v_word != 0) - goto word_differs; - len += WORDSIZE; - } - } - - while (len < max_len && matchptr[len] == strptr[len]) - len++; - return len; - -word_differs: - if (CPU_IS_LITTLE_ENDIAN()) - len += (ffsw(v_word) >> 3); - else - len += (flsw(v_word) >> 3); - return len; -} diff --git a/src/matchfinder_common.h b/src/matchfinder_common.h index bb17d1a..2858d5a 100644 --- a/src/matchfinder_common.h +++ b/src/matchfinder_common.h @@ -4,6 +4,8 @@ #pragma once +#include "bitops.h" +#include "unaligned.h" #include "util.h" #ifndef MATCHFINDER_WINDOW_ORDER @@ -131,3 +133,53 @@ lz_hash(u32 seq, unsigned num_bits) { return (u32)(seq * 0x1E35A7BD) >> (32 - num_bits); } + +/* + * Return the number of bytes at @matchptr that match the bytes at @strptr, up + * to a maximum of @max_len. Initially, @start_len bytes are matched. + */ +static forceinline unsigned +lz_extend(const u8 * const strptr, const u8 * const matchptr, + const unsigned start_len, const unsigned max_len) +{ + unsigned len = start_len; + machine_word_t v_word; + + if (UNALIGNED_ACCESS_IS_FAST) { + + if (likely(max_len - len >= 4 * WORDSIZE)) { + + #define COMPARE_WORD_STEP \ + v_word = load_word_unaligned(&matchptr[len]) ^ \ + load_word_unaligned(&strptr[len]); \ + if (v_word != 0) \ + goto word_differs; \ + len += WORDSIZE; \ + + COMPARE_WORD_STEP + COMPARE_WORD_STEP + COMPARE_WORD_STEP + COMPARE_WORD_STEP + #undef COMPARE_WORD_STEP + } + + while (len + WORDSIZE <= max_len) { + v_word = load_word_unaligned(&matchptr[len]) ^ + load_word_unaligned(&strptr[len]); + if (v_word != 0) + goto word_differs; + len += WORDSIZE; + } + } + + while (len < max_len && matchptr[len] == strptr[len]) + len++; + return len; + +word_differs: + if (CPU_IS_LITTLE_ENDIAN()) + len += (ffsw(v_word) >> 3); + else + len += (flsw(v_word) >> 3); + return len; +}