xref: /aosp_15_r20/external/lzma/Asm/x86/LzmaDecOpt.asm (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker; LzmaDecOpt.asm -- ASM version of LzmaDec_DecodeReal_3() function
2*f6dc9357SAndroid Build Coastguard Worker; 2024-06-18: Igor Pavlov : Public domain
3*f6dc9357SAndroid Build Coastguard Worker;
4*f6dc9357SAndroid Build Coastguard Worker; 3 - is the code compatibility version of LzmaDec_DecodeReal_*()
5*f6dc9357SAndroid Build Coastguard Worker; function for check at link time.
6*f6dc9357SAndroid Build Coastguard Worker; That code is tightly coupled with LzmaDec_TryDummy()
7*f6dc9357SAndroid Build Coastguard Worker; and with another functions in LzmaDec.c file.
8*f6dc9357SAndroid Build Coastguard Worker; CLzmaDec structure, (probs) array layout, input and output of
9*f6dc9357SAndroid Build Coastguard Worker; LzmaDec_DecodeReal_*() must be equal in both versions (C / ASM).
10*f6dc9357SAndroid Build Coastguard Worker
11*f6dc9357SAndroid Build Coastguard Workerifndef x64
12*f6dc9357SAndroid Build Coastguard Worker; x64=1
13*f6dc9357SAndroid Build Coastguard Worker; .err <x64_IS_REQUIRED>
14*f6dc9357SAndroid Build Coastguard Workerendif
15*f6dc9357SAndroid Build Coastguard Worker
16*f6dc9357SAndroid Build Coastguard Workerinclude 7zAsm.asm
17*f6dc9357SAndroid Build Coastguard Worker
18*f6dc9357SAndroid Build Coastguard WorkerMY_ASM_START
19*f6dc9357SAndroid Build Coastguard Worker
20*f6dc9357SAndroid Build Coastguard Worker; if Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT is     defined, we use additional SEGMENT with 64-byte alignment.
21*f6dc9357SAndroid Build Coastguard Worker; if Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT is not defined, we use default SEGMENT (where default 16-byte alignment of segment is expected).
22*f6dc9357SAndroid Build Coastguard Worker; The performance is almost identical in our tests.
23*f6dc9357SAndroid Build Coastguard Worker; But the performance can depend from position of lzmadec code inside instruction cache
24*f6dc9357SAndroid Build Coastguard Worker; or micro-op cache line (depending from low address bits in 32-byte/64-byte cache lines).
25*f6dc9357SAndroid Build Coastguard Worker; And 64-byte alignment provides a more consistent speed regardless
26*f6dc9357SAndroid Build Coastguard Worker; of the code's position in the executable.
27*f6dc9357SAndroid Build Coastguard Worker; But also it's possible that code without Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT can be
28*f6dc9357SAndroid Build Coastguard Worker; slightly faster than 64-bytes aligned code in some cases, if offset of lzmadec
29*f6dc9357SAndroid Build Coastguard Worker; code in 64-byte block after compilation provides better speed by some reason.
30*f6dc9357SAndroid Build Coastguard Worker; Note that Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT adds an extra section to the ELF file.
31*f6dc9357SAndroid Build Coastguard Worker; If you don't want to get that extra section, do not define Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT.
32*f6dc9357SAndroid Build Coastguard Worker
33*f6dc9357SAndroid Build Coastguard Workerifndef Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT
34*f6dc9357SAndroid Build Coastguard Workerif (IS_LINUX gt 0)
35*f6dc9357SAndroid Build Coastguard Worker  Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT equ 1
36*f6dc9357SAndroid Build Coastguard Workerelse
37*f6dc9357SAndroid Build Coastguard Worker  Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT equ 1
38*f6dc9357SAndroid Build Coastguard Workerendif
39*f6dc9357SAndroid Build Coastguard Workerendif
40*f6dc9357SAndroid Build Coastguard Worker
41*f6dc9357SAndroid Build Coastguard Workerifdef Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT
42*f6dc9357SAndroid Build Coastguard Worker_TEXT$LZMADECOPT SEGMENT ALIGN(64) 'CODE'
43*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN macro num:req
44*f6dc9357SAndroid Build Coastguard Worker        align  num
45*f6dc9357SAndroid Build Coastguard Worker        ; align  16
46*f6dc9357SAndroid Build Coastguard Workerendm
47*f6dc9357SAndroid Build Coastguard Workerelse
48*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN macro num:req
49*f6dc9357SAndroid Build Coastguard Worker        ; We expect that ".text" is aligned for 16-bytes.
50*f6dc9357SAndroid Build Coastguard Worker        ; So we don't need large alignment inside out function.
51*f6dc9357SAndroid Build Coastguard Worker        align  16
52*f6dc9357SAndroid Build Coastguard Workerendm
53*f6dc9357SAndroid Build Coastguard Workerendif
54*f6dc9357SAndroid Build Coastguard Worker
55*f6dc9357SAndroid Build Coastguard Worker
56*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_16 macro
57*f6dc9357SAndroid Build Coastguard Worker        MY_ALIGN 16
58*f6dc9357SAndroid Build Coastguard Workerendm
59*f6dc9357SAndroid Build Coastguard Worker
60*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_32 macro
61*f6dc9357SAndroid Build Coastguard Worker        MY_ALIGN 32
62*f6dc9357SAndroid Build Coastguard Workerendm
63*f6dc9357SAndroid Build Coastguard Worker
64*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_64 macro
65*f6dc9357SAndroid Build Coastguard Worker        MY_ALIGN 64
66*f6dc9357SAndroid Build Coastguard Workerendm
67*f6dc9357SAndroid Build Coastguard Worker
68*f6dc9357SAndroid Build Coastguard Worker
69*f6dc9357SAndroid Build Coastguard Worker; _LZMA_SIZE_OPT  equ 1
70*f6dc9357SAndroid Build Coastguard Worker
71*f6dc9357SAndroid Build Coastguard Worker; _LZMA_PROB32 equ 1
72*f6dc9357SAndroid Build Coastguard Worker
73*f6dc9357SAndroid Build Coastguard Workerifdef _LZMA_PROB32
74*f6dc9357SAndroid Build Coastguard Worker        PSHIFT  equ 2
75*f6dc9357SAndroid Build Coastguard Worker        PLOAD macro dest, mem
76*f6dc9357SAndroid Build Coastguard Worker                mov     dest, dword ptr [mem]
77*f6dc9357SAndroid Build Coastguard Worker        endm
78*f6dc9357SAndroid Build Coastguard Worker        PSTORE  macro src, mem
79*f6dc9357SAndroid Build Coastguard Worker                mov     dword ptr [mem], src
80*f6dc9357SAndroid Build Coastguard Worker        endm
81*f6dc9357SAndroid Build Coastguard Workerelse
82*f6dc9357SAndroid Build Coastguard Worker        PSHIFT  equ 1
83*f6dc9357SAndroid Build Coastguard Worker        PLOAD macro dest, mem
84*f6dc9357SAndroid Build Coastguard Worker                movzx   dest, word ptr [mem]
85*f6dc9357SAndroid Build Coastguard Worker        endm
86*f6dc9357SAndroid Build Coastguard Worker        PSTORE macro src, mem
87*f6dc9357SAndroid Build Coastguard Worker                mov     word ptr [mem], @CatStr(src, _W)
88*f6dc9357SAndroid Build Coastguard Worker        endm
89*f6dc9357SAndroid Build Coastguard Workerendif
90*f6dc9357SAndroid Build Coastguard Worker
91*f6dc9357SAndroid Build Coastguard WorkerPMULT           equ (1 SHL PSHIFT)
92*f6dc9357SAndroid Build Coastguard WorkerPMULT_HALF      equ (1 SHL (PSHIFT - 1))
93*f6dc9357SAndroid Build Coastguard WorkerPMULT_2         equ (1 SHL (PSHIFT + 1))
94*f6dc9357SAndroid Build Coastguard Worker
95*f6dc9357SAndroid Build Coastguard WorkerkMatchSpecLen_Error_Data equ (1 SHL 9)
96*f6dc9357SAndroid Build Coastguard Worker
97*f6dc9357SAndroid Build Coastguard Worker;       x0      range
98*f6dc9357SAndroid Build Coastguard Worker;       x1      pbPos / (prob) TREE
99*f6dc9357SAndroid Build Coastguard Worker;       x2      probBranch / prm (MATCHED) / pbPos / cnt
100*f6dc9357SAndroid Build Coastguard Worker;       x3      sym
101*f6dc9357SAndroid Build Coastguard Worker;====== r4 ===  RSP
102*f6dc9357SAndroid Build Coastguard Worker;       x5      cod
103*f6dc9357SAndroid Build Coastguard Worker;       x6      t1 NORM_CALC / probs_state / dist
104*f6dc9357SAndroid Build Coastguard Worker;       x7      t0 NORM_CALC / prob2 IF_BIT_1
105*f6dc9357SAndroid Build Coastguard Worker;       x8      state
106*f6dc9357SAndroid Build Coastguard Worker;       x9      match (MATCHED) / sym2 / dist2 / lpMask_reg
107*f6dc9357SAndroid Build Coastguard Worker;       x10     kBitModelTotal_reg
108*f6dc9357SAndroid Build Coastguard Worker;       r11     probs
109*f6dc9357SAndroid Build Coastguard Worker;       x12     offs (MATCHED) / dic / len_temp
110*f6dc9357SAndroid Build Coastguard Worker;       x13     processedPos
111*f6dc9357SAndroid Build Coastguard Worker;       x14     bit (MATCHED) / dicPos
112*f6dc9357SAndroid Build Coastguard Worker;       r15     buf
113*f6dc9357SAndroid Build Coastguard Worker
114*f6dc9357SAndroid Build Coastguard Worker
115*f6dc9357SAndroid Build Coastguard Workercod     equ x5
116*f6dc9357SAndroid Build Coastguard Workercod_L   equ x5_L
117*f6dc9357SAndroid Build Coastguard Workerrange   equ x0
118*f6dc9357SAndroid Build Coastguard Workerstate   equ x8
119*f6dc9357SAndroid Build Coastguard Workerstate_R equ r8
120*f6dc9357SAndroid Build Coastguard Workerbuf     equ r15
121*f6dc9357SAndroid Build Coastguard WorkerprocessedPos equ x13
122*f6dc9357SAndroid Build Coastguard WorkerkBitModelTotal_reg equ x10
123*f6dc9357SAndroid Build Coastguard Worker
124*f6dc9357SAndroid Build Coastguard WorkerprobBranch   equ x2
125*f6dc9357SAndroid Build Coastguard WorkerprobBranch_R equ r2
126*f6dc9357SAndroid Build Coastguard WorkerprobBranch_W equ x2_W
127*f6dc9357SAndroid Build Coastguard Worker
128*f6dc9357SAndroid Build Coastguard WorkerpbPos   equ x1
129*f6dc9357SAndroid Build Coastguard WorkerpbPos_R equ r1
130*f6dc9357SAndroid Build Coastguard Worker
131*f6dc9357SAndroid Build Coastguard Workercnt     equ x2
132*f6dc9357SAndroid Build Coastguard Workercnt_R   equ r2
133*f6dc9357SAndroid Build Coastguard Worker
134*f6dc9357SAndroid Build Coastguard WorkerlpMask_reg equ x9
135*f6dc9357SAndroid Build Coastguard WorkerdicPos  equ r14
136*f6dc9357SAndroid Build Coastguard Worker
137*f6dc9357SAndroid Build Coastguard Workersym     equ x3
138*f6dc9357SAndroid Build Coastguard Workersym_R   equ r3
139*f6dc9357SAndroid Build Coastguard Workersym_L   equ x3_L
140*f6dc9357SAndroid Build Coastguard Worker
141*f6dc9357SAndroid Build Coastguard Workerprobs   equ r11
142*f6dc9357SAndroid Build Coastguard Workerdic     equ r12
143*f6dc9357SAndroid Build Coastguard Worker
144*f6dc9357SAndroid Build Coastguard Workert0      equ x7
145*f6dc9357SAndroid Build Coastguard Workert0_W    equ x7_W
146*f6dc9357SAndroid Build Coastguard Workert0_R    equ r7
147*f6dc9357SAndroid Build Coastguard Worker
148*f6dc9357SAndroid Build Coastguard Workerprob2   equ t0
149*f6dc9357SAndroid Build Coastguard Workerprob2_W equ t0_W
150*f6dc9357SAndroid Build Coastguard Worker
151*f6dc9357SAndroid Build Coastguard Workert1      equ x6
152*f6dc9357SAndroid Build Coastguard Workert1_R    equ r6
153*f6dc9357SAndroid Build Coastguard Worker
154*f6dc9357SAndroid Build Coastguard Workerprobs_state     equ t1
155*f6dc9357SAndroid Build Coastguard Workerprobs_state_R   equ t1_R
156*f6dc9357SAndroid Build Coastguard Worker
157*f6dc9357SAndroid Build Coastguard Workerprm     equ r2
158*f6dc9357SAndroid Build Coastguard Workermatch   equ x9
159*f6dc9357SAndroid Build Coastguard Workermatch_R equ r9
160*f6dc9357SAndroid Build Coastguard Workeroffs    equ x12
161*f6dc9357SAndroid Build Coastguard Workeroffs_R  equ r12
162*f6dc9357SAndroid Build Coastguard Workerbit     equ x14
163*f6dc9357SAndroid Build Coastguard Workerbit_R   equ r14
164*f6dc9357SAndroid Build Coastguard Worker
165*f6dc9357SAndroid Build Coastguard Workersym2    equ x9
166*f6dc9357SAndroid Build Coastguard Workersym2_R  equ r9
167*f6dc9357SAndroid Build Coastguard Worker
168*f6dc9357SAndroid Build Coastguard Workerlen_temp equ x12
169*f6dc9357SAndroid Build Coastguard Worker
170*f6dc9357SAndroid Build Coastguard Workerdist    equ sym
171*f6dc9357SAndroid Build Coastguard Workerdist2   equ x9
172*f6dc9357SAndroid Build Coastguard Worker
173*f6dc9357SAndroid Build Coastguard Worker
174*f6dc9357SAndroid Build Coastguard Worker
175*f6dc9357SAndroid Build Coastguard WorkerkNumBitModelTotalBits   equ 11
176*f6dc9357SAndroid Build Coastguard WorkerkBitModelTotal          equ (1 SHL kNumBitModelTotalBits)
177*f6dc9357SAndroid Build Coastguard WorkerkNumMoveBits            equ 5
178*f6dc9357SAndroid Build Coastguard WorkerkBitModelOffset         equ ((1 SHL kNumMoveBits) - 1)
179*f6dc9357SAndroid Build Coastguard WorkerkTopValue               equ (1 SHL 24)
180*f6dc9357SAndroid Build Coastguard Worker
181*f6dc9357SAndroid Build Coastguard WorkerNORM_2 macro
182*f6dc9357SAndroid Build Coastguard Worker        ; movzx   t0, BYTE PTR [buf]
183*f6dc9357SAndroid Build Coastguard Worker        shl     cod, 8
184*f6dc9357SAndroid Build Coastguard Worker        mov     cod_L, BYTE PTR [buf]
185*f6dc9357SAndroid Build Coastguard Worker        shl     range, 8
186*f6dc9357SAndroid Build Coastguard Worker        ; or      cod, t0
187*f6dc9357SAndroid Build Coastguard Worker        inc     buf
188*f6dc9357SAndroid Build Coastguard Workerendm
189*f6dc9357SAndroid Build Coastguard Worker
190*f6dc9357SAndroid Build Coastguard Worker
191*f6dc9357SAndroid Build Coastguard WorkerNORM macro
192*f6dc9357SAndroid Build Coastguard Worker        cmp     range, kTopValue
193*f6dc9357SAndroid Build Coastguard Worker        jae     SHORT @F
194*f6dc9357SAndroid Build Coastguard Worker        NORM_2
195*f6dc9357SAndroid Build Coastguard Worker@@:
196*f6dc9357SAndroid Build Coastguard Workerendm
197*f6dc9357SAndroid Build Coastguard Worker
198*f6dc9357SAndroid Build Coastguard Worker
199*f6dc9357SAndroid Build Coastguard Worker; ---------- Branch MACROS ----------
200*f6dc9357SAndroid Build Coastguard Worker
201*f6dc9357SAndroid Build Coastguard WorkerUPDATE_0 macro probsArray:req, probOffset:req, probDisp:req
202*f6dc9357SAndroid Build Coastguard Worker        mov     prob2, kBitModelTotal_reg
203*f6dc9357SAndroid Build Coastguard Worker        sub     prob2, probBranch
204*f6dc9357SAndroid Build Coastguard Worker        shr     prob2, kNumMoveBits
205*f6dc9357SAndroid Build Coastguard Worker        add     probBranch, prob2
206*f6dc9357SAndroid Build Coastguard Worker        PSTORE  probBranch, probOffset * 1 + probsArray + probDisp * PMULT
207*f6dc9357SAndroid Build Coastguard Workerendm
208*f6dc9357SAndroid Build Coastguard Worker
209*f6dc9357SAndroid Build Coastguard Worker
210*f6dc9357SAndroid Build Coastguard WorkerUPDATE_1 macro probsArray:req, probOffset:req, probDisp:req
211*f6dc9357SAndroid Build Coastguard Worker        sub     prob2, range
212*f6dc9357SAndroid Build Coastguard Worker        sub     cod, range
213*f6dc9357SAndroid Build Coastguard Worker        mov     range, prob2
214*f6dc9357SAndroid Build Coastguard Worker        mov     prob2, probBranch
215*f6dc9357SAndroid Build Coastguard Worker        shr     probBranch, kNumMoveBits
216*f6dc9357SAndroid Build Coastguard Worker        sub     prob2, probBranch
217*f6dc9357SAndroid Build Coastguard Worker        PSTORE  prob2, probOffset * 1 + probsArray + probDisp * PMULT
218*f6dc9357SAndroid Build Coastguard Workerendm
219*f6dc9357SAndroid Build Coastguard Worker
220*f6dc9357SAndroid Build Coastguard Worker
221*f6dc9357SAndroid Build Coastguard WorkerCMP_COD macro probsArray:req, probOffset:req, probDisp:req
222*f6dc9357SAndroid Build Coastguard Worker        PLOAD   probBranch, probOffset * 1 + probsArray + probDisp * PMULT
223*f6dc9357SAndroid Build Coastguard Worker        NORM
224*f6dc9357SAndroid Build Coastguard Worker        mov     prob2, range
225*f6dc9357SAndroid Build Coastguard Worker        shr     range, kNumBitModelTotalBits
226*f6dc9357SAndroid Build Coastguard Worker        imul    range, probBranch
227*f6dc9357SAndroid Build Coastguard Worker        cmp     cod, range
228*f6dc9357SAndroid Build Coastguard Workerendm
229*f6dc9357SAndroid Build Coastguard Worker
230*f6dc9357SAndroid Build Coastguard Worker
231*f6dc9357SAndroid Build Coastguard WorkerIF_BIT_1_NOUP macro probsArray:req, probOffset:req, probDisp:req, toLabel:req
232*f6dc9357SAndroid Build Coastguard Worker        CMP_COD probsArray, probOffset, probDisp
233*f6dc9357SAndroid Build Coastguard Worker        jae     toLabel
234*f6dc9357SAndroid Build Coastguard Workerendm
235*f6dc9357SAndroid Build Coastguard Worker
236*f6dc9357SAndroid Build Coastguard Worker
237*f6dc9357SAndroid Build Coastguard WorkerIF_BIT_1 macro probsArray:req, probOffset:req, probDisp:req, toLabel:req
238*f6dc9357SAndroid Build Coastguard Worker        IF_BIT_1_NOUP probsArray, probOffset, probDisp, toLabel
239*f6dc9357SAndroid Build Coastguard Worker        UPDATE_0 probsArray, probOffset, probDisp
240*f6dc9357SAndroid Build Coastguard Workerendm
241*f6dc9357SAndroid Build Coastguard Worker
242*f6dc9357SAndroid Build Coastguard Worker
243*f6dc9357SAndroid Build Coastguard WorkerIF_BIT_0_NOUP macro probsArray:req, probOffset:req, probDisp:req, toLabel:req
244*f6dc9357SAndroid Build Coastguard Worker        CMP_COD probsArray, probOffset, probDisp
245*f6dc9357SAndroid Build Coastguard Worker        jb      toLabel
246*f6dc9357SAndroid Build Coastguard Workerendm
247*f6dc9357SAndroid Build Coastguard Worker
248*f6dc9357SAndroid Build Coastguard Worker
249*f6dc9357SAndroid Build Coastguard Worker; ---------- CMOV MACROS ----------
250*f6dc9357SAndroid Build Coastguard Worker
251*f6dc9357SAndroid Build Coastguard WorkerNORM_CALC macro prob:req
252*f6dc9357SAndroid Build Coastguard Worker        NORM
253*f6dc9357SAndroid Build Coastguard Worker        mov     t0, range
254*f6dc9357SAndroid Build Coastguard Worker        shr     range, kNumBitModelTotalBits
255*f6dc9357SAndroid Build Coastguard Worker        imul    range, prob
256*f6dc9357SAndroid Build Coastguard Worker        sub     t0, range
257*f6dc9357SAndroid Build Coastguard Worker        mov     t1, cod
258*f6dc9357SAndroid Build Coastguard Worker        sub     cod, range
259*f6dc9357SAndroid Build Coastguard Workerendm
260*f6dc9357SAndroid Build Coastguard Worker
261*f6dc9357SAndroid Build Coastguard Worker
262*f6dc9357SAndroid Build Coastguard WorkerPUP macro prob:req, probPtr:req
263*f6dc9357SAndroid Build Coastguard Worker        sub     t0, prob
264*f6dc9357SAndroid Build Coastguard Worker       ; only sar works for both 16/32 bit prob modes
265*f6dc9357SAndroid Build Coastguard Worker        sar     t0, kNumMoveBits
266*f6dc9357SAndroid Build Coastguard Worker        add     t0, prob
267*f6dc9357SAndroid Build Coastguard Worker        PSTORE  t0, probPtr
268*f6dc9357SAndroid Build Coastguard Workerendm
269*f6dc9357SAndroid Build Coastguard Worker
270*f6dc9357SAndroid Build Coastguard Worker
271*f6dc9357SAndroid Build Coastguard WorkerPUP_SUB macro prob:req, probPtr:req, symSub:req
272*f6dc9357SAndroid Build Coastguard Worker        sbb     sym, symSub
273*f6dc9357SAndroid Build Coastguard Worker        PUP prob, probPtr
274*f6dc9357SAndroid Build Coastguard Workerendm
275*f6dc9357SAndroid Build Coastguard Worker
276*f6dc9357SAndroid Build Coastguard Worker
277*f6dc9357SAndroid Build Coastguard WorkerPUP_COD macro prob:req, probPtr:req, symSub:req
278*f6dc9357SAndroid Build Coastguard Worker        mov     t0, kBitModelOffset
279*f6dc9357SAndroid Build Coastguard Worker        cmovb   cod, t1
280*f6dc9357SAndroid Build Coastguard Worker        mov     t1, sym
281*f6dc9357SAndroid Build Coastguard Worker        cmovb   t0, kBitModelTotal_reg
282*f6dc9357SAndroid Build Coastguard Worker        PUP_SUB prob, probPtr, symSub
283*f6dc9357SAndroid Build Coastguard Workerendm
284*f6dc9357SAndroid Build Coastguard Worker
285*f6dc9357SAndroid Build Coastguard Worker
286*f6dc9357SAndroid Build Coastguard WorkerBIT_0 macro prob:req, probNext:req
287*f6dc9357SAndroid Build Coastguard Worker        PLOAD   prob, probs + 1 * PMULT
288*f6dc9357SAndroid Build Coastguard Worker        PLOAD   probNext, probs + 1 * PMULT_2
289*f6dc9357SAndroid Build Coastguard Worker
290*f6dc9357SAndroid Build Coastguard Worker        NORM_CALC prob
291*f6dc9357SAndroid Build Coastguard Worker
292*f6dc9357SAndroid Build Coastguard Worker        cmovae  range, t0
293*f6dc9357SAndroid Build Coastguard Worker        PLOAD   t0, probs + 1 * PMULT_2 + PMULT
294*f6dc9357SAndroid Build Coastguard Worker        cmovae  probNext, t0
295*f6dc9357SAndroid Build Coastguard Worker        mov     t0, kBitModelOffset
296*f6dc9357SAndroid Build Coastguard Worker        cmovb   cod, t1
297*f6dc9357SAndroid Build Coastguard Worker        cmovb   t0, kBitModelTotal_reg
298*f6dc9357SAndroid Build Coastguard Worker        mov     sym, 2
299*f6dc9357SAndroid Build Coastguard Worker        PUP_SUB prob, probs + 1 * PMULT, 0 - 1
300*f6dc9357SAndroid Build Coastguard Workerendm
301*f6dc9357SAndroid Build Coastguard Worker
302*f6dc9357SAndroid Build Coastguard Worker
303*f6dc9357SAndroid Build Coastguard WorkerBIT_1 macro prob:req, probNext:req
304*f6dc9357SAndroid Build Coastguard Worker        PLOAD   probNext, probs + sym_R * PMULT_2
305*f6dc9357SAndroid Build Coastguard Worker        add     sym, sym
306*f6dc9357SAndroid Build Coastguard Worker
307*f6dc9357SAndroid Build Coastguard Worker        NORM_CALC prob
308*f6dc9357SAndroid Build Coastguard Worker
309*f6dc9357SAndroid Build Coastguard Worker        cmovae  range, t0
310*f6dc9357SAndroid Build Coastguard Worker        PLOAD   t0, probs + sym_R * PMULT + PMULT
311*f6dc9357SAndroid Build Coastguard Worker        cmovae  probNext, t0
312*f6dc9357SAndroid Build Coastguard Worker        PUP_COD prob, probs + t1_R * PMULT_HALF, 0 - 1
313*f6dc9357SAndroid Build Coastguard Workerendm
314*f6dc9357SAndroid Build Coastguard Worker
315*f6dc9357SAndroid Build Coastguard Worker
316*f6dc9357SAndroid Build Coastguard WorkerBIT_2 macro prob:req, symSub:req
317*f6dc9357SAndroid Build Coastguard Worker        add     sym, sym
318*f6dc9357SAndroid Build Coastguard Worker
319*f6dc9357SAndroid Build Coastguard Worker        NORM_CALC prob
320*f6dc9357SAndroid Build Coastguard Worker
321*f6dc9357SAndroid Build Coastguard Worker        cmovae  range, t0
322*f6dc9357SAndroid Build Coastguard Worker        PUP_COD prob, probs + t1_R * PMULT_HALF, symSub
323*f6dc9357SAndroid Build Coastguard Workerendm
324*f6dc9357SAndroid Build Coastguard Worker
325*f6dc9357SAndroid Build Coastguard Worker
326*f6dc9357SAndroid Build Coastguard Worker; ---------- MATCHED LITERAL ----------
327*f6dc9357SAndroid Build Coastguard Worker
328*f6dc9357SAndroid Build Coastguard WorkerLITM_0 macro
329*f6dc9357SAndroid Build Coastguard Worker        mov     offs, 256 * PMULT
330*f6dc9357SAndroid Build Coastguard Worker        shl     match, (PSHIFT + 1)
331*f6dc9357SAndroid Build Coastguard Worker        mov     bit, offs
332*f6dc9357SAndroid Build Coastguard Worker        and     bit, match
333*f6dc9357SAndroid Build Coastguard Worker        PLOAD   x1, probs + 256 * PMULT + bit_R * 1 + 1 * PMULT
334*f6dc9357SAndroid Build Coastguard Worker        lea     prm, [probs + 256 * PMULT + bit_R * 1 + 1 * PMULT]
335*f6dc9357SAndroid Build Coastguard Worker        ; lea     prm, [probs + 256 * PMULT + 1 * PMULT]
336*f6dc9357SAndroid Build Coastguard Worker        ; add     prm, bit_R
337*f6dc9357SAndroid Build Coastguard Worker        xor     offs, bit
338*f6dc9357SAndroid Build Coastguard Worker        add     match, match
339*f6dc9357SAndroid Build Coastguard Worker
340*f6dc9357SAndroid Build Coastguard Worker        NORM_CALC x1
341*f6dc9357SAndroid Build Coastguard Worker
342*f6dc9357SAndroid Build Coastguard Worker        cmovae  offs, bit
343*f6dc9357SAndroid Build Coastguard Worker        mov     bit, match
344*f6dc9357SAndroid Build Coastguard Worker        cmovae  range, t0
345*f6dc9357SAndroid Build Coastguard Worker        mov     t0, kBitModelOffset
346*f6dc9357SAndroid Build Coastguard Worker        cmovb   cod, t1
347*f6dc9357SAndroid Build Coastguard Worker        cmovb   t0, kBitModelTotal_reg
348*f6dc9357SAndroid Build Coastguard Worker        mov     sym, 0
349*f6dc9357SAndroid Build Coastguard Worker        PUP_SUB x1, prm, -2-1
350*f6dc9357SAndroid Build Coastguard Workerendm
351*f6dc9357SAndroid Build Coastguard Worker
352*f6dc9357SAndroid Build Coastguard Worker
353*f6dc9357SAndroid Build Coastguard WorkerLITM macro
354*f6dc9357SAndroid Build Coastguard Worker        and     bit, offs
355*f6dc9357SAndroid Build Coastguard Worker        lea     prm, [probs + offs_R * 1]
356*f6dc9357SAndroid Build Coastguard Worker        add     prm, bit_R
357*f6dc9357SAndroid Build Coastguard Worker        PLOAD   x1, prm + sym_R * PMULT
358*f6dc9357SAndroid Build Coastguard Worker        xor     offs, bit
359*f6dc9357SAndroid Build Coastguard Worker        add     sym, sym
360*f6dc9357SAndroid Build Coastguard Worker        add     match, match
361*f6dc9357SAndroid Build Coastguard Worker
362*f6dc9357SAndroid Build Coastguard Worker        NORM_CALC x1
363*f6dc9357SAndroid Build Coastguard Worker
364*f6dc9357SAndroid Build Coastguard Worker        cmovae  offs, bit
365*f6dc9357SAndroid Build Coastguard Worker        mov     bit, match
366*f6dc9357SAndroid Build Coastguard Worker        cmovae  range, t0
367*f6dc9357SAndroid Build Coastguard Worker        PUP_COD x1, prm + t1_R * PMULT_HALF, - 1
368*f6dc9357SAndroid Build Coastguard Workerendm
369*f6dc9357SAndroid Build Coastguard Worker
370*f6dc9357SAndroid Build Coastguard Worker
371*f6dc9357SAndroid Build Coastguard WorkerLITM_2 macro
372*f6dc9357SAndroid Build Coastguard Worker        and     bit, offs
373*f6dc9357SAndroid Build Coastguard Worker        lea     prm, [probs + offs_R * 1]
374*f6dc9357SAndroid Build Coastguard Worker        add     prm, bit_R
375*f6dc9357SAndroid Build Coastguard Worker        PLOAD   x1, prm + sym_R * PMULT
376*f6dc9357SAndroid Build Coastguard Worker        add     sym, sym
377*f6dc9357SAndroid Build Coastguard Worker
378*f6dc9357SAndroid Build Coastguard Worker        NORM_CALC x1
379*f6dc9357SAndroid Build Coastguard Worker
380*f6dc9357SAndroid Build Coastguard Worker        cmovae  range, t0
381*f6dc9357SAndroid Build Coastguard Worker        PUP_COD x1, prm + t1_R * PMULT_HALF, 256 - 1
382*f6dc9357SAndroid Build Coastguard Workerendm
383*f6dc9357SAndroid Build Coastguard Worker
384*f6dc9357SAndroid Build Coastguard Worker
385*f6dc9357SAndroid Build Coastguard Worker; ---------- REVERSE BITS ----------
386*f6dc9357SAndroid Build Coastguard Worker
387*f6dc9357SAndroid Build Coastguard WorkerREV_0 macro prob:req, probNext:req
388*f6dc9357SAndroid Build Coastguard Worker        ; PLOAD   prob, probs + 1 * PMULT
389*f6dc9357SAndroid Build Coastguard Worker        ; lea     sym2_R, [probs + 2 * PMULT]
390*f6dc9357SAndroid Build Coastguard Worker        ; PLOAD   probNext, probs + 2 * PMULT
391*f6dc9357SAndroid Build Coastguard Worker        PLOAD   probNext, sym2_R
392*f6dc9357SAndroid Build Coastguard Worker
393*f6dc9357SAndroid Build Coastguard Worker        NORM_CALC prob
394*f6dc9357SAndroid Build Coastguard Worker
395*f6dc9357SAndroid Build Coastguard Worker        cmovae  range, t0
396*f6dc9357SAndroid Build Coastguard Worker        PLOAD   t0, probs + 3 * PMULT
397*f6dc9357SAndroid Build Coastguard Worker        cmovae  probNext, t0
398*f6dc9357SAndroid Build Coastguard Worker        cmovb   cod, t1
399*f6dc9357SAndroid Build Coastguard Worker        mov     t0, kBitModelOffset
400*f6dc9357SAndroid Build Coastguard Worker        cmovb   t0, kBitModelTotal_reg
401*f6dc9357SAndroid Build Coastguard Worker        lea     t1_R, [probs + 3 * PMULT]
402*f6dc9357SAndroid Build Coastguard Worker        cmovae  sym2_R, t1_R
403*f6dc9357SAndroid Build Coastguard Worker        PUP prob, probs + 1 * PMULT
404*f6dc9357SAndroid Build Coastguard Workerendm
405*f6dc9357SAndroid Build Coastguard Worker
406*f6dc9357SAndroid Build Coastguard Worker
407*f6dc9357SAndroid Build Coastguard WorkerREV_1 macro prob:req, probNext:req, step:req
408*f6dc9357SAndroid Build Coastguard Worker        add     sym2_R, step * PMULT
409*f6dc9357SAndroid Build Coastguard Worker        PLOAD   probNext, sym2_R
410*f6dc9357SAndroid Build Coastguard Worker
411*f6dc9357SAndroid Build Coastguard Worker        NORM_CALC prob
412*f6dc9357SAndroid Build Coastguard Worker
413*f6dc9357SAndroid Build Coastguard Worker        cmovae  range, t0
414*f6dc9357SAndroid Build Coastguard Worker        PLOAD   t0, sym2_R + step * PMULT
415*f6dc9357SAndroid Build Coastguard Worker        cmovae  probNext, t0
416*f6dc9357SAndroid Build Coastguard Worker        cmovb   cod, t1
417*f6dc9357SAndroid Build Coastguard Worker        mov     t0, kBitModelOffset
418*f6dc9357SAndroid Build Coastguard Worker        cmovb   t0, kBitModelTotal_reg
419*f6dc9357SAndroid Build Coastguard Worker        lea     t1_R, [sym2_R + step * PMULT]
420*f6dc9357SAndroid Build Coastguard Worker        cmovae  sym2_R, t1_R
421*f6dc9357SAndroid Build Coastguard Worker        PUP prob, t1_R - step * PMULT_2
422*f6dc9357SAndroid Build Coastguard Workerendm
423*f6dc9357SAndroid Build Coastguard Worker
424*f6dc9357SAndroid Build Coastguard Worker
425*f6dc9357SAndroid Build Coastguard WorkerREV_2 macro prob:req, step:req
426*f6dc9357SAndroid Build Coastguard Worker        sub     sym2_R, probs
427*f6dc9357SAndroid Build Coastguard Worker        shr     sym2, PSHIFT
428*f6dc9357SAndroid Build Coastguard Worker        or      sym, sym2
429*f6dc9357SAndroid Build Coastguard Worker
430*f6dc9357SAndroid Build Coastguard Worker        NORM_CALC prob
431*f6dc9357SAndroid Build Coastguard Worker
432*f6dc9357SAndroid Build Coastguard Worker        cmovae  range, t0
433*f6dc9357SAndroid Build Coastguard Worker        lea     t0, [sym - step]
434*f6dc9357SAndroid Build Coastguard Worker        cmovb   sym, t0
435*f6dc9357SAndroid Build Coastguard Worker        cmovb   cod, t1
436*f6dc9357SAndroid Build Coastguard Worker        mov     t0, kBitModelOffset
437*f6dc9357SAndroid Build Coastguard Worker        cmovb   t0, kBitModelTotal_reg
438*f6dc9357SAndroid Build Coastguard Worker        PUP prob, probs + sym2_R * PMULT
439*f6dc9357SAndroid Build Coastguard Workerendm
440*f6dc9357SAndroid Build Coastguard Worker
441*f6dc9357SAndroid Build Coastguard Worker
442*f6dc9357SAndroid Build Coastguard WorkerREV_1_VAR macro prob:req
443*f6dc9357SAndroid Build Coastguard Worker        PLOAD   prob, sym_R
444*f6dc9357SAndroid Build Coastguard Worker        mov     probs, sym_R
445*f6dc9357SAndroid Build Coastguard Worker        add     sym_R, sym2_R
446*f6dc9357SAndroid Build Coastguard Worker
447*f6dc9357SAndroid Build Coastguard Worker        NORM_CALC prob
448*f6dc9357SAndroid Build Coastguard Worker
449*f6dc9357SAndroid Build Coastguard Worker        cmovae  range, t0
450*f6dc9357SAndroid Build Coastguard Worker        lea     t0_R, [sym_R + 1 * sym2_R]
451*f6dc9357SAndroid Build Coastguard Worker        cmovae  sym_R, t0_R
452*f6dc9357SAndroid Build Coastguard Worker        mov     t0, kBitModelOffset
453*f6dc9357SAndroid Build Coastguard Worker        cmovb   cod, t1
454*f6dc9357SAndroid Build Coastguard Worker        ; mov     t1, kBitModelTotal
455*f6dc9357SAndroid Build Coastguard Worker        ; cmovb   t0, t1
456*f6dc9357SAndroid Build Coastguard Worker        cmovb   t0, kBitModelTotal_reg
457*f6dc9357SAndroid Build Coastguard Worker        add     sym2, sym2
458*f6dc9357SAndroid Build Coastguard Worker        PUP prob, probs
459*f6dc9357SAndroid Build Coastguard Workerendm
460*f6dc9357SAndroid Build Coastguard Worker
461*f6dc9357SAndroid Build Coastguard Worker
462*f6dc9357SAndroid Build Coastguard Worker
463*f6dc9357SAndroid Build Coastguard Worker
464*f6dc9357SAndroid Build Coastguard WorkerLIT_PROBS macro lpMaskParam:req
465*f6dc9357SAndroid Build Coastguard Worker        ; prob += (UInt32)3 * ((((processedPos << 8) + dic[(dicPos == 0 ? dicBufSize : dicPos) - 1]) & lpMask) << lc);
466*f6dc9357SAndroid Build Coastguard Worker        mov     t0, processedPos
467*f6dc9357SAndroid Build Coastguard Worker        shl     t0, 8
468*f6dc9357SAndroid Build Coastguard Worker        add     sym, t0
469*f6dc9357SAndroid Build Coastguard Worker        and     sym, lpMaskParam
470*f6dc9357SAndroid Build Coastguard Worker        add     probs_state_R, pbPos_R
471*f6dc9357SAndroid Build Coastguard Worker        mov     x1, LOC lc2
472*f6dc9357SAndroid Build Coastguard Worker        lea     sym, dword ptr[sym_R + 2 * sym_R]
473*f6dc9357SAndroid Build Coastguard Worker        add     probs, Literal * PMULT
474*f6dc9357SAndroid Build Coastguard Worker        shl     sym, x1_L
475*f6dc9357SAndroid Build Coastguard Worker        add     probs, sym_R
476*f6dc9357SAndroid Build Coastguard Worker        UPDATE_0 probs_state_R, 0, IsMatch
477*f6dc9357SAndroid Build Coastguard Worker        inc     processedPos
478*f6dc9357SAndroid Build Coastguard Workerendm
479*f6dc9357SAndroid Build Coastguard Worker
480*f6dc9357SAndroid Build Coastguard Worker
481*f6dc9357SAndroid Build Coastguard Worker
482*f6dc9357SAndroid Build Coastguard WorkerkNumPosBitsMax          equ 4
483*f6dc9357SAndroid Build Coastguard WorkerkNumPosStatesMax        equ (1 SHL kNumPosBitsMax)
484*f6dc9357SAndroid Build Coastguard Worker
485*f6dc9357SAndroid Build Coastguard WorkerkLenNumLowBits          equ 3
486*f6dc9357SAndroid Build Coastguard WorkerkLenNumLowSymbols       equ (1 SHL kLenNumLowBits)
487*f6dc9357SAndroid Build Coastguard WorkerkLenNumHighBits         equ 8
488*f6dc9357SAndroid Build Coastguard WorkerkLenNumHighSymbols      equ (1 SHL kLenNumHighBits)
489*f6dc9357SAndroid Build Coastguard WorkerkNumLenProbs            equ (2 * kLenNumLowSymbols * kNumPosStatesMax + kLenNumHighSymbols)
490*f6dc9357SAndroid Build Coastguard Worker
491*f6dc9357SAndroid Build Coastguard WorkerLenLow                  equ 0
492*f6dc9357SAndroid Build Coastguard WorkerLenChoice               equ LenLow
493*f6dc9357SAndroid Build Coastguard WorkerLenChoice2              equ (LenLow + kLenNumLowSymbols)
494*f6dc9357SAndroid Build Coastguard WorkerLenHigh                 equ (LenLow + 2 * kLenNumLowSymbols * kNumPosStatesMax)
495*f6dc9357SAndroid Build Coastguard Worker
496*f6dc9357SAndroid Build Coastguard WorkerkNumStates              equ 12
497*f6dc9357SAndroid Build Coastguard WorkerkNumStates2             equ 16
498*f6dc9357SAndroid Build Coastguard WorkerkNumLitStates           equ 7
499*f6dc9357SAndroid Build Coastguard Worker
500*f6dc9357SAndroid Build Coastguard WorkerkStartPosModelIndex     equ 4
501*f6dc9357SAndroid Build Coastguard WorkerkEndPosModelIndex       equ 14
502*f6dc9357SAndroid Build Coastguard WorkerkNumFullDistances       equ (1 SHL (kEndPosModelIndex SHR 1))
503*f6dc9357SAndroid Build Coastguard Worker
504*f6dc9357SAndroid Build Coastguard WorkerkNumPosSlotBits         equ 6
505*f6dc9357SAndroid Build Coastguard WorkerkNumLenToPosStates      equ 4
506*f6dc9357SAndroid Build Coastguard Worker
507*f6dc9357SAndroid Build Coastguard WorkerkNumAlignBits           equ 4
508*f6dc9357SAndroid Build Coastguard WorkerkAlignTableSize         equ (1 SHL kNumAlignBits)
509*f6dc9357SAndroid Build Coastguard Worker
510*f6dc9357SAndroid Build Coastguard WorkerkMatchMinLen            equ 2
511*f6dc9357SAndroid Build Coastguard WorkerkMatchSpecLenStart      equ (kMatchMinLen + kLenNumLowSymbols * 2 + kLenNumHighSymbols)
512*f6dc9357SAndroid Build Coastguard Worker
513*f6dc9357SAndroid Build Coastguard WorkerkStartOffset    equ 1664
514*f6dc9357SAndroid Build Coastguard WorkerSpecPos         equ (-kStartOffset)
515*f6dc9357SAndroid Build Coastguard WorkerIsRep0Long      equ (SpecPos + kNumFullDistances)
516*f6dc9357SAndroid Build Coastguard WorkerRepLenCoder     equ (IsRep0Long + (kNumStates2 SHL kNumPosBitsMax))
517*f6dc9357SAndroid Build Coastguard WorkerLenCoder        equ (RepLenCoder + kNumLenProbs)
518*f6dc9357SAndroid Build Coastguard WorkerIsMatch         equ (LenCoder + kNumLenProbs)
519*f6dc9357SAndroid Build Coastguard WorkerkAlign          equ (IsMatch + (kNumStates2 SHL kNumPosBitsMax))
520*f6dc9357SAndroid Build Coastguard WorkerIsRep           equ (kAlign + kAlignTableSize)
521*f6dc9357SAndroid Build Coastguard WorkerIsRepG0         equ (IsRep + kNumStates)
522*f6dc9357SAndroid Build Coastguard WorkerIsRepG1         equ (IsRepG0 + kNumStates)
523*f6dc9357SAndroid Build Coastguard WorkerIsRepG2         equ (IsRepG1 + kNumStates)
524*f6dc9357SAndroid Build Coastguard WorkerPosSlot         equ (IsRepG2 + kNumStates)
525*f6dc9357SAndroid Build Coastguard WorkerLiteral         equ (PosSlot + (kNumLenToPosStates SHL kNumPosSlotBits))
526*f6dc9357SAndroid Build Coastguard WorkerNUM_BASE_PROBS  equ (Literal + kStartOffset)
527*f6dc9357SAndroid Build Coastguard Worker
528*f6dc9357SAndroid Build Coastguard Workerif kAlign ne 0
529*f6dc9357SAndroid Build Coastguard Worker  .err <Stop_Compiling_Bad_LZMA_kAlign>
530*f6dc9357SAndroid Build Coastguard Workerendif
531*f6dc9357SAndroid Build Coastguard Worker
532*f6dc9357SAndroid Build Coastguard Workerif NUM_BASE_PROBS ne 1984
533*f6dc9357SAndroid Build Coastguard Worker  .err <Stop_Compiling_Bad_LZMA_PROBS>
534*f6dc9357SAndroid Build Coastguard Workerendif
535*f6dc9357SAndroid Build Coastguard Worker
536*f6dc9357SAndroid Build Coastguard Worker
537*f6dc9357SAndroid Build Coastguard WorkerPTR_FIELD equ dq ?
538*f6dc9357SAndroid Build Coastguard Worker
539*f6dc9357SAndroid Build Coastguard WorkerCLzmaDec_Asm struct
540*f6dc9357SAndroid Build Coastguard Worker        lc      db ?
541*f6dc9357SAndroid Build Coastguard Worker        lp      db ?
542*f6dc9357SAndroid Build Coastguard Worker        pb      db ?
543*f6dc9357SAndroid Build Coastguard Worker        _pad_   db ?
544*f6dc9357SAndroid Build Coastguard Worker        dicSize dd ?
545*f6dc9357SAndroid Build Coastguard Worker
546*f6dc9357SAndroid Build Coastguard Worker        probs_Spec      PTR_FIELD
547*f6dc9357SAndroid Build Coastguard Worker        probs_1664      PTR_FIELD
548*f6dc9357SAndroid Build Coastguard Worker        dic_Spec        PTR_FIELD
549*f6dc9357SAndroid Build Coastguard Worker        dicBufSize      PTR_FIELD
550*f6dc9357SAndroid Build Coastguard Worker        dicPos_Spec     PTR_FIELD
551*f6dc9357SAndroid Build Coastguard Worker        buf_Spec        PTR_FIELD
552*f6dc9357SAndroid Build Coastguard Worker
553*f6dc9357SAndroid Build Coastguard Worker        range_Spec      dd ?
554*f6dc9357SAndroid Build Coastguard Worker        code_Spec       dd ?
555*f6dc9357SAndroid Build Coastguard Worker        processedPos_Spec  dd ?
556*f6dc9357SAndroid Build Coastguard Worker        checkDicSize    dd ?
557*f6dc9357SAndroid Build Coastguard Worker        rep0    dd ?
558*f6dc9357SAndroid Build Coastguard Worker        rep1    dd ?
559*f6dc9357SAndroid Build Coastguard Worker        rep2    dd ?
560*f6dc9357SAndroid Build Coastguard Worker        rep3    dd ?
561*f6dc9357SAndroid Build Coastguard Worker        state_Spec      dd ?
562*f6dc9357SAndroid Build Coastguard Worker        remainLen dd ?
563*f6dc9357SAndroid Build Coastguard WorkerCLzmaDec_Asm ends
564*f6dc9357SAndroid Build Coastguard Worker
565*f6dc9357SAndroid Build Coastguard Worker
566*f6dc9357SAndroid Build Coastguard WorkerCLzmaDec_Asm_Loc struct
567*f6dc9357SAndroid Build Coastguard Worker        OLD_RSP    PTR_FIELD
568*f6dc9357SAndroid Build Coastguard Worker        lzmaPtr    PTR_FIELD
569*f6dc9357SAndroid Build Coastguard Worker        _pad0_     PTR_FIELD
570*f6dc9357SAndroid Build Coastguard Worker        _pad1_     PTR_FIELD
571*f6dc9357SAndroid Build Coastguard Worker        _pad2_     PTR_FIELD
572*f6dc9357SAndroid Build Coastguard Worker        dicBufSize PTR_FIELD
573*f6dc9357SAndroid Build Coastguard Worker        probs_Spec PTR_FIELD
574*f6dc9357SAndroid Build Coastguard Worker        dic_Spec   PTR_FIELD
575*f6dc9357SAndroid Build Coastguard Worker
576*f6dc9357SAndroid Build Coastguard Worker        limit      PTR_FIELD
577*f6dc9357SAndroid Build Coastguard Worker        bufLimit   PTR_FIELD
578*f6dc9357SAndroid Build Coastguard Worker        lc2       dd ?
579*f6dc9357SAndroid Build Coastguard Worker        lpMask    dd ?
580*f6dc9357SAndroid Build Coastguard Worker        pbMask    dd ?
581*f6dc9357SAndroid Build Coastguard Worker        checkDicSize   dd ?
582*f6dc9357SAndroid Build Coastguard Worker
583*f6dc9357SAndroid Build Coastguard Worker        _pad_     dd ?
584*f6dc9357SAndroid Build Coastguard Worker        remainLen dd ?
585*f6dc9357SAndroid Build Coastguard Worker        dicPos_Spec     PTR_FIELD
586*f6dc9357SAndroid Build Coastguard Worker        rep0      dd ?
587*f6dc9357SAndroid Build Coastguard Worker        rep1      dd ?
588*f6dc9357SAndroid Build Coastguard Worker        rep2      dd ?
589*f6dc9357SAndroid Build Coastguard Worker        rep3      dd ?
590*f6dc9357SAndroid Build Coastguard WorkerCLzmaDec_Asm_Loc ends
591*f6dc9357SAndroid Build Coastguard Worker
592*f6dc9357SAndroid Build Coastguard Worker
593*f6dc9357SAndroid Build Coastguard WorkerGLOB_2  equ [sym_R].CLzmaDec_Asm.
594*f6dc9357SAndroid Build Coastguard WorkerGLOB    equ [r1].CLzmaDec_Asm.
595*f6dc9357SAndroid Build Coastguard WorkerLOC_0   equ [r0].CLzmaDec_Asm_Loc.
596*f6dc9357SAndroid Build Coastguard WorkerLOC     equ [RSP].CLzmaDec_Asm_Loc.
597*f6dc9357SAndroid Build Coastguard Worker
598*f6dc9357SAndroid Build Coastguard Worker
599*f6dc9357SAndroid Build Coastguard WorkerCOPY_VAR macro name
600*f6dc9357SAndroid Build Coastguard Worker        mov     t0, GLOB_2 name
601*f6dc9357SAndroid Build Coastguard Worker        mov     LOC_0 name, t0
602*f6dc9357SAndroid Build Coastguard Workerendm
603*f6dc9357SAndroid Build Coastguard Worker
604*f6dc9357SAndroid Build Coastguard Worker
605*f6dc9357SAndroid Build Coastguard WorkerRESTORE_VAR macro name
606*f6dc9357SAndroid Build Coastguard Worker        mov     t0, LOC name
607*f6dc9357SAndroid Build Coastguard Worker        mov     GLOB name, t0
608*f6dc9357SAndroid Build Coastguard Workerendm
609*f6dc9357SAndroid Build Coastguard Worker
610*f6dc9357SAndroid Build Coastguard Worker
611*f6dc9357SAndroid Build Coastguard Worker
612*f6dc9357SAndroid Build Coastguard WorkerIsMatchBranch_Pre macro reg
613*f6dc9357SAndroid Build Coastguard Worker        ; prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;
614*f6dc9357SAndroid Build Coastguard Worker        mov     pbPos, LOC pbMask
615*f6dc9357SAndroid Build Coastguard Worker        and     pbPos, processedPos
616*f6dc9357SAndroid Build Coastguard Worker        shl     pbPos, (kLenNumLowBits + 1 + PSHIFT)
617*f6dc9357SAndroid Build Coastguard Worker        lea     probs_state_R, [probs + 1 * state_R]
618*f6dc9357SAndroid Build Coastguard Workerendm
619*f6dc9357SAndroid Build Coastguard Worker
620*f6dc9357SAndroid Build Coastguard Worker
621*f6dc9357SAndroid Build Coastguard WorkerIsMatchBranch macro reg
622*f6dc9357SAndroid Build Coastguard Worker        IsMatchBranch_Pre
623*f6dc9357SAndroid Build Coastguard Worker        IF_BIT_1 probs_state_R, pbPos_R, IsMatch, IsMatch_label
624*f6dc9357SAndroid Build Coastguard Workerendm
625*f6dc9357SAndroid Build Coastguard Worker
626*f6dc9357SAndroid Build Coastguard Worker
627*f6dc9357SAndroid Build Coastguard WorkerCheckLimits macro reg
628*f6dc9357SAndroid Build Coastguard Worker        cmp     buf, LOC bufLimit
629*f6dc9357SAndroid Build Coastguard Worker        jae     fin_OK
630*f6dc9357SAndroid Build Coastguard Worker        cmp     dicPos, LOC limit
631*f6dc9357SAndroid Build Coastguard Worker        jae     fin_OK
632*f6dc9357SAndroid Build Coastguard Workerendm
633*f6dc9357SAndroid Build Coastguard Worker
634*f6dc9357SAndroid Build Coastguard Worker
635*f6dc9357SAndroid Build Coastguard Worker
636*f6dc9357SAndroid Build Coastguard Worker; RSP is (16x + 8) bytes aligned in WIN64-x64
637*f6dc9357SAndroid Build Coastguard Worker; LocalSize equ ((((SIZEOF CLzmaDec_Asm_Loc) + 7) / 16 * 16) + 8)
638*f6dc9357SAndroid Build Coastguard Worker
639*f6dc9357SAndroid Build Coastguard WorkerPARAM_lzma      equ REG_ABI_PARAM_0
640*f6dc9357SAndroid Build Coastguard WorkerPARAM_limit     equ REG_ABI_PARAM_1
641*f6dc9357SAndroid Build Coastguard WorkerPARAM_bufLimit  equ REG_ABI_PARAM_2
642*f6dc9357SAndroid Build Coastguard Worker
643*f6dc9357SAndroid Build Coastguard Workerifdef Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT
644*f6dc9357SAndroid Build Coastguard Worker; MY_ALIGN_64
645*f6dc9357SAndroid Build Coastguard Workerelse
646*f6dc9357SAndroid Build Coastguard Worker  MY_ALIGN_16
647*f6dc9357SAndroid Build Coastguard Workerendif
648*f6dc9357SAndroid Build Coastguard WorkerMY_PROC LzmaDec_DecodeReal_3, 3
649*f6dc9357SAndroid Build Coastguard WorkerMY_PUSH_PRESERVED_ABI_REGS
650*f6dc9357SAndroid Build Coastguard Worker
651*f6dc9357SAndroid Build Coastguard Worker        lea     r0, [RSP - (SIZEOF CLzmaDec_Asm_Loc)]
652*f6dc9357SAndroid Build Coastguard Worker        and     r0, -128
653*f6dc9357SAndroid Build Coastguard Worker        mov     r5, RSP
654*f6dc9357SAndroid Build Coastguard Worker        mov     RSP, r0
655*f6dc9357SAndroid Build Coastguard Worker        mov     LOC_0 Old_RSP, r5
656*f6dc9357SAndroid Build Coastguard Worker        mov     LOC_0 lzmaPtr, PARAM_lzma
657*f6dc9357SAndroid Build Coastguard Worker
658*f6dc9357SAndroid Build Coastguard Worker        mov     LOC_0 remainLen, 0  ; remainLen must be ZERO
659*f6dc9357SAndroid Build Coastguard Worker
660*f6dc9357SAndroid Build Coastguard Worker        mov     LOC_0 bufLimit, PARAM_bufLimit
661*f6dc9357SAndroid Build Coastguard Worker        mov     sym_R, PARAM_lzma  ;  CLzmaDec_Asm_Loc pointer for GLOB_2
662*f6dc9357SAndroid Build Coastguard Worker        mov     dic, GLOB_2 dic_Spec
663*f6dc9357SAndroid Build Coastguard Worker        add     PARAM_limit, dic
664*f6dc9357SAndroid Build Coastguard Worker        mov     LOC_0 limit, PARAM_limit
665*f6dc9357SAndroid Build Coastguard Worker
666*f6dc9357SAndroid Build Coastguard Worker        COPY_VAR(rep0)
667*f6dc9357SAndroid Build Coastguard Worker        COPY_VAR(rep1)
668*f6dc9357SAndroid Build Coastguard Worker        COPY_VAR(rep2)
669*f6dc9357SAndroid Build Coastguard Worker        COPY_VAR(rep3)
670*f6dc9357SAndroid Build Coastguard Worker
671*f6dc9357SAndroid Build Coastguard Worker        mov     dicPos, GLOB_2 dicPos_Spec
672*f6dc9357SAndroid Build Coastguard Worker        add     dicPos, dic
673*f6dc9357SAndroid Build Coastguard Worker        mov     LOC_0 dicPos_Spec, dicPos
674*f6dc9357SAndroid Build Coastguard Worker        mov     LOC_0 dic_Spec, dic
675*f6dc9357SAndroid Build Coastguard Worker
676*f6dc9357SAndroid Build Coastguard Worker        mov     x1_L, GLOB_2 pb
677*f6dc9357SAndroid Build Coastguard Worker        mov     t0, 1
678*f6dc9357SAndroid Build Coastguard Worker        shl     t0, x1_L
679*f6dc9357SAndroid Build Coastguard Worker        dec     t0
680*f6dc9357SAndroid Build Coastguard Worker        mov     LOC_0 pbMask, t0
681*f6dc9357SAndroid Build Coastguard Worker
682*f6dc9357SAndroid Build Coastguard Worker        ; unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1;
683*f6dc9357SAndroid Build Coastguard Worker        ; unsigned lc = p->prop.lc;
684*f6dc9357SAndroid Build Coastguard Worker        ; unsigned lpMask = ((unsigned)0x100 << p->prop.lp) - ((unsigned)0x100 >> lc);
685*f6dc9357SAndroid Build Coastguard Worker
686*f6dc9357SAndroid Build Coastguard Worker        mov     x1_L, GLOB_2 lc
687*f6dc9357SAndroid Build Coastguard Worker        mov     x2, 100h
688*f6dc9357SAndroid Build Coastguard Worker        mov     t0, x2
689*f6dc9357SAndroid Build Coastguard Worker        shr     x2, x1_L
690*f6dc9357SAndroid Build Coastguard Worker        ; inc     x1
691*f6dc9357SAndroid Build Coastguard Worker        add     x1_L, PSHIFT
692*f6dc9357SAndroid Build Coastguard Worker        mov     LOC_0 lc2, x1
693*f6dc9357SAndroid Build Coastguard Worker        mov     x1_L, GLOB_2 lp
694*f6dc9357SAndroid Build Coastguard Worker        shl     t0, x1_L
695*f6dc9357SAndroid Build Coastguard Worker        sub     t0, x2
696*f6dc9357SAndroid Build Coastguard Worker        mov     LOC_0 lpMask, t0
697*f6dc9357SAndroid Build Coastguard Worker        mov     lpMask_reg, t0
698*f6dc9357SAndroid Build Coastguard Worker
699*f6dc9357SAndroid Build Coastguard Worker        ; mov     probs, GLOB_2 probs_Spec
700*f6dc9357SAndroid Build Coastguard Worker        ; add     probs, kStartOffset SHL PSHIFT
701*f6dc9357SAndroid Build Coastguard Worker        mov     probs, GLOB_2 probs_1664
702*f6dc9357SAndroid Build Coastguard Worker        mov     LOC_0 probs_Spec, probs
703*f6dc9357SAndroid Build Coastguard Worker
704*f6dc9357SAndroid Build Coastguard Worker        mov     t0_R, GLOB_2 dicBufSize
705*f6dc9357SAndroid Build Coastguard Worker        mov     LOC_0 dicBufSize, t0_R
706*f6dc9357SAndroid Build Coastguard Worker
707*f6dc9357SAndroid Build Coastguard Worker        mov     x1, GLOB_2 checkDicSize
708*f6dc9357SAndroid Build Coastguard Worker        mov     LOC_0 checkDicSize, x1
709*f6dc9357SAndroid Build Coastguard Worker
710*f6dc9357SAndroid Build Coastguard Worker        mov     processedPos, GLOB_2 processedPos_Spec
711*f6dc9357SAndroid Build Coastguard Worker
712*f6dc9357SAndroid Build Coastguard Worker        mov     state, GLOB_2 state_Spec
713*f6dc9357SAndroid Build Coastguard Worker        shl     state, PSHIFT
714*f6dc9357SAndroid Build Coastguard Worker
715*f6dc9357SAndroid Build Coastguard Worker        mov     buf,   GLOB_2 buf_Spec
716*f6dc9357SAndroid Build Coastguard Worker        mov     range, GLOB_2 range_Spec
717*f6dc9357SAndroid Build Coastguard Worker        mov     cod,   GLOB_2 code_Spec
718*f6dc9357SAndroid Build Coastguard Worker        mov     kBitModelTotal_reg, kBitModelTotal
719*f6dc9357SAndroid Build Coastguard Worker        xor     sym, sym
720*f6dc9357SAndroid Build Coastguard Worker
721*f6dc9357SAndroid Build Coastguard Worker        ; if (processedPos != 0 || checkDicSize != 0)
722*f6dc9357SAndroid Build Coastguard Worker        or      x1, processedPos
723*f6dc9357SAndroid Build Coastguard Worker        jz      @f
724*f6dc9357SAndroid Build Coastguard Worker
725*f6dc9357SAndroid Build Coastguard Worker        add     t0_R, dic
726*f6dc9357SAndroid Build Coastguard Worker        cmp     dicPos, dic
727*f6dc9357SAndroid Build Coastguard Worker        cmovnz  t0_R, dicPos
728*f6dc9357SAndroid Build Coastguard Worker        movzx   sym, byte ptr[t0_R - 1]
729*f6dc9357SAndroid Build Coastguard Worker
730*f6dc9357SAndroid Build Coastguard Worker@@:
731*f6dc9357SAndroid Build Coastguard Worker        IsMatchBranch_Pre
732*f6dc9357SAndroid Build Coastguard Worker        cmp     state, 4 * PMULT
733*f6dc9357SAndroid Build Coastguard Worker        jb      lit_end
734*f6dc9357SAndroid Build Coastguard Worker        cmp     state, kNumLitStates * PMULT
735*f6dc9357SAndroid Build Coastguard Worker        jb      lit_matched_end
736*f6dc9357SAndroid Build Coastguard Worker        jmp     lz_end
737*f6dc9357SAndroid Build Coastguard Worker
738*f6dc9357SAndroid Build Coastguard Worker
739*f6dc9357SAndroid Build Coastguard Worker
740*f6dc9357SAndroid Build Coastguard Worker
741*f6dc9357SAndroid Build Coastguard Worker; ---------- LITERAL ----------
742*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_64
743*f6dc9357SAndroid Build Coastguard Workerlit_start:
744*f6dc9357SAndroid Build Coastguard Worker        xor     state, state
745*f6dc9357SAndroid Build Coastguard Workerlit_start_2:
746*f6dc9357SAndroid Build Coastguard Worker        LIT_PROBS lpMask_reg
747*f6dc9357SAndroid Build Coastguard Worker
748*f6dc9357SAndroid Build Coastguard Worker    ifdef _LZMA_SIZE_OPT
749*f6dc9357SAndroid Build Coastguard Worker
750*f6dc9357SAndroid Build Coastguard Worker        PLOAD   x1, probs + 1 * PMULT
751*f6dc9357SAndroid Build Coastguard Worker        mov     sym, 1
752*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_16
753*f6dc9357SAndroid Build Coastguard Workerlit_loop:
754*f6dc9357SAndroid Build Coastguard Worker        BIT_1   x1, x2
755*f6dc9357SAndroid Build Coastguard Worker        mov     x1, x2
756*f6dc9357SAndroid Build Coastguard Worker        cmp     sym, 127
757*f6dc9357SAndroid Build Coastguard Worker        jbe     lit_loop
758*f6dc9357SAndroid Build Coastguard Worker
759*f6dc9357SAndroid Build Coastguard Worker    else
760*f6dc9357SAndroid Build Coastguard Worker
761*f6dc9357SAndroid Build Coastguard Worker        BIT_0   x1, x2
762*f6dc9357SAndroid Build Coastguard Worker        BIT_1   x2, x1
763*f6dc9357SAndroid Build Coastguard Worker        BIT_1   x1, x2
764*f6dc9357SAndroid Build Coastguard Worker        BIT_1   x2, x1
765*f6dc9357SAndroid Build Coastguard Worker        BIT_1   x1, x2
766*f6dc9357SAndroid Build Coastguard Worker        BIT_1   x2, x1
767*f6dc9357SAndroid Build Coastguard Worker        BIT_1   x1, x2
768*f6dc9357SAndroid Build Coastguard Worker
769*f6dc9357SAndroid Build Coastguard Worker    endif
770*f6dc9357SAndroid Build Coastguard Worker
771*f6dc9357SAndroid Build Coastguard Worker        BIT_2   x2, 256 - 1
772*f6dc9357SAndroid Build Coastguard Worker
773*f6dc9357SAndroid Build Coastguard Worker        ; mov     dic, LOC dic_Spec
774*f6dc9357SAndroid Build Coastguard Worker        mov     probs, LOC probs_Spec
775*f6dc9357SAndroid Build Coastguard Worker        IsMatchBranch_Pre
776*f6dc9357SAndroid Build Coastguard Worker        mov     byte ptr[dicPos], sym_L
777*f6dc9357SAndroid Build Coastguard Worker        inc     dicPos
778*f6dc9357SAndroid Build Coastguard Worker
779*f6dc9357SAndroid Build Coastguard Worker        CheckLimits
780*f6dc9357SAndroid Build Coastguard Workerlit_end:
781*f6dc9357SAndroid Build Coastguard Worker        IF_BIT_0_NOUP probs_state_R, pbPos_R, IsMatch, lit_start
782*f6dc9357SAndroid Build Coastguard Worker
783*f6dc9357SAndroid Build Coastguard Worker        ; jmp     IsMatch_label
784*f6dc9357SAndroid Build Coastguard Worker
785*f6dc9357SAndroid Build Coastguard Worker; ---------- MATCHES ----------
786*f6dc9357SAndroid Build Coastguard Worker; MY_ALIGN_32
787*f6dc9357SAndroid Build Coastguard WorkerIsMatch_label:
788*f6dc9357SAndroid Build Coastguard Worker        UPDATE_1 probs_state_R, pbPos_R, IsMatch
789*f6dc9357SAndroid Build Coastguard Worker        IF_BIT_1 probs_state_R, 0, IsRep, IsRep_label
790*f6dc9357SAndroid Build Coastguard Worker
791*f6dc9357SAndroid Build Coastguard Worker        add     probs, LenCoder * PMULT
792*f6dc9357SAndroid Build Coastguard Worker        add     state, kNumStates * PMULT
793*f6dc9357SAndroid Build Coastguard Worker
794*f6dc9357SAndroid Build Coastguard Worker; ---------- LEN DECODE ----------
795*f6dc9357SAndroid Build Coastguard Workerlen_decode:
796*f6dc9357SAndroid Build Coastguard Worker        mov     len_temp, 8 - 1 - kMatchMinLen
797*f6dc9357SAndroid Build Coastguard Worker        IF_BIT_0_NOUP probs, 0, 0, len_mid_0
798*f6dc9357SAndroid Build Coastguard Worker        UPDATE_1 probs, 0, 0
799*f6dc9357SAndroid Build Coastguard Worker        add     probs, (1 SHL (kLenNumLowBits + PSHIFT))
800*f6dc9357SAndroid Build Coastguard Worker        mov     len_temp, -1 - kMatchMinLen
801*f6dc9357SAndroid Build Coastguard Worker        IF_BIT_0_NOUP probs, 0, 0, len_mid_0
802*f6dc9357SAndroid Build Coastguard Worker        UPDATE_1 probs, 0, 0
803*f6dc9357SAndroid Build Coastguard Worker        add     probs, LenHigh * PMULT - (1 SHL (kLenNumLowBits + PSHIFT))
804*f6dc9357SAndroid Build Coastguard Worker        mov     sym, 1
805*f6dc9357SAndroid Build Coastguard Worker        PLOAD   x1, probs + 1 * PMULT
806*f6dc9357SAndroid Build Coastguard Worker
807*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_32
808*f6dc9357SAndroid Build Coastguard Workerlen8_loop:
809*f6dc9357SAndroid Build Coastguard Worker        BIT_1   x1, x2
810*f6dc9357SAndroid Build Coastguard Worker        mov     x1, x2
811*f6dc9357SAndroid Build Coastguard Worker        cmp     sym, 64
812*f6dc9357SAndroid Build Coastguard Worker        jb      len8_loop
813*f6dc9357SAndroid Build Coastguard Worker
814*f6dc9357SAndroid Build Coastguard Worker        mov     len_temp, (kLenNumHighSymbols - kLenNumLowSymbols * 2) - 1 - kMatchMinLen
815*f6dc9357SAndroid Build Coastguard Worker        jmp     short len_mid_2 ; we use short here for MASM that doesn't optimize that code as another assembler programs
816*f6dc9357SAndroid Build Coastguard Worker
817*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_32
818*f6dc9357SAndroid Build Coastguard Workerlen_mid_0:
819*f6dc9357SAndroid Build Coastguard Worker        UPDATE_0 probs, 0, 0
820*f6dc9357SAndroid Build Coastguard Worker        add     probs, pbPos_R
821*f6dc9357SAndroid Build Coastguard Worker        BIT_0   x2, x1
822*f6dc9357SAndroid Build Coastguard Workerlen_mid_2:
823*f6dc9357SAndroid Build Coastguard Worker        BIT_1   x1, x2
824*f6dc9357SAndroid Build Coastguard Worker        BIT_2   x2, len_temp
825*f6dc9357SAndroid Build Coastguard Worker        mov     probs, LOC probs_Spec
826*f6dc9357SAndroid Build Coastguard Worker        cmp     state, kNumStates * PMULT
827*f6dc9357SAndroid Build Coastguard Worker        jb      copy_match
828*f6dc9357SAndroid Build Coastguard Worker
829*f6dc9357SAndroid Build Coastguard Worker
830*f6dc9357SAndroid Build Coastguard Worker; ---------- DECODE DISTANCE ----------
831*f6dc9357SAndroid Build Coastguard Worker        ; probs + PosSlot + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits);
832*f6dc9357SAndroid Build Coastguard Worker
833*f6dc9357SAndroid Build Coastguard Worker        mov     t0, 3 + kMatchMinLen
834*f6dc9357SAndroid Build Coastguard Worker        cmp     sym, 3 + kMatchMinLen
835*f6dc9357SAndroid Build Coastguard Worker        cmovb   t0, sym
836*f6dc9357SAndroid Build Coastguard Worker        add     probs, PosSlot * PMULT - (kMatchMinLen SHL (kNumPosSlotBits + PSHIFT))
837*f6dc9357SAndroid Build Coastguard Worker        shl     t0, (kNumPosSlotBits + PSHIFT)
838*f6dc9357SAndroid Build Coastguard Worker        add     probs, t0_R
839*f6dc9357SAndroid Build Coastguard Worker
840*f6dc9357SAndroid Build Coastguard Worker        ; sym = Len
841*f6dc9357SAndroid Build Coastguard Worker        ; mov     LOC remainLen, sym
842*f6dc9357SAndroid Build Coastguard Worker        mov     len_temp, sym
843*f6dc9357SAndroid Build Coastguard Worker
844*f6dc9357SAndroid Build Coastguard Worker    ifdef _LZMA_SIZE_OPT
845*f6dc9357SAndroid Build Coastguard Worker
846*f6dc9357SAndroid Build Coastguard Worker        PLOAD   x1, probs + 1 * PMULT
847*f6dc9357SAndroid Build Coastguard Worker        mov     sym, 1
848*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_16
849*f6dc9357SAndroid Build Coastguard Workerslot_loop:
850*f6dc9357SAndroid Build Coastguard Worker        BIT_1   x1, x2
851*f6dc9357SAndroid Build Coastguard Worker        mov     x1, x2
852*f6dc9357SAndroid Build Coastguard Worker        cmp     sym, 32
853*f6dc9357SAndroid Build Coastguard Worker        jb      slot_loop
854*f6dc9357SAndroid Build Coastguard Worker
855*f6dc9357SAndroid Build Coastguard Worker    else
856*f6dc9357SAndroid Build Coastguard Worker
857*f6dc9357SAndroid Build Coastguard Worker        BIT_0   x1, x2
858*f6dc9357SAndroid Build Coastguard Worker        BIT_1   x2, x1
859*f6dc9357SAndroid Build Coastguard Worker        BIT_1   x1, x2
860*f6dc9357SAndroid Build Coastguard Worker        BIT_1   x2, x1
861*f6dc9357SAndroid Build Coastguard Worker        BIT_1   x1, x2
862*f6dc9357SAndroid Build Coastguard Worker
863*f6dc9357SAndroid Build Coastguard Worker    endif
864*f6dc9357SAndroid Build Coastguard Worker
865*f6dc9357SAndroid Build Coastguard Worker        mov     x1, sym
866*f6dc9357SAndroid Build Coastguard Worker        BIT_2   x2, 64-1
867*f6dc9357SAndroid Build Coastguard Worker
868*f6dc9357SAndroid Build Coastguard Worker        and     sym, 3
869*f6dc9357SAndroid Build Coastguard Worker        mov     probs, LOC probs_Spec
870*f6dc9357SAndroid Build Coastguard Worker        cmp     x1, 32 + kEndPosModelIndex / 2
871*f6dc9357SAndroid Build Coastguard Worker        jb      short_dist
872*f6dc9357SAndroid Build Coastguard Worker
873*f6dc9357SAndroid Build Coastguard Worker        ;  unsigned numDirectBits = (unsigned)(((distance >> 1) - 1));
874*f6dc9357SAndroid Build Coastguard Worker        sub     x1, (32 + 1 + kNumAlignBits)
875*f6dc9357SAndroid Build Coastguard Worker        ;  distance = (2 | (distance & 1));
876*f6dc9357SAndroid Build Coastguard Worker        or      sym, 2
877*f6dc9357SAndroid Build Coastguard Worker        PLOAD   x2, probs + 1 * PMULT
878*f6dc9357SAndroid Build Coastguard Worker        shl     sym, kNumAlignBits + 1
879*f6dc9357SAndroid Build Coastguard Worker        lea     sym2_R, [probs + 2 * PMULT]
880*f6dc9357SAndroid Build Coastguard Worker
881*f6dc9357SAndroid Build Coastguard Worker        jmp     direct_norm
882*f6dc9357SAndroid Build Coastguard Worker        ; lea     t1, [sym_R + (1 SHL kNumAlignBits)]
883*f6dc9357SAndroid Build Coastguard Worker        ; cmp     range, kTopValue
884*f6dc9357SAndroid Build Coastguard Worker        ; jb      direct_norm
885*f6dc9357SAndroid Build Coastguard Worker
886*f6dc9357SAndroid Build Coastguard Worker; ---------- DIRECT DISTANCE ----------
887*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_32
888*f6dc9357SAndroid Build Coastguard Workerdirect_loop:
889*f6dc9357SAndroid Build Coastguard Worker        shr     range, 1
890*f6dc9357SAndroid Build Coastguard Worker        mov     t0, cod
891*f6dc9357SAndroid Build Coastguard Worker        sub     cod, range
892*f6dc9357SAndroid Build Coastguard Worker        cmovs   cod, t0
893*f6dc9357SAndroid Build Coastguard Worker        cmovns  sym, t1
894*f6dc9357SAndroid Build Coastguard Worker
895*f6dc9357SAndroid Build Coastguard Worker        comment ~
896*f6dc9357SAndroid Build Coastguard Worker        sub     cod, range
897*f6dc9357SAndroid Build Coastguard Worker        mov     x2, cod
898*f6dc9357SAndroid Build Coastguard Worker        sar     x2, 31
899*f6dc9357SAndroid Build Coastguard Worker        lea     sym, dword ptr [r2 + sym_R * 2 + 1]
900*f6dc9357SAndroid Build Coastguard Worker        and     x2, range
901*f6dc9357SAndroid Build Coastguard Worker        add     cod, x2
902*f6dc9357SAndroid Build Coastguard Worker        ~
903*f6dc9357SAndroid Build Coastguard Worker        dec     x1
904*f6dc9357SAndroid Build Coastguard Worker        je      direct_end
905*f6dc9357SAndroid Build Coastguard Worker
906*f6dc9357SAndroid Build Coastguard Worker        add     sym, sym
907*f6dc9357SAndroid Build Coastguard Workerdirect_norm:
908*f6dc9357SAndroid Build Coastguard Worker        lea     t1, [sym_R + (1 SHL kNumAlignBits)]
909*f6dc9357SAndroid Build Coastguard Worker        cmp     range, kTopValue
910*f6dc9357SAndroid Build Coastguard Worker        jae     near ptr direct_loop
911*f6dc9357SAndroid Build Coastguard Worker        ; we align for 32 here with "near ptr" command above
912*f6dc9357SAndroid Build Coastguard Worker        NORM_2
913*f6dc9357SAndroid Build Coastguard Worker        jmp     direct_loop
914*f6dc9357SAndroid Build Coastguard Worker
915*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_32
916*f6dc9357SAndroid Build Coastguard Workerdirect_end:
917*f6dc9357SAndroid Build Coastguard Worker        ;  prob =  + kAlign;
918*f6dc9357SAndroid Build Coastguard Worker        ;  distance <<= kNumAlignBits;
919*f6dc9357SAndroid Build Coastguard Worker        REV_0   x2, x1
920*f6dc9357SAndroid Build Coastguard Worker        REV_1   x1, x2, 2
921*f6dc9357SAndroid Build Coastguard Worker        REV_1   x2, x1, 4
922*f6dc9357SAndroid Build Coastguard Worker        REV_2   x1, 8
923*f6dc9357SAndroid Build Coastguard Worker
924*f6dc9357SAndroid Build Coastguard Workerdecode_dist_end:
925*f6dc9357SAndroid Build Coastguard Worker
926*f6dc9357SAndroid Build Coastguard Worker        ; if (distance >= (checkDicSize == 0 ? processedPos: checkDicSize))
927*f6dc9357SAndroid Build Coastguard Worker
928*f6dc9357SAndroid Build Coastguard Worker        mov     t1, LOC rep0
929*f6dc9357SAndroid Build Coastguard Worker        mov     x1, LOC rep1
930*f6dc9357SAndroid Build Coastguard Worker        mov     x2, LOC rep2
931*f6dc9357SAndroid Build Coastguard Worker
932*f6dc9357SAndroid Build Coastguard Worker        mov     t0, LOC checkDicSize
933*f6dc9357SAndroid Build Coastguard Worker        test    t0, t0
934*f6dc9357SAndroid Build Coastguard Worker        cmove   t0, processedPos
935*f6dc9357SAndroid Build Coastguard Worker        cmp     sym, t0
936*f6dc9357SAndroid Build Coastguard Worker        jae     end_of_payload
937*f6dc9357SAndroid Build Coastguard Worker        ; jmp     end_of_payload ; for debug
938*f6dc9357SAndroid Build Coastguard Worker
939*f6dc9357SAndroid Build Coastguard Worker        ; rep3 = rep2;
940*f6dc9357SAndroid Build Coastguard Worker        ; rep2 = rep1;
941*f6dc9357SAndroid Build Coastguard Worker        ; rep1 = rep0;
942*f6dc9357SAndroid Build Coastguard Worker        ; rep0 = distance + 1;
943*f6dc9357SAndroid Build Coastguard Worker
944*f6dc9357SAndroid Build Coastguard Worker        inc     sym
945*f6dc9357SAndroid Build Coastguard Worker        mov     LOC rep0, sym
946*f6dc9357SAndroid Build Coastguard Worker        ; mov     sym, LOC remainLen
947*f6dc9357SAndroid Build Coastguard Worker        mov     sym, len_temp
948*f6dc9357SAndroid Build Coastguard Worker        mov     LOC rep1, t1
949*f6dc9357SAndroid Build Coastguard Worker        mov     LOC rep2, x1
950*f6dc9357SAndroid Build Coastguard Worker        mov     LOC rep3, x2
951*f6dc9357SAndroid Build Coastguard Worker
952*f6dc9357SAndroid Build Coastguard Worker        ; state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3;
953*f6dc9357SAndroid Build Coastguard Worker        cmp     state, (kNumStates + kNumLitStates) * PMULT
954*f6dc9357SAndroid Build Coastguard Worker        mov     state, kNumLitStates * PMULT
955*f6dc9357SAndroid Build Coastguard Worker        mov     t0, (kNumLitStates + 3) * PMULT
956*f6dc9357SAndroid Build Coastguard Worker        cmovae  state, t0
957*f6dc9357SAndroid Build Coastguard Worker
958*f6dc9357SAndroid Build Coastguard Worker
959*f6dc9357SAndroid Build Coastguard Worker; ---------- COPY MATCH ----------
960*f6dc9357SAndroid Build Coastguard Workercopy_match:
961*f6dc9357SAndroid Build Coastguard Worker
962*f6dc9357SAndroid Build Coastguard Worker        ; len += kMatchMinLen;
963*f6dc9357SAndroid Build Coastguard Worker        ; add     sym, kMatchMinLen
964*f6dc9357SAndroid Build Coastguard Worker
965*f6dc9357SAndroid Build Coastguard Worker        ; if ((rem = limit - dicPos) == 0)
966*f6dc9357SAndroid Build Coastguard Worker        ; {
967*f6dc9357SAndroid Build Coastguard Worker        ;   p->dicPos = dicPos;
968*f6dc9357SAndroid Build Coastguard Worker        ;   return SZ_ERROR_DATA;
969*f6dc9357SAndroid Build Coastguard Worker        ; }
970*f6dc9357SAndroid Build Coastguard Worker        mov     cnt_R, LOC limit
971*f6dc9357SAndroid Build Coastguard Worker        sub     cnt_R, dicPos
972*f6dc9357SAndroid Build Coastguard Worker        jz      fin_dicPos_LIMIT
973*f6dc9357SAndroid Build Coastguard Worker
974*f6dc9357SAndroid Build Coastguard Worker        ; curLen = ((rem < len) ? (unsigned)rem : len);
975*f6dc9357SAndroid Build Coastguard Worker        cmp     cnt_R, sym_R
976*f6dc9357SAndroid Build Coastguard Worker        ; cmovae  cnt_R, sym_R ; 64-bit
977*f6dc9357SAndroid Build Coastguard Worker        cmovae  cnt, sym ; 32-bit
978*f6dc9357SAndroid Build Coastguard Worker
979*f6dc9357SAndroid Build Coastguard Worker        mov     dic, LOC dic_Spec
980*f6dc9357SAndroid Build Coastguard Worker        mov     x1, LOC rep0
981*f6dc9357SAndroid Build Coastguard Worker
982*f6dc9357SAndroid Build Coastguard Worker        mov     t0_R, dicPos
983*f6dc9357SAndroid Build Coastguard Worker        add     dicPos, cnt_R
984*f6dc9357SAndroid Build Coastguard Worker        ; processedPos += curLen;
985*f6dc9357SAndroid Build Coastguard Worker        add     processedPos, cnt
986*f6dc9357SAndroid Build Coastguard Worker        ; len -= curLen;
987*f6dc9357SAndroid Build Coastguard Worker        sub     sym, cnt
988*f6dc9357SAndroid Build Coastguard Worker        mov     LOC remainLen, sym
989*f6dc9357SAndroid Build Coastguard Worker
990*f6dc9357SAndroid Build Coastguard Worker        sub     t0_R, dic
991*f6dc9357SAndroid Build Coastguard Worker
992*f6dc9357SAndroid Build Coastguard Worker        ; pos = dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0);
993*f6dc9357SAndroid Build Coastguard Worker        sub     t0_R, r1
994*f6dc9357SAndroid Build Coastguard Worker        jae     @f
995*f6dc9357SAndroid Build Coastguard Worker
996*f6dc9357SAndroid Build Coastguard Worker        mov     r1, LOC dicBufSize
997*f6dc9357SAndroid Build Coastguard Worker        add     t0_R, r1
998*f6dc9357SAndroid Build Coastguard Worker        sub     r1, t0_R
999*f6dc9357SAndroid Build Coastguard Worker        cmp     cnt_R, r1
1000*f6dc9357SAndroid Build Coastguard Worker        ja      copy_match_cross
1001*f6dc9357SAndroid Build Coastguard Worker@@:
1002*f6dc9357SAndroid Build Coastguard Worker        ; if (curLen <= dicBufSize - pos)
1003*f6dc9357SAndroid Build Coastguard Worker
1004*f6dc9357SAndroid Build Coastguard Worker; ---------- COPY MATCH FAST ----------
1005*f6dc9357SAndroid Build Coastguard Worker        ; Byte *dest = dic + dicPos;
1006*f6dc9357SAndroid Build Coastguard Worker        ; mov     r1, dic
1007*f6dc9357SAndroid Build Coastguard Worker        ; ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos;
1008*f6dc9357SAndroid Build Coastguard Worker        ; sub   t0_R, dicPos
1009*f6dc9357SAndroid Build Coastguard Worker        ; dicPos += curLen;
1010*f6dc9357SAndroid Build Coastguard Worker
1011*f6dc9357SAndroid Build Coastguard Worker        ; const Byte *lim = dest + curLen;
1012*f6dc9357SAndroid Build Coastguard Worker        add     t0_R, dic
1013*f6dc9357SAndroid Build Coastguard Worker        movzx   sym, byte ptr[t0_R]
1014*f6dc9357SAndroid Build Coastguard Worker        add     t0_R, cnt_R
1015*f6dc9357SAndroid Build Coastguard Worker        neg     cnt_R
1016*f6dc9357SAndroid Build Coastguard Worker        ; lea     r1, [dicPos - 1]
1017*f6dc9357SAndroid Build Coastguard Workercopy_common:
1018*f6dc9357SAndroid Build Coastguard Worker        dec     dicPos
1019*f6dc9357SAndroid Build Coastguard Worker        ; cmp   LOC rep0, 1
1020*f6dc9357SAndroid Build Coastguard Worker        ; je    rep0Label
1021*f6dc9357SAndroid Build Coastguard Worker
1022*f6dc9357SAndroid Build Coastguard Worker        ; t0_R - src_lim
1023*f6dc9357SAndroid Build Coastguard Worker        ; r1 - dest_lim - 1
1024*f6dc9357SAndroid Build Coastguard Worker        ; cnt_R - (-cnt)
1025*f6dc9357SAndroid Build Coastguard Worker
1026*f6dc9357SAndroid Build Coastguard Worker        IsMatchBranch_Pre
1027*f6dc9357SAndroid Build Coastguard Worker        inc     cnt_R
1028*f6dc9357SAndroid Build Coastguard Worker        jz      copy_end
1029*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_16
1030*f6dc9357SAndroid Build Coastguard Worker@@:
1031*f6dc9357SAndroid Build Coastguard Worker        mov     byte ptr[cnt_R * 1 + dicPos], sym_L
1032*f6dc9357SAndroid Build Coastguard Worker        movzx   sym, byte ptr[cnt_R * 1 + t0_R]
1033*f6dc9357SAndroid Build Coastguard Worker        inc     cnt_R
1034*f6dc9357SAndroid Build Coastguard Worker        jnz     @b
1035*f6dc9357SAndroid Build Coastguard Worker
1036*f6dc9357SAndroid Build Coastguard Workercopy_end:
1037*f6dc9357SAndroid Build Coastguard Workerlz_end_match:
1038*f6dc9357SAndroid Build Coastguard Worker        mov     byte ptr[dicPos], sym_L
1039*f6dc9357SAndroid Build Coastguard Worker        inc     dicPos
1040*f6dc9357SAndroid Build Coastguard Worker
1041*f6dc9357SAndroid Build Coastguard Worker        ; IsMatchBranch_Pre
1042*f6dc9357SAndroid Build Coastguard Worker        CheckLimits
1043*f6dc9357SAndroid Build Coastguard Workerlz_end:
1044*f6dc9357SAndroid Build Coastguard Worker        IF_BIT_1_NOUP probs_state_R, pbPos_R, IsMatch, IsMatch_label
1045*f6dc9357SAndroid Build Coastguard Worker
1046*f6dc9357SAndroid Build Coastguard Worker
1047*f6dc9357SAndroid Build Coastguard Worker
1048*f6dc9357SAndroid Build Coastguard Worker; ---------- LITERAL MATCHED ----------
1049*f6dc9357SAndroid Build Coastguard Worker
1050*f6dc9357SAndroid Build Coastguard Worker        LIT_PROBS LOC lpMask
1051*f6dc9357SAndroid Build Coastguard Worker
1052*f6dc9357SAndroid Build Coastguard Worker        ; matchByte = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)];
1053*f6dc9357SAndroid Build Coastguard Worker        mov     x1, LOC rep0
1054*f6dc9357SAndroid Build Coastguard Worker        ; mov     dic, LOC dic_Spec
1055*f6dc9357SAndroid Build Coastguard Worker        mov     LOC dicPos_Spec, dicPos
1056*f6dc9357SAndroid Build Coastguard Worker
1057*f6dc9357SAndroid Build Coastguard Worker        ; state -= (state < 10) ? 3 : 6;
1058*f6dc9357SAndroid Build Coastguard Worker        lea     t0, [state_R - 6 * PMULT]
1059*f6dc9357SAndroid Build Coastguard Worker        sub     state, 3 * PMULT
1060*f6dc9357SAndroid Build Coastguard Worker        cmp     state, 7 * PMULT
1061*f6dc9357SAndroid Build Coastguard Worker        cmovae  state, t0
1062*f6dc9357SAndroid Build Coastguard Worker
1063*f6dc9357SAndroid Build Coastguard Worker        sub     dicPos, dic
1064*f6dc9357SAndroid Build Coastguard Worker        sub     dicPos, r1
1065*f6dc9357SAndroid Build Coastguard Worker        jae     @f
1066*f6dc9357SAndroid Build Coastguard Worker        add     dicPos, LOC dicBufSize
1067*f6dc9357SAndroid Build Coastguard Worker@@:
1068*f6dc9357SAndroid Build Coastguard Worker        comment ~
1069*f6dc9357SAndroid Build Coastguard Worker        xor     t0, t0
1070*f6dc9357SAndroid Build Coastguard Worker        sub     dicPos, r1
1071*f6dc9357SAndroid Build Coastguard Worker        cmovb   t0_R, LOC dicBufSize
1072*f6dc9357SAndroid Build Coastguard Worker        ~
1073*f6dc9357SAndroid Build Coastguard Worker
1074*f6dc9357SAndroid Build Coastguard Worker        movzx   match, byte ptr[dic + dicPos * 1]
1075*f6dc9357SAndroid Build Coastguard Worker
1076*f6dc9357SAndroid Build Coastguard Worker    ifdef _LZMA_SIZE_OPT
1077*f6dc9357SAndroid Build Coastguard Worker
1078*f6dc9357SAndroid Build Coastguard Worker        mov     offs, 256 * PMULT
1079*f6dc9357SAndroid Build Coastguard Worker        shl     match, (PSHIFT + 1)
1080*f6dc9357SAndroid Build Coastguard Worker        mov     bit, match
1081*f6dc9357SAndroid Build Coastguard Worker        mov     sym, 1
1082*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_16
1083*f6dc9357SAndroid Build Coastguard Workerlitm_loop:
1084*f6dc9357SAndroid Build Coastguard Worker        LITM
1085*f6dc9357SAndroid Build Coastguard Worker        cmp     sym, 256
1086*f6dc9357SAndroid Build Coastguard Worker        jb      litm_loop
1087*f6dc9357SAndroid Build Coastguard Worker        sub     sym, 256
1088*f6dc9357SAndroid Build Coastguard Worker
1089*f6dc9357SAndroid Build Coastguard Worker    else
1090*f6dc9357SAndroid Build Coastguard Worker
1091*f6dc9357SAndroid Build Coastguard Worker        LITM_0
1092*f6dc9357SAndroid Build Coastguard Worker        LITM
1093*f6dc9357SAndroid Build Coastguard Worker        LITM
1094*f6dc9357SAndroid Build Coastguard Worker        LITM
1095*f6dc9357SAndroid Build Coastguard Worker        LITM
1096*f6dc9357SAndroid Build Coastguard Worker        LITM
1097*f6dc9357SAndroid Build Coastguard Worker        LITM
1098*f6dc9357SAndroid Build Coastguard Worker        LITM_2
1099*f6dc9357SAndroid Build Coastguard Worker
1100*f6dc9357SAndroid Build Coastguard Worker    endif
1101*f6dc9357SAndroid Build Coastguard Worker
1102*f6dc9357SAndroid Build Coastguard Worker        mov     probs, LOC probs_Spec
1103*f6dc9357SAndroid Build Coastguard Worker        IsMatchBranch_Pre
1104*f6dc9357SAndroid Build Coastguard Worker        ; mov     dic, LOC dic_Spec
1105*f6dc9357SAndroid Build Coastguard Worker        mov     dicPos, LOC dicPos_Spec
1106*f6dc9357SAndroid Build Coastguard Worker        mov     byte ptr[dicPos], sym_L
1107*f6dc9357SAndroid Build Coastguard Worker        inc     dicPos
1108*f6dc9357SAndroid Build Coastguard Worker
1109*f6dc9357SAndroid Build Coastguard Worker        CheckLimits
1110*f6dc9357SAndroid Build Coastguard Workerlit_matched_end:
1111*f6dc9357SAndroid Build Coastguard Worker        IF_BIT_1_NOUP probs_state_R, pbPos_R, IsMatch, IsMatch_label
1112*f6dc9357SAndroid Build Coastguard Worker        ; IsMatchBranch
1113*f6dc9357SAndroid Build Coastguard Worker        mov     lpMask_reg, LOC lpMask
1114*f6dc9357SAndroid Build Coastguard Worker        sub     state, 3 * PMULT
1115*f6dc9357SAndroid Build Coastguard Worker        jmp     lit_start_2
1116*f6dc9357SAndroid Build Coastguard Worker
1117*f6dc9357SAndroid Build Coastguard Worker
1118*f6dc9357SAndroid Build Coastguard Worker
1119*f6dc9357SAndroid Build Coastguard Worker; ---------- REP 0 LITERAL ----------
1120*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_32
1121*f6dc9357SAndroid Build Coastguard WorkerIsRep0Short_label:
1122*f6dc9357SAndroid Build Coastguard Worker        UPDATE_0 probs_state_R, pbPos_R, IsRep0Long
1123*f6dc9357SAndroid Build Coastguard Worker
1124*f6dc9357SAndroid Build Coastguard Worker        ; dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)];
1125*f6dc9357SAndroid Build Coastguard Worker        mov     dic, LOC dic_Spec
1126*f6dc9357SAndroid Build Coastguard Worker        mov     t0_R, dicPos
1127*f6dc9357SAndroid Build Coastguard Worker        mov     probBranch, LOC rep0
1128*f6dc9357SAndroid Build Coastguard Worker        sub     t0_R, dic
1129*f6dc9357SAndroid Build Coastguard Worker
1130*f6dc9357SAndroid Build Coastguard Worker        sub     probs, RepLenCoder * PMULT
1131*f6dc9357SAndroid Build Coastguard Worker
1132*f6dc9357SAndroid Build Coastguard Worker        ; state = state < kNumLitStates ? 9 : 11;
1133*f6dc9357SAndroid Build Coastguard Worker        or      state, 1 * PMULT
1134*f6dc9357SAndroid Build Coastguard Worker
1135*f6dc9357SAndroid Build Coastguard Worker        ; the caller doesn't allow (dicPos >= limit) case for REP_SHORT
1136*f6dc9357SAndroid Build Coastguard Worker        ; so we don't need the following (dicPos == limit) check here:
1137*f6dc9357SAndroid Build Coastguard Worker        ; cmp     dicPos, LOC limit
1138*f6dc9357SAndroid Build Coastguard Worker        ; jae     fin_dicPos_LIMIT_REP_SHORT
1139*f6dc9357SAndroid Build Coastguard Worker
1140*f6dc9357SAndroid Build Coastguard Worker        inc     processedPos
1141*f6dc9357SAndroid Build Coastguard Worker
1142*f6dc9357SAndroid Build Coastguard Worker        IsMatchBranch_Pre
1143*f6dc9357SAndroid Build Coastguard Worker
1144*f6dc9357SAndroid Build Coastguard Worker;        xor     sym, sym
1145*f6dc9357SAndroid Build Coastguard Worker;        sub     t0_R, probBranch_R
1146*f6dc9357SAndroid Build Coastguard Worker;        cmovb   sym_R, LOC dicBufSize
1147*f6dc9357SAndroid Build Coastguard Worker;        add     t0_R, sym_R
1148*f6dc9357SAndroid Build Coastguard Worker        sub     t0_R, probBranch_R
1149*f6dc9357SAndroid Build Coastguard Worker        jae     @f
1150*f6dc9357SAndroid Build Coastguard Worker        add     t0_R, LOC dicBufSize
1151*f6dc9357SAndroid Build Coastguard Worker@@:
1152*f6dc9357SAndroid Build Coastguard Worker        movzx   sym, byte ptr[dic + t0_R * 1]
1153*f6dc9357SAndroid Build Coastguard Worker        jmp     lz_end_match
1154*f6dc9357SAndroid Build Coastguard Worker
1155*f6dc9357SAndroid Build Coastguard Worker
1156*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_32
1157*f6dc9357SAndroid Build Coastguard WorkerIsRep_label:
1158*f6dc9357SAndroid Build Coastguard Worker        UPDATE_1 probs_state_R, 0, IsRep
1159*f6dc9357SAndroid Build Coastguard Worker
1160*f6dc9357SAndroid Build Coastguard Worker        ; The (checkDicSize == 0 && processedPos == 0) case was checked before in LzmaDec.c with kBadRepCode.
1161*f6dc9357SAndroid Build Coastguard Worker        ; So we don't check it here.
1162*f6dc9357SAndroid Build Coastguard Worker
1163*f6dc9357SAndroid Build Coastguard Worker        ; mov     t0, processedPos
1164*f6dc9357SAndroid Build Coastguard Worker        ; or      t0, LOC checkDicSize
1165*f6dc9357SAndroid Build Coastguard Worker        ; jz      fin_ERROR_2
1166*f6dc9357SAndroid Build Coastguard Worker
1167*f6dc9357SAndroid Build Coastguard Worker        ; state = state < kNumLitStates ? 8 : 11;
1168*f6dc9357SAndroid Build Coastguard Worker        cmp     state, kNumLitStates * PMULT
1169*f6dc9357SAndroid Build Coastguard Worker        mov     state, 8 * PMULT
1170*f6dc9357SAndroid Build Coastguard Worker        mov     probBranch, 11 * PMULT
1171*f6dc9357SAndroid Build Coastguard Worker        cmovae  state, probBranch
1172*f6dc9357SAndroid Build Coastguard Worker
1173*f6dc9357SAndroid Build Coastguard Worker        ; prob = probs + RepLenCoder;
1174*f6dc9357SAndroid Build Coastguard Worker        add     probs, RepLenCoder * PMULT
1175*f6dc9357SAndroid Build Coastguard Worker
1176*f6dc9357SAndroid Build Coastguard Worker        IF_BIT_1 probs_state_R, 0, IsRepG0, IsRepG0_label
1177*f6dc9357SAndroid Build Coastguard Worker        IF_BIT_0_NOUP probs_state_R, pbPos_R, IsRep0Long, IsRep0Short_label
1178*f6dc9357SAndroid Build Coastguard Worker        UPDATE_1 probs_state_R, pbPos_R, IsRep0Long
1179*f6dc9357SAndroid Build Coastguard Worker        jmp     len_decode
1180*f6dc9357SAndroid Build Coastguard Worker
1181*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_32
1182*f6dc9357SAndroid Build Coastguard WorkerIsRepG0_label:
1183*f6dc9357SAndroid Build Coastguard Worker        UPDATE_1 probs_state_R, 0, IsRepG0
1184*f6dc9357SAndroid Build Coastguard Worker        mov     dist2, LOC rep0
1185*f6dc9357SAndroid Build Coastguard Worker        mov     dist, LOC rep1
1186*f6dc9357SAndroid Build Coastguard Worker        mov     LOC rep1, dist2
1187*f6dc9357SAndroid Build Coastguard Worker
1188*f6dc9357SAndroid Build Coastguard Worker        IF_BIT_1 probs_state_R, 0, IsRepG1, IsRepG1_label
1189*f6dc9357SAndroid Build Coastguard Worker        mov     LOC rep0, dist
1190*f6dc9357SAndroid Build Coastguard Worker        jmp     len_decode
1191*f6dc9357SAndroid Build Coastguard Worker
1192*f6dc9357SAndroid Build Coastguard Worker; MY_ALIGN_32
1193*f6dc9357SAndroid Build Coastguard WorkerIsRepG1_label:
1194*f6dc9357SAndroid Build Coastguard Worker        UPDATE_1 probs_state_R, 0, IsRepG1
1195*f6dc9357SAndroid Build Coastguard Worker        mov     dist2, LOC rep2
1196*f6dc9357SAndroid Build Coastguard Worker        mov     LOC rep2, dist
1197*f6dc9357SAndroid Build Coastguard Worker
1198*f6dc9357SAndroid Build Coastguard Worker        IF_BIT_1 probs_state_R, 0, IsRepG2, IsRepG2_label
1199*f6dc9357SAndroid Build Coastguard Worker        mov     LOC rep0, dist2
1200*f6dc9357SAndroid Build Coastguard Worker        jmp     len_decode
1201*f6dc9357SAndroid Build Coastguard Worker
1202*f6dc9357SAndroid Build Coastguard Worker; MY_ALIGN_32
1203*f6dc9357SAndroid Build Coastguard WorkerIsRepG2_label:
1204*f6dc9357SAndroid Build Coastguard Worker        UPDATE_1 probs_state_R, 0, IsRepG2
1205*f6dc9357SAndroid Build Coastguard Worker        mov     dist, LOC rep3
1206*f6dc9357SAndroid Build Coastguard Worker        mov     LOC rep3, dist2
1207*f6dc9357SAndroid Build Coastguard Worker        mov     LOC rep0, dist
1208*f6dc9357SAndroid Build Coastguard Worker        jmp     len_decode
1209*f6dc9357SAndroid Build Coastguard Worker
1210*f6dc9357SAndroid Build Coastguard Worker
1211*f6dc9357SAndroid Build Coastguard Worker
1212*f6dc9357SAndroid Build Coastguard Worker; ---------- SPEC SHORT DISTANCE ----------
1213*f6dc9357SAndroid Build Coastguard Worker
1214*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_32
1215*f6dc9357SAndroid Build Coastguard Workershort_dist:
1216*f6dc9357SAndroid Build Coastguard Worker        sub     x1, 32 + 1
1217*f6dc9357SAndroid Build Coastguard Worker        jbe     decode_dist_end
1218*f6dc9357SAndroid Build Coastguard Worker        or      sym, 2
1219*f6dc9357SAndroid Build Coastguard Worker        shl     sym, x1_L
1220*f6dc9357SAndroid Build Coastguard Worker        lea     sym_R, [probs + sym_R * PMULT + SpecPos * PMULT + 1 * PMULT]
1221*f6dc9357SAndroid Build Coastguard Worker        mov     sym2, PMULT ; step
1222*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_32
1223*f6dc9357SAndroid Build Coastguard Workerspec_loop:
1224*f6dc9357SAndroid Build Coastguard Worker        REV_1_VAR x2
1225*f6dc9357SAndroid Build Coastguard Worker        dec     x1
1226*f6dc9357SAndroid Build Coastguard Worker        jnz     spec_loop
1227*f6dc9357SAndroid Build Coastguard Worker
1228*f6dc9357SAndroid Build Coastguard Worker        mov     probs, LOC probs_Spec
1229*f6dc9357SAndroid Build Coastguard Worker        sub     sym, sym2
1230*f6dc9357SAndroid Build Coastguard Worker        sub     sym, SpecPos * PMULT
1231*f6dc9357SAndroid Build Coastguard Worker        sub     sym_R, probs
1232*f6dc9357SAndroid Build Coastguard Worker        shr     sym, PSHIFT
1233*f6dc9357SAndroid Build Coastguard Worker
1234*f6dc9357SAndroid Build Coastguard Worker        jmp     decode_dist_end
1235*f6dc9357SAndroid Build Coastguard Worker
1236*f6dc9357SAndroid Build Coastguard Worker
1237*f6dc9357SAndroid Build Coastguard Worker; ---------- COPY MATCH CROSS ----------
1238*f6dc9357SAndroid Build Coastguard Workercopy_match_cross:
1239*f6dc9357SAndroid Build Coastguard Worker        ; t0_R - src pos
1240*f6dc9357SAndroid Build Coastguard Worker        ; r1 - len to dicBufSize
1241*f6dc9357SAndroid Build Coastguard Worker        ; cnt_R - total copy len
1242*f6dc9357SAndroid Build Coastguard Worker
1243*f6dc9357SAndroid Build Coastguard Worker        mov     t1_R, t0_R         ; srcPos
1244*f6dc9357SAndroid Build Coastguard Worker        mov     t0_R, dic
1245*f6dc9357SAndroid Build Coastguard Worker        mov     r1, LOC dicBufSize   ;
1246*f6dc9357SAndroid Build Coastguard Worker        neg     cnt_R
1247*f6dc9357SAndroid Build Coastguard Worker@@:
1248*f6dc9357SAndroid Build Coastguard Worker        movzx   sym, byte ptr[t1_R * 1 + t0_R]
1249*f6dc9357SAndroid Build Coastguard Worker        inc     t1_R
1250*f6dc9357SAndroid Build Coastguard Worker        mov     byte ptr[cnt_R * 1 + dicPos], sym_L
1251*f6dc9357SAndroid Build Coastguard Worker        inc     cnt_R
1252*f6dc9357SAndroid Build Coastguard Worker        cmp     t1_R, r1
1253*f6dc9357SAndroid Build Coastguard Worker        jne     @b
1254*f6dc9357SAndroid Build Coastguard Worker
1255*f6dc9357SAndroid Build Coastguard Worker        movzx   sym, byte ptr[t0_R]
1256*f6dc9357SAndroid Build Coastguard Worker        sub     t0_R, cnt_R
1257*f6dc9357SAndroid Build Coastguard Worker        jmp     copy_common
1258*f6dc9357SAndroid Build Coastguard Worker
1259*f6dc9357SAndroid Build Coastguard Worker
1260*f6dc9357SAndroid Build Coastguard Worker
1261*f6dc9357SAndroid Build Coastguard Worker
1262*f6dc9357SAndroid Build Coastguard Worker; fin_dicPos_LIMIT_REP_SHORT:
1263*f6dc9357SAndroid Build Coastguard Worker        ; mov     sym, 1
1264*f6dc9357SAndroid Build Coastguard Worker
1265*f6dc9357SAndroid Build Coastguard Workerfin_dicPos_LIMIT:
1266*f6dc9357SAndroid Build Coastguard Worker        mov     LOC remainLen, sym
1267*f6dc9357SAndroid Build Coastguard Worker        jmp     fin_OK
1268*f6dc9357SAndroid Build Coastguard Worker        ; For more strict mode we can stop decoding with error
1269*f6dc9357SAndroid Build Coastguard Worker        ; mov     sym, 1
1270*f6dc9357SAndroid Build Coastguard Worker        ; jmp     fin
1271*f6dc9357SAndroid Build Coastguard Worker
1272*f6dc9357SAndroid Build Coastguard Worker
1273*f6dc9357SAndroid Build Coastguard Workerfin_ERROR_MATCH_DIST:
1274*f6dc9357SAndroid Build Coastguard Worker
1275*f6dc9357SAndroid Build Coastguard Worker        ; rep3 = rep2;
1276*f6dc9357SAndroid Build Coastguard Worker        ; rep2 = rep1;
1277*f6dc9357SAndroid Build Coastguard Worker        ; rep1 = rep0;
1278*f6dc9357SAndroid Build Coastguard Worker        ; rep0 = distance + 1;
1279*f6dc9357SAndroid Build Coastguard Worker
1280*f6dc9357SAndroid Build Coastguard Worker        add     len_temp, kMatchSpecLen_Error_Data
1281*f6dc9357SAndroid Build Coastguard Worker        mov     LOC remainLen, len_temp
1282*f6dc9357SAndroid Build Coastguard Worker
1283*f6dc9357SAndroid Build Coastguard Worker        mov     LOC rep0, sym
1284*f6dc9357SAndroid Build Coastguard Worker        mov     LOC rep1, t1
1285*f6dc9357SAndroid Build Coastguard Worker        mov     LOC rep2, x1
1286*f6dc9357SAndroid Build Coastguard Worker        mov     LOC rep3, x2
1287*f6dc9357SAndroid Build Coastguard Worker
1288*f6dc9357SAndroid Build Coastguard Worker        ; state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3;
1289*f6dc9357SAndroid Build Coastguard Worker        cmp     state, (kNumStates + kNumLitStates) * PMULT
1290*f6dc9357SAndroid Build Coastguard Worker        mov     state, kNumLitStates * PMULT
1291*f6dc9357SAndroid Build Coastguard Worker        mov     t0, (kNumLitStates + 3) * PMULT
1292*f6dc9357SAndroid Build Coastguard Worker        cmovae  state, t0
1293*f6dc9357SAndroid Build Coastguard Worker
1294*f6dc9357SAndroid Build Coastguard Worker        ; jmp     fin_OK
1295*f6dc9357SAndroid Build Coastguard Worker        mov     sym, 1
1296*f6dc9357SAndroid Build Coastguard Worker        jmp     fin
1297*f6dc9357SAndroid Build Coastguard Worker
1298*f6dc9357SAndroid Build Coastguard Workerend_of_payload:
1299*f6dc9357SAndroid Build Coastguard Worker        inc     sym
1300*f6dc9357SAndroid Build Coastguard Worker        jnz     fin_ERROR_MATCH_DIST
1301*f6dc9357SAndroid Build Coastguard Worker
1302*f6dc9357SAndroid Build Coastguard Worker        mov     LOC remainLen, kMatchSpecLenStart
1303*f6dc9357SAndroid Build Coastguard Worker        sub     state, kNumStates * PMULT
1304*f6dc9357SAndroid Build Coastguard Worker
1305*f6dc9357SAndroid Build Coastguard Workerfin_OK:
1306*f6dc9357SAndroid Build Coastguard Worker        xor     sym, sym
1307*f6dc9357SAndroid Build Coastguard Worker
1308*f6dc9357SAndroid Build Coastguard Workerfin:
1309*f6dc9357SAndroid Build Coastguard Worker        NORM
1310*f6dc9357SAndroid Build Coastguard Worker
1311*f6dc9357SAndroid Build Coastguard Worker        mov     r1, LOC lzmaPtr
1312*f6dc9357SAndroid Build Coastguard Worker
1313*f6dc9357SAndroid Build Coastguard Worker        sub     dicPos, LOC dic_Spec
1314*f6dc9357SAndroid Build Coastguard Worker        mov     GLOB dicPos_Spec, dicPos
1315*f6dc9357SAndroid Build Coastguard Worker        mov     GLOB buf_Spec, buf
1316*f6dc9357SAndroid Build Coastguard Worker        mov     GLOB range_Spec, range
1317*f6dc9357SAndroid Build Coastguard Worker        mov     GLOB code_Spec, cod
1318*f6dc9357SAndroid Build Coastguard Worker        shr     state, PSHIFT
1319*f6dc9357SAndroid Build Coastguard Worker        mov     GLOB state_Spec, state
1320*f6dc9357SAndroid Build Coastguard Worker        mov     GLOB processedPos_Spec, processedPos
1321*f6dc9357SAndroid Build Coastguard Worker
1322*f6dc9357SAndroid Build Coastguard Worker        RESTORE_VAR(remainLen)
1323*f6dc9357SAndroid Build Coastguard Worker        RESTORE_VAR(rep0)
1324*f6dc9357SAndroid Build Coastguard Worker        RESTORE_VAR(rep1)
1325*f6dc9357SAndroid Build Coastguard Worker        RESTORE_VAR(rep2)
1326*f6dc9357SAndroid Build Coastguard Worker        RESTORE_VAR(rep3)
1327*f6dc9357SAndroid Build Coastguard Worker
1328*f6dc9357SAndroid Build Coastguard Worker        mov     x0, sym
1329*f6dc9357SAndroid Build Coastguard Worker
1330*f6dc9357SAndroid Build Coastguard Worker        mov     RSP, LOC Old_RSP
1331*f6dc9357SAndroid Build Coastguard Worker
1332*f6dc9357SAndroid Build Coastguard WorkerMY_POP_PRESERVED_ABI_REGS
1333*f6dc9357SAndroid Build Coastguard WorkerMY_ENDP
1334*f6dc9357SAndroid Build Coastguard Worker
1335*f6dc9357SAndroid Build Coastguard Workerifdef Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT
1336*f6dc9357SAndroid Build Coastguard Worker_TEXT$LZMADECOPT ENDS
1337*f6dc9357SAndroid Build Coastguard Workerendif
1338*f6dc9357SAndroid Build Coastguard Worker
1339*f6dc9357SAndroid Build Coastguard Workerend
1340