Mercurial > public > mercurial-scm > hg
comparison contrib/python-zstandard/zstd/compress/zstd_lazy.c @ 42937:69de49c4e39c
zstandard: vendor python-zstandard 0.12
The upstream source distribution from PyPI was extracted. Unwanted
files were removed.
The clang-format ignore list was updated to reflect the new source
of files.
test-repo-compengines.t was updated to reflect a change in behavior
of the zstd library.
The project contains a vendored copy of zstandard 1.4.3. The old
version was 1.3.8. This should result in some minor performance wins.
# no-check-commit because 3rd party code has different style guidelines
Differential Revision: https://phab.mercurial-scm.org/D6858
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Sun, 15 Sep 2019 20:04:00 -0700 |
parents | 675775c33ab6 |
children | de7838053207 |
comparison
equal
deleted
inserted
replaced
42936:2da754532dd3 | 42937:69de49c4e39c |
---|---|
81 const BYTE* match; | 81 const BYTE* match; |
82 U32* smallerPtr = bt + 2*(current&btMask); | 82 U32* smallerPtr = bt + 2*(current&btMask); |
83 U32* largerPtr = smallerPtr + 1; | 83 U32* largerPtr = smallerPtr + 1; |
84 U32 matchIndex = *smallerPtr; /* this candidate is unsorted : next sorted candidate is reached through *smallerPtr, while *largerPtr contains previous unsorted candidate (which is already saved and can be overwritten) */ | 84 U32 matchIndex = *smallerPtr; /* this candidate is unsorted : next sorted candidate is reached through *smallerPtr, while *largerPtr contains previous unsorted candidate (which is already saved and can be overwritten) */ |
85 U32 dummy32; /* to be nullified at the end */ | 85 U32 dummy32; /* to be nullified at the end */ |
86 U32 const windowLow = ms->window.lowLimit; | 86 U32 const windowValid = ms->window.lowLimit; |
87 U32 const maxDistance = 1U << cParams->windowLog; | |
88 U32 const windowLow = (current - windowValid > maxDistance) ? current - maxDistance : windowValid; | |
89 | |
87 | 90 |
88 DEBUGLOG(8, "ZSTD_insertDUBT1(%u) (dictLimit=%u, lowLimit=%u)", | 91 DEBUGLOG(8, "ZSTD_insertDUBT1(%u) (dictLimit=%u, lowLimit=%u)", |
89 current, dictLimit, windowLow); | 92 current, dictLimit, windowLow); |
90 assert(current >= btLow); | 93 assert(current >= btLow); |
91 assert(ip < iend); /* condition for ZSTD_count */ | 94 assert(ip < iend); /* condition for ZSTD_count */ |
237 size_t const h = ZSTD_hashPtr(ip, hashLog, mls); | 240 size_t const h = ZSTD_hashPtr(ip, hashLog, mls); |
238 U32 matchIndex = hashTable[h]; | 241 U32 matchIndex = hashTable[h]; |
239 | 242 |
240 const BYTE* const base = ms->window.base; | 243 const BYTE* const base = ms->window.base; |
241 U32 const current = (U32)(ip-base); | 244 U32 const current = (U32)(ip-base); |
242 U32 const windowLow = ms->window.lowLimit; | 245 U32 const windowLow = ZSTD_getLowestMatchIndex(ms, current, cParams->windowLog); |
243 | 246 |
244 U32* const bt = ms->chainTable; | 247 U32* const bt = ms->chainTable; |
245 U32 const btLog = cParams->chainLog - 1; | 248 U32 const btLog = cParams->chainLog - 1; |
246 U32 const btMask = (1 << btLog) - 1; | 249 U32 const btMask = (1 << btLog) - 1; |
247 U32 const btLow = (btMask >= current) ? 0 : current - btMask; | 250 U32 const btLow = (btMask >= current) ? 0 : current - btMask; |
488 const BYTE* const base = ms->window.base; | 491 const BYTE* const base = ms->window.base; |
489 const BYTE* const dictBase = ms->window.dictBase; | 492 const BYTE* const dictBase = ms->window.dictBase; |
490 const U32 dictLimit = ms->window.dictLimit; | 493 const U32 dictLimit = ms->window.dictLimit; |
491 const BYTE* const prefixStart = base + dictLimit; | 494 const BYTE* const prefixStart = base + dictLimit; |
492 const BYTE* const dictEnd = dictBase + dictLimit; | 495 const BYTE* const dictEnd = dictBase + dictLimit; |
493 const U32 lowLimit = ms->window.lowLimit; | |
494 const U32 current = (U32)(ip-base); | 496 const U32 current = (U32)(ip-base); |
497 const U32 maxDistance = 1U << cParams->windowLog; | |
498 const U32 lowestValid = ms->window.lowLimit; | |
499 const U32 withinMaxDistance = (current - lowestValid > maxDistance) ? current - maxDistance : lowestValid; | |
500 const U32 isDictionary = (ms->loadedDictEnd != 0); | |
501 const U32 lowLimit = isDictionary ? lowestValid : withinMaxDistance; | |
495 const U32 minChain = current > chainSize ? current - chainSize : 0; | 502 const U32 minChain = current > chainSize ? current - chainSize : 0; |
496 U32 nbAttempts = 1U << cParams->searchLog; | 503 U32 nbAttempts = 1U << cParams->searchLog; |
497 size_t ml=4-1; | 504 size_t ml=4-1; |
498 | 505 |
499 /* HC4 match finder */ | 506 /* HC4 match finder */ |
610 | 617 |
611 | 618 |
612 /* ******************************* | 619 /* ******************************* |
613 * Common parser - lazy strategy | 620 * Common parser - lazy strategy |
614 *********************************/ | 621 *********************************/ |
615 FORCE_INLINE_TEMPLATE | 622 typedef enum { search_hashChain, search_binaryTree } searchMethod_e; |
616 size_t ZSTD_compressBlock_lazy_generic( | 623 |
624 FORCE_INLINE_TEMPLATE size_t | |
625 ZSTD_compressBlock_lazy_generic( | |
617 ZSTD_matchState_t* ms, seqStore_t* seqStore, | 626 ZSTD_matchState_t* ms, seqStore_t* seqStore, |
618 U32 rep[ZSTD_REP_NUM], | 627 U32 rep[ZSTD_REP_NUM], |
619 const void* src, size_t srcSize, | 628 const void* src, size_t srcSize, |
620 const U32 searchMethod, const U32 depth, | 629 const searchMethod_e searchMethod, const U32 depth, |
621 ZSTD_dictMode_e const dictMode) | 630 ZSTD_dictMode_e const dictMode) |
622 { | 631 { |
623 const BYTE* const istart = (const BYTE*)src; | 632 const BYTE* const istart = (const BYTE*)src; |
624 const BYTE* ip = istart; | 633 const BYTE* ip = istart; |
625 const BYTE* anchor = istart; | 634 const BYTE* anchor = istart; |
631 | 640 |
632 typedef size_t (*searchMax_f)( | 641 typedef size_t (*searchMax_f)( |
633 ZSTD_matchState_t* ms, | 642 ZSTD_matchState_t* ms, |
634 const BYTE* ip, const BYTE* iLimit, size_t* offsetPtr); | 643 const BYTE* ip, const BYTE* iLimit, size_t* offsetPtr); |
635 searchMax_f const searchMax = dictMode == ZSTD_dictMatchState ? | 644 searchMax_f const searchMax = dictMode == ZSTD_dictMatchState ? |
636 (searchMethod ? ZSTD_BtFindBestMatch_dictMatchState_selectMLS : ZSTD_HcFindBestMatch_dictMatchState_selectMLS) : | 645 (searchMethod==search_binaryTree ? ZSTD_BtFindBestMatch_dictMatchState_selectMLS |
637 (searchMethod ? ZSTD_BtFindBestMatch_selectMLS : ZSTD_HcFindBestMatch_selectMLS); | 646 : ZSTD_HcFindBestMatch_dictMatchState_selectMLS) : |
647 (searchMethod==search_binaryTree ? ZSTD_BtFindBestMatch_selectMLS | |
648 : ZSTD_HcFindBestMatch_selectMLS); | |
638 U32 offset_1 = rep[0], offset_2 = rep[1], savedOffset=0; | 649 U32 offset_1 = rep[0], offset_2 = rep[1], savedOffset=0; |
639 | 650 |
640 const ZSTD_matchState_t* const dms = ms->dictMatchState; | 651 const ZSTD_matchState_t* const dms = ms->dictMatchState; |
641 const U32 dictLowestIndex = dictMode == ZSTD_dictMatchState ? | 652 const U32 dictLowestIndex = dictMode == ZSTD_dictMatchState ? |
642 dms->window.dictLimit : 0; | 653 dms->window.dictLimit : 0; |
651 0; | 662 0; |
652 const U32 dictAndPrefixLength = (U32)(ip - prefixLowest + dictEnd - dictLowest); | 663 const U32 dictAndPrefixLength = (U32)(ip - prefixLowest + dictEnd - dictLowest); |
653 | 664 |
654 /* init */ | 665 /* init */ |
655 ip += (dictAndPrefixLength == 0); | 666 ip += (dictAndPrefixLength == 0); |
656 ms->nextToUpdate3 = ms->nextToUpdate; | |
657 if (dictMode == ZSTD_noDict) { | 667 if (dictMode == ZSTD_noDict) { |
658 U32 const maxRep = (U32)(ip - prefixLowest); | 668 U32 const maxRep = (U32)(ip - prefixLowest); |
659 if (offset_2 > maxRep) savedOffset = offset_2, offset_2 = 0; | 669 if (offset_2 > maxRep) savedOffset = offset_2, offset_2 = 0; |
660 if (offset_1 > maxRep) savedOffset = offset_1, offset_1 = 0; | 670 if (offset_1 > maxRep) savedOffset = offset_1, offset_1 = 0; |
661 } | 671 } |
842 /* Save reps for next block */ | 852 /* Save reps for next block */ |
843 rep[0] = offset_1 ? offset_1 : savedOffset; | 853 rep[0] = offset_1 ? offset_1 : savedOffset; |
844 rep[1] = offset_2 ? offset_2 : savedOffset; | 854 rep[1] = offset_2 ? offset_2 : savedOffset; |
845 | 855 |
846 /* Return the last literals size */ | 856 /* Return the last literals size */ |
847 return iend - anchor; | 857 return (size_t)(iend - anchor); |
848 } | 858 } |
849 | 859 |
850 | 860 |
851 size_t ZSTD_compressBlock_btlazy2( | 861 size_t ZSTD_compressBlock_btlazy2( |
852 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], | 862 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], |
853 void const* src, size_t srcSize) | 863 void const* src, size_t srcSize) |
854 { | 864 { |
855 return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, 1, 2, ZSTD_noDict); | 865 return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_binaryTree, 2, ZSTD_noDict); |
856 } | 866 } |
857 | 867 |
858 size_t ZSTD_compressBlock_lazy2( | 868 size_t ZSTD_compressBlock_lazy2( |
859 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], | 869 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], |
860 void const* src, size_t srcSize) | 870 void const* src, size_t srcSize) |
861 { | 871 { |
862 return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, 0, 2, ZSTD_noDict); | 872 return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_hashChain, 2, ZSTD_noDict); |
863 } | 873 } |
864 | 874 |
865 size_t ZSTD_compressBlock_lazy( | 875 size_t ZSTD_compressBlock_lazy( |
866 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], | 876 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], |
867 void const* src, size_t srcSize) | 877 void const* src, size_t srcSize) |
868 { | 878 { |
869 return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, 0, 1, ZSTD_noDict); | 879 return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_hashChain, 1, ZSTD_noDict); |
870 } | 880 } |
871 | 881 |
872 size_t ZSTD_compressBlock_greedy( | 882 size_t ZSTD_compressBlock_greedy( |
873 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], | 883 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], |
874 void const* src, size_t srcSize) | 884 void const* src, size_t srcSize) |
875 { | 885 { |
876 return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, 0, 0, ZSTD_noDict); | 886 return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_hashChain, 0, ZSTD_noDict); |
877 } | 887 } |
878 | 888 |
879 size_t ZSTD_compressBlock_btlazy2_dictMatchState( | 889 size_t ZSTD_compressBlock_btlazy2_dictMatchState( |
880 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], | 890 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], |
881 void const* src, size_t srcSize) | 891 void const* src, size_t srcSize) |
882 { | 892 { |
883 return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, 1, 2, ZSTD_dictMatchState); | 893 return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_binaryTree, 2, ZSTD_dictMatchState); |
884 } | 894 } |
885 | 895 |
886 size_t ZSTD_compressBlock_lazy2_dictMatchState( | 896 size_t ZSTD_compressBlock_lazy2_dictMatchState( |
887 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], | 897 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], |
888 void const* src, size_t srcSize) | 898 void const* src, size_t srcSize) |
889 { | 899 { |
890 return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, 0, 2, ZSTD_dictMatchState); | 900 return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_hashChain, 2, ZSTD_dictMatchState); |
891 } | 901 } |
892 | 902 |
893 size_t ZSTD_compressBlock_lazy_dictMatchState( | 903 size_t ZSTD_compressBlock_lazy_dictMatchState( |
894 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], | 904 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], |
895 void const* src, size_t srcSize) | 905 void const* src, size_t srcSize) |
896 { | 906 { |
897 return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, 0, 1, ZSTD_dictMatchState); | 907 return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_hashChain, 1, ZSTD_dictMatchState); |
898 } | 908 } |
899 | 909 |
900 size_t ZSTD_compressBlock_greedy_dictMatchState( | 910 size_t ZSTD_compressBlock_greedy_dictMatchState( |
901 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], | 911 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], |
902 void const* src, size_t srcSize) | 912 void const* src, size_t srcSize) |
903 { | 913 { |
904 return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, 0, 0, ZSTD_dictMatchState); | 914 return ZSTD_compressBlock_lazy_generic(ms, seqStore, rep, src, srcSize, search_hashChain, 0, ZSTD_dictMatchState); |
905 } | 915 } |
906 | 916 |
907 | 917 |
908 FORCE_INLINE_TEMPLATE | 918 FORCE_INLINE_TEMPLATE |
909 size_t ZSTD_compressBlock_lazy_extDict_generic( | 919 size_t ZSTD_compressBlock_lazy_extDict_generic( |
910 ZSTD_matchState_t* ms, seqStore_t* seqStore, | 920 ZSTD_matchState_t* ms, seqStore_t* seqStore, |
911 U32 rep[ZSTD_REP_NUM], | 921 U32 rep[ZSTD_REP_NUM], |
912 const void* src, size_t srcSize, | 922 const void* src, size_t srcSize, |
913 const U32 searchMethod, const U32 depth) | 923 const searchMethod_e searchMethod, const U32 depth) |
914 { | 924 { |
915 const BYTE* const istart = (const BYTE*)src; | 925 const BYTE* const istart = (const BYTE*)src; |
916 const BYTE* ip = istart; | 926 const BYTE* ip = istart; |
917 const BYTE* anchor = istart; | 927 const BYTE* anchor = istart; |
918 const BYTE* const iend = istart + srcSize; | 928 const BYTE* const iend = istart + srcSize; |
926 const BYTE* const dictStart = dictBase + lowestIndex; | 936 const BYTE* const dictStart = dictBase + lowestIndex; |
927 | 937 |
928 typedef size_t (*searchMax_f)( | 938 typedef size_t (*searchMax_f)( |
929 ZSTD_matchState_t* ms, | 939 ZSTD_matchState_t* ms, |
930 const BYTE* ip, const BYTE* iLimit, size_t* offsetPtr); | 940 const BYTE* ip, const BYTE* iLimit, size_t* offsetPtr); |
931 searchMax_f searchMax = searchMethod ? ZSTD_BtFindBestMatch_extDict_selectMLS : ZSTD_HcFindBestMatch_extDict_selectMLS; | 941 searchMax_f searchMax = searchMethod==search_binaryTree ? ZSTD_BtFindBestMatch_extDict_selectMLS : ZSTD_HcFindBestMatch_extDict_selectMLS; |
932 | 942 |
933 U32 offset_1 = rep[0], offset_2 = rep[1]; | 943 U32 offset_1 = rep[0], offset_2 = rep[1]; |
934 | 944 |
935 /* init */ | 945 /* init */ |
936 ms->nextToUpdate3 = ms->nextToUpdate; | |
937 ip += (ip == prefixStart); | 946 ip += (ip == prefixStart); |
938 | 947 |
939 /* Match Loop */ | 948 /* Match Loop */ |
940 while (ip < ilimit) { | 949 while (ip < ilimit) { |
941 size_t matchLength=0; | 950 size_t matchLength=0; |
1068 /* Save reps for next block */ | 1077 /* Save reps for next block */ |
1069 rep[0] = offset_1; | 1078 rep[0] = offset_1; |
1070 rep[1] = offset_2; | 1079 rep[1] = offset_2; |
1071 | 1080 |
1072 /* Return the last literals size */ | 1081 /* Return the last literals size */ |
1073 return iend - anchor; | 1082 return (size_t)(iend - anchor); |
1074 } | 1083 } |
1075 | 1084 |
1076 | 1085 |
1077 size_t ZSTD_compressBlock_greedy_extDict( | 1086 size_t ZSTD_compressBlock_greedy_extDict( |
1078 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], | 1087 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], |
1079 void const* src, size_t srcSize) | 1088 void const* src, size_t srcSize) |
1080 { | 1089 { |
1081 return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, src, srcSize, 0, 0); | 1090 return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, src, srcSize, search_hashChain, 0); |
1082 } | 1091 } |
1083 | 1092 |
1084 size_t ZSTD_compressBlock_lazy_extDict( | 1093 size_t ZSTD_compressBlock_lazy_extDict( |
1085 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], | 1094 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], |
1086 void const* src, size_t srcSize) | 1095 void const* src, size_t srcSize) |
1087 | 1096 |
1088 { | 1097 { |
1089 return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, src, srcSize, 0, 1); | 1098 return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, src, srcSize, search_hashChain, 1); |
1090 } | 1099 } |
1091 | 1100 |
1092 size_t ZSTD_compressBlock_lazy2_extDict( | 1101 size_t ZSTD_compressBlock_lazy2_extDict( |
1093 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], | 1102 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], |
1094 void const* src, size_t srcSize) | 1103 void const* src, size_t srcSize) |
1095 | 1104 |
1096 { | 1105 { |
1097 return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, src, srcSize, 0, 2); | 1106 return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, src, srcSize, search_hashChain, 2); |
1098 } | 1107 } |
1099 | 1108 |
1100 size_t ZSTD_compressBlock_btlazy2_extDict( | 1109 size_t ZSTD_compressBlock_btlazy2_extDict( |
1101 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], | 1110 ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM], |
1102 void const* src, size_t srcSize) | 1111 void const* src, size_t srcSize) |
1103 | 1112 |
1104 { | 1113 { |
1105 return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, src, srcSize, 1, 2); | 1114 return ZSTD_compressBlock_lazy_extDict_generic(ms, seqStore, rep, src, srcSize, search_binaryTree, 2); |
1106 } | 1115 } |