shaved 148 bytes, 236 more to go

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3207 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
kichik 2003-11-25 10:51:17 +00:00
parent 06c87de7e0
commit c062ecca53
7 changed files with 59 additions and 90 deletions

View file

@ -2,7 +2,7 @@
#include "LZMADecoder.h" #include "LZMADecoder.h"
UINT32 CLZMADecoder::Create(BYTE *memoryPointer, void CLZMADecoder::Create(BYTE *memoryPointer,
int numLiteralContextBits, int numLiteralContextBits,
int numLiteralPosStateBits, int numLiteralPosStateBits,
int numPosStateBits) int numPosStateBits)
@ -10,7 +10,7 @@ UINT32 CLZMADecoder::Create(BYTE *memoryPointer,
int numPosStates = 1 << numPosStateBits; int numPosStates = 1 << numPosStateBits;
m_PosStateMask = numPosStates - 1; m_PosStateMask = numPosStates - 1;
return m_LiteralDecoder.Create(memoryPointer, numLiteralPosStateBits, numLiteralContextBits); m_LiteralDecoder.Create(memoryPointer, numLiteralPosStateBits, numLiteralContextBits);
} }
UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState) UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState)
@ -19,17 +19,9 @@ UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState)
m_OutWindowStream.Init(lzmaState); m_OutWindowStream.Init(lzmaState);
int i; int i;
for(i = 0; i < kNumStates; i++) for (i = 0; i < sizeof(m_Decoders) / sizeof(CBitDecoder); i++)
{ {
for (int j = 0; j <= m_PosStateMask; j++) ((CBitDecoder *) &m_Decoders)[i].Init();
{
m_MainChoiceDecoders[i][j].Init();
m_MatchRepShortChoiceDecoders[i][j].Init();
}
m_MatchChoiceDecoders[i].Init();
m_MatchRepChoiceDecoders[i].Init();
m_MatchRep1ChoiceDecoders[i].Init();
m_MatchRep2ChoiceDecoders[i].Init();
} }
m_LiteralDecoder.Init(); m_LiteralDecoder.Init();
@ -62,16 +54,12 @@ UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState)
while(nowPos < 0xFFFFFFFF) while(nowPos < 0xFFFFFFFF)
{ {
int posState = nowPos & m_PosStateMask; int posState = nowPos & m_PosStateMask;
if (m_MainChoiceDecoders[state.Index][posState].Decode(&m_RangeDecoder) == 0) if (!m_Decoders.MainChoiceDecoders[state.Index][posState].Decode(&m_RangeDecoder))
{ {
state.UpdateChar(); state.UpdateChar();
if(peviousIsMatch) if(peviousIsMatch)
{ {
#ifdef __STREAM_VERSION
BYTE matchByte = m_OutWindowStream.GetOneByte(0 - repDistances[0]); BYTE matchByte = m_OutWindowStream.GetOneByte(0 - repDistances[0]);
#else
BYTE matchByte = *(outStream - repDistances[0]);
#endif
previousByte = m_LiteralDecoder.DecodeWithMatchByte(&m_RangeDecoder, previousByte = m_LiteralDecoder.DecodeWithMatchByte(&m_RangeDecoder,
nowPos, previousByte, matchByte); nowPos, previousByte, matchByte);
peviousIsMatch = false; peviousIsMatch = false;
@ -80,11 +68,7 @@ UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState)
previousByte = m_LiteralDecoder.DecodeNormal(&m_RangeDecoder, previousByte = m_LiteralDecoder.DecodeNormal(&m_RangeDecoder,
nowPos, previousByte); nowPos, previousByte);
#ifdef __STREAM_VERSION
m_OutWindowStream.PutOneByte(previousByte); m_OutWindowStream.PutOneByte(previousByte);
#else
*outStream++ = previousByte;
#endif
nowPos++; nowPos++;
} }
@ -93,21 +77,16 @@ UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState)
peviousIsMatch = true; peviousIsMatch = true;
UINT32 distance; UINT32 distance;
int len; int len;
if(m_MatchChoiceDecoders[state.Index].Decode(&m_RangeDecoder) == 1) if(m_Decoders.MatchChoiceDecoders[state.Index].Decode(&m_RangeDecoder))
{ {
if(m_MatchRepChoiceDecoders[state.Index].Decode(&m_RangeDecoder) == 0) if(!m_Decoders.MatchRepChoiceDecoders[state.Index].Decode(&m_RangeDecoder))
{ {
if(m_MatchRepShortChoiceDecoders[state.Index][posState].Decode(&m_RangeDecoder) == 0) if(!m_Decoders.MatchRepShortChoiceDecoders[state.Index][posState].Decode(&m_RangeDecoder))
{ {
state.UpdateShortRep(); state.UpdateShortRep();
#ifdef __STREAM_VERSION
previousByte = m_OutWindowStream.GetOneByte(0 - repDistances[0]); previousByte = m_OutWindowStream.GetOneByte(0 - repDistances[0]);
m_OutWindowStream.PutOneByte(previousByte); m_OutWindowStream.PutOneByte(previousByte);
#else
previousByte = *(outStream - repDistances[0]);
*outStream++ = previousByte;
#endif
nowPos++; nowPos++;
continue; continue;
@ -116,11 +95,11 @@ UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState)
} }
else else
{ {
if(m_MatchRep1ChoiceDecoders[state.Index].Decode(&m_RangeDecoder) == 0) if(!m_Decoders.MatchRep1ChoiceDecoders[state.Index].Decode(&m_RangeDecoder))
distance = repDistances[1]; distance = repDistances[1];
else else
{ {
if (m_MatchRep2ChoiceDecoders[state.Index].Decode(&m_RangeDecoder) == 0) if (!m_Decoders.MatchRep2ChoiceDecoders[state.Index].Decode(&m_RangeDecoder))
distance = repDistances[2]; distance = repDistances[2];
else else
{ {
@ -171,10 +150,21 @@ UINT32 CLZMADecoder::Code(CLZMAStateP lzmaState)
} }
len += kMatchMinLen; len += kMatchMinLen;
m_OutWindowStream.CopyBackBlock(m_OutWindowStream._pos - distance, len);
previousByte = m_OutWindowStream.GetOneByte((UINT32)(-1));
nowPos += len; nowPos += len;
// CopyBackBlock
{
UINT32 fromPos = m_OutWindowStream._pos - distance;
if (fromPos >= m_OutWindowStream._windowSize)
fromPos += m_OutWindowStream._windowSize;
while (len--)
{
m_OutWindowStream._buffer[m_OutWindowStream._pos++] = m_OutWindowStream._buffer[fromPos++];
if (fromPos >= m_OutWindowStream._windowSize)
fromPos = 0;
m_OutWindowStream.Flush();
}
}
previousByte = m_OutWindowStream.GetOneByte((UINT32)(-1));
} }
} }
m_OutWindowStream._windowSize = 0; m_OutWindowStream._windowSize = 0;

View file

@ -53,12 +53,15 @@ class CLZMADecoder
CLZOutWindow m_OutWindowStream; CLZOutWindow m_OutWindowStream;
CRangeDecoder m_RangeDecoder; CRangeDecoder m_RangeDecoder;
CBitDecoder m_MainChoiceDecoders[kNumStates][kLenNumPosStatesMax]; struct
CBitDecoder m_MatchRepShortChoiceDecoders[kNumStates][kLenNumPosStatesMax]; {
CBitDecoder m_MatchChoiceDecoders[kNumStates]; CBitDecoder MainChoiceDecoders[kNumStates][kLenNumPosStatesMax];
CBitDecoder m_MatchRepChoiceDecoders[kNumStates]; CBitDecoder MatchRepShortChoiceDecoders[kNumStates][kLenNumPosStatesMax];
CBitDecoder m_MatchRep1ChoiceDecoders[kNumStates]; CBitDecoder MatchChoiceDecoders[kNumStates];
CBitDecoder m_MatchRep2ChoiceDecoders[kNumStates]; CBitDecoder MatchRepChoiceDecoders[kNumStates];
CBitDecoder MatchRep1ChoiceDecoders[kNumStates];
CBitDecoder MatchRep2ChoiceDecoders[kNumStates];
} m_Decoders;
CLZMALiteralDecoder m_LiteralDecoder; CLZMALiteralDecoder m_LiteralDecoder;
@ -72,7 +75,7 @@ class CLZMADecoder
int m_PosStateMask; int m_PosStateMask;
public: public:
UINT32 Create(BYTE *memoryPointer, void Create(BYTE *memoryPointer,
int numLiteralContextBits, int numLiteralContextBits,
int numLiteralPosStateBits, int numLiteralPosStateBits,
int numPosStateBits); int numPosStateBits);

View file

@ -19,12 +19,14 @@ const int kLenNumMidSymbols = 1 << kLenNumMidBits;
const int kLenNumHighBits = 8; const int kLenNumHighBits = 8;
const int kLenNumSymbolsTotal = kLenNumLowSymbols + kLenNumMidSymbols + (1 << kLenNumHighBits); const int kLenNumSymbolsTotal = kLenNumLowSymbols + kLenNumMidSymbols + (1 << kLenNumHighBits);
#define LOW 0
#define HIGH 1
class CLZMALenDecoder class CLZMALenDecoder
{ {
CBitDecoder m_Choice; CBitDecoder m_Choice;
CBitDecoder m_Choice2; CBitDecoder m_Choice2;
CBitTreeDecoder3 m_LowCoder[kLenNumPosStatesMax]; CBitTreeDecoder3 m_Coder[2][kLenNumPosStatesMax];
CBitTreeDecoder3 m_MidCoder[kLenNumPosStatesMax];
CBitTreeDecoder8 m_HighCoder; CBitTreeDecoder8 m_HighCoder;
public: public:
// void Init(int numPosStates) // void Init(int numPosStates)
@ -32,20 +34,18 @@ public:
{ {
m_Choice.Init(); m_Choice.Init();
m_Choice2.Init(); m_Choice2.Init();
// for (int posState = 0; posState < numPosStates; posState++) for (int posState = 0; posState < kLenNumPosStatesMax * 2; posState++)
for (int posState = 0; posState < kLenNumPosStatesMax; posState++)
{ {
m_LowCoder[posState].Init(); ((CBitTreeDecoder3 *) m_Coder)[posState].Init();
m_MidCoder[posState].Init();
} }
m_HighCoder.Init(); m_HighCoder.Init();
} }
int Decode(CRangeDecoder *rangeDecoder, int posState) int Decode(CRangeDecoder *rangeDecoder, int posState)
{ {
if(m_Choice.Decode(rangeDecoder) == 0) if(m_Choice.Decode(rangeDecoder) == 0)
return m_LowCoder[posState].Decode(rangeDecoder); return m_Coder[LOW][posState].Decode(rangeDecoder);
if(m_Choice2.Decode(rangeDecoder) == 0) if(m_Choice2.Decode(rangeDecoder) == 0)
return kLenNumLowSymbols + m_MidCoder[posState].Decode(rangeDecoder); return kLenNumLowSymbols + m_Coder[HIGH][posState].Decode(rangeDecoder);
return kLenNumLowSymbols + kLenNumMidSymbols + m_HighCoder.Decode(rangeDecoder); return kLenNumLowSymbols + kLenNumMidSymbols + m_HighCoder.Decode(rangeDecoder);
} }
}; };

View file

@ -12,9 +12,8 @@ class CLZMALiteralDecoder2
public: public:
void Init() void Init()
{ {
for (int i = 0; i < 3; i++) for (int i = 0; i < sizeof(m_Decoders) / sizeof(CBitDecoder); i++)
for (int j = 0; j < (1 << 8); j++) ((CBitDecoder *) m_Decoders)[i].Init();
m_Decoders[i][j].Init();
} }
BYTE DecodeNormal(CRangeDecoder *rangeDecoder) BYTE DecodeNormal(CRangeDecoder *rangeDecoder)
{ {
@ -78,17 +77,15 @@ public:
class CLZMALiteralDecoder class CLZMALiteralDecoder
{ {
CLZMALiteralDecoder2 *m_Coders; CLZMALiteralDecoder2 *m_Coders;
int m_NumPrevBits; int m_NumPrevBits;
int m_PosMask; int m_PosMask;
public: public:
CLZMALiteralDecoder(): m_Coders(0) {} CLZMALiteralDecoder(): m_Coders(0) {}
UINT32 Create(BYTE *memory, int numPosBits, int numPrevBits) void Create(BYTE *memory, int numPosBits, int numPrevBits)
{ {
m_PosMask = (1 << numPosBits) - 1; m_PosMask = (1 << numPosBits) - 1;
m_NumPrevBits = numPrevBits; m_NumPrevBits = numPrevBits;
int numStates = 1 << (numPrevBits + numPosBits); m_Coders = (CLZMALiteralDecoder2 *) memory;
m_Coders = (CLZMALiteralDecoder2 *)memory;
return sizeof(CLZMALiteralDecoder2) * numStates;
} }
void Init() void Init()
{ {

View file

@ -23,18 +23,6 @@ public:
_streamPos = 0; _streamPos = 0;
_pos = 0; _pos = 0;
} }
void CopyBackBlock(UINT32 fromPos, int len)
{
if (fromPos >= _windowSize)
fromPos += _windowSize;
while (len--)
{
_buffer[_pos++] = _buffer[fromPos++];
if (fromPos >= _windowSize)
fromPos = 0;
Flush();
}
}
void PutOneByte(BYTE b) void PutOneByte(BYTE b)
{ {
_buffer[_pos++] = b; _buffer[_pos++] = b;

View file

@ -35,29 +35,27 @@ struct CBitDecoder: public CBitModel
int Decode(CRangeDecoder *rangeDecoder) int Decode(CRangeDecoder *rangeDecoder)
{ {
UINT32 newBound = (rangeDecoder->Range >> kNumBitModelTotalBits) * Probability; UINT32 newBound = (rangeDecoder->Range >> kNumBitModelTotalBits) * Probability;
int ret = 0;
if (rangeDecoder->Code < newBound) if (rangeDecoder->Code < newBound)
{ {
rangeDecoder->Range = newBound; rangeDecoder->Range = newBound;
Probability += (kBitModelTotal - Probability) >> kNumMoveBits; Probability += (kBitModelTotal - Probability) >> kNumMoveBits;
if (rangeDecoder->Range < kTopValue)
{
rangeDecoder->Code = (rangeDecoder->Code << 8) | rangeDecoder->Stream.ReadByte();
rangeDecoder->Range <<= 8;
}
return 0;
} }
else else
{ {
rangeDecoder->Range -= newBound; rangeDecoder->Range -= newBound;
rangeDecoder->Code -= newBound; rangeDecoder->Code -= newBound;
Probability -= (Probability) >> kNumMoveBits; Probability -= (Probability) >> kNumMoveBits;
if (rangeDecoder->Range < kTopValue) ret = 1;
{
rangeDecoder->Code = (rangeDecoder->Code << 8) | rangeDecoder->Stream.ReadByte();
rangeDecoder->Range <<= 8;
}
return 1;
} }
if (rangeDecoder->Range < kTopValue)
{
rangeDecoder->Code = (rangeDecoder->Code << 8) | rangeDecoder->Stream.ReadByte();
rangeDecoder->Range <<= 8;
}
return ret;
} }
}; };

View file

@ -82,9 +82,7 @@ DWORD WINAPI lzmaDecompressThread(LPVOID lpParameter)
firstByte %= 9; firstByte %= 9;
int numLiteralContextBits = firstByte; int numLiteralContextBits = firstByte;
int memSize = int memSize = (1 << (numLiteralContextBits + numLiteralPosStateBits)) * sizeof(CLZMALiteralDecoder2);
((1 << (numLiteralContextBits + numLiteralPosStateBits))*
256 * 3) * sizeof(CBitDecoder);
if (lzmaState->DynamicData == 0 || firstByte != lzmaState->FirstProp) if (lzmaState->DynamicData == 0 || firstByte != lzmaState->FirstProp)
{ {
@ -94,13 +92,8 @@ DWORD WINAPI lzmaDecompressThread(LPVOID lpParameter)
lzmaState->FirstProp = firstByte; lzmaState->FirstProp = firstByte;
} }
int memSizeReal = lzmaDecodeder->Create((BYTE *) lzmaState->DynamicData, lzmaDecodeder->Create((LPBYTE) lzmaState->DynamicData,
numLiteralContextBits, numLiteralPosStateBits, numPosStateBits); numLiteralContextBits, numLiteralPosStateBits, numPosStateBits);
if (memSizeReal != memSize)
{
goto finished;
}
UINT32 dictionarySize = 0; UINT32 dictionarySize = 0;
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)