finishm 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (554) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.gitmodules +3 -0
  4. data/.rspec +1 -0
  5. data/Gemfile +31 -0
  6. data/LICENSE.txt +20 -0
  7. data/README.md +59 -0
  8. data/Rakefile +51 -0
  9. data/VERSION +1 -0
  10. data/bin/assembly_visualiser +106 -0
  11. data/bin/check_primer_combinations.rb +73 -0
  12. data/bin/contig_joiner.rb +244 -0
  13. data/bin/contigs_against_assembly.rb +153 -0
  14. data/bin/finishm +143 -0
  15. data/bin/finishm_assembler +55 -0
  16. data/bin/finishm_gap_closer.rb +241 -0
  17. data/bin/kmer_abundance_file_tool.rb +49 -0
  18. data/bin/kmer_pattern_to_assembly.rb +377 -0
  19. data/bin/kmer_profile_finder.rb +92 -0
  20. data/bin/kmers_count_parse.d +52 -0
  21. data/bin/kmers_count_tabulate.d +123 -0
  22. data/bin/kmers_count_tabulate.rb +84 -0
  23. data/bin/pcr_result_parser.rb +108 -0
  24. data/bin/primer_finder.rb +119 -0
  25. data/bin/read_selection_by_kmer.d +174 -0
  26. data/bin/scaffold_by_pattern.rb +119 -0
  27. data/bin/scaffold_connection_possibilities_to_knowns.rb +193 -0
  28. data/bin/scaffold_end_coverages.rb +69 -0
  29. data/bin/trail_validator.rb +84 -0
  30. data/ext/mkrf_conf.rb +56 -0
  31. data/ext/src/Makefile +140 -0
  32. data/ext/src/src/allocArray.c +305 -0
  33. data/ext/src/src/allocArray.h +86 -0
  34. data/ext/src/src/autoOpen.c +107 -0
  35. data/ext/src/src/autoOpen.h +18 -0
  36. data/ext/src/src/binarySequences.c +813 -0
  37. data/ext/src/src/binarySequences.h +125 -0
  38. data/ext/src/src/concatenatedGraph.c +233 -0
  39. data/ext/src/src/concatenatedGraph.h +30 -0
  40. data/ext/src/src/concatenatedPreGraph.c +262 -0
  41. data/ext/src/src/concatenatedPreGraph.h +29 -0
  42. data/ext/src/src/correctedGraph.c +2643 -0
  43. data/ext/src/src/correctedGraph.h +32 -0
  44. data/ext/src/src/dfib.c +509 -0
  45. data/ext/src/src/dfib.h +69 -0
  46. data/ext/src/src/dfibHeap.c +89 -0
  47. data/ext/src/src/dfibHeap.h +39 -0
  48. data/ext/src/src/dfibpriv.h +105 -0
  49. data/ext/src/src/fib.c +628 -0
  50. data/ext/src/src/fib.h +78 -0
  51. data/ext/src/src/fibHeap.c +79 -0
  52. data/ext/src/src/fibHeap.h +41 -0
  53. data/ext/src/src/fibpriv.h +110 -0
  54. data/ext/src/src/globals.h +154 -0
  55. data/ext/src/src/graph.c +3932 -0
  56. data/ext/src/src/graph.h +233 -0
  57. data/ext/src/src/graphReConstruction.c +1472 -0
  58. data/ext/src/src/graphReConstruction.h +30 -0
  59. data/ext/src/src/graphStats.c +2167 -0
  60. data/ext/src/src/graphStats.h +72 -0
  61. data/ext/src/src/graphStructures.h +52 -0
  62. data/ext/src/src/kmer.c +652 -0
  63. data/ext/src/src/kmer.h +73 -0
  64. data/ext/src/src/kmerOccurenceTable.c +236 -0
  65. data/ext/src/src/kmerOccurenceTable.h +44 -0
  66. data/ext/src/src/kseq.h +223 -0
  67. data/ext/src/src/locallyCorrectedGraph.c +557 -0
  68. data/ext/src/src/locallyCorrectedGraph.h +40 -0
  69. data/ext/src/src/passageMarker.c +677 -0
  70. data/ext/src/src/passageMarker.h +137 -0
  71. data/ext/src/src/preGraph.c +1717 -0
  72. data/ext/src/src/preGraph.h +106 -0
  73. data/ext/src/src/preGraphConstruction.c +990 -0
  74. data/ext/src/src/preGraphConstruction.h +26 -0
  75. data/ext/src/src/probe_node_finder.c +84 -0
  76. data/ext/src/src/probe_node_finder.h +6 -0
  77. data/ext/src/src/readCoherentGraph.c +557 -0
  78. data/ext/src/src/readCoherentGraph.h +30 -0
  79. data/ext/src/src/readSet.c +1734 -0
  80. data/ext/src/src/readSet.h +67 -0
  81. data/ext/src/src/readToNode.c +218 -0
  82. data/ext/src/src/readToNode.h +35 -0
  83. data/ext/src/src/recycleBin.c +199 -0
  84. data/ext/src/src/recycleBin.h +58 -0
  85. data/ext/src/src/roadMap.c +342 -0
  86. data/ext/src/src/roadMap.h +65 -0
  87. data/ext/src/src/run.c +318 -0
  88. data/ext/src/src/run.h +52 -0
  89. data/ext/src/src/run2.c +744 -0
  90. data/ext/src/src/runReadToNode.c +29 -0
  91. data/ext/src/src/scaffold.c +1876 -0
  92. data/ext/src/src/scaffold.h +64 -0
  93. data/ext/src/src/shortReadPairs.c +1243 -0
  94. data/ext/src/src/shortReadPairs.h +32 -0
  95. data/ext/src/src/splay.c +259 -0
  96. data/ext/src/src/splay.h +43 -0
  97. data/ext/src/src/splayTable.c +1315 -0
  98. data/ext/src/src/splayTable.h +31 -0
  99. data/ext/src/src/tightString.c +362 -0
  100. data/ext/src/src/tightString.h +82 -0
  101. data/ext/src/src/utility.c +199 -0
  102. data/ext/src/src/utility.h +98 -0
  103. data/ext/src/third-party/zlib-1.2.3/ChangeLog +855 -0
  104. data/ext/src/third-party/zlib-1.2.3/FAQ +339 -0
  105. data/ext/src/third-party/zlib-1.2.3/INDEX +51 -0
  106. data/ext/src/third-party/zlib-1.2.3/Makefile +154 -0
  107. data/ext/src/third-party/zlib-1.2.3/Makefile.in +154 -0
  108. data/ext/src/third-party/zlib-1.2.3/README +125 -0
  109. data/ext/src/third-party/zlib-1.2.3/adler32.c +149 -0
  110. data/ext/src/third-party/zlib-1.2.3/adler32.o +0 -0
  111. data/ext/src/third-party/zlib-1.2.3/algorithm.txt +209 -0
  112. data/ext/src/third-party/zlib-1.2.3/amiga/Makefile.pup +66 -0
  113. data/ext/src/third-party/zlib-1.2.3/amiga/Makefile.sas +65 -0
  114. data/ext/src/third-party/zlib-1.2.3/as400/bndsrc +132 -0
  115. data/ext/src/third-party/zlib-1.2.3/as400/compile.clp +123 -0
  116. data/ext/src/third-party/zlib-1.2.3/as400/readme.txt +111 -0
  117. data/ext/src/third-party/zlib-1.2.3/as400/zlib.inc +331 -0
  118. data/ext/src/third-party/zlib-1.2.3/compress.c +79 -0
  119. data/ext/src/third-party/zlib-1.2.3/compress.o +0 -0
  120. data/ext/src/third-party/zlib-1.2.3/configure +459 -0
  121. data/ext/src/third-party/zlib-1.2.3/contrib/README.contrib +71 -0
  122. data/ext/src/third-party/zlib-1.2.3/contrib/ada/buffer_demo.adb +106 -0
  123. data/ext/src/third-party/zlib-1.2.3/contrib/ada/mtest.adb +156 -0
  124. data/ext/src/third-party/zlib-1.2.3/contrib/ada/read.adb +156 -0
  125. data/ext/src/third-party/zlib-1.2.3/contrib/ada/readme.txt +65 -0
  126. data/ext/src/third-party/zlib-1.2.3/contrib/ada/test.adb +463 -0
  127. data/ext/src/third-party/zlib-1.2.3/contrib/ada/zlib-streams.adb +225 -0
  128. data/ext/src/third-party/zlib-1.2.3/contrib/ada/zlib-streams.ads +114 -0
  129. data/ext/src/third-party/zlib-1.2.3/contrib/ada/zlib-thin.adb +141 -0
  130. data/ext/src/third-party/zlib-1.2.3/contrib/ada/zlib-thin.ads +450 -0
  131. data/ext/src/third-party/zlib-1.2.3/contrib/ada/zlib.adb +701 -0
  132. data/ext/src/third-party/zlib-1.2.3/contrib/ada/zlib.ads +328 -0
  133. data/ext/src/third-party/zlib-1.2.3/contrib/ada/zlib.gpr +20 -0
  134. data/ext/src/third-party/zlib-1.2.3/contrib/asm586/README.586 +43 -0
  135. data/ext/src/third-party/zlib-1.2.3/contrib/asm586/match.S +364 -0
  136. data/ext/src/third-party/zlib-1.2.3/contrib/asm686/README.686 +34 -0
  137. data/ext/src/third-party/zlib-1.2.3/contrib/asm686/match.S +329 -0
  138. data/ext/src/third-party/zlib-1.2.3/contrib/blast/Makefile +8 -0
  139. data/ext/src/third-party/zlib-1.2.3/contrib/blast/README +4 -0
  140. data/ext/src/third-party/zlib-1.2.3/contrib/blast/blast.c +444 -0
  141. data/ext/src/third-party/zlib-1.2.3/contrib/blast/blast.h +71 -0
  142. data/ext/src/third-party/zlib-1.2.3/contrib/blast/test.pk +0 -0
  143. data/ext/src/third-party/zlib-1.2.3/contrib/blast/test.txt +1 -0
  144. data/ext/src/third-party/zlib-1.2.3/contrib/delphi/ZLib.pas +557 -0
  145. data/ext/src/third-party/zlib-1.2.3/contrib/delphi/ZLibConst.pas +11 -0
  146. data/ext/src/third-party/zlib-1.2.3/contrib/delphi/readme.txt +76 -0
  147. data/ext/src/third-party/zlib-1.2.3/contrib/delphi/zlibd32.mak +93 -0
  148. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib.build +33 -0
  149. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib.chm +0 -0
  150. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib.sln +21 -0
  151. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib/AssemblyInfo.cs +58 -0
  152. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib/ChecksumImpl.cs +202 -0
  153. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib/CircularBuffer.cs +83 -0
  154. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib/CodecBase.cs +198 -0
  155. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib/Deflater.cs +106 -0
  156. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib/DotZLib.cs +288 -0
  157. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib/DotZLib.csproj +141 -0
  158. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib/GZipStream.cs +301 -0
  159. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib/Inflater.cs +105 -0
  160. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/DotZLib/UnitTests.cs +274 -0
  161. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/LICENSE_1_0.txt +23 -0
  162. data/ext/src/third-party/zlib-1.2.3/contrib/dotzlib/readme.txt +58 -0
  163. data/ext/src/third-party/zlib-1.2.3/contrib/infback9/README +1 -0
  164. data/ext/src/third-party/zlib-1.2.3/contrib/infback9/infback9.c +608 -0
  165. data/ext/src/third-party/zlib-1.2.3/contrib/infback9/infback9.h +37 -0
  166. data/ext/src/third-party/zlib-1.2.3/contrib/infback9/inffix9.h +107 -0
  167. data/ext/src/third-party/zlib-1.2.3/contrib/infback9/inflate9.h +47 -0
  168. data/ext/src/third-party/zlib-1.2.3/contrib/infback9/inftree9.c +323 -0
  169. data/ext/src/third-party/zlib-1.2.3/contrib/infback9/inftree9.h +55 -0
  170. data/ext/src/third-party/zlib-1.2.3/contrib/inflate86/inffas86.c +1157 -0
  171. data/ext/src/third-party/zlib-1.2.3/contrib/inflate86/inffast.S +1368 -0
  172. data/ext/src/third-party/zlib-1.2.3/contrib/iostream/test.cpp +24 -0
  173. data/ext/src/third-party/zlib-1.2.3/contrib/iostream/zfstream.cpp +329 -0
  174. data/ext/src/third-party/zlib-1.2.3/contrib/iostream/zfstream.h +128 -0
  175. data/ext/src/third-party/zlib-1.2.3/contrib/iostream2/zstream.h +307 -0
  176. data/ext/src/third-party/zlib-1.2.3/contrib/iostream2/zstream_test.cpp +25 -0
  177. data/ext/src/third-party/zlib-1.2.3/contrib/iostream3/README +35 -0
  178. data/ext/src/third-party/zlib-1.2.3/contrib/iostream3/TODO +17 -0
  179. data/ext/src/third-party/zlib-1.2.3/contrib/iostream3/test.cc +50 -0
  180. data/ext/src/third-party/zlib-1.2.3/contrib/iostream3/zfstream.cc +479 -0
  181. data/ext/src/third-party/zlib-1.2.3/contrib/iostream3/zfstream.h +466 -0
  182. data/ext/src/third-party/zlib-1.2.3/contrib/masm686/match.asm +413 -0
  183. data/ext/src/third-party/zlib-1.2.3/contrib/masmx64/bld_ml64.bat +2 -0
  184. data/ext/src/third-party/zlib-1.2.3/contrib/masmx64/gvmat64.asm +513 -0
  185. data/ext/src/third-party/zlib-1.2.3/contrib/masmx64/gvmat64.obj +0 -0
  186. data/ext/src/third-party/zlib-1.2.3/contrib/masmx64/inffas8664.c +186 -0
  187. data/ext/src/third-party/zlib-1.2.3/contrib/masmx64/inffasx64.asm +392 -0
  188. data/ext/src/third-party/zlib-1.2.3/contrib/masmx64/inffasx64.obj +0 -0
  189. data/ext/src/third-party/zlib-1.2.3/contrib/masmx64/readme.txt +28 -0
  190. data/ext/src/third-party/zlib-1.2.3/contrib/masmx86/bld_ml32.bat +2 -0
  191. data/ext/src/third-party/zlib-1.2.3/contrib/masmx86/gvmat32.asm +972 -0
  192. data/ext/src/third-party/zlib-1.2.3/contrib/masmx86/gvmat32.obj +0 -0
  193. data/ext/src/third-party/zlib-1.2.3/contrib/masmx86/gvmat32c.c +62 -0
  194. data/ext/src/third-party/zlib-1.2.3/contrib/masmx86/inffas32.asm +1083 -0
  195. data/ext/src/third-party/zlib-1.2.3/contrib/masmx86/inffas32.obj +0 -0
  196. data/ext/src/third-party/zlib-1.2.3/contrib/masmx86/mkasm.bat +3 -0
  197. data/ext/src/third-party/zlib-1.2.3/contrib/masmx86/readme.txt +21 -0
  198. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/ChangeLogUnzip +67 -0
  199. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/Makefile +25 -0
  200. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/crypt.h +132 -0
  201. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/ioapi.c +177 -0
  202. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/ioapi.h +75 -0
  203. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/iowin32.c +270 -0
  204. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/iowin32.h +21 -0
  205. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/miniunz.c +585 -0
  206. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/minizip.c +420 -0
  207. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/mztools.c +281 -0
  208. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/mztools.h +31 -0
  209. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/unzip.c +1598 -0
  210. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/unzip.h +354 -0
  211. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/zip.c +1219 -0
  212. data/ext/src/third-party/zlib-1.2.3/contrib/minizip/zip.h +235 -0
  213. data/ext/src/third-party/zlib-1.2.3/contrib/pascal/example.pas +599 -0
  214. data/ext/src/third-party/zlib-1.2.3/contrib/pascal/readme.txt +76 -0
  215. data/ext/src/third-party/zlib-1.2.3/contrib/pascal/zlibd32.mak +93 -0
  216. data/ext/src/third-party/zlib-1.2.3/contrib/pascal/zlibpas.pas +236 -0
  217. data/ext/src/third-party/zlib-1.2.3/contrib/puff/Makefile +8 -0
  218. data/ext/src/third-party/zlib-1.2.3/contrib/puff/README +63 -0
  219. data/ext/src/third-party/zlib-1.2.3/contrib/puff/puff.c +837 -0
  220. data/ext/src/third-party/zlib-1.2.3/contrib/puff/puff.h +31 -0
  221. data/ext/src/third-party/zlib-1.2.3/contrib/puff/zeros.raw +0 -0
  222. data/ext/src/third-party/zlib-1.2.3/contrib/testzlib/testzlib.c +275 -0
  223. data/ext/src/third-party/zlib-1.2.3/contrib/testzlib/testzlib.txt +10 -0
  224. data/ext/src/third-party/zlib-1.2.3/contrib/untgz/Makefile +14 -0
  225. data/ext/src/third-party/zlib-1.2.3/contrib/untgz/Makefile.msc +17 -0
  226. data/ext/src/third-party/zlib-1.2.3/contrib/untgz/untgz.c +674 -0
  227. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/readme.txt +73 -0
  228. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc7/miniunz.vcproj +126 -0
  229. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc7/minizip.vcproj +126 -0
  230. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc7/testzlib.vcproj +126 -0
  231. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc7/zlib.rc +32 -0
  232. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc7/zlibstat.vcproj +246 -0
  233. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc7/zlibvc.def +92 -0
  234. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc7/zlibvc.sln +78 -0
  235. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc7/zlibvc.vcproj +445 -0
  236. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc8/miniunz.vcproj +566 -0
  237. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc8/minizip.vcproj +563 -0
  238. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc8/testzlib.vcproj +948 -0
  239. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc8/testzlibdll.vcproj +567 -0
  240. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc8/zlib.rc +32 -0
  241. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc8/zlibstat.vcproj +870 -0
  242. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc8/zlibvc.def +92 -0
  243. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc8/zlibvc.sln +144 -0
  244. data/ext/src/third-party/zlib-1.2.3/contrib/vstudio/vc8/zlibvc.vcproj +1219 -0
  245. data/ext/src/third-party/zlib-1.2.3/crc32.c +423 -0
  246. data/ext/src/third-party/zlib-1.2.3/crc32.h +441 -0
  247. data/ext/src/third-party/zlib-1.2.3/crc32.o +0 -0
  248. data/ext/src/third-party/zlib-1.2.3/deflate.c +1736 -0
  249. data/ext/src/third-party/zlib-1.2.3/deflate.h +331 -0
  250. data/ext/src/third-party/zlib-1.2.3/deflate.o +0 -0
  251. data/ext/src/third-party/zlib-1.2.3/example +0 -0
  252. data/ext/src/third-party/zlib-1.2.3/example.c +565 -0
  253. data/ext/src/third-party/zlib-1.2.3/examples/README.examples +42 -0
  254. data/ext/src/third-party/zlib-1.2.3/examples/fitblk.c +233 -0
  255. data/ext/src/third-party/zlib-1.2.3/examples/gun.c +693 -0
  256. data/ext/src/third-party/zlib-1.2.3/examples/gzappend.c +500 -0
  257. data/ext/src/third-party/zlib-1.2.3/examples/gzjoin.c +448 -0
  258. data/ext/src/third-party/zlib-1.2.3/examples/gzlog.c +413 -0
  259. data/ext/src/third-party/zlib-1.2.3/examples/gzlog.h +58 -0
  260. data/ext/src/third-party/zlib-1.2.3/examples/zlib_how.html +523 -0
  261. data/ext/src/third-party/zlib-1.2.3/examples/zpipe.c +191 -0
  262. data/ext/src/third-party/zlib-1.2.3/examples/zran.c +404 -0
  263. data/ext/src/third-party/zlib-1.2.3/gzio.c +1026 -0
  264. data/ext/src/third-party/zlib-1.2.3/gzio.o +0 -0
  265. data/ext/src/third-party/zlib-1.2.3/infback.c +623 -0
  266. data/ext/src/third-party/zlib-1.2.3/infback.o +0 -0
  267. data/ext/src/third-party/zlib-1.2.3/inffast.c +318 -0
  268. data/ext/src/third-party/zlib-1.2.3/inffast.h +11 -0
  269. data/ext/src/third-party/zlib-1.2.3/inffast.o +0 -0
  270. data/ext/src/third-party/zlib-1.2.3/inffixed.h +94 -0
  271. data/ext/src/third-party/zlib-1.2.3/inflate.c +1368 -0
  272. data/ext/src/third-party/zlib-1.2.3/inflate.h +115 -0
  273. data/ext/src/third-party/zlib-1.2.3/inflate.o +0 -0
  274. data/ext/src/third-party/zlib-1.2.3/inftrees.c +329 -0
  275. data/ext/src/third-party/zlib-1.2.3/inftrees.h +55 -0
  276. data/ext/src/third-party/zlib-1.2.3/inftrees.o +0 -0
  277. data/ext/src/third-party/zlib-1.2.3/libz.a +0 -0
  278. data/ext/src/third-party/zlib-1.2.3/make_vms.com +461 -0
  279. data/ext/src/third-party/zlib-1.2.3/minigzip +0 -0
  280. data/ext/src/third-party/zlib-1.2.3/minigzip.c +322 -0
  281. data/ext/src/third-party/zlib-1.2.3/msdos/Makefile.bor +109 -0
  282. data/ext/src/third-party/zlib-1.2.3/msdos/Makefile.dj2 +104 -0
  283. data/ext/src/third-party/zlib-1.2.3/msdos/Makefile.emx +69 -0
  284. data/ext/src/third-party/zlib-1.2.3/msdos/Makefile.msc +106 -0
  285. data/ext/src/third-party/zlib-1.2.3/msdos/Makefile.tc +94 -0
  286. data/ext/src/third-party/zlib-1.2.3/old/Makefile.riscos +151 -0
  287. data/ext/src/third-party/zlib-1.2.3/old/README +3 -0
  288. data/ext/src/third-party/zlib-1.2.3/old/descrip.mms +48 -0
  289. data/ext/src/third-party/zlib-1.2.3/old/os2/Makefile.os2 +136 -0
  290. data/ext/src/third-party/zlib-1.2.3/old/os2/zlib.def +51 -0
  291. data/ext/src/third-party/zlib-1.2.3/old/visual-basic.txt +160 -0
  292. data/ext/src/third-party/zlib-1.2.3/old/zlib.html +971 -0
  293. data/ext/src/third-party/zlib-1.2.3/projects/README.projects +41 -0
  294. data/ext/src/third-party/zlib-1.2.3/projects/visualc6/README.txt +73 -0
  295. data/ext/src/third-party/zlib-1.2.3/projects/visualc6/example.dsp +278 -0
  296. data/ext/src/third-party/zlib-1.2.3/projects/visualc6/minigzip.dsp +278 -0
  297. data/ext/src/third-party/zlib-1.2.3/projects/visualc6/zlib.dsp +609 -0
  298. data/ext/src/third-party/zlib-1.2.3/projects/visualc6/zlib.dsw +59 -0
  299. data/ext/src/third-party/zlib-1.2.3/qnx/package.qpg +141 -0
  300. data/ext/src/third-party/zlib-1.2.3/trees.c +1219 -0
  301. data/ext/src/third-party/zlib-1.2.3/trees.h +128 -0
  302. data/ext/src/third-party/zlib-1.2.3/trees.o +0 -0
  303. data/ext/src/third-party/zlib-1.2.3/uncompr.c +61 -0
  304. data/ext/src/third-party/zlib-1.2.3/uncompr.o +0 -0
  305. data/ext/src/third-party/zlib-1.2.3/win32/DLL_FAQ.txt +397 -0
  306. data/ext/src/third-party/zlib-1.2.3/win32/Makefile.bor +107 -0
  307. data/ext/src/third-party/zlib-1.2.3/win32/Makefile.emx +69 -0
  308. data/ext/src/third-party/zlib-1.2.3/win32/Makefile.gcc +141 -0
  309. data/ext/src/third-party/zlib-1.2.3/win32/Makefile.msc +126 -0
  310. data/ext/src/third-party/zlib-1.2.3/win32/VisualC.txt +3 -0
  311. data/ext/src/third-party/zlib-1.2.3/win32/zlib.def +60 -0
  312. data/ext/src/third-party/zlib-1.2.3/win32/zlib1.rc +39 -0
  313. data/ext/src/third-party/zlib-1.2.3/zconf.h +332 -0
  314. data/ext/src/third-party/zlib-1.2.3/zconf.in.h +332 -0
  315. data/ext/src/third-party/zlib-1.2.3/zlib.3 +159 -0
  316. data/ext/src/third-party/zlib-1.2.3/zlib.h +1357 -0
  317. data/ext/src/third-party/zlib-1.2.3/zutil.c +318 -0
  318. data/ext/src/third-party/zlib-1.2.3/zutil.h +269 -0
  319. data/ext/src/third-party/zlib-1.2.3/zutil.o +0 -0
  320. data/lib/assembly/a_b_visualiser.rb +169 -0
  321. data/lib/assembly/acyclic_connection_finder.rb +81 -0
  322. data/lib/assembly/all_orfs.rb +615 -0
  323. data/lib/assembly/bad_format_writer.rb +46 -0
  324. data/lib/assembly/bam_probe_read_selector.rb +48 -0
  325. data/lib/assembly/bubbly_assembler.rb +842 -0
  326. data/lib/assembly/c_probe_node_finder.rb +38 -0
  327. data/lib/assembly/connection_interpreter.rb +350 -0
  328. data/lib/assembly/contig_printer.rb +400 -0
  329. data/lib/assembly/coverage_based_graph_filter.rb +68 -0
  330. data/lib/assembly/depth_first_search.rb +63 -0
  331. data/lib/assembly/dijkstra.rb +216 -0
  332. data/lib/assembly/fluffer.rb +253 -0
  333. data/lib/assembly/graph_explorer.rb +85 -0
  334. data/lib/assembly/graph_generator.rb +315 -0
  335. data/lib/assembly/height_finder.rb +355 -0
  336. data/lib/assembly/hybrid_velvet_graph.rb +70 -0
  337. data/lib/assembly/input_genome.rb +182 -0
  338. data/lib/assembly/kmer_coverage_based_path_filter.rb +65 -0
  339. data/lib/assembly/node_finder.rb +171 -0
  340. data/lib/assembly/oriented_node_trail.rb +507 -0
  341. data/lib/assembly/paired_end_assembler.rb +53 -0
  342. data/lib/assembly/paired_end_neighbour_finder.rb +176 -0
  343. data/lib/assembly/probed_graph.rb +105 -0
  344. data/lib/assembly/read_input.rb +79 -0
  345. data/lib/assembly/read_to_node.rb +37 -0
  346. data/lib/assembly/scaffold_breaker.rb +126 -0
  347. data/lib/assembly/sequence_hasher.rb +71 -0
  348. data/lib/assembly/single_coherent_paths_between_nodes.rb +533 -0
  349. data/lib/assembly/single_coherent_wanderer.rb +261 -0
  350. data/lib/assembly/single_ended_assembler.rb +441 -0
  351. data/lib/assembly/velvet_c_binding.rb +54 -0
  352. data/lib/assembly/velvet_graph_sequence_extractor.rb +123 -0
  353. data/lib/external/VERSION +1 -0
  354. data/lib/finishm/assemble.rb +224 -0
  355. data/lib/finishm/explore.rb +217 -0
  356. data/lib/finishm/finisher.rb +303 -0
  357. data/lib/finishm/fluff.rb +122 -0
  358. data/lib/finishm/gapfiller.rb +325 -0
  359. data/lib/finishm/orfs_finder.rb +88 -0
  360. data/lib/finishm/path_counter.rb +90 -0
  361. data/lib/finishm/primers.rb +425 -0
  362. data/lib/finishm/primers_check.rb +176 -0
  363. data/lib/finishm/roundup.rb +344 -0
  364. data/lib/finishm/sequence.rb +142 -0
  365. data/lib/finishm/visualise.rb +430 -0
  366. data/lib/finishm/wander.rb +270 -0
  367. data/lib/kmer_abundance_pattern.rb +79 -0
  368. data/lib/kmer_multi_abundance_file.rb +48 -0
  369. data/lib/oligo_designer.rb +88 -0
  370. data/lib/priner.rb +66 -0
  371. data/spec/acyclic_connection_finder_spec.rb +551 -0
  372. data/spec/all_orfs_spec.rb +443 -0
  373. data/spec/assemble_spec.rb +186 -0
  374. data/spec/bubbly_assembler_spec.rb +707 -0
  375. data/spec/c_node_finder_spec.rb +58 -0
  376. data/spec/connection_interpreter_spec.rb +284 -0
  377. data/spec/contig_printer_spec.rb +291 -0
  378. data/spec/coverage_based_graph_filter_spec.rb +102 -0
  379. data/spec/data/6_3e4e5e6e.1vANME.bam +0 -0
  380. data/spec/data/6_3e4e5e6e.1vANME.bam.bai +0 -0
  381. data/spec/data/acyclic_connection_finder/1/probes.fa +5 -0
  382. data/spec/data/acyclic_connection_finder/1/random1.fa +2 -0
  383. data/spec/data/acyclic_connection_finder/1/random1.sammy.fa.gz +0 -0
  384. data/spec/data/acyclic_connection_finder/1/random2.fa +2 -0
  385. data/spec/data/acyclic_connection_finder/1/random2.sammy.fa.gz +0 -0
  386. data/spec/data/assembly/1_simple_bubble_uneven_coverage/random3000.fa +39 -0
  387. data/spec/data/assembly/1_simple_bubble_uneven_coverage/random3000.slightly_changed.fa +39 -0
  388. data/spec/data/assembly/1_simple_bubble_uneven_coverage/reads_combined.fa.gz +0 -0
  389. data/spec/data/assembly_visualiser/Contig_6_1_to_250.fa.kmers31 +220 -0
  390. data/spec/data/assembly_visualiser/Contig_7_1_to_250.fa.kmers31 +220 -0
  391. data/spec/data/assembly_visualiser/Graph +46 -0
  392. data/spec/data/assembly_visualiser/start_kmers1 +2 -0
  393. data/spec/data/bands.csv +1 -0
  394. data/spec/data/c_probe_node_finder/1/CnyUnifiedSeq +0 -0
  395. data/spec/data/c_probe_node_finder/1/CnyUnifiedSeq.names +544 -0
  396. data/spec/data/c_probe_node_finder/1/Graph2 +668 -0
  397. data/spec/data/c_probe_node_finder/1/LastGraph +668 -0
  398. data/spec/data/c_probe_node_finder/1/Log +756 -0
  399. data/spec/data/c_probe_node_finder/1/PreGraph +11 -0
  400. data/spec/data/c_probe_node_finder/1/Roadmaps +2009 -0
  401. data/spec/data/c_probe_node_finder/1/contigs.fa +29 -0
  402. data/spec/data/c_probe_node_finder/1/stats.txt +6 -0
  403. data/spec/data/contig_printer/1/HOWTO_RECREATE +17 -0
  404. data/spec/data/contig_printer/1/contigs.fa +4 -0
  405. data/spec/data/contig_printer/1/seq.fa +2408 -0
  406. data/spec/data/contig_printer/1/seq.fa.svg +153 -0
  407. data/spec/data/contig_printer/1/seq.fa.velvet/Graph2 +2953 -0
  408. data/spec/data/contig_printer/1/seq.fa.velvet/LastGraph +2953 -0
  409. data/spec/data/contig_printer/1/seq.fa.velvet/Log +21 -0
  410. data/spec/data/contig_printer/1/seq.fa.velvet/PreGraph +27 -0
  411. data/spec/data/contig_printer/1/seq.fa.velvet/Roadmaps +5182 -0
  412. data/spec/data/contig_printer/1/seq.fa.velvet/Sequences +3612 -0
  413. data/spec/data/contig_printer/1/seq.fa.velvet/contigs.fa +36 -0
  414. data/spec/data/contig_printer/1/seq.fa.velvet/stats.txt +14 -0
  415. data/spec/data/contig_printer/1/seq.faVseq2_1to550.fa.bam +0 -0
  416. data/spec/data/contig_printer/1/seq.faVseq2_1to550.fa.bam.bai +0 -0
  417. data/spec/data/contig_printer/1/seq.node12.fa +4 -0
  418. data/spec/data/contig_printer/1/seq1_1to550.fa +2 -0
  419. data/spec/data/contig_printer/1/seq2_1to550.fa +2 -0
  420. data/spec/data/contig_printer/1/seq2_1to550.fa.fai +1 -0
  421. data/spec/data/explore/1/2seqs.sammy.fa +12004 -0
  422. data/spec/data/explore/1/HOWTO_RECREATE.txt +6 -0
  423. data/spec/data/explore/1/a.fa +2 -0
  424. data/spec/data/explore/1/seq1_and_a.fa +3 -0
  425. data/spec/data/explore/1/seq2.fa +2 -0
  426. data/spec/data/fluff/1/2seqs.sammy.fa +12004 -0
  427. data/spec/data/fluff/1/HOWTO_RECREATE.txt +5 -0
  428. data/spec/data/fluff/1/seq1.fa +2 -0
  429. data/spec/data/fluff/1/seq2.fa +2 -0
  430. data/spec/data/gapfilling/1/reads.fa +171 -0
  431. data/spec/data/gapfilling/1/trail_with_Ns.fa +5 -0
  432. data/spec/data/gapfilling/1/velvetAssembly/Graph2 +130 -0
  433. data/spec/data/gapfilling/1/velvetAssembly/LastGraph +130 -0
  434. data/spec/data/gapfilling/1/velvetAssembly/Log +199 -0
  435. data/spec/data/gapfilling/1/velvetAssembly/PreGraph +7 -0
  436. data/spec/data/gapfilling/1/velvetAssembly/Roadmaps +239 -0
  437. data/spec/data/gapfilling/1/velvetAssembly/Sequences +281 -0
  438. data/spec/data/gapfilling/1/velvetAssembly/contigs.fa +12 -0
  439. data/spec/data/gapfilling/1/velvetAssembly/stats.txt +4 -0
  440. data/spec/data/gapfilling/2/HOWTO_recreate +17 -0
  441. data/spec/data/gapfilling/2/reference.fa +2 -0
  442. data/spec/data/gapfilling/2/reference_part1.fa +4 -0
  443. data/spec/data/gapfilling/2/reference_part2.fa +4 -0
  444. data/spec/data/gapfilling/2/sammy_reads.fa.gz +0 -0
  445. data/spec/data/gapfilling/2/with_gaps.fa +4 -0
  446. data/spec/data/gapfilling/3/HOWTO_recreate +4 -0
  447. data/spec/data/gapfilling/3/reads.fa.gz +0 -0
  448. data/spec/data/gapfilling/3/reference_part1.fa +4 -0
  449. data/spec/data/gapfilling/3/reference_part2.fa +4 -0
  450. data/spec/data/gapfilling/3/with_gaps.fa +4 -0
  451. data/spec/data/gapfilling/4/HOWTO_recreate +1 -0
  452. data/spec/data/gapfilling/4/reads.fa.gz +0 -0
  453. data/spec/data/gapfilling/5/HOWTO_RECREATE +7 -0
  454. data/spec/data/gapfilling/5/answer.fna +2 -0
  455. data/spec/data/gapfilling/5/gappy.fna +2 -0
  456. data/spec/data/gapfilling/5/reads.fa +17961 -0
  457. data/spec/data/gapfilling/5/velvet51_3.5/LastGraph +8337 -0
  458. data/spec/data/gapfilling/5/velvet51_3.5/Sequences +20921 -0
  459. data/spec/data/gapfilling/6/random1.fa +28 -0
  460. data/spec/data/gapfilling/6/random2.fa +28 -0
  461. data/spec/data/gapfilling/6/random_sequence_length_2000 +0 -0
  462. data/spec/data/gapfilling/6/reads.random1.fa.gz +0 -0
  463. data/spec/data/gapfilling/6/reads.random2.fa.gz +0 -0
  464. data/spec/data/gapfilling/6/to_gapfill.fa +22 -0
  465. data/spec/data/kmer_profile_to_assembly/multiple_abundance_file1.csv +2 -0
  466. data/spec/data/kmers_count1.csv +2 -0
  467. data/spec/data/kmers_count2.csv +3 -0
  468. data/spec/data/out +3 -0
  469. data/spec/data/positive_latching_pair.fa +2 -0
  470. data/spec/data/primers.csv +4 -0
  471. data/spec/data/read_selection_by_kmer/blacklist1.txt +1 -0
  472. data/spec/data/read_selection_by_kmer/input.fasta +6 -0
  473. data/spec/data/read_selection_by_kmer/whitelist1.txt +1 -0
  474. data/spec/data/read_selection_by_kmer/whitelist2.txt +2 -0
  475. data/spec/data/read_to_node/1_a_graph/HOWTO_RECREATE.txt +2 -0
  476. data/spec/data/read_to_node/1_a_graph/LastGraph +6695 -0
  477. data/spec/data/read_to_node/1_a_graph/ReadToNode.bin +0 -0
  478. data/spec/data/read_to_node/2_no_read256_or_259/HOWTO_RECREATE.txt +3 -0
  479. data/spec/data/read_to_node/2_no_read256_or_259/LastGraph +6693 -0
  480. data/spec/data/read_to_node/2_no_read256_or_259/ReadToNode.bin +0 -0
  481. data/spec/data/read_to_node/3_no_last_read/LastGraph +6694 -0
  482. data/spec/data/read_to_node/3_no_last_read/ReadToNode.bin +0 -0
  483. data/spec/data/t/details.txt +5 -0
  484. data/spec/data/t/details.txt.srt +5 -0
  485. data/spec/data/t/location.txt +3 -0
  486. data/spec/data/t/location.txt.srt +3 -0
  487. data/spec/data/tweak/1_gap_then_unscaffolded/answer.fa +2 -0
  488. data/spec/data/tweak/1_gap_then_unscaffolded/reads.fa.gz +0 -0
  489. data/spec/data/tweak/1_gap_then_unscaffolded/scaffolds.fa +6 -0
  490. data/spec/data/tweak/2_second_genome/answer2.fa +2 -0
  491. data/spec/data/tweak/2_second_genome/reads.fa.gz +0 -0
  492. data/spec/data/tweak/3_variant/answer.fa +2 -0
  493. data/spec/data/tweak/3_variant/lesser_answer.fa +2 -0
  494. data/spec/data/tweak/3_variant/reads.fa.gz +0 -0
  495. data/spec/data/tweak/3_variant/with_gaps.fa +2 -0
  496. data/spec/data/velvet_test_trails/Assem/Graph +17 -0
  497. data/spec/data/velvet_test_trails/Assem/Graph2 +40 -0
  498. data/spec/data/velvet_test_trails/Assem/LastGraph +40 -0
  499. data/spec/data/velvet_test_trails/Assem/Log +35 -0
  500. data/spec/data/velvet_test_trails/Assem/PreGraph +9 -0
  501. data/spec/data/velvet_test_trails/Assem/Roadmaps +89 -0
  502. data/spec/data/velvet_test_trails/Assem/Sequences +50 -0
  503. data/spec/data/velvet_test_trails/Assem/a.svg +53 -0
  504. data/spec/data/velvet_test_trails/Assem/contigs.fa +15 -0
  505. data/spec/data/velvet_test_trails/Assem/stats.txt +5 -0
  506. data/spec/data/velvet_test_trails/node_fwds.fa +8 -0
  507. data/spec/data/velvet_test_trails/node_seqs.fa +9 -0
  508. data/spec/data/velvet_test_trails/nodes_fwd_rev.fa +16 -0
  509. data/spec/data/velvet_test_trails/read1.fa +2 -0
  510. data/spec/data/velvet_test_trails/reads.fa +50 -0
  511. data/spec/data/velvet_test_trails_reverse/Assem/LastGraph +17 -0
  512. data/spec/data/velvet_test_trails_reverse/Assem/a.svg +53 -0
  513. data/spec/data/velvet_test_trails_reverse/reads_reversed.fa +10 -0
  514. data/spec/data/visualise/1/LastGraph +6695 -0
  515. data/spec/data/visualise/2_paired_end/HOWTO_RECREATE.txt +10 -0
  516. data/spec/data/visualise/2_paired_end/rand1.fa +2 -0
  517. data/spec/data/visualise/2_paired_end/rand2.fa +2 -0
  518. data/spec/data/visualise/2_paired_end/with_gaps.fa +8 -0
  519. data/spec/data/visualise/2_paired_end/with_gaps.read_pairs.fa.gz +0 -0
  520. data/spec/data/wander/1/random1.fa +2 -0
  521. data/spec/data/wander/1/random1.sammy.fa +804 -0
  522. data/spec/depth_first_search_spec.rb +190 -0
  523. data/spec/dijkstra_spec.rb +143 -0
  524. data/spec/explore_spec.rb +29 -0
  525. data/spec/fluffer_spec.rb +155 -0
  526. data/spec/gapfiller_spec.rb +107 -0
  527. data/spec/graph_explorer_spec.rb +475 -0
  528. data/spec/graph_generator_spec.rb +99 -0
  529. data/spec/height_finder_spec.rb +306 -0
  530. data/spec/kmer_abundance_pattern_spec.rb +56 -0
  531. data/spec/kmer_coverage_based_path_filter_spec.rb +73 -0
  532. data/spec/kmer_profile_finder_spec.rb +38 -0
  533. data/spec/kmers_count_tabulate_spec.rb +120 -0
  534. data/spec/oriented_node_trail_spec.rb +221 -0
  535. data/spec/paired_end_neighbours_spec.rb +126 -0
  536. data/spec/paths_between_nodes_spec.rb +349 -0
  537. data/spec/priner_spec.rb +7 -0
  538. data/spec/read_input_spec.rb +23 -0
  539. data/spec/read_selection_by_kmer_spec.rb +166 -0
  540. data/spec/read_to_node_spec.rb +35 -0
  541. data/spec/roundup_spec.rb +366 -0
  542. data/spec/scaffold_breaker_spec.rb +144 -0
  543. data/spec/sequence_spec.rb +43 -0
  544. data/spec/single_coherent_paths_between_nodes_spec.rb +492 -0
  545. data/spec/single_coherent_wanderer_spec.rb +120 -0
  546. data/spec/single_ended_assembler_spec.rb +398 -0
  547. data/spec/spec_helper.rb +310 -0
  548. data/spec/velvet_graph_sequence_extractor_spec.rb +80 -0
  549. data/spec/visualise_spec.rb +105 -0
  550. data/spec/wander_spec.rb +119 -0
  551. data/spec/watch_for_changes.sh +16 -0
  552. data/validation/fasta_compare.rb +72 -0
  553. data/validation/gapfill_simulate_perfect.rb +108 -0
  554. metadata +899 -0
@@ -0,0 +1,413 @@
1
+
2
+ ; match.asm -- Pentium-Pro optimized version of longest_match()
3
+ ;
4
+ ; Updated for zlib 1.1.3 and converted to MASM 6.1x
5
+ ; Copyright (C) 2000 Dan Higdon <hdan@kinesoft.com>
6
+ ; and Chuck Walbourn <chuckw@kinesoft.com>
7
+ ; Corrections by Cosmin Truta <cosmint@cs.ubbcluj.ro>
8
+ ;
9
+ ; This is free software; you can redistribute it and/or modify it
10
+ ; under the terms of the GNU General Public License.
11
+
12
+ ; Based on match.S
13
+ ; Written for zlib 1.1.2
14
+ ; Copyright (C) 1998 Brian Raiter <breadbox@muppetlabs.com>
15
+ ;
16
+ ; Modified by Gilles Vollant (2005) for add gzhead and gzindex
17
+
18
+ .686P
19
+ .MODEL FLAT
20
+
21
+ ;===========================================================================
22
+ ; EQUATES
23
+ ;===========================================================================
24
+
25
+ MAX_MATCH EQU 258
26
+ MIN_MATCH EQU 3
27
+ MIN_LOOKAHEAD EQU (MAX_MATCH + MIN_MATCH + 1)
28
+ MAX_MATCH_8 EQU ((MAX_MATCH + 7) AND (NOT 7))
29
+
30
+ ;===========================================================================
31
+ ; STRUCTURES
32
+ ;===========================================================================
33
+
34
+ ; This STRUCT assumes a 4-byte alignment
35
+
36
+ DEFLATE_STATE STRUCT
37
+ ds_strm dd ?
38
+ ds_status dd ?
39
+ ds_pending_buf dd ?
40
+ ds_pending_buf_size dd ?
41
+ ds_pending_out dd ?
42
+ ds_pending dd ?
43
+ ds_wrap dd ?
44
+ ; gzhead and gzindex are added in zlib 1.2.2.2 (see deflate.h)
45
+ ds_gzhead dd ?
46
+ ds_gzindex dd ?
47
+ ds_data_type db ?
48
+ ds_method db ?
49
+ db ? ; padding
50
+ db ? ; padding
51
+ ds_last_flush dd ?
52
+ ds_w_size dd ? ; used
53
+ ds_w_bits dd ?
54
+ ds_w_mask dd ? ; used
55
+ ds_window dd ? ; used
56
+ ds_window_size dd ?
57
+ ds_prev dd ? ; used
58
+ ds_head dd ?
59
+ ds_ins_h dd ?
60
+ ds_hash_size dd ?
61
+ ds_hash_bits dd ?
62
+ ds_hash_mask dd ?
63
+ ds_hash_shift dd ?
64
+ ds_block_start dd ?
65
+ ds_match_length dd ? ; used
66
+ ds_prev_match dd ? ; used
67
+ ds_match_available dd ?
68
+ ds_strstart dd ? ; used
69
+ ds_match_start dd ? ; used
70
+ ds_lookahead dd ? ; used
71
+ ds_prev_length dd ? ; used
72
+ ds_max_chain_length dd ? ; used
73
+ ds_max_laxy_match dd ?
74
+ ds_level dd ?
75
+ ds_strategy dd ?
76
+ ds_good_match dd ? ; used
77
+ ds_nice_match dd ? ; used
78
+
79
+ ; Don't need anymore of the struct for match
80
+ DEFLATE_STATE ENDS
81
+
82
+ ;===========================================================================
83
+ ; CODE
84
+ ;===========================================================================
85
+ _TEXT SEGMENT
86
+
87
+ ;---------------------------------------------------------------------------
88
+ ; match_init
89
+ ;---------------------------------------------------------------------------
90
+ ALIGN 4
91
+ PUBLIC _match_init
92
+ _match_init PROC
93
+ ; no initialization needed
94
+ ret
95
+ _match_init ENDP
96
+
97
+ ;---------------------------------------------------------------------------
98
+ ; uInt longest_match(deflate_state *deflatestate, IPos curmatch)
99
+ ;---------------------------------------------------------------------------
100
+ ALIGN 4
101
+
102
+ PUBLIC _longest_match
103
+ _longest_match PROC
104
+
105
+ ; Since this code uses EBP for a scratch register, the stack frame must
106
+ ; be manually constructed and referenced relative to the ESP register.
107
+
108
+ ; Stack image
109
+ ; Variables
110
+ chainlenwmask = 0 ; high word: current chain len
111
+ ; low word: s->wmask
112
+ window = 4 ; local copy of s->window
113
+ windowbestlen = 8 ; s->window + bestlen
114
+ scanend = 12 ; last two bytes of string
115
+ scanstart = 16 ; first two bytes of string
116
+ scanalign = 20 ; dword-misalignment of string
117
+ nicematch = 24 ; a good enough match size
118
+ bestlen = 28 ; size of best match so far
119
+ scan = 32 ; ptr to string wanting match
120
+ varsize = 36 ; number of bytes (also offset to last saved register)
121
+
122
+ ; Saved Registers (actually pushed into place)
123
+ ebx_save = 36
124
+ edi_save = 40
125
+ esi_save = 44
126
+ ebp_save = 48
127
+
128
+ ; Parameters
129
+ retaddr = 52
130
+ deflatestate = 56
131
+ curmatch = 60
132
+
133
+ ; Save registers that the compiler may be using
134
+ push ebp
135
+ push edi
136
+ push esi
137
+ push ebx
138
+
139
+ ; Allocate local variable space
140
+ sub esp,varsize
141
+
142
+ ; Retrieve the function arguments. ecx will hold cur_match
143
+ ; throughout the entire function. edx will hold the pointer to the
144
+ ; deflate_state structure during the function's setup (before
145
+ ; entering the main loop).
146
+
147
+ mov edx, [esp+deflatestate]
148
+ ASSUME edx:PTR DEFLATE_STATE
149
+
150
+ mov ecx, [esp+curmatch]
151
+
152
+ ; uInt wmask = s->w_mask;
153
+ ; unsigned chain_length = s->max_chain_length;
154
+ ; if (s->prev_length >= s->good_match) {
155
+ ; chain_length >>= 2;
156
+ ; }
157
+
158
+ mov eax, [edx].ds_prev_length
159
+ mov ebx, [edx].ds_good_match
160
+ cmp eax, ebx
161
+ mov eax, [edx].ds_w_mask
162
+ mov ebx, [edx].ds_max_chain_length
163
+ jl SHORT LastMatchGood
164
+ shr ebx, 2
165
+ LastMatchGood:
166
+
167
+ ; chainlen is decremented once beforehand so that the function can
168
+ ; use the sign flag instead of the zero flag for the exit test.
169
+ ; It is then shifted into the high word, to make room for the wmask
170
+ ; value, which it will always accompany.
171
+
172
+ dec ebx
173
+ shl ebx, 16
174
+ or ebx, eax
175
+ mov [esp+chainlenwmask], ebx
176
+
177
+ ; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
178
+
179
+ mov eax, [edx].ds_nice_match
180
+ mov ebx, [edx].ds_lookahead
181
+ cmp ebx, eax
182
+ jl SHORT LookaheadLess
183
+ mov ebx, eax
184
+ LookaheadLess:
185
+ mov [esp+nicematch], ebx
186
+
187
+ ;/* register Bytef *scan = s->window + s->strstart; */
188
+
189
+ mov esi, [edx].ds_window
190
+ mov [esp+window], esi
191
+ mov ebp, [edx].ds_strstart
192
+ lea edi, [esi+ebp]
193
+ mov [esp+scan],edi
194
+
195
+ ;/* Determine how many bytes the scan ptr is off from being */
196
+ ;/* dword-aligned. */
197
+
198
+ mov eax, edi
199
+ neg eax
200
+ and eax, 3
201
+ mov [esp+scanalign], eax
202
+
203
+ ;/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */
204
+ ;/* s->strstart - (IPos)MAX_DIST(s) : NIL; */
205
+
206
+ mov eax, [edx].ds_w_size
207
+ sub eax, MIN_LOOKAHEAD
208
+ sub ebp, eax
209
+ jg SHORT LimitPositive
210
+ xor ebp, ebp
211
+ LimitPositive:
212
+
213
+ ;/* int best_len = s->prev_length; */
214
+
215
+ mov eax, [edx].ds_prev_length
216
+ mov [esp+bestlen], eax
217
+
218
+ ;/* Store the sum of s->window + best_len in %esi locally, and in %esi. */
219
+
220
+ add esi, eax
221
+ mov [esp+windowbestlen], esi
222
+
223
+ ;/* register ush scan_start = *(ushf*)scan; */
224
+ ;/* register ush scan_end = *(ushf*)(scan+best_len-1); */
225
+ ;/* Posf *prev = s->prev; */
226
+
227
+ movzx ebx, WORD PTR[edi]
228
+ mov [esp+scanstart], ebx
229
+ movzx ebx, WORD PTR[eax+edi-1]
230
+ mov [esp+scanend], ebx
231
+ mov edi, [edx].ds_prev
232
+
233
+ ;/* Jump into the main loop. */
234
+
235
+ mov edx, [esp+chainlenwmask]
236
+ jmp SHORT LoopEntry
237
+
238
+ ;/* do {
239
+ ; * match = s->window + cur_match;
240
+ ; * if (*(ushf*)(match+best_len-1) != scan_end ||
241
+ ; * *(ushf*)match != scan_start) continue;
242
+ ; * [...]
243
+ ; * } while ((cur_match = prev[cur_match & wmask]) > limit
244
+ ; * && --chain_length != 0);
245
+ ; *
246
+ ; * Here is the inner loop of the function. The function will spend the
247
+ ; * majority of its time in this loop, and majority of that time will
248
+ ; * be spent in the first ten instructions.
249
+ ; *
250
+ ; * Within this loop:
251
+ ; * %ebx = scanend
252
+ ; * %ecx = curmatch
253
+ ; * %edx = chainlenwmask - i.e., ((chainlen << 16) | wmask)
254
+ ; * %esi = windowbestlen - i.e., (window + bestlen)
255
+ ; * %edi = prev
256
+ ; * %ebp = limit
257
+ ; */
258
+
259
+ ALIGN 4
260
+ LookupLoop:
261
+ and ecx, edx
262
+ movzx ecx, WORD PTR[edi+ecx*2]
263
+ cmp ecx, ebp
264
+ jbe LeaveNow
265
+ sub edx, 000010000H
266
+ js LeaveNow
267
+
268
+ LoopEntry:
269
+ movzx eax, WORD PTR[esi+ecx-1]
270
+ cmp eax, ebx
271
+ jnz SHORT LookupLoop
272
+
273
+ mov eax, [esp+window]
274
+ movzx eax, WORD PTR[eax+ecx]
275
+ cmp eax, [esp+scanstart]
276
+ jnz SHORT LookupLoop
277
+
278
+ ;/* Store the current value of chainlen. */
279
+
280
+ mov [esp+chainlenwmask], edx
281
+
282
+ ;/* Point %edi to the string under scrutiny, and %esi to the string we */
283
+ ;/* are hoping to match it up with. In actuality, %esi and %edi are */
284
+ ;/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */
285
+ ;/* initialized to -(MAX_MATCH_8 - scanalign). */
286
+
287
+ mov esi, [esp+window]
288
+ mov edi, [esp+scan]
289
+ add esi, ecx
290
+ mov eax, [esp+scanalign]
291
+ mov edx, -MAX_MATCH_8
292
+ lea edi, [edi+eax+MAX_MATCH_8]
293
+ lea esi, [esi+eax+MAX_MATCH_8]
294
+
295
+ ;/* Test the strings for equality, 8 bytes at a time. At the end,
296
+ ; * adjust %edx so that it is offset to the exact byte that mismatched.
297
+ ; *
298
+ ; * We already know at this point that the first three bytes of the
299
+ ; * strings match each other, and they can be safely passed over before
300
+ ; * starting the compare loop. So what this code does is skip over 0-3
301
+ ; * bytes, as much as necessary in order to dword-align the %edi
302
+ ; * pointer. (%esi will still be misaligned three times out of four.)
303
+ ; *
304
+ ; * It should be confessed that this loop usually does not represent
305
+ ; * much of the total running time. Replacing it with a more
306
+ ; * straightforward "rep cmpsb" would not drastically degrade
307
+ ; * performance.
308
+ ; */
309
+
310
+ LoopCmps:
311
+ mov eax, DWORD PTR[esi+edx]
312
+ xor eax, DWORD PTR[edi+edx]
313
+ jnz SHORT LeaveLoopCmps
314
+
315
+ mov eax, DWORD PTR[esi+edx+4]
316
+ xor eax, DWORD PTR[edi+edx+4]
317
+ jnz SHORT LeaveLoopCmps4
318
+
319
+ add edx, 8
320
+ jnz SHORT LoopCmps
321
+ jmp LenMaximum
322
+ ALIGN 4
323
+
324
+ LeaveLoopCmps4:
325
+ add edx, 4
326
+
327
+ LeaveLoopCmps:
328
+ test eax, 00000FFFFH
329
+ jnz SHORT LenLower
330
+
331
+ add edx, 2
332
+ shr eax, 16
333
+
334
+ LenLower:
335
+ sub al, 1
336
+ adc edx, 0
337
+
338
+ ;/* Calculate the length of the match. If it is longer than MAX_MATCH, */
339
+ ;/* then automatically accept it as the best possible match and leave. */
340
+
341
+ lea eax, [edi+edx]
342
+ mov edi, [esp+scan]
343
+ sub eax, edi
344
+ cmp eax, MAX_MATCH
345
+ jge SHORT LenMaximum
346
+
347
+ ;/* If the length of the match is not longer than the best match we */
348
+ ;/* have so far, then forget it and return to the lookup loop. */
349
+
350
+ mov edx, [esp+deflatestate]
351
+ mov ebx, [esp+bestlen]
352
+ cmp eax, ebx
353
+ jg SHORT LongerMatch
354
+ mov esi, [esp+windowbestlen]
355
+ mov edi, [edx].ds_prev
356
+ mov ebx, [esp+scanend]
357
+ mov edx, [esp+chainlenwmask]
358
+ jmp LookupLoop
359
+ ALIGN 4
360
+
361
+ ;/* s->match_start = cur_match; */
362
+ ;/* best_len = len; */
363
+ ;/* if (len >= nice_match) break; */
364
+ ;/* scan_end = *(ushf*)(scan+best_len-1); */
365
+
366
+ LongerMatch:
367
+ mov ebx, [esp+nicematch]
368
+ mov [esp+bestlen], eax
369
+ mov [edx].ds_match_start, ecx
370
+ cmp eax, ebx
371
+ jge SHORT LeaveNow
372
+ mov esi, [esp+window]
373
+ add esi, eax
374
+ mov [esp+windowbestlen], esi
375
+ movzx ebx, WORD PTR[edi+eax-1]
376
+ mov edi, [edx].ds_prev
377
+ mov [esp+scanend], ebx
378
+ mov edx, [esp+chainlenwmask]
379
+ jmp LookupLoop
380
+ ALIGN 4
381
+
382
+ ;/* Accept the current string, with the maximum possible length. */
383
+
384
+ LenMaximum:
385
+ mov edx, [esp+deflatestate]
386
+ mov DWORD PTR[esp+bestlen], MAX_MATCH
387
+ mov [edx].ds_match_start, ecx
388
+
389
+ ;/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */
390
+ ;/* return s->lookahead; */
391
+
392
+ LeaveNow:
393
+ mov edx, [esp+deflatestate]
394
+ mov ebx, [esp+bestlen]
395
+ mov eax, [edx].ds_lookahead
396
+ cmp ebx, eax
397
+ jg SHORT LookaheadRet
398
+ mov eax, ebx
399
+ LookaheadRet:
400
+
401
+ ; Restore the stack and return from whence we came.
402
+
403
+ add esp, varsize
404
+ pop ebx
405
+ pop esi
406
+ pop edi
407
+ pop ebp
408
+ ret
409
+
410
+ _longest_match ENDP
411
+
412
+ _TEXT ENDS
413
+ END
@@ -0,0 +1,2 @@
1
+ ml64.exe /Flinffasx64 /c /Zi inffasx64.asm
2
+ ml64.exe /Flgvmat64 /c /Zi gvmat64.asm
@@ -0,0 +1,513 @@
1
+ ;uInt longest_match_x64(
2
+ ; deflate_state *s,
3
+ ; IPos cur_match); /* current match */
4
+
5
+ ; gvmat64.asm -- Asm portion of the optimized longest_match for 32 bits x86
6
+ ; Copyright (C) 1995-2005 Jean-loup Gailly, Brian Raiter and Gilles Vollant.
7
+ ;
8
+ ; File written by Gilles Vollant, by converting to assembly the longest_match
9
+ ; from Jean-loup Gailly in deflate.c of zLib and infoZip zip.
10
+ ;
11
+ ; and by taking inspiration on asm686 with masm, optimised assembly code
12
+ ; from Brian Raiter, written 1998
13
+ ;
14
+ ; http://www.zlib.net
15
+ ; http://www.winimage.com/zLibDll
16
+ ; http://www.muppetlabs.com/~breadbox/software/assembly.html
17
+ ;
18
+ ; to compile this file for infozip Zip, I use option:
19
+ ; ml64.exe /Flgvmat64 /c /Zi /DINFOZIP gvmat64.asm
20
+ ;
21
+ ; to compile this file for zLib, I use option:
22
+ ; ml64.exe /Flgvmat64 /c /Zi gvmat64.asm
23
+ ; Be carrefull to adapt zlib1222add below to your version of zLib
24
+ ; (if you use a version of zLib before 1.0.4 or after 1.2.2.2, change
25
+ ; value of zlib1222add later)
26
+ ;
27
+ ; This file compile with Microsoft Macro Assembler (x64) for AMD64
28
+ ;
29
+ ; ml64.exe is given with Visual Studio 2005 and Windows 2003 server DDK
30
+ ;
31
+ ; (you can get Windows 2003 server DDK with ml64 and cl for AMD64 from
32
+ ; http://www.microsoft.com/whdc/devtools/ddk/default.mspx for low price)
33
+ ;
34
+
35
+
36
+ ;uInt longest_match(s, cur_match)
37
+ ; deflate_state *s;
38
+ ; IPos cur_match; /* current match */
39
+ .code
40
+ longest_match PROC
41
+
42
+
43
+ ;LocalVarsSize equ 88
44
+ LocalVarsSize equ 72
45
+
46
+ ; register used : rax,rbx,rcx,rdx,rsi,rdi,r8,r9,r10,r11,r12
47
+ ; free register : r14,r15
48
+ ; register can be saved : rsp
49
+
50
+ chainlenwmask equ rsp + 8 - LocalVarsSize ; high word: current chain len
51
+ ; low word: s->wmask
52
+ ;window equ rsp + xx - LocalVarsSize ; local copy of s->window ; stored in r10
53
+ ;windowbestlen equ rsp + xx - LocalVarsSize ; s->window + bestlen , use r10+r11
54
+ ;scanstart equ rsp + xx - LocalVarsSize ; first two bytes of string ; stored in r12w
55
+ ;scanend equ rsp + xx - LocalVarsSize ; last two bytes of string use ebx
56
+ ;scanalign equ rsp + xx - LocalVarsSize ; dword-misalignment of string r13
57
+ ;bestlen equ rsp + xx - LocalVarsSize ; size of best match so far -> r11d
58
+ ;scan equ rsp + xx - LocalVarsSize ; ptr to string wanting match -> r9
59
+ IFDEF INFOZIP
60
+ ELSE
61
+ nicematch equ (rsp + 16 - LocalVarsSize) ; a good enough match size
62
+ ENDIF
63
+
64
+ save_rdi equ rsp + 24 - LocalVarsSize
65
+ save_rsi equ rsp + 32 - LocalVarsSize
66
+ save_rbx equ rsp + 40 - LocalVarsSize
67
+ save_rbp equ rsp + 48 - LocalVarsSize
68
+ save_r12 equ rsp + 56 - LocalVarsSize
69
+ save_r13 equ rsp + 64 - LocalVarsSize
70
+ ;save_r14 equ rsp + 72 - LocalVarsSize
71
+ ;save_r15 equ rsp + 80 - LocalVarsSize
72
+
73
+
74
+
75
+ ; all the +4 offsets are due to the addition of pending_buf_size (in zlib
76
+ ; in the deflate_state structure since the asm code was first written
77
+ ; (if you compile with zlib 1.0.4 or older, remove the +4).
78
+ ; Note : these value are good with a 8 bytes boundary pack structure
79
+
80
+
81
+ MAX_MATCH equ 258
82
+ MIN_MATCH equ 3
83
+ MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1)
84
+
85
+
86
+ ;;; Offsets for fields in the deflate_state structure. These numbers
87
+ ;;; are calculated from the definition of deflate_state, with the
88
+ ;;; assumption that the compiler will dword-align the fields. (Thus,
89
+ ;;; changing the definition of deflate_state could easily cause this
90
+ ;;; program to crash horribly, without so much as a warning at
91
+ ;;; compile time. Sigh.)
92
+
93
+ ; all the +zlib1222add offsets are due to the addition of fields
94
+ ; in zlib in the deflate_state structure since the asm code was first written
95
+ ; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)").
96
+ ; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0").
97
+ ; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8").
98
+
99
+
100
+ IFDEF INFOZIP
101
+
102
+ _DATA SEGMENT
103
+ COMM window_size:DWORD
104
+ ; WMask ; 7fff
105
+ COMM window:BYTE:010040H
106
+ COMM prev:WORD:08000H
107
+ ; MatchLen : unused
108
+ ; PrevMatch : unused
109
+ COMM strstart:DWORD
110
+ COMM match_start:DWORD
111
+ ; Lookahead : ignore
112
+ COMM prev_length:DWORD ; PrevLen
113
+ COMM max_chain_length:DWORD
114
+ COMM good_match:DWORD
115
+ COMM nice_match:DWORD
116
+ prev_ad equ OFFSET prev
117
+ window_ad equ OFFSET window
118
+ nicematch equ nice_match
119
+ _DATA ENDS
120
+ WMask equ 07fffh
121
+
122
+ ELSE
123
+
124
+ IFNDEF zlib1222add
125
+ zlib1222add equ 8
126
+ ENDIF
127
+ dsWSize equ 56+zlib1222add+(zlib1222add/2)
128
+ dsWMask equ 64+zlib1222add+(zlib1222add/2)
129
+ dsWindow equ 72+zlib1222add
130
+ dsPrev equ 88+zlib1222add
131
+ dsMatchLen equ 128+zlib1222add
132
+ dsPrevMatch equ 132+zlib1222add
133
+ dsStrStart equ 140+zlib1222add
134
+ dsMatchStart equ 144+zlib1222add
135
+ dsLookahead equ 148+zlib1222add
136
+ dsPrevLen equ 152+zlib1222add
137
+ dsMaxChainLen equ 156+zlib1222add
138
+ dsGoodMatch equ 172+zlib1222add
139
+ dsNiceMatch equ 176+zlib1222add
140
+
141
+ window_size equ [ rcx + dsWSize]
142
+ WMask equ [ rcx + dsWMask]
143
+ window_ad equ [ rcx + dsWindow]
144
+ prev_ad equ [ rcx + dsPrev]
145
+ strstart equ [ rcx + dsStrStart]
146
+ match_start equ [ rcx + dsMatchStart]
147
+ Lookahead equ [ rcx + dsLookahead] ; 0ffffffffh on infozip
148
+ prev_length equ [ rcx + dsPrevLen]
149
+ max_chain_length equ [ rcx + dsMaxChainLen]
150
+ good_match equ [ rcx + dsGoodMatch]
151
+ nice_match equ [ rcx + dsNiceMatch]
152
+ ENDIF
153
+
154
+ ; parameter 1 in r8(deflate state s), param 2 in rdx (cur match)
155
+
156
+ ; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and
157
+ ; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp
158
+ ;
159
+ ; All registers must be preserved across the call, except for
160
+ ; rax, rcx, rdx, r8, r9, r10, and r11, which are scratch.
161
+
162
+
163
+
164
+ ;;; Save registers that the compiler may be using, and adjust esp to
165
+ ;;; make room for our stack frame.
166
+
167
+
168
+ ;;; Retrieve the function arguments. r8d will hold cur_match
169
+ ;;; throughout the entire function. edx will hold the pointer to the
170
+ ;;; deflate_state structure during the function's setup (before
171
+ ;;; entering the main loop.
172
+
173
+ ; parameter 1 in rcx (deflate_state* s), param 2 in edx -> r8 (cur match)
174
+
175
+ ; this clear high 32 bits of r8, which can be garbage in both r8 and rdx
176
+
177
+ mov [save_rdi],rdi
178
+ mov [save_rsi],rsi
179
+ mov [save_rbx],rbx
180
+ mov [save_rbp],rbp
181
+ IFDEF INFOZIP
182
+ mov r8d,ecx
183
+ ELSE
184
+ mov r8d,edx
185
+ ENDIF
186
+ mov [save_r12],r12
187
+ mov [save_r13],r13
188
+ ; mov [save_r14],r14
189
+ ; mov [save_r15],r15
190
+
191
+
192
+ ;;; uInt wmask = s->w_mask;
193
+ ;;; unsigned chain_length = s->max_chain_length;
194
+ ;;; if (s->prev_length >= s->good_match) {
195
+ ;;; chain_length >>= 2;
196
+ ;;; }
197
+
198
+ mov edi, prev_length
199
+ mov esi, good_match
200
+ mov eax, WMask
201
+ mov ebx, max_chain_length
202
+ cmp edi, esi
203
+ jl LastMatchGood
204
+ shr ebx, 2
205
+ LastMatchGood:
206
+
207
+ ;;; chainlen is decremented once beforehand so that the function can
208
+ ;;; use the sign flag instead of the zero flag for the exit test.
209
+ ;;; It is then shifted into the high word, to make room for the wmask
210
+ ;;; value, which it will always accompany.
211
+
212
+ dec ebx
213
+ shl ebx, 16
214
+ or ebx, eax
215
+
216
+ ;;; on zlib only
217
+ ;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
218
+
219
+ IFDEF INFOZIP
220
+ mov [chainlenwmask], ebx
221
+ ; on infozip nice_match = [nice_match]
222
+ ELSE
223
+ mov eax, nice_match
224
+ mov [chainlenwmask], ebx
225
+ mov r10d, Lookahead
226
+ cmp r10d, eax
227
+ cmovnl r10d, eax
228
+ mov [nicematch],r10d
229
+ ENDIF
230
+
231
+ ;;; register Bytef *scan = s->window + s->strstart;
232
+ mov r10, window_ad
233
+ mov ebp, strstart
234
+ lea r13, [r10 + rbp]
235
+
236
+ ;;; Determine how many bytes the scan ptr is off from being
237
+ ;;; dword-aligned.
238
+
239
+ mov r9,r13
240
+ neg r13
241
+ and r13,3
242
+
243
+ ;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
244
+ ;;; s->strstart - (IPos)MAX_DIST(s) : NIL;
245
+ IFDEF INFOZIP
246
+ mov eax,07efah ; MAX_DIST = (WSIZE-MIN_LOOKAHEAD) (0x8000-(3+8+1))
247
+ ELSE
248
+ mov eax, window_size
249
+ sub eax, MIN_LOOKAHEAD
250
+ ENDIF
251
+ xor edi,edi
252
+ sub ebp, eax
253
+
254
+ mov r11d, prev_length
255
+
256
+ cmovng ebp,edi
257
+
258
+ ;;; int best_len = s->prev_length;
259
+
260
+
261
+ ;;; Store the sum of s->window + best_len in esi locally, and in esi.
262
+
263
+ lea rsi,[r10+r11]
264
+
265
+ ;;; register ush scan_start = *(ushf*)scan;
266
+ ;;; register ush scan_end = *(ushf*)(scan+best_len-1);
267
+ ;;; Posf *prev = s->prev;
268
+
269
+ movzx r12d,word ptr [r9]
270
+ movzx ebx, word ptr [r9 + r11 - 1]
271
+
272
+ mov rdi, prev_ad
273
+
274
+ ;;; Jump into the main loop.
275
+
276
+ mov edx, [chainlenwmask]
277
+
278
+ cmp bx,word ptr [rsi + r8 - 1]
279
+ jz LookupLoopIsZero
280
+
281
+ LookupLoop1:
282
+ and r8d, edx
283
+
284
+ movzx r8d, word ptr [rdi + r8*2]
285
+ cmp r8d, ebp
286
+ jbe LeaveNow
287
+ sub edx, 00010000h
288
+ js LeaveNow
289
+
290
+ LoopEntry1:
291
+ cmp bx,word ptr [rsi + r8 - 1]
292
+ jz LookupLoopIsZero
293
+
294
+ LookupLoop2:
295
+ and r8d, edx
296
+
297
+ movzx r8d, word ptr [rdi + r8*2]
298
+ cmp r8d, ebp
299
+ jbe LeaveNow
300
+ sub edx, 00010000h
301
+ js LeaveNow
302
+
303
+ LoopEntry2:
304
+ cmp bx,word ptr [rsi + r8 - 1]
305
+ jz LookupLoopIsZero
306
+
307
+ LookupLoop4:
308
+ and r8d, edx
309
+
310
+ movzx r8d, word ptr [rdi + r8*2]
311
+ cmp r8d, ebp
312
+ jbe LeaveNow
313
+ sub edx, 00010000h
314
+ js LeaveNow
315
+
316
+ LoopEntry4:
317
+
318
+ cmp bx,word ptr [rsi + r8 - 1]
319
+ jnz LookupLoop1
320
+ jmp LookupLoopIsZero
321
+
322
+
323
+ ;;; do {
324
+ ;;; match = s->window + cur_match;
325
+ ;;; if (*(ushf*)(match+best_len-1) != scan_end ||
326
+ ;;; *(ushf*)match != scan_start) continue;
327
+ ;;; [...]
328
+ ;;; } while ((cur_match = prev[cur_match & wmask]) > limit
329
+ ;;; && --chain_length != 0);
330
+ ;;;
331
+ ;;; Here is the inner loop of the function. The function will spend the
332
+ ;;; majority of its time in this loop, and majority of that time will
333
+ ;;; be spent in the first ten instructions.
334
+ ;;;
335
+ ;;; Within this loop:
336
+ ;;; ebx = scanend
337
+ ;;; r8d = curmatch
338
+ ;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask)
339
+ ;;; esi = windowbestlen - i.e., (window + bestlen)
340
+ ;;; edi = prev
341
+ ;;; ebp = limit
342
+
343
+ LookupLoop:
344
+ and r8d, edx
345
+
346
+ movzx r8d, word ptr [rdi + r8*2]
347
+ cmp r8d, ebp
348
+ jbe LeaveNow
349
+ sub edx, 00010000h
350
+ js LeaveNow
351
+
352
+ LoopEntry:
353
+
354
+ cmp bx,word ptr [rsi + r8 - 1]
355
+ jnz LookupLoop1
356
+ LookupLoopIsZero:
357
+ cmp r12w, word ptr [r10 + r8]
358
+ jnz LookupLoop1
359
+
360
+
361
+ ;;; Store the current value of chainlen.
362
+ mov [chainlenwmask], edx
363
+
364
+ ;;; Point edi to the string under scrutiny, and esi to the string we
365
+ ;;; are hoping to match it up with. In actuality, esi and edi are
366
+ ;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is
367
+ ;;; initialized to -(MAX_MATCH_8 - scanalign).
368
+
369
+ lea rsi,[r8+r10]
370
+ mov rdx, 0fffffffffffffef8h; -(MAX_MATCH_8)
371
+ lea rsi, [rsi + r13 + 0108h] ;MAX_MATCH_8]
372
+ lea rdi, [r9 + r13 + 0108h] ;MAX_MATCH_8]
373
+
374
+ prefetcht1 [rsi+rdx]
375
+ prefetcht1 [rdi+rdx]
376
+
377
+
378
+ ;;; Test the strings for equality, 8 bytes at a time. At the end,
379
+ ;;; adjust rdx so that it is offset to the exact byte that mismatched.
380
+ ;;;
381
+ ;;; We already know at this point that the first three bytes of the
382
+ ;;; strings match each other, and they can be safely passed over before
383
+ ;;; starting the compare loop. So what this code does is skip over 0-3
384
+ ;;; bytes, as much as necessary in order to dword-align the edi
385
+ ;;; pointer. (rsi will still be misaligned three times out of four.)
386
+ ;;;
387
+ ;;; It should be confessed that this loop usually does not represent
388
+ ;;; much of the total running time. Replacing it with a more
389
+ ;;; straightforward "rep cmpsb" would not drastically degrade
390
+ ;;; performance.
391
+
392
+
393
+ LoopCmps:
394
+ mov rax, [rsi + rdx]
395
+ xor rax, [rdi + rdx]
396
+ jnz LeaveLoopCmps
397
+
398
+ mov rax, [rsi + rdx + 8]
399
+ xor rax, [rdi + rdx + 8]
400
+ jnz LeaveLoopCmps8
401
+
402
+
403
+ mov rax, [rsi + rdx + 8+8]
404
+ xor rax, [rdi + rdx + 8+8]
405
+ jnz LeaveLoopCmps16
406
+
407
+ add rdx,8+8+8
408
+
409
+ jmp short LoopCmps
410
+ LeaveLoopCmps16: add rdx,8
411
+ LeaveLoopCmps8: add rdx,8
412
+ LeaveLoopCmps:
413
+
414
+ test eax, 0000FFFFh
415
+ jnz LenLower
416
+
417
+ test eax,0ffffffffh
418
+
419
+ jnz LenLower32
420
+
421
+ add rdx,4
422
+ shr rax,32
423
+ or ax,ax
424
+ jnz LenLower
425
+
426
+ LenLower32:
427
+ shr eax,16
428
+ add rdx,2
429
+ LenLower: sub al, 1
430
+ adc rdx, 0
431
+ ;;; Calculate the length of the match. If it is longer than MAX_MATCH,
432
+ ;;; then automatically accept it as the best possible match and leave.
433
+
434
+ lea rax, [rdi + rdx]
435
+ sub rax, r9
436
+ cmp eax, MAX_MATCH
437
+ jge LenMaximum
438
+
439
+ ;;; If the length of the match is not longer than the best match we
440
+ ;;; have so far, then forget it and return to the lookup loop.
441
+ ;///////////////////////////////////
442
+
443
+ cmp eax, r11d
444
+ jg LongerMatch
445
+
446
+ lea rsi,[r10+r11]
447
+
448
+ mov rdi, prev_ad
449
+ mov edx, [chainlenwmask]
450
+ jmp LookupLoop
451
+
452
+ ;;; s->match_start = cur_match;
453
+ ;;; best_len = len;
454
+ ;;; if (len >= nice_match) break;
455
+ ;;; scan_end = *(ushf*)(scan+best_len-1);
456
+
457
+ LongerMatch:
458
+ mov r11d, eax
459
+ mov match_start, r8d
460
+ cmp eax, [nicematch]
461
+ jge LeaveNow
462
+
463
+ lea rsi,[r10+rax]
464
+
465
+ movzx ebx, word ptr [r9 + rax - 1]
466
+ mov rdi, prev_ad
467
+ mov edx, [chainlenwmask]
468
+ jmp LookupLoop
469
+
470
+ ;;; Accept the current string, with the maximum possible length.
471
+
472
+ LenMaximum:
473
+ mov r11d,MAX_MATCH
474
+ mov match_start, r8d
475
+
476
+ ;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
477
+ ;;; return s->lookahead;
478
+
479
+ LeaveNow:
480
+ IFDEF INFOZIP
481
+ mov eax,r11d
482
+ ELSE
483
+ mov eax, Lookahead
484
+ cmp r11d, eax
485
+ cmovng eax, r11d
486
+ ENDIF
487
+
488
+ ;;; Restore the stack and return from whence we came.
489
+
490
+
491
+ mov rsi,[save_rsi]
492
+ mov rdi,[save_rdi]
493
+ mov rbx,[save_rbx]
494
+ mov rbp,[save_rbp]
495
+ mov r12,[save_r12]
496
+ mov r13,[save_r13]
497
+ ; mov r14,[save_r14]
498
+ ; mov r15,[save_r15]
499
+
500
+
501
+ ret 0
502
+ ; please don't remove this string !
503
+ ; Your can freely use gvmat64 in any free or commercial app
504
+ ; but it is far better don't remove the string in the binary!
505
+ db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998, converted to amd 64 by Gilles Vollant 2005",0dh,0ah,0
506
+ longest_match ENDP
507
+
508
+ match_init PROC
509
+ ret 0
510
+ match_init ENDP
511
+
512
+
513
+ END