0000: 3b 75 49 6e 74 20 6c 6f 6e 67 65 73 74 5f 6d 61 ;uInt longest_ma
0010: 74 63 68 5f 78 36 34 28 0d 0a 3b 20 20 20 20 64 tch_x64(..; d
0020: 65 66 6c 61 74 65 5f 73 74 61 74 65 20 2a 73 2c eflate_state *s,
0030: 0d 0a 3b 20 20 20 20 49 50 6f 73 20 63 75 72 5f ..; IPos cur_
0040: 6d 61 74 63 68 29 3b 20 20 20 20 20 20 20 20 20 match);
0050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0060: 20 20 20 20 2f 2a 20 63 75 72 72 65 6e 74 20 6d /* current m
0070: 61 74 63 68 20 2a 2f 0d 0a 0d 0a 3b 20 67 76 6d atch */....; gvm
0080: 61 74 36 34 2e 61 73 6d 20 2d 2d 20 41 73 6d 20 at64.asm -- Asm
0090: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f portion of the o
00a0: 70 74 69 6d 69 7a 65 64 20 6c 6f 6e 67 65 73 74 ptimized longest
00b0: 5f 6d 61 74 63 68 20 66 6f 72 20 33 32 20 62 69 _match for 32 bi
00c0: 74 73 20 78 38 36 5f 36 34 0d 0a 3b 20 20 28 41 ts x86_64..; (A
00d0: 4d 44 36 34 20 6f 6e 20 41 74 68 6c 6f 6e 20 36 MD64 on Athlon 6
00e0: 34 2c 20 4f 70 74 65 72 6f 6e 2c 20 50 68 65 6e 4, Opteron, Phen
00f0: 6f 6d 0d 0a 3b 20 20 20 20 20 61 6e 64 20 49 6e om..; and In
0100: 74 65 6c 20 45 4d 36 34 54 20 6f 6e 20 50 65 6e tel EM64T on Pen
0110: 74 69 75 6d 20 34 20 77 69 74 68 20 45 4d 36 34 tium 4 with EM64
0120: 54 2c 20 50 65 6e 74 69 75 6d 20 44 2c 20 43 6f T, Pentium D, Co
0130: 72 65 20 32 20 44 75 6f 2c 20 43 6f 72 65 20 49 re 2 Duo, Core I
0140: 35 2f 49 37 29 0d 0a 3b 20 43 6f 70 79 72 69 67 5/I7)..; Copyrig
0150: 68 74 20 28 43 29 20 31 39 39 35 2d 32 30 31 30 ht (C) 1995-2010
0160: 20 4a 65 61 6e 2d 6c 6f 75 70 20 47 61 69 6c 6c Jean-loup Gaill
0170: 79 2c 20 42 72 69 61 6e 20 52 61 69 74 65 72 20 y, Brian Raiter
0180: 61 6e 64 20 47 69 6c 6c 65 73 20 56 6f 6c 6c 61 and Gilles Volla
0190: 6e 74 2e 0d 0a 3b 0d 0a 3b 20 46 69 6c 65 20 77 nt...;..; File w
01a0: 72 69 74 74 65 6e 20 62 79 20 47 69 6c 6c 65 73 ritten by Gilles
01b0: 20 56 6f 6c 6c 61 6e 74 2c 20 62 79 20 63 6f 6e Vollant, by con
01c0: 76 65 72 74 69 6e 67 20 74 6f 20 61 73 73 65 6d verting to assem
01d0: 62 6c 79 20 74 68 65 20 6c 6f 6e 67 65 73 74 5f bly the longest_
01e0: 6d 61 74 63 68 0d 0a 3b 20 20 66 72 6f 6d 20 4a match..; from J
01f0: 65 61 6e 2d 6c 6f 75 70 20 47 61 69 6c 6c 79 20 ean-loup Gailly
0200: 69 6e 20 64 65 66 6c 61 74 65 2e 63 20 6f 66 20 in deflate.c of
0210: 7a 4c 69 62 20 61 6e 64 20 69 6e 66 6f 5a 69 70 zLib and infoZip
0220: 20 7a 69 70 2e 0d 0a 3b 0d 0a 3b 20 20 61 6e 64 zip...;..; and
0230: 20 62 79 20 74 61 6b 69 6e 67 20 69 6e 73 70 69 by taking inspi
0240: 72 61 74 69 6f 6e 20 6f 6e 20 61 73 6d 36 38 36 ration on asm686
0250: 20 77 69 74 68 20 6d 61 73 6d 2c 20 6f 70 74 69 with masm, opti
0260: 6d 69 73 65 64 20 61 73 73 65 6d 62 6c 79 20 63 mised assembly c
0270: 6f 64 65 0d 0a 3b 20 20 20 20 20 20 20 20 66 72 ode..; fr
0280: 6f 6d 20 42 72 69 61 6e 20 52 61 69 74 65 72 2c om Brian Raiter,
0290: 20 77 72 69 74 74 65 6e 20 31 39 39 38 0d 0a 3b written 1998..;
02a0: 0d 0a 3b 20 20 54 68 69 73 20 73 6f 66 74 77 61 ..; This softwa
02b0: 72 65 20 69 73 20 70 72 6f 76 69 64 65 64 20 27 re is provided '
02c0: 61 73 2d 69 73 27 2c 20 77 69 74 68 6f 75 74 20 as-is', without
02d0: 61 6e 79 20 65 78 70 72 65 73 73 20 6f 72 20 69 any express or i
02e0: 6d 70 6c 69 65 64 0d 0a 3b 20 20 77 61 72 72 61 mplied..; warra
02f0: 6e 74 79 2e 20 20 49 6e 20 6e 6f 20 65 76 65 6e nty. In no even
0300: 74 20 77 69 6c 6c 20 74 68 65 20 61 75 74 68 6f t will the autho
0310: 72 73 20 62 65 20 68 65 6c 64 20 6c 69 61 62 6c rs be held liabl
0320: 65 20 66 6f 72 20 61 6e 79 20 64 61 6d 61 67 65 e for any damage
0330: 73 0d 0a 3b 20 20 61 72 69 73 69 6e 67 20 66 72 s..; arising fr
0340: 6f 6d 20 74 68 65 20 75 73 65 20 6f 66 20 74 68 om the use of th
0350: 69 73 20 73 6f 66 74 77 61 72 65 2e 0d 0a 3b 0d is software...;.
0360: 0a 3b 20 20 50 65 72 6d 69 73 73 69 6f 6e 20 69 .; Permission i
0370: 73 20 67 72 61 6e 74 65 64 20 74 6f 20 61 6e 79 s granted to any
0380: 6f 6e 65 20 74 6f 20 75 73 65 20 74 68 69 73 20 one to use this
0390: 73 6f 66 74 77 61 72 65 20 66 6f 72 20 61 6e 79 software for any
03a0: 20 70 75 72 70 6f 73 65 2c 0d 0a 3b 20 20 69 6e purpose,..; in
03b0: 63 6c 75 64 69 6e 67 20 63 6f 6d 6d 65 72 63 69 cluding commerci
03c0: 61 6c 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 2c al applications,
03d0: 20 61 6e 64 20 74 6f 20 61 6c 74 65 72 20 69 74 and to alter it
03e0: 20 61 6e 64 20 72 65 64 69 73 74 72 69 62 75 74 and redistribut
03f0: 65 20 69 74 0d 0a 3b 20 20 66 72 65 65 6c 79 2c e it..; freely,
0400: 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 subject to the
0410: 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 73 74 72 69 following restri
0420: 63 74 69 6f 6e 73 3a 0d 0a 3b 0d 0a 3b 20 20 31 ctions:..;..; 1
0430: 2e 20 54 68 65 20 6f 72 69 67 69 6e 20 6f 66 20 . The origin of
0440: 74 68 69 73 20 73 6f 66 74 77 61 72 65 20 6d 75 this software mu
0450: 73 74 20 6e 6f 74 20 62 65 20 6d 69 73 72 65 70 st not be misrep
0460: 72 65 73 65 6e 74 65 64 3b 20 79 6f 75 20 6d 75 resented; you mu
0470: 73 74 20 6e 6f 74 0d 0a 3b 20 20 20 20 20 63 6c st not..; cl
0480: 61 69 6d 20 74 68 61 74 20 79 6f 75 20 77 72 6f aim that you wro
0490: 74 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 te the original
04a0: 73 6f 66 74 77 61 72 65 2e 20 49 66 20 79 6f 75 software. If you
04b0: 20 75 73 65 20 74 68 69 73 20 73 6f 66 74 77 61 use this softwa
04c0: 72 65 0d 0a 3b 20 20 20 20 20 69 6e 20 61 20 70 re..; in a p
04d0: 72 6f 64 75 63 74 2c 20 61 6e 20 61 63 6b 6e 6f roduct, an ackno
04e0: 77 6c 65 64 67 6d 65 6e 74 20 69 6e 20 74 68 65 wledgment in the
04f0: 20 70 72 6f 64 75 63 74 20 64 6f 63 75 6d 65 6e product documen
0500: 74 61 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 0d tation would be.
0510: 0a 3b 20 20 20 20 20 61 70 70 72 65 63 69 61 74 .; appreciat
0520: 65 64 20 62 75 74 20 69 73 20 6e 6f 74 20 72 65 ed but is not re
0530: 71 75 69 72 65 64 2e 0d 0a 3b 20 20 32 2e 20 41 quired...; 2. A
0540: 6c 74 65 72 65 64 20 73 6f 75 72 63 65 20 76 65 ltered source ve
0550: 72 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 70 rsions must be p
0560: 6c 61 69 6e 6c 79 20 6d 61 72 6b 65 64 20 61 73 lainly marked as
0570: 20 73 75 63 68 2c 20 61 6e 64 20 6d 75 73 74 20 such, and must
0580: 6e 6f 74 20 62 65 0d 0a 3b 20 20 20 20 20 6d 69 not be..; mi
0590: 73 72 65 70 72 65 73 65 6e 74 65 64 20 61 73 20 srepresented as
05a0: 62 65 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e being the origin
05b0: 61 6c 20 73 6f 66 74 77 61 72 65 0d 0a 3b 20 20 al software..;
05c0: 33 2e 20 54 68 69 73 20 6e 6f 74 69 63 65 20 6d 3. This notice m
05d0: 61 79 20 6e 6f 74 20 62 65 20 72 65 6d 6f 76 65 ay not be remove
05e0: 64 20 6f 72 20 61 6c 74 65 72 65 64 20 66 72 6f d or altered fro
05f0: 6d 20 61 6e 79 20 73 6f 75 72 63 65 20 64 69 73 m any source dis
0600: 74 72 69 62 75 74 69 6f 6e 2e 0d 0a 3b 0d 0a 3b tribution...;..;
0610: 0d 0a 3b 0d 0a 3b 20 20 20 20 20 20 20 20 20 68 ..;..; h
0620: 74 74 70 3a 2f 2f 77 77 77 2e 7a 6c 69 62 2e 6e ttp://www.zlib.n
0630: 65 74 0d 0a 3b 20 20 20 20 20 20 20 20 20 68 74 et..; ht
0640: 74 70 3a 2f 2f 77 77 77 2e 77 69 6e 69 6d 61 67 tp://www.winimag
0650: 65 2e 63 6f 6d 2f 7a 4c 69 62 44 6c 6c 0d 0a 3b e.com/zLibDll..;
0660: 20 20 20 20 20 20 20 20 20 68 74 74 70 3a 2f 2f http://
0670: 77 77 77 2e 6d 75 70 70 65 74 6c 61 62 73 2e 63 www.muppetlabs.c
0680: 6f 6d 2f 7e 62 72 65 61 64 62 6f 78 2f 73 6f 66 om/~breadbox/sof
0690: 74 77 61 72 65 2f 61 73 73 65 6d 62 6c 79 2e 68 tware/assembly.h
06a0: 74 6d 6c 0d 0a 3b 0d 0a 3b 20 74 6f 20 63 6f 6d tml..;..; to com
06b0: 70 69 6c 65 20 74 68 69 73 20 66 69 6c 65 20 66 pile this file f
06c0: 6f 72 20 69 6e 66 6f 7a 69 70 20 5a 69 70 2c 20 or infozip Zip,
06d0: 49 20 75 73 65 20 6f 70 74 69 6f 6e 3a 0d 0a 3b I use option:..;
06e0: 20 20 20 6d 6c 36 34 2e 65 78 65 20 2f 46 6c 67 ml64.exe /Flg
06f0: 76 6d 61 74 36 34 20 2f 63 20 2f 5a 69 20 2f 44 vmat64 /c /Zi /D
0700: 49 4e 46 4f 5a 49 50 20 67 76 6d 61 74 36 34 2e INFOZIP gvmat64.
0710: 61 73 6d 0d 0a 3b 0d 0a 3b 20 74 6f 20 63 6f 6d asm..;..; to com
0720: 70 69 6c 65 20 74 68 69 73 20 66 69 6c 65 20 66 pile this file f
0730: 6f 72 20 7a 4c 69 62 2c 20 49 20 75 73 65 20 6f or zLib, I use o
0740: 70 74 69 6f 6e 3a 0d 0a 3b 20 20 20 6d 6c 36 34 ption:..; ml64
0750: 2e 65 78 65 20 2f 46 6c 67 76 6d 61 74 36 34 20 .exe /Flgvmat64
0760: 2f 63 20 2f 5a 69 20 67 76 6d 61 74 36 34 2e 61 /c /Zi gvmat64.a
0770: 73 6d 0d 0a 3b 20 42 65 20 63 61 72 72 65 66 75 sm..; Be carrefu
0780: 6c 6c 20 74 6f 20 61 64 61 70 74 20 7a 6c 69 62 ll to adapt zlib
0790: 31 32 32 32 61 64 64 20 62 65 6c 6f 77 20 74 6f 1222add below to
07a0: 20 79 6f 75 72 20 76 65 72 73 69 6f 6e 20 6f 66 your version of
07b0: 20 7a 4c 69 62 0d 0a 3b 20 20 20 28 69 66 20 79 zLib..; (if y
07c0: 6f 75 20 75 73 65 20 61 20 76 65 72 73 69 6f 6e ou use a version
07d0: 20 6f 66 20 7a 4c 69 62 20 62 65 66 6f 72 65 20 of zLib before
07e0: 31 2e 30 2e 34 20 6f 72 20 61 66 74 65 72 20 31 1.0.4 or after 1
07f0: 2e 32 2e 32 2e 32 2c 20 63 68 61 6e 67 65 0d 0a .2.2.2, change..
0800: 3b 20 20 20 20 76 61 6c 75 65 20 6f 66 20 7a 6c ; value of zl
0810: 69 62 31 32 32 32 61 64 64 20 6c 61 74 65 72 29 ib1222add later)
0820: 0d 0a 3b 0d 0a 3b 20 54 68 69 73 20 66 69 6c 65 ..;..; This file
0830: 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 4d 69 compile with Mi
0840: 63 72 6f 73 6f 66 74 20 4d 61 63 72 6f 20 41 73 crosoft Macro As
0850: 73 65 6d 62 6c 65 72 20 28 78 36 34 29 20 66 6f sembler (x64) fo
0860: 72 20 41 4d 44 36 34 0d 0a 3b 0d 0a 3b 20 20 20 r AMD64..;..;
0870: 6d 6c 36 34 2e 65 78 65 20 69 73 20 67 69 76 65 ml64.exe is give
0880: 6e 20 77 69 74 68 20 56 69 73 75 61 6c 20 53 74 n with Visual St
0890: 75 64 69 6f 20 32 30 30 35 2f 32 30 30 38 2f 32 udio 2005/2008/2
08a0: 30 31 30 20 61 6e 64 20 57 69 6e 64 6f 77 73 20 010 and Windows
08b0: 57 44 4b 0d 0a 3b 0d 0a 3b 20 20 20 28 79 6f 75 WDK..;..; (you
08c0: 20 63 61 6e 20 67 65 74 20 57 69 6e 64 6f 77 73 can get Windows
08d0: 20 57 44 4b 20 77 69 74 68 20 6d 6c 36 34 20 66 WDK with ml64 f
08e0: 6f 72 20 41 4d 44 36 34 20 66 72 6f 6d 0d 0a 3b or AMD64 from..;
08f0: 20 20 20 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 http://www
0900: 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 77 .microsoft.com/w
0910: 68 64 63 2f 44 65 76 74 6f 6f 6c 73 2f 77 64 6b hdc/Devtools/wdk
0920: 2f 64 65 66 61 75 6c 74 2e 6d 73 70 78 20 66 6f /default.mspx fo
0930: 72 20 6c 6f 77 20 70 72 69 63 65 29 0d 0a 3b 0d r low price)..;.
0940: 0a 0d 0a 0d 0a 3b 75 49 6e 74 20 6c 6f 6e 67 65 .....;uInt longe
0950: 73 74 5f 6d 61 74 63 68 28 73 2c 20 63 75 72 5f st_match(s, cur_
0960: 6d 61 74 63 68 29 0d 0a 3b 20 20 20 20 64 65 66 match)..; def
0970: 6c 61 74 65 5f 73 74 61 74 65 20 2a 73 3b 0d 0a late_state *s;..
0980: 3b 20 20 20 20 49 50 6f 73 20 63 75 72 5f 6d 61 ; IPos cur_ma
0990: 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 tch;
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
09b0: 20 2f 2a 20 63 75 72 72 65 6e 74 20 6d 61 74 63 /* current matc
09c0: 68 20 2a 2f 0d 0a 2e 63 6f 64 65 0d 0a 6c 6f 6e h */...code..lon
09d0: 67 65 73 74 5f 6d 61 74 63 68 20 50 52 4f 43 0d gest_match PROC.
09e0: 0a 0d 0a 0d 0a 3b 4c 6f 63 61 6c 56 61 72 73 53 .....;LocalVarsS
09f0: 69 7a 65 20 20 20 65 71 75 20 38 38 0d 0a 20 4c ize equ 88.. L
0a00: 6f 63 61 6c 56 61 72 73 53 69 7a 65 20 20 20 65 ocalVarsSize e
0a10: 71 75 20 37 32 0d 0a 0d 0a 3b 20 72 65 67 69 73 qu 72....; regis
0a20: 74 65 72 20 75 73 65 64 20 3a 20 72 61 78 2c 72 ter used : rax,r
0a30: 62 78 2c 72 63 78 2c 72 64 78 2c 72 73 69 2c 72 bx,rcx,rdx,rsi,r
0a40: 64 69 2c 72 38 2c 72 39 2c 72 31 30 2c 72 31 31 di,r8,r9,r10,r11
0a50: 2c 72 31 32 0d 0a 3b 20 66 72 65 65 20 72 65 67 ,r12..; free reg
0a60: 69 73 74 65 72 20 3a 20 20 72 31 34 2c 72 31 35 ister : r14,r15
0a70: 0d 0a 3b 20 72 65 67 69 73 74 65 72 20 63 61 6e ..; register can
0a80: 20 62 65 20 73 61 76 65 64 20 3a 20 72 73 70 0d be saved : rsp.
0a90: 0a 0d 0a 20 63 68 61 69 6e 6c 65 6e 77 6d 61 73 ... chainlenwmas
0aa0: 6b 20 20 20 65 71 75 20 20 72 73 70 20 2b 20 38 k equ rsp + 8
0ab0: 20 2d 20 4c 6f 63 61 6c 56 61 72 73 53 69 7a 65 - LocalVarsSize
0ac0: 20 20 20 20 3b 20 68 69 67 68 20 77 6f 72 64 3a ; high word:
0ad0: 20 63 75 72 72 65 6e 74 20 63 68 61 69 6e 20 6c current chain l
0ae0: 65 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 en..
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0b10: 20 20 20 20 20 3b 20 6c 6f 77 20 77 6f 72 64 3a ; low word:
0b20: 20 73 2d 3e 77 6d 61 73 6b 0d 0a 3b 77 69 6e 64 s->wmask..;wind
0b30: 6f 77 20 20 20 20 20 20 20 20 20 20 65 71 75 20 ow equ
0b40: 20 72 73 70 20 2b 20 78 78 20 2d 20 4c 6f 63 61 rsp + xx - Loca
0b50: 6c 56 61 72 73 53 69 7a 65 20 20 20 3b 20 6c 6f lVarsSize ; lo
0b60: 63 61 6c 20 63 6f 70 79 20 6f 66 20 73 2d 3e 77 cal copy of s->w
0b70: 69 6e 64 6f 77 20 3b 20 73 74 6f 72 65 64 20 69 indow ; stored i
0b80: 6e 20 72 31 30 0d 0a 3b 77 69 6e 64 6f 77 62 65 n r10..;windowbe
0b90: 73 74 6c 65 6e 20 20 20 65 71 75 20 20 72 73 70 stlen equ rsp
0ba0: 20 2b 20 78 78 20 2d 20 4c 6f 63 61 6c 56 61 72 + xx - LocalVar
0bb0: 73 53 69 7a 65 20 20 20 3b 20 73 2d 3e 77 69 6e sSize ; s->win
0bc0: 64 6f 77 20 2b 20 62 65 73 74 6c 65 6e 20 2c 20 dow + bestlen ,
0bd0: 75 73 65 20 72 31 30 2b 72 31 31 0d 0a 3b 73 63 use r10+r11..;sc
0be0: 61 6e 73 74 61 72 74 20 20 20 20 20 20 20 65 71 anstart eq
0bf0: 75 20 20 72 73 70 20 2b 20 78 78 20 2d 20 4c 6f u rsp + xx - Lo
0c00: 63 61 6c 56 61 72 73 53 69 7a 65 20 20 20 3b 20 calVarsSize ;
0c10: 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 first two bytes
0c20: 6f 66 20 73 74 72 69 6e 67 20 3b 20 73 74 6f 72 of string ; stor
0c30: 65 64 20 69 6e 20 72 31 32 77 0d 0a 3b 73 63 61 ed in r12w..;sca
0c40: 6e 65 6e 64 20 20 20 20 20 20 20 20 20 65 71 75 nend equ
0c50: 20 20 72 73 70 20 2b 20 78 78 20 2d 20 4c 6f 63 rsp + xx - Loc
0c60: 61 6c 56 61 72 73 53 69 7a 65 20 20 20 3b 20 6c alVarsSize ; l
0c70: 61 73 74 20 74 77 6f 20 62 79 74 65 73 20 6f 66 ast two bytes of
0c80: 20 73 74 72 69 6e 67 20 75 73 65 20 65 62 78 0d string use ebx.
0c90: 0a 3b 73 63 61 6e 61 6c 69 67 6e 20 20 20 20 20 .;scanalign
0ca0: 20 20 65 71 75 20 20 72 73 70 20 2b 20 78 78 20 equ rsp + xx
0cb0: 2d 20 4c 6f 63 61 6c 56 61 72 73 53 69 7a 65 20 - LocalVarsSize
0cc0: 20 20 3b 20 64 77 6f 72 64 2d 6d 69 73 61 6c 69 ; dword-misali
0cd0: 67 6e 6d 65 6e 74 20 6f 66 20 73 74 72 69 6e 67 gnment of string
0ce0: 20 72 31 33 0d 0a 3b 62 65 73 74 6c 65 6e 20 20 r13..;bestlen
0cf0: 20 20 20 20 20 20 20 65 71 75 20 20 72 73 70 20 equ rsp
0d00: 2b 20 78 78 20 2d 20 4c 6f 63 61 6c 56 61 72 73 + xx - LocalVars
0d10: 53 69 7a 65 20 20 20 3b 20 73 69 7a 65 20 6f 66 Size ; size of
0d20: 20 62 65 73 74 20 6d 61 74 63 68 20 73 6f 20 66 best match so f
0d30: 61 72 20 2d 3e 20 72 31 31 64 0d 0a 3b 73 63 61 ar -> r11d..;sca
0d40: 6e 20 20 20 20 20 20 20 20 20 20 20 20 65 71 75 n equ
0d50: 20 20 72 73 70 20 2b 20 78 78 20 2d 20 4c 6f 63 rsp + xx - Loc
0d60: 61 6c 56 61 72 73 53 69 7a 65 20 20 20 3b 20 70 alVarsSize ; p
0d70: 74 72 20 74 6f 20 73 74 72 69 6e 67 20 77 61 6e tr to string wan
0d80: 74 69 6e 67 20 6d 61 74 63 68 20 2d 3e 20 72 39 ting match -> r9
0d90: 0d 0a 49 46 44 45 46 20 49 4e 46 4f 5a 49 50 0d ..IFDEF INFOZIP.
0da0: 0a 45 4c 53 45 0d 0a 20 6e 69 63 65 6d 61 74 63 .ELSE.. nicematc
0db0: 68 20 20 20 20 20 20 20 65 71 75 20 20 28 72 73 h equ (rs
0dc0: 70 20 2b 20 31 36 20 2d 20 4c 6f 63 61 6c 56 61 p + 16 - LocalVa
0dd0: 72 73 53 69 7a 65 29 20 3b 20 61 20 67 6f 6f 64 rsSize) ; a good
0de0: 20 65 6e 6f 75 67 68 20 6d 61 74 63 68 20 73 69 enough match si
0df0: 7a 65 0d 0a 45 4e 44 49 46 0d 0a 0d 0a 73 61 76 ze..ENDIF....sav
0e00: 65 5f 72 64 69 20 20 20 20 20 20 20 20 65 71 75 e_rdi equ
0e10: 20 20 72 73 70 20 2b 20 32 34 20 2d 20 4c 6f 63 rsp + 24 - Loc
0e20: 61 6c 56 61 72 73 53 69 7a 65 0d 0a 73 61 76 65 alVarsSize..save
0e30: 5f 72 73 69 20 20 20 20 20 20 20 20 65 71 75 20 _rsi equ
0e40: 20 72 73 70 20 2b 20 33 32 20 2d 20 4c 6f 63 61 rsp + 32 - Loca
0e50: 6c 56 61 72 73 53 69 7a 65 0d 0a 73 61 76 65 5f lVarsSize..save_
0e60: 72 62 78 20 20 20 20 20 20 20 20 65 71 75 20 20 rbx equ
0e70: 72 73 70 20 2b 20 34 30 20 2d 20 4c 6f 63 61 6c rsp + 40 - Local
0e80: 56 61 72 73 53 69 7a 65 0d 0a 73 61 76 65 5f 72 VarsSize..save_r
0e90: 62 70 20 20 20 20 20 20 20 20 65 71 75 20 20 72 bp equ r
0ea0: 73 70 20 2b 20 34 38 20 2d 20 4c 6f 63 61 6c 56 sp + 48 - LocalV
0eb0: 61 72 73 53 69 7a 65 0d 0a 73 61 76 65 5f 72 31 arsSize..save_r1
0ec0: 32 20 20 20 20 20 20 20 20 65 71 75 20 20 72 73 2 equ rs
0ed0: 70 20 2b 20 35 36 20 2d 20 4c 6f 63 61 6c 56 61 p + 56 - LocalVa
0ee0: 72 73 53 69 7a 65 0d 0a 73 61 76 65 5f 72 31 33 rsSize..save_r13
0ef0: 20 20 20 20 20 20 20 20 65 71 75 20 20 72 73 70 equ rsp
0f00: 20 2b 20 36 34 20 2d 20 4c 6f 63 61 6c 56 61 72 + 64 - LocalVar
0f10: 73 53 69 7a 65 0d 0a 3b 73 61 76 65 5f 72 31 34 sSize..;save_r14
0f20: 20 20 20 20 20 20 20 20 65 71 75 20 20 72 73 70 equ rsp
0f30: 20 2b 20 37 32 20 2d 20 4c 6f 63 61 6c 56 61 72 + 72 - LocalVar
0f40: 73 53 69 7a 65 0d 0a 3b 73 61 76 65 5f 72 31 35 sSize..;save_r15
0f50: 20 20 20 20 20 20 20 20 65 71 75 20 20 72 73 70 equ rsp
0f60: 20 2b 20 38 30 20 2d 20 4c 6f 63 61 6c 56 61 72 + 80 - LocalVar
0f70: 73 53 69 7a 65 0d 0a 0d 0a 0d 0a 3b 20 73 75 6d sSize......; sum
0f80: 6d 61 72 79 20 6f 66 20 72 65 67 69 73 74 65 72 mary of register
0f90: 20 75 73 61 67 65 0d 0a 3b 20 73 63 61 6e 65 6e usage..; scanen
0fa0: 64 20 20 20 20 20 65 62 78 0d 0a 3b 20 73 63 61 d ebx..; sca
0fb0: 6e 65 6e 64 77 20 20 20 20 62 78 0d 0a 3b 20 63 nendw bx..; c
0fc0: 68 61 69 6e 6c 65 6e 77 6d 61 73 6b 20 20 20 65 hainlenwmask e
0fd0: 64 78 0d 0a 3b 20 63 75 72 6d 61 74 63 68 20 20 dx..; curmatch
0fe0: 20 20 72 73 69 0d 0a 3b 20 63 75 72 6d 61 74 63 rsi..; curmatc
0ff0: 68 64 20 20 20 65 73 69 0d 0a 3b 20 77 69 6e 64 hd esi..; wind
1000: 6f 77 62 65 73 74 6c 65 6e 20 20 20 72 38 0d 0a owbestlen r8..
1010: 3b 20 73 63 61 6e 61 6c 69 67 6e 20 20 20 72 39 ; scanalign r9
1020: 0d 0a 3b 20 73 63 61 6e 61 6c 69 67 6e 64 20 20 ..; scanalignd
1030: 72 39 64 0d 0a 3b 20 77 69 6e 64 6f 77 20 20 20 r9d..; window
1040: 20 20 20 72 31 30 0d 0a 3b 20 62 65 73 74 6c 65 r10..; bestle
1050: 6e 20 20 20 20 20 72 31 31 0d 0a 3b 20 62 65 73 n r11..; bes
1060: 74 6c 65 6e 64 20 20 20 20 72 31 31 64 0d 0a 3b tlend r11d..;
1070: 20 73 63 61 6e 73 74 61 72 74 20 20 20 72 31 32 scanstart r12
1080: 64 0d 0a 3b 20 73 63 61 6e 73 74 61 72 74 77 20 d..; scanstartw
1090: 20 72 31 32 77 0d 0a 3b 20 73 63 61 6e 20 20 20 r12w..; scan
10a0: 20 20 20 20 20 72 31 33 0d 0a 3b 20 6e 69 63 65 r13..; nice
10b0: 6d 61 74 63 68 20 20 20 72 31 34 64 0d 0a 3b 20 match r14d..;
10c0: 6c 69 6d 69 74 20 20 20 20 20 20 20 72 31 35 0d limit r15.
10d0: 0a 3b 20 6c 69 6d 69 74 64 20 20 20 20 20 20 72 .; limitd r
10e0: 31 35 64 0d 0a 3b 20 70 72 65 76 20 20 20 20 20 15d..; prev
10f0: 20 20 20 72 63 78 0d 0a 0d 0a 3b 20 20 61 6c 6c rcx....; all
1100: 20 74 68 65 20 2b 34 20 6f 66 66 73 65 74 73 20 the +4 offsets
1110: 61 72 65 20 64 75 65 20 74 6f 20 74 68 65 20 61 are due to the a
1120: 64 64 69 74 69 6f 6e 20 6f 66 20 70 65 6e 64 69 ddition of pendi
1130: 6e 67 5f 62 75 66 5f 73 69 7a 65 20 28 69 6e 20 ng_buf_size (in
1140: 7a 6c 69 62 0d 0a 3b 20 20 69 6e 20 74 68 65 20 zlib..; in the
1150: 64 65 66 6c 61 74 65 5f 73 74 61 74 65 20 73 74 deflate_state st
1160: 72 75 63 74 75 72 65 20 73 69 6e 63 65 20 74 68 ructure since th
1170: 65 20 61 73 6d 20 63 6f 64 65 20 77 61 73 20 66 e asm code was f
1180: 69 72 73 74 20 77 72 69 74 74 65 6e 0d 0a 3b 20 irst written..;
1190: 20 28 69 66 20 79 6f 75 20 63 6f 6d 70 69 6c 65 (if you compile
11a0: 20 77 69 74 68 20 7a 6c 69 62 20 31 2e 30 2e 34 with zlib 1.0.4
11b0: 20 6f 72 20 6f 6c 64 65 72 2c 20 72 65 6d 6f 76 or older, remov
11c0: 65 20 74 68 65 20 2b 34 29 2e 0d 0a 3b 20 20 4e e the +4)...; N
11d0: 6f 74 65 20 3a 20 74 68 65 73 65 20 76 61 6c 75 ote : these valu
11e0: 65 20 61 72 65 20 67 6f 6f 64 20 77 69 74 68 20 e are good with
11f0: 61 20 38 20 62 79 74 65 73 20 62 6f 75 6e 64 61 a 8 bytes bounda
1200: 72 79 20 70 61 63 6b 20 73 74 72 75 63 74 75 72 ry pack structur
1210: 65 0d 0a 0d 0a 0d 0a 20 20 20 20 4d 41 58 5f 4d e...... MAX_M
1220: 41 54 43 48 20 20 20 20 20 20 20 20 20 20 20 65 ATCH e
1230: 71 75 20 20 20 20 20 32 35 38 0d 0a 20 20 20 20 qu 258..
1240: 4d 49 4e 5f 4d 41 54 43 48 20 20 20 20 20 20 20 MIN_MATCH
1250: 20 20 20 20 65 71 75 20 20 20 20 20 33 0d 0a 20 equ 3..
1260: 20 20 20 4d 49 4e 5f 4c 4f 4f 4b 41 48 45 41 44 MIN_LOOKAHEAD
1270: 20 20 20 20 20 20 20 65 71 75 20 20 20 20 20 28 equ (
1280: 4d 41 58 5f 4d 41 54 43 48 2b 4d 49 4e 5f 4d 41 MAX_MATCH+MIN_MA
1290: 54 43 48 2b 31 29 0d 0a 0d 0a 0d 0a 3b 3b 3b 20 TCH+1)......;;;
12a0: 4f 66 66 73 65 74 73 20 66 6f 72 20 66 69 65 6c Offsets for fiel
12b0: 64 73 20 69 6e 20 74 68 65 20 64 65 66 6c 61 74 ds in the deflat
12c0: 65 5f 73 74 61 74 65 20 73 74 72 75 63 74 75 72 e_state structur
12d0: 65 2e 20 54 68 65 73 65 20 6e 75 6d 62 65 72 73 e. These numbers
12e0: 0d 0a 3b 3b 3b 20 61 72 65 20 63 61 6c 63 75 6c ..;;; are calcul
12f0: 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 65 ated from the de
1300: 66 69 6e 69 74 69 6f 6e 20 6f 66 20 64 65 66 6c finition of defl
1310: 61 74 65 5f 73 74 61 74 65 2c 20 77 69 74 68 20 ate_state, with
1320: 74 68 65 0d 0a 3b 3b 3b 20 61 73 73 75 6d 70 74 the..;;; assumpt
1330: 69 6f 6e 20 74 68 61 74 20 74 68 65 20 63 6f 6d ion that the com
1340: 70 69 6c 65 72 20 77 69 6c 6c 20 64 77 6f 72 64 piler will dword
1350: 2d 61 6c 69 67 6e 20 74 68 65 20 66 69 65 6c 64 -align the field
1360: 73 2e 20 28 54 68 75 73 2c 0d 0a 3b 3b 3b 20 63 s. (Thus,..;;; c
1370: 68 61 6e 67 69 6e 67 20 74 68 65 20 64 65 66 69 hanging the defi
1380: 6e 69 74 69 6f 6e 20 6f 66 20 64 65 66 6c 61 74 nition of deflat
1390: 65 5f 73 74 61 74 65 20 63 6f 75 6c 64 20 65 61 e_state could ea
13a0: 73 69 6c 79 20 63 61 75 73 65 20 74 68 69 73 0d sily cause this.
13b0: 0a 3b 3b 3b 20 70 72 6f 67 72 61 6d 20 74 6f 20 .;;; program to
13c0: 63 72 61 73 68 20 68 6f 72 72 69 62 6c 79 2c 20 crash horribly,
13d0: 77 69 74 68 6f 75 74 20 73 6f 20 6d 75 63 68 20 without so much
13e0: 61 73 20 61 20 77 61 72 6e 69 6e 67 20 61 74 0d as a warning at.
13f0: 0a 3b 3b 3b 20 63 6f 6d 70 69 6c 65 20 74 69 6d .;;; compile tim
1400: 65 2e 20 53 69 67 68 2e 29 0d 0a 0d 0a 3b 20 20 e. Sigh.)....;
1410: 61 6c 6c 20 74 68 65 20 2b 7a 6c 69 62 31 32 32 all the +zlib122
1420: 32 61 64 64 20 6f 66 66 73 65 74 73 20 61 72 65 2add offsets are
1430: 20 64 75 65 20 74 6f 20 74 68 65 20 61 64 64 69 due to the addi
1440: 74 69 6f 6e 20 6f 66 20 66 69 65 6c 64 73 0d 0a tion of fields..
1450: 3b 20 20 69 6e 20 7a 6c 69 62 20 69 6e 20 74 68 ; in zlib in th
1460: 65 20 64 65 66 6c 61 74 65 5f 73 74 61 74 65 20 e deflate_state
1470: 73 74 72 75 63 74 75 72 65 20 73 69 6e 63 65 20 structure since
1480: 74 68 65 20 61 73 6d 20 63 6f 64 65 20 77 61 73 the asm code was
1490: 20 66 69 72 73 74 20 77 72 69 74 74 65 6e 0d 0a first written..
14a0: 3b 20 20 28 69 66 20 79 6f 75 20 63 6f 6d 70 69 ; (if you compi
14b0: 6c 65 20 77 69 74 68 20 7a 6c 69 62 20 31 2e 30 le with zlib 1.0
14c0: 2e 34 20 6f 72 20 6f 6c 64 65 72 2c 20 75 73 65 .4 or older, use
14d0: 20 22 7a 6c 69 62 31 32 32 32 61 64 64 20 65 71 "zlib1222add eq
14e0: 75 20 28 2d 34 29 22 29 2e 0d 0a 3b 20 20 28 69 u (-4)")...; (i
14f0: 66 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 77 69 f you compile wi
1500: 74 68 20 7a 6c 69 62 20 62 65 74 77 65 65 6e 20 th zlib between
1510: 31 2e 30 2e 35 20 61 6e 64 20 31 2e 32 2e 32 2e 1.0.5 and 1.2.2.
1520: 31 2c 20 75 73 65 20 22 7a 6c 69 62 31 32 32 32 1, use "zlib1222
1530: 61 64 64 20 65 71 75 20 30 22 29 2e 0d 0a 3b 20 add equ 0")...;
1540: 20 69 66 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 if you compile
1550: 77 69 74 68 20 7a 6c 69 62 20 31 2e 32 2e 32 2e with zlib 1.2.2.
1560: 32 20 6f 72 20 6c 61 74 65 72 20 2c 20 75 73 65 2 or later , use
1570: 20 22 7a 6c 69 62 31 32 32 32 61 64 64 20 65 71 "zlib1222add eq
1580: 75 20 38 22 29 2e 0d 0a 0d 0a 0d 0a 49 46 44 45 u 8").......IFDE
1590: 46 20 49 4e 46 4f 5a 49 50 0d 0a 0d 0a 5f 44 41 F INFOZIP...._DA
15a0: 54 41 20 20 20 53 45 47 4d 45 4e 54 0d 0a 43 4f TA SEGMENT..CO
15b0: 4d 4d 20 20 20 20 77 69 6e 64 6f 77 5f 73 69 7a MM window_siz
15c0: 65 3a 44 57 4f 52 44 0d 0a 3b 20 57 4d 61 73 6b e:DWORD..; WMask
15d0: 20 3b 20 37 66 66 66 0d 0a 43 4f 4d 4d 20 20 20 ; 7fff..COMM
15e0: 20 77 69 6e 64 6f 77 3a 42 59 54 45 3a 30 31 30 window:BYTE:010
15f0: 30 34 30 48 0d 0a 43 4f 4d 4d 20 20 20 20 70 72 040H..COMM pr
1600: 65 76 3a 57 4f 52 44 3a 30 38 30 30 30 48 0d 0a ev:WORD:08000H..
1610: 3b 20 4d 61 74 63 68 4c 65 6e 20 3a 20 75 6e 75 ; MatchLen : unu
1620: 73 65 64 0d 0a 3b 20 50 72 65 76 4d 61 74 63 68 sed..; PrevMatch
1630: 20 3a 20 75 6e 75 73 65 64 0d 0a 43 4f 4d 4d 20 : unused..COMM
1640: 20 20 20 73 74 72 73 74 61 72 74 3a 44 57 4f 52 strstart:DWOR
1650: 44 0d 0a 43 4f 4d 4d 20 20 20 20 6d 61 74 63 68 D..COMM match
1660: 5f 73 74 61 72 74 3a 44 57 4f 52 44 0d 0a 3b 20 _start:DWORD..;
1670: 4c 6f 6f 6b 61 68 65 61 64 20 3a 20 69 67 6e 6f Lookahead : igno
1680: 72 65 0d 0a 43 4f 4d 4d 20 20 20 20 70 72 65 76 re..COMM prev
1690: 5f 6c 65 6e 67 74 68 3a 44 57 4f 52 44 20 3b 20 _length:DWORD ;
16a0: 50 72 65 76 4c 65 6e 0d 0a 43 4f 4d 4d 20 20 20 PrevLen..COMM
16b0: 20 6d 61 78 5f 63 68 61 69 6e 5f 6c 65 6e 67 74 max_chain_lengt
16c0: 68 3a 44 57 4f 52 44 0d 0a 43 4f 4d 4d 20 20 20 h:DWORD..COMM
16d0: 20 67 6f 6f 64 5f 6d 61 74 63 68 3a 44 57 4f 52 good_match:DWOR
16e0: 44 0d 0a 43 4f 4d 4d 20 20 20 20 6e 69 63 65 5f D..COMM nice_
16f0: 6d 61 74 63 68 3a 44 57 4f 52 44 0d 0a 70 72 65 match:DWORD..pre
1700: 76 5f 61 64 20 65 71 75 20 4f 46 46 53 45 54 20 v_ad equ OFFSET
1710: 70 72 65 76 0d 0a 77 69 6e 64 6f 77 5f 61 64 20 prev..window_ad
1720: 65 71 75 20 4f 46 46 53 45 54 20 77 69 6e 64 6f equ OFFSET windo
1730: 77 0d 0a 6e 69 63 65 6d 61 74 63 68 20 65 71 75 w..nicematch equ
1740: 20 6e 69 63 65 5f 6d 61 74 63 68 0d 0a 5f 44 41 nice_match.._DA
1750: 54 41 20 45 4e 44 53 0d 0a 57 4d 61 73 6b 20 65 TA ENDS..WMask e
1760: 71 75 20 30 37 66 66 66 68 0d 0a 0d 0a 45 4c 53 qu 07fffh....ELS
1770: 45 0d 0a 0d 0a 20 20 49 46 4e 44 45 46 20 7a 6c E.... IFNDEF zl
1780: 69 62 31 32 32 32 61 64 64 0d 0a 20 20 20 20 7a ib1222add.. z
1790: 6c 69 62 31 32 32 32 61 64 64 20 65 71 75 20 38 lib1222add equ 8
17a0: 0d 0a 20 20 45 4e 44 49 46 0d 0a 64 73 57 53 69 .. ENDIF..dsWSi
17b0: 7a 65 20 20 20 20 20 20 20 20 20 65 71 75 20 35 ze equ 5
17c0: 36 2b 7a 6c 69 62 31 32 32 32 61 64 64 2b 28 7a 6+zlib1222add+(z
17d0: 6c 69 62 31 32 32 32 61 64 64 2f 32 29 0d 0a 64 lib1222add/2)..d
17e0: 73 57 4d 61 73 6b 20 20 20 20 20 20 20 20 20 65 sWMask e
17f0: 71 75 20 36 34 2b 7a 6c 69 62 31 32 32 32 61 64 qu 64+zlib1222ad
1800: 64 2b 28 7a 6c 69 62 31 32 32 32 61 64 64 2f 32 d+(zlib1222add/2
1810: 29 0d 0a 64 73 57 69 6e 64 6f 77 20 20 20 20 20 )..dsWindow
1820: 20 20 20 65 71 75 20 37 32 2b 7a 6c 69 62 31 32 equ 72+zlib12
1830: 32 32 61 64 64 0d 0a 64 73 50 72 65 76 20 20 20 22add..dsPrev
1840: 20 20 20 20 20 20 20 65 71 75 20 38 38 2b 7a 6c equ 88+zl
1850: 69 62 31 32 32 32 61 64 64 0d 0a 64 73 4d 61 74 ib1222add..dsMat
1860: 63 68 4c 65 6e 20 20 20 20 20 20 65 71 75 20 31 chLen equ 1
1870: 32 38 2b 7a 6c 69 62 31 32 32 32 61 64 64 0d 0a 28+zlib1222add..
1880: 64 73 50 72 65 76 4d 61 74 63 68 20 20 20 20 20 dsPrevMatch
1890: 65 71 75 20 31 33 32 2b 7a 6c 69 62 31 32 32 32 equ 132+zlib1222
18a0: 61 64 64 0d 0a 64 73 53 74 72 53 74 61 72 74 20 add..dsStrStart
18b0: 20 20 20 20 20 65 71 75 20 31 34 30 2b 7a 6c 69 equ 140+zli
18c0: 62 31 32 32 32 61 64 64 0d 0a 64 73 4d 61 74 63 b1222add..dsMatc
18d0: 68 53 74 61 72 74 20 20 20 20 65 71 75 20 31 34 hStart equ 14
18e0: 34 2b 7a 6c 69 62 31 32 32 32 61 64 64 0d 0a 64 4+zlib1222add..d
18f0: 73 4c 6f 6f 6b 61 68 65 61 64 20 20 20 20 20 65 sLookahead e
1900: 71 75 20 31 34 38 2b 7a 6c 69 62 31 32 32 32 61 qu 148+zlib1222a
1910: 64 64 0d 0a 64 73 50 72 65 76 4c 65 6e 20 20 20 dd..dsPrevLen
1920: 20 20 20 20 65 71 75 20 31 35 32 2b 7a 6c 69 62 equ 152+zlib
1930: 31 32 32 32 61 64 64 0d 0a 64 73 4d 61 78 43 68 1222add..dsMaxCh
1940: 61 69 6e 4c 65 6e 20 20 20 65 71 75 20 31 35 36 ainLen equ 156
1950: 2b 7a 6c 69 62 31 32 32 32 61 64 64 0d 0a 64 73 +zlib1222add..ds
1960: 47 6f 6f 64 4d 61 74 63 68 20 20 20 20 20 65 71 GoodMatch eq
1970: 75 20 31 37 32 2b 7a 6c 69 62 31 32 32 32 61 64 u 172+zlib1222ad
1980: 64 0d 0a 64 73 4e 69 63 65 4d 61 74 63 68 20 20 d..dsNiceMatch
1990: 20 20 20 65 71 75 20 31 37 36 2b 7a 6c 69 62 31 equ 176+zlib1
19a0: 32 32 32 61 64 64 0d 0a 0d 0a 77 69 6e 64 6f 77 222add....window
19b0: 5f 73 69 7a 65 20 20 20 20 20 65 71 75 20 5b 20 _size equ [
19c0: 72 63 78 20 2b 20 64 73 57 53 69 7a 65 5d 0d 0a rcx + dsWSize]..
19d0: 57 4d 61 73 6b 20 20 20 20 20 20 20 20 20 20 20 WMask
19e0: 65 71 75 20 5b 20 72 63 78 20 2b 20 64 73 57 4d equ [ rcx + dsWM
19f0: 61 73 6b 5d 0d 0a 77 69 6e 64 6f 77 5f 61 64 20 ask]..window_ad
1a00: 20 20 20 20 20 20 65 71 75 20 5b 20 72 63 78 20 equ [ rcx
1a10: 2b 20 64 73 57 69 6e 64 6f 77 5d 0d 0a 70 72 65 + dsWindow]..pre
1a20: 76 5f 61 64 20 20 20 20 20 20 20 20 20 65 71 75 v_ad equ
1a30: 20 5b 20 72 63 78 20 2b 20 64 73 50 72 65 76 5d [ rcx + dsPrev]
1a40: 0d 0a 73 74 72 73 74 61 72 74 20 20 20 20 20 20 ..strstart
1a50: 20 20 65 71 75 20 5b 20 72 63 78 20 2b 20 64 73 equ [ rcx + ds
1a60: 53 74 72 53 74 61 72 74 5d 0d 0a 6d 61 74 63 68 StrStart]..match
1a70: 5f 73 74 61 72 74 20 20 20 20 20 65 71 75 20 5b _start equ [
1a80: 20 72 63 78 20 2b 20 64 73 4d 61 74 63 68 53 74 rcx + dsMatchSt
1a90: 61 72 74 5d 0d 0a 4c 6f 6f 6b 61 68 65 61 64 20 art]..Lookahead
1aa0: 20 20 20 20 20 20 65 71 75 20 5b 20 72 63 78 20 equ [ rcx
1ab0: 2b 20 64 73 4c 6f 6f 6b 61 68 65 61 64 5d 20 3b + dsLookahead] ;
1ac0: 20 30 66 66 66 66 66 66 66 66 68 20 6f 6e 20 69 0ffffffffh on i
1ad0: 6e 66 6f 7a 69 70 0d 0a 70 72 65 76 5f 6c 65 6e nfozip..prev_len
1ae0: 67 74 68 20 20 20 20 20 65 71 75 20 5b 20 72 63 gth equ [ rc
1af0: 78 20 2b 20 64 73 50 72 65 76 4c 65 6e 5d 0d 0a x + dsPrevLen]..
1b00: 6d 61 78 5f 63 68 61 69 6e 5f 6c 65 6e 67 74 68 max_chain_length
1b10: 20 65 71 75 20 5b 20 72 63 78 20 2b 20 64 73 4d equ [ rcx + dsM
1b20: 61 78 43 68 61 69 6e 4c 65 6e 5d 0d 0a 67 6f 6f axChainLen]..goo
1b30: 64 5f 6d 61 74 63 68 20 20 20 20 20 20 65 71 75 d_match equ
1b40: 20 5b 20 72 63 78 20 2b 20 64 73 47 6f 6f 64 4d [ rcx + dsGoodM
1b50: 61 74 63 68 5d 0d 0a 6e 69 63 65 5f 6d 61 74 63 atch]..nice_matc
1b60: 68 20 20 20 20 20 20 65 71 75 20 5b 20 72 63 78 h equ [ rcx
1b70: 20 2b 20 64 73 4e 69 63 65 4d 61 74 63 68 5d 0d + dsNiceMatch].
1b80: 0a 45 4e 44 49 46 0d 0a 0d 0a 3b 20 70 61 72 61 .ENDIF....; para
1b90: 6d 65 74 65 72 20 31 20 69 6e 20 72 38 28 64 65 meter 1 in r8(de
1ba0: 66 6c 61 74 65 20 73 74 61 74 65 20 73 29 2c 20 flate state s),
1bb0: 70 61 72 61 6d 20 32 20 69 6e 20 72 64 78 20 28 param 2 in rdx (
1bc0: 63 75 72 20 6d 61 74 63 68 29 0d 0a 0d 0a 3b 20 cur match)....;
1bd0: 73 65 65 20 68 74 74 70 3a 2f 2f 77 65 62 6c 6f see http://weblo
1be0: 67 73 2e 61 73 70 2e 6e 65 74 2f 6f 6c 64 6e 65 gs.asp.net/oldne
1bf0: 77 74 68 69 6e 67 2f 61 72 63 68 69 76 65 2f 32 wthing/archive/2
1c00: 30 30 34 2f 30 31 2f 31 34 2f 35 38 35 37 39 2e 004/01/14/58579.
1c10: 61 73 70 78 20 61 6e 64 0d 0a 3b 20 68 74 74 70 aspx and..; http
1c20: 3a 2f 2f 6d 73 64 6e 2e 6d 69 63 72 6f 73 6f 66 ://msdn.microsof
1c30: 74 2e 63 6f 6d 2f 6c 69 62 72 61 72 79 2f 65 6e t.com/library/en
1c40: 2d 75 73 2f 6b 6d 61 72 63 68 2f 68 68 2f 6b 6d -us/kmarch/hh/km
1c50: 61 72 63 68 2f 36 34 62 69 74 41 4d 44 5f 38 65 arch/64bitAMD_8e
1c60: 39 35 31 64 64 32 2d 65 65 37 37 2d 34 37 32 38 951dd2-ee77-4728
1c70: 2d 38 37 30 32 2d 35 35 63 65 34 62 35 64 64 32 -8702-55ce4b5dd2
1c80: 34 61 2e 78 6d 6c 2e 61 73 70 0d 0a 3b 0d 0a 3b 4a.xml.asp..;..;
1c90: 20 41 6c 6c 20 72 65 67 69 73 74 65 72 73 20 6d All registers m
1ca0: 75 73 74 20 62 65 20 70 72 65 73 65 72 76 65 64 ust be preserved
1cb0: 20 61 63 72 6f 73 73 20 74 68 65 20 63 61 6c 6c across the call
1cc0: 2c 20 65 78 63 65 70 74 20 66 6f 72 0d 0a 3b 20 , except for..;
1cd0: 20 20 72 61 78 2c 20 72 63 78 2c 20 72 64 78 2c rax, rcx, rdx,
1ce0: 20 72 38 2c 20 72 39 2c 20 72 31 30 2c 20 61 6e r8, r9, r10, an
1cf0: 64 20 72 31 31 2c 20 77 68 69 63 68 20 61 72 65 d r11, which are
1d00: 20 73 63 72 61 74 63 68 2e 0d 0a 0d 0a 0d 0a 0d scratch........
1d10: 0a 3b 3b 3b 20 53 61 76 65 20 72 65 67 69 73 74 .;;; Save regist
1d20: 65 72 73 20 74 68 61 74 20 74 68 65 20 63 6f 6d ers that the com
1d30: 70 69 6c 65 72 20 6d 61 79 20 62 65 20 75 73 69 piler may be usi
1d40: 6e 67 2c 20 61 6e 64 20 61 64 6a 75 73 74 20 65 ng, and adjust e
1d50: 73 70 20 74 6f 0d 0a 3b 3b 3b 20 6d 61 6b 65 20 sp to..;;; make
1d60: 72 6f 6f 6d 20 66 6f 72 20 6f 75 72 20 73 74 61 room for our sta
1d70: 63 6b 20 66 72 61 6d 65 2e 0d 0a 0d 0a 0d 0a 3b ck frame.......;
1d80: 3b 3b 20 52 65 74 72 69 65 76 65 20 74 68 65 20 ;; Retrieve the
1d90: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e function argumen
1da0: 74 73 2e 20 72 38 64 20 77 69 6c 6c 20 68 6f 6c ts. r8d will hol
1db0: 64 20 63 75 72 5f 6d 61 74 63 68 0d 0a 3b 3b 3b d cur_match..;;;
1dc0: 20 74 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 throughout the
1dd0: 65 6e 74 69 72 65 20 66 75 6e 63 74 69 6f 6e 2e entire function.
1de0: 20 65 64 78 20 77 69 6c 6c 20 68 6f 6c 64 20 74 edx will hold t
1df0: 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 he pointer to th
1e00: 65 0d 0a 3b 3b 3b 20 64 65 66 6c 61 74 65 5f 73 e..;;; deflate_s
1e10: 74 61 74 65 20 73 74 72 75 63 74 75 72 65 20 64 tate structure d
1e20: 75 72 69 6e 67 20 74 68 65 20 66 75 6e 63 74 69 uring the functi
1e30: 6f 6e 27 73 20 73 65 74 75 70 20 28 62 65 66 6f on's setup (befo
1e40: 72 65 0d 0a 3b 3b 3b 20 65 6e 74 65 72 69 6e 67 re..;;; entering
1e50: 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 2e 0d the main loop..
1e60: 0a 0d 0a 3b 20 70 61 72 61 6d 65 74 65 72 20 31 ...; parameter 1
1e70: 20 69 6e 20 72 63 78 20 28 64 65 66 6c 61 74 65 in rcx (deflate
1e80: 5f 73 74 61 74 65 2a 20 73 29 2c 20 70 61 72 61 _state* s), para
1e90: 6d 20 32 20 69 6e 20 65 64 78 20 2d 3e 20 72 38 m 2 in edx -> r8
1ea0: 20 28 63 75 72 20 6d 61 74 63 68 29 0d 0a 0d 0a (cur match)....
1eb0: 3b 20 74 68 69 73 20 63 6c 65 61 72 20 68 69 67 ; this clear hig
1ec0: 68 20 33 32 20 62 69 74 73 20 6f 66 20 72 38 2c h 32 bits of r8,
1ed0: 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 67 61 which can be ga
1ee0: 72 62 61 67 65 20 69 6e 20 62 6f 74 68 20 72 38 rbage in both r8
1ef0: 20 61 6e 64 20 72 64 78 0d 0a 0d 0a 20 20 20 20 and rdx....
1f00: 20 20 20 20 6d 6f 76 20 5b 73 61 76 65 5f 72 64 mov [save_rd
1f10: 69 5d 2c 72 64 69 0d 0a 20 20 20 20 20 20 20 20 i],rdi..
1f20: 6d 6f 76 20 5b 73 61 76 65 5f 72 73 69 5d 2c 72 mov [save_rsi],r
1f30: 73 69 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 si.. mov
1f40: 5b 73 61 76 65 5f 72 62 78 5d 2c 72 62 78 0d 0a [save_rbx],rbx..
1f50: 20 20 20 20 20 20 20 20 6d 6f 76 20 5b 73 61 76 mov [sav
1f60: 65 5f 72 62 70 5d 2c 72 62 70 0d 0a 49 46 44 45 e_rbp],rbp..IFDE
1f70: 46 20 49 4e 46 4f 5a 49 50 0d 0a 20 20 20 20 20 F INFOZIP..
1f80: 20 20 20 6d 6f 76 20 72 38 64 2c 65 63 78 0d 0a mov r8d,ecx..
1f90: 45 4c 53 45 0d 0a 20 20 20 20 20 20 20 20 6d 6f ELSE.. mo
1fa0: 76 20 72 38 64 2c 65 64 78 0d 0a 45 4e 44 49 46 v r8d,edx..ENDIF
1fb0: 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 5b 73 .. mov [s
1fc0: 61 76 65 5f 72 31 32 5d 2c 72 31 32 0d 0a 20 20 ave_r12],r12..
1fd0: 20 20 20 20 20 20 6d 6f 76 20 5b 73 61 76 65 5f mov [save_
1fe0: 72 31 33 5d 2c 72 31 33 0d 0a 3b 20 20 20 20 20 r13],r13..;
1ff0: 20 20 20 6d 6f 76 20 5b 73 61 76 65 5f 72 31 34 mov [save_r14
2000: 5d 2c 72 31 34 0d 0a 3b 20 20 20 20 20 20 20 20 ],r14..;
2010: 6d 6f 76 20 5b 73 61 76 65 5f 72 31 35 5d 2c 72 mov [save_r15],r
2020: 31 35 0d 0a 0d 0a 0d 0a 3b 3b 3b 20 75 49 6e 74 15......;;; uInt
2030: 20 77 6d 61 73 6b 20 3d 20 73 2d 3e 77 5f 6d 61 wmask = s->w_ma
2040: 73 6b 3b 0d 0a 3b 3b 3b 20 75 6e 73 69 67 6e 65 sk;..;;; unsigne
2050: 64 20 63 68 61 69 6e 5f 6c 65 6e 67 74 68 20 3d d chain_length =
2060: 20 73 2d 3e 6d 61 78 5f 63 68 61 69 6e 5f 6c 65 s->max_chain_le
2070: 6e 67 74 68 3b 0d 0a 3b 3b 3b 20 69 66 20 28 73 ngth;..;;; if (s
2080: 2d 3e 70 72 65 76 5f 6c 65 6e 67 74 68 20 3e 3d ->prev_length >=
2090: 20 73 2d 3e 67 6f 6f 64 5f 6d 61 74 63 68 29 20 s->good_match)
20a0: 7b 0d 0a 3b 3b 3b 20 20 20 20 20 63 68 61 69 6e {..;;; chain
20b0: 5f 6c 65 6e 67 74 68 20 3e 3e 3d 20 32 3b 0d 0a _length >>= 2;..
20c0: 3b 3b 3b 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 ;;; }....
20d0: 20 6d 6f 76 20 65 64 69 2c 20 70 72 65 76 5f 6c mov edi, prev_l
20e0: 65 6e 67 74 68 0d 0a 20 20 20 20 20 20 20 20 6d ength.. m
20f0: 6f 76 20 65 73 69 2c 20 67 6f 6f 64 5f 6d 61 74 ov esi, good_mat
2100: 63 68 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 ch.. mov
2110: 65 61 78 2c 20 57 4d 61 73 6b 0d 0a 20 20 20 20 eax, WMask..
2120: 20 20 20 20 6d 6f 76 20 65 62 78 2c 20 6d 61 78 mov ebx, max
2130: 5f 63 68 61 69 6e 5f 6c 65 6e 67 74 68 0d 0a 20 _chain_length..
2140: 20 20 20 20 20 20 20 63 6d 70 20 65 64 69 2c 20 cmp edi,
2150: 65 73 69 0d 0a 20 20 20 20 20 20 20 20 6a 6c 20 esi.. jl
2160: 20 4c 61 73 74 4d 61 74 63 68 47 6f 6f 64 0d 0a LastMatchGood..
2170: 20 20 20 20 20 20 20 20 73 68 72 20 65 62 78 2c shr ebx,
2180: 20 32 0d 0a 4c 61 73 74 4d 61 74 63 68 47 6f 6f 2..LastMatchGoo
2190: 64 3a 0d 0a 0d 0a 3b 3b 3b 20 63 68 61 69 6e 6c d:....;;; chainl
21a0: 65 6e 20 69 73 20 64 65 63 72 65 6d 65 6e 74 65 en is decremente
21b0: 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 68 61 6e d once beforehan
21c0: 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 d so that the fu
21d0: 6e 63 74 69 6f 6e 20 63 61 6e 0d 0a 3b 3b 3b 20 nction can..;;;
21e0: 75 73 65 20 74 68 65 20 73 69 67 6e 20 66 6c 61 use the sign fla
21f0: 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 g instead of the
2200: 20 7a 65 72 6f 20 66 6c 61 67 20 66 6f 72 20 74 zero flag for t
2210: 68 65 20 65 78 69 74 20 74 65 73 74 2e 0d 0a 3b he exit test...;
2220: 3b 3b 20 49 74 20 69 73 20 74 68 65 6e 20 73 68 ;; It is then sh
2230: 69 66 74 65 64 20 69 6e 74 6f 20 74 68 65 20 68 ifted into the h
2240: 69 67 68 20 77 6f 72 64 2c 20 74 6f 20 6d 61 6b igh word, to mak
2250: 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 77 e room for the w
2260: 6d 61 73 6b 0d 0a 3b 3b 3b 20 76 61 6c 75 65 2c mask..;;; value,
2270: 20 77 68 69 63 68 20 69 74 20 77 69 6c 6c 20 61 which it will a
2280: 6c 77 61 79 73 20 61 63 63 6f 6d 70 61 6e 79 2e lways accompany.
2290: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 64 65 63 20 .... dec
22a0: 65 62 78 0d 0a 20 20 20 20 20 20 20 20 73 68 6c ebx.. shl
22b0: 20 65 62 78 2c 20 31 36 0d 0a 20 20 20 20 20 20 ebx, 16..
22c0: 20 20 6f 72 20 20 65 62 78 2c 20 65 61 78 0d 0a or ebx, eax..
22d0: 0d 0a 3b 3b 3b 20 6f 6e 20 7a 6c 69 62 20 6f 6e ..;;; on zlib on
22e0: 6c 79 0d 0a 3b 3b 3b 20 69 66 20 28 28 75 49 6e ly..;;; if ((uIn
22f0: 74 29 6e 69 63 65 5f 6d 61 74 63 68 20 3e 20 73 t)nice_match > s
2300: 2d 3e 6c 6f 6f 6b 61 68 65 61 64 29 20 6e 69 63 ->lookahead) nic
2310: 65 5f 6d 61 74 63 68 20 3d 20 73 2d 3e 6c 6f 6f e_match = s->loo
2320: 6b 61 68 65 61 64 3b 0d 0a 0d 0a 49 46 44 45 46 kahead;....IFDEF
2330: 20 49 4e 46 4f 5a 49 50 0d 0a 20 20 20 20 20 20 INFOZIP..
2340: 20 20 6d 6f 76 20 5b 63 68 61 69 6e 6c 65 6e 77 mov [chainlenw
2350: 6d 61 73 6b 5d 2c 20 65 62 78 0d 0a 3b 20 6f 6e mask], ebx..; on
2360: 20 69 6e 66 6f 7a 69 70 20 6e 69 63 65 5f 6d 61 infozip nice_ma
2370: 74 63 68 20 3d 20 5b 6e 69 63 65 5f 6d 61 74 63 tch = [nice_matc
2380: 68 5d 0d 0a 45 4c 53 45 0d 0a 20 20 20 20 20 20 h]..ELSE..
2390: 20 20 6d 6f 76 20 65 61 78 2c 20 6e 69 63 65 5f mov eax, nice_
23a0: 6d 61 74 63 68 0d 0a 20 20 20 20 20 20 20 20 6d match.. m
23b0: 6f 76 20 5b 63 68 61 69 6e 6c 65 6e 77 6d 61 73 ov [chainlenwmas
23c0: 6b 5d 2c 20 65 62 78 0d 0a 20 20 20 20 20 20 20 k], ebx..
23d0: 20 6d 6f 76 20 72 31 30 64 2c 20 4c 6f 6f 6b 61 mov r10d, Looka
23e0: 68 65 61 64 0d 0a 20 20 20 20 20 20 20 20 63 6d head.. cm
23f0: 70 20 72 31 30 64 2c 20 65 61 78 0d 0a 20 20 20 p r10d, eax..
2400: 20 20 20 20 20 63 6d 6f 76 6e 6c 20 72 31 30 64 cmovnl r10d
2410: 2c 20 65 61 78 0d 0a 20 20 20 20 20 20 20 20 6d , eax.. m
2420: 6f 76 20 5b 6e 69 63 65 6d 61 74 63 68 5d 2c 72 ov [nicematch],r
2430: 31 30 64 0d 0a 45 4e 44 49 46 0d 0a 0d 0a 3b 3b 10d..ENDIF....;;
2440: 3b 20 72 65 67 69 73 74 65 72 20 42 79 74 65 66 ; register Bytef
2450: 20 2a 73 63 61 6e 20 3d 20 73 2d 3e 77 69 6e 64 *scan = s->wind
2460: 6f 77 20 2b 20 73 2d 3e 73 74 72 73 74 61 72 74 ow + s->strstart
2470: 3b 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 72 ;.. mov r
2480: 31 30 2c 20 77 69 6e 64 6f 77 5f 61 64 0d 0a 20 10, window_ad..
2490: 20 20 20 20 20 20 20 6d 6f 76 20 65 62 70 2c 20 mov ebp,
24a0: 73 74 72 73 74 61 72 74 0d 0a 20 20 20 20 20 20 strstart..
24b0: 20 20 6c 65 61 20 72 31 33 2c 20 5b 72 31 30 20 lea r13, [r10
24c0: 2b 20 72 62 70 5d 0d 0a 0d 0a 3b 3b 3b 20 44 65 + rbp]....;;; De
24d0: 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 termine how many
24e0: 20 62 79 74 65 73 20 74 68 65 20 73 63 61 6e 20 bytes the scan
24f0: 70 74 72 20 69 73 20 6f 66 66 20 66 72 6f 6d 20 ptr is off from
2500: 62 65 69 6e 67 0d 0a 3b 3b 3b 20 64 77 6f 72 64 being..;;; dword
2510: 2d 61 6c 69 67 6e 65 64 2e 0d 0a 0d 0a 20 20 20 -aligned.....
2520: 20 20 20 20 20 20 6d 6f 76 20 72 39 2c 72 31 33 mov r9,r13
2530: 0d 0a 20 20 20 20 20 20 20 20 20 6e 65 67 20 72 .. neg r
2540: 31 33 0d 0a 20 20 20 20 20 20 20 20 20 61 6e 64 13.. and
2550: 20 72 31 33 2c 33 0d 0a 0d 0a 3b 3b 3b 20 49 50 r13,3....;;; IP
2560: 6f 73 20 6c 69 6d 69 74 20 3d 20 73 2d 3e 73 74 os limit = s->st
2570: 72 73 74 61 72 74 20 3e 20 28 49 50 6f 73 29 4d rstart > (IPos)M
2580: 41 58 5f 44 49 53 54 28 73 29 20 3f 0d 0a 3b 3b AX_DIST(s) ?..;;
2590: 3b 20 20 20 20 20 73 2d 3e 73 74 72 73 74 61 72 ; s->strstar
25a0: 74 20 2d 20 28 49 50 6f 73 29 4d 41 58 5f 44 49 t - (IPos)MAX_DI
25b0: 53 54 28 73 29 20 3a 20 4e 49 4c 3b 0d 0a 49 46 ST(s) : NIL;..IF
25c0: 44 45 46 20 49 4e 46 4f 5a 49 50 0d 0a 20 20 20 DEF INFOZIP..
25d0: 20 20 20 20 20 6d 6f 76 20 65 61 78 2c 30 37 65 mov eax,07e
25e0: 66 61 68 20 3b 20 4d 41 58 5f 44 49 53 54 20 3d fah ; MAX_DIST =
25f0: 20 28 57 53 49 5a 45 2d 4d 49 4e 5f 4c 4f 4f 4b (WSIZE-MIN_LOOK
2600: 41 48 45 41 44 29 20 28 30 78 38 30 30 30 2d 28 AHEAD) (0x8000-(
2610: 33 2b 38 2b 31 29 29 0d 0a 45 4c 53 45 0d 0a 20 3+8+1))..ELSE..
2620: 20 20 20 20 20 20 20 6d 6f 76 20 65 61 78 2c 20 mov eax,
2630: 77 69 6e 64 6f 77 5f 73 69 7a 65 0d 0a 20 20 20 window_size..
2640: 20 20 20 20 20 73 75 62 20 65 61 78 2c 20 4d 49 sub eax, MI
2650: 4e 5f 4c 4f 4f 4b 41 48 45 41 44 0d 0a 45 4e 44 N_LOOKAHEAD..END
2660: 49 46 0d 0a 20 20 20 20 20 20 20 20 78 6f 72 20 IF.. xor
2670: 65 64 69 2c 65 64 69 0d 0a 20 20 20 20 20 20 20 edi,edi..
2680: 20 73 75 62 20 65 62 70 2c 20 65 61 78 0d 0a 0d sub ebp, eax...
2690: 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 72 31 31 . mov r11
26a0: 64 2c 20 70 72 65 76 5f 6c 65 6e 67 74 68 0d 0a d, prev_length..
26b0: 0d 0a 20 20 20 20 20 20 20 20 63 6d 6f 76 6e 67 .. cmovng
26c0: 20 65 62 70 2c 65 64 69 0d 0a 0d 0a 3b 3b 3b 20 ebp,edi....;;;
26d0: 69 6e 74 20 62 65 73 74 5f 6c 65 6e 20 3d 20 73 int best_len = s
26e0: 2d 3e 70 72 65 76 5f 6c 65 6e 67 74 68 3b 0d 0a ->prev_length;..
26f0: 0d 0a 0d 0a 3b 3b 3b 20 53 74 6f 72 65 20 74 68 ....;;; Store th
2700: 65 20 73 75 6d 20 6f 66 20 73 2d 3e 77 69 6e 64 e sum of s->wind
2710: 6f 77 20 2b 20 62 65 73 74 5f 6c 65 6e 20 69 6e ow + best_len in
2720: 20 65 73 69 20 6c 6f 63 61 6c 6c 79 2c 20 61 6e esi locally, an
2730: 64 20 69 6e 20 65 73 69 2e 0d 0a 0d 0a 20 20 20 d in esi.....
2740: 20 20 20 20 6c 65 61 20 20 72 73 69 2c 5b 72 31 lea rsi,[r1
2750: 30 2b 72 31 31 5d 0d 0a 0d 0a 3b 3b 3b 20 72 65 0+r11]....;;; re
2760: 67 69 73 74 65 72 20 75 73 68 20 73 63 61 6e 5f gister ush scan_
2770: 73 74 61 72 74 20 3d 20 2a 28 75 73 68 66 2a 29 start = *(ushf*)
2780: 73 63 61 6e 3b 0d 0a 3b 3b 3b 20 72 65 67 69 73 scan;..;;; regis
2790: 74 65 72 20 75 73 68 20 73 63 61 6e 5f 65 6e 64 ter ush scan_end
27a0: 20 20 20 3d 20 2a 28 75 73 68 66 2a 29 28 73 63 = *(ushf*)(sc
27b0: 61 6e 2b 62 65 73 74 5f 6c 65 6e 2d 31 29 3b 0d an+best_len-1);.
27c0: 0a 3b 3b 3b 20 50 6f 73 66 20 2a 70 72 65 76 20 .;;; Posf *prev
27d0: 3d 20 73 2d 3e 70 72 65 76 3b 0d 0a 0d 0a 20 20 = s->prev;....
27e0: 20 20 20 20 20 20 6d 6f 76 7a 78 20 72 31 32 64 movzx r12d
27f0: 2c 77 6f 72 64 20 70 74 72 20 5b 72 39 5d 0d 0a ,word ptr [r9]..
2800: 20 20 20 20 20 20 20 20 6d 6f 76 7a 78 20 65 62 movzx eb
2810: 78 2c 20 77 6f 72 64 20 70 74 72 20 5b 72 39 20 x, word ptr [r9
2820: 2b 20 72 31 31 20 2d 20 31 5d 0d 0a 0d 0a 20 20 + r11 - 1]....
2830: 20 20 20 20 20 20 6d 6f 76 20 72 64 69 2c 20 70 mov rdi, p
2840: 72 65 76 5f 61 64 0d 0a 0d 0a 3b 3b 3b 20 4a 75 rev_ad....;;; Ju
2850: 6d 70 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e mp into the main
2860: 20 6c 6f 6f 70 2e 0d 0a 0d 0a 20 20 20 20 20 20 loop.....
2870: 20 20 6d 6f 76 20 65 64 78 2c 20 5b 63 68 61 69 mov edx, [chai
2880: 6e 6c 65 6e 77 6d 61 73 6b 5d 0d 0a 0d 0a 20 20 nlenwmask]....
2890: 20 20 20 20 20 20 63 6d 70 20 62 78 2c 77 6f 72 cmp bx,wor
28a0: 64 20 70 74 72 20 5b 72 73 69 20 2b 20 72 38 20 d ptr [rsi + r8
28b0: 2d 20 31 5d 0d 0a 20 20 20 20 20 20 20 20 6a 7a - 1].. jz
28c0: 20 20 4c 6f 6f 6b 75 70 4c 6f 6f 70 49 73 5a 65 LookupLoopIsZe
28d0: 72 6f 0d 0a 0d 0a 4c 6f 6f 6b 75 70 4c 6f 6f 70 ro....LookupLoop
28e0: 31 3a 0d 0a 20 20 20 20 20 20 20 20 61 6e 64 20 1:.. and
28f0: 72 38 64 2c 20 65 64 78 0d 0a 0d 0a 20 20 20 20 r8d, edx....
2900: 20 20 20 20 6d 6f 76 7a 78 20 20 20 72 38 64 2c movzx r8d,
2910: 20 77 6f 72 64 20 70 74 72 20 5b 72 64 69 20 2b word ptr [rdi +
2920: 20 72 38 2a 32 5d 0d 0a 20 20 20 20 20 20 20 20 r8*2]..
2930: 63 6d 70 20 72 38 64 2c 20 65 62 70 0d 0a 20 20 cmp r8d, ebp..
2940: 20 20 20 20 20 20 6a 62 65 20 4c 65 61 76 65 4e jbe LeaveN
2950: 6f 77 0d 0a 20 20 20 20 20 20 20 20 73 75 62 20 ow.. sub
2960: 65 64 78 2c 20 30 30 30 31 30 30 30 30 68 0d 0a edx, 00010000h..
2970: 20 20 20 20 20 20 20 20 6a 73 20 20 4c 65 61 76 js Leav
2980: 65 4e 6f 77 0d 0a 0d 0a 4c 6f 6f 70 45 6e 74 72 eNow....LoopEntr
2990: 79 31 3a 0d 0a 20 20 20 20 20 20 20 20 63 6d 70 y1:.. cmp
29a0: 20 62 78 2c 77 6f 72 64 20 70 74 72 20 5b 72 73 bx,word ptr [rs
29b0: 69 20 2b 20 72 38 20 2d 20 31 5d 0d 0a 20 20 20 i + r8 - 1]..
29c0: 20 20 20 20 20 6a 7a 20 20 4c 6f 6f 6b 75 70 4c jz LookupL
29d0: 6f 6f 70 49 73 5a 65 72 6f 0d 0a 0d 0a 4c 6f 6f oopIsZero....Loo
29e0: 6b 75 70 4c 6f 6f 70 32 3a 0d 0a 20 20 20 20 20 kupLoop2:..
29f0: 20 20 20 61 6e 64 20 72 38 64 2c 20 65 64 78 0d and r8d, edx.
2a00: 0a 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 7a 78 ... movzx
2a10: 20 20 20 72 38 64 2c 20 77 6f 72 64 20 70 74 72 r8d, word ptr
2a20: 20 5b 72 64 69 20 2b 20 72 38 2a 32 5d 0d 0a 20 [rdi + r8*2]..
2a30: 20 20 20 20 20 20 20 63 6d 70 20 72 38 64 2c 20 cmp r8d,
2a40: 65 62 70 0d 0a 20 20 20 20 20 20 20 20 6a 62 65 ebp.. jbe
2a50: 20 4c 65 61 76 65 4e 6f 77 0d 0a 20 20 20 20 20 LeaveNow..
2a60: 20 20 20 73 75 62 20 65 64 78 2c 20 30 30 30 31 sub edx, 0001
2a70: 30 30 30 30 68 0d 0a 20 20 20 20 20 20 20 20 6a 0000h.. j
2a80: 73 20 20 4c 65 61 76 65 4e 6f 77 0d 0a 0d 0a 4c s LeaveNow....L
2a90: 6f 6f 70 45 6e 74 72 79 32 3a 0d 0a 20 20 20 20 oopEntry2:..
2aa0: 20 20 20 20 63 6d 70 20 62 78 2c 77 6f 72 64 20 cmp bx,word
2ab0: 70 74 72 20 5b 72 73 69 20 2b 20 72 38 20 2d 20 ptr [rsi + r8 -
2ac0: 31 5d 0d 0a 20 20 20 20 20 20 20 20 6a 7a 20 20 1].. jz
2ad0: 4c 6f 6f 6b 75 70 4c 6f 6f 70 49 73 5a 65 72 6f LookupLoopIsZero
2ae0: 0d 0a 0d 0a 4c 6f 6f 6b 75 70 4c 6f 6f 70 34 3a ....LookupLoop4:
2af0: 0d 0a 20 20 20 20 20 20 20 20 61 6e 64 20 72 38 .. and r8
2b00: 64 2c 20 65 64 78 0d 0a 0d 0a 20 20 20 20 20 20 d, edx....
2b10: 20 20 6d 6f 76 7a 78 20 20 20 72 38 64 2c 20 77 movzx r8d, w
2b20: 6f 72 64 20 70 74 72 20 5b 72 64 69 20 2b 20 72 ord ptr [rdi + r
2b30: 38 2a 32 5d 0d 0a 20 20 20 20 20 20 20 20 63 6d 8*2].. cm
2b40: 70 20 72 38 64 2c 20 65 62 70 0d 0a 20 20 20 20 p r8d, ebp..
2b50: 20 20 20 20 6a 62 65 20 4c 65 61 76 65 4e 6f 77 jbe LeaveNow
2b60: 0d 0a 20 20 20 20 20 20 20 20 73 75 62 20 65 64 .. sub ed
2b70: 78 2c 20 30 30 30 31 30 30 30 30 68 0d 0a 20 20 x, 00010000h..
2b80: 20 20 20 20 20 20 6a 73 20 20 4c 65 61 76 65 4e js LeaveN
2b90: 6f 77 0d 0a 0d 0a 4c 6f 6f 70 45 6e 74 72 79 34 ow....LoopEntry4
2ba0: 3a 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d 70 :.... cmp
2bb0: 20 62 78 2c 77 6f 72 64 20 70 74 72 20 5b 72 73 bx,word ptr [rs
2bc0: 69 20 2b 20 72 38 20 2d 20 31 5d 0d 0a 20 20 20 i + r8 - 1]..
2bd0: 20 20 20 20 20 6a 6e 7a 20 4c 6f 6f 6b 75 70 4c jnz LookupL
2be0: 6f 6f 70 31 0d 0a 20 20 20 20 20 20 20 20 6a 6d oop1.. jm
2bf0: 70 20 4c 6f 6f 6b 75 70 4c 6f 6f 70 49 73 5a 65 p LookupLoopIsZe
2c00: 72 6f 0d 0a 0d 0a 0d 0a 3b 3b 3b 20 64 6f 20 7b ro......;;; do {
2c10: 0d 0a 3b 3b 3b 20 20 20 20 20 6d 61 74 63 68 20 ..;;; match
2c20: 3d 20 73 2d 3e 77 69 6e 64 6f 77 20 2b 20 63 75 = s->window + cu
2c30: 72 5f 6d 61 74 63 68 3b 0d 0a 3b 3b 3b 20 20 20 r_match;..;;;
2c40: 20 20 69 66 20 28 2a 28 75 73 68 66 2a 29 28 6d if (*(ushf*)(m
2c50: 61 74 63 68 2b 62 65 73 74 5f 6c 65 6e 2d 31 29 atch+best_len-1)
2c60: 20 21 3d 20 73 63 61 6e 5f 65 6e 64 20 7c 7c 0d != scan_end ||.
2c70: 0a 3b 3b 3b 20 20 20 20 20 20 20 20 20 2a 28 75 .;;; *(u
2c80: 73 68 66 2a 29 6d 61 74 63 68 20 21 3d 20 73 63 shf*)match != sc
2c90: 61 6e 5f 73 74 61 72 74 29 20 63 6f 6e 74 69 6e an_start) contin
2ca0: 75 65 3b 0d 0a 3b 3b 3b 20 20 20 20 20 5b 2e 2e ue;..;;; [..
2cb0: 2e 5d 0d 0a 3b 3b 3b 20 7d 20 77 68 69 6c 65 20 .]..;;; } while
2cc0: 28 28 63 75 72 5f 6d 61 74 63 68 20 3d 20 70 72 ((cur_match = pr
2cd0: 65 76 5b 63 75 72 5f 6d 61 74 63 68 20 26 20 77 ev[cur_match & w
2ce0: 6d 61 73 6b 5d 29 20 3e 20 6c 69 6d 69 74 0d 0a mask]) > limit..
2cf0: 3b 3b 3b 20 20 20 20 20 20 20 20 20 20 26 26 20 ;;; &&
2d00: 2d 2d 63 68 61 69 6e 5f 6c 65 6e 67 74 68 20 21 --chain_length !
2d10: 3d 20 30 29 3b 0d 0a 3b 3b 3b 0d 0a 3b 3b 3b 20 = 0);..;;;..;;;
2d20: 48 65 72 65 20 69 73 20 74 68 65 20 69 6e 6e 65 Here is the inne
2d30: 72 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 66 75 r loop of the fu
2d40: 6e 63 74 69 6f 6e 2e 20 54 68 65 20 66 75 6e 63 nction. The func
2d50: 74 69 6f 6e 20 77 69 6c 6c 20 73 70 65 6e 64 20 tion will spend
2d60: 74 68 65 0d 0a 3b 3b 3b 20 6d 61 6a 6f 72 69 74 the..;;; majorit
2d70: 79 20 6f 66 20 69 74 73 20 74 69 6d 65 20 69 6e y of its time in
2d80: 20 74 68 69 73 20 6c 6f 6f 70 2c 20 61 6e 64 20 this loop, and
2d90: 6d 61 6a 6f 72 69 74 79 20 6f 66 20 74 68 61 74 majority of that
2da0: 20 74 69 6d 65 20 77 69 6c 6c 0d 0a 3b 3b 3b 20 time will..;;;
2db0: 62 65 20 73 70 65 6e 74 20 69 6e 20 74 68 65 20 be spent in the
2dc0: 66 69 72 73 74 20 74 65 6e 20 69 6e 73 74 72 75 first ten instru
2dd0: 63 74 69 6f 6e 73 2e 0d 0a 3b 3b 3b 0d 0a 3b 3b ctions...;;;..;;
2de0: 3b 20 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f ; Within this lo
2df0: 6f 70 3a 0d 0a 3b 3b 3b 20 65 62 78 20 3d 20 73 op:..;;; ebx = s
2e00: 63 61 6e 65 6e 64 0d 0a 3b 3b 3b 20 72 38 64 20 canend..;;; r8d
2e10: 3d 20 63 75 72 6d 61 74 63 68 0d 0a 3b 3b 3b 20 = curmatch..;;;
2e20: 65 64 78 20 3d 20 63 68 61 69 6e 6c 65 6e 77 6d edx = chainlenwm
2e30: 61 73 6b 20 2d 20 69 2e 65 2e 2c 20 28 28 63 68 ask - i.e., ((ch
2e40: 61 69 6e 6c 65 6e 20 3c 3c 20 31 36 29 20 7c 20 ainlen << 16) |
2e50: 77 6d 61 73 6b 29 0d 0a 3b 3b 3b 20 65 73 69 20 wmask)..;;; esi
2e60: 3d 20 77 69 6e 64 6f 77 62 65 73 74 6c 65 6e 20 = windowbestlen
2e70: 2d 20 69 2e 65 2e 2c 20 28 77 69 6e 64 6f 77 20 - i.e., (window
2e80: 2b 20 62 65 73 74 6c 65 6e 29 0d 0a 3b 3b 3b 20 + bestlen)..;;;
2e90: 65 64 69 20 3d 20 70 72 65 76 0d 0a 3b 3b 3b 20 edi = prev..;;;
2ea0: 65 62 70 20 3d 20 6c 69 6d 69 74 0d 0a 0d 0a 4c ebp = limit....L
2eb0: 6f 6f 6b 75 70 4c 6f 6f 70 3a 0d 0a 20 20 20 20 ookupLoop:..
2ec0: 20 20 20 20 61 6e 64 20 72 38 64 2c 20 65 64 78 and r8d, edx
2ed0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 7a .... movz
2ee0: 78 20 20 20 72 38 64 2c 20 77 6f 72 64 20 70 74 x r8d, word pt
2ef0: 72 20 5b 72 64 69 20 2b 20 72 38 2a 32 5d 0d 0a r [rdi + r8*2]..
2f00: 20 20 20 20 20 20 20 20 63 6d 70 20 72 38 64 2c cmp r8d,
2f10: 20 65 62 70 0d 0a 20 20 20 20 20 20 20 20 6a 62 ebp.. jb
2f20: 65 20 4c 65 61 76 65 4e 6f 77 0d 0a 20 20 20 20 e LeaveNow..
2f30: 20 20 20 20 73 75 62 20 65 64 78 2c 20 30 30 30 sub edx, 000
2f40: 31 30 30 30 30 68 0d 0a 20 20 20 20 20 20 20 20 10000h..
2f50: 6a 73 20 20 4c 65 61 76 65 4e 6f 77 0d 0a 0d 0a js LeaveNow....
2f60: 4c 6f 6f 70 45 6e 74 72 79 3a 0d 0a 0d 0a 20 20 LoopEntry:....
2f70: 20 20 20 20 20 20 63 6d 70 20 62 78 2c 77 6f 72 cmp bx,wor
2f80: 64 20 70 74 72 20 5b 72 73 69 20 2b 20 72 38 20 d ptr [rsi + r8
2f90: 2d 20 31 5d 0d 0a 20 20 20 20 20 20 20 20 6a 6e - 1].. jn
2fa0: 7a 20 4c 6f 6f 6b 75 70 4c 6f 6f 70 31 0d 0a 4c z LookupLoop1..L
2fb0: 6f 6f 6b 75 70 4c 6f 6f 70 49 73 5a 65 72 6f 3a ookupLoopIsZero:
2fc0: 0d 0a 20 20 20 20 20 20 20 20 63 6d 70 20 20 20 .. cmp
2fd0: 20 20 72 31 32 77 2c 20 77 6f 72 64 20 70 74 72 r12w, word ptr
2fe0: 20 5b 72 31 30 20 2b 20 72 38 5d 0d 0a 20 20 20 [r10 + r8]..
2ff0: 20 20 20 20 20 6a 6e 7a 20 4c 6f 6f 6b 75 70 4c jnz LookupL
3000: 6f 6f 70 31 0d 0a 0d 0a 0d 0a 3b 3b 3b 20 53 74 oop1......;;; St
3010: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 ore the current
3020: 76 61 6c 75 65 20 6f 66 20 63 68 61 69 6e 6c 65 value of chainle
3030: 6e 2e 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 n... mov
3040: 5b 63 68 61 69 6e 6c 65 6e 77 6d 61 73 6b 5d 2c [chainlenwmask],
3050: 20 65 64 78 0d 0a 0d 0a 3b 3b 3b 20 50 6f 69 6e edx....;;; Poin
3060: 74 20 65 64 69 20 74 6f 20 74 68 65 20 73 74 72 t edi to the str
3070: 69 6e 67 20 75 6e 64 65 72 20 73 63 72 75 74 69 ing under scruti
3080: 6e 79 2c 20 61 6e 64 20 65 73 69 20 74 6f 20 74 ny, and esi to t
3090: 68 65 20 73 74 72 69 6e 67 20 77 65 0d 0a 3b 3b he string we..;;
30a0: 3b 20 61 72 65 20 68 6f 70 69 6e 67 20 74 6f 20 ; are hoping to
30b0: 6d 61 74 63 68 20 69 74 20 75 70 20 77 69 74 68 match it up with
30c0: 2e 20 49 6e 20 61 63 74 75 61 6c 69 74 79 2c 20 . In actuality,
30d0: 65 73 69 20 61 6e 64 20 65 64 69 20 61 72 65 0d esi and edi are.
30e0: 0a 3b 3b 3b 20 62 6f 74 68 20 70 6f 69 6e 74 65 .;;; both pointe
30f0: 64 20 28 4d 41 58 5f 4d 41 54 43 48 5f 38 20 2d d (MAX_MATCH_8 -
3100: 20 73 63 61 6e 61 6c 69 67 6e 29 20 62 79 74 65 scanalign) byte
3110: 73 20 61 68 65 61 64 2c 20 61 6e 64 20 65 64 78 s ahead, and edx
3120: 20 69 73 0d 0a 3b 3b 3b 20 69 6e 69 74 69 61 6c is..;;; initial
3130: 69 7a 65 64 20 74 6f 20 2d 28 4d 41 58 5f 4d 41 ized to -(MAX_MA
3140: 54 43 48 5f 38 20 2d 20 73 63 61 6e 61 6c 69 67 TCH_8 - scanalig
3150: 6e 29 2e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6c n)..... l
3160: 65 61 20 72 73 69 2c 5b 72 38 2b 72 31 30 5d 0d ea rsi,[r8+r10].
3170: 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 72 64 78 . mov rdx
3180: 2c 20 30 66 66 66 66 66 66 66 66 66 66 66 66 66 , 0fffffffffffff
3190: 65 66 38 68 3b 20 2d 28 4d 41 58 5f 4d 41 54 43 ef8h; -(MAX_MATC
31a0: 48 5f 38 29 0d 0a 20 20 20 20 20 20 20 20 6c 65 H_8).. le
31b0: 61 20 72 73 69 2c 20 5b 72 73 69 20 2b 20 72 31 a rsi, [rsi + r1
31c0: 33 20 2b 20 30 31 30 38 68 5d 20 3b 4d 41 58 5f 3 + 0108h] ;MAX_
31d0: 4d 41 54 43 48 5f 38 5d 0d 0a 20 20 20 20 20 20 MATCH_8]..
31e0: 20 20 6c 65 61 20 72 64 69 2c 20 5b 72 39 20 2b lea rdi, [r9 +
31f0: 20 72 31 33 20 2b 20 30 31 30 38 68 5d 20 3b 4d r13 + 0108h] ;M
3200: 41 58 5f 4d 41 54 43 48 5f 38 5d 0d 0a 0d 0a 20 AX_MATCH_8]....
3210: 20 20 20 20 20 20 20 70 72 65 66 65 74 63 68 74 prefetcht
3220: 31 20 5b 72 73 69 2b 72 64 78 5d 0d 0a 20 20 20 1 [rsi+rdx]..
3230: 20 20 20 20 20 70 72 65 66 65 74 63 68 74 31 20 prefetcht1
3240: 5b 72 64 69 2b 72 64 78 5d 0d 0a 0d 0a 0d 0a 3b [rdi+rdx]......;
3250: 3b 3b 20 54 65 73 74 20 74 68 65 20 73 74 72 69 ;; Test the stri
3260: 6e 67 73 20 66 6f 72 20 65 71 75 61 6c 69 74 79 ngs for equality
3270: 2c 20 38 20 62 79 74 65 73 20 61 74 20 61 20 74 , 8 bytes at a t
3280: 69 6d 65 2e 20 41 74 20 74 68 65 20 65 6e 64 2c ime. At the end,
3290: 0d 0a 3b 3b 3b 20 61 64 6a 75 73 74 20 72 64 78 ..;;; adjust rdx
32a0: 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6f so that it is o
32b0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 78 61 ffset to the exa
32c0: 63 74 20 62 79 74 65 20 74 68 61 74 20 6d 69 73 ct byte that mis
32d0: 6d 61 74 63 68 65 64 2e 0d 0a 3b 3b 3b 0d 0a 3b matched...;;;..;
32e0: 3b 3b 20 57 65 20 61 6c 72 65 61 64 79 20 6b 6e ;; We already kn
32f0: 6f 77 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 ow at this point
3300: 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 that the first
3310: 74 68 72 65 65 20 62 79 74 65 73 20 6f 66 20 74 three bytes of t
3320: 68 65 0d 0a 3b 3b 3b 20 73 74 72 69 6e 67 73 20 he..;;; strings
3330: 6d 61 74 63 68 20 65 61 63 68 20 6f 74 68 65 72 match each other
3340: 2c 20 61 6e 64 20 74 68 65 79 20 63 61 6e 20 62 , and they can b
3350: 65 20 73 61 66 65 6c 79 20 70 61 73 73 65 64 20 e safely passed
3360: 6f 76 65 72 20 62 65 66 6f 72 65 0d 0a 3b 3b 3b over before..;;;
3370: 20 73 74 61 72 74 69 6e 67 20 74 68 65 20 63 6f starting the co
3380: 6d 70 61 72 65 20 6c 6f 6f 70 2e 20 53 6f 20 77 mpare loop. So w
3390: 68 61 74 20 74 68 69 73 20 63 6f 64 65 20 64 6f hat this code do
33a0: 65 73 20 69 73 20 73 6b 69 70 20 6f 76 65 72 20 es is skip over
33b0: 30 2d 33 0d 0a 3b 3b 3b 20 62 79 74 65 73 2c 20 0-3..;;; bytes,
33c0: 61 73 20 6d 75 63 68 20 61 73 20 6e 65 63 65 73 as much as neces
33d0: 73 61 72 79 20 69 6e 20 6f 72 64 65 72 20 74 6f sary in order to
33e0: 20 64 77 6f 72 64 2d 61 6c 69 67 6e 20 74 68 65 dword-align the
33f0: 20 65 64 69 0d 0a 3b 3b 3b 20 70 6f 69 6e 74 65 edi..;;; pointe
3400: 72 2e 20 28 72 73 69 20 77 69 6c 6c 20 73 74 69 r. (rsi will sti
3410: 6c 6c 20 62 65 20 6d 69 73 61 6c 69 67 6e 65 64 ll be misaligned
3420: 20 74 68 72 65 65 20 74 69 6d 65 73 20 6f 75 74 three times out
3430: 20 6f 66 20 66 6f 75 72 2e 29 0d 0a 3b 3b 3b 0d of four.)..;;;.
3440: 0a 3b 3b 3b 20 49 74 20 73 68 6f 75 6c 64 20 62 .;;; It should b
3450: 65 20 63 6f 6e 66 65 73 73 65 64 20 74 68 61 74 e confessed that
3460: 20 74 68 69 73 20 6c 6f 6f 70 20 75 73 75 61 6c this loop usual
3470: 6c 79 20 64 6f 65 73 20 6e 6f 74 20 72 65 70 72 ly does not repr
3480: 65 73 65 6e 74 0d 0a 3b 3b 3b 20 6d 75 63 68 20 esent..;;; much
3490: 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 72 75 6e of the total run
34a0: 6e 69 6e 67 20 74 69 6d 65 2e 20 52 65 70 6c 61 ning time. Repla
34b0: 63 69 6e 67 20 69 74 20 77 69 74 68 20 61 20 6d cing it with a m
34c0: 6f 72 65 0d 0a 3b 3b 3b 20 73 74 72 61 69 67 68 ore..;;; straigh
34d0: 74 66 6f 72 77 61 72 64 20 22 72 65 70 20 63 6d tforward "rep cm
34e0: 70 73 62 22 20 77 6f 75 6c 64 20 6e 6f 74 20 64 psb" would not d
34f0: 72 61 73 74 69 63 61 6c 6c 79 20 64 65 67 72 61 rastically degra
3500: 64 65 0d 0a 3b 3b 3b 20 70 65 72 66 6f 72 6d 61 de..;;; performa
3510: 6e 63 65 2e 0d 0a 0d 0a 0d 0a 4c 6f 6f 70 43 6d nce.......LoopCm
3520: 70 73 3a 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 ps:.. mov
3530: 20 72 61 78 2c 20 5b 72 73 69 20 2b 20 72 64 78 rax, [rsi + rdx
3540: 5d 0d 0a 20 20 20 20 20 20 20 20 78 6f 72 20 72 ].. xor r
3550: 61 78 2c 20 5b 72 64 69 20 2b 20 72 64 78 5d 0d ax, [rdi + rdx].
3560: 0a 20 20 20 20 20 20 20 20 6a 6e 7a 20 4c 65 61 . jnz Lea
3570: 76 65 4c 6f 6f 70 43 6d 70 73 0d 0a 0d 0a 20 20 veLoopCmps....
3580: 20 20 20 20 20 20 6d 6f 76 20 72 61 78 2c 20 5b mov rax, [
3590: 72 73 69 20 2b 20 72 64 78 20 2b 20 38 5d 0d 0a rsi + rdx + 8]..
35a0: 20 20 20 20 20 20 20 20 78 6f 72 20 72 61 78 2c xor rax,
35b0: 20 5b 72 64 69 20 2b 20 72 64 78 20 2b 20 38 5d [rdi + rdx + 8]
35c0: 0d 0a 20 20 20 20 20 20 20 20 6a 6e 7a 20 4c 65 .. jnz Le
35d0: 61 76 65 4c 6f 6f 70 43 6d 70 73 38 0d 0a 0d 0a aveLoopCmps8....
35e0: 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 72 61 .. mov ra
35f0: 78 2c 20 5b 72 73 69 20 2b 20 72 64 78 20 2b 20 x, [rsi + rdx +
3600: 38 2b 38 5d 0d 0a 20 20 20 20 20 20 20 20 78 6f 8+8].. xo
3610: 72 20 72 61 78 2c 20 5b 72 64 69 20 2b 20 72 64 r rax, [rdi + rd
3620: 78 20 2b 20 38 2b 38 5d 0d 0a 20 20 20 20 20 20 x + 8+8]..
3630: 20 20 6a 6e 7a 20 4c 65 61 76 65 4c 6f 6f 70 43 jnz LeaveLoopC
3640: 6d 70 73 31 36 0d 0a 0d 0a 20 20 20 20 20 20 20 mps16....
3650: 20 61 64 64 20 72 64 78 2c 38 2b 38 2b 38 0d 0a add rdx,8+8+8..
3660: 0d 0a 20 20 20 20 20 20 20 20 6a 6e 7a 20 73 68 .. jnz sh
3670: 6f 72 74 20 4c 6f 6f 70 43 6d 70 73 0d 0a 20 20 ort LoopCmps..
3680: 20 20 20 20 20 20 6a 6d 70 20 73 68 6f 72 74 20 jmp short
3690: 4c 65 6e 4d 61 78 69 6d 75 6d 0d 0a 4c 65 61 76 LenMaximum..Leav
36a0: 65 4c 6f 6f 70 43 6d 70 73 31 36 3a 20 61 64 64 eLoopCmps16: add
36b0: 20 72 64 78 2c 38 0d 0a 4c 65 61 76 65 4c 6f 6f rdx,8..LeaveLoo
36c0: 70 43 6d 70 73 38 3a 20 61 64 64 20 72 64 78 2c pCmps8: add rdx,
36d0: 38 0d 0a 4c 65 61 76 65 4c 6f 6f 70 43 6d 70 73 8..LeaveLoopCmps
36e0: 3a 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 65 73 :.... tes
36f0: 74 20 20 20 20 65 61 78 2c 20 30 30 30 30 46 46 t eax, 0000FF
3700: 46 46 68 0d 0a 20 20 20 20 20 20 20 20 6a 6e 7a FFh.. jnz
3710: 20 4c 65 6e 4c 6f 77 65 72 0d 0a 0d 0a 20 20 20 LenLower....
3720: 20 20 20 20 20 74 65 73 74 20 65 61 78 2c 30 66 test eax,0f
3730: 66 66 66 66 66 66 66 68 0d 0a 0d 0a 20 20 20 20 fffffffh....
3740: 20 20 20 20 6a 6e 7a 20 4c 65 6e 4c 6f 77 65 72 jnz LenLower
3750: 33 32 0d 0a 0d 0a 20 20 20 20 20 20 20 20 61 64 32.... ad
3760: 64 20 72 64 78 2c 34 0d 0a 20 20 20 20 20 20 20 d rdx,4..
3770: 20 73 68 72 20 72 61 78 2c 33 32 0d 0a 20 20 20 shr rax,32..
3780: 20 20 20 20 20 6f 72 20 61 78 2c 61 78 0d 0a 20 or ax,ax..
3790: 20 20 20 20 20 20 20 6a 6e 7a 20 4c 65 6e 4c 6f jnz LenLo
37a0: 77 65 72 0d 0a 0d 0a 4c 65 6e 4c 6f 77 65 72 33 wer....LenLower3
37b0: 32 3a 0d 0a 20 20 20 20 20 20 20 20 73 68 72 20 2:.. shr
37c0: 65 61 78 2c 31 36 0d 0a 20 20 20 20 20 20 20 20 eax,16..
37d0: 61 64 64 20 72 64 78 2c 32 0d 0a 4c 65 6e 4c 6f add rdx,2..LenLo
37e0: 77 65 72 3a 20 20 20 73 75 62 20 61 6c 2c 20 31 wer: sub al, 1
37f0: 0d 0a 20 20 20 20 20 20 20 20 61 64 63 20 72 64 .. adc rd
3800: 78 2c 20 30 0d 0a 3b 3b 3b 20 43 61 6c 63 75 6c x, 0..;;; Calcul
3810: 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 6f ate the length o
3820: 66 20 74 68 65 20 6d 61 74 63 68 2e 20 49 66 20 f the match. If
3830: 69 74 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 it is longer tha
3840: 6e 20 4d 41 58 5f 4d 41 54 43 48 2c 0d 0a 3b 3b n MAX_MATCH,..;;
3850: 3b 20 74 68 65 6e 20 61 75 74 6f 6d 61 74 69 63 ; then automatic
3860: 61 6c 6c 79 20 61 63 63 65 70 74 20 69 74 20 61 ally accept it a
3870: 73 20 74 68 65 20 62 65 73 74 20 70 6f 73 73 69 s the best possi
3880: 62 6c 65 20 6d 61 74 63 68 20 61 6e 64 20 6c 65 ble match and le
3890: 61 76 65 2e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 ave.....
38a0: 6c 65 61 20 72 61 78 2c 20 5b 72 64 69 20 2b 20 lea rax, [rdi +
38b0: 72 64 78 5d 0d 0a 20 20 20 20 20 20 20 20 73 75 rdx].. su
38c0: 62 20 72 61 78 2c 20 72 39 0d 0a 20 20 20 20 20 b rax, r9..
38d0: 20 20 20 63 6d 70 20 65 61 78 2c 20 4d 41 58 5f cmp eax, MAX_
38e0: 4d 41 54 43 48 0d 0a 20 20 20 20 20 20 20 20 6a MATCH.. j
38f0: 67 65 20 4c 65 6e 4d 61 78 69 6d 75 6d 0d 0a 0d ge LenMaximum...
3900: 0a 3b 3b 3b 20 49 66 20 74 68 65 20 6c 65 6e 67 .;;; If the leng
3910: 74 68 20 6f 66 20 74 68 65 20 6d 61 74 63 68 20 th of the match
3920: 69 73 20 6e 6f 74 20 6c 6f 6e 67 65 72 20 74 68 is not longer th
3930: 61 6e 20 74 68 65 20 62 65 73 74 20 6d 61 74 63 an the best matc
3940: 68 20 77 65 0d 0a 3b 3b 3b 20 68 61 76 65 20 73 h we..;;; have s
3950: 6f 20 66 61 72 2c 20 74 68 65 6e 20 66 6f 72 67 o far, then forg
3960: 65 74 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e et it and return
3970: 20 74 6f 20 74 68 65 20 6c 6f 6f 6b 75 70 20 6c to the lookup l
3980: 6f 6f 70 2e 0d 0a 3b 2f 2f 2f 2f 2f 2f 2f 2f 2f oop...;/////////
3990: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
39a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 //////////....
39b0: 20 20 20 20 20 20 63 6d 70 20 65 61 78 2c 20 72 cmp eax, r
39c0: 31 31 64 0d 0a 20 20 20 20 20 20 20 20 6a 67 20 11d.. jg
39d0: 20 4c 6f 6e 67 65 72 4d 61 74 63 68 0d 0a 0d 0a LongerMatch....
39e0: 20 20 20 20 20 20 20 20 6c 65 61 20 72 73 69 2c lea rsi,
39f0: 5b 72 31 30 2b 72 31 31 5d 0d 0a 0d 0a 20 20 20 [r10+r11]....
3a00: 20 20 20 20 20 6d 6f 76 20 72 64 69 2c 20 70 72 mov rdi, pr
3a10: 65 76 5f 61 64 0d 0a 20 20 20 20 20 20 20 20 6d ev_ad.. m
3a20: 6f 76 20 65 64 78 2c 20 5b 63 68 61 69 6e 6c 65 ov edx, [chainle
3a30: 6e 77 6d 61 73 6b 5d 0d 0a 20 20 20 20 20 20 20 nwmask]..
3a40: 20 6a 6d 70 20 4c 6f 6f 6b 75 70 4c 6f 6f 70 0d jmp LookupLoop.
3a50: 0a 0d 0a 3b 3b 3b 20 20 20 20 20 20 20 20 20 73 ...;;; s
3a60: 2d 3e 6d 61 74 63 68 5f 73 74 61 72 74 20 3d 20 ->match_start =
3a70: 63 75 72 5f 6d 61 74 63 68 3b 0d 0a 3b 3b 3b 20 cur_match;..;;;
3a80: 20 20 20 20 20 20 20 20 62 65 73 74 5f 6c 65 6e best_len
3a90: 20 3d 20 6c 65 6e 3b 0d 0a 3b 3b 3b 20 20 20 20 = len;..;;;
3aa0: 20 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 3d 20 if (len >=
3ab0: 6e 69 63 65 5f 6d 61 74 63 68 29 20 62 72 65 61 nice_match) brea
3ac0: 6b 3b 0d 0a 3b 3b 3b 20 20 20 20 20 20 20 20 20 k;..;;;
3ad0: 73 63 61 6e 5f 65 6e 64 20 3d 20 2a 28 75 73 68 scan_end = *(ush
3ae0: 66 2a 29 28 73 63 61 6e 2b 62 65 73 74 5f 6c 65 f*)(scan+best_le
3af0: 6e 2d 31 29 3b 0d 0a 0d 0a 4c 6f 6e 67 65 72 4d n-1);....LongerM
3b00: 61 74 63 68 3a 0d 0a 20 20 20 20 20 20 20 20 6d atch:.. m
3b10: 6f 76 20 72 31 31 64 2c 20 65 61 78 0d 0a 20 20 ov r11d, eax..
3b20: 20 20 20 20 20 20 6d 6f 76 20 6d 61 74 63 68 5f mov match_
3b30: 73 74 61 72 74 2c 20 72 38 64 0d 0a 20 20 20 20 start, r8d..
3b40: 20 20 20 20 63 6d 70 20 65 61 78 2c 20 5b 6e 69 cmp eax, [ni
3b50: 63 65 6d 61 74 63 68 5d 0d 0a 20 20 20 20 20 20 cematch]..
3b60: 20 20 6a 67 65 20 4c 65 61 76 65 4e 6f 77 0d 0a jge LeaveNow..
3b70: 0d 0a 20 20 20 20 20 20 20 20 6c 65 61 20 72 73 .. lea rs
3b80: 69 2c 5b 72 31 30 2b 72 61 78 5d 0d 0a 0d 0a 20 i,[r10+rax]....
3b90: 20 20 20 20 20 20 20 6d 6f 76 7a 78 20 20 20 65 movzx e
3ba0: 62 78 2c 20 77 6f 72 64 20 70 74 72 20 5b 72 39 bx, word ptr [r9
3bb0: 20 2b 20 72 61 78 20 2d 20 31 5d 0d 0a 20 20 20 + rax - 1]..
3bc0: 20 20 20 20 20 6d 6f 76 20 72 64 69 2c 20 70 72 mov rdi, pr
3bd0: 65 76 5f 61 64 0d 0a 20 20 20 20 20 20 20 20 6d ev_ad.. m
3be0: 6f 76 20 65 64 78 2c 20 5b 63 68 61 69 6e 6c 65 ov edx, [chainle
3bf0: 6e 77 6d 61 73 6b 5d 0d 0a 20 20 20 20 20 20 20 nwmask]..
3c00: 20 6a 6d 70 20 4c 6f 6f 6b 75 70 4c 6f 6f 70 0d jmp LookupLoop.
3c10: 0a 0d 0a 3b 3b 3b 20 41 63 63 65 70 74 20 74 68 ...;;; Accept th
3c20: 65 20 63 75 72 72 65 6e 74 20 73 74 72 69 6e 67 e current string
3c30: 2c 20 77 69 74 68 20 74 68 65 20 6d 61 78 69 6d , with the maxim
3c40: 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65 6e 67 um possible leng
3c50: 74 68 2e 0d 0a 0d 0a 4c 65 6e 4d 61 78 69 6d 75 th.....LenMaximu
3c60: 6d 3a 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 m:.. mov
3c70: 72 31 31 64 2c 4d 41 58 5f 4d 41 54 43 48 0d 0a r11d,MAX_MATCH..
3c80: 20 20 20 20 20 20 20 20 6d 6f 76 20 6d 61 74 63 mov matc
3c90: 68 5f 73 74 61 72 74 2c 20 72 38 64 0d 0a 0d 0a h_start, r8d....
3ca0: 3b 3b 3b 20 69 66 20 28 28 75 49 6e 74 29 62 65 ;;; if ((uInt)be
3cb0: 73 74 5f 6c 65 6e 20 3c 3d 20 73 2d 3e 6c 6f 6f st_len <= s->loo
3cc0: 6b 61 68 65 61 64 29 20 72 65 74 75 72 6e 20 28 kahead) return (
3cd0: 75 49 6e 74 29 62 65 73 74 5f 6c 65 6e 3b 0d 0a uInt)best_len;..
3ce0: 3b 3b 3b 20 72 65 74 75 72 6e 20 73 2d 3e 6c 6f ;;; return s->lo
3cf0: 6f 6b 61 68 65 61 64 3b 0d 0a 0d 0a 4c 65 61 76 okahead;....Leav
3d00: 65 4e 6f 77 3a 0d 0a 49 46 44 45 46 20 49 4e 46 eNow:..IFDEF INF
3d10: 4f 5a 49 50 0d 0a 20 20 20 20 20 20 20 20 6d 6f OZIP.. mo
3d20: 76 20 65 61 78 2c 72 31 31 64 0d 0a 45 4c 53 45 v eax,r11d..ELSE
3d30: 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 65 61 .. mov ea
3d40: 78 2c 20 4c 6f 6f 6b 61 68 65 61 64 0d 0a 20 20 x, Lookahead..
3d50: 20 20 20 20 20 20 63 6d 70 20 72 31 31 64 2c 20 cmp r11d,
3d60: 65 61 78 0d 0a 20 20 20 20 20 20 20 20 63 6d 6f eax.. cmo
3d70: 76 6e 67 20 65 61 78 2c 20 72 31 31 64 0d 0a 45 vng eax, r11d..E
3d80: 4e 44 49 46 0d 0a 0d 0a 3b 3b 3b 20 52 65 73 74 NDIF....;;; Rest
3d90: 6f 72 65 20 74 68 65 20 73 74 61 63 6b 20 61 6e ore the stack an
3da0: 64 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 77 68 d return from wh
3db0: 65 6e 63 65 20 77 65 20 63 61 6d 65 2e 0d 0a 0d ence we came....
3dc0: 0a 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 72 ... mov r
3dd0: 73 69 2c 5b 73 61 76 65 5f 72 73 69 5d 0d 0a 20 si,[save_rsi]..
3de0: 20 20 20 20 20 20 20 6d 6f 76 20 72 64 69 2c 5b mov rdi,[
3df0: 73 61 76 65 5f 72 64 69 5d 0d 0a 20 20 20 20 20 save_rdi]..
3e00: 20 20 20 6d 6f 76 20 72 62 78 2c 5b 73 61 76 65 mov rbx,[save
3e10: 5f 72 62 78 5d 0d 0a 20 20 20 20 20 20 20 20 6d _rbx].. m
3e20: 6f 76 20 72 62 70 2c 5b 73 61 76 65 5f 72 62 70 ov rbp,[save_rbp
3e30: 5d 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 72 ].. mov r
3e40: 31 32 2c 5b 73 61 76 65 5f 72 31 32 5d 0d 0a 20 12,[save_r12]..
3e50: 20 20 20 20 20 20 20 6d 6f 76 20 72 31 33 2c 5b mov r13,[
3e60: 73 61 76 65 5f 72 31 33 5d 0d 0a 3b 20 20 20 20 save_r13]..;
3e70: 20 20 20 20 6d 6f 76 20 72 31 34 2c 5b 73 61 76 mov r14,[sav
3e80: 65 5f 72 31 34 5d 0d 0a 3b 20 20 20 20 20 20 20 e_r14]..;
3e90: 20 6d 6f 76 20 72 31 35 2c 5b 73 61 76 65 5f 72 mov r15,[save_r
3ea0: 31 35 5d 0d 0a 0d 0a 0d 0a 20 20 20 20 20 20 20 15]......
3eb0: 20 72 65 74 20 30 0d 0a 3b 20 70 6c 65 61 73 65 ret 0..; please
3ec0: 20 64 6f 6e 27 74 20 72 65 6d 6f 76 65 20 74 68 don't remove th
3ed0: 69 73 20 73 74 72 69 6e 67 20 21 0d 0a 3b 20 59 is string !..; Y
3ee0: 6f 75 72 20 63 61 6e 20 66 72 65 65 6c 79 20 75 our can freely u
3ef0: 73 65 20 67 76 6d 61 74 36 34 20 69 6e 20 61 6e se gvmat64 in an
3f00: 79 20 66 72 65 65 20 6f 72 20 63 6f 6d 6d 65 72 y free or commer
3f10: 63 69 61 6c 20 61 70 70 0d 0a 3b 20 62 75 74 20 cial app..; but
3f20: 69 74 20 69 73 20 66 61 72 20 62 65 74 74 65 72 it is far better
3f30: 20 64 6f 6e 27 74 20 72 65 6d 6f 76 65 20 74 68 don't remove th
3f40: 65 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 e string in the
3f50: 62 69 6e 61 72 79 21 0d 0a 20 20 20 20 64 62 20 binary!.. db
3f60: 20 20 20 20 30 64 68 2c 30 61 68 2c 22 61 73 6d 0dh,0ah,"asm
3f70: 36 38 36 20 77 69 74 68 20 6d 61 73 6d 2c 20 6f 686 with masm, o
3f80: 70 74 69 6d 69 73 65 64 20 61 73 73 65 6d 62 6c ptimised assembl
3f90: 79 20 63 6f 64 65 20 66 72 6f 6d 20 42 72 69 61 y code from Bria
3fa0: 6e 20 52 61 69 74 65 72 2c 20 77 72 69 74 74 65 n Raiter, writte
3fb0: 6e 20 31 39 39 38 2c 20 63 6f 6e 76 65 72 74 65 n 1998, converte
3fc0: 64 20 74 6f 20 61 6d 64 20 36 34 20 62 79 20 47 d to amd 64 by G
3fd0: 69 6c 6c 65 73 20 56 6f 6c 6c 61 6e 74 20 32 30 illes Vollant 20
3fe0: 30 35 22 2c 30 64 68 2c 30 61 68 2c 30 0d 0a 6c 05",0dh,0ah,0..l
3ff0: 6f 6e 67 65 73 74 5f 6d 61 74 63 68 20 20 20 45 ongest_match E
4000: 4e 44 50 0d 0a 0d 0a 6d 61 74 63 68 5f 69 6e 69 NDP....match_ini
4010: 74 20 50 52 4f 43 0d 0a 20 20 72 65 74 20 30 0d t PROC.. ret 0.
4020: 0a 6d 61 74 63 68 5f 69 6e 69 74 20 45 4e 44 50 .match_init ENDP
4030: 0d 0a 0d 0a 0d 0a 45 4e 44 0d 0a ......END..