xref: /aosp_15_r20/external/lzma/Asm/x86/LzFindOpt.asm (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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