finishm 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,1368 @@
1
+ /*
2
+ * inffast.S is a hand tuned assembler version of:
3
+ *
4
+ * inffast.c -- fast decoding
5
+ * Copyright (C) 1995-2003 Mark Adler
6
+ * For conditions of distribution and use, see copyright notice in zlib.h
7
+ *
8
+ * Copyright (C) 2003 Chris Anderson <christop@charm.net>
9
+ * Please use the copyright conditions above.
10
+ *
11
+ * This version (Jan-23-2003) of inflate_fast was coded and tested under
12
+ * GNU/Linux on a pentium 3, using the gcc-3.2 compiler distribution. On that
13
+ * machine, I found that gzip style archives decompressed about 20% faster than
14
+ * the gcc-3.2 -O3 -fomit-frame-pointer compiled version. Your results will
15
+ * depend on how large of a buffer is used for z_stream.next_in & next_out
16
+ * (8K-32K worked best for my 256K cpu cache) and how much overhead there is in
17
+ * stream processing I/O and crc32/addler32. In my case, this routine used
18
+ * 70% of the cpu time and crc32 used 20%.
19
+ *
20
+ * I am confident that this version will work in the general case, but I have
21
+ * not tested a wide variety of datasets or a wide variety of platforms.
22
+ *
23
+ * Jan-24-2003 -- Added -DUSE_MMX define for slightly faster inflating.
24
+ * It should be a runtime flag instead of compile time flag...
25
+ *
26
+ * Jan-26-2003 -- Added runtime check for MMX support with cpuid instruction.
27
+ * With -DUSE_MMX, only MMX code is compiled. With -DNO_MMX, only non-MMX code
28
+ * is compiled. Without either option, runtime detection is enabled. Runtime
29
+ * detection should work on all modern cpus and the recomended algorithm (flip
30
+ * ID bit on eflags and then use the cpuid instruction) is used in many
31
+ * multimedia applications. Tested under win2k with gcc-2.95 and gas-2.12
32
+ * distributed with cygwin3. Compiling with gcc-2.95 -c inffast.S -o
33
+ * inffast.obj generates a COFF object which can then be linked with MSVC++
34
+ * compiled code. Tested under FreeBSD 4.7 with gcc-2.95.
35
+ *
36
+ * Jan-28-2003 -- Tested Athlon XP... MMX mode is slower than no MMX (and
37
+ * slower than compiler generated code). Adjusted cpuid check to use the MMX
38
+ * code only for Pentiums < P4 until I have more data on the P4. Speed
39
+ * improvment is only about 15% on the Athlon when compared with code generated
40
+ * with MSVC++. Not sure yet, but I think the P4 will also be slower using the
41
+ * MMX mode because many of it's x86 ALU instructions execute in .5 cycles and
42
+ * have less latency than MMX ops. Added code to buffer the last 11 bytes of
43
+ * the input stream since the MMX code grabs bits in chunks of 32, which
44
+ * differs from the inffast.c algorithm. I don't think there would have been
45
+ * read overruns where a page boundary was crossed (a segfault), but there
46
+ * could have been overruns when next_in ends on unaligned memory (unintialized
47
+ * memory read).
48
+ *
49
+ * Mar-13-2003 -- P4 MMX is slightly slower than P4 NO_MMX. I created a C
50
+ * version of the non-MMX code so that it doesn't depend on zstrm and zstate
51
+ * structure offsets which are hard coded in this file. This was last tested
52
+ * with zlib-1.2.0 which is currently in beta testing, newer versions of this
53
+ * and inffas86.c can be found at http://www.eetbeetee.com/zlib/ and
54
+ * http://www.charm.net/~christop/zlib/
55
+ */
56
+
57
+
58
+ /*
59
+ * if you have underscore linking problems (_inflate_fast undefined), try
60
+ * using -DGAS_COFF
61
+ */
62
+ #if ! defined( GAS_COFF ) && ! defined( GAS_ELF )
63
+
64
+ #if defined( WIN32 ) || defined( __CYGWIN__ )
65
+ #define GAS_COFF /* windows object format */
66
+ #else
67
+ #define GAS_ELF
68
+ #endif
69
+
70
+ #endif /* ! GAS_COFF && ! GAS_ELF */
71
+
72
+
73
+ #if defined( GAS_COFF )
74
+
75
+ /* coff externals have underscores */
76
+ #define inflate_fast _inflate_fast
77
+ #define inflate_fast_use_mmx _inflate_fast_use_mmx
78
+
79
+ #endif /* GAS_COFF */
80
+
81
+
82
+ .file "inffast.S"
83
+
84
+ .globl inflate_fast
85
+
86
+ .text
87
+ .align 4,0
88
+ .L_invalid_literal_length_code_msg:
89
+ .string "invalid literal/length code"
90
+
91
+ .align 4,0
92
+ .L_invalid_distance_code_msg:
93
+ .string "invalid distance code"
94
+
95
+ .align 4,0
96
+ .L_invalid_distance_too_far_msg:
97
+ .string "invalid distance too far back"
98
+
99
+ #if ! defined( NO_MMX )
100
+ .align 4,0
101
+ .L_mask: /* mask[N] = ( 1 << N ) - 1 */
102
+ .long 0
103
+ .long 1
104
+ .long 3
105
+ .long 7
106
+ .long 15
107
+ .long 31
108
+ .long 63
109
+ .long 127
110
+ .long 255
111
+ .long 511
112
+ .long 1023
113
+ .long 2047
114
+ .long 4095
115
+ .long 8191
116
+ .long 16383
117
+ .long 32767
118
+ .long 65535
119
+ .long 131071
120
+ .long 262143
121
+ .long 524287
122
+ .long 1048575
123
+ .long 2097151
124
+ .long 4194303
125
+ .long 8388607
126
+ .long 16777215
127
+ .long 33554431
128
+ .long 67108863
129
+ .long 134217727
130
+ .long 268435455
131
+ .long 536870911
132
+ .long 1073741823
133
+ .long 2147483647
134
+ .long 4294967295
135
+ #endif /* NO_MMX */
136
+
137
+ .text
138
+
139
+ /*
140
+ * struct z_stream offsets, in zlib.h
141
+ */
142
+ #define next_in_strm 0 /* strm->next_in */
143
+ #define avail_in_strm 4 /* strm->avail_in */
144
+ #define next_out_strm 12 /* strm->next_out */
145
+ #define avail_out_strm 16 /* strm->avail_out */
146
+ #define msg_strm 24 /* strm->msg */
147
+ #define state_strm 28 /* strm->state */
148
+
149
+ /*
150
+ * struct inflate_state offsets, in inflate.h
151
+ */
152
+ #define mode_state 0 /* state->mode */
153
+ #define wsize_state 32 /* state->wsize */
154
+ #define write_state 40 /* state->write */
155
+ #define window_state 44 /* state->window */
156
+ #define hold_state 48 /* state->hold */
157
+ #define bits_state 52 /* state->bits */
158
+ #define lencode_state 68 /* state->lencode */
159
+ #define distcode_state 72 /* state->distcode */
160
+ #define lenbits_state 76 /* state->lenbits */
161
+ #define distbits_state 80 /* state->distbits */
162
+
163
+ /*
164
+ * inflate_fast's activation record
165
+ */
166
+ #define local_var_size 64 /* how much local space for vars */
167
+ #define strm_sp 88 /* first arg: z_stream * (local_var_size + 24) */
168
+ #define start_sp 92 /* second arg: unsigned int (local_var_size + 28) */
169
+
170
+ /*
171
+ * offsets for local vars on stack
172
+ */
173
+ #define out 60 /* unsigned char* */
174
+ #define window 56 /* unsigned char* */
175
+ #define wsize 52 /* unsigned int */
176
+ #define write 48 /* unsigned int */
177
+ #define in 44 /* unsigned char* */
178
+ #define beg 40 /* unsigned char* */
179
+ #define buf 28 /* char[ 12 ] */
180
+ #define len 24 /* unsigned int */
181
+ #define last 20 /* unsigned char* */
182
+ #define end 16 /* unsigned char* */
183
+ #define dcode 12 /* code* */
184
+ #define lcode 8 /* code* */
185
+ #define dmask 4 /* unsigned int */
186
+ #define lmask 0 /* unsigned int */
187
+
188
+ /*
189
+ * typedef enum inflate_mode consts, in inflate.h
190
+ */
191
+ #define INFLATE_MODE_TYPE 11 /* state->mode flags enum-ed in inflate.h */
192
+ #define INFLATE_MODE_BAD 26
193
+
194
+
195
+ #if ! defined( USE_MMX ) && ! defined( NO_MMX )
196
+
197
+ #define RUN_TIME_MMX
198
+
199
+ #define CHECK_MMX 1
200
+ #define DO_USE_MMX 2
201
+ #define DONT_USE_MMX 3
202
+
203
+ .globl inflate_fast_use_mmx
204
+
205
+ .data
206
+
207
+ .align 4,0
208
+ inflate_fast_use_mmx: /* integer flag for run time control 1=check,2=mmx,3=no */
209
+ .long CHECK_MMX
210
+
211
+ #if defined( GAS_ELF )
212
+ /* elf info */
213
+ .type inflate_fast_use_mmx,@object
214
+ .size inflate_fast_use_mmx,4
215
+ #endif
216
+
217
+ #endif /* RUN_TIME_MMX */
218
+
219
+ #if defined( GAS_COFF )
220
+ /* coff info: scl 2 = extern, type 32 = function */
221
+ .def inflate_fast; .scl 2; .type 32; .endef
222
+ #endif
223
+
224
+ .text
225
+
226
+ .align 32,0x90
227
+ inflate_fast:
228
+ pushl %edi
229
+ pushl %esi
230
+ pushl %ebp
231
+ pushl %ebx
232
+ pushf /* save eflags (strm_sp, state_sp assumes this is 32 bits) */
233
+ subl $local_var_size, %esp
234
+ cld
235
+
236
+ #define strm_r %esi
237
+ #define state_r %edi
238
+
239
+ movl strm_sp(%esp), strm_r
240
+ movl state_strm(strm_r), state_r
241
+
242
+ /* in = strm->next_in;
243
+ * out = strm->next_out;
244
+ * last = in + strm->avail_in - 11;
245
+ * beg = out - (start - strm->avail_out);
246
+ * end = out + (strm->avail_out - 257);
247
+ */
248
+ movl avail_in_strm(strm_r), %edx
249
+ movl next_in_strm(strm_r), %eax
250
+
251
+ addl %eax, %edx /* avail_in += next_in */
252
+ subl $11, %edx /* avail_in -= 11 */
253
+
254
+ movl %eax, in(%esp)
255
+ movl %edx, last(%esp)
256
+
257
+ movl start_sp(%esp), %ebp
258
+ movl avail_out_strm(strm_r), %ecx
259
+ movl next_out_strm(strm_r), %ebx
260
+
261
+ subl %ecx, %ebp /* start -= avail_out */
262
+ negl %ebp /* start = -start */
263
+ addl %ebx, %ebp /* start += next_out */
264
+
265
+ subl $257, %ecx /* avail_out -= 257 */
266
+ addl %ebx, %ecx /* avail_out += out */
267
+
268
+ movl %ebx, out(%esp)
269
+ movl %ebp, beg(%esp)
270
+ movl %ecx, end(%esp)
271
+
272
+ /* wsize = state->wsize;
273
+ * write = state->write;
274
+ * window = state->window;
275
+ * hold = state->hold;
276
+ * bits = state->bits;
277
+ * lcode = state->lencode;
278
+ * dcode = state->distcode;
279
+ * lmask = ( 1 << state->lenbits ) - 1;
280
+ * dmask = ( 1 << state->distbits ) - 1;
281
+ */
282
+
283
+ movl lencode_state(state_r), %eax
284
+ movl distcode_state(state_r), %ecx
285
+
286
+ movl %eax, lcode(%esp)
287
+ movl %ecx, dcode(%esp)
288
+
289
+ movl $1, %eax
290
+ movl lenbits_state(state_r), %ecx
291
+ shll %cl, %eax
292
+ decl %eax
293
+ movl %eax, lmask(%esp)
294
+
295
+ movl $1, %eax
296
+ movl distbits_state(state_r), %ecx
297
+ shll %cl, %eax
298
+ decl %eax
299
+ movl %eax, dmask(%esp)
300
+
301
+ movl wsize_state(state_r), %eax
302
+ movl write_state(state_r), %ecx
303
+ movl window_state(state_r), %edx
304
+
305
+ movl %eax, wsize(%esp)
306
+ movl %ecx, write(%esp)
307
+ movl %edx, window(%esp)
308
+
309
+ movl hold_state(state_r), %ebp
310
+ movl bits_state(state_r), %ebx
311
+
312
+ #undef strm_r
313
+ #undef state_r
314
+
315
+ #define in_r %esi
316
+ #define from_r %esi
317
+ #define out_r %edi
318
+
319
+ movl in(%esp), in_r
320
+ movl last(%esp), %ecx
321
+ cmpl in_r, %ecx
322
+ ja .L_align_long /* if in < last */
323
+
324
+ addl $11, %ecx /* ecx = &in[ avail_in ] */
325
+ subl in_r, %ecx /* ecx = avail_in */
326
+ movl $12, %eax
327
+ subl %ecx, %eax /* eax = 12 - avail_in */
328
+ leal buf(%esp), %edi
329
+ rep movsb /* memcpy( buf, in, avail_in ) */
330
+ movl %eax, %ecx
331
+ xorl %eax, %eax
332
+ rep stosb /* memset( &buf[ avail_in ], 0, 12 - avail_in ) */
333
+ leal buf(%esp), in_r /* in = buf */
334
+ movl in_r, last(%esp) /* last = in, do just one iteration */
335
+ jmp .L_is_aligned
336
+
337
+ /* align in_r on long boundary */
338
+ .L_align_long:
339
+ testl $3, in_r
340
+ jz .L_is_aligned
341
+ xorl %eax, %eax
342
+ movb (in_r), %al
343
+ incl in_r
344
+ movl %ebx, %ecx
345
+ addl $8, %ebx
346
+ shll %cl, %eax
347
+ orl %eax, %ebp
348
+ jmp .L_align_long
349
+
350
+ .L_is_aligned:
351
+ movl out(%esp), out_r
352
+
353
+ #if defined( NO_MMX )
354
+ jmp .L_do_loop
355
+ #endif
356
+
357
+ #if defined( USE_MMX )
358
+ jmp .L_init_mmx
359
+ #endif
360
+
361
+ /*** Runtime MMX check ***/
362
+
363
+ #if defined( RUN_TIME_MMX )
364
+ .L_check_mmx:
365
+ cmpl $DO_USE_MMX, inflate_fast_use_mmx
366
+ je .L_init_mmx
367
+ ja .L_do_loop /* > 2 */
368
+
369
+ pushl %eax
370
+ pushl %ebx
371
+ pushl %ecx
372
+ pushl %edx
373
+ pushf
374
+ movl (%esp), %eax /* copy eflags to eax */
375
+ xorl $0x200000, (%esp) /* try toggling ID bit of eflags (bit 21)
376
+ * to see if cpu supports cpuid...
377
+ * ID bit method not supported by NexGen but
378
+ * bios may load a cpuid instruction and
379
+ * cpuid may be disabled on Cyrix 5-6x86 */
380
+ popf
381
+ pushf
382
+ popl %edx /* copy new eflags to edx */
383
+ xorl %eax, %edx /* test if ID bit is flipped */
384
+ jz .L_dont_use_mmx /* not flipped if zero */
385
+ xorl %eax, %eax
386
+ cpuid
387
+ cmpl $0x756e6547, %ebx /* check for GenuineIntel in ebx,ecx,edx */
388
+ jne .L_dont_use_mmx
389
+ cmpl $0x6c65746e, %ecx
390
+ jne .L_dont_use_mmx
391
+ cmpl $0x49656e69, %edx
392
+ jne .L_dont_use_mmx
393
+ movl $1, %eax
394
+ cpuid /* get cpu features */
395
+ shrl $8, %eax
396
+ andl $15, %eax
397
+ cmpl $6, %eax /* check for Pentium family, is 0xf for P4 */
398
+ jne .L_dont_use_mmx
399
+ testl $0x800000, %edx /* test if MMX feature is set (bit 23) */
400
+ jnz .L_use_mmx
401
+ jmp .L_dont_use_mmx
402
+ .L_use_mmx:
403
+ movl $DO_USE_MMX, inflate_fast_use_mmx
404
+ jmp .L_check_mmx_pop
405
+ .L_dont_use_mmx:
406
+ movl $DONT_USE_MMX, inflate_fast_use_mmx
407
+ .L_check_mmx_pop:
408
+ popl %edx
409
+ popl %ecx
410
+ popl %ebx
411
+ popl %eax
412
+ jmp .L_check_mmx
413
+ #endif
414
+
415
+
416
+ /*** Non-MMX code ***/
417
+
418
+ #if defined ( NO_MMX ) || defined( RUN_TIME_MMX )
419
+
420
+ #define hold_r %ebp
421
+ #define bits_r %bl
422
+ #define bitslong_r %ebx
423
+
424
+ .align 32,0x90
425
+ .L_while_test:
426
+ /* while (in < last && out < end)
427
+ */
428
+ cmpl out_r, end(%esp)
429
+ jbe .L_break_loop /* if (out >= end) */
430
+
431
+ cmpl in_r, last(%esp)
432
+ jbe .L_break_loop
433
+
434
+ .L_do_loop:
435
+ /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out
436
+ *
437
+ * do {
438
+ * if (bits < 15) {
439
+ * hold |= *((unsigned short *)in)++ << bits;
440
+ * bits += 16
441
+ * }
442
+ * this = lcode[hold & lmask]
443
+ */
444
+ cmpb $15, bits_r
445
+ ja .L_get_length_code /* if (15 < bits) */
446
+
447
+ xorl %eax, %eax
448
+ lodsw /* al = *(ushort *)in++ */
449
+ movb bits_r, %cl /* cl = bits, needs it for shifting */
450
+ addb $16, bits_r /* bits += 16 */
451
+ shll %cl, %eax
452
+ orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */
453
+
454
+ .L_get_length_code:
455
+ movl lmask(%esp), %edx /* edx = lmask */
456
+ movl lcode(%esp), %ecx /* ecx = lcode */
457
+ andl hold_r, %edx /* edx &= hold */
458
+ movl (%ecx,%edx,4), %eax /* eax = lcode[hold & lmask] */
459
+
460
+ .L_dolen:
461
+ /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out
462
+ *
463
+ * dolen:
464
+ * bits -= this.bits;
465
+ * hold >>= this.bits
466
+ */
467
+ movb %ah, %cl /* cl = this.bits */
468
+ subb %ah, bits_r /* bits -= this.bits */
469
+ shrl %cl, hold_r /* hold >>= this.bits */
470
+
471
+ /* check if op is a literal
472
+ * if (op == 0) {
473
+ * PUP(out) = this.val;
474
+ * }
475
+ */
476
+ testb %al, %al
477
+ jnz .L_test_for_length_base /* if (op != 0) 45.7% */
478
+
479
+ shrl $16, %eax /* output this.val char */
480
+ stosb
481
+ jmp .L_while_test
482
+
483
+ .L_test_for_length_base:
484
+ /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out, %edx = len
485
+ *
486
+ * else if (op & 16) {
487
+ * len = this.val
488
+ * op &= 15
489
+ * if (op) {
490
+ * if (op > bits) {
491
+ * hold |= *((unsigned short *)in)++ << bits;
492
+ * bits += 16
493
+ * }
494
+ * len += hold & mask[op];
495
+ * bits -= op;
496
+ * hold >>= op;
497
+ * }
498
+ */
499
+ #define len_r %edx
500
+ movl %eax, len_r /* len = this */
501
+ shrl $16, len_r /* len = this.val */
502
+ movb %al, %cl
503
+
504
+ testb $16, %al
505
+ jz .L_test_for_second_level_length /* if ((op & 16) == 0) 8% */
506
+ andb $15, %cl /* op &= 15 */
507
+ jz .L_save_len /* if (!op) */
508
+ cmpb %cl, bits_r
509
+ jae .L_add_bits_to_len /* if (op <= bits) */
510
+
511
+ movb %cl, %ch /* stash op in ch, freeing cl */
512
+ xorl %eax, %eax
513
+ lodsw /* al = *(ushort *)in++ */
514
+ movb bits_r, %cl /* cl = bits, needs it for shifting */
515
+ addb $16, bits_r /* bits += 16 */
516
+ shll %cl, %eax
517
+ orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */
518
+ movb %ch, %cl /* move op back to ecx */
519
+
520
+ .L_add_bits_to_len:
521
+ movl $1, %eax
522
+ shll %cl, %eax
523
+ decl %eax
524
+ subb %cl, bits_r
525
+ andl hold_r, %eax /* eax &= hold */
526
+ shrl %cl, hold_r
527
+ addl %eax, len_r /* len += hold & mask[op] */
528
+
529
+ .L_save_len:
530
+ movl len_r, len(%esp) /* save len */
531
+ #undef len_r
532
+
533
+ .L_decode_distance:
534
+ /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out, %edx = dist
535
+ *
536
+ * if (bits < 15) {
537
+ * hold |= *((unsigned short *)in)++ << bits;
538
+ * bits += 16
539
+ * }
540
+ * this = dcode[hold & dmask];
541
+ * dodist:
542
+ * bits -= this.bits;
543
+ * hold >>= this.bits;
544
+ * op = this.op;
545
+ */
546
+
547
+ cmpb $15, bits_r
548
+ ja .L_get_distance_code /* if (15 < bits) */
549
+
550
+ xorl %eax, %eax
551
+ lodsw /* al = *(ushort *)in++ */
552
+ movb bits_r, %cl /* cl = bits, needs it for shifting */
553
+ addb $16, bits_r /* bits += 16 */
554
+ shll %cl, %eax
555
+ orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */
556
+
557
+ .L_get_distance_code:
558
+ movl dmask(%esp), %edx /* edx = dmask */
559
+ movl dcode(%esp), %ecx /* ecx = dcode */
560
+ andl hold_r, %edx /* edx &= hold */
561
+ movl (%ecx,%edx,4), %eax /* eax = dcode[hold & dmask] */
562
+
563
+ #define dist_r %edx
564
+ .L_dodist:
565
+ movl %eax, dist_r /* dist = this */
566
+ shrl $16, dist_r /* dist = this.val */
567
+ movb %ah, %cl
568
+ subb %ah, bits_r /* bits -= this.bits */
569
+ shrl %cl, hold_r /* hold >>= this.bits */
570
+
571
+ /* if (op & 16) {
572
+ * dist = this.val
573
+ * op &= 15
574
+ * if (op > bits) {
575
+ * hold |= *((unsigned short *)in)++ << bits;
576
+ * bits += 16
577
+ * }
578
+ * dist += hold & mask[op];
579
+ * bits -= op;
580
+ * hold >>= op;
581
+ */
582
+ movb %al, %cl /* cl = this.op */
583
+
584
+ testb $16, %al /* if ((op & 16) == 0) */
585
+ jz .L_test_for_second_level_dist
586
+ andb $15, %cl /* op &= 15 */
587
+ jz .L_check_dist_one
588
+ cmpb %cl, bits_r
589
+ jae .L_add_bits_to_dist /* if (op <= bits) 97.6% */
590
+
591
+ movb %cl, %ch /* stash op in ch, freeing cl */
592
+ xorl %eax, %eax
593
+ lodsw /* al = *(ushort *)in++ */
594
+ movb bits_r, %cl /* cl = bits, needs it for shifting */
595
+ addb $16, bits_r /* bits += 16 */
596
+ shll %cl, %eax
597
+ orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */
598
+ movb %ch, %cl /* move op back to ecx */
599
+
600
+ .L_add_bits_to_dist:
601
+ movl $1, %eax
602
+ shll %cl, %eax
603
+ decl %eax /* (1 << op) - 1 */
604
+ subb %cl, bits_r
605
+ andl hold_r, %eax /* eax &= hold */
606
+ shrl %cl, hold_r
607
+ addl %eax, dist_r /* dist += hold & ((1 << op) - 1) */
608
+ jmp .L_check_window
609
+
610
+ .L_check_window:
611
+ /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist
612
+ * %ecx = nbytes
613
+ *
614
+ * nbytes = out - beg;
615
+ * if (dist <= nbytes) {
616
+ * from = out - dist;
617
+ * do {
618
+ * PUP(out) = PUP(from);
619
+ * } while (--len > 0) {
620
+ * }
621
+ */
622
+
623
+ movl in_r, in(%esp) /* save in so from can use it's reg */
624
+ movl out_r, %eax
625
+ subl beg(%esp), %eax /* nbytes = out - beg */
626
+
627
+ cmpl dist_r, %eax
628
+ jb .L_clip_window /* if (dist > nbytes) 4.2% */
629
+
630
+ movl len(%esp), %ecx
631
+ movl out_r, from_r
632
+ subl dist_r, from_r /* from = out - dist */
633
+
634
+ subl $3, %ecx
635
+ movb (from_r), %al
636
+ movb %al, (out_r)
637
+ movb 1(from_r), %al
638
+ movb 2(from_r), %dl
639
+ addl $3, from_r
640
+ movb %al, 1(out_r)
641
+ movb %dl, 2(out_r)
642
+ addl $3, out_r
643
+ rep movsb
644
+
645
+ movl in(%esp), in_r /* move in back to %esi, toss from */
646
+ jmp .L_while_test
647
+
648
+ .align 16,0x90
649
+ .L_check_dist_one:
650
+ cmpl $1, dist_r
651
+ jne .L_check_window
652
+ cmpl out_r, beg(%esp)
653
+ je .L_check_window
654
+
655
+ decl out_r
656
+ movl len(%esp), %ecx
657
+ movb (out_r), %al
658
+ subl $3, %ecx
659
+
660
+ movb %al, 1(out_r)
661
+ movb %al, 2(out_r)
662
+ movb %al, 3(out_r)
663
+ addl $4, out_r
664
+ rep stosb
665
+
666
+ jmp .L_while_test
667
+
668
+ .align 16,0x90
669
+ .L_test_for_second_level_length:
670
+ /* else if ((op & 64) == 0) {
671
+ * this = lcode[this.val + (hold & mask[op])];
672
+ * }
673
+ */
674
+ testb $64, %al
675
+ jnz .L_test_for_end_of_block /* if ((op & 64) != 0) */
676
+
677
+ movl $1, %eax
678
+ shll %cl, %eax
679
+ decl %eax
680
+ andl hold_r, %eax /* eax &= hold */
681
+ addl %edx, %eax /* eax += this.val */
682
+ movl lcode(%esp), %edx /* edx = lcode */
683
+ movl (%edx,%eax,4), %eax /* eax = lcode[val + (hold&mask[op])] */
684
+ jmp .L_dolen
685
+
686
+ .align 16,0x90
687
+ .L_test_for_second_level_dist:
688
+ /* else if ((op & 64) == 0) {
689
+ * this = dcode[this.val + (hold & mask[op])];
690
+ * }
691
+ */
692
+ testb $64, %al
693
+ jnz .L_invalid_distance_code /* if ((op & 64) != 0) */
694
+
695
+ movl $1, %eax
696
+ shll %cl, %eax
697
+ decl %eax
698
+ andl hold_r, %eax /* eax &= hold */
699
+ addl %edx, %eax /* eax += this.val */
700
+ movl dcode(%esp), %edx /* edx = dcode */
701
+ movl (%edx,%eax,4), %eax /* eax = dcode[val + (hold&mask[op])] */
702
+ jmp .L_dodist
703
+
704
+ .align 16,0x90
705
+ .L_clip_window:
706
+ /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist
707
+ * %ecx = nbytes
708
+ *
709
+ * else {
710
+ * if (dist > wsize) {
711
+ * invalid distance
712
+ * }
713
+ * from = window;
714
+ * nbytes = dist - nbytes;
715
+ * if (write == 0) {
716
+ * from += wsize - nbytes;
717
+ */
718
+ #define nbytes_r %ecx
719
+ movl %eax, nbytes_r
720
+ movl wsize(%esp), %eax /* prepare for dist compare */
721
+ negl nbytes_r /* nbytes = -nbytes */
722
+ movl window(%esp), from_r /* from = window */
723
+
724
+ cmpl dist_r, %eax
725
+ jb .L_invalid_distance_too_far /* if (dist > wsize) */
726
+
727
+ addl dist_r, nbytes_r /* nbytes = dist - nbytes */
728
+ cmpl $0, write(%esp)
729
+ jne .L_wrap_around_window /* if (write != 0) */
730
+
731
+ subl nbytes_r, %eax
732
+ addl %eax, from_r /* from += wsize - nbytes */
733
+
734
+ /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist
735
+ * %ecx = nbytes, %eax = len
736
+ *
737
+ * if (nbytes < len) {
738
+ * len -= nbytes;
739
+ * do {
740
+ * PUP(out) = PUP(from);
741
+ * } while (--nbytes);
742
+ * from = out - dist;
743
+ * }
744
+ * }
745
+ */
746
+ #define len_r %eax
747
+ movl len(%esp), len_r
748
+ cmpl nbytes_r, len_r
749
+ jbe .L_do_copy1 /* if (nbytes >= len) */
750
+
751
+ subl nbytes_r, len_r /* len -= nbytes */
752
+ rep movsb
753
+ movl out_r, from_r
754
+ subl dist_r, from_r /* from = out - dist */
755
+ jmp .L_do_copy1
756
+
757
+ cmpl nbytes_r, len_r
758
+ jbe .L_do_copy1 /* if (nbytes >= len) */
759
+
760
+ subl nbytes_r, len_r /* len -= nbytes */
761
+ rep movsb
762
+ movl out_r, from_r
763
+ subl dist_r, from_r /* from = out - dist */
764
+ jmp .L_do_copy1
765
+
766
+ .L_wrap_around_window:
767
+ /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist
768
+ * %ecx = nbytes, %eax = write, %eax = len
769
+ *
770
+ * else if (write < nbytes) {
771
+ * from += wsize + write - nbytes;
772
+ * nbytes -= write;
773
+ * if (nbytes < len) {
774
+ * len -= nbytes;
775
+ * do {
776
+ * PUP(out) = PUP(from);
777
+ * } while (--nbytes);
778
+ * from = window;
779
+ * nbytes = write;
780
+ * if (nbytes < len) {
781
+ * len -= nbytes;
782
+ * do {
783
+ * PUP(out) = PUP(from);
784
+ * } while(--nbytes);
785
+ * from = out - dist;
786
+ * }
787
+ * }
788
+ * }
789
+ */
790
+ #define write_r %eax
791
+ movl write(%esp), write_r
792
+ cmpl write_r, nbytes_r
793
+ jbe .L_contiguous_in_window /* if (write >= nbytes) */
794
+
795
+ addl wsize(%esp), from_r
796
+ addl write_r, from_r
797
+ subl nbytes_r, from_r /* from += wsize + write - nbytes */
798
+ subl write_r, nbytes_r /* nbytes -= write */
799
+ #undef write_r
800
+
801
+ movl len(%esp), len_r
802
+ cmpl nbytes_r, len_r
803
+ jbe .L_do_copy1 /* if (nbytes >= len) */
804
+
805
+ subl nbytes_r, len_r /* len -= nbytes */
806
+ rep movsb
807
+ movl window(%esp), from_r /* from = window */
808
+ movl write(%esp), nbytes_r /* nbytes = write */
809
+ cmpl nbytes_r, len_r
810
+ jbe .L_do_copy1 /* if (nbytes >= len) */
811
+
812
+ subl nbytes_r, len_r /* len -= nbytes */
813
+ rep movsb
814
+ movl out_r, from_r
815
+ subl dist_r, from_r /* from = out - dist */
816
+ jmp .L_do_copy1
817
+
818
+ .L_contiguous_in_window:
819
+ /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist
820
+ * %ecx = nbytes, %eax = write, %eax = len
821
+ *
822
+ * else {
823
+ * from += write - nbytes;
824
+ * if (nbytes < len) {
825
+ * len -= nbytes;
826
+ * do {
827
+ * PUP(out) = PUP(from);
828
+ * } while (--nbytes);
829
+ * from = out - dist;
830
+ * }
831
+ * }
832
+ */
833
+ #define write_r %eax
834
+ addl write_r, from_r
835
+ subl nbytes_r, from_r /* from += write - nbytes */
836
+ #undef write_r
837
+
838
+ movl len(%esp), len_r
839
+ cmpl nbytes_r, len_r
840
+ jbe .L_do_copy1 /* if (nbytes >= len) */
841
+
842
+ subl nbytes_r, len_r /* len -= nbytes */
843
+ rep movsb
844
+ movl out_r, from_r
845
+ subl dist_r, from_r /* from = out - dist */
846
+
847
+ .L_do_copy1:
848
+ /* regs: %esi = from, %esi = in, %ebp = hold, %bl = bits, %edi = out
849
+ * %eax = len
850
+ *
851
+ * while (len > 0) {
852
+ * PUP(out) = PUP(from);
853
+ * len--;
854
+ * }
855
+ * }
856
+ * } while (in < last && out < end);
857
+ */
858
+ #undef nbytes_r
859
+ #define in_r %esi
860
+ movl len_r, %ecx
861
+ rep movsb
862
+
863
+ movl in(%esp), in_r /* move in back to %esi, toss from */
864
+ jmp .L_while_test
865
+
866
+ #undef len_r
867
+ #undef dist_r
868
+
869
+ #endif /* NO_MMX || RUN_TIME_MMX */
870
+
871
+
872
+ /*** MMX code ***/
873
+
874
+ #if defined( USE_MMX ) || defined( RUN_TIME_MMX )
875
+
876
+ .align 32,0x90
877
+ .L_init_mmx:
878
+ emms
879
+
880
+ #undef bits_r
881
+ #undef bitslong_r
882
+ #define bitslong_r %ebp
883
+ #define hold_mm %mm0
884
+ movd %ebp, hold_mm
885
+ movl %ebx, bitslong_r
886
+
887
+ #define used_mm %mm1
888
+ #define dmask2_mm %mm2
889
+ #define lmask2_mm %mm3
890
+ #define lmask_mm %mm4
891
+ #define dmask_mm %mm5
892
+ #define tmp_mm %mm6
893
+
894
+ movd lmask(%esp), lmask_mm
895
+ movq lmask_mm, lmask2_mm
896
+ movd dmask(%esp), dmask_mm
897
+ movq dmask_mm, dmask2_mm
898
+ pxor used_mm, used_mm
899
+ movl lcode(%esp), %ebx /* ebx = lcode */
900
+ jmp .L_do_loop_mmx
901
+
902
+ .align 32,0x90
903
+ .L_while_test_mmx:
904
+ /* while (in < last && out < end)
905
+ */
906
+ cmpl out_r, end(%esp)
907
+ jbe .L_break_loop /* if (out >= end) */
908
+
909
+ cmpl in_r, last(%esp)
910
+ jbe .L_break_loop
911
+
912
+ .L_do_loop_mmx:
913
+ psrlq used_mm, hold_mm /* hold_mm >>= last bit length */
914
+
915
+ cmpl $32, bitslong_r
916
+ ja .L_get_length_code_mmx /* if (32 < bits) */
917
+
918
+ movd bitslong_r, tmp_mm
919
+ movd (in_r), %mm7
920
+ addl $4, in_r
921
+ psllq tmp_mm, %mm7
922
+ addl $32, bitslong_r
923
+ por %mm7, hold_mm /* hold_mm |= *((uint *)in)++ << bits */
924
+
925
+ .L_get_length_code_mmx:
926
+ pand hold_mm, lmask_mm
927
+ movd lmask_mm, %eax
928
+ movq lmask2_mm, lmask_mm
929
+ movl (%ebx,%eax,4), %eax /* eax = lcode[hold & lmask] */
930
+
931
+ .L_dolen_mmx:
932
+ movzbl %ah, %ecx /* ecx = this.bits */
933
+ movd %ecx, used_mm
934
+ subl %ecx, bitslong_r /* bits -= this.bits */
935
+
936
+ testb %al, %al
937
+ jnz .L_test_for_length_base_mmx /* if (op != 0) 45.7% */
938
+
939
+ shrl $16, %eax /* output this.val char */
940
+ stosb
941
+ jmp .L_while_test_mmx
942
+
943
+ .L_test_for_length_base_mmx:
944
+ #define len_r %edx
945
+ movl %eax, len_r /* len = this */
946
+ shrl $16, len_r /* len = this.val */
947
+
948
+ testb $16, %al
949
+ jz .L_test_for_second_level_length_mmx /* if ((op & 16) == 0) 8% */
950
+ andl $15, %eax /* op &= 15 */
951
+ jz .L_decode_distance_mmx /* if (!op) */
952
+
953
+ psrlq used_mm, hold_mm /* hold_mm >>= last bit length */
954
+ movd %eax, used_mm
955
+ movd hold_mm, %ecx
956
+ subl %eax, bitslong_r
957
+ andl .L_mask(,%eax,4), %ecx
958
+ addl %ecx, len_r /* len += hold & mask[op] */
959
+
960
+ .L_decode_distance_mmx:
961
+ psrlq used_mm, hold_mm /* hold_mm >>= last bit length */
962
+
963
+ cmpl $32, bitslong_r
964
+ ja .L_get_dist_code_mmx /* if (32 < bits) */
965
+
966
+ movd bitslong_r, tmp_mm
967
+ movd (in_r), %mm7
968
+ addl $4, in_r
969
+ psllq tmp_mm, %mm7
970
+ addl $32, bitslong_r
971
+ por %mm7, hold_mm /* hold_mm |= *((uint *)in)++ << bits */
972
+
973
+ .L_get_dist_code_mmx:
974
+ movl dcode(%esp), %ebx /* ebx = dcode */
975
+ pand hold_mm, dmask_mm
976
+ movd dmask_mm, %eax
977
+ movq dmask2_mm, dmask_mm
978
+ movl (%ebx,%eax,4), %eax /* eax = dcode[hold & lmask] */
979
+
980
+ .L_dodist_mmx:
981
+ #define dist_r %ebx
982
+ movzbl %ah, %ecx /* ecx = this.bits */
983
+ movl %eax, dist_r
984
+ shrl $16, dist_r /* dist = this.val */
985
+ subl %ecx, bitslong_r /* bits -= this.bits */
986
+ movd %ecx, used_mm
987
+
988
+ testb $16, %al /* if ((op & 16) == 0) */
989
+ jz .L_test_for_second_level_dist_mmx
990
+ andl $15, %eax /* op &= 15 */
991
+ jz .L_check_dist_one_mmx
992
+
993
+ .L_add_bits_to_dist_mmx:
994
+ psrlq used_mm, hold_mm /* hold_mm >>= last bit length */
995
+ movd %eax, used_mm /* save bit length of current op */
996
+ movd hold_mm, %ecx /* get the next bits on input stream */
997
+ subl %eax, bitslong_r /* bits -= op bits */
998
+ andl .L_mask(,%eax,4), %ecx /* ecx = hold & mask[op] */
999
+ addl %ecx, dist_r /* dist += hold & mask[op] */
1000
+
1001
+ .L_check_window_mmx:
1002
+ movl in_r, in(%esp) /* save in so from can use it's reg */
1003
+ movl out_r, %eax
1004
+ subl beg(%esp), %eax /* nbytes = out - beg */
1005
+
1006
+ cmpl dist_r, %eax
1007
+ jb .L_clip_window_mmx /* if (dist > nbytes) 4.2% */
1008
+
1009
+ movl len_r, %ecx
1010
+ movl out_r, from_r
1011
+ subl dist_r, from_r /* from = out - dist */
1012
+
1013
+ subl $3, %ecx
1014
+ movb (from_r), %al
1015
+ movb %al, (out_r)
1016
+ movb 1(from_r), %al
1017
+ movb 2(from_r), %dl
1018
+ addl $3, from_r
1019
+ movb %al, 1(out_r)
1020
+ movb %dl, 2(out_r)
1021
+ addl $3, out_r
1022
+ rep movsb
1023
+
1024
+ movl in(%esp), in_r /* move in back to %esi, toss from */
1025
+ movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */
1026
+ jmp .L_while_test_mmx
1027
+
1028
+ .align 16,0x90
1029
+ .L_check_dist_one_mmx:
1030
+ cmpl $1, dist_r
1031
+ jne .L_check_window_mmx
1032
+ cmpl out_r, beg(%esp)
1033
+ je .L_check_window_mmx
1034
+
1035
+ decl out_r
1036
+ movl len_r, %ecx
1037
+ movb (out_r), %al
1038
+ subl $3, %ecx
1039
+
1040
+ movb %al, 1(out_r)
1041
+ movb %al, 2(out_r)
1042
+ movb %al, 3(out_r)
1043
+ addl $4, out_r
1044
+ rep stosb
1045
+
1046
+ movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */
1047
+ jmp .L_while_test_mmx
1048
+
1049
+ .align 16,0x90
1050
+ .L_test_for_second_level_length_mmx:
1051
+ testb $64, %al
1052
+ jnz .L_test_for_end_of_block /* if ((op & 64) != 0) */
1053
+
1054
+ andl $15, %eax
1055
+ psrlq used_mm, hold_mm /* hold_mm >>= last bit length */
1056
+ movd hold_mm, %ecx
1057
+ andl .L_mask(,%eax,4), %ecx
1058
+ addl len_r, %ecx
1059
+ movl (%ebx,%ecx,4), %eax /* eax = lcode[hold & lmask] */
1060
+ jmp .L_dolen_mmx
1061
+
1062
+ .align 16,0x90
1063
+ .L_test_for_second_level_dist_mmx:
1064
+ testb $64, %al
1065
+ jnz .L_invalid_distance_code /* if ((op & 64) != 0) */
1066
+
1067
+ andl $15, %eax
1068
+ psrlq used_mm, hold_mm /* hold_mm >>= last bit length */
1069
+ movd hold_mm, %ecx
1070
+ andl .L_mask(,%eax,4), %ecx
1071
+ movl dcode(%esp), %eax /* ecx = dcode */
1072
+ addl dist_r, %ecx
1073
+ movl (%eax,%ecx,4), %eax /* eax = lcode[hold & lmask] */
1074
+ jmp .L_dodist_mmx
1075
+
1076
+ .align 16,0x90
1077
+ .L_clip_window_mmx:
1078
+ #define nbytes_r %ecx
1079
+ movl %eax, nbytes_r
1080
+ movl wsize(%esp), %eax /* prepare for dist compare */
1081
+ negl nbytes_r /* nbytes = -nbytes */
1082
+ movl window(%esp), from_r /* from = window */
1083
+
1084
+ cmpl dist_r, %eax
1085
+ jb .L_invalid_distance_too_far /* if (dist > wsize) */
1086
+
1087
+ addl dist_r, nbytes_r /* nbytes = dist - nbytes */
1088
+ cmpl $0, write(%esp)
1089
+ jne .L_wrap_around_window_mmx /* if (write != 0) */
1090
+
1091
+ subl nbytes_r, %eax
1092
+ addl %eax, from_r /* from += wsize - nbytes */
1093
+
1094
+ cmpl nbytes_r, len_r
1095
+ jbe .L_do_copy1_mmx /* if (nbytes >= len) */
1096
+
1097
+ subl nbytes_r, len_r /* len -= nbytes */
1098
+ rep movsb
1099
+ movl out_r, from_r
1100
+ subl dist_r, from_r /* from = out - dist */
1101
+ jmp .L_do_copy1_mmx
1102
+
1103
+ cmpl nbytes_r, len_r
1104
+ jbe .L_do_copy1_mmx /* if (nbytes >= len) */
1105
+
1106
+ subl nbytes_r, len_r /* len -= nbytes */
1107
+ rep movsb
1108
+ movl out_r, from_r
1109
+ subl dist_r, from_r /* from = out - dist */
1110
+ jmp .L_do_copy1_mmx
1111
+
1112
+ .L_wrap_around_window_mmx:
1113
+ #define write_r %eax
1114
+ movl write(%esp), write_r
1115
+ cmpl write_r, nbytes_r
1116
+ jbe .L_contiguous_in_window_mmx /* if (write >= nbytes) */
1117
+
1118
+ addl wsize(%esp), from_r
1119
+ addl write_r, from_r
1120
+ subl nbytes_r, from_r /* from += wsize + write - nbytes */
1121
+ subl write_r, nbytes_r /* nbytes -= write */
1122
+ #undef write_r
1123
+
1124
+ cmpl nbytes_r, len_r
1125
+ jbe .L_do_copy1_mmx /* if (nbytes >= len) */
1126
+
1127
+ subl nbytes_r, len_r /* len -= nbytes */
1128
+ rep movsb
1129
+ movl window(%esp), from_r /* from = window */
1130
+ movl write(%esp), nbytes_r /* nbytes = write */
1131
+ cmpl nbytes_r, len_r
1132
+ jbe .L_do_copy1_mmx /* if (nbytes >= len) */
1133
+
1134
+ subl nbytes_r, len_r /* len -= nbytes */
1135
+ rep movsb
1136
+ movl out_r, from_r
1137
+ subl dist_r, from_r /* from = out - dist */
1138
+ jmp .L_do_copy1_mmx
1139
+
1140
+ .L_contiguous_in_window_mmx:
1141
+ #define write_r %eax
1142
+ addl write_r, from_r
1143
+ subl nbytes_r, from_r /* from += write - nbytes */
1144
+ #undef write_r
1145
+
1146
+ cmpl nbytes_r, len_r
1147
+ jbe .L_do_copy1_mmx /* if (nbytes >= len) */
1148
+
1149
+ subl nbytes_r, len_r /* len -= nbytes */
1150
+ rep movsb
1151
+ movl out_r, from_r
1152
+ subl dist_r, from_r /* from = out - dist */
1153
+
1154
+ .L_do_copy1_mmx:
1155
+ #undef nbytes_r
1156
+ #define in_r %esi
1157
+ movl len_r, %ecx
1158
+ rep movsb
1159
+
1160
+ movl in(%esp), in_r /* move in back to %esi, toss from */
1161
+ movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */
1162
+ jmp .L_while_test_mmx
1163
+
1164
+ #undef hold_r
1165
+ #undef bitslong_r
1166
+
1167
+ #endif /* USE_MMX || RUN_TIME_MMX */
1168
+
1169
+
1170
+ /*** USE_MMX, NO_MMX, and RUNTIME_MMX from here on ***/
1171
+
1172
+ .L_invalid_distance_code:
1173
+ /* else {
1174
+ * strm->msg = "invalid distance code";
1175
+ * state->mode = BAD;
1176
+ * }
1177
+ */
1178
+ movl $.L_invalid_distance_code_msg, %ecx
1179
+ movl $INFLATE_MODE_BAD, %edx
1180
+ jmp .L_update_stream_state
1181
+
1182
+ .L_test_for_end_of_block:
1183
+ /* else if (op & 32) {
1184
+ * state->mode = TYPE;
1185
+ * break;
1186
+ * }
1187
+ */
1188
+ testb $32, %al
1189
+ jz .L_invalid_literal_length_code /* if ((op & 32) == 0) */
1190
+
1191
+ movl $0, %ecx
1192
+ movl $INFLATE_MODE_TYPE, %edx
1193
+ jmp .L_update_stream_state
1194
+
1195
+ .L_invalid_literal_length_code:
1196
+ /* else {
1197
+ * strm->msg = "invalid literal/length code";
1198
+ * state->mode = BAD;
1199
+ * }
1200
+ */
1201
+ movl $.L_invalid_literal_length_code_msg, %ecx
1202
+ movl $INFLATE_MODE_BAD, %edx
1203
+ jmp .L_update_stream_state
1204
+
1205
+ .L_invalid_distance_too_far:
1206
+ /* strm->msg = "invalid distance too far back";
1207
+ * state->mode = BAD;
1208
+ */
1209
+ movl in(%esp), in_r /* from_r has in's reg, put in back */
1210
+ movl $.L_invalid_distance_too_far_msg, %ecx
1211
+ movl $INFLATE_MODE_BAD, %edx
1212
+ jmp .L_update_stream_state
1213
+
1214
+ .L_update_stream_state:
1215
+ /* set strm->msg = %ecx, strm->state->mode = %edx */
1216
+ movl strm_sp(%esp), %eax
1217
+ testl %ecx, %ecx /* if (msg != NULL) */
1218
+ jz .L_skip_msg
1219
+ movl %ecx, msg_strm(%eax) /* strm->msg = msg */
1220
+ .L_skip_msg:
1221
+ movl state_strm(%eax), %eax /* state = strm->state */
1222
+ movl %edx, mode_state(%eax) /* state->mode = edx (BAD | TYPE) */
1223
+ jmp .L_break_loop
1224
+
1225
+ .align 32,0x90
1226
+ .L_break_loop:
1227
+
1228
+ /*
1229
+ * Regs:
1230
+ *
1231
+ * bits = %ebp when mmx, and in %ebx when non-mmx
1232
+ * hold = %hold_mm when mmx, and in %ebp when non-mmx
1233
+ * in = %esi
1234
+ * out = %edi
1235
+ */
1236
+
1237
+ #if defined( USE_MMX ) || defined( RUN_TIME_MMX )
1238
+
1239
+ #if defined( RUN_TIME_MMX )
1240
+
1241
+ cmpl $DO_USE_MMX, inflate_fast_use_mmx
1242
+ jne .L_update_next_in
1243
+
1244
+ #endif /* RUN_TIME_MMX */
1245
+
1246
+ movl %ebp, %ebx
1247
+
1248
+ .L_update_next_in:
1249
+
1250
+ #endif
1251
+
1252
+ #define strm_r %eax
1253
+ #define state_r %edx
1254
+
1255
+ /* len = bits >> 3;
1256
+ * in -= len;
1257
+ * bits -= len << 3;
1258
+ * hold &= (1U << bits) - 1;
1259
+ * state->hold = hold;
1260
+ * state->bits = bits;
1261
+ * strm->next_in = in;
1262
+ * strm->next_out = out;
1263
+ */
1264
+ movl strm_sp(%esp), strm_r
1265
+ movl %ebx, %ecx
1266
+ movl state_strm(strm_r), state_r
1267
+ shrl $3, %ecx
1268
+ subl %ecx, in_r
1269
+ shll $3, %ecx
1270
+ subl %ecx, %ebx
1271
+ movl out_r, next_out_strm(strm_r)
1272
+ movl %ebx, bits_state(state_r)
1273
+ movl %ebx, %ecx
1274
+
1275
+ leal buf(%esp), %ebx
1276
+ cmpl %ebx, last(%esp)
1277
+ jne .L_buf_not_used /* if buf != last */
1278
+
1279
+ subl %ebx, in_r /* in -= buf */
1280
+ movl next_in_strm(strm_r), %ebx
1281
+ movl %ebx, last(%esp) /* last = strm->next_in */
1282
+ addl %ebx, in_r /* in += strm->next_in */
1283
+ movl avail_in_strm(strm_r), %ebx
1284
+ subl $11, %ebx
1285
+ addl %ebx, last(%esp) /* last = &strm->next_in[ avail_in - 11 ] */
1286
+
1287
+ .L_buf_not_used:
1288
+ movl in_r, next_in_strm(strm_r)
1289
+
1290
+ movl $1, %ebx
1291
+ shll %cl, %ebx
1292
+ decl %ebx
1293
+
1294
+ #if defined( USE_MMX ) || defined( RUN_TIME_MMX )
1295
+
1296
+ #if defined( RUN_TIME_MMX )
1297
+
1298
+ cmpl $DO_USE_MMX, inflate_fast_use_mmx
1299
+ jne .L_update_hold
1300
+
1301
+ #endif /* RUN_TIME_MMX */
1302
+
1303
+ psrlq used_mm, hold_mm /* hold_mm >>= last bit length */
1304
+ movd hold_mm, %ebp
1305
+
1306
+ emms
1307
+
1308
+ .L_update_hold:
1309
+
1310
+ #endif /* USE_MMX || RUN_TIME_MMX */
1311
+
1312
+ andl %ebx, %ebp
1313
+ movl %ebp, hold_state(state_r)
1314
+
1315
+ #define last_r %ebx
1316
+
1317
+ /* strm->avail_in = in < last ? 11 + (last - in) : 11 - (in - last) */
1318
+ movl last(%esp), last_r
1319
+ cmpl in_r, last_r
1320
+ jbe .L_last_is_smaller /* if (in >= last) */
1321
+
1322
+ subl in_r, last_r /* last -= in */
1323
+ addl $11, last_r /* last += 11 */
1324
+ movl last_r, avail_in_strm(strm_r)
1325
+ jmp .L_fixup_out
1326
+ .L_last_is_smaller:
1327
+ subl last_r, in_r /* in -= last */
1328
+ negl in_r /* in = -in */
1329
+ addl $11, in_r /* in += 11 */
1330
+ movl in_r, avail_in_strm(strm_r)
1331
+
1332
+ #undef last_r
1333
+ #define end_r %ebx
1334
+
1335
+ .L_fixup_out:
1336
+ /* strm->avail_out = out < end ? 257 + (end - out) : 257 - (out - end)*/
1337
+ movl end(%esp), end_r
1338
+ cmpl out_r, end_r
1339
+ jbe .L_end_is_smaller /* if (out >= end) */
1340
+
1341
+ subl out_r, end_r /* end -= out */
1342
+ addl $257, end_r /* end += 257 */
1343
+ movl end_r, avail_out_strm(strm_r)
1344
+ jmp .L_done
1345
+ .L_end_is_smaller:
1346
+ subl end_r, out_r /* out -= end */
1347
+ negl out_r /* out = -out */
1348
+ addl $257, out_r /* out += 257 */
1349
+ movl out_r, avail_out_strm(strm_r)
1350
+
1351
+ #undef end_r
1352
+ #undef strm_r
1353
+ #undef state_r
1354
+
1355
+ .L_done:
1356
+ addl $local_var_size, %esp
1357
+ popf
1358
+ popl %ebx
1359
+ popl %ebp
1360
+ popl %esi
1361
+ popl %edi
1362
+ ret
1363
+
1364
+ #if defined( GAS_ELF )
1365
+ /* elf info */
1366
+ .type inflate_fast,@function
1367
+ .size inflate_fast,.-inflate_fast
1368
+ #endif