2 * GRUB -- GRand Unified Bootloader
3 * Copyright (C) 2008 Free Software Foundation, Inc.
5 * GRUB is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * GRUB is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
21 #define LZMA_BASE_SIZE 1846
22 #define LZMA_LIT_SIZE 768
24 #define LZMA_PROPERTIES_SIZE 5
26 #define kNumTopBits 24
27 #define kTopValue (1 << kNumTopBits)
29 #define kNumBitModelTotalBits 11
30 #define kBitModelTotal (1 << kNumBitModelTotalBits)
31 #define kNumMoveBits 5
34 #define kNumPosBitsMax 4
35 #define kNumPosStatesMax (1 << kNumPosBitsMax)
37 #define kLenNumLowBits 3
38 #define kLenNumLowSymbols (1 << kLenNumLowBits)
39 #define kLenNumMidBits 3
40 #define kLenNumMidSymbols (1 << kLenNumMidBits)
41 #define kLenNumHighBits 8
42 #define kLenNumHighSymbols (1 << kLenNumHighBits)
45 #define LenChoice2 (LenChoice + 1)
46 #define LenLow (LenChoice2 + 1)
47 #define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))
48 #define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
49 #define kNumLenProbs (LenHigh + kLenNumHighSymbols)
53 #define kNumLitStates 7
55 #define kStartPosModelIndex 4
56 #define kEndPosModelIndex 14
57 #define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
59 #define kNumPosSlotBits 6
60 #define kNumLenToPosStates 4
62 #define kNumAlignBits 4
63 #define kAlignTableSize (1 << kNumAlignBits)
65 #define kMatchMinLen 2
68 #define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))
69 #define IsRepG0 (IsRep + kNumStates)
70 #define IsRepG1 (IsRepG0 + kNumStates)
71 #define IsRepG2 (IsRepG1 + kNumStates)
72 #define IsRep0Long (IsRepG2 + kNumStates)
73 #define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))
74 #define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
75 #define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)
76 #define LenCoder (Align + kAlignTableSize)
77 #define RepLenCoder (LenCoder + kNumLenProbs)
78 #define Literal (RepLenCoder + kNumLenProbs)
80 #define out_size 8(%ebp)
82 #define now_pos -4(%ebp)
83 #define prev_byte -8(%ebp)
84 #define range -12(%ebp)
85 #define code -16(%ebp)
86 #define state -20(%ebp)
87 #define rep0 -24(%ebp)
88 #define rep1 -28(%ebp)
89 #define rep2 -32(%ebp)
90 #define rep3 -36(%ebp)
98 #define POS_STATE_MASK ((1 << (FIXED_PB)) - 1)
99 #define LIT_POS_MASK ((1 << (FIXED_LP)) - 1)
101 #define LOCAL_SIZE 36
108 #define probs 12(%ebx)
110 #define pos_state_mask -40(%ebp)
111 #define lit_pos_mask -44(%ebp)
113 #define LOCAL_SIZE 44
117 RangeDecoderBitDecode:
119 leal (%ebx, %eax, 4), %eax
129 shrl $kNumBitModelTotalBits, %edx
136 movl $kBitModelTotal, %edx
138 shrl $kNumMoveBits, %edx
143 cmpl $kTopValue, range
156 shrl $kNumMoveBits, %edx
161 RangeDecoderBitTreeDecode:
162 RangeDecoderReverseBitTreeDecode:
175 call RangeDecoderBitDecode
193 subl %ecx, %edx /* RangeDecoderBitTreeDecode */
194 popl %ecx /* RangeDecoderReverseBitTreeDecode */
199 addl $LenChoice, %eax
200 call RangeDecoderBitDecode
204 movb $kLenNumLowBits, %cl
212 call RangeDecoderBitTreeDecode
219 addl $LenChoice2, %eax
220 call RangeDecoderBitDecode
223 pushl $kLenNumLowSymbols
224 movb $kLenNumMidBits, %cl
229 pushl $(kLenNumLowSymbols + kLenNumMidSymbols)
231 movb $kLenNumHighBits, %cl
241 * int LzmaDecode(CLzmaDecoderState *vs,
242 * const unsigned char *inStream,
243 * unsigned char *outStream,
251 subl $LOCAL_SIZE, %esp
269 movl $(Literal + (LZMA_LIT_SIZE << (FIXED_LC + FIXED_LP))), %ecx
271 movl $LZMA_LIT_SIZE, %eax
280 movl $(kBitModelTotal >> 1), %eax
303 movl %edx, pos_state_mask
309 movl %edx, lit_pos_mask;
312 /* RangeDecoderInit */
346 andl $POS_STATE_MASK, %eax
348 andl pos_state_mask, %eax
350 pushl %eax /* posState */
352 shll $kNumPosBitsMax, %edx
354 pushl %eax /* (state << kNumPosBitsMax) + posState */
356 call RangeDecoderBitDecode
362 andl $LIT_POS_MASK, %eax
365 shrl $(8 - FIXED_LC), %edx
367 andl lit_pos_mask, %eax
377 movl $LZMA_LIT_SIZE, %edx
382 incl %edx /* edx = 1 */
386 pushl (%edi, %eax) /* matchByte */
388 cmpb $kNumLitStates, state
391 /* LzmaLiteralDecodeMatch */
405 leal 0x100(%edx, %eax), %eax
407 call RangeDecoderBitDecode
419 /* LzmaLiteralDecode */
427 call RangeDecoderBitDecode
455 call RangeDecoderBitDecode
460 call RangeDecoderBitDecode
464 addl $IsRep0Long, %eax
465 call RangeDecoderBitDecode
481 movb (%edi, %edx), %al
492 call RangeDecoderBitDecode
498 call RangeDecoderBitDecode
511 movl $RepLenCoder, %eax
537 movl $(kNumLenToPosStates - 1), %eax
542 movb $kNumPosSlotBits, %cl
544 leal PosSlot(%edx), %eax
545 call RangeDecoderBitTreeDecode
548 cmpl $kStartPosModelIndex, %edx
561 cmpl $kEndPosModelIndex, %edx
564 addl $(SpecPos - 1), %eax
569 subb $kNumAlignBits, %cl
571 /* RangeDecoderDecodeDirectBits */
585 cmpl $kTopValue, %eax
595 movb $kNumAlignBits, %cl
602 call RangeDecoderReverseBitTreeDecode
611 addl $kMatchMinLen, %edx