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