19e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;uInt longest_match_x64(
29e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;    deflate_state *s,
39e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;    IPos cur_match);                             /* current match */
49e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes; gvmat64.asm -- Asm portion of the optimized longest_match for 32 bits x86_64
6381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;  (AMD64 on Athlon 64, Opteron, Phenom
7381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;     and Intel EM64T on Pentium 4 with EM64T, Pentium D, Core 2 Duo, Core I5/I7)
8381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes; Copyright (C) 1995-2010 Jean-loup Gailly, Brian Raiter and Gilles Vollant.
99e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;
109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; File written by Gilles Vollant, by converting to assembly the longest_match
119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;  from Jean-loup Gailly in deflate.c of zLib and infoZip zip.
129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;
139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;  and by taking inspiration on asm686 with masm, optimised assembly code
149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;        from Brian Raiter, written 1998
159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;
16381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;  This software is provided 'as-is', without any express or implied
17381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;  warranty.  In no event will the authors be held liable for any damages
18381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;  arising from the use of this software.
19381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;
20381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;  Permission is granted to anyone to use this software for any purpose,
21381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;  including commercial applications, and to alter it and redistribute it
22381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;  freely, subject to the following restrictions:
23381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;
24381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;  1. The origin of this software must not be misrepresented; you must not
25381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;     claim that you wrote the original software. If you use this software
26381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;     in a product, an acknowledgment in the product documentation would be
27381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;     appreciated but is not required.
28381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;  2. Altered source versions must be plainly marked as such, and must not be
29381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;     misrepresented as being the original software
30381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;  3. This notice may not be removed or altered from any source distribution.
31381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;
32381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;
33381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;
349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;         http://www.zlib.net
359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;         http://www.winimage.com/zLibDll
369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;         http://www.muppetlabs.com/~breadbox/software/assembly.html
379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;
389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; to compile this file for infozip Zip, I use option:
399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;   ml64.exe /Flgvmat64 /c /Zi /DINFOZIP gvmat64.asm
409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;
419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; to compile this file for zLib, I use option:
429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;   ml64.exe /Flgvmat64 /c /Zi gvmat64.asm
439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; Be carrefull to adapt zlib1222add below to your version of zLib
449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;   (if you use a version of zLib before 1.0.4 or after 1.2.2.2, change
459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;    value of zlib1222add later)
469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;
479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; This file compile with Microsoft Macro Assembler (x64) for AMD64
489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;
49381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;   ml64.exe is given with Visual Studio 2005/2008/2010 and Windows WDK
509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;
51381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;   (you can get Windows WDK with ml64 for AMD64 from
52381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes;      http://www.microsoft.com/whdc/Devtools/wdk/default.mspx for low price)
539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;
549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;uInt longest_match(s, cur_match)
579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;    deflate_state *s;
589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;    IPos cur_match;                             /* current match */
599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project.code
609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlongest_match PROC
619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;LocalVarsSize   equ 88
649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project LocalVarsSize   equ 72
659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; register used : rax,rbx,rcx,rdx,rsi,rdi,r8,r9,r10,r11,r12
679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; free register :  r14,r15
689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; register can be saved : rsp
699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project chainlenwmask   equ  rsp + 8 - LocalVarsSize    ; high word: current chain len
719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                                                 ; low word: s->wmask
729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;window          equ  rsp + xx - LocalVarsSize   ; local copy of s->window ; stored in r10
739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;windowbestlen   equ  rsp + xx - LocalVarsSize   ; s->window + bestlen , use r10+r11
749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;scanstart       equ  rsp + xx - LocalVarsSize   ; first two bytes of string ; stored in r12w
759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;scanend         equ  rsp + xx - LocalVarsSize   ; last two bytes of string use ebx
769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;scanalign       equ  rsp + xx - LocalVarsSize   ; dword-misalignment of string r13
779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;bestlen         equ  rsp + xx - LocalVarsSize   ; size of best match so far -> r11d
789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;scan            equ  rsp + xx - LocalVarsSize   ; ptr to string wanting match -> r9
799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectIFDEF INFOZIP
809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectELSE
819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project nicematch       equ  (rsp + 16 - LocalVarsSize) ; a good enough match size
829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectENDIF
839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectsave_rdi        equ  rsp + 24 - LocalVarsSize
859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectsave_rsi        equ  rsp + 32 - LocalVarsSize
869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectsave_rbx        equ  rsp + 40 - LocalVarsSize
879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectsave_rbp        equ  rsp + 48 - LocalVarsSize
889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectsave_r12        equ  rsp + 56 - LocalVarsSize
899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectsave_r13        equ  rsp + 64 - LocalVarsSize
909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;save_r14        equ  rsp + 72 - LocalVarsSize
919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;save_r15        equ  rsp + 80 - LocalVarsSize
929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
94381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes; summary of register usage
95381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes; scanend     ebx
96381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes; scanendw    bx
97381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes; chainlenwmask   edx
98381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes; curmatch    rsi
99381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes; curmatchd   esi
100381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes; windowbestlen   r8
101381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes; scanalign   r9
102381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes; scanalignd  r9d
103381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes; window      r10
104381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes; bestlen     r11
105381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes; bestlend    r11d
106381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes; scanstart   r12d
107381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes; scanstartw  r12w
108381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes; scan        r13
109381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes; nicematch   r14d
110381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes; limit       r15
111381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes; limitd      r15d
112381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes; prev        rcx
1139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;  all the +4 offsets are due to the addition of pending_buf_size (in zlib
1159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;  in the deflate_state structure since the asm code was first written
1169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;  (if you compile with zlib 1.0.4 or older, remove the +4).
1179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;  Note : these value are good with a 8 bytes boundary pack structure
1189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    MAX_MATCH           equ     258
1219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    MIN_MATCH           equ     3
1229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    MIN_LOOKAHEAD       equ     (MAX_MATCH+MIN_MATCH+1)
1239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; Offsets for fields in the deflate_state structure. These numbers
1269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; are calculated from the definition of deflate_state, with the
1279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; assumption that the compiler will dword-align the fields. (Thus,
1289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; changing the definition of deflate_state could easily cause this
1299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; program to crash horribly, without so much as a warning at
1309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; compile time. Sigh.)
1319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;  all the +zlib1222add offsets are due to the addition of fields
1339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;  in zlib in the deflate_state structure since the asm code was first written
1349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;  (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)").
1359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;  (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0").
1369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;  if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8").
1379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectIFDEF INFOZIP
1409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project_DATA   SEGMENT
1429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectCOMM    window_size:DWORD
1439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; WMask ; 7fff
1449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectCOMM    window:BYTE:010040H
1459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectCOMM    prev:WORD:08000H
1469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; MatchLen : unused
1479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; PrevMatch : unused
1489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectCOMM    strstart:DWORD
1499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectCOMM    match_start:DWORD
1509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; Lookahead : ignore
1519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectCOMM    prev_length:DWORD ; PrevLen
1529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectCOMM    max_chain_length:DWORD
1539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectCOMM    good_match:DWORD
1549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectCOMM    nice_match:DWORD
1559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprev_ad equ OFFSET prev
1569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectwindow_ad equ OFFSET window
1579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectnicematch equ nice_match
1589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project_DATA ENDS
1599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectWMask equ 07fffh
1609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectELSE
1629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  IFNDEF zlib1222add
1649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    zlib1222add equ 8
1659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  ENDIF
1669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectdsWSize         equ 56+zlib1222add+(zlib1222add/2)
1679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectdsWMask         equ 64+zlib1222add+(zlib1222add/2)
1689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectdsWindow        equ 72+zlib1222add
1699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectdsPrev          equ 88+zlib1222add
1709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectdsMatchLen      equ 128+zlib1222add
1719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectdsPrevMatch     equ 132+zlib1222add
1729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectdsStrStart      equ 140+zlib1222add
1739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectdsMatchStart    equ 144+zlib1222add
1749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectdsLookahead     equ 148+zlib1222add
1759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectdsPrevLen       equ 152+zlib1222add
1769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectdsMaxChainLen   equ 156+zlib1222add
1779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectdsGoodMatch     equ 172+zlib1222add
1789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectdsNiceMatch     equ 176+zlib1222add
1799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectwindow_size     equ [ rcx + dsWSize]
1819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectWMask           equ [ rcx + dsWMask]
1829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectwindow_ad       equ [ rcx + dsWindow]
1839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprev_ad         equ [ rcx + dsPrev]
1849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectstrstart        equ [ rcx + dsStrStart]
1859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectmatch_start     equ [ rcx + dsMatchStart]
1869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectLookahead       equ [ rcx + dsLookahead] ; 0ffffffffh on infozip
1879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectprev_length     equ [ rcx + dsPrevLen]
1889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectmax_chain_length equ [ rcx + dsMaxChainLen]
1899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectgood_match      equ [ rcx + dsGoodMatch]
1909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectnice_match      equ [ rcx + dsNiceMatch]
1919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectENDIF
1929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; parameter 1 in r8(deflate state s), param 2 in rdx (cur match)
1949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and
1969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp
1979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;
1989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; All registers must be preserved across the call, except for
1999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;   rax, rcx, rdx, r8, r9, r10, and r11, which are scratch.
2009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; Save registers that the compiler may be using, and adjust esp to
2049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; make room for our stack frame.
2059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; Retrieve the function arguments. r8d will hold cur_match
2089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; throughout the entire function. edx will hold the pointer to the
2099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; deflate_state structure during the function's setup (before
2109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; entering the main loop.
2119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; parameter 1 in rcx (deflate_state* s), param 2 in edx -> r8 (cur match)
2139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; this clear high 32 bits of r8, which can be garbage in both r8 and rdx
2159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov [save_rdi],rdi
2179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov [save_rsi],rsi
2189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov [save_rbx],rbx
2199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov [save_rbp],rbp
2209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectIFDEF INFOZIP
2219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov r8d,ecx
2229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectELSE
2239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov r8d,edx
2249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectENDIF
2259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov [save_r12],r12
2269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov [save_r13],r13
2279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;        mov [save_r14],r14
2289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;        mov [save_r15],r15
2299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; uInt wmask = s->w_mask;
2329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; unsigned chain_length = s->max_chain_length;
2339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; if (s->prev_length >= s->good_match) {
2349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;;     chain_length >>= 2;
2359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; }
2369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov edi, prev_length
2389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov esi, good_match
2399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov eax, WMask
2409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov ebx, max_chain_length
2419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        cmp edi, esi
2429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jl  LastMatchGood
2439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        shr ebx, 2
2449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectLastMatchGood:
2459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; chainlen is decremented once beforehand so that the function can
2479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; use the sign flag instead of the zero flag for the exit test.
2489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; It is then shifted into the high word, to make room for the wmask
2499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; value, which it will always accompany.
2509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        dec ebx
2529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        shl ebx, 16
2539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        or  ebx, eax
2549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; on zlib only
2569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
2579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectIFDEF INFOZIP
2599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov [chainlenwmask], ebx
2609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; on infozip nice_match = [nice_match]
2619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectELSE
2629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov eax, nice_match
2639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov [chainlenwmask], ebx
2649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov r10d, Lookahead
2659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        cmp r10d, eax
2669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        cmovnl r10d, eax
2679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov [nicematch],r10d
2689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectENDIF
2699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; register Bytef *scan = s->window + s->strstart;
2719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov r10, window_ad
2729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov ebp, strstart
2739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        lea r13, [r10 + rbp]
2749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; Determine how many bytes the scan ptr is off from being
2769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; dword-aligned.
2779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         mov r9,r13
2799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         neg r13
2809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project         and r13,3
2819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
2839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;;     s->strstart - (IPos)MAX_DIST(s) : NIL;
2849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectIFDEF INFOZIP
2859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov eax,07efah ; MAX_DIST = (WSIZE-MIN_LOOKAHEAD) (0x8000-(3+8+1))
2869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectELSE
2879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov eax, window_size
2889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        sub eax, MIN_LOOKAHEAD
2899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectENDIF
2909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        xor edi,edi
2919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        sub ebp, eax
2929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov r11d, prev_length
2949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        cmovng ebp,edi
2969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; int best_len = s->prev_length;
2989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; Store the sum of s->window + best_len in esi locally, and in esi.
3019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project       lea  rsi,[r10+r11]
3039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; register ush scan_start = *(ushf*)scan;
3059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; register ush scan_end   = *(ushf*)(scan+best_len-1);
3069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; Posf *prev = s->prev;
3079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        movzx r12d,word ptr [r9]
3099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        movzx ebx, word ptr [r9 + r11 - 1]
3109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov rdi, prev_ad
3129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; Jump into the main loop.
3149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov edx, [chainlenwmask]
3169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        cmp bx,word ptr [rsi + r8 - 1]
3189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jz  LookupLoopIsZero
3199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectLookupLoop1:
3219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        and r8d, edx
3229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        movzx   r8d, word ptr [rdi + r8*2]
3249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        cmp r8d, ebp
3259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jbe LeaveNow
3269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        sub edx, 00010000h
3279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        js  LeaveNow
3289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectLoopEntry1:
3309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        cmp bx,word ptr [rsi + r8 - 1]
3319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jz  LookupLoopIsZero
3329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectLookupLoop2:
3349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        and r8d, edx
3359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        movzx   r8d, word ptr [rdi + r8*2]
3379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        cmp r8d, ebp
3389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jbe LeaveNow
3399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        sub edx, 00010000h
3409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        js  LeaveNow
3419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectLoopEntry2:
3439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        cmp bx,word ptr [rsi + r8 - 1]
3449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jz  LookupLoopIsZero
3459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectLookupLoop4:
3479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        and r8d, edx
3489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        movzx   r8d, word ptr [rdi + r8*2]
3509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        cmp r8d, ebp
3519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jbe LeaveNow
3529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        sub edx, 00010000h
3539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        js  LeaveNow
3549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectLoopEntry4:
3569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        cmp bx,word ptr [rsi + r8 - 1]
3589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jnz LookupLoop1
3599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jmp LookupLoopIsZero
3609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; do {
3639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;;     match = s->window + cur_match;
3649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;;     if (*(ushf*)(match+best_len-1) != scan_end ||
3659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;;         *(ushf*)match != scan_start) continue;
3669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;;     [...]
3679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; } while ((cur_match = prev[cur_match & wmask]) > limit
3689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;;          && --chain_length != 0);
3699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;;
3709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; Here is the inner loop of the function. The function will spend the
3719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; majority of its time in this loop, and majority of that time will
3729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; be spent in the first ten instructions.
3739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;;
3749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; Within this loop:
3759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; ebx = scanend
3769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; r8d = curmatch
3779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask)
3789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; esi = windowbestlen - i.e., (window + bestlen)
3799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; edi = prev
3809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; ebp = limit
3819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectLookupLoop:
3839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        and r8d, edx
3849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        movzx   r8d, word ptr [rdi + r8*2]
3869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        cmp r8d, ebp
3879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jbe LeaveNow
3889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        sub edx, 00010000h
3899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        js  LeaveNow
3909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectLoopEntry:
3929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        cmp bx,word ptr [rsi + r8 - 1]
3949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jnz LookupLoop1
3959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectLookupLoopIsZero:
3969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        cmp     r12w, word ptr [r10 + r8]
3979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jnz LookupLoop1
3989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; Store the current value of chainlen.
4019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov [chainlenwmask], edx
4029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; Point edi to the string under scrutiny, and esi to the string we
4049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; are hoping to match it up with. In actuality, esi and edi are
4059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is
4069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; initialized to -(MAX_MATCH_8 - scanalign).
4079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        lea rsi,[r8+r10]
4099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov rdx, 0fffffffffffffef8h; -(MAX_MATCH_8)
4109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        lea rsi, [rsi + r13 + 0108h] ;MAX_MATCH_8]
4119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        lea rdi, [r9 + r13 + 0108h] ;MAX_MATCH_8]
4129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        prefetcht1 [rsi+rdx]
4149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        prefetcht1 [rdi+rdx]
4159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; Test the strings for equality, 8 bytes at a time. At the end,
4189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; adjust rdx so that it is offset to the exact byte that mismatched.
4199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;;
4209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; We already know at this point that the first three bytes of the
4219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; strings match each other, and they can be safely passed over before
4229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; starting the compare loop. So what this code does is skip over 0-3
4239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; bytes, as much as necessary in order to dword-align the edi
4249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; pointer. (rsi will still be misaligned three times out of four.)
4259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;;
4269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; It should be confessed that this loop usually does not represent
4279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; much of the total running time. Replacing it with a more
4289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; straightforward "rep cmpsb" would not drastically degrade
4299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; performance.
4309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectLoopCmps:
4339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov rax, [rsi + rdx]
4349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        xor rax, [rdi + rdx]
4359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jnz LeaveLoopCmps
4369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov rax, [rsi + rdx + 8]
4389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        xor rax, [rdi + rdx + 8]
4399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jnz LeaveLoopCmps8
4409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov rax, [rsi + rdx + 8+8]
4439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        xor rax, [rdi + rdx + 8+8]
4449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jnz LeaveLoopCmps16
4459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        add rdx,8+8+8
4479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
448381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        jnz short LoopCmps
449381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        jmp short LenMaximum
4509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectLeaveLoopCmps16: add rdx,8
4519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectLeaveLoopCmps8: add rdx,8
4529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectLeaveLoopCmps:
4539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        test    eax, 0000FFFFh
4559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jnz LenLower
4569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        test eax,0ffffffffh
4589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jnz LenLower32
4609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        add rdx,4
4629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        shr rax,32
4639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        or ax,ax
4649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jnz LenLower
4659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectLenLower32:
4679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        shr eax,16
4689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        add rdx,2
4699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectLenLower:   sub al, 1
4709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        adc rdx, 0
4719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; Calculate the length of the match. If it is longer than MAX_MATCH,
4729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; then automatically accept it as the best possible match and leave.
4739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        lea rax, [rdi + rdx]
4759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        sub rax, r9
4769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        cmp eax, MAX_MATCH
4779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jge LenMaximum
4789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; If the length of the match is not longer than the best match we
4809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; have so far, then forget it and return to the lookup loop.
4819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;///////////////////////////////////
4829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        cmp eax, r11d
4849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jg  LongerMatch
4859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        lea rsi,[r10+r11]
4879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov rdi, prev_ad
4899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov edx, [chainlenwmask]
4909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jmp LookupLoop
4919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;;         s->match_start = cur_match;
4939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;;         best_len = len;
4949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;;         if (len >= nice_match) break;
4959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;;         scan_end = *(ushf*)(scan+best_len-1);
4969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
4979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectLongerMatch:
4989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov r11d, eax
4999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov match_start, r8d
5009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        cmp eax, [nicematch]
5019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jge LeaveNow
5029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        lea rsi,[r10+rax]
5049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        movzx   ebx, word ptr [r9 + rax - 1]
5069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov rdi, prev_ad
5079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov edx, [chainlenwmask]
5089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        jmp LookupLoop
5099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; Accept the current string, with the maximum possible length.
5119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectLenMaximum:
5139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov r11d,MAX_MATCH
5149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov match_start, r8d
5159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
5179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; return s->lookahead;
5189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectLeaveNow:
5209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectIFDEF INFOZIP
5219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov eax,r11d
5229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectELSE
5239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov eax, Lookahead
5249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        cmp r11d, eax
5259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        cmovng eax, r11d
5269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectENDIF
5279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;;; Restore the stack and return from whence we came.
5299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov rsi,[save_rsi]
5329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov rdi,[save_rdi]
5339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov rbx,[save_rbx]
5349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov rbp,[save_rbp]
5359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov r12,[save_r12]
5369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mov r13,[save_r13]
5379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;        mov r14,[save_r14]
5389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project;        mov r15,[save_r15]
5399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        ret 0
5429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; please don't remove this string !
5439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; Your can freely use gvmat64 in any free or commercial app
5449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project; but it is far better don't remove the string in the binary!
5459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    db     0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998, converted to amd 64 by Gilles Vollant 2005",0dh,0ah,0
5469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlongest_match   ENDP
5479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectmatch_init PROC
5499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project  ret 0
5509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectmatch_init ENDP
5519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
5539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectEND
554