Fossil

Hex Artifact Content
Login

Artifact 742603cba1af98a1432cc02efb019b1a5760adf2:


0000: 2f 2a 0d 0a 3b 75 49 6e 74 20 6c 6f 6e 67 65 73  /*..;uInt longes
0010: 74 5f 6d 61 74 63 68 5f 78 36 34 28 0d 0a 3b 20  t_match_x64(..; 
0020: 20 20 20 64 65 66 6c 61 74 65 5f 73 74 61 74 65     deflate_state
0030: 20 2a 73 2c 0d 0a 3b 20 20 20 20 49 50 6f 73 20   *s,..;    IPos 
0040: 63 75 72 5f 6d 61 74 63 68 29 3b 20 20 20 20 20  cur_match);     
0050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0060: 20 20 20 20 20 20 20 20 2f 2f 20 63 75 72 72 65          // curre
0070: 6e 74 20 6d 61 74 63 68 20 0d 0a 0d 0a 3b 20 67  nt match ....; g
0080: 76 6d 61 74 36 34 2e 53 20 2d 2d 20 41 73 6d 20  vmat64.S -- 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 74 68 69 73 20 66 69  5/I7)..; this fi
0150: 6c 65 20 69 73 20 74 72 61 6e 73 6c 61 74 69 6f  le is translatio
0160: 6e 20 66 72 6f 6d 20 67 76 6d 61 74 36 34 2e 61  n from gvmat64.a
0170: 73 6d 20 74 6f 20 47 43 43 20 34 2e 78 20 28 66  sm to GCC 4.x (f
0180: 6f 72 20 4c 69 6e 75 78 2c 20 4d 61 63 20 58 43  or Linux, Mac XC
0190: 6f 64 65 29 0d 0a 3b 20 43 6f 70 79 72 69 67 68  ode)..; Copyrigh
01a0: 74 20 28 43 29 20 31 39 39 35 2d 32 30 31 30 20  t (C) 1995-2010 
01b0: 4a 65 61 6e 2d 6c 6f 75 70 20 47 61 69 6c 6c 79  Jean-loup Gailly
01c0: 2c 20 42 72 69 61 6e 20 52 61 69 74 65 72 20 61  , Brian Raiter a
01d0: 6e 64 20 47 69 6c 6c 65 73 20 56 6f 6c 6c 61 6e  nd Gilles Vollan
01e0: 74 2e 0d 0a 3b 0d 0a 3b 20 46 69 6c 65 20 77 72  t...;..; File wr
01f0: 69 74 74 65 6e 20 62 79 20 47 69 6c 6c 65 73 20  itten by Gilles 
0200: 56 6f 6c 6c 61 6e 74 2c 20 62 79 20 63 6f 6e 76  Vollant, by conv
0210: 65 72 74 69 6e 67 20 74 6f 20 61 73 73 65 6d 62  erting to assemb
0220: 6c 79 20 74 68 65 20 6c 6f 6e 67 65 73 74 5f 6d  ly the longest_m
0230: 61 74 63 68 0d 0a 3b 20 20 66 72 6f 6d 20 4a 65  atch..;  from Je
0240: 61 6e 2d 6c 6f 75 70 20 47 61 69 6c 6c 79 20 69  an-loup Gailly i
0250: 6e 20 64 65 66 6c 61 74 65 2e 63 20 6f 66 20 7a  n deflate.c of z
0260: 4c 69 62 20 61 6e 64 20 69 6e 66 6f 5a 69 70 20  Lib and infoZip 
0270: 7a 69 70 2e 0d 0a 3b 20 20 61 6e 64 20 62 79 20  zip...;  and by 
0280: 74 61 6b 69 6e 67 20 69 6e 73 70 69 72 61 74 69  taking inspirati
0290: 6f 6e 20 6f 6e 20 61 73 6d 36 38 36 20 77 69 74  on on asm686 wit
02a0: 68 20 6d 61 73 6d 2c 20 6f 70 74 69 6d 69 73 65  h masm, optimise
02b0: 64 20 61 73 73 65 6d 62 6c 79 20 63 6f 64 65 0d  d assembly code.
02c0: 0a 3b 20 20 20 20 20 20 20 20 66 72 6f 6d 20 42  .;        from B
02d0: 72 69 61 6e 20 52 61 69 74 65 72 2c 20 77 72 69  rian Raiter, wri
02e0: 74 74 65 6e 20 31 39 39 38 0d 0a 3b 0d 0a 3b 20  tten 1998..;..; 
02f0: 20 54 68 69 73 20 73 6f 66 74 77 61 72 65 20 69   This software i
0300: 73 20 70 72 6f 76 69 64 65 64 20 27 61 73 2d 69  s provided 'as-i
0310: 73 27 2c 20 77 69 74 68 6f 75 74 20 61 6e 79 20  s', without any 
0320: 65 78 70 72 65 73 73 20 6f 72 20 69 6d 70 6c 69  express or impli
0330: 65 64 0d 0a 3b 20 20 77 61 72 72 61 6e 74 79 2e  ed..;  warranty.
0340: 20 20 49 6e 20 6e 6f 20 65 76 65 6e 74 20 77 69    In no event wi
0350: 6c 6c 20 74 68 65 20 61 75 74 68 6f 72 73 20 62  ll the authors b
0360: 65 20 68 65 6c 64 20 6c 69 61 62 6c 65 20 66 6f  e held liable fo
0370: 72 20 61 6e 79 20 64 61 6d 61 67 65 73 0d 0a 3b  r any damages..;
0380: 20 20 61 72 69 73 69 6e 67 20 66 72 6f 6d 20 74    arising from t
0390: 68 65 20 75 73 65 20 6f 66 20 74 68 69 73 20 73  he use of this s
03a0: 6f 66 74 77 61 72 65 2e 0d 0a 3b 0d 0a 3b 20 20  oftware...;..;  
03b0: 50 65 72 6d 69 73 73 69 6f 6e 20 69 73 20 67 72  Permission is gr
03c0: 61 6e 74 65 64 20 74 6f 20 61 6e 79 6f 6e 65 20  anted to anyone 
03d0: 74 6f 20 75 73 65 20 74 68 69 73 20 73 6f 66 74  to use this soft
03e0: 77 61 72 65 20 66 6f 72 20 61 6e 79 20 70 75 72  ware for any pur
03f0: 70 6f 73 65 2c 0d 0a 3b 20 20 69 6e 63 6c 75 64  pose,..;  includ
0400: 69 6e 67 20 63 6f 6d 6d 65 72 63 69 61 6c 20 61  ing commercial a
0410: 70 70 6c 69 63 61 74 69 6f 6e 73 2c 20 61 6e 64  pplications, and
0420: 20 74 6f 20 61 6c 74 65 72 20 69 74 20 61 6e 64   to alter it and
0430: 20 72 65 64 69 73 74 72 69 62 75 74 65 20 69 74   redistribute it
0440: 0d 0a 3b 20 20 66 72 65 65 6c 79 2c 20 73 75 62  ..;  freely, sub
0450: 6a 65 63 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c  ject to the foll
0460: 6f 77 69 6e 67 20 72 65 73 74 72 69 63 74 69 6f  owing restrictio
0470: 6e 73 3a 0d 0a 3b 0d 0a 3b 20 20 31 2e 20 54 68  ns:..;..;  1. Th
0480: 65 20 6f 72 69 67 69 6e 20 6f 66 20 74 68 69 73  e origin of this
0490: 20 73 6f 66 74 77 61 72 65 20 6d 75 73 74 20 6e   software must n
04a0: 6f 74 20 62 65 20 6d 69 73 72 65 70 72 65 73 65  ot be misreprese
04b0: 6e 74 65 64 3b 20 79 6f 75 20 6d 75 73 74 20 6e  nted; you must n
04c0: 6f 74 0d 0a 3b 20 20 20 20 20 63 6c 61 69 6d 20  ot..;     claim 
04d0: 74 68 61 74 20 79 6f 75 20 77 72 6f 74 65 20 74  that you wrote t
04e0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 6f 66 74  he original soft
04f0: 77 61 72 65 2e 20 49 66 20 79 6f 75 20 75 73 65  ware. If you use
0500: 20 74 68 69 73 20 73 6f 66 74 77 61 72 65 0d 0a   this software..
0510: 3b 20 20 20 20 20 69 6e 20 61 20 70 72 6f 64 75  ;     in a produ
0520: 63 74 2c 20 61 6e 20 61 63 6b 6e 6f 77 6c 65 64  ct, an acknowled
0530: 67 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72 6f  gment in the pro
0540: 64 75 63 74 20 64 6f 63 75 6d 65 6e 74 61 74 69  duct documentati
0550: 6f 6e 20 77 6f 75 6c 64 20 62 65 0d 0a 3b 20 20  on would be..;  
0560: 20 20 20 61 70 70 72 65 63 69 61 74 65 64 20 62     appreciated b
0570: 75 74 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ut is not requir
0580: 65 64 2e 0d 0a 3b 20 20 32 2e 20 41 6c 74 65 72  ed...;  2. Alter
0590: 65 64 20 73 6f 75 72 63 65 20 76 65 72 73 69 6f  ed source versio
05a0: 6e 73 20 6d 75 73 74 20 62 65 20 70 6c 61 69 6e  ns must be plain
05b0: 6c 79 20 6d 61 72 6b 65 64 20 61 73 20 73 75 63  ly marked as suc
05c0: 68 2c 20 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20  h, and must not 
05d0: 62 65 0d 0a 3b 20 20 20 20 20 6d 69 73 72 65 70  be..;     misrep
05e0: 72 65 73 65 6e 74 65 64 20 61 73 20 62 65 69 6e  resented as bein
05f0: 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73  g the original s
0600: 6f 66 74 77 61 72 65 0d 0a 3b 20 20 33 2e 20 54  oftware..;  3. T
0610: 68 69 73 20 6e 6f 74 69 63 65 20 6d 61 79 20 6e  his notice may n
0620: 6f 74 20 62 65 20 72 65 6d 6f 76 65 64 20 6f 72  ot be removed or
0630: 20 61 6c 74 65 72 65 64 20 66 72 6f 6d 20 61 6e   altered from an
0640: 79 20 73 6f 75 72 63 65 20 64 69 73 74 72 69 62  y source distrib
0650: 75 74 69 6f 6e 2e 0d 0a 3b 0d 0a 3b 20 20 20 20  ution...;..;    
0660: 20 20 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e       http://www.
0670: 7a 6c 69 62 2e 6e 65 74 0d 0a 3b 20 20 20 20 20  zlib.net..;     
0680: 20 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 77      http://www.w
0690: 69 6e 69 6d 61 67 65 2e 63 6f 6d 2f 7a 4c 69 62  inimage.com/zLib
06a0: 44 6c 6c 0d 0a 3b 20 20 20 20 20 20 20 20 20 68  Dll..;         h
06b0: 74 74 70 3a 2f 2f 77 77 77 2e 6d 75 70 70 65 74  ttp://www.muppet
06c0: 6c 61 62 73 2e 63 6f 6d 2f 7e 62 72 65 61 64 62  labs.com/~breadb
06d0: 6f 78 2f 73 6f 66 74 77 61 72 65 2f 61 73 73 65  ox/software/asse
06e0: 6d 62 6c 79 2e 68 74 6d 6c 0d 0a 3b 0d 0a 3b 20  mbly.html..;..; 
06f0: 74 6f 20 63 6f 6d 70 69 6c 65 20 74 68 69 73 20  to compile this 
0700: 66 69 6c 65 20 66 6f 72 20 7a 4c 69 62 2c 20 49  file for zLib, I
0710: 20 75 73 65 20 6f 70 74 69 6f 6e 3a 0d 0a 3b 20   use option:..; 
0720: 20 20 67 63 63 20 2d 63 20 2d 61 72 63 68 20 78    gcc -c -arch x
0730: 38 36 5f 36 34 20 67 76 6d 61 74 36 34 2e 53 0d  86_64 gvmat64.S.
0740: 0a 0d 0a 0d 0a 3b 75 49 6e 74 20 6c 6f 6e 67 65  .....;uInt longe
0750: 73 74 5f 6d 61 74 63 68 28 73 2c 20 63 75 72 5f  st_match(s, cur_
0760: 6d 61 74 63 68 29 0d 0a 3b 20 20 20 20 64 65 66  match)..;    def
0770: 6c 61 74 65 5f 73 74 61 74 65 20 2a 73 3b 0d 0a  late_state *s;..
0780: 3b 20 20 20 20 49 50 6f 73 20 63 75 72 5f 6d 61  ;    IPos cur_ma
0790: 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  tch;            
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 2f 2f 20 63 75 72 72 65 6e 74 20 6d 61 74 63   // current matc
07c0: 68 20 2f 0d 0a 3b 0d 0a 3b 20 77 69 74 68 20 58  h /..;..; with X
07d0: 43 6f 64 65 20 66 6f 72 20 4d 61 63 2c 20 49 20  Code for Mac, I 
07e0: 68 61 64 20 73 74 72 61 6e 67 65 20 65 72 72 6f  had strange erro
07f0: 72 20 77 69 74 68 20 73 6f 6d 65 20 6a 75 6d 70  r with some jump
0800: 20 6f 6e 20 69 6e 74 65 6c 20 73 79 6e 74 61 78   on intel syntax
0810: 0d 0a 3b 20 74 68 69 73 20 69 73 20 77 68 79 20  ..; this is why 
0820: 42 45 46 4f 52 45 5f 4a 4d 50 20 61 6e 64 20 41  BEFORE_JMP and A
0830: 46 54 45 52 5f 4a 4d 50 20 61 72 65 20 75 73 65  FTER_JMP are use
0840: 64 0d 0a 20 2a 2f 0d 0a 0d 0a 0d 0a 23 64 65 66  d.. */......#def
0850: 69 6e 65 20 42 45 46 4f 52 45 5f 4a 4d 50 20 2e  ine BEFORE_JMP .
0860: 61 74 74 5f 73 79 6e 74 61 78 0d 0a 23 64 65 66  att_syntax..#def
0870: 69 6e 65 20 41 46 54 45 52 5f 4a 4d 50 20 2e 69  ine AFTER_JMP .i
0880: 6e 74 65 6c 5f 73 79 6e 74 61 78 20 6e 6f 70 72  ntel_syntax nopr
0890: 65 66 69 78 0d 0a 0d 0a 23 69 66 6e 64 65 66 20  efix....#ifndef 
08a0: 4e 4f 5f 55 4e 44 45 52 4c 49 4e 45 0d 0a 23 09  NO_UNDERLINE..#.
08b0: 64 65 66 69 6e 65 09 6d 61 74 63 68 5f 69 6e 69  define.match_ini
08c0: 74 09 5f 6d 61 74 63 68 5f 69 6e 69 74 0d 0a 23  t._match_init..#
08d0: 09 64 65 66 69 6e 65 09 6c 6f 6e 67 65 73 74 5f  .define.longest_
08e0: 6d 61 74 63 68 09 5f 6c 6f 6e 67 65 73 74 5f 6d  match._longest_m
08f0: 61 74 63 68 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a  atch..#endif....
0900: 2e 69 6e 74 65 6c 5f 73 79 6e 74 61 78 20 6e 6f  .intel_syntax no
0910: 70 72 65 66 69 78 0d 0a 0d 0a 2e 67 6c 6f 62 6c  prefix.....globl
0920: 09 6d 61 74 63 68 5f 69 6e 69 74 2c 20 6c 6f 6e  .match_init, lon
0930: 67 65 73 74 5f 6d 61 74 63 68 0d 0a 2e 74 65 78  gest_match...tex
0940: 74 0d 0a 6c 6f 6e 67 65 73 74 5f 6d 61 74 63 68  t..longest_match
0950: 3a 0d 0a 0d 0a 0d 0a 0d 0a 23 64 65 66 69 6e 65  :........#define
0960: 20 4c 6f 63 61 6c 56 61 72 73 53 69 7a 65 20 39   LocalVarsSize 9
0970: 36 0d 0a 2f 2a 0d 0a 3b 20 72 65 67 69 73 74 65  6../*..; registe
0980: 72 20 75 73 65 64 20 3a 20 72 61 78 2c 72 62 78  r used : rax,rbx
0990: 2c 72 63 78 2c 72 64 78 2c 72 73 69 2c 72 64 69  ,rcx,rdx,rsi,rdi
09a0: 2c 72 38 2c 72 39 2c 72 31 30 2c 72 31 31 2c 72  ,r8,r9,r10,r11,r
09b0: 31 32 0d 0a 3b 20 66 72 65 65 20 72 65 67 69 73  12..; free regis
09c0: 74 65 72 20 3a 20 20 72 31 34 2c 72 31 35 0d 0a  ter :  r14,r15..
09d0: 3b 20 72 65 67 69 73 74 65 72 20 63 61 6e 20 62  ; register can b
09e0: 65 20 73 61 76 65 64 20 3a 20 72 73 70 0d 0a 2a  e saved : rsp..*
09f0: 2f 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 63 68 61  /....#define cha
0a00: 69 6e 6c 65 6e 77 6d 61 73 6b 20 20 20 20 20 28  inlenwmask     (
0a10: 72 73 70 20 2b 20 38 20 2d 20 4c 6f 63 61 6c 56  rsp + 8 - LocalV
0a20: 61 72 73 53 69 7a 65 29 0d 0a 23 64 65 66 69 6e  arsSize)..#defin
0a30: 65 20 6e 69 63 65 6d 61 74 63 68 20 20 20 20 20  e nicematch     
0a40: 20 20 20 20 28 72 73 70 20 2b 20 31 36 20 2d 20      (rsp + 16 - 
0a50: 4c 6f 63 61 6c 56 61 72 73 53 69 7a 65 29 0d 0a  LocalVarsSize)..
0a60: 0d 0a 23 64 65 66 69 6e 65 20 73 61 76 65 5f 72  ..#define save_r
0a70: 64 69 20 20 20 20 20 20 20 20 28 72 73 70 20 2b  di        (rsp +
0a80: 20 32 34 20 2d 20 4c 6f 63 61 6c 56 61 72 73 53   24 - LocalVarsS
0a90: 69 7a 65 29 0d 0a 23 64 65 66 69 6e 65 20 73 61  ize)..#define sa
0aa0: 76 65 5f 72 73 69 20 20 20 20 20 20 20 20 28 72  ve_rsi        (r
0ab0: 73 70 20 2b 20 33 32 20 2d 20 4c 6f 63 61 6c 56  sp + 32 - LocalV
0ac0: 61 72 73 53 69 7a 65 29 0d 0a 23 64 65 66 69 6e  arsSize)..#defin
0ad0: 65 20 73 61 76 65 5f 72 62 78 20 20 20 20 20 20  e save_rbx      
0ae0: 20 20 28 72 73 70 20 2b 20 34 30 20 2d 20 4c 6f    (rsp + 40 - Lo
0af0: 63 61 6c 56 61 72 73 53 69 7a 65 29 0d 0a 23 64  calVarsSize)..#d
0b00: 65 66 69 6e 65 20 73 61 76 65 5f 72 62 70 20 20  efine save_rbp  
0b10: 20 20 20 20 20 20 28 72 73 70 20 2b 20 34 38 20        (rsp + 48 
0b20: 2d 20 4c 6f 63 61 6c 56 61 72 73 53 69 7a 65 29  - LocalVarsSize)
0b30: 0d 0a 23 64 65 66 69 6e 65 20 73 61 76 65 5f 72  ..#define save_r
0b40: 31 32 20 20 20 20 20 20 20 20 28 72 73 70 20 2b  12        (rsp +
0b50: 20 35 36 20 2d 20 4c 6f 63 61 6c 56 61 72 73 53   56 - LocalVarsS
0b60: 69 7a 65 29 0d 0a 23 64 65 66 69 6e 65 20 73 61  ize)..#define sa
0b70: 76 65 5f 72 31 33 20 20 20 20 20 20 20 20 28 72  ve_r13        (r
0b80: 73 70 20 2b 20 36 34 20 2d 20 4c 6f 63 61 6c 56  sp + 64 - LocalV
0b90: 61 72 73 53 69 7a 65 29 0d 0a 23 64 65 66 69 6e  arsSize)..#defin
0ba0: 65 20 73 61 76 65 5f 72 31 34 20 20 20 20 20 20  e save_r14      
0bb0: 20 20 28 72 73 70 20 2b 20 37 32 20 2d 20 4c 6f    (rsp + 72 - Lo
0bc0: 63 61 6c 56 61 72 73 53 69 7a 65 29 0d 0a 23 64  calVarsSize)..#d
0bd0: 65 66 69 6e 65 20 73 61 76 65 5f 72 31 35 20 20  efine save_r15  
0be0: 20 20 20 20 20 20 28 72 73 70 20 2b 20 38 30 20        (rsp + 80 
0bf0: 2d 20 4c 6f 63 61 6c 56 61 72 73 53 69 7a 65 29  - LocalVarsSize)
0c00: 0d 0a 0d 0a 0d 0a 2f 2a 0d 0a 3b 20 20 61 6c 6c  ....../*..;  all
0c10: 20 74 68 65 20 2b 34 20 6f 66 66 73 65 74 73 20   the +4 offsets 
0c20: 61 72 65 20 64 75 65 20 74 6f 20 74 68 65 20 61  are due to the a
0c30: 64 64 69 74 69 6f 6e 20 6f 66 20 70 65 6e 64 69  ddition of pendi
0c40: 6e 67 5f 62 75 66 5f 73 69 7a 65 20 28 69 6e 20  ng_buf_size (in 
0c50: 7a 6c 69 62 0d 0a 3b 20 20 69 6e 20 74 68 65 20  zlib..;  in the 
0c60: 64 65 66 6c 61 74 65 5f 73 74 61 74 65 20 73 74  deflate_state st
0c70: 72 75 63 74 75 72 65 20 73 69 6e 63 65 20 74 68  ructure since th
0c80: 65 20 61 73 6d 20 63 6f 64 65 20 77 61 73 20 66  e asm code was f
0c90: 69 72 73 74 20 77 72 69 74 74 65 6e 0d 0a 3b 20  irst written..; 
0ca0: 20 28 69 66 20 79 6f 75 20 63 6f 6d 70 69 6c 65   (if you compile
0cb0: 20 77 69 74 68 20 7a 6c 69 62 20 31 2e 30 2e 34   with zlib 1.0.4
0cc0: 20 6f 72 20 6f 6c 64 65 72 2c 20 72 65 6d 6f 76   or older, remov
0cd0: 65 20 74 68 65 20 2b 34 29 2e 0d 0a 3b 20 20 4e  e the +4)...;  N
0ce0: 6f 74 65 20 3a 20 74 68 65 73 65 20 76 61 6c 75  ote : these valu
0cf0: 65 20 61 72 65 20 67 6f 6f 64 20 77 69 74 68 20  e are good with 
0d00: 61 20 38 20 62 79 74 65 73 20 62 6f 75 6e 64 61  a 8 bytes bounda
0d10: 72 79 20 70 61 63 6b 20 73 74 72 75 63 74 75 72  ry pack structur
0d20: 65 0d 0a 2a 2f 0d 0a 0d 0a 23 64 65 66 69 6e 65  e..*/....#define
0d30: 20 20 20 20 4d 41 58 5f 4d 41 54 43 48 20 20 20      MAX_MATCH   
0d40: 20 20 20 20 20 20 20 20 20 20 20 32 35 38 0d 0a             258..
0d50: 23 64 65 66 69 6e 65 20 20 20 20 4d 49 4e 5f 4d  #define    MIN_M
0d60: 41 54 43 48 20 20 20 20 20 20 20 20 20 20 20 20  ATCH            
0d70: 20 20 33 0d 0a 23 64 65 66 69 6e 65 20 20 20 20    3..#define    
0d80: 4d 49 4e 5f 4c 4f 4f 4b 41 48 45 41 44 20 20 20  MIN_LOOKAHEAD   
0d90: 20 20 20 20 20 20 20 28 4d 41 58 5f 4d 41 54 43         (MAX_MATC
0da0: 48 2b 4d 49 4e 5f 4d 41 54 43 48 2b 31 29 0d 0a  H+MIN_MATCH+1)..
0db0: 0d 0a 2f 2a 0d 0a 3b 3b 3b 20 4f 66 66 73 65 74  ../*..;;; Offset
0dc0: 73 20 66 6f 72 20 66 69 65 6c 64 73 20 69 6e 20  s for fields in 
0dd0: 74 68 65 20 64 65 66 6c 61 74 65 5f 73 74 61 74  the deflate_stat
0de0: 65 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  e structure. The
0df0: 73 65 20 6e 75 6d 62 65 72 73 0d 0a 3b 3b 3b 20  se numbers..;;; 
0e00: 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 20 66  are calculated f
0e10: 72 6f 6d 20 74 68 65 20 64 65 66 69 6e 69 74 69  rom the definiti
0e20: 6f 6e 20 6f 66 20 64 65 66 6c 61 74 65 5f 73 74  on of deflate_st
0e30: 61 74 65 2c 20 77 69 74 68 20 74 68 65 0d 0a 3b  ate, with the..;
0e40: 3b 3b 20 61 73 73 75 6d 70 74 69 6f 6e 20 74 68  ;; assumption th
0e50: 61 74 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  at the compiler 
0e60: 77 69 6c 6c 20 64 77 6f 72 64 2d 61 6c 69 67 6e  will dword-align
0e70: 20 74 68 65 20 66 69 65 6c 64 73 2e 20 28 54 68   the fields. (Th
0e80: 75 73 2c 0d 0a 3b 3b 3b 20 63 68 61 6e 67 69 6e  us,..;;; changin
0e90: 67 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e  g the definition
0ea0: 20 6f 66 20 64 65 66 6c 61 74 65 5f 73 74 61 74   of deflate_stat
0eb0: 65 20 63 6f 75 6c 64 20 65 61 73 69 6c 79 20 63  e could easily c
0ec0: 61 75 73 65 20 74 68 69 73 0d 0a 3b 3b 3b 20 70  ause this..;;; p
0ed0: 72 6f 67 72 61 6d 20 74 6f 20 63 72 61 73 68 20  rogram to crash 
0ee0: 68 6f 72 72 69 62 6c 79 2c 20 77 69 74 68 6f 75  horribly, withou
0ef0: 74 20 73 6f 20 6d 75 63 68 20 61 73 20 61 20 77  t so much as a w
0f00: 61 72 6e 69 6e 67 20 61 74 0d 0a 3b 3b 3b 20 63  arning at..;;; c
0f10: 6f 6d 70 69 6c 65 20 74 69 6d 65 2e 20 53 69 67  ompile time. Sig
0f20: 68 2e 29 0d 0a 0d 0a 3b 20 20 61 6c 6c 20 74 68  h.)....;  all th
0f30: 65 20 2b 7a 6c 69 62 31 32 32 32 61 64 64 20 6f  e +zlib1222add o
0f40: 66 66 73 65 74 73 20 61 72 65 20 64 75 65 20 74  ffsets are due t
0f50: 6f 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f  o the addition o
0f60: 66 20 66 69 65 6c 64 73 0d 0a 3b 20 20 69 6e 20  f fields..;  in 
0f70: 7a 6c 69 62 20 69 6e 20 74 68 65 20 64 65 66 6c  zlib in the defl
0f80: 61 74 65 5f 73 74 61 74 65 20 73 74 72 75 63 74  ate_state struct
0f90: 75 72 65 20 73 69 6e 63 65 20 74 68 65 20 61 73  ure since the as
0fa0: 6d 20 63 6f 64 65 20 77 61 73 20 66 69 72 73 74  m code was first
0fb0: 20 77 72 69 74 74 65 6e 0d 0a 3b 20 20 28 69 66   written..;  (if
0fc0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 77 69 74   you compile wit
0fd0: 68 20 7a 6c 69 62 20 31 2e 30 2e 34 20 6f 72 20  h zlib 1.0.4 or 
0fe0: 6f 6c 64 65 72 2c 20 75 73 65 20 22 7a 6c 69 62  older, use "zlib
0ff0: 31 32 32 32 61 64 64 20 65 71 75 20 28 2d 34 29  1222add equ (-4)
1000: 22 29 2e 0d 0a 3b 20 20 28 69 66 20 79 6f 75 20  ")...;  (if you 
1010: 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 7a 6c 69  compile with zli
1020: 62 20 62 65 74 77 65 65 6e 20 31 2e 30 2e 35 20  b between 1.0.5 
1030: 61 6e 64 20 31 2e 32 2e 32 2e 31 2c 20 75 73 65  and 1.2.2.1, use
1040: 20 22 7a 6c 69 62 31 32 32 32 61 64 64 20 65 71   "zlib1222add eq
1050: 75 20 30 22 29 2e 0d 0a 3b 20 20 69 66 20 79 6f  u 0")...;  if yo
1060: 75 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 7a  u compile with z
1070: 6c 69 62 20 31 2e 32 2e 32 2e 32 20 6f 72 20 6c  lib 1.2.2.2 or l
1080: 61 74 65 72 20 2c 20 75 73 65 20 22 7a 6c 69 62  ater , use "zlib
1090: 31 32 32 32 61 64 64 20 65 71 75 20 38 22 29 2e  1222add equ 8").
10a0: 0d 0a 2a 2f 0d 0a 0d 0a 0d 0a 0d 0a 2f 2a 20 79  ..*/......../* y
10b0: 6f 75 20 63 61 6e 20 63 68 65 63 6b 20 74 68 65  ou can check the
10c0: 20 73 74 72 75 63 74 75 72 65 20 6f 66 66 73 65   structure offse
10d0: 74 20 62 79 20 72 75 6e 6e 69 6e 67 0d 0a 0d 0a  t by running....
10e0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62  #include <stdlib
10f0: 2e 68 3e 0d 0a 23 69 6e 63 6c 75 64 65 20 3c 73  .h>..#include <s
1100: 74 64 69 6f 2e 68 3e 0d 0a 23 69 6e 63 6c 75 64  tdio.h>..#includ
1110: 65 20 22 64 65 66 6c 61 74 65 2e 68 22 0d 0a 0d  e "deflate.h"...
1120: 0a 76 6f 69 64 20 70 72 69 6e 74 5f 64 65 70 6c  .void print_depl
1130: 28 29 0d 0a 7b 0d 0a 64 65 66 6c 61 74 65 5f 73  ()..{..deflate_s
1140: 74 61 74 65 20 64 73 3b 0d 0a 64 65 66 6c 61 74  tate ds;..deflat
1150: 65 5f 73 74 61 74 65 20 2a 73 3d 26 64 73 3b 0d  e_state *s=&ds;.
1160: 0a 70 72 69 6e 74 66 28 22 73 69 7a 65 20 70 6f  .printf("size po
1170: 69 6e 74 65 72 3d 25 75 5c 6e 22 2c 28 69 6e 74  inter=%u\n",(int
1180: 29 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 29 3b  )sizeof(void*));
1190: 0d 0a 0d 0a 70 72 69 6e 74 66 28 22 23 64 65 66  ....printf("#def
11a0: 69 6e 65 20 64 73 57 53 69 7a 65 20 20 20 20 20  ine dsWSize     
11b0: 20 20 20 20 25 75 5c 6e 22 2c 28 69 6e 74 29 28      %u\n",(int)(
11c0: 28 28 63 68 61 72 2a 29 26 28 73 2d 3e 77 5f 73  ((char*)&(s->w_s
11d0: 69 7a 65 29 29 2d 28 28 63 68 61 72 2a 29 73 29  ize))-((char*)s)
11e0: 29 29 3b 0d 0a 70 72 69 6e 74 66 28 22 23 64 65  ));..printf("#de
11f0: 66 69 6e 65 20 64 73 57 4d 61 73 6b 20 20 20 20  fine dsWMask    
1200: 20 20 20 20 20 25 75 5c 6e 22 2c 28 69 6e 74 29       %u\n",(int)
1210: 28 28 28 63 68 61 72 2a 29 26 28 73 2d 3e 77 5f  (((char*)&(s->w_
1220: 6d 61 73 6b 29 29 2d 28 28 63 68 61 72 2a 29 73  mask))-((char*)s
1230: 29 29 29 3b 0d 0a 70 72 69 6e 74 66 28 22 23 64  )));..printf("#d
1240: 65 66 69 6e 65 20 64 73 57 69 6e 64 6f 77 20 20  efine dsWindow  
1250: 20 20 20 20 20 20 25 75 5c 6e 22 2c 28 69 6e 74        %u\n",(int
1260: 29 28 28 28 63 68 61 72 2a 29 26 28 73 2d 3e 77  )(((char*)&(s->w
1270: 69 6e 64 6f 77 29 29 2d 28 28 63 68 61 72 2a 29  indow))-((char*)
1280: 73 29 29 29 3b 0d 0a 70 72 69 6e 74 66 28 22 23  s)));..printf("#
1290: 64 65 66 69 6e 65 20 64 73 50 72 65 76 20 20 20  define dsPrev   
12a0: 20 20 20 20 20 20 20 25 75 5c 6e 22 2c 28 69 6e         %u\n",(in
12b0: 74 29 28 28 28 63 68 61 72 2a 29 26 28 73 2d 3e  t)(((char*)&(s->
12c0: 70 72 65 76 29 29 2d 28 28 63 68 61 72 2a 29 73  prev))-((char*)s
12d0: 29 29 29 3b 0d 0a 70 72 69 6e 74 66 28 22 23 64  )));..printf("#d
12e0: 65 66 69 6e 65 20 64 73 4d 61 74 63 68 4c 65 6e  efine dsMatchLen
12f0: 20 20 20 20 20 20 25 75 5c 6e 22 2c 28 69 6e 74        %u\n",(int
1300: 29 28 28 28 63 68 61 72 2a 29 26 28 73 2d 3e 6d  )(((char*)&(s->m
1310: 61 74 63 68 5f 6c 65 6e 67 74 68 29 29 2d 28 28  atch_length))-((
1320: 63 68 61 72 2a 29 73 29 29 29 3b 0d 0a 70 72 69  char*)s)));..pri
1330: 6e 74 66 28 22 23 64 65 66 69 6e 65 20 64 73 50  ntf("#define dsP
1340: 72 65 76 4d 61 74 63 68 20 20 20 20 20 25 75 5c  revMatch     %u\
1350: 6e 22 2c 28 69 6e 74 29 28 28 28 63 68 61 72 2a  n",(int)(((char*
1360: 29 26 28 73 2d 3e 70 72 65 76 5f 6d 61 74 63 68  )&(s->prev_match
1370: 29 29 2d 28 28 63 68 61 72 2a 29 73 29 29 29 3b  ))-((char*)s)));
1380: 0d 0a 70 72 69 6e 74 66 28 22 23 64 65 66 69 6e  ..printf("#defin
1390: 65 20 64 73 53 74 72 53 74 61 72 74 20 20 20 20  e dsStrStart    
13a0: 20 20 25 75 5c 6e 22 2c 28 69 6e 74 29 28 28 28    %u\n",(int)(((
13b0: 63 68 61 72 2a 29 26 28 73 2d 3e 73 74 72 73 74  char*)&(s->strst
13c0: 61 72 74 29 29 2d 28 28 63 68 61 72 2a 29 73 29  art))-((char*)s)
13d0: 29 29 3b 0d 0a 70 72 69 6e 74 66 28 22 23 64 65  ));..printf("#de
13e0: 66 69 6e 65 20 64 73 4d 61 74 63 68 53 74 61 72  fine dsMatchStar
13f0: 74 20 20 20 20 25 75 5c 6e 22 2c 28 69 6e 74 29  t    %u\n",(int)
1400: 28 28 28 63 68 61 72 2a 29 26 28 73 2d 3e 6d 61  (((char*)&(s->ma
1410: 74 63 68 5f 73 74 61 72 74 29 29 2d 28 28 63 68  tch_start))-((ch
1420: 61 72 2a 29 73 29 29 29 3b 0d 0a 70 72 69 6e 74  ar*)s)));..print
1430: 66 28 22 23 64 65 66 69 6e 65 20 64 73 4c 6f 6f  f("#define dsLoo
1440: 6b 61 68 65 61 64 20 20 20 20 20 25 75 5c 6e 22  kahead     %u\n"
1450: 2c 28 69 6e 74 29 28 28 28 63 68 61 72 2a 29 26  ,(int)(((char*)&
1460: 28 73 2d 3e 6c 6f 6f 6b 61 68 65 61 64 29 29 2d  (s->lookahead))-
1470: 28 28 63 68 61 72 2a 29 73 29 29 29 3b 0d 0a 70  ((char*)s)));..p
1480: 72 69 6e 74 66 28 22 23 64 65 66 69 6e 65 20 64  rintf("#define d
1490: 73 50 72 65 76 4c 65 6e 20 20 20 20 20 20 20 25  sPrevLen       %
14a0: 75 5c 6e 22 2c 28 69 6e 74 29 28 28 28 63 68 61  u\n",(int)(((cha
14b0: 72 2a 29 26 28 73 2d 3e 70 72 65 76 5f 6c 65 6e  r*)&(s->prev_len
14c0: 67 74 68 29 29 2d 28 28 63 68 61 72 2a 29 73 29  gth))-((char*)s)
14d0: 29 29 3b 0d 0a 70 72 69 6e 74 66 28 22 23 64 65  ));..printf("#de
14e0: 66 69 6e 65 20 64 73 4d 61 78 43 68 61 69 6e 4c  fine dsMaxChainL
14f0: 65 6e 20 20 20 25 75 5c 6e 22 2c 28 69 6e 74 29  en   %u\n",(int)
1500: 28 28 28 63 68 61 72 2a 29 26 28 73 2d 3e 6d 61  (((char*)&(s->ma
1510: 78 5f 63 68 61 69 6e 5f 6c 65 6e 67 74 68 29 29  x_chain_length))
1520: 2d 28 28 63 68 61 72 2a 29 73 29 29 29 3b 0d 0a  -((char*)s)));..
1530: 70 72 69 6e 74 66 28 22 23 64 65 66 69 6e 65 20  printf("#define 
1540: 64 73 47 6f 6f 64 4d 61 74 63 68 20 20 20 20 20  dsGoodMatch     
1550: 25 75 5c 6e 22 2c 28 69 6e 74 29 28 28 28 63 68  %u\n",(int)(((ch
1560: 61 72 2a 29 26 28 73 2d 3e 67 6f 6f 64 5f 6d 61  ar*)&(s->good_ma
1570: 74 63 68 29 29 2d 28 28 63 68 61 72 2a 29 73 29  tch))-((char*)s)
1580: 29 29 3b 0d 0a 70 72 69 6e 74 66 28 22 23 64 65  ));..printf("#de
1590: 66 69 6e 65 20 64 73 4e 69 63 65 4d 61 74 63 68  fine dsNiceMatch
15a0: 20 20 20 20 20 25 75 5c 6e 22 2c 28 69 6e 74 29       %u\n",(int)
15b0: 28 28 28 63 68 61 72 2a 29 26 28 73 2d 3e 6e 69  (((char*)&(s->ni
15c0: 63 65 5f 6d 61 74 63 68 29 29 2d 28 28 63 68 61  ce_match))-((cha
15d0: 72 2a 29 73 29 29 29 3b 0d 0a 7d 0d 0a 2a 2f 0d  r*)s)));..}..*/.
15e0: 0a 0d 0a 23 64 65 66 69 6e 65 20 64 73 57 53 69  ...#define dsWSi
15f0: 7a 65 20 20 20 20 20 20 20 20 20 20 36 38 0d 0a  ze          68..
1600: 23 64 65 66 69 6e 65 20 64 73 57 4d 61 73 6b 20  #define dsWMask 
1610: 20 20 20 20 20 20 20 20 20 37 36 0d 0a 23 64 65           76..#de
1620: 66 69 6e 65 20 64 73 57 69 6e 64 6f 77 20 20 20  fine dsWindow   
1630: 20 20 20 20 20 20 38 30 0d 0a 23 64 65 66 69 6e        80..#defin
1640: 65 20 64 73 50 72 65 76 20 20 20 20 20 20 20 20  e dsPrev        
1650: 20 20 20 39 36 0d 0a 23 64 65 66 69 6e 65 20 64     96..#define d
1660: 73 4d 61 74 63 68 4c 65 6e 20 20 20 20 20 20 20  sMatchLen       
1670: 31 34 34 0d 0a 23 64 65 66 69 6e 65 20 64 73 50  144..#define dsP
1680: 72 65 76 4d 61 74 63 68 20 20 20 20 20 20 31 34  revMatch      14
1690: 38 0d 0a 23 64 65 66 69 6e 65 20 64 73 53 74 72  8..#define dsStr
16a0: 53 74 61 72 74 20 20 20 20 20 20 20 31 35 36 0d  Start       156.
16b0: 0a 23 64 65 66 69 6e 65 20 64 73 4d 61 74 63 68  .#define dsMatch
16c0: 53 74 61 72 74 20 20 20 20 20 31 36 30 0d 0a 23  Start     160..#
16d0: 64 65 66 69 6e 65 20 64 73 4c 6f 6f 6b 61 68 65  define dsLookahe
16e0: 61 64 20 20 20 20 20 20 31 36 34 0d 0a 23 64 65  ad      164..#de
16f0: 66 69 6e 65 20 64 73 50 72 65 76 4c 65 6e 20 20  fine dsPrevLen  
1700: 20 20 20 20 20 20 31 36 38 0d 0a 23 64 65 66 69        168..#defi
1710: 6e 65 20 64 73 4d 61 78 43 68 61 69 6e 4c 65 6e  ne dsMaxChainLen
1720: 20 20 20 20 31 37 32 0d 0a 23 64 65 66 69 6e 65      172..#define
1730: 20 64 73 47 6f 6f 64 4d 61 74 63 68 20 20 20 20   dsGoodMatch    
1740: 20 20 31 38 38 0d 0a 23 64 65 66 69 6e 65 20 64    188..#define d
1750: 73 4e 69 63 65 4d 61 74 63 68 20 20 20 20 20 20  sNiceMatch      
1760: 31 39 32 0d 0a 0d 0a 23 64 65 66 69 6e 65 20 77  192....#define w
1770: 69 6e 64 6f 77 5f 73 69 7a 65 20 20 20 20 20 20  indow_size      
1780: 5b 20 72 63 78 20 2b 20 64 73 57 53 69 7a 65 5d  [ rcx + dsWSize]
1790: 0d 0a 23 64 65 66 69 6e 65 20 57 4d 61 73 6b 20  ..#define WMask 
17a0: 20 20 20 20 20 20 20 20 20 20 20 5b 20 72 63 78             [ rcx
17b0: 20 2b 20 64 73 57 4d 61 73 6b 5d 0d 0a 23 64 65   + dsWMask]..#de
17c0: 66 69 6e 65 20 77 69 6e 64 6f 77 5f 61 64 20 20  fine window_ad  
17d0: 20 20 20 20 20 20 5b 20 72 63 78 20 2b 20 64 73        [ rcx + ds
17e0: 57 69 6e 64 6f 77 5d 0d 0a 23 64 65 66 69 6e 65  Window]..#define
17f0: 20 70 72 65 76 5f 61 64 20 20 20 20 20 20 20 20   prev_ad        
1800: 20 20 5b 20 72 63 78 20 2b 20 64 73 50 72 65 76    [ rcx + dsPrev
1810: 5d 0d 0a 23 64 65 66 69 6e 65 20 73 74 72 73 74  ]..#define strst
1820: 61 72 74 20 20 20 20 20 20 20 20 20 5b 20 72 63  art         [ rc
1830: 78 20 2b 20 64 73 53 74 72 53 74 61 72 74 5d 0d  x + dsStrStart].
1840: 0a 23 64 65 66 69 6e 65 20 6d 61 74 63 68 5f 73  .#define match_s
1850: 74 61 72 74 20 20 20 20 20 20 5b 20 72 63 78 20  tart      [ rcx 
1860: 2b 20 64 73 4d 61 74 63 68 53 74 61 72 74 5d 0d  + dsMatchStart].
1870: 0a 23 64 65 66 69 6e 65 20 4c 6f 6f 6b 61 68 65  .#define Lookahe
1880: 61 64 20 20 20 20 20 20 20 20 5b 20 72 63 78 20  ad        [ rcx 
1890: 2b 20 64 73 4c 6f 6f 6b 61 68 65 61 64 5d 20 2f  + dsLookahead] /
18a0: 2f 3b 20 30 66 66 66 66 66 66 66 66 68 20 6f 6e  /; 0ffffffffh on
18b0: 20 69 6e 66 6f 7a 69 70 0d 0a 23 64 65 66 69 6e   infozip..#defin
18c0: 65 20 70 72 65 76 5f 6c 65 6e 67 74 68 20 20 20  e prev_length   
18d0: 20 20 20 5b 20 72 63 78 20 2b 20 64 73 50 72 65     [ rcx + dsPre
18e0: 76 4c 65 6e 5d 0d 0a 23 64 65 66 69 6e 65 20 6d  vLen]..#define m
18f0: 61 78 5f 63 68 61 69 6e 5f 6c 65 6e 67 74 68 20  ax_chain_length 
1900: 5b 20 72 63 78 20 2b 20 64 73 4d 61 78 43 68 61  [ rcx + dsMaxCha
1910: 69 6e 4c 65 6e 5d 0d 0a 23 64 65 66 69 6e 65 20  inLen]..#define 
1920: 67 6f 6f 64 5f 6d 61 74 63 68 20 20 20 20 20 20  good_match      
1930: 20 5b 20 72 63 78 20 2b 20 64 73 47 6f 6f 64 4d   [ rcx + dsGoodM
1940: 61 74 63 68 5d 0d 0a 23 64 65 66 69 6e 65 20 6e  atch]..#define n
1950: 69 63 65 5f 6d 61 74 63 68 20 20 20 20 20 20 20  ice_match       
1960: 5b 20 72 63 78 20 2b 20 64 73 4e 69 63 65 4d 61  [ rcx + dsNiceMa
1970: 74 63 68 5d 0d 0a 0d 0a 2f 2a 0d 0a 3b 20 77 69  tch]..../*..; wi
1980: 6e 64 6f 77 73 3a 0d 0a 3b 20 70 61 72 61 6d 65  ndows:..; parame
1990: 74 65 72 20 31 20 69 6e 20 72 63 78 28 64 65 66  ter 1 in rcx(def
19a0: 6c 61 74 65 20 73 74 61 74 65 20 73 29 2c 20 70  late state s), p
19b0: 61 72 61 6d 20 32 20 69 6e 20 72 64 78 20 28 63  aram 2 in rdx (c
19c0: 75 72 20 6d 61 74 63 68 29 0d 0a 0d 0a 3b 20 73  ur match)....; s
19d0: 65 65 20 68 74 74 70 3a 2f 2f 77 65 62 6c 6f 67  ee http://weblog
19e0: 73 2e 61 73 70 2e 6e 65 74 2f 6f 6c 64 6e 65 77  s.asp.net/oldnew
19f0: 74 68 69 6e 67 2f 61 72 63 68 69 76 65 2f 32 30  thing/archive/20
1a00: 30 34 2f 30 31 2f 31 34 2f 35 38 35 37 39 2e 61  04/01/14/58579.a
1a10: 73 70 78 20 61 6e 64 0d 0a 3b 20 68 74 74 70 3a  spx and..; http:
1a20: 2f 2f 6d 73 64 6e 2e 6d 69 63 72 6f 73 6f 66 74  //msdn.microsoft
1a30: 2e 63 6f 6d 2f 6c 69 62 72 61 72 79 2f 65 6e 2d  .com/library/en-
1a40: 75 73 2f 6b 6d 61 72 63 68 2f 68 68 2f 6b 6d 61  us/kmarch/hh/kma
1a50: 72 63 68 2f 36 34 62 69 74 41 4d 44 5f 38 65 39  rch/64bitAMD_8e9
1a60: 35 31 64 64 32 2d 65 65 37 37 2d 34 37 32 38 2d  51dd2-ee77-4728-
1a70: 38 37 30 32 2d 35 35 63 65 34 62 35 64 64 32 34  8702-55ce4b5dd24
1a80: 61 2e 78 6d 6c 2e 61 73 70 0d 0a 3b 0d 0a 3b 20  a.xml.asp..;..; 
1a90: 41 6c 6c 20 72 65 67 69 73 74 65 72 73 20 6d 75  All registers mu
1aa0: 73 74 20 62 65 20 70 72 65 73 65 72 76 65 64 20  st be preserved 
1ab0: 61 63 72 6f 73 73 20 74 68 65 20 63 61 6c 6c 2c  across the call,
1ac0: 20 65 78 63 65 70 74 20 66 6f 72 0d 0a 3b 20 20   except for..;  
1ad0: 20 72 61 78 2c 20 72 63 78 2c 20 72 64 78 2c 20   rax, rcx, rdx, 
1ae0: 72 38 2c 20 72 39 2c 20 72 31 30 2c 20 61 6e 64  r8, r9, r10, and
1af0: 20 72 31 31 2c 20 77 68 69 63 68 20 61 72 65 20   r11, which are 
1b00: 73 63 72 61 74 63 68 2e 0d 0a 0d 0a 3b 0d 0a 3b  scratch.....;..;
1b10: 20 67 63 63 20 6f 6e 20 6d 61 63 6f 73 78 2d 6c   gcc on macosx-l
1b20: 69 6e 75 78 3a 0d 0a 3b 20 73 65 65 20 68 74 74  inux:..; see htt
1b30: 70 3a 2f 2f 77 77 77 2e 78 38 36 2d 36 34 2e 6f  p://www.x86-64.o
1b40: 72 67 2f 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  rg/documentation
1b50: 2f 61 62 69 2d 30 2e 39 39 2e 70 64 66 0d 0a 3b  /abi-0.99.pdf..;
1b60: 20 70 61 72 61 6d 20 31 20 69 6e 20 72 64 69 2c   param 1 in rdi,
1b70: 20 70 61 72 61 6d 20 32 20 69 6e 20 72 73 69 0d   param 2 in rsi.
1b80: 0a 3b 20 72 62 78 2c 20 72 73 70 2c 20 72 62 70  .; rbx, rsp, rbp
1b90: 2c 20 72 31 32 20 74 6f 20 72 31 35 20 6d 75 73  , r12 to r15 mus
1ba0: 74 20 62 65 20 70 72 65 73 65 72 76 65 64 0d 0a  t be preserved..
1bb0: 0d 0a 3b 3b 3b 20 53 61 76 65 20 72 65 67 69 73  ..;;; Save regis
1bc0: 74 65 72 73 20 74 68 61 74 20 74 68 65 20 63 6f  ters that the co
1bd0: 6d 70 69 6c 65 72 20 6d 61 79 20 62 65 20 75 73  mpiler may be us
1be0: 69 6e 67 2c 20 61 6e 64 20 61 64 6a 75 73 74 20  ing, and adjust 
1bf0: 65 73 70 20 74 6f 0d 0a 3b 3b 3b 20 6d 61 6b 65  esp to..;;; make
1c00: 20 72 6f 6f 6d 20 66 6f 72 20 6f 75 72 20 73 74   room for our st
1c10: 61 63 6b 20 66 72 61 6d 65 2e 0d 0a 0d 0a 0d 0a  ack frame.......
1c20: 3b 3b 3b 20 52 65 74 72 69 65 76 65 20 74 68 65  ;;; Retrieve the
1c30: 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
1c40: 6e 74 73 2e 20 72 38 64 20 77 69 6c 6c 20 68 6f  nts. r8d will ho
1c50: 6c 64 20 63 75 72 5f 6d 61 74 63 68 0d 0a 3b 3b  ld cur_match..;;
1c60: 3b 20 74 68 72 6f 75 67 68 6f 75 74 20 74 68 65  ; throughout the
1c70: 20 65 6e 74 69 72 65 20 66 75 6e 63 74 69 6f 6e   entire function
1c80: 2e 20 65 64 78 20 77 69 6c 6c 20 68 6f 6c 64 20  . edx will hold 
1c90: 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  the pointer to t
1ca0: 68 65 0d 0a 3b 3b 3b 20 64 65 66 6c 61 74 65 5f  he..;;; deflate_
1cb0: 73 74 61 74 65 20 73 74 72 75 63 74 75 72 65 20  state structure 
1cc0: 64 75 72 69 6e 67 20 74 68 65 20 66 75 6e 63 74  during the funct
1cd0: 69 6f 6e 27 73 20 73 65 74 75 70 20 28 62 65 66  ion's setup (bef
1ce0: 6f 72 65 0d 0a 3b 3b 3b 20 65 6e 74 65 72 69 6e  ore..;;; enterin
1cf0: 67 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 2e  g the main loop.
1d00: 0d 0a 0d 0a 3b 20 6d 73 3a 20 70 61 72 61 6d 65  ....; ms: parame
1d10: 74 65 72 20 31 20 69 6e 20 72 63 78 20 28 64 65  ter 1 in rcx (de
1d20: 66 6c 61 74 65 5f 73 74 61 74 65 2a 20 73 29 2c  flate_state* s),
1d30: 20 70 61 72 61 6d 20 32 20 69 6e 20 65 64 78 20   param 2 in edx 
1d40: 2d 3e 20 72 38 20 28 63 75 72 20 6d 61 74 63 68  -> r8 (cur match
1d50: 29 0d 0a 3b 20 6d 61 63 3a 20 70 61 72 61 6d 20  )..; mac: param 
1d60: 31 20 69 6e 20 72 64 69 2c 20 70 61 72 61 6d 20  1 in rdi, param 
1d70: 32 20 72 73 69 0d 0a 3b 20 74 68 69 73 20 63 6c  2 rsi..; this cl
1d80: 65 61 72 20 68 69 67 68 20 33 32 20 62 69 74 73  ear high 32 bits
1d90: 20 6f 66 20 72 38 2c 20 77 68 69 63 68 20 63 61   of r8, which ca
1da0: 6e 20 62 65 20 67 61 72 62 61 67 65 20 69 6e 20  n be garbage in 
1db0: 62 6f 74 68 20 72 38 20 61 6e 64 20 72 64 78 0d  both r8 and rdx.
1dc0: 0a 2a 2f 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76  .*/..        mov
1dd0: 20 5b 73 61 76 65 5f 72 62 78 5d 2c 72 62 78 0d   [save_rbx],rbx.
1de0: 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 5b 73 61  .        mov [sa
1df0: 76 65 5f 72 62 70 5d 2c 72 62 70 0d 0a 0d 0a 0d  ve_rbp],rbp.....
1e00: 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 72 63 78  .        mov rcx
1e10: 2c 72 64 69 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ,rdi....        
1e20: 6d 6f 76 20 72 38 64 2c 65 73 69 0d 0a 0d 0a 0d  mov r8d,esi.....
1e30: 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 5b 73 61  .        mov [sa
1e40: 76 65 5f 72 31 32 5d 2c 72 31 32 0d 0a 20 20 20  ve_r12],r12..   
1e50: 20 20 20 20 20 6d 6f 76 20 5b 73 61 76 65 5f 72       mov [save_r
1e60: 31 33 5d 2c 72 31 33 0d 0a 20 20 20 20 20 20 20  13],r13..       
1e70: 20 6d 6f 76 20 5b 73 61 76 65 5f 72 31 34 5d 2c   mov [save_r14],
1e80: 72 31 34 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76  r14..        mov
1e90: 20 5b 73 61 76 65 5f 72 31 35 5d 2c 72 31 35 0d   [save_r15],r15.
1ea0: 0a 0d 0a 0d 0a 2f 2f 3b 3b 3b 20 75 49 6e 74 20  .....//;;; uInt 
1eb0: 77 6d 61 73 6b 20 3d 20 73 2d 3e 77 5f 6d 61 73  wmask = s->w_mas
1ec0: 6b 3b 0d 0a 2f 2f 3b 3b 3b 20 75 6e 73 69 67 6e  k;..//;;; unsign
1ed0: 65 64 20 63 68 61 69 6e 5f 6c 65 6e 67 74 68 20  ed chain_length 
1ee0: 3d 20 73 2d 3e 6d 61 78 5f 63 68 61 69 6e 5f 6c  = s->max_chain_l
1ef0: 65 6e 67 74 68 3b 0d 0a 2f 2f 3b 3b 3b 20 69 66  ength;..//;;; if
1f00: 20 28 73 2d 3e 70 72 65 76 5f 6c 65 6e 67 74 68   (s->prev_length
1f10: 20 3e 3d 20 73 2d 3e 67 6f 6f 64 5f 6d 61 74 63   >= s->good_matc
1f20: 68 29 20 7b 0d 0a 2f 2f 3b 3b 3b 20 20 20 20 20  h) {..//;;;     
1f30: 63 68 61 69 6e 5f 6c 65 6e 67 74 68 20 3e 3e 3d  chain_length >>=
1f40: 20 32 3b 0d 0a 2f 2f 3b 3b 3b 20 7d 0d 0a 0d 0a   2;..//;;; }....
1f50: 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 65 64  ..        mov ed
1f60: 69 2c 20 70 72 65 76 5f 6c 65 6e 67 74 68 0d 0a  i, prev_length..
1f70: 20 20 20 20 20 20 20 20 6d 6f 76 20 65 73 69 2c          mov esi,
1f80: 20 67 6f 6f 64 5f 6d 61 74 63 68 0d 0a 20 20 20   good_match..   
1f90: 20 20 20 20 20 6d 6f 76 20 65 61 78 2c 20 57 4d       mov eax, WM
1fa0: 61 73 6b 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76  ask..        mov
1fb0: 20 65 62 78 2c 20 6d 61 78 5f 63 68 61 69 6e 5f   ebx, max_chain_
1fc0: 6c 65 6e 67 74 68 0d 0a 20 20 20 20 20 20 20 20  length..        
1fd0: 63 6d 70 20 65 64 69 2c 20 65 73 69 0d 0a 20 20  cmp edi, esi..  
1fe0: 20 20 20 20 20 20 6a 6c 20 20 4c 61 73 74 4d 61        jl  LastMa
1ff0: 74 63 68 47 6f 6f 64 0d 0a 20 20 20 20 20 20 20  tchGood..       
2000: 20 73 68 72 20 65 62 78 2c 20 32 0d 0a 4c 61 73   shr ebx, 2..Las
2010: 74 4d 61 74 63 68 47 6f 6f 64 3a 0d 0a 0d 0a 2f  tMatchGood:..../
2020: 2f 3b 3b 3b 20 63 68 61 69 6e 6c 65 6e 20 69 73  /;;; chainlen is
2030: 20 64 65 63 72 65 6d 65 6e 74 65 64 20 6f 6e 63   decremented onc
2040: 65 20 62 65 66 6f 72 65 68 61 6e 64 20 73 6f 20  e beforehand so 
2050: 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f  that the functio
2060: 6e 20 63 61 6e 0d 0a 2f 2f 3b 3b 3b 20 75 73 65  n can..//;;; use
2070: 20 74 68 65 20 73 69 67 6e 20 66 6c 61 67 20 69   the sign flag i
2080: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 7a 65  nstead of the ze
2090: 72 6f 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20  ro flag for the 
20a0: 65 78 69 74 20 74 65 73 74 2e 0d 0a 2f 2f 3b 3b  exit test...//;;
20b0: 3b 20 49 74 20 69 73 20 74 68 65 6e 20 73 68 69  ; It is then shi
20c0: 66 74 65 64 20 69 6e 74 6f 20 74 68 65 20 68 69  fted into the hi
20d0: 67 68 20 77 6f 72 64 2c 20 74 6f 20 6d 61 6b 65  gh word, to make
20e0: 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 77 6d   room for the wm
20f0: 61 73 6b 0d 0a 2f 2f 3b 3b 3b 20 76 61 6c 75 65  ask..//;;; value
2100: 2c 20 77 68 69 63 68 20 69 74 20 77 69 6c 6c 20  , which it will 
2110: 61 6c 77 61 79 73 20 61 63 63 6f 6d 70 61 6e 79  always accompany
2120: 2e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 64 65 63  .....        dec
2130: 20 65 62 78 0d 0a 20 20 20 20 20 20 20 20 73 68   ebx..        sh
2140: 6c 20 65 62 78 2c 20 31 36 0d 0a 20 20 20 20 20  l ebx, 16..     
2150: 20 20 20 6f 72 20 20 65 62 78 2c 20 65 61 78 0d     or  ebx, eax.
2160: 0a 0d 0a 2f 2f 3b 3b 3b 20 6f 6e 20 7a 6c 69 62  ...//;;; on zlib
2170: 20 6f 6e 6c 79 0d 0a 2f 2f 3b 3b 3b 20 69 66 20   only..//;;; if 
2180: 28 28 75 49 6e 74 29 6e 69 63 65 5f 6d 61 74 63  ((uInt)nice_matc
2190: 68 20 3e 20 73 2d 3e 6c 6f 6f 6b 61 68 65 61 64  h > s->lookahead
21a0: 29 20 6e 69 63 65 5f 6d 61 74 63 68 20 3d 20 73  ) nice_match = s
21b0: 2d 3e 6c 6f 6f 6b 61 68 65 61 64 3b 0d 0a 0d 0a  ->lookahead;....
21c0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 20  ....        mov 
21d0: 65 61 78 2c 20 6e 69 63 65 5f 6d 61 74 63 68 0d  eax, nice_match.
21e0: 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 5b 63 68  .        mov [ch
21f0: 61 69 6e 6c 65 6e 77 6d 61 73 6b 5d 2c 20 65 62  ainlenwmask], eb
2200: 78 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 72  x..        mov r
2210: 31 30 64 2c 20 4c 6f 6f 6b 61 68 65 61 64 0d 0a  10d, Lookahead..
2220: 20 20 20 20 20 20 20 20 63 6d 70 20 72 31 30 64          cmp r10d
2230: 2c 20 65 61 78 0d 0a 20 20 20 20 20 20 20 20 63  , eax..        c
2240: 6d 6f 76 6e 6c 20 72 31 30 64 2c 20 65 61 78 0d  movnl r10d, eax.
2250: 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 5b 6e 69  .        mov [ni
2260: 63 65 6d 61 74 63 68 5d 2c 72 31 30 64 0d 0a 0d  cematch],r10d...
2270: 0a 0d 0a 0d 0a 2f 2f 3b 3b 3b 20 72 65 67 69 73  .....//;;; regis
2280: 74 65 72 20 42 79 74 65 66 20 2a 73 63 61 6e 20  ter Bytef *scan 
2290: 3d 20 73 2d 3e 77 69 6e 64 6f 77 20 2b 20 73 2d  = s->window + s-
22a0: 3e 73 74 72 73 74 61 72 74 3b 0d 0a 20 20 20 20  >strstart;..    
22b0: 20 20 20 20 6d 6f 76 20 72 31 30 2c 20 77 69 6e      mov r10, win
22c0: 64 6f 77 5f 61 64 0d 0a 20 20 20 20 20 20 20 20  dow_ad..        
22d0: 6d 6f 76 20 65 62 70 2c 20 73 74 72 73 74 61 72  mov ebp, strstar
22e0: 74 0d 0a 20 20 20 20 20 20 20 20 6c 65 61 20 72  t..        lea r
22f0: 31 33 2c 20 5b 72 31 30 20 2b 20 72 62 70 5d 0d  13, [r10 + rbp].
2300: 0a 0d 0a 2f 2f 3b 3b 3b 20 44 65 74 65 72 6d 69  ...//;;; Determi
2310: 6e 65 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65  ne how many byte
2320: 73 20 74 68 65 20 73 63 61 6e 20 70 74 72 20 69  s the scan ptr i
2330: 73 20 6f 66 66 20 66 72 6f 6d 20 62 65 69 6e 67  s off from being
2340: 0d 0a 2f 2f 3b 3b 3b 20 64 77 6f 72 64 2d 61 6c  ..//;;; dword-al
2350: 69 67 6e 65 64 2e 0d 0a 0d 0a 20 20 20 20 20 20  igned.....      
2360: 20 20 20 6d 6f 76 20 72 39 2c 72 31 33 0d 0a 20     mov r9,r13.. 
2370: 20 20 20 20 20 20 20 20 6e 65 67 20 72 31 33 0d          neg r13.
2380: 0a 20 20 20 20 20 20 20 20 20 61 6e 64 20 72 31  .         and r1
2390: 33 2c 33 0d 0a 0d 0a 2f 2f 3b 3b 3b 20 49 50 6f  3,3....//;;; IPo
23a0: 73 20 6c 69 6d 69 74 20 3d 20 73 2d 3e 73 74 72  s limit = s->str
23b0: 73 74 61 72 74 20 3e 20 28 49 50 6f 73 29 4d 41  start > (IPos)MA
23c0: 58 5f 44 49 53 54 28 73 29 20 3f 0d 0a 2f 2f 3b  X_DIST(s) ?..//;
23d0: 3b 3b 20 20 20 20 20 73 2d 3e 73 74 72 73 74 61  ;;     s->strsta
23e0: 72 74 20 2d 20 28 49 50 6f 73 29 4d 41 58 5f 44  rt - (IPos)MAX_D
23f0: 49 53 54 28 73 29 20 3a 20 4e 49 4c 3b 0d 0a 0d  IST(s) : NIL;...
2400: 0a 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 65  ...        mov e
2410: 61 78 2c 20 77 69 6e 64 6f 77 5f 73 69 7a 65 0d  ax, window_size.
2420: 0a 20 20 20 20 20 20 20 20 73 75 62 20 65 61 78  .        sub eax
2430: 2c 20 4d 49 4e 5f 4c 4f 4f 4b 41 48 45 41 44 0d  , MIN_LOOKAHEAD.
2440: 0a 0d 0a 0d 0a 20 20 20 20 20 20 20 20 78 6f 72  .....        xor
2450: 20 65 64 69 2c 65 64 69 0d 0a 20 20 20 20 20 20   edi,edi..      
2460: 20 20 73 75 62 20 65 62 70 2c 20 65 61 78 0d 0a    sub ebp, eax..
2470: 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 72 31  ..        mov r1
2480: 31 64 2c 20 70 72 65 76 5f 6c 65 6e 67 74 68 0d  1d, prev_length.
2490: 0a 0d 0a 20 20 20 20 20 20 20 20 63 6d 6f 76 6e  ...        cmovn
24a0: 67 20 65 62 70 2c 65 64 69 0d 0a 0d 0a 2f 2f 3b  g ebp,edi....//;
24b0: 3b 3b 20 69 6e 74 20 62 65 73 74 5f 6c 65 6e 20  ;; int best_len 
24c0: 3d 20 73 2d 3e 70 72 65 76 5f 6c 65 6e 67 74 68  = s->prev_length
24d0: 3b 0d 0a 0d 0a 0d 0a 2f 2f 3b 3b 3b 20 53 74 6f  ;......//;;; Sto
24e0: 72 65 20 74 68 65 20 73 75 6d 20 6f 66 20 73 2d  re the sum of s-
24f0: 3e 77 69 6e 64 6f 77 20 2b 20 62 65 73 74 5f 6c  >window + best_l
2500: 65 6e 20 69 6e 20 65 73 69 20 6c 6f 63 61 6c 6c  en in esi locall
2510: 79 2c 20 61 6e 64 20 69 6e 20 65 73 69 2e 0d 0a  y, and in esi...
2520: 0d 0a 20 20 20 20 20 20 20 6c 65 61 20 20 72 73  ..       lea  rs
2530: 69 2c 5b 72 31 30 2b 72 31 31 5d 0d 0a 0d 0a 2f  i,[r10+r11]..../
2540: 2f 3b 3b 3b 20 72 65 67 69 73 74 65 72 20 75 73  /;;; register us
2550: 68 20 73 63 61 6e 5f 73 74 61 72 74 20 3d 20 2a  h scan_start = *
2560: 28 75 73 68 66 2a 29 73 63 61 6e 3b 0d 0a 2f 2f  (ushf*)scan;..//
2570: 3b 3b 3b 20 72 65 67 69 73 74 65 72 20 75 73 68  ;;; register ush
2580: 20 73 63 61 6e 5f 65 6e 64 20 20 20 3d 20 2a 28   scan_end   = *(
2590: 75 73 68 66 2a 29 28 73 63 61 6e 2b 62 65 73 74  ushf*)(scan+best
25a0: 5f 6c 65 6e 2d 31 29 3b 0d 0a 2f 2f 3b 3b 3b 20  _len-1);..//;;; 
25b0: 50 6f 73 66 20 2a 70 72 65 76 20 3d 20 73 2d 3e  Posf *prev = s->
25c0: 70 72 65 76 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  prev;....       
25d0: 20 6d 6f 76 7a 78 20 72 31 32 64 2c 77 6f 72 64   movzx r12d,word
25e0: 20 70 74 72 20 5b 72 39 5d 0d 0a 20 20 20 20 20   ptr [r9]..     
25f0: 20 20 20 6d 6f 76 7a 78 20 65 62 78 2c 20 77 6f     movzx ebx, wo
2600: 72 64 20 70 74 72 20 5b 72 39 20 2b 20 72 31 31  rd ptr [r9 + r11
2610: 20 2d 20 31 5d 0d 0a 0d 0a 20 20 20 20 20 20 20   - 1]....       
2620: 20 6d 6f 76 20 72 64 69 2c 20 70 72 65 76 5f 61   mov rdi, prev_a
2630: 64 0d 0a 0d 0a 2f 2f 3b 3b 3b 20 4a 75 6d 70 20  d....//;;; Jump 
2640: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6c 6f  into the main lo
2650: 6f 70 2e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6d  op.....        m
2660: 6f 76 20 65 64 78 2c 20 5b 63 68 61 69 6e 6c 65  ov edx, [chainle
2670: 6e 77 6d 61 73 6b 5d 0d 0a 0d 0a 20 20 20 20 20  nwmask]....     
2680: 20 20 20 63 6d 70 20 62 78 2c 77 6f 72 64 20 70     cmp bx,word p
2690: 74 72 20 5b 72 73 69 20 2b 20 72 38 20 2d 20 31  tr [rsi + r8 - 1
26a0: 5d 0d 0a 20 20 20 20 20 20 20 20 6a 7a 20 20 4c  ]..        jz  L
26b0: 6f 6f 6b 75 70 4c 6f 6f 70 49 73 5a 65 72 6f 0d  ookupLoopIsZero.
26c0: 0a 09 09 09 09 0d 0a 09 09 09 09 09 09 0d 0a 09  ................
26d0: 09 09 09 09 09 0d 0a 4c 6f 6f 6b 75 70 4c 6f 6f  .......LookupLoo
26e0: 70 31 3a 0d 0a 20 20 20 20 20 20 20 20 61 6e 64  p1:..        and
26f0: 20 72 38 64 2c 20 65 64 78 0d 0a 0d 0a 20 20 20   r8d, edx....   
2700: 20 20 20 20 20 6d 6f 76 7a 78 20 20 20 72 38 64       movzx   r8d
2710: 2c 20 77 6f 72 64 20 70 74 72 20 5b 72 64 69 20  , word ptr [rdi 
2720: 2b 20 72 38 2a 32 5d 0d 0a 20 20 20 20 20 20 20  + r8*2]..       
2730: 20 63 6d 70 20 72 38 64 2c 20 65 62 70 0d 0a 20   cmp r8d, ebp.. 
2740: 20 20 20 20 20 20 20 6a 62 65 20 4c 65 61 76 65         jbe Leave
2750: 4e 6f 77 0d 0a 09 09 0d 0a 09 09 0d 0a 09 09 0d  Now.............
2760: 0a 20 20 20 20 20 20 20 20 73 75 62 20 65 64 78  .        sub edx
2770: 2c 20 30 78 30 30 30 31 30 30 30 30 0d 0a 09 09  , 0x00010000....
2780: 42 45 46 4f 52 45 5f 4a 4d 50 0d 0a 20 20 20 20  BEFORE_JMP..    
2790: 20 20 20 20 6a 73 20 20 4c 65 61 76 65 4e 6f 77      js  LeaveNow
27a0: 0d 0a 09 09 41 46 54 45 52 5f 4a 4d 50 0d 0a 0d  ....AFTER_JMP...
27b0: 0a 4c 6f 6f 70 45 6e 74 72 79 31 3a 0d 0a 20 20  .LoopEntry1:..  
27c0: 20 20 20 20 20 20 63 6d 70 20 62 78 2c 77 6f 72        cmp bx,wor
27d0: 64 20 70 74 72 20 5b 72 73 69 20 2b 20 72 38 20  d ptr [rsi + r8 
27e0: 2d 20 31 5d 0d 0a 09 09 42 45 46 4f 52 45 5f 4a  - 1]....BEFORE_J
27f0: 4d 50 0d 0a 20 20 20 20 20 20 20 20 6a 7a 20 20  MP..        jz  
2800: 4c 6f 6f 6b 75 70 4c 6f 6f 70 49 73 5a 65 72 6f  LookupLoopIsZero
2810: 0d 0a 09 09 41 46 54 45 52 5f 4a 4d 50 0d 0a 0d  ....AFTER_JMP...
2820: 0a 4c 6f 6f 6b 75 70 4c 6f 6f 70 32 3a 0d 0a 20  .LookupLoop2:.. 
2830: 20 20 20 20 20 20 20 61 6e 64 20 72 38 64 2c 20         and r8d, 
2840: 65 64 78 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6d  edx....        m
2850: 6f 76 7a 78 20 20 20 72 38 64 2c 20 77 6f 72 64  ovzx   r8d, word
2860: 20 70 74 72 20 5b 72 64 69 20 2b 20 72 38 2a 32   ptr [rdi + r8*2
2870: 5d 0d 0a 20 20 20 20 20 20 20 20 63 6d 70 20 72  ]..        cmp r
2880: 38 64 2c 20 65 62 70 0d 0a 09 09 42 45 46 4f 52  8d, ebp....BEFOR
2890: 45 5f 4a 4d 50 0d 0a 20 20 20 20 20 20 20 20 6a  E_JMP..        j
28a0: 62 65 20 4c 65 61 76 65 4e 6f 77 0d 0a 09 09 41  be LeaveNow....A
28b0: 46 54 45 52 5f 4a 4d 50 0d 0a 20 20 20 20 20 20  FTER_JMP..      
28c0: 20 20 73 75 62 20 65 64 78 2c 20 30 78 30 30 30    sub edx, 0x000
28d0: 31 30 30 30 30 0d 0a 09 09 42 45 46 4f 52 45 5f  10000....BEFORE_
28e0: 4a 4d 50 0d 0a 20 20 20 20 20 20 20 20 6a 73 20  JMP..        js 
28f0: 20 4c 65 61 76 65 4e 6f 77 0d 0a 09 09 41 46 54   LeaveNow....AFT
2900: 45 52 5f 4a 4d 50 0d 0a 0d 0a 4c 6f 6f 70 45 6e  ER_JMP....LoopEn
2910: 74 72 79 32 3a 0d 0a 20 20 20 20 20 20 20 20 63  try2:..        c
2920: 6d 70 20 62 78 2c 77 6f 72 64 20 70 74 72 20 5b  mp bx,word ptr [
2930: 72 73 69 20 2b 20 72 38 20 2d 20 31 5d 0d 0a 09  rsi + r8 - 1]...
2940: 09 42 45 46 4f 52 45 5f 4a 4d 50 0d 0a 20 20 20  .BEFORE_JMP..   
2950: 20 20 20 20 20 6a 7a 20 20 4c 6f 6f 6b 75 70 4c       jz  LookupL
2960: 6f 6f 70 49 73 5a 65 72 6f 0d 0a 09 09 41 46 54  oopIsZero....AFT
2970: 45 52 5f 4a 4d 50 0d 0a 0d 0a 4c 6f 6f 6b 75 70  ER_JMP....Lookup
2980: 4c 6f 6f 70 34 3a 0d 0a 20 20 20 20 20 20 20 20  Loop4:..        
2990: 61 6e 64 20 72 38 64 2c 20 65 64 78 0d 0a 0d 0a  and r8d, edx....
29a0: 20 20 20 20 20 20 20 20 6d 6f 76 7a 78 20 20 20          movzx   
29b0: 72 38 64 2c 20 77 6f 72 64 20 70 74 72 20 5b 72  r8d, word ptr [r
29c0: 64 69 20 2b 20 72 38 2a 32 5d 0d 0a 20 20 20 20  di + r8*2]..    
29d0: 20 20 20 20 63 6d 70 20 72 38 64 2c 20 65 62 70      cmp r8d, ebp
29e0: 0d 0a 09 09 42 45 46 4f 52 45 5f 4a 4d 50 0d 0a  ....BEFORE_JMP..
29f0: 20 20 20 20 20 20 20 20 6a 62 65 20 4c 65 61 76          jbe Leav
2a00: 65 4e 6f 77 0d 0a 09 09 41 46 54 45 52 5f 4a 4d  eNow....AFTER_JM
2a10: 50 0d 0a 20 20 20 20 20 20 20 20 73 75 62 20 65  P..        sub e
2a20: 64 78 2c 20 30 78 30 30 30 31 30 30 30 30 0d 0a  dx, 0x00010000..
2a30: 09 09 42 45 46 4f 52 45 5f 4a 4d 50 0d 0a 20 20  ..BEFORE_JMP..  
2a40: 20 20 20 20 20 20 6a 73 20 20 4c 65 61 76 65 4e        js  LeaveN
2a50: 6f 77 0d 0a 09 09 41 46 54 45 52 5f 4a 4d 50 0d  ow....AFTER_JMP.
2a60: 0a 0d 0a 4c 6f 6f 70 45 6e 74 72 79 34 3a 0d 0a  ...LoopEntry4:..
2a70: 0d 0a 20 20 20 20 20 20 20 20 63 6d 70 20 62 78  ..        cmp bx
2a80: 2c 77 6f 72 64 20 70 74 72 20 5b 72 73 69 20 2b  ,word ptr [rsi +
2a90: 20 72 38 20 2d 20 31 5d 0d 0a 09 09 42 45 46 4f   r8 - 1]....BEFO
2aa0: 52 45 5f 4a 4d 50 0d 0a 20 20 20 20 20 20 20 20  RE_JMP..        
2ab0: 6a 6e 7a 20 4c 6f 6f 6b 75 70 4c 6f 6f 70 31 0d  jnz LookupLoop1.
2ac0: 0a 20 20 20 20 20 20 20 20 6a 6d 70 20 4c 6f 6f  .        jmp Loo
2ad0: 6b 75 70 4c 6f 6f 70 49 73 5a 65 72 6f 0d 0a 09  kupLoopIsZero...
2ae0: 09 41 46 54 45 52 5f 4a 4d 50 0d 0a 2f 2a 0d 0a  .AFTER_JMP../*..
2af0: 3b 3b 3b 20 64 6f 20 7b 0d 0a 3b 3b 3b 20 20 20  ;;; do {..;;;   
2b00: 20 20 6d 61 74 63 68 20 3d 20 73 2d 3e 77 69 6e    match = s->win
2b10: 64 6f 77 20 2b 20 63 75 72 5f 6d 61 74 63 68 3b  dow + cur_match;
2b20: 0d 0a 3b 3b 3b 20 20 20 20 20 69 66 20 28 2a 28  ..;;;     if (*(
2b30: 75 73 68 66 2a 29 28 6d 61 74 63 68 2b 62 65 73  ushf*)(match+bes
2b40: 74 5f 6c 65 6e 2d 31 29 20 21 3d 20 73 63 61 6e  t_len-1) != scan
2b50: 5f 65 6e 64 20 7c 7c 0d 0a 3b 3b 3b 20 20 20 20  _end ||..;;;    
2b60: 20 20 20 20 20 2a 28 75 73 68 66 2a 29 6d 61 74       *(ushf*)mat
2b70: 63 68 20 21 3d 20 73 63 61 6e 5f 73 74 61 72 74  ch != scan_start
2b80: 29 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 3b 3b 3b  ) continue;..;;;
2b90: 20 20 20 20 20 5b 2e 2e 2e 5d 0d 0a 3b 3b 3b 20       [...]..;;; 
2ba0: 7d 20 77 68 69 6c 65 20 28 28 63 75 72 5f 6d 61  } while ((cur_ma
2bb0: 74 63 68 20 3d 20 70 72 65 76 5b 63 75 72 5f 6d  tch = prev[cur_m
2bc0: 61 74 63 68 20 26 20 77 6d 61 73 6b 5d 29 20 3e  atch & wmask]) >
2bd0: 20 6c 69 6d 69 74 0d 0a 3b 3b 3b 20 20 20 20 20   limit..;;;     
2be0: 20 20 20 20 20 26 26 20 2d 2d 63 68 61 69 6e 5f       && --chain_
2bf0: 6c 65 6e 67 74 68 20 21 3d 20 30 29 3b 0d 0a 3b  length != 0);..;
2c00: 3b 3b 0d 0a 3b 3b 3b 20 48 65 72 65 20 69 73 20  ;;..;;; Here is 
2c10: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 6f  the inner loop o
2c20: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20  f the function. 
2c30: 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  The function wil
2c40: 6c 20 73 70 65 6e 64 20 74 68 65 0d 0a 3b 3b 3b  l spend the..;;;
2c50: 20 6d 61 6a 6f 72 69 74 79 20 6f 66 20 69 74 73   majority of its
2c60: 20 74 69 6d 65 20 69 6e 20 74 68 69 73 20 6c 6f   time in this lo
2c70: 6f 70 2c 20 61 6e 64 20 6d 61 6a 6f 72 69 74 79  op, and majority
2c80: 20 6f 66 20 74 68 61 74 20 74 69 6d 65 20 77 69   of that time wi
2c90: 6c 6c 0d 0a 3b 3b 3b 20 62 65 20 73 70 65 6e 74  ll..;;; be spent
2ca0: 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 74 65   in the first te
2cb0: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 0d  n instructions..
2cc0: 0a 3b 3b 3b 0d 0a 3b 3b 3b 20 57 69 74 68 69 6e  .;;;..;;; Within
2cd0: 20 74 68 69 73 20 6c 6f 6f 70 3a 0d 0a 3b 3b 3b   this loop:..;;;
2ce0: 20 65 62 78 20 3d 20 73 63 61 6e 65 6e 64 0d 0a   ebx = scanend..
2cf0: 3b 3b 3b 20 72 38 64 20 3d 20 63 75 72 6d 61 74  ;;; r8d = curmat
2d00: 63 68 0d 0a 3b 3b 3b 20 65 64 78 20 3d 20 63 68  ch..;;; edx = ch
2d10: 61 69 6e 6c 65 6e 77 6d 61 73 6b 20 2d 20 69 2e  ainlenwmask - i.
2d20: 65 2e 2c 20 28 28 63 68 61 69 6e 6c 65 6e 20 3c  e., ((chainlen <
2d30: 3c 20 31 36 29 20 7c 20 77 6d 61 73 6b 29 0d 0a  < 16) | wmask)..
2d40: 3b 3b 3b 20 65 73 69 20 3d 20 77 69 6e 64 6f 77  ;;; esi = window
2d50: 62 65 73 74 6c 65 6e 20 2d 20 69 2e 65 2e 2c 20  bestlen - i.e., 
2d60: 28 77 69 6e 64 6f 77 20 2b 20 62 65 73 74 6c 65  (window + bestle
2d70: 6e 29 0d 0a 3b 3b 3b 20 65 64 69 20 3d 20 70 72  n)..;;; edi = pr
2d80: 65 76 0d 0a 3b 3b 3b 20 65 62 70 20 3d 20 6c 69  ev..;;; ebp = li
2d90: 6d 69 74 0d 0a 2a 2f 0d 0a 2e 62 61 6c 69 67 6e  mit..*/...balign
2da0: 20 31 36 0d 0a 4c 6f 6f 6b 75 70 4c 6f 6f 70 3a   16..LookupLoop:
2db0: 0d 0a 20 20 20 20 20 20 20 20 61 6e 64 20 72 38  ..        and r8
2dc0: 64 2c 20 65 64 78 0d 0a 0d 0a 20 20 20 20 20 20  d, edx....      
2dd0: 20 20 6d 6f 76 7a 78 20 20 20 72 38 64 2c 20 77    movzx   r8d, w
2de0: 6f 72 64 20 70 74 72 20 5b 72 64 69 20 2b 20 72  ord ptr [rdi + r
2df0: 38 2a 32 5d 0d 0a 20 20 20 20 20 20 20 20 63 6d  8*2]..        cm
2e00: 70 20 72 38 64 2c 20 65 62 70 0d 0a 09 09 42 45  p r8d, ebp....BE
2e10: 46 4f 52 45 5f 4a 4d 50 0d 0a 20 20 20 20 20 20  FORE_JMP..      
2e20: 20 20 6a 62 65 20 4c 65 61 76 65 4e 6f 77 0d 0a    jbe LeaveNow..
2e30: 09 09 41 46 54 45 52 5f 4a 4d 50 0d 0a 20 20 20  ..AFTER_JMP..   
2e40: 20 20 20 20 20 73 75 62 20 65 64 78 2c 20 30 78       sub edx, 0x
2e50: 30 30 30 31 30 30 30 30 0d 0a 09 09 42 45 46 4f  00010000....BEFO
2e60: 52 45 5f 4a 4d 50 0d 0a 20 20 20 20 20 20 20 20  RE_JMP..        
2e70: 6a 73 20 20 4c 65 61 76 65 4e 6f 77 0d 0a 09 09  js  LeaveNow....
2e80: 41 46 54 45 52 5f 4a 4d 50 0d 0a 0d 0a 4c 6f 6f  AFTER_JMP....Loo
2e90: 70 45 6e 74 72 79 3a 0d 0a 0d 0a 20 20 20 20 20  pEntry:....     
2ea0: 20 20 20 63 6d 70 20 62 78 2c 77 6f 72 64 20 70     cmp bx,word p
2eb0: 74 72 20 5b 72 73 69 20 2b 20 72 38 20 2d 20 31  tr [rsi + r8 - 1
2ec0: 5d 0d 0a 09 09 42 45 46 4f 52 45 5f 4a 4d 50 0d  ]....BEFORE_JMP.
2ed0: 0a 20 20 20 20 20 20 20 20 6a 6e 7a 20 4c 6f 6f  .        jnz Loo
2ee0: 6b 75 70 4c 6f 6f 70 31 0d 0a 09 09 41 46 54 45  kupLoop1....AFTE
2ef0: 52 5f 4a 4d 50 0d 0a 4c 6f 6f 6b 75 70 4c 6f 6f  R_JMP..LookupLoo
2f00: 70 49 73 5a 65 72 6f 3a 0d 0a 20 20 20 20 20 20  pIsZero:..      
2f10: 20 20 63 6d 70 20 20 20 20 20 72 31 32 77 2c 20    cmp     r12w, 
2f20: 77 6f 72 64 20 70 74 72 20 5b 72 31 30 20 2b 20  word ptr [r10 + 
2f30: 72 38 5d 0d 0a 09 09 42 45 46 4f 52 45 5f 4a 4d  r8]....BEFORE_JM
2f40: 50 0d 0a 20 20 20 20 20 20 20 20 6a 6e 7a 20 4c  P..        jnz L
2f50: 6f 6f 6b 75 70 4c 6f 6f 70 31 0d 0a 09 09 41 46  ookupLoop1....AF
2f60: 54 45 52 5f 4a 4d 50 0d 0a 0d 0a 0d 0a 2f 2f 3b  TER_JMP......//;
2f70: 3b 3b 20 53 74 6f 72 65 20 74 68 65 20 63 75 72  ;; Store the cur
2f80: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 63 68  rent value of ch
2f90: 61 69 6e 6c 65 6e 2e 0d 0a 20 20 20 20 20 20 20  ainlen...       
2fa0: 20 6d 6f 76 20 5b 63 68 61 69 6e 6c 65 6e 77 6d   mov [chainlenwm
2fb0: 61 73 6b 5d 2c 20 65 64 78 0d 0a 2f 2a 0d 0a 3b  ask], edx../*..;
2fc0: 3b 3b 20 50 6f 69 6e 74 20 65 64 69 20 74 6f 20  ;; Point edi to 
2fd0: 74 68 65 20 73 74 72 69 6e 67 20 75 6e 64 65 72  the string under
2fe0: 20 73 63 72 75 74 69 6e 79 2c 20 61 6e 64 20 65   scrutiny, and e
2ff0: 73 69 20 74 6f 20 74 68 65 20 73 74 72 69 6e 67  si to the string
3000: 20 77 65 0d 0a 3b 3b 3b 20 61 72 65 20 68 6f 70   we..;;; are hop
3010: 69 6e 67 20 74 6f 20 6d 61 74 63 68 20 69 74 20  ing to match it 
3020: 75 70 20 77 69 74 68 2e 20 49 6e 20 61 63 74 75  up with. In actu
3030: 61 6c 69 74 79 2c 20 65 73 69 20 61 6e 64 20 65  ality, esi and e
3040: 64 69 20 61 72 65 0d 0a 3b 3b 3b 20 62 6f 74 68  di are..;;; both
3050: 20 70 6f 69 6e 74 65 64 20 28 4d 41 58 5f 4d 41   pointed (MAX_MA
3060: 54 43 48 5f 38 20 2d 20 73 63 61 6e 61 6c 69 67  TCH_8 - scanalig
3070: 6e 29 20 62 79 74 65 73 20 61 68 65 61 64 2c 20  n) bytes ahead, 
3080: 61 6e 64 20 65 64 78 20 69 73 0d 0a 3b 3b 3b 20  and edx is..;;; 
3090: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 2d  initialized to -
30a0: 28 4d 41 58 5f 4d 41 54 43 48 5f 38 20 2d 20 73  (MAX_MATCH_8 - s
30b0: 63 61 6e 61 6c 69 67 6e 29 2e 0d 0a 2a 2f 0d 0a  canalign)...*/..
30c0: 20 20 20 20 20 20 20 20 6c 65 61 20 72 73 69 2c          lea rsi,
30d0: 5b 72 38 2b 72 31 30 5d 0d 0a 20 20 20 20 20 20  [r8+r10]..      
30e0: 20 20 6d 6f 76 20 72 64 78 2c 20 30 78 66 66 66    mov rdx, 0xfff
30f0: 66 66 66 66 66 66 66 66 66 66 65 66 38 20 2f 2f  ffffffffffef8 //
3100: 3b 20 2d 28 4d 41 58 5f 4d 41 54 43 48 5f 38 29  ; -(MAX_MATCH_8)
3110: 0d 0a 20 20 20 20 20 20 20 20 6c 65 61 20 72 73  ..        lea rs
3120: 69 2c 20 5b 72 73 69 20 2b 20 72 31 33 20 2b 20  i, [rsi + r13 + 
3130: 30 78 30 31 30 38 5d 20 2f 2f 3b 4d 41 58 5f 4d  0x0108] //;MAX_M
3140: 41 54 43 48 5f 38 5d 0d 0a 20 20 20 20 20 20 20  ATCH_8]..       
3150: 20 6c 65 61 20 72 64 69 2c 20 5b 72 39 20 2b 20   lea rdi, [r9 + 
3160: 72 31 33 20 2b 20 30 78 30 31 30 38 5d 20 2f 2f  r13 + 0x0108] //
3170: 3b 4d 41 58 5f 4d 41 54 43 48 5f 38 5d 0d 0a 0d  ;MAX_MATCH_8]...
3180: 0a 20 20 20 20 20 20 20 20 70 72 65 66 65 74 63  .        prefetc
3190: 68 74 31 20 5b 72 73 69 2b 72 64 78 5d 0d 0a 20  ht1 [rsi+rdx].. 
31a0: 20 20 20 20 20 20 20 70 72 65 66 65 74 63 68 74         prefetcht
31b0: 31 20 5b 72 64 69 2b 72 64 78 5d 0d 0a 0d 0a 2f  1 [rdi+rdx]..../
31c0: 2a 0d 0a 3b 3b 3b 20 54 65 73 74 20 74 68 65 20  *..;;; Test the 
31d0: 73 74 72 69 6e 67 73 20 66 6f 72 20 65 71 75 61  strings for equa
31e0: 6c 69 74 79 2c 20 38 20 62 79 74 65 73 20 61 74  lity, 8 bytes at
31f0: 20 61 20 74 69 6d 65 2e 20 41 74 20 74 68 65 20   a time. At the 
3200: 65 6e 64 2c 0d 0a 3b 3b 3b 20 61 64 6a 75 73 74  end,..;;; adjust
3210: 20 72 64 78 20 73 6f 20 74 68 61 74 20 69 74 20   rdx so that it 
3220: 69 73 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  is offset to the
3230: 20 65 78 61 63 74 20 62 79 74 65 20 74 68 61 74   exact byte that
3240: 20 6d 69 73 6d 61 74 63 68 65 64 2e 0d 0a 3b 3b   mismatched...;;
3250: 3b 0d 0a 3b 3b 3b 20 57 65 20 61 6c 72 65 61 64  ;..;;; We alread
3260: 79 20 6b 6e 6f 77 20 61 74 20 74 68 69 73 20 70  y know at this p
3270: 6f 69 6e 74 20 74 68 61 74 20 74 68 65 20 66 69  oint that the fi
3280: 72 73 74 20 74 68 72 65 65 20 62 79 74 65 73 20  rst three bytes 
3290: 6f 66 20 74 68 65 0d 0a 3b 3b 3b 20 73 74 72 69  of the..;;; stri
32a0: 6e 67 73 20 6d 61 74 63 68 20 65 61 63 68 20 6f  ngs match each o
32b0: 74 68 65 72 2c 20 61 6e 64 20 74 68 65 79 20 63  ther, and they c
32c0: 61 6e 20 62 65 20 73 61 66 65 6c 79 20 70 61 73  an be safely pas
32d0: 73 65 64 20 6f 76 65 72 20 62 65 66 6f 72 65 0d  sed over before.
32e0: 0a 3b 3b 3b 20 73 74 61 72 74 69 6e 67 20 74 68  .;;; starting th
32f0: 65 20 63 6f 6d 70 61 72 65 20 6c 6f 6f 70 2e 20  e compare loop. 
3300: 53 6f 20 77 68 61 74 20 74 68 69 73 20 63 6f 64  So what this cod
3310: 65 20 64 6f 65 73 20 69 73 20 73 6b 69 70 20 6f  e does is skip o
3320: 76 65 72 20 30 2d 33 0d 0a 3b 3b 3b 20 62 79 74  ver 0-3..;;; byt
3330: 65 73 2c 20 61 73 20 6d 75 63 68 20 61 73 20 6e  es, as much as n
3340: 65 63 65 73 73 61 72 79 20 69 6e 20 6f 72 64 65  ecessary in orde
3350: 72 20 74 6f 20 64 77 6f 72 64 2d 61 6c 69 67 6e  r to dword-align
3360: 20 74 68 65 20 65 64 69 0d 0a 3b 3b 3b 20 70 6f   the edi..;;; po
3370: 69 6e 74 65 72 2e 20 28 72 73 69 20 77 69 6c 6c  inter. (rsi will
3380: 20 73 74 69 6c 6c 20 62 65 20 6d 69 73 61 6c 69   still be misali
3390: 67 6e 65 64 20 74 68 72 65 65 20 74 69 6d 65 73  gned three times
33a0: 20 6f 75 74 20 6f 66 20 66 6f 75 72 2e 29 0d 0a   out of four.)..
33b0: 3b 3b 3b 0d 0a 3b 3b 3b 20 49 74 20 73 68 6f 75  ;;;..;;; It shou
33c0: 6c 64 20 62 65 20 63 6f 6e 66 65 73 73 65 64 20  ld be confessed 
33d0: 74 68 61 74 20 74 68 69 73 20 6c 6f 6f 70 20 75  that this loop u
33e0: 73 75 61 6c 6c 79 20 64 6f 65 73 20 6e 6f 74 20  sually does not 
33f0: 72 65 70 72 65 73 65 6e 74 0d 0a 3b 3b 3b 20 6d  represent..;;; m
3400: 75 63 68 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  uch of the total
3410: 20 72 75 6e 6e 69 6e 67 20 74 69 6d 65 2e 20 52   running time. R
3420: 65 70 6c 61 63 69 6e 67 20 69 74 20 77 69 74 68  eplacing it with
3430: 20 61 20 6d 6f 72 65 0d 0a 3b 3b 3b 20 73 74 72   a more..;;; str
3440: 61 69 67 68 74 66 6f 72 77 61 72 64 20 22 72 65  aightforward "re
3450: 70 20 63 6d 70 73 62 22 20 77 6f 75 6c 64 20 6e  p cmpsb" would n
3460: 6f 74 20 64 72 61 73 74 69 63 61 6c 6c 79 20 64  ot drastically d
3470: 65 67 72 61 64 65 0d 0a 3b 3b 3b 20 70 65 72 66  egrade..;;; perf
3480: 6f 72 6d 61 6e 63 65 2e 0d 0a 2a 2f 0d 0a 0d 0a  ormance...*/....
3490: 4c 6f 6f 70 43 6d 70 73 3a 0d 0a 20 20 20 20 20  LoopCmps:..     
34a0: 20 20 20 6d 6f 76 20 72 61 78 2c 20 5b 72 73 69     mov rax, [rsi
34b0: 20 2b 20 72 64 78 5d 0d 0a 20 20 20 20 20 20 20   + rdx]..       
34c0: 20 78 6f 72 20 72 61 78 2c 20 5b 72 64 69 20 2b   xor rax, [rdi +
34d0: 20 72 64 78 5d 0d 0a 20 20 20 20 20 20 20 20 6a   rdx]..        j
34e0: 6e 7a 20 4c 65 61 76 65 4c 6f 6f 70 43 6d 70 73  nz LeaveLoopCmps
34f0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 20  ....        mov 
3500: 72 61 78 2c 20 5b 72 73 69 20 2b 20 72 64 78 20  rax, [rsi + rdx 
3510: 2b 20 38 5d 0d 0a 20 20 20 20 20 20 20 20 78 6f  + 8]..        xo
3520: 72 20 72 61 78 2c 20 5b 72 64 69 20 2b 20 72 64  r rax, [rdi + rd
3530: 78 20 2b 20 38 5d 0d 0a 20 20 20 20 20 20 20 20  x + 8]..        
3540: 6a 6e 7a 20 4c 65 61 76 65 4c 6f 6f 70 43 6d 70  jnz LeaveLoopCmp
3550: 73 38 0d 0a 0d 0a 0d 0a 20 20 20 20 20 20 20 20  s8......        
3560: 6d 6f 76 20 72 61 78 2c 20 5b 72 73 69 20 2b 20  mov rax, [rsi + 
3570: 72 64 78 20 2b 20 38 2b 38 5d 0d 0a 20 20 20 20  rdx + 8+8]..    
3580: 20 20 20 20 78 6f 72 20 72 61 78 2c 20 5b 72 64      xor rax, [rd
3590: 69 20 2b 20 72 64 78 20 2b 20 38 2b 38 5d 0d 0a  i + rdx + 8+8]..
35a0: 20 20 20 20 20 20 20 20 6a 6e 7a 20 4c 65 61 76          jnz Leav
35b0: 65 4c 6f 6f 70 43 6d 70 73 31 36 0d 0a 0d 0a 20  eLoopCmps16.... 
35c0: 20 20 20 20 20 20 20 61 64 64 20 72 64 78 2c 38         add rdx,8
35d0: 2b 38 2b 38 0d 0a 0d 0a 09 09 42 45 46 4f 52 45  +8+8......BEFORE
35e0: 5f 4a 4d 50 0d 0a 20 20 20 20 20 20 20 20 6a 6e  _JMP..        jn
35f0: 7a 20 20 4c 6f 6f 70 43 6d 70 73 0d 0a 20 20 20  z  LoopCmps..   
3600: 20 20 20 20 20 6a 6d 70 20 20 4c 65 6e 4d 61 78       jmp  LenMax
3610: 69 6d 75 6d 0d 0a 09 09 41 46 54 45 52 5f 4a 4d  imum....AFTER_JM
3620: 50 0d 0a 09 09 0d 0a 4c 65 61 76 65 4c 6f 6f 70  P......LeaveLoop
3630: 43 6d 70 73 31 36 3a 20 61 64 64 20 72 64 78 2c  Cmps16: add rdx,
3640: 38 0d 0a 4c 65 61 76 65 4c 6f 6f 70 43 6d 70 73  8..LeaveLoopCmps
3650: 38 3a 20 61 64 64 20 72 64 78 2c 38 0d 0a 4c 65  8: add rdx,8..Le
3660: 61 76 65 4c 6f 6f 70 43 6d 70 73 3a 0d 0a 0d 0a  aveLoopCmps:....
3670: 20 20 20 20 20 20 20 20 74 65 73 74 20 20 20 20          test    
3680: 65 61 78 2c 20 30 78 30 30 30 30 46 46 46 46 0d  eax, 0x0000FFFF.
3690: 0a 20 20 20 20 20 20 20 20 6a 6e 7a 20 4c 65 6e  .        jnz Len
36a0: 4c 6f 77 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20  Lower....       
36b0: 20 74 65 73 74 20 65 61 78 2c 30 78 66 66 66 66   test eax,0xffff
36c0: 66 66 66 66 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ffff....        
36d0: 6a 6e 7a 20 4c 65 6e 4c 6f 77 65 72 33 32 0d 0a  jnz LenLower32..
36e0: 0d 0a 20 20 20 20 20 20 20 20 61 64 64 20 72 64  ..        add rd
36f0: 78 2c 34 0d 0a 20 20 20 20 20 20 20 20 73 68 72  x,4..        shr
3700: 20 72 61 78 2c 33 32 0d 0a 20 20 20 20 20 20 20   rax,32..       
3710: 20 6f 72 20 61 78 2c 61 78 0d 0a 09 09 42 45 46   or ax,ax....BEF
3720: 4f 52 45 5f 4a 4d 50 0d 0a 20 20 20 20 20 20 20  ORE_JMP..       
3730: 20 6a 6e 7a 20 4c 65 6e 4c 6f 77 65 72 0d 0a 09   jnz LenLower...
3740: 09 41 46 54 45 52 5f 4a 4d 50 0d 0a 0d 0a 4c 65  .AFTER_JMP....Le
3750: 6e 4c 6f 77 65 72 33 32 3a 0d 0a 20 20 20 20 20  nLower32:..     
3760: 20 20 20 73 68 72 20 65 61 78 2c 31 36 0d 0a 20     shr eax,16.. 
3770: 20 20 20 20 20 20 20 61 64 64 20 72 64 78 2c 32         add rdx,2
3780: 0d 0a 09 09 0d 0a 4c 65 6e 4c 6f 77 65 72 3a 09  ......LenLower:.
3790: 09 0d 0a 20 20 20 20 20 20 20 20 73 75 62 20 61  ...        sub a
37a0: 6c 2c 20 31 0d 0a 20 20 20 20 20 20 20 20 61 64  l, 1..        ad
37b0: 63 20 72 64 78 2c 20 30 0d 0a 2f 2f 3b 3b 3b 20  c rdx, 0..//;;; 
37c0: 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65  Calculate the le
37d0: 6e 67 74 68 20 6f 66 20 74 68 65 20 6d 61 74 63  ngth of the matc
37e0: 68 2e 20 49 66 20 69 74 20 69 73 20 6c 6f 6e 67  h. If it is long
37f0: 65 72 20 74 68 61 6e 20 4d 41 58 5f 4d 41 54 43  er than MAX_MATC
3800: 48 2c 0d 0a 2f 2f 3b 3b 3b 20 74 68 65 6e 20 61  H,..//;;; then a
3810: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 63 63  utomatically acc
3820: 65 70 74 20 69 74 20 61 73 20 74 68 65 20 62 65  ept it as the be
3830: 73 74 20 70 6f 73 73 69 62 6c 65 20 6d 61 74 63  st possible matc
3840: 68 20 61 6e 64 20 6c 65 61 76 65 2e 0d 0a 0d 0a  h and leave.....
3850: 20 20 20 20 20 20 20 20 6c 65 61 20 72 61 78 2c          lea rax,
3860: 20 5b 72 64 69 20 2b 20 72 64 78 5d 0d 0a 20 20   [rdi + rdx]..  
3870: 20 20 20 20 20 20 73 75 62 20 72 61 78 2c 20 72        sub rax, r
3880: 39 0d 0a 20 20 20 20 20 20 20 20 63 6d 70 20 65  9..        cmp e
3890: 61 78 2c 20 4d 41 58 5f 4d 41 54 43 48 0d 0a 09  ax, MAX_MATCH...
38a0: 09 42 45 46 4f 52 45 5f 4a 4d 50 0d 0a 20 20 20  .BEFORE_JMP..   
38b0: 20 20 20 20 20 6a 67 65 20 4c 65 6e 4d 61 78 69       jge LenMaxi
38c0: 6d 75 6d 0d 0a 09 09 41 46 54 45 52 5f 4a 4d 50  mum....AFTER_JMP
38d0: 0d 0a 2f 2a 0d 0a 3b 3b 3b 20 49 66 20 74 68 65  ../*..;;; If the
38e0: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6d   length of the m
38f0: 61 74 63 68 20 69 73 20 6e 6f 74 20 6c 6f 6e 67  atch is not long
3900: 65 72 20 74 68 61 6e 20 74 68 65 20 62 65 73 74  er than the best
3910: 20 6d 61 74 63 68 20 77 65 0d 0a 3b 3b 3b 20 68   match we..;;; h
3920: 61 76 65 20 73 6f 20 66 61 72 2c 20 74 68 65 6e  ave so far, then
3930: 20 66 6f 72 67 65 74 20 69 74 20 61 6e 64 20 72   forget it and r
3940: 65 74 75 72 6e 20 74 6f 20 74 68 65 20 6c 6f 6f  eturn to the loo
3950: 6b 75 70 20 6c 6f 6f 70 2e 0d 0a 3b 2f 2f 2f 2f  kup loop...;////
3960: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3970: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
3980: 0a 2a 2f 0d 0a 20 20 20 20 20 20 20 20 63 6d 70  .*/..        cmp
3990: 20 65 61 78 2c 20 72 31 31 64 0d 0a 20 20 20 20   eax, r11d..    
39a0: 20 20 20 20 6a 67 20 20 4c 6f 6e 67 65 72 4d 61      jg  LongerMa
39b0: 74 63 68 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6c  tch....        l
39c0: 65 61 20 72 73 69 2c 5b 72 31 30 2b 72 31 31 5d  ea rsi,[r10+r11]
39d0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 20  ....        mov 
39e0: 72 64 69 2c 20 70 72 65 76 5f 61 64 0d 0a 20 20  rdi, prev_ad..  
39f0: 20 20 20 20 20 20 6d 6f 76 20 65 64 78 2c 20 5b        mov edx, [
3a00: 63 68 61 69 6e 6c 65 6e 77 6d 61 73 6b 5d 0d 0a  chainlenwmask]..
3a10: 09 09 42 45 46 4f 52 45 5f 4a 4d 50 0d 0a 20 20  ..BEFORE_JMP..  
3a20: 20 20 20 20 20 20 6a 6d 70 20 4c 6f 6f 6b 75 70        jmp Lookup
3a30: 4c 6f 6f 70 0d 0a 09 09 41 46 54 45 52 5f 4a 4d  Loop....AFTER_JM
3a40: 50 0d 0a 2f 2a 0d 0a 3b 3b 3b 20 20 20 20 20 20  P../*..;;;      
3a50: 20 20 20 73 2d 3e 6d 61 74 63 68 5f 73 74 61 72     s->match_star
3a60: 74 20 3d 20 63 75 72 5f 6d 61 74 63 68 3b 0d 0a  t = cur_match;..
3a70: 3b 3b 3b 20 20 20 20 20 20 20 20 20 62 65 73 74  ;;;         best
3a80: 5f 6c 65 6e 20 3d 20 6c 65 6e 3b 0d 0a 3b 3b 3b  _len = len;..;;;
3a90: 20 20 20 20 20 20 20 20 20 69 66 20 28 6c 65 6e           if (len
3aa0: 20 3e 3d 20 6e 69 63 65 5f 6d 61 74 63 68 29 20   >= nice_match) 
3ab0: 62 72 65 61 6b 3b 0d 0a 3b 3b 3b 20 20 20 20 20  break;..;;;     
3ac0: 20 20 20 20 73 63 61 6e 5f 65 6e 64 20 3d 20 2a      scan_end = *
3ad0: 28 75 73 68 66 2a 29 28 73 63 61 6e 2b 62 65 73  (ushf*)(scan+bes
3ae0: 74 5f 6c 65 6e 2d 31 29 3b 0d 0a 2a 2f 0d 0a 4c  t_len-1);..*/..L
3af0: 6f 6e 67 65 72 4d 61 74 63 68 3a 0d 0a 20 20 20  ongerMatch:..   
3b00: 20 20 20 20 20 6d 6f 76 20 72 31 31 64 2c 20 65       mov r11d, e
3b10: 61 78 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 20  ax..        mov 
3b20: 6d 61 74 63 68 5f 73 74 61 72 74 2c 20 72 38 64  match_start, r8d
3b30: 0d 0a 20 20 20 20 20 20 20 20 63 6d 70 20 65 61  ..        cmp ea
3b40: 78 2c 20 5b 6e 69 63 65 6d 61 74 63 68 5d 0d 0a  x, [nicematch]..
3b50: 09 09 42 45 46 4f 52 45 5f 4a 4d 50 0d 0a 20 20  ..BEFORE_JMP..  
3b60: 20 20 20 20 20 20 6a 67 65 20 4c 65 61 76 65 4e        jge LeaveN
3b70: 6f 77 0d 0a 09 09 41 46 54 45 52 5f 4a 4d 50 0d  ow....AFTER_JMP.
3b80: 0a 0d 0a 20 20 20 20 20 20 20 20 6c 65 61 20 72  ...        lea r
3b90: 73 69 2c 5b 72 31 30 2b 72 61 78 5d 0d 0a 0d 0a  si,[r10+rax]....
3ba0: 20 20 20 20 20 20 20 20 6d 6f 76 7a 78 20 20 20          movzx   
3bb0: 65 62 78 2c 20 77 6f 72 64 20 70 74 72 20 5b 72  ebx, word ptr [r
3bc0: 39 20 2b 20 72 61 78 20 2d 20 31 5d 0d 0a 20 20  9 + rax - 1]..  
3bd0: 20 20 20 20 20 20 6d 6f 76 20 72 64 69 2c 20 70        mov rdi, p
3be0: 72 65 76 5f 61 64 0d 0a 20 20 20 20 20 20 20 20  rev_ad..        
3bf0: 6d 6f 76 20 65 64 78 2c 20 5b 63 68 61 69 6e 6c  mov edx, [chainl
3c00: 65 6e 77 6d 61 73 6b 5d 0d 0a 09 09 42 45 46 4f  enwmask]....BEFO
3c10: 52 45 5f 4a 4d 50 0d 0a 20 20 20 20 20 20 20 20  RE_JMP..        
3c20: 6a 6d 70 20 4c 6f 6f 6b 75 70 4c 6f 6f 70 0d 0a  jmp LookupLoop..
3c30: 09 09 41 46 54 45 52 5f 4a 4d 50 0d 0a 0d 0a 2f  ..AFTER_JMP..../
3c40: 2f 3b 3b 3b 20 41 63 63 65 70 74 20 74 68 65 20  /;;; Accept the 
3c50: 63 75 72 72 65 6e 74 20 73 74 72 69 6e 67 2c 20  current string, 
3c60: 77 69 74 68 20 74 68 65 20 6d 61 78 69 6d 75 6d  with the maximum
3c70: 20 70 6f 73 73 69 62 6c 65 20 6c 65 6e 67 74 68   possible length
3c80: 2e 0d 0a 0d 0a 4c 65 6e 4d 61 78 69 6d 75 6d 3a  .....LenMaximum:
3c90: 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 72 31  ..        mov r1
3ca0: 31 64 2c 4d 41 58 5f 4d 41 54 43 48 0d 0a 20 20  1d,MAX_MATCH..  
3cb0: 20 20 20 20 20 20 6d 6f 76 20 6d 61 74 63 68 5f        mov match_
3cc0: 73 74 61 72 74 2c 20 72 38 64 0d 0a 0d 0a 2f 2f  start, r8d....//
3cd0: 3b 3b 3b 20 69 66 20 28 28 75 49 6e 74 29 62 65  ;;; if ((uInt)be
3ce0: 73 74 5f 6c 65 6e 20 3c 3d 20 73 2d 3e 6c 6f 6f  st_len <= s->loo
3cf0: 6b 61 68 65 61 64 29 20 72 65 74 75 72 6e 20 28  kahead) return (
3d00: 75 49 6e 74 29 62 65 73 74 5f 6c 65 6e 3b 0d 0a  uInt)best_len;..
3d10: 2f 2f 3b 3b 3b 20 72 65 74 75 72 6e 20 73 2d 3e  //;;; return s->
3d20: 6c 6f 6f 6b 61 68 65 61 64 3b 0d 0a 0d 0a 4c 65  lookahead;....Le
3d30: 61 76 65 4e 6f 77 3a 0d 0a 20 20 20 20 20 20 20  aveNow:..       
3d40: 20 6d 6f 76 20 65 61 78 2c 20 4c 6f 6f 6b 61 68   mov eax, Lookah
3d50: 65 61 64 0d 0a 20 20 20 20 20 20 20 20 63 6d 70  ead..        cmp
3d60: 20 72 31 31 64 2c 20 65 61 78 0d 0a 20 20 20 20   r11d, eax..    
3d70: 20 20 20 20 63 6d 6f 76 6e 67 20 65 61 78 2c 20      cmovng eax, 
3d80: 72 31 31 64 0d 0a 0d 0a 0d 0a 0d 0a 2f 2f 3b 3b  r11d........//;;
3d90: 3b 20 52 65 73 74 6f 72 65 20 74 68 65 20 73 74  ; Restore the st
3da0: 61 63 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 66  ack and return f
3db0: 72 6f 6d 20 77 68 65 6e 63 65 20 77 65 20 63 61  rom whence we ca
3dc0: 6d 65 2e 0d 0a 0d 0a 0d 0a 2f 2f 20 20 20 20 20  me.......//     
3dd0: 20 20 20 6d 6f 76 20 72 73 69 2c 5b 73 61 76 65     mov rsi,[save
3de0: 5f 72 73 69 5d 0d 0a 2f 2f 20 20 20 20 20 20 20  _rsi]..//       
3df0: 20 6d 6f 76 20 72 64 69 2c 5b 73 61 76 65 5f 72   mov rdi,[save_r
3e00: 64 69 5d 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76  di]..        mov
3e10: 20 72 62 78 2c 5b 73 61 76 65 5f 72 62 78 5d 0d   rbx,[save_rbx].
3e20: 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 72 62 70  .        mov rbp
3e30: 2c 5b 73 61 76 65 5f 72 62 70 5d 0d 0a 20 20 20  ,[save_rbp]..   
3e40: 20 20 20 20 20 6d 6f 76 20 72 31 32 2c 5b 73 61       mov r12,[sa
3e50: 76 65 5f 72 31 32 5d 0d 0a 20 20 20 20 20 20 20  ve_r12]..       
3e60: 20 6d 6f 76 20 72 31 33 2c 5b 73 61 76 65 5f 72   mov r13,[save_r
3e70: 31 33 5d 0d 0a 20 20 20 20 20 20 20 20 6d 6f 76  13]..        mov
3e80: 20 72 31 34 2c 5b 73 61 76 65 5f 72 31 34 5d 0d   r14,[save_r14].
3e90: 0a 20 20 20 20 20 20 20 20 6d 6f 76 20 72 31 35  .        mov r15
3ea0: 2c 5b 73 61 76 65 5f 72 31 35 5d 0d 0a 0d 0a 0d  ,[save_r15].....
3eb0: 0a 20 20 20 20 20 20 20 20 72 65 74 20 30 0d 0a  .        ret 0..
3ec0: 2f 2f 3b 20 70 6c 65 61 73 65 20 64 6f 6e 27 74  //; please don't
3ed0: 20 72 65 6d 6f 76 65 20 74 68 69 73 20 73 74 72   remove this str
3ee0: 69 6e 67 20 21 0d 0a 2f 2f 3b 20 59 6f 75 72 20  ing !..//; Your 
3ef0: 63 61 6e 20 66 72 65 65 6c 79 20 75 73 65 20 67  can freely use g
3f00: 76 6d 61 74 36 34 20 69 6e 20 61 6e 79 20 66 72  vmat64 in any fr
3f10: 65 65 20 6f 72 20 63 6f 6d 6d 65 72 63 69 61 6c  ee or commercial
3f20: 20 61 70 70 0d 0a 2f 2f 3b 20 62 75 74 20 69 74   app..//; but it
3f30: 20 69 73 20 66 61 72 20 62 65 74 74 65 72 20 64   is far better d
3f40: 6f 6e 27 74 20 72 65 6d 6f 76 65 20 74 68 65 20  on't remove the 
3f50: 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 62 69  string in the bi
3f60: 6e 61 72 79 21 0d 0a 20 2f 2f 20 20 20 64 62 20  nary!.. //   db 
3f70: 20 20 20 20 30 64 68 2c 30 61 68 2c 22 61 73 6d      0dh,0ah,"asm
3f80: 36 38 36 20 77 69 74 68 20 6d 61 73 6d 2c 20 6f  686 with masm, o
3f90: 70 74 69 6d 69 73 65 64 20 61 73 73 65 6d 62 6c  ptimised assembl
3fa0: 79 20 63 6f 64 65 20 66 72 6f 6d 20 42 72 69 61  y code from Bria
3fb0: 6e 20 52 61 69 74 65 72 2c 20 77 72 69 74 74 65  n Raiter, writte
3fc0: 6e 20 31 39 39 38 2c 20 63 6f 6e 76 65 72 74 65  n 1998, converte
3fd0: 64 20 74 6f 20 61 6d 64 20 36 34 20 62 79 20 47  d to amd 64 by G
3fe0: 69 6c 6c 65 73 20 56 6f 6c 6c 61 6e 74 20 32 30  illes Vollant 20
3ff0: 30 35 22 2c 30 64 68 2c 30 61 68 2c 30 0d 0a 0d  05",0dh,0ah,0...
4000: 0a 0d 0a 6d 61 74 63 68 5f 69 6e 69 74 3a 0d 0a  ...match_init:..
4010: 20 20 72 65 74 20 30 0d 0a 0d 0a 0d 0a             ret 0......