X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=include%2Fwimlib%2Flz_extend.h;h=2fb76bc921d47c5b1986c087b1e12e24cd7b62ac;hp=7d7cd05bd651dc0f944e3d1017c22f00962df86a;hb=0ec3ead8ebd29703e12342c56b282ae37b188e6d;hpb=6c6aa5b718a33947c13d064fb45bff06e6872e2d diff --git a/include/wimlib/lz_extend.h b/include/wimlib/lz_extend.h index 7d7cd05b..2fb76bc9 100644 --- a/include/wimlib/lz_extend.h +++ b/include/wimlib/lz_extend.h @@ -1,13 +1,21 @@ /* - * lz_extend.h + * lz_extend.h - fast match extension for Lempel-Ziv matchfinding * - * Fast match extension for Lempel-Ziv matchfinding. + * The following copying information applies to this specific source code file: * - * Author: Eric Biggers - * Year: 2014, 2015 + * Written in 2014-2016 by Eric Biggers * - * The author dedicates this file to the public domain. - * You can do whatever you want with this file. + * 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 + * worldwide via the Creative Commons Zero 1.0 Universal Public Domain + * Dedication (the "CC0"). + * + * This software is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the CC0 for more details. + * + * You should have received a copy of the CC0 along with this software; if not + * see . */ #ifndef _WIMLIB_LZ_EXTEND_H @@ -16,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. */ +/* + * 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 inline 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 + WORDSIZE <= 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 += ffsw(v) >> 3; + else + len += (8 * WORDSIZE - 1 - flsw(v)) >> 3; + return len; } + 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 += (8 * WORDSIZE - 1 - flsw(v_word)) >> 3; - return len; } #endif /* _WIMLIB_LZ_EXTEND_H */