Fix double-shufti accelerator missing matches across stream chunk boundaries (#402)
* Fix double-shufti accelerator dropping cross-chunk matches in streaming mode
shuftiDoubleExec finds the first position i where byte[i] is in class1 and
byte[i+1] is in class2, so it must look one byte past the position it reports.
shuftiDoubleExecReal excludes the final buffer byte from its main loop and
defers it to check_last_byte, which zero-pads the absent byte[i+1].
check_last_byte only stopped on the last byte when it completed a single-char
(wildcard second char) pattern. When the last byte is merely the first char of
a double it was skipped. That is correct at true end-of-data, but at an
intermediate stream chunk boundary the second char is the first byte of the
next chunk, so the straddling match was silently dropped - a streaming
split-invariance violation.
Also stop on the last byte when it is in the first-char class (last_elem !=
0xff), returning buf_end-1. That is a resume point, not a reported match: the
engine re-examines the byte, carries the pending-first-char state into the next
chunk (fixing the false negative), and at true EOD finds nothing (no false
positive). The change is off the SIMD hot loop.
Add DoubleShuftiStreaming.SplitInvariant (block match set vs every streaming
split) and update the internal shufti tests to the new last-byte contract.