X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=include%2Fwimlib%2Flz_extend.h;h=26f0ce5cd11be42f76bbee3508d16e6c119d9772;hp=858cb9a3b1f791edccbb6f2663f71fc8a3eb3983;hb=4a20aae0dd8469a352517a0b107416ffa99ccc55;hpb=eb3e3b72db23ecaa7789a807afeb9577962653fe diff --git a/include/wimlib/lz_extend.h b/include/wimlib/lz_extend.h index 858cb9a3..26f0ce5c 100644 --- a/include/wimlib/lz_extend.h +++ b/include/wimlib/lz_extend.h @@ -3,7 +3,7 @@ * * The following copying information applies to this specific source code file: * - * Written in 2014-2015 by Eric Biggers + * Written in 2014-2016 by Eric Biggers * * To the extent possible under law, the author(s) have dedicated all copyright * and related and neighboring rights to this software to the public domain @@ -24,52 +24,30 @@ #include "wimlib/bitops.h" #include "wimlib/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 inline u32 +/* + * Return the number of bytes at @matchptr that match the bytes at @strptr, up + * to a maximum of @max_len. Initially, @len bytes are matched. + */ +static forceinline u32 lz_extend(const u8 * const strptr, const u8 * const matchptr, - const u32 start_len, const u32 max_len) + u32 len, const u32 max_len) { - u32 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 (UNALIGNED_ACCESS_IS_FAST && len + WORDBYTES <= max_len) { + machine_word_t v = load_word_unaligned(matchptr + len) ^ + load_word_unaligned(strptr + len); + if (v != 0) { + if (CPU_IS_LITTLE_ENDIAN) + len += bsfw(v) >> 3; + else + len += (WORDBITS - 1 - bsrw(v)) >> 3; + return len; } + len += WORDBYTES; } 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 += (8 * WORDSIZE - 1 - flsw(v_word)) >> 3; - return len; } #endif /* _WIMLIB_LZ_EXTEND_H */