U32* const hashTable = ms->hashTable;
U32 const hlog = cParams->hashLog;
/* support stepSize of 0 */
- size_t const stepSize = cParams->targetLength + !(cParams->targetLength);
+ size_t const stepSize = hasStep ? (cParams->targetLength + !(cParams->targetLength) + 1) : 2;
const BYTE* const base = ms->window.base;
const BYTE* const istart = (const BYTE*)src;
const U32 endIndex = (U32)((size_t)(istart - base) + srcSize);
const BYTE* match0;
size_t mLength;
- size_t step0;
- size_t step1;
+ /* ip0 and ip1 are always adjacent. The targetLength skipping and
+ * uncompressibility acceleration is applied to every other position,
+ * matching the behavior of #1562. step therefore represents the gap
+ * between pairs of positions, from ip0 to ip2 or ip1 to ip3. */
+ size_t step;
const BYTE* nextStep;
const size_t kStepIncr = (1 << (kSearchStrength - 1));
/* start each op */
_start: /* Requires: ip0 */
- step0 = 1;
- step1 = stepSize;
+ step = stepSize;
nextStep = ip0 + kStepIncr;
/* calculate positions, ip0 - anchor == 0, so we skip step calc */
- ip1 = ip0 + step0;
- ip2 = ip1 + step1;
- ip3 = ip2 + step0;
+ ip1 = ip0 + 1;
+ ip2 = ip0 + step;
+ ip3 = ip2 + 1;
if (ip3 >= ilimit) {
goto _cleanup;
if (ip2 >= nextStep) {
PREFETCH_L1(ip1 + 64);
PREFETCH_L1(ip1 + 128);
- step0++;
- step1++;
+ step += 2;
nextStep += kStepIncr;
}
/* advance to next positions */
ip0 = ip1;
ip1 = ip2;
- ip2 = ip2 + step1;
- ip3 = ip2 + step0;
+ ip2 = ip0 + step;
+ ip3 = ip1 + step;
} while (ip3 < ilimit);
_cleanup: