mirror of
https://github.com/facebook/zstd.git
synced 2025-10-09 00:05:28 -04:00
Hoist Hash Table Writes Up into Each Match Found Block
Refactoring this way avoids the bad write in the case that `step > 4`, and is a bit more straightforward. It also seems to perform better!
This commit is contained in:
parent
040986a4f4
commit
cd1f582943
@ -182,6 +182,10 @@ _start: /* Requires: ip0 */
|
|||||||
match0 -= mLength;
|
match0 -= mLength;
|
||||||
offcode = REPCODE1_TO_OFFBASE;
|
offcode = REPCODE1_TO_OFFBASE;
|
||||||
mLength += 4;
|
mLength += 4;
|
||||||
|
|
||||||
|
/* first write next hash table entry; we've already calculated it */
|
||||||
|
hashTable[hash1] = (U32)(ip1 - base);
|
||||||
|
|
||||||
goto _match;
|
goto _match;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -195,6 +199,10 @@ _start: /* Requires: ip0 */
|
|||||||
/* check match at ip[0] */
|
/* check match at ip[0] */
|
||||||
if (MEM_read32(ip0) == mval) {
|
if (MEM_read32(ip0) == mval) {
|
||||||
/* found a match! */
|
/* found a match! */
|
||||||
|
|
||||||
|
/* first write next hash table entry; we've already calculated it */
|
||||||
|
hashTable[hash1] = (U32)(ip1 - base);
|
||||||
|
|
||||||
goto _offset;
|
goto _offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -224,7 +232,9 @@ _start: /* Requires: ip0 */
|
|||||||
/* check match at ip[0] */
|
/* check match at ip[0] */
|
||||||
if (MEM_read32(ip0) == mval) {
|
if (MEM_read32(ip0) == mval) {
|
||||||
/* found a match! */
|
/* found a match! */
|
||||||
if (step > 4) {
|
|
||||||
|
/* first write next hash table entry; we've already calculated it */
|
||||||
|
if (step <= 4) {
|
||||||
/* We need to avoid writing an index into the hash table >= the
|
/* We need to avoid writing an index into the hash table >= the
|
||||||
* position at which we will pick up our searching after we've
|
* position at which we will pick up our searching after we've
|
||||||
* taken this match.
|
* taken this match.
|
||||||
@ -239,8 +249,9 @@ _start: /* Requires: ip0 */
|
|||||||
* this is the only match path where this can occur. (In rep-
|
* this is the only match path where this can occur. (In rep-
|
||||||
* code and the first match checks, ip1 == ip0 + 1.)
|
* code and the first match checks, ip1 == ip0 + 1.)
|
||||||
*/
|
*/
|
||||||
ip1 = base;
|
hashTable[hash1] = (U32)(ip1 - base);
|
||||||
}
|
}
|
||||||
|
|
||||||
goto _offset;
|
goto _offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -304,9 +315,6 @@ _match: /* Requires: ip0, match0, offcode */
|
|||||||
ip0 += mLength;
|
ip0 += mLength;
|
||||||
anchor = ip0;
|
anchor = ip0;
|
||||||
|
|
||||||
/* write next hash table entry */
|
|
||||||
hashTable[hash1] = (U32)(ip1 - base);
|
|
||||||
|
|
||||||
/* Fill table and check for immediate repcode. */
|
/* Fill table and check for immediate repcode. */
|
||||||
if (ip0 <= ilimit) {
|
if (ip0 <= ilimit) {
|
||||||
/* Fill Table */
|
/* Fill Table */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user