1*f6dc9357SAndroid Build Coastguard Worker; LzFindOpt.asm -- ASM version of GetMatchesSpecN_2() function 2*f6dc9357SAndroid Build Coastguard Worker; 2024-06-18: Igor Pavlov : Public domain 3*f6dc9357SAndroid Build Coastguard Worker; 4*f6dc9357SAndroid Build Coastguard Worker 5*f6dc9357SAndroid Build Coastguard Workerifndef x64 6*f6dc9357SAndroid Build Coastguard Worker; x64=1 7*f6dc9357SAndroid Build Coastguard Worker; .err <x64_IS_REQUIRED> 8*f6dc9357SAndroid Build Coastguard Workerendif 9*f6dc9357SAndroid Build Coastguard Worker 10*f6dc9357SAndroid Build Coastguard Workerinclude 7zAsm.asm 11*f6dc9357SAndroid Build Coastguard Worker 12*f6dc9357SAndroid Build Coastguard WorkerMY_ASM_START 13*f6dc9357SAndroid Build Coastguard Worker 14*f6dc9357SAndroid Build Coastguard Workerifndef Z7_LZ_FIND_OPT_ASM_USE_SEGMENT 15*f6dc9357SAndroid Build Coastguard Workerif (IS_LINUX gt 0) 16*f6dc9357SAndroid Build Coastguard Worker Z7_LZ_FIND_OPT_ASM_USE_SEGMENT equ 1 17*f6dc9357SAndroid Build Coastguard Workerelse 18*f6dc9357SAndroid Build Coastguard Worker Z7_LZ_FIND_OPT_ASM_USE_SEGMENT equ 1 19*f6dc9357SAndroid Build Coastguard Workerendif 20*f6dc9357SAndroid Build Coastguard Workerendif 21*f6dc9357SAndroid Build Coastguard Worker 22*f6dc9357SAndroid Build Coastguard Workerifdef Z7_LZ_FIND_OPT_ASM_USE_SEGMENT 23*f6dc9357SAndroid Build Coastguard Worker_TEXT$LZFINDOPT SEGMENT ALIGN(64) 'CODE' 24*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN macro num:req 25*f6dc9357SAndroid Build Coastguard Worker align num 26*f6dc9357SAndroid Build Coastguard Worker ; align 16 27*f6dc9357SAndroid Build Coastguard Workerendm 28*f6dc9357SAndroid Build Coastguard Workerelse 29*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN macro num:req 30*f6dc9357SAndroid Build Coastguard Worker ; We expect that ".text" is aligned for 16-bytes. 31*f6dc9357SAndroid Build Coastguard Worker ; So we don't need large alignment inside our function. 32*f6dc9357SAndroid Build Coastguard Worker align 16 33*f6dc9357SAndroid Build Coastguard Workerendm 34*f6dc9357SAndroid Build Coastguard Workerendif 35*f6dc9357SAndroid Build Coastguard Worker 36*f6dc9357SAndroid Build Coastguard Worker 37*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_16 macro 38*f6dc9357SAndroid Build Coastguard Worker MY_ALIGN 16 39*f6dc9357SAndroid Build Coastguard Workerendm 40*f6dc9357SAndroid Build Coastguard Worker 41*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_32 macro 42*f6dc9357SAndroid Build Coastguard Worker MY_ALIGN 32 43*f6dc9357SAndroid Build Coastguard Workerendm 44*f6dc9357SAndroid Build Coastguard Worker 45*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_64 macro 46*f6dc9357SAndroid Build Coastguard Worker MY_ALIGN 64 47*f6dc9357SAndroid Build Coastguard Workerendm 48*f6dc9357SAndroid Build Coastguard Worker 49*f6dc9357SAndroid Build Coastguard Worker 50*f6dc9357SAndroid Build Coastguard Workert0_L equ x0_L 51*f6dc9357SAndroid Build Coastguard Workert0_x equ x0 52*f6dc9357SAndroid Build Coastguard Workert0 equ r0 53*f6dc9357SAndroid Build Coastguard Workert1_x equ x3 54*f6dc9357SAndroid Build Coastguard Workert1 equ r3 55*f6dc9357SAndroid Build Coastguard Worker 56*f6dc9357SAndroid Build Coastguard Workercp_x equ t1_x 57*f6dc9357SAndroid Build Coastguard Workercp_r equ t1 58*f6dc9357SAndroid Build Coastguard Workerm equ x5 59*f6dc9357SAndroid Build Coastguard Workerm_r equ r5 60*f6dc9357SAndroid Build Coastguard Workerlen_x equ x6 61*f6dc9357SAndroid Build Coastguard Workerlen equ r6 62*f6dc9357SAndroid Build Coastguard Workerdiff_x equ x7 63*f6dc9357SAndroid Build Coastguard Workerdiff equ r7 64*f6dc9357SAndroid Build Coastguard Workerlen0 equ r10 65*f6dc9357SAndroid Build Coastguard Workerlen1_x equ x11 66*f6dc9357SAndroid Build Coastguard Workerlen1 equ r11 67*f6dc9357SAndroid Build Coastguard WorkermaxLen_x equ x12 68*f6dc9357SAndroid Build Coastguard WorkermaxLen equ r12 69*f6dc9357SAndroid Build Coastguard Workerd equ r13 70*f6dc9357SAndroid Build Coastguard Workerptr0 equ r14 71*f6dc9357SAndroid Build Coastguard Workerptr1 equ r15 72*f6dc9357SAndroid Build Coastguard Worker 73*f6dc9357SAndroid Build Coastguard Workerd_lim equ m_r 74*f6dc9357SAndroid Build Coastguard WorkercycSize equ len_x 75*f6dc9357SAndroid Build Coastguard Workerhash_lim equ len0 76*f6dc9357SAndroid Build Coastguard Workerdelta1_x equ len1_x 77*f6dc9357SAndroid Build Coastguard Workerdelta1_r equ len1 78*f6dc9357SAndroid Build Coastguard Workerdelta_x equ maxLen_x 79*f6dc9357SAndroid Build Coastguard Workerdelta_r equ maxLen 80*f6dc9357SAndroid Build Coastguard Workerhash equ ptr0 81*f6dc9357SAndroid Build Coastguard Workersrc equ ptr1 82*f6dc9357SAndroid Build Coastguard Worker 83*f6dc9357SAndroid Build Coastguard Worker 84*f6dc9357SAndroid Build Coastguard Worker 85*f6dc9357SAndroid Build Coastguard Workerif (IS_LINUX gt 0) 86*f6dc9357SAndroid Build Coastguard Worker 87*f6dc9357SAndroid Build Coastguard Worker; r1 r2 r8 r9 : win32 88*f6dc9357SAndroid Build Coastguard Worker; r7 r6 r2 r1 r8 r9 : linux 89*f6dc9357SAndroid Build Coastguard Worker 90*f6dc9357SAndroid Build Coastguard WorkerlenLimit equ r8 91*f6dc9357SAndroid Build Coastguard WorkerlenLimit_x equ x8 92*f6dc9357SAndroid Build Coastguard Worker; pos_r equ r2 93*f6dc9357SAndroid Build Coastguard Workerpos equ x2 94*f6dc9357SAndroid Build Coastguard Workercur equ r1 95*f6dc9357SAndroid Build Coastguard Workerson equ r9 96*f6dc9357SAndroid Build Coastguard Worker 97*f6dc9357SAndroid Build Coastguard Workerelse 98*f6dc9357SAndroid Build Coastguard Worker 99*f6dc9357SAndroid Build Coastguard WorkerlenLimit equ REG_ABI_PARAM_2 100*f6dc9357SAndroid Build Coastguard WorkerlenLimit_x equ REG_ABI_PARAM_2_x 101*f6dc9357SAndroid Build Coastguard Workerpos equ REG_ABI_PARAM_1_x 102*f6dc9357SAndroid Build Coastguard Workercur equ REG_ABI_PARAM_0 103*f6dc9357SAndroid Build Coastguard Workerson equ REG_ABI_PARAM_3 104*f6dc9357SAndroid Build Coastguard Worker 105*f6dc9357SAndroid Build Coastguard Workerendif 106*f6dc9357SAndroid Build Coastguard Worker 107*f6dc9357SAndroid Build Coastguard Worker 108*f6dc9357SAndroid Build Coastguard Workerif (IS_LINUX gt 0) 109*f6dc9357SAndroid Build Coastguard Worker maxLen_OFFS equ (REG_SIZE * (6 + 1)) 110*f6dc9357SAndroid Build Coastguard Workerelse 111*f6dc9357SAndroid Build Coastguard Worker cutValue_OFFS equ (REG_SIZE * (8 + 1 + 4)) 112*f6dc9357SAndroid Build Coastguard Worker d_OFFS equ (REG_SIZE + cutValue_OFFS) 113*f6dc9357SAndroid Build Coastguard Worker maxLen_OFFS equ (REG_SIZE + d_OFFS) 114*f6dc9357SAndroid Build Coastguard Workerendif 115*f6dc9357SAndroid Build Coastguard Worker hash_OFFS equ (REG_SIZE + maxLen_OFFS) 116*f6dc9357SAndroid Build Coastguard Worker limit_OFFS equ (REG_SIZE + hash_OFFS) 117*f6dc9357SAndroid Build Coastguard Worker size_OFFS equ (REG_SIZE + limit_OFFS) 118*f6dc9357SAndroid Build Coastguard Worker cycPos_OFFS equ (REG_SIZE + size_OFFS) 119*f6dc9357SAndroid Build Coastguard Worker cycSize_OFFS equ (REG_SIZE + cycPos_OFFS) 120*f6dc9357SAndroid Build Coastguard Worker posRes_OFFS equ (REG_SIZE + cycSize_OFFS) 121*f6dc9357SAndroid Build Coastguard Worker 122*f6dc9357SAndroid Build Coastguard Workerif (IS_LINUX gt 0) 123*f6dc9357SAndroid Build Coastguard Workerelse 124*f6dc9357SAndroid Build Coastguard Worker cutValue_PAR equ [r0 + cutValue_OFFS] 125*f6dc9357SAndroid Build Coastguard Worker d_PAR equ [r0 + d_OFFS] 126*f6dc9357SAndroid Build Coastguard Workerendif 127*f6dc9357SAndroid Build Coastguard Worker maxLen_PAR equ [r0 + maxLen_OFFS] 128*f6dc9357SAndroid Build Coastguard Worker hash_PAR equ [r0 + hash_OFFS] 129*f6dc9357SAndroid Build Coastguard Worker limit_PAR equ [r0 + limit_OFFS] 130*f6dc9357SAndroid Build Coastguard Worker size_PAR equ [r0 + size_OFFS] 131*f6dc9357SAndroid Build Coastguard Worker cycPos_PAR equ [r0 + cycPos_OFFS] 132*f6dc9357SAndroid Build Coastguard Worker cycSize_PAR equ [r0 + cycSize_OFFS] 133*f6dc9357SAndroid Build Coastguard Worker posRes_PAR equ [r0 + posRes_OFFS] 134*f6dc9357SAndroid Build Coastguard Worker 135*f6dc9357SAndroid Build Coastguard Worker 136*f6dc9357SAndroid Build Coastguard Worker cutValue_VAR equ DWORD PTR [r4 + 8 * 0] 137*f6dc9357SAndroid Build Coastguard Worker cutValueCur_VAR equ DWORD PTR [r4 + 8 * 0 + 4] 138*f6dc9357SAndroid Build Coastguard Worker cycPos_VAR equ DWORD PTR [r4 + 8 * 1 + 0] 139*f6dc9357SAndroid Build Coastguard Worker cycSize_VAR equ DWORD PTR [r4 + 8 * 1 + 4] 140*f6dc9357SAndroid Build Coastguard Worker hash_VAR equ QWORD PTR [r4 + 8 * 2] 141*f6dc9357SAndroid Build Coastguard Worker limit_VAR equ QWORD PTR [r4 + 8 * 3] 142*f6dc9357SAndroid Build Coastguard Worker size_VAR equ QWORD PTR [r4 + 8 * 4] 143*f6dc9357SAndroid Build Coastguard Worker distances equ QWORD PTR [r4 + 8 * 5] 144*f6dc9357SAndroid Build Coastguard Worker maxLen_VAR equ QWORD PTR [r4 + 8 * 6] 145*f6dc9357SAndroid Build Coastguard Worker 146*f6dc9357SAndroid Build Coastguard Worker Old_RSP equ QWORD PTR [r4 + 8 * 7] 147*f6dc9357SAndroid Build Coastguard Worker LOCAL_SIZE equ 8 * 8 148*f6dc9357SAndroid Build Coastguard Worker 149*f6dc9357SAndroid Build Coastguard WorkerCOPY_VAR_32 macro dest_var, src_var 150*f6dc9357SAndroid Build Coastguard Worker mov x3, src_var 151*f6dc9357SAndroid Build Coastguard Worker mov dest_var, x3 152*f6dc9357SAndroid Build Coastguard Workerendm 153*f6dc9357SAndroid Build Coastguard Worker 154*f6dc9357SAndroid Build Coastguard WorkerCOPY_VAR_64 macro dest_var, src_var 155*f6dc9357SAndroid Build Coastguard Worker mov r3, src_var 156*f6dc9357SAndroid Build Coastguard Worker mov dest_var, r3 157*f6dc9357SAndroid Build Coastguard Workerendm 158*f6dc9357SAndroid Build Coastguard Worker 159*f6dc9357SAndroid Build Coastguard Worker 160*f6dc9357SAndroid Build Coastguard Workerifdef Z7_LZ_FIND_OPT_ASM_USE_SEGMENT 161*f6dc9357SAndroid Build Coastguard Worker; MY_ALIGN_64 162*f6dc9357SAndroid Build Coastguard Workerelse 163*f6dc9357SAndroid Build Coastguard Worker MY_ALIGN_16 164*f6dc9357SAndroid Build Coastguard Workerendif 165*f6dc9357SAndroid Build Coastguard WorkerMY_PROC GetMatchesSpecN_2, 13 166*f6dc9357SAndroid Build Coastguard WorkerMY_PUSH_PRESERVED_ABI_REGS 167*f6dc9357SAndroid Build Coastguard Worker mov r0, RSP 168*f6dc9357SAndroid Build Coastguard Worker lea r3, [r0 - LOCAL_SIZE] 169*f6dc9357SAndroid Build Coastguard Worker and r3, -64 170*f6dc9357SAndroid Build Coastguard Worker mov RSP, r3 171*f6dc9357SAndroid Build Coastguard Worker mov Old_RSP, r0 172*f6dc9357SAndroid Build Coastguard Worker 173*f6dc9357SAndroid Build Coastguard Workerif (IS_LINUX gt 0) 174*f6dc9357SAndroid Build Coastguard Worker mov d, REG_ABI_PARAM_5 ; r13 = r9 175*f6dc9357SAndroid Build Coastguard Worker mov cutValue_VAR, REG_ABI_PARAM_4_x ; = r8 176*f6dc9357SAndroid Build Coastguard Worker mov son, REG_ABI_PARAM_3 ; r9 = r1 177*f6dc9357SAndroid Build Coastguard Worker mov r8, REG_ABI_PARAM_2 ; r8 = r2 178*f6dc9357SAndroid Build Coastguard Worker mov pos, REG_ABI_PARAM_1_x ; r2 = x6 179*f6dc9357SAndroid Build Coastguard Worker mov r1, REG_ABI_PARAM_0 ; r1 = r7 180*f6dc9357SAndroid Build Coastguard Workerelse 181*f6dc9357SAndroid Build Coastguard Worker COPY_VAR_32 cutValue_VAR, cutValue_PAR 182*f6dc9357SAndroid Build Coastguard Worker mov d, d_PAR 183*f6dc9357SAndroid Build Coastguard Workerendif 184*f6dc9357SAndroid Build Coastguard Worker 185*f6dc9357SAndroid Build Coastguard Worker COPY_VAR_64 limit_VAR, limit_PAR 186*f6dc9357SAndroid Build Coastguard Worker 187*f6dc9357SAndroid Build Coastguard Worker mov hash_lim, size_PAR 188*f6dc9357SAndroid Build Coastguard Worker mov size_VAR, hash_lim 189*f6dc9357SAndroid Build Coastguard Worker 190*f6dc9357SAndroid Build Coastguard Worker mov cp_x, cycPos_PAR 191*f6dc9357SAndroid Build Coastguard Worker mov hash, hash_PAR 192*f6dc9357SAndroid Build Coastguard Worker 193*f6dc9357SAndroid Build Coastguard Worker mov cycSize, cycSize_PAR 194*f6dc9357SAndroid Build Coastguard Worker mov cycSize_VAR, cycSize 195*f6dc9357SAndroid Build Coastguard Worker 196*f6dc9357SAndroid Build Coastguard Worker ; we want cur in (rcx). So we change the cur and lenLimit variables 197*f6dc9357SAndroid Build Coastguard Worker sub lenLimit, cur 198*f6dc9357SAndroid Build Coastguard Worker neg lenLimit_x 199*f6dc9357SAndroid Build Coastguard Worker inc lenLimit_x 200*f6dc9357SAndroid Build Coastguard Worker 201*f6dc9357SAndroid Build Coastguard Worker mov t0_x, maxLen_PAR 202*f6dc9357SAndroid Build Coastguard Worker sub t0, lenLimit 203*f6dc9357SAndroid Build Coastguard Worker mov maxLen_VAR, t0 204*f6dc9357SAndroid Build Coastguard Worker 205*f6dc9357SAndroid Build Coastguard Worker jmp main_loop 206*f6dc9357SAndroid Build Coastguard Worker 207*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_64 208*f6dc9357SAndroid Build Coastguard Workerfill_empty: 209*f6dc9357SAndroid Build Coastguard Worker ; ptr0 = *ptr1 = kEmptyHashValue; 210*f6dc9357SAndroid Build Coastguard Worker mov QWORD PTR [ptr1], 0 211*f6dc9357SAndroid Build Coastguard Worker inc pos 212*f6dc9357SAndroid Build Coastguard Worker inc cp_x 213*f6dc9357SAndroid Build Coastguard Worker mov DWORD PTR [d - 4], 0 214*f6dc9357SAndroid Build Coastguard Worker cmp d, limit_VAR 215*f6dc9357SAndroid Build Coastguard Worker jae fin 216*f6dc9357SAndroid Build Coastguard Worker cmp hash, hash_lim 217*f6dc9357SAndroid Build Coastguard Worker je fin 218*f6dc9357SAndroid Build Coastguard Worker 219*f6dc9357SAndroid Build Coastguard Worker; MY_ALIGN_64 220*f6dc9357SAndroid Build Coastguard Workermain_loop: 221*f6dc9357SAndroid Build Coastguard Worker ; UInt32 delta = *hash++; 222*f6dc9357SAndroid Build Coastguard Worker mov diff_x, [hash] ; delta 223*f6dc9357SAndroid Build Coastguard Worker add hash, 4 224*f6dc9357SAndroid Build Coastguard Worker ; mov cycPos_VAR, cp_x 225*f6dc9357SAndroid Build Coastguard Worker 226*f6dc9357SAndroid Build Coastguard Worker inc cur 227*f6dc9357SAndroid Build Coastguard Worker add d, 4 228*f6dc9357SAndroid Build Coastguard Worker mov m, pos 229*f6dc9357SAndroid Build Coastguard Worker sub m, diff_x; ; matchPos 230*f6dc9357SAndroid Build Coastguard Worker 231*f6dc9357SAndroid Build Coastguard Worker ; CLzRef *ptr1 = son + ((size_t)(pos) << 1) - CYC_TO_POS_OFFSET * 2; 232*f6dc9357SAndroid Build Coastguard Worker lea ptr1, [son + 8 * cp_r] 233*f6dc9357SAndroid Build Coastguard Worker ; mov cycSize, cycSize_VAR 234*f6dc9357SAndroid Build Coastguard Worker cmp pos, cycSize 235*f6dc9357SAndroid Build Coastguard Worker jb directMode ; if (pos < cycSize_VAR) 236*f6dc9357SAndroid Build Coastguard Worker 237*f6dc9357SAndroid Build Coastguard Worker ; CYC MODE 238*f6dc9357SAndroid Build Coastguard Worker 239*f6dc9357SAndroid Build Coastguard Worker cmp diff_x, cycSize 240*f6dc9357SAndroid Build Coastguard Worker jae fill_empty ; if (delta >= cycSize_VAR) 241*f6dc9357SAndroid Build Coastguard Worker 242*f6dc9357SAndroid Build Coastguard Worker xor t0_x, t0_x 243*f6dc9357SAndroid Build Coastguard Worker mov cycPos_VAR, cp_x 244*f6dc9357SAndroid Build Coastguard Worker sub cp_x, diff_x 245*f6dc9357SAndroid Build Coastguard Worker ; jae prepare_for_tree_loop 246*f6dc9357SAndroid Build Coastguard Worker ; add cp_x, cycSize 247*f6dc9357SAndroid Build Coastguard Worker cmovb t0_x, cycSize 248*f6dc9357SAndroid Build Coastguard Worker add cp_x, t0_x ; cp_x += (cycPos < delta ? cycSize : 0) 249*f6dc9357SAndroid Build Coastguard Worker jmp prepare_for_tree_loop 250*f6dc9357SAndroid Build Coastguard Worker 251*f6dc9357SAndroid Build Coastguard Worker 252*f6dc9357SAndroid Build Coastguard WorkerdirectMode: 253*f6dc9357SAndroid Build Coastguard Worker cmp diff_x, pos 254*f6dc9357SAndroid Build Coastguard Worker je fill_empty ; if (delta == pos) 255*f6dc9357SAndroid Build Coastguard Worker jae fin_error ; if (delta >= pos) 256*f6dc9357SAndroid Build Coastguard Worker 257*f6dc9357SAndroid Build Coastguard Worker mov cycPos_VAR, cp_x 258*f6dc9357SAndroid Build Coastguard Worker mov cp_x, m 259*f6dc9357SAndroid Build Coastguard Worker 260*f6dc9357SAndroid Build Coastguard Workerprepare_for_tree_loop: 261*f6dc9357SAndroid Build Coastguard Worker mov len0, lenLimit 262*f6dc9357SAndroid Build Coastguard Worker mov hash_VAR, hash 263*f6dc9357SAndroid Build Coastguard Worker ; CLzRef *ptr0 = son + ((size_t)(pos) << 1) - CYC_TO_POS_OFFSET * 2 + 1; 264*f6dc9357SAndroid Build Coastguard Worker lea ptr0, [ptr1 + 4] 265*f6dc9357SAndroid Build Coastguard Worker ; UInt32 *_distances = ++d; 266*f6dc9357SAndroid Build Coastguard Worker mov distances, d 267*f6dc9357SAndroid Build Coastguard Worker 268*f6dc9357SAndroid Build Coastguard Worker neg len0 269*f6dc9357SAndroid Build Coastguard Worker mov len1, len0 270*f6dc9357SAndroid Build Coastguard Worker 271*f6dc9357SAndroid Build Coastguard Worker mov t0_x, cutValue_VAR 272*f6dc9357SAndroid Build Coastguard Worker mov maxLen, maxLen_VAR 273*f6dc9357SAndroid Build Coastguard Worker mov cutValueCur_VAR, t0_x 274*f6dc9357SAndroid Build Coastguard Worker 275*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_32 276*f6dc9357SAndroid Build Coastguard Workertree_loop: 277*f6dc9357SAndroid Build Coastguard Worker neg diff 278*f6dc9357SAndroid Build Coastguard Worker mov len, len0 279*f6dc9357SAndroid Build Coastguard Worker cmp len1, len0 280*f6dc9357SAndroid Build Coastguard Worker cmovb len, len1 ; len = (len1 < len0 ? len1 : len0); 281*f6dc9357SAndroid Build Coastguard Worker add diff, cur 282*f6dc9357SAndroid Build Coastguard Worker 283*f6dc9357SAndroid Build Coastguard Worker mov t0_x, [son + cp_r * 8] ; prefetch 284*f6dc9357SAndroid Build Coastguard Worker movzx t0_x, BYTE PTR [diff + 1 * len] 285*f6dc9357SAndroid Build Coastguard Worker lea cp_r, [son + cp_r * 8] 286*f6dc9357SAndroid Build Coastguard Worker cmp [cur + 1 * len], t0_L 287*f6dc9357SAndroid Build Coastguard Worker je matched_1 288*f6dc9357SAndroid Build Coastguard Worker 289*f6dc9357SAndroid Build Coastguard Worker jb left_0 290*f6dc9357SAndroid Build Coastguard Worker 291*f6dc9357SAndroid Build Coastguard Worker mov [ptr1], m 292*f6dc9357SAndroid Build Coastguard Worker mov m, [cp_r + 4] 293*f6dc9357SAndroid Build Coastguard Worker lea ptr1, [cp_r + 4] 294*f6dc9357SAndroid Build Coastguard Worker sub diff, cur ; FIX32 295*f6dc9357SAndroid Build Coastguard Worker jmp next_node 296*f6dc9357SAndroid Build Coastguard Worker 297*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_32 298*f6dc9357SAndroid Build Coastguard Workerleft_0: 299*f6dc9357SAndroid Build Coastguard Worker mov [ptr0], m 300*f6dc9357SAndroid Build Coastguard Worker mov m, [cp_r] 301*f6dc9357SAndroid Build Coastguard Worker mov ptr0, cp_r 302*f6dc9357SAndroid Build Coastguard Worker sub diff, cur ; FIX32 303*f6dc9357SAndroid Build Coastguard Worker ; jmp next_node 304*f6dc9357SAndroid Build Coastguard Worker 305*f6dc9357SAndroid Build Coastguard Worker; ------------ NEXT NODE ------------ 306*f6dc9357SAndroid Build Coastguard Worker; MY_ALIGN_32 307*f6dc9357SAndroid Build Coastguard Workernext_node: 308*f6dc9357SAndroid Build Coastguard Worker mov cycSize, cycSize_VAR 309*f6dc9357SAndroid Build Coastguard Worker dec cutValueCur_VAR 310*f6dc9357SAndroid Build Coastguard Worker je finish_tree 311*f6dc9357SAndroid Build Coastguard Worker 312*f6dc9357SAndroid Build Coastguard Worker add diff_x, pos ; prev_match = pos + diff 313*f6dc9357SAndroid Build Coastguard Worker cmp m, diff_x 314*f6dc9357SAndroid Build Coastguard Worker jae fin_error ; if (new_match >= prev_match) 315*f6dc9357SAndroid Build Coastguard Worker 316*f6dc9357SAndroid Build Coastguard Worker mov diff_x, pos 317*f6dc9357SAndroid Build Coastguard Worker sub diff_x, m ; delta = pos - new_match 318*f6dc9357SAndroid Build Coastguard Worker cmp pos, cycSize 319*f6dc9357SAndroid Build Coastguard Worker jae cyc_mode_2 ; if (pos >= cycSize) 320*f6dc9357SAndroid Build Coastguard Worker 321*f6dc9357SAndroid Build Coastguard Worker mov cp_x, m 322*f6dc9357SAndroid Build Coastguard Worker test m, m 323*f6dc9357SAndroid Build Coastguard Worker jne tree_loop ; if (m != 0) 324*f6dc9357SAndroid Build Coastguard Worker 325*f6dc9357SAndroid Build Coastguard Workerfinish_tree: 326*f6dc9357SAndroid Build Coastguard Worker ; ptr0 = *ptr1 = kEmptyHashValue; 327*f6dc9357SAndroid Build Coastguard Worker mov DWORD PTR [ptr0], 0 328*f6dc9357SAndroid Build Coastguard Worker mov DWORD PTR [ptr1], 0 329*f6dc9357SAndroid Build Coastguard Worker 330*f6dc9357SAndroid Build Coastguard Worker inc pos 331*f6dc9357SAndroid Build Coastguard Worker 332*f6dc9357SAndroid Build Coastguard Worker ; _distances[-1] = (UInt32)(d - _distances); 333*f6dc9357SAndroid Build Coastguard Worker mov t0, distances 334*f6dc9357SAndroid Build Coastguard Worker mov t1, d 335*f6dc9357SAndroid Build Coastguard Worker sub t1, t0 336*f6dc9357SAndroid Build Coastguard Worker shr t1_x, 2 337*f6dc9357SAndroid Build Coastguard Worker mov [t0 - 4], t1_x 338*f6dc9357SAndroid Build Coastguard Worker 339*f6dc9357SAndroid Build Coastguard Worker cmp d, limit_VAR 340*f6dc9357SAndroid Build Coastguard Worker jae fin ; if (d >= limit) 341*f6dc9357SAndroid Build Coastguard Worker 342*f6dc9357SAndroid Build Coastguard Worker mov cp_x, cycPos_VAR 343*f6dc9357SAndroid Build Coastguard Worker mov hash, hash_VAR 344*f6dc9357SAndroid Build Coastguard Worker mov hash_lim, size_VAR 345*f6dc9357SAndroid Build Coastguard Worker inc cp_x 346*f6dc9357SAndroid Build Coastguard Worker cmp hash, hash_lim 347*f6dc9357SAndroid Build Coastguard Worker jne main_loop ; if (hash != size) 348*f6dc9357SAndroid Build Coastguard Worker jmp fin 349*f6dc9357SAndroid Build Coastguard Worker 350*f6dc9357SAndroid Build Coastguard Worker 351*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_32 352*f6dc9357SAndroid Build Coastguard Workercyc_mode_2: 353*f6dc9357SAndroid Build Coastguard Worker cmp diff_x, cycSize 354*f6dc9357SAndroid Build Coastguard Worker jae finish_tree ; if (delta >= cycSize) 355*f6dc9357SAndroid Build Coastguard Worker 356*f6dc9357SAndroid Build Coastguard Worker mov cp_x, cycPos_VAR 357*f6dc9357SAndroid Build Coastguard Worker xor t0_x, t0_x 358*f6dc9357SAndroid Build Coastguard Worker sub cp_x, diff_x ; cp_x = cycPos - delta 359*f6dc9357SAndroid Build Coastguard Worker cmovb t0_x, cycSize 360*f6dc9357SAndroid Build Coastguard Worker add cp_x, t0_x ; cp_x += (cycPos < delta ? cycSize : 0) 361*f6dc9357SAndroid Build Coastguard Worker jmp tree_loop 362*f6dc9357SAndroid Build Coastguard Worker 363*f6dc9357SAndroid Build Coastguard Worker 364*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_32 365*f6dc9357SAndroid Build Coastguard Workermatched_1: 366*f6dc9357SAndroid Build Coastguard Worker 367*f6dc9357SAndroid Build Coastguard Worker inc len 368*f6dc9357SAndroid Build Coastguard Worker ; cmp len_x, lenLimit_x 369*f6dc9357SAndroid Build Coastguard Worker je short lenLimit_reach 370*f6dc9357SAndroid Build Coastguard Worker movzx t0_x, BYTE PTR [diff + 1 * len] 371*f6dc9357SAndroid Build Coastguard Worker cmp [cur + 1 * len], t0_L 372*f6dc9357SAndroid Build Coastguard Worker jne mismatch 373*f6dc9357SAndroid Build Coastguard Worker 374*f6dc9357SAndroid Build Coastguard Worker 375*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_32 376*f6dc9357SAndroid Build Coastguard Workermatch_loop: 377*f6dc9357SAndroid Build Coastguard Worker ; while (++len != lenLimit) (len[diff] != len[0]) ; 378*f6dc9357SAndroid Build Coastguard Worker 379*f6dc9357SAndroid Build Coastguard Worker inc len 380*f6dc9357SAndroid Build Coastguard Worker ; cmp len_x, lenLimit_x 381*f6dc9357SAndroid Build Coastguard Worker je short lenLimit_reach 382*f6dc9357SAndroid Build Coastguard Worker movzx t0_x, BYTE PTR [diff + 1 * len] 383*f6dc9357SAndroid Build Coastguard Worker cmp BYTE PTR [cur + 1 * len], t0_L 384*f6dc9357SAndroid Build Coastguard Worker je match_loop 385*f6dc9357SAndroid Build Coastguard Worker 386*f6dc9357SAndroid Build Coastguard Workermismatch: 387*f6dc9357SAndroid Build Coastguard Worker jb left_2 388*f6dc9357SAndroid Build Coastguard Worker 389*f6dc9357SAndroid Build Coastguard Worker mov [ptr1], m 390*f6dc9357SAndroid Build Coastguard Worker mov m, [cp_r + 4] 391*f6dc9357SAndroid Build Coastguard Worker lea ptr1, [cp_r + 4] 392*f6dc9357SAndroid Build Coastguard Worker mov len1, len 393*f6dc9357SAndroid Build Coastguard Worker 394*f6dc9357SAndroid Build Coastguard Worker jmp max_update 395*f6dc9357SAndroid Build Coastguard Worker 396*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_32 397*f6dc9357SAndroid Build Coastguard Workerleft_2: 398*f6dc9357SAndroid Build Coastguard Worker mov [ptr0], m 399*f6dc9357SAndroid Build Coastguard Worker mov m, [cp_r] 400*f6dc9357SAndroid Build Coastguard Worker mov ptr0, cp_r 401*f6dc9357SAndroid Build Coastguard Worker mov len0, len 402*f6dc9357SAndroid Build Coastguard Worker 403*f6dc9357SAndroid Build Coastguard Workermax_update: 404*f6dc9357SAndroid Build Coastguard Worker sub diff, cur ; restore diff 405*f6dc9357SAndroid Build Coastguard Worker 406*f6dc9357SAndroid Build Coastguard Worker cmp maxLen, len 407*f6dc9357SAndroid Build Coastguard Worker jae next_node 408*f6dc9357SAndroid Build Coastguard Worker 409*f6dc9357SAndroid Build Coastguard Worker mov maxLen, len 410*f6dc9357SAndroid Build Coastguard Worker add len, lenLimit 411*f6dc9357SAndroid Build Coastguard Worker mov [d], len_x 412*f6dc9357SAndroid Build Coastguard Worker mov t0_x, diff_x 413*f6dc9357SAndroid Build Coastguard Worker not t0_x 414*f6dc9357SAndroid Build Coastguard Worker mov [d + 4], t0_x 415*f6dc9357SAndroid Build Coastguard Worker add d, 8 416*f6dc9357SAndroid Build Coastguard Worker 417*f6dc9357SAndroid Build Coastguard Worker jmp next_node 418*f6dc9357SAndroid Build Coastguard Worker 419*f6dc9357SAndroid Build Coastguard Worker 420*f6dc9357SAndroid Build Coastguard Worker 421*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_32 422*f6dc9357SAndroid Build Coastguard WorkerlenLimit_reach: 423*f6dc9357SAndroid Build Coastguard Worker 424*f6dc9357SAndroid Build Coastguard Worker mov delta_r, cur 425*f6dc9357SAndroid Build Coastguard Worker sub delta_r, diff 426*f6dc9357SAndroid Build Coastguard Worker lea delta1_r, [delta_r - 1] 427*f6dc9357SAndroid Build Coastguard Worker 428*f6dc9357SAndroid Build Coastguard Worker mov t0_x, [cp_r] 429*f6dc9357SAndroid Build Coastguard Worker mov [ptr1], t0_x 430*f6dc9357SAndroid Build Coastguard Worker mov t0_x, [cp_r + 4] 431*f6dc9357SAndroid Build Coastguard Worker mov [ptr0], t0_x 432*f6dc9357SAndroid Build Coastguard Worker 433*f6dc9357SAndroid Build Coastguard Worker mov [d], lenLimit_x 434*f6dc9357SAndroid Build Coastguard Worker mov [d + 4], delta1_x 435*f6dc9357SAndroid Build Coastguard Worker add d, 8 436*f6dc9357SAndroid Build Coastguard Worker 437*f6dc9357SAndroid Build Coastguard Worker ; _distances[-1] = (UInt32)(d - _distances); 438*f6dc9357SAndroid Build Coastguard Worker mov t0, distances 439*f6dc9357SAndroid Build Coastguard Worker mov t1, d 440*f6dc9357SAndroid Build Coastguard Worker sub t1, t0 441*f6dc9357SAndroid Build Coastguard Worker shr t1_x, 2 442*f6dc9357SAndroid Build Coastguard Worker mov [t0 - 4], t1_x 443*f6dc9357SAndroid Build Coastguard Worker 444*f6dc9357SAndroid Build Coastguard Worker mov hash, hash_VAR 445*f6dc9357SAndroid Build Coastguard Worker mov hash_lim, size_VAR 446*f6dc9357SAndroid Build Coastguard Worker 447*f6dc9357SAndroid Build Coastguard Worker inc pos 448*f6dc9357SAndroid Build Coastguard Worker mov cp_x, cycPos_VAR 449*f6dc9357SAndroid Build Coastguard Worker inc cp_x 450*f6dc9357SAndroid Build Coastguard Worker 451*f6dc9357SAndroid Build Coastguard Worker mov d_lim, limit_VAR 452*f6dc9357SAndroid Build Coastguard Worker mov cycSize, cycSize_VAR 453*f6dc9357SAndroid Build Coastguard Worker ; if (hash == size || *hash != delta || lenLimit[diff] != lenLimit[0] || d >= limit) 454*f6dc9357SAndroid Build Coastguard Worker ; break; 455*f6dc9357SAndroid Build Coastguard Worker cmp hash, hash_lim 456*f6dc9357SAndroid Build Coastguard Worker je fin 457*f6dc9357SAndroid Build Coastguard Worker cmp d, d_lim 458*f6dc9357SAndroid Build Coastguard Worker jae fin 459*f6dc9357SAndroid Build Coastguard Worker cmp delta_x, [hash] 460*f6dc9357SAndroid Build Coastguard Worker jne main_loop 461*f6dc9357SAndroid Build Coastguard Worker movzx t0_x, BYTE PTR [diff] 462*f6dc9357SAndroid Build Coastguard Worker cmp [cur], t0_L 463*f6dc9357SAndroid Build Coastguard Worker jne main_loop 464*f6dc9357SAndroid Build Coastguard Worker 465*f6dc9357SAndroid Build Coastguard Worker ; jmp main_loop ; bypass for debug 466*f6dc9357SAndroid Build Coastguard Worker 467*f6dc9357SAndroid Build Coastguard Worker mov cycPos_VAR, cp_x 468*f6dc9357SAndroid Build Coastguard Worker shl len, 3 ; cycSize * 8 469*f6dc9357SAndroid Build Coastguard Worker sub diff, cur ; restore diff 470*f6dc9357SAndroid Build Coastguard Worker xor t0_x, t0_x 471*f6dc9357SAndroid Build Coastguard Worker cmp cp_x, delta_x ; cmp (cycPos_VAR, delta) 472*f6dc9357SAndroid Build Coastguard Worker lea cp_r, [son + 8 * cp_r] ; dest 473*f6dc9357SAndroid Build Coastguard Worker lea src, [cp_r + 8 * diff] 474*f6dc9357SAndroid Build Coastguard Worker cmovb t0, len ; t0 = (cycPos_VAR < delta ? cycSize * 8 : 0) 475*f6dc9357SAndroid Build Coastguard Worker add src, t0 476*f6dc9357SAndroid Build Coastguard Worker add len, son ; len = son + cycSize * 8 477*f6dc9357SAndroid Build Coastguard Worker 478*f6dc9357SAndroid Build Coastguard Worker 479*f6dc9357SAndroid Build Coastguard WorkerMY_ALIGN_32 480*f6dc9357SAndroid Build Coastguard Workerlong_loop: 481*f6dc9357SAndroid Build Coastguard Worker add hash, 4 482*f6dc9357SAndroid Build Coastguard Worker 483*f6dc9357SAndroid Build Coastguard Worker ; *(UInt64 *)(void *)ptr = ((const UInt64 *)(const void *)ptr)[diff]; 484*f6dc9357SAndroid Build Coastguard Worker 485*f6dc9357SAndroid Build Coastguard Worker mov t0, [src] 486*f6dc9357SAndroid Build Coastguard Worker add src, 8 487*f6dc9357SAndroid Build Coastguard Worker mov [cp_r], t0 488*f6dc9357SAndroid Build Coastguard Worker add cp_r, 8 489*f6dc9357SAndroid Build Coastguard Worker cmp src, len 490*f6dc9357SAndroid Build Coastguard Worker cmove src, son ; if end of (son) buffer is reached, we wrap to begin 491*f6dc9357SAndroid Build Coastguard Worker 492*f6dc9357SAndroid Build Coastguard Worker mov DWORD PTR [d], 2 493*f6dc9357SAndroid Build Coastguard Worker mov [d + 4], lenLimit_x 494*f6dc9357SAndroid Build Coastguard Worker mov [d + 8], delta1_x 495*f6dc9357SAndroid Build Coastguard Worker add d, 12 496*f6dc9357SAndroid Build Coastguard Worker 497*f6dc9357SAndroid Build Coastguard Worker inc cur 498*f6dc9357SAndroid Build Coastguard Worker 499*f6dc9357SAndroid Build Coastguard Worker cmp hash, hash_lim 500*f6dc9357SAndroid Build Coastguard Worker je long_footer 501*f6dc9357SAndroid Build Coastguard Worker cmp delta_x, [hash] 502*f6dc9357SAndroid Build Coastguard Worker jne long_footer 503*f6dc9357SAndroid Build Coastguard Worker movzx t0_x, BYTE PTR [diff + 1 * cur] 504*f6dc9357SAndroid Build Coastguard Worker cmp [cur], t0_L 505*f6dc9357SAndroid Build Coastguard Worker jne long_footer 506*f6dc9357SAndroid Build Coastguard Worker cmp d, d_lim 507*f6dc9357SAndroid Build Coastguard Worker jb long_loop 508*f6dc9357SAndroid Build Coastguard Worker 509*f6dc9357SAndroid Build Coastguard Workerlong_footer: 510*f6dc9357SAndroid Build Coastguard Worker sub cp_r, son 511*f6dc9357SAndroid Build Coastguard Worker shr cp_r, 3 512*f6dc9357SAndroid Build Coastguard Worker add pos, cp_x 513*f6dc9357SAndroid Build Coastguard Worker sub pos, cycPos_VAR 514*f6dc9357SAndroid Build Coastguard Worker mov cycSize, cycSize_VAR 515*f6dc9357SAndroid Build Coastguard Worker 516*f6dc9357SAndroid Build Coastguard Worker cmp d, d_lim 517*f6dc9357SAndroid Build Coastguard Worker jae fin 518*f6dc9357SAndroid Build Coastguard Worker cmp hash, hash_lim 519*f6dc9357SAndroid Build Coastguard Worker jne main_loop 520*f6dc9357SAndroid Build Coastguard Worker jmp fin 521*f6dc9357SAndroid Build Coastguard Worker 522*f6dc9357SAndroid Build Coastguard Worker 523*f6dc9357SAndroid Build Coastguard Worker 524*f6dc9357SAndroid Build Coastguard Workerfin_error: 525*f6dc9357SAndroid Build Coastguard Worker xor d, d 526*f6dc9357SAndroid Build Coastguard Worker 527*f6dc9357SAndroid Build Coastguard Workerfin: 528*f6dc9357SAndroid Build Coastguard Worker mov RSP, Old_RSP 529*f6dc9357SAndroid Build Coastguard Worker mov t0, [r4 + posRes_OFFS] 530*f6dc9357SAndroid Build Coastguard Worker mov [t0], pos 531*f6dc9357SAndroid Build Coastguard Worker mov r0, d 532*f6dc9357SAndroid Build Coastguard Worker 533*f6dc9357SAndroid Build Coastguard WorkerMY_POP_PRESERVED_ABI_REGS 534*f6dc9357SAndroid Build Coastguard WorkerMY_ENDP 535*f6dc9357SAndroid Build Coastguard Worker 536*f6dc9357SAndroid Build Coastguard Workerifdef Z7_LZ_FIND_OPT_ASM_USE_SEGMENT 537*f6dc9357SAndroid Build Coastguard Worker_TEXT$LZFINDOPT ENDS 538*f6dc9357SAndroid Build Coastguard Workerendif 539*f6dc9357SAndroid Build Coastguard Worker 540*f6dc9357SAndroid Build Coastguard Workerend 541