Fossil

Hex Artifact Content
Login

Artifact 3c72c7b7f6c82e72b25a700eebccd0a987e7ba7b:


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..