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