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:
W. Felix Handte 2022-05-11 11:27:34 -04:00
parent 040986a4f4
commit cd1f582943

View File

@ -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 */