This commit is contained in:
Elliot Gorokhovsky 2022-05-12 12:53:15 -04:00
parent 22875ece61
commit 3620a0a565
3 changed files with 23 additions and 12 deletions

View File

@ -175,9 +175,9 @@ size_t ZSTD_compressBlock_doubleFast_noDict_generic(
} while (ip1 <= ilimit); } while (ip1 <= ilimit);
_cleanup: _cleanup:
/* If offset_1 started invalid (offsetSaved1 > 0) and became valid (offset_1 > 0), /* If offset_1 started invalid (offsetSaved1 != 0) and became valid (offset_1 != 0),
* rotate saved offsets. */ * rotate saved offsets. See comment in ZSTD_compressBlock_fast_noDict for more context. */
offsetSaved2 = ((offsetSaved1 > 0) & (offset_1 > 0)) ? offsetSaved1 : offsetSaved2; offsetSaved2 = ((offsetSaved1 != 0) && (offset_1 != 0)) ? offsetSaved1 : offsetSaved2;
/* save reps for next block */ /* save reps for next block */
rep[0] = offset_1 ? offset_1 : offsetSaved1; rep[0] = offset_1 ? offset_1 : offsetSaved1;

View File

@ -254,9 +254,20 @@ _cleanup:
* However, it seems to be a meaningful performance hit to try to search * However, it seems to be a meaningful performance hit to try to search
* them. So let's not. */ * them. So let's not. */
/* If rep_offset1 started invalid (offsetSaved1 > 0) and became valid (rep_offset1 > 0), /* When the repcodes are outside of the prefix, we set them to zero before the loop.
* rotate saved offsets. */ * When the offsets are still zero, we need to restore them after the block to have a correct
offsetSaved2 = ((offsetSaved1 > 0) & (rep_offset1 > 0)) ? offsetSaved1 : offsetSaved2; * repcode history. If only one offset was invalid, it is easy. The tricky case is when both
* offsets were invalid. We need to figure out which offset to refill with.
* - If both offsets are zero they are in the same order.
* - If both offsets are non-zero, we won't restore the offsets from `offsetSaved[12]`.
* - If only one is zero, we need to decide which offset to restore.
* - If rep_offset1 is non-zero, then rep_offset2 must be offsetSaved1.
* - It is impossible for rep_offset2 to be non-zero.
*
* So if rep_offset1 started invalid (offsetSaved1 != 0) and became valid (rep_offset1 != 0), then
* set rep[0] = rep_offset1 and rep[1] = offsetSaved1.
*/
offsetSaved2 = ((offsetSaved1 != 0) && (rep_offset1 != 0)) ? offsetSaved1 : offsetSaved2;
/* save reps for next block */ /* save reps for next block */
rep[0] = rep_offset1 ? rep_offset1 : offsetSaved1; rep[0] = rep_offset1 ? rep_offset1 : offsetSaved1;
@ -762,9 +773,9 @@ _cleanup:
* However, it seems to be a meaningful performance hit to try to search * However, it seems to be a meaningful performance hit to try to search
* them. So let's not. */ * them. So let's not. */
/* If offset_1 started invalid (offsetSaved1 > 0) and became valid (offset_1 > 0), /* If offset_1 started invalid (offsetSaved1 != 0) and became valid (offset_1 != 0),
* rotate saved offsets. */ * rotate saved offsets. See comment in ZSTD_compressBlock_fast_noDict for more context. */
offsetSaved2 = ((offsetSaved1 > 0) & (offset_1 > 0)) ? offsetSaved1 : offsetSaved2; offsetSaved2 = ((offsetSaved1 != 0) && (offset_1 != 0)) ? offsetSaved1 : offsetSaved2;
/* save reps for next block */ /* save reps for next block */
rep[0] = offset_1 ? offset_1 : offsetSaved1; rep[0] = offset_1 ? offset_1 : offsetSaved1;

View File

@ -1682,9 +1682,9 @@ _storeSequence:
continue; /* faster when present ... (?) */ continue; /* faster when present ... (?) */
} } } } } }
/* If offset_1 started invalid (offsetSaved1 > 0) and became valid (offset_1 > 0), /* If offset_1 started invalid (offsetSaved1 != 0) and became valid (offset_1 != 0),
* rotate saved offsets. */ * rotate saved offsets. See comment in ZSTD_compressBlock_fast_noDict for more context. */
offsetSaved2 = ((offsetSaved1 > 0) & (offset_1 > 0)) ? offsetSaved1 : offsetSaved2; offsetSaved2 = ((offsetSaved1 != 0) && (offset_1 != 0)) ? offsetSaved1 : offsetSaved2;
/* save reps for next block */ /* save reps for next block */
rep[0] = offset_1 ? offset_1 : offsetSaved1; rep[0] = offset_1 ? offset_1 : offsetSaved1;