\r
BYTE* op = (BYTE*) dest;\r
\r
+ const size_t DeBruijnBytePos[32] = { 0, 0, 3, 0, 3, 1, 3, 0, 3, 2, 2, 1, 3, 2, 0, 1, 3, 3, 1, 2, 2, 2, 2, 0, 3, 1, 2, 0, 1, 0, 1, 1 };\r
int len, length;\r
const int skipStrength = SKIPSTRENGTH;\r
U32 forwardH;\r
// Start Counting\r
ip+=MINMATCH; ref+=MINMATCH; // MinMatch verified\r
anchor = ip;\r
- while (A32(ref) == A32(ip))\r
+ while (ip<matchlimit-3)\r
{\r
- ip+=4; ref+=4;\r
- if (ip>matchlimit-4) { ref -= ip - (matchlimit-3); ip = matchlimit-3; break; }\r
+ int diff = A32(ref) ^ A32(ip);\r
+ if (!diff) { ip+=4; ref+=4; continue; }\r
+ ip += DeBruijnBytePos[((U32)((diff & -diff) * 0x077CB531U)) >> 27];\r
+ goto _endCount;\r
}\r
- if (A16(ref) == A16(ip)) { ip+=2; ref+=2; }\r
- if (*ref == *ip) ip++;\r
+ if ((ip<(matchlimit-1)) && (A16(ref) == A16(ip))) { ip+=2; ref+=2; }\r
+ if ((ip<matchlimit) && (*ref == *ip)) ip++;\r
+_endCount:\r
len = (ip - anchor);\r
\r
// Encode MatchLength\r
\r
BYTE* op = (BYTE*) dest;\r
\r
+ const size_t DeBruijnBytePos[32] = { 0, 0, 3, 0, 3, 1, 3, 0, 3, 2, 2, 1, 3, 2, 0, 1, 3, 3, 1, 2, 2, 2, 2, 0, 3, 1, 2, 0, 1, 0, 1, 1 };\r
int len, length;\r
const int skipStrength = SKIPSTRENGTH;\r
U32 forwardH;\r
anchor = ip;\r
while (ip<matchlimit-3)\r
{\r
- if (A32(ref) == A32(ip)) { ip+=4; ref+=4; continue; }\r
- if (A16(ref) == A16(ip)) { ip+=2; ref+=2; }\r
- if (*ref == *ip) ip++;\r
+ int diff = A32(ref) ^ A32(ip);\r
+ if (!diff) { ip+=4; ref+=4; continue; }\r
+ ip += DeBruijnBytePos[((U32)((diff & -diff) * 0x077CB531U)) >> 27];\r
goto _endCount;\r
}\r
if ((ip<(matchlimit-1)) && (A16(ref) == A16(ip))) { ip+=2; ref+=2; }\r