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