esruby 0.0.0

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 (763) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +22 -0
  4. data/bin/esruby +34 -0
  5. data/lib/esruby.rb +26 -0
  6. data/lib/esruby/build.rb +140 -0
  7. data/lib/esruby/build/configuration.rb +77 -0
  8. data/lib/esruby/gem.rb +5 -0
  9. data/lib/esruby/gem/specification.rb +35 -0
  10. data/resources/build_config.eruby +53 -0
  11. data/resources/cpp/esruby.cpp +64 -0
  12. data/resources/cpp/esruby.hpp +42 -0
  13. data/resources/cpp/main.cpp +9 -0
  14. data/resources/js/esruby.js +45 -0
  15. data/resources/mruby/AUTHORS +40 -0
  16. data/resources/mruby/CONTRIBUTING.md +68 -0
  17. data/resources/mruby/LEGAL +6 -0
  18. data/resources/mruby/MITL +20 -0
  19. data/resources/mruby/Makefile +17 -0
  20. data/resources/mruby/NEWS +13 -0
  21. data/resources/mruby/README.md +92 -0
  22. data/resources/mruby/Rakefile +152 -0
  23. data/resources/mruby/TODO +10 -0
  24. data/resources/mruby/appveyor.yml +38 -0
  25. data/resources/mruby/appveyor_config.rb +50 -0
  26. data/resources/mruby/benchmark/bm_ao_render.rb +314 -0
  27. data/resources/mruby/benchmark/bm_app_lc_fizzbuzz.rb +52 -0
  28. data/resources/mruby/benchmark/bm_fib.rb +7 -0
  29. data/resources/mruby/benchmark/bm_so_lists.rb +47 -0
  30. data/resources/mruby/benchmark/build_config_boxing.rb +28 -0
  31. data/resources/mruby/benchmark/build_config_cc.rb +13 -0
  32. data/resources/mruby/benchmark/plot.gpl +5 -0
  33. data/resources/mruby/bin/mirb +0 -0
  34. data/resources/mruby/bin/mrbc +0 -0
  35. data/resources/mruby/bin/mruby +0 -0
  36. data/resources/mruby/bin/mruby-strip +0 -0
  37. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/README.md +82 -0
  38. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/mrbgem.rake +63 -0
  39. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/mrblib/regexp_pcre.rb +232 -0
  40. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/mrblib/string_pcre.rb +333 -0
  41. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/132html +313 -0
  42. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/AUTHORS +45 -0
  43. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/CMakeLists.txt +959 -0
  44. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/COPYING +5 -0
  45. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/ChangeLog +4981 -0
  46. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/CheckMan +67 -0
  47. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/CleanTxt +113 -0
  48. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/Detrail +35 -0
  49. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/HACKING +473 -0
  50. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/INSTALL +370 -0
  51. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/LICENCE +92 -0
  52. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/Makefile.am +877 -0
  53. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/Makefile.in +2917 -0
  54. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/NEWS +611 -0
  55. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/NON-AUTOTOOLS-BUILD +639 -0
  56. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/NON-UNIX-USE +7 -0
  57. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/PrepareRelease +253 -0
  58. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/README +935 -0
  59. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/RunGrepTest +551 -0
  60. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/RunTest +1015 -0
  61. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/RunTest.bat +616 -0
  62. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/aclocal.m4 +1230 -0
  63. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/output.0 +21280 -0
  64. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/output.1 +21280 -0
  65. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/requests +273 -0
  66. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/traces.0 +2421 -0
  67. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/autom4te.cache/traces.1 +1144 -0
  68. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/cmake/COPYING-CMAKE-SCRIPTS +22 -0
  69. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/cmake/FindEditline.cmake +17 -0
  70. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/cmake/FindPackageHandleStandardArgs.cmake +58 -0
  71. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/cmake/FindReadline.cmake +29 -0
  72. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/compile +343 -0
  73. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config-cmake.h.in +54 -0
  74. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.guess +1552 -0
  75. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.h +392 -0
  76. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.h.generic +392 -0
  77. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.h.in +343 -0
  78. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/config.sub +1804 -0
  79. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/configure +21280 -0
  80. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/configure.ac +1082 -0
  81. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/depcomp +708 -0
  82. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/dftables.c +212 -0
  83. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/index.html +180 -0
  84. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre-config.html +109 -0
  85. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre.html +204 -0
  86. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre16.html +383 -0
  87. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_assign_jit_stack.html +76 -0
  88. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_compile.html +108 -0
  89. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_compile2.html +112 -0
  90. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_config.html +91 -0
  91. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_copy_named_substring.html +65 -0
  92. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_copy_substring.html +61 -0
  93. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_dfa_exec.html +128 -0
  94. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_exec.html +110 -0
  95. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_free_study.html +46 -0
  96. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_free_substring.html +46 -0
  97. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_free_substring_list.html +46 -0
  98. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_fullinfo.html +108 -0
  99. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_named_substring.html +68 -0
  100. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_stringnumber.html +57 -0
  101. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_stringtable_entries.html +60 -0
  102. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_substring.html +64 -0
  103. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_get_substring_list.html +61 -0
  104. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_jit_exec.html +108 -0
  105. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_jit_stack_alloc.html +55 -0
  106. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_jit_stack_free.html +48 -0
  107. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_maketables.html +48 -0
  108. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_pattern_to_host_byte_order.html +58 -0
  109. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_refcount.html +51 -0
  110. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_study.html +68 -0
  111. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_utf16_to_host_byte_order.html +57 -0
  112. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcre_version.html +46 -0
  113. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreapi.html +2786 -0
  114. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrebuild.html +517 -0
  115. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrecallout.html +243 -0
  116. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrecompat.html +216 -0
  117. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrecpp.html +368 -0
  118. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcredemo.html +426 -0
  119. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcregrep.html +757 -0
  120. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrejit.html +458 -0
  121. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrelimits.html +86 -0
  122. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrematching.html +233 -0
  123. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrepartial.html +474 -0
  124. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrepattern.html +2953 -0
  125. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreperform.html +195 -0
  126. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreposix.html +292 -0
  127. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreprecompile.html +158 -0
  128. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcresample.html +110 -0
  129. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcrestack.html +225 -0
  130. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcresyntax.html +521 -0
  131. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcretest.html +1082 -0
  132. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/html/pcreunicode.html +270 -0
  133. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/index.html.src +180 -0
  134. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre-config.1 +92 -0
  135. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre-config.txt +86 -0
  136. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre.3 +202 -0
  137. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre.txt +9909 -0
  138. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre16.3 +390 -0
  139. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre32.3 +389 -0
  140. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_assign_jit_stack.3 +61 -0
  141. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_compile.3 +98 -0
  142. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_compile2.3 +106 -0
  143. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_config.3 +76 -0
  144. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_copy_named_substring.3 +59 -0
  145. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_copy_substring.3 +52 -0
  146. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_dfa_exec.3 +125 -0
  147. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_exec.3 +103 -0
  148. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_free_study.3 +31 -0
  149. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_free_substring.3 +31 -0
  150. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_free_substring_list.3 +31 -0
  151. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_fullinfo.3 +95 -0
  152. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_named_substring.3 +62 -0
  153. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_stringnumber.3 +45 -0
  154. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_stringtable_entries.3 +48 -0
  155. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_substring.3 +55 -0
  156. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_get_substring_list.3 +49 -0
  157. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_jit_exec.3 +104 -0
  158. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_jit_stack_alloc.3 +45 -0
  159. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_jit_stack_free.3 +35 -0
  160. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_maketables.3 +33 -0
  161. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_pattern_to_host_byte_order.3 +46 -0
  162. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_refcount.3 +36 -0
  163. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_study.3 +56 -0
  164. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_utf16_to_host_byte_order.3 +46 -0
  165. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_utf32_to_host_byte_order.3 +46 -0
  166. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcre_version.3 +31 -0
  167. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreapi.3 +2823 -0
  168. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrebuild.3 +520 -0
  169. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrecallout.3 +214 -0
  170. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrecompat.3 +185 -0
  171. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrecpp.3 +348 -0
  172. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcregrep.1 +679 -0
  173. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcregrep.txt +740 -0
  174. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrejit.3 +437 -0
  175. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrelimits.3 +67 -0
  176. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrematching.3 +206 -0
  177. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrepartial.3 +445 -0
  178. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrepattern.3 +2983 -0
  179. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreperform.3 +177 -0
  180. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreposix.3 +270 -0
  181. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreprecompile.3 +151 -0
  182. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcresample.3 +99 -0
  183. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcrestack.3 +215 -0
  184. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcresyntax.3 +496 -0
  185. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcretest.1 +1079 -0
  186. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcretest.txt +1012 -0
  187. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/pcreunicode.3 +255 -0
  188. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/doc/perltest.txt +42 -0
  189. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/install-sh +527 -0
  190. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcre.pc.in +12 -0
  191. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcre16.pc.in +12 -0
  192. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcre32.pc.in +12 -0
  193. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcrecpp.pc.in +12 -0
  194. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/libpcreposix.pc.in +13 -0
  195. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/ltmain.sh +9636 -0
  196. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/ax_pthread.m4 +309 -0
  197. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/libtool.m4 +7844 -0
  198. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/ltoptions.m4 +369 -0
  199. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/ltsugar.m4 +123 -0
  200. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/ltversion.m4 +23 -0
  201. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/lt~obsolete.m4 +98 -0
  202. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/m4/pcre_visibility.m4 +89 -0
  203. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/makevp.bat +66 -0
  204. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/makevp_c.txt +20 -0
  205. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/makevp_l.txt +20 -0
  206. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/missing +331 -0
  207. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre-config.in +133 -0
  208. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre.h +653 -0
  209. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre.h.generic +653 -0
  210. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre.h.in +653 -0
  211. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_byte_order.c +45 -0
  212. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_chartables.c +45 -0
  213. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_compile.c +45 -0
  214. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_config.c +45 -0
  215. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_dfa_exec.c +45 -0
  216. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_exec.c +45 -0
  217. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_fullinfo.c +45 -0
  218. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_get.c +45 -0
  219. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_globals.c +45 -0
  220. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_jit_compile.c +45 -0
  221. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_maketables.c +45 -0
  222. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_newline.c +45 -0
  223. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_ord2utf16.c +90 -0
  224. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_printint.c +45 -0
  225. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_refcount.c +45 -0
  226. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_string_utils.c +45 -0
  227. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_study.c +45 -0
  228. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_tables.c +45 -0
  229. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_ucd.c +45 -0
  230. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_utf16_utils.c +130 -0
  231. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_valid_utf16.c +156 -0
  232. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_version.c +45 -0
  233. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre16_xclass.c +45 -0
  234. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_byte_order.c +45 -0
  235. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_chartables.c +45 -0
  236. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_compile.c +45 -0
  237. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_config.c +45 -0
  238. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_dfa_exec.c +45 -0
  239. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_exec.c +45 -0
  240. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_fullinfo.c +45 -0
  241. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_get.c +45 -0
  242. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_globals.c +45 -0
  243. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_jit_compile.c +45 -0
  244. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_maketables.c +45 -0
  245. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_newline.c +45 -0
  246. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_ord2utf32.c +82 -0
  247. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_printint.c +45 -0
  248. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_refcount.c +45 -0
  249. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_string_utils.c +45 -0
  250. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_study.c +45 -0
  251. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_tables.c +45 -0
  252. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_ucd.c +45 -0
  253. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_utf32_utils.c +141 -0
  254. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_valid_utf32.c +131 -0
  255. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_version.c +45 -0
  256. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre32_xclass.c +45 -0
  257. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_byte_order.c +318 -0
  258. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_chartables.c +198 -0
  259. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_chartables.c.dist +198 -0
  260. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_compile.c +8386 -0
  261. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_config.c +186 -0
  262. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_dfa_exec.c +3582 -0
  263. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_exec.c +7049 -0
  264. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_fullinfo.c +231 -0
  265. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_get.c +662 -0
  266. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_globals.c +84 -0
  267. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_internal.h +2744 -0
  268. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_jit_compile.c +8560 -0
  269. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_jit_test.c +1614 -0
  270. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_maketables.c +151 -0
  271. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_newline.c +210 -0
  272. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_ord2utf8.c +94 -0
  273. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_printint.c +766 -0
  274. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_refcount.c +92 -0
  275. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_scanner.cc +199 -0
  276. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_scanner.h +172 -0
  277. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_scanner_unittest.cc +159 -0
  278. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_string_utils.c +211 -0
  279. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_stringpiece.cc +43 -0
  280. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_stringpiece.h.in +179 -0
  281. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_stringpiece_unittest.cc +150 -0
  282. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_study.c +1562 -0
  283. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_tables.c +655 -0
  284. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_ucd.c +3298 -0
  285. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_valid_utf8.c +312 -0
  286. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_version.c +98 -0
  287. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcre_xclass.c +198 -0
  288. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpp.cc +922 -0
  289. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpp.h +710 -0
  290. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpp_internal.h +71 -0
  291. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpp_unittest.cc +1291 -0
  292. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcrecpparg.h.in +174 -0
  293. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcredemo.c +406 -0
  294. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcregexp.pas +845 -0
  295. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcregrep.c +3180 -0
  296. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcreposix.c +419 -0
  297. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcreposix.h +146 -0
  298. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/pcretest.c +5488 -0
  299. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/perltest.pl +237 -0
  300. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitConfig.h +110 -0
  301. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitConfigInternal.h +484 -0
  302. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitExecAllocator.c +289 -0
  303. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitLir.c +1766 -0
  304. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitLir.h +985 -0
  305. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeARM_Thumb2.c +2008 -0
  306. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeARM_v5.c +2515 -0
  307. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeMIPS_32.c +404 -0
  308. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeMIPS_common.c +1881 -0
  309. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativePPC_32.c +269 -0
  310. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativePPC_64.c +421 -0
  311. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativePPC_common.c +2014 -0
  312. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeSPARC_32.c +164 -0
  313. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeSPARC_common.c +1348 -0
  314. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeX86_32.c +547 -0
  315. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeX86_64.c +810 -0
  316. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitNativeX86_common.c +2836 -0
  317. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/sljit/sljitUtils.c +332 -0
  318. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepbinary +0 -0
  319. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepfilelist +3 -0
  320. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinput +611 -0
  321. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinput3 +15 -0
  322. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinput8 +11 -0
  323. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinputv +4 -0
  324. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepinputx +43 -0
  325. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/greplist +7 -0
  326. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepoutput +707 -0
  327. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepoutput8 +12 -0
  328. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/grepoutputN +16 -1
  329. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/greppatN4 +2 -0
  330. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16 +0 -0
  331. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16BE-1 +0 -0
  332. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16BE-2 +0 -0
  333. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16LE-1 +0 -0
  334. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved16LE-2 +0 -0
  335. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32 +0 -0
  336. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32BE-1 +0 -0
  337. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32BE-2 +0 -0
  338. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32LE-1 +0 -0
  339. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved32LE-2 +0 -0
  340. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/saved8 +0 -0
  341. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput1 +5306 -0
  342. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput10 +1337 -0
  343. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput11 +135 -0
  344. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput12 +89 -0
  345. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput13 +9 -0
  346. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput14 +329 -0
  347. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput15 +430 -0
  348. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput16 +35 -0
  349. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput17 +296 -0
  350. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput18 +296 -0
  351. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput19 +22 -0
  352. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput2 +3813 -0
  353. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput20 +19 -0
  354. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput21 +16 -0
  355. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput22 +13 -0
  356. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput23 +16 -0
  357. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput24 +77 -0
  358. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput25 +32 -0
  359. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput26 +80 -0
  360. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput3 +95 -0
  361. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput4 +624 -0
  362. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput5 +772 -0
  363. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput6 +1319 -0
  364. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput7 +672 -0
  365. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput8 +4801 -0
  366. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinput9 +717 -0
  367. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testinputEBC +121 -0
  368. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput1 +8798 -0
  369. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput10 +2726 -0
  370. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput11-16 +713 -0
  371. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput11-32 +713 -0
  372. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput11-8 +713 -0
  373. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput12 +181 -0
  374. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput13 +21 -0
  375. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput14 +476 -0
  376. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput15 +1269 -0
  377. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput16 +121 -0
  378. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput17 +505 -0
  379. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput18-16 +1022 -0
  380. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput18-32 +1019 -0
  381. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput19 +88 -0
  382. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput2 +12484 -0
  383. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput20 +27 -0
  384. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput21-16 +90 -0
  385. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput21-32 +90 -0
  386. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput22-16 +71 -0
  387. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput22-32 +71 -0
  388. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput23 +42 -0
  389. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput24 +145 -0
  390. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput25 +79 -0
  391. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput26 +148 -0
  392. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput3 +169 -0
  393. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput4 +1094 -0
  394. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput5 +1849 -0
  395. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput6 +2137 -0
  396. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput7 +1473 -0
  397. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput8 +8019 -0
  398. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutput9 +1371 -0
  399. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/testoutputEBC +182 -0
  400. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/wintestinput3 +91 -0
  401. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/testdata/wintestoutput3 +166 -0
  402. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/pcre/ucp.h +197 -0
  403. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/run_test.rb +23 -0
  404. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/src/mruby_regexp_pcre.c +364 -0
  405. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/test/matchdata.rb +94 -0
  406. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/test/regexp.rb +264 -0
  407. data/resources/mruby/build/mrbgems/mruby-regexp-pcre/test/string.rb +201 -0
  408. data/resources/mruby/build_config.rb +152 -0
  409. data/resources/mruby/doc/guides/compile.md +488 -0
  410. data/resources/mruby/doc/guides/debugger.md +370 -0
  411. data/resources/mruby/doc/guides/gc-arena-howto.md +177 -0
  412. data/resources/mruby/doc/guides/mrbconf.md +146 -0
  413. data/resources/mruby/doc/guides/mrbgems.md +340 -0
  414. data/resources/mruby/doc/limitations.md +187 -0
  415. data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/README.md +4 -0
  416. data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/mrbgem.rake +23 -0
  417. data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/mrblib/example.rb +5 -0
  418. data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/src/example.c +20 -0
  419. data/resources/mruby/examples/mrbgems/c_and_ruby_extension_example/test/example.rb +7 -0
  420. data/resources/mruby/examples/mrbgems/c_extension_example/README.md +4 -0
  421. data/resources/mruby/examples/mrbgems/c_extension_example/mrbgem.rake +23 -0
  422. data/resources/mruby/examples/mrbgems/c_extension_example/src/example.c +20 -0
  423. data/resources/mruby/examples/mrbgems/c_extension_example/test/example.c +7 -0
  424. data/resources/mruby/examples/mrbgems/c_extension_example/test/example.rb +3 -0
  425. data/resources/mruby/examples/mrbgems/ruby_extension_example/README.md +4 -0
  426. data/resources/mruby/examples/mrbgems/ruby_extension_example/mrbgem.rake +25 -0
  427. data/resources/mruby/examples/mrbgems/ruby_extension_example/mrblib/example.rb +5 -0
  428. data/resources/mruby/examples/mrbgems/ruby_extension_example/test/example.rb +3 -0
  429. data/resources/mruby/examples/targets/build_config_ArduinoDue.rb +90 -0
  430. data/resources/mruby/examples/targets/build_config_IntelEdison.rb +69 -0
  431. data/resources/mruby/examples/targets/build_config_IntelGalileo.rb +106 -0
  432. data/resources/mruby/examples/targets/build_config_RX630.rb +81 -0
  433. data/resources/mruby/examples/targets/build_config_android_arm64-v8a.rb +26 -0
  434. data/resources/mruby/examples/targets/build_config_android_armeabi.rb +26 -0
  435. data/resources/mruby/examples/targets/build_config_android_armeabi_v7a_neon_hard.rb +28 -0
  436. data/resources/mruby/examples/targets/build_config_chipKITMax32.rb +86 -0
  437. data/resources/mruby/include/mrbconf.h +145 -0
  438. data/resources/mruby/include/mruby.h +1280 -0
  439. data/resources/mruby/include/mruby/array.h +279 -0
  440. data/resources/mruby/include/mruby/boxing_nan.h +102 -0
  441. data/resources/mruby/include/mruby/boxing_no.h +56 -0
  442. data/resources/mruby/include/mruby/boxing_word.h +136 -0
  443. data/resources/mruby/include/mruby/class.h +94 -0
  444. data/resources/mruby/include/mruby/common.h +72 -0
  445. data/resources/mruby/include/mruby/compile.h +194 -0
  446. data/resources/mruby/include/mruby/data.h +75 -0
  447. data/resources/mruby/include/mruby/debug.h +66 -0
  448. data/resources/mruby/include/mruby/dump.h +196 -0
  449. data/resources/mruby/include/mruby/error.h +75 -0
  450. data/resources/mruby/include/mruby/gc.h +91 -0
  451. data/resources/mruby/include/mruby/hash.h +182 -0
  452. data/resources/mruby/include/mruby/irep.h +62 -0
  453. data/resources/mruby/include/mruby/istruct.h +47 -0
  454. data/resources/mruby/include/mruby/khash.h +274 -0
  455. data/resources/mruby/include/mruby/numeric.h +161 -0
  456. data/resources/mruby/include/mruby/object.h +45 -0
  457. data/resources/mruby/include/mruby/opcode.h +161 -0
  458. data/resources/mruby/include/mruby/proc.h +131 -0
  459. data/resources/mruby/include/mruby/range.h +49 -0
  460. data/resources/mruby/include/mruby/re.h +16 -0
  461. data/resources/mruby/include/mruby/string.h +440 -0
  462. data/resources/mruby/include/mruby/throw.h +55 -0
  463. data/resources/mruby/include/mruby/value.h +309 -0
  464. data/resources/mruby/include/mruby/variable.h +138 -0
  465. data/resources/mruby/include/mruby/version.h +110 -0
  466. data/resources/mruby/lib/mruby-core-ext.rb +79 -0
  467. data/resources/mruby/lib/mruby/build.rb +355 -0
  468. data/resources/mruby/lib/mruby/build/command.rb +324 -0
  469. data/resources/mruby/lib/mruby/build/load_gems.rb +122 -0
  470. data/resources/mruby/lib/mruby/gem.rb +459 -0
  471. data/resources/mruby/lib/mruby/source.rb +30 -0
  472. data/resources/mruby/minirake +484 -0
  473. data/resources/mruby/mrbgems/default.gembox +82 -0
  474. data/resources/mruby/mrbgems/full-core.gembox +9 -0
  475. data/resources/mruby/mrbgems/mruby-array-ext/mrbgem.rake +6 -0
  476. data/resources/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +935 -0
  477. data/resources/mruby/mrbgems/mruby-array-ext/src/array.c +246 -0
  478. data/resources/mruby/mrbgems/mruby-array-ext/test/array.rb +422 -0
  479. data/resources/mruby/mrbgems/mruby-bin-debugger/bintest/mrdb.rb +286 -0
  480. data/resources/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb +701 -0
  481. data/resources/mruby/mrbgems/mruby-bin-debugger/mrbgem.rake +9 -0
  482. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +505 -0
  483. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.h +26 -0
  484. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c +240 -0
  485. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.h +14 -0
  486. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c +78 -0
  487. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.h +13 -0
  488. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdbreak.c +436 -0
  489. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c +502 -0
  490. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c +58 -0
  491. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdrun.c +64 -0
  492. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +759 -0
  493. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h +165 -0
  494. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +16 -0
  495. data/resources/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdberror.h +20 -0
  496. data/resources/mruby/mrbgems/mruby-bin-mirb/bintest/mirb.rb +12 -0
  497. data/resources/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +33 -0
  498. data/resources/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +611 -0
  499. data/resources/mruby/mrbgems/mruby-bin-mrbc/mrbgem.rake +16 -0
  500. data/resources/mruby/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +336 -0
  501. data/resources/mruby/mrbgems/mruby-bin-mruby-config/mrbgem.rake +30 -0
  502. data/resources/mruby/mrbgems/mruby-bin-mruby-config/mruby-config +20 -0
  503. data/resources/mruby/mrbgems/mruby-bin-mruby-config/mruby-config.bat +42 -0
  504. data/resources/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb +60 -0
  505. data/resources/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +12 -0
  506. data/resources/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +254 -0
  507. data/resources/mruby/mrbgems/mruby-bin-strip/bintest/mruby-strip.rb +73 -0
  508. data/resources/mruby/mrbgems/mruby-bin-strip/mrbgem.rake +6 -0
  509. data/resources/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c +155 -0
  510. data/resources/mruby/mrbgems/mruby-class-ext/mrbgem.rake +5 -0
  511. data/resources/mruby/mrbgems/mruby-class-ext/src/class.c +68 -0
  512. data/resources/mruby/mrbgems/mruby-class-ext/test/module.rb +55 -0
  513. data/resources/mruby/mrbgems/mruby-compar-ext/mrbgem.rake +5 -0
  514. data/resources/mruby/mrbgems/mruby-compar-ext/mrblib/compar.rb +31 -0
  515. data/resources/mruby/mrbgems/mruby-compiler/bintest/mrbc.rb +30 -0
  516. data/resources/mruby/mrbgems/mruby-compiler/core/codegen.c +3083 -0
  517. data/resources/mruby/mrbgems/mruby-compiler/core/keywords +50 -0
  518. data/resources/mruby/mrbgems/mruby-compiler/core/lex.def +211 -0
  519. data/resources/mruby/mrbgems/mruby-compiler/core/node.h +118 -0
  520. data/resources/mruby/mrbgems/mruby-compiler/core/parse.y +6661 -0
  521. data/resources/mruby/mrbgems/mruby-compiler/mrbgem.rake +40 -0
  522. data/resources/mruby/mrbgems/mruby-enum-ext/mrbgem.rake +5 -0
  523. data/resources/mruby/mrbgems/mruby-enum-ext/mrblib/enum.rb +813 -0
  524. data/resources/mruby/mrbgems/mruby-enum-ext/test/enum.rb +185 -0
  525. data/resources/mruby/mrbgems/mruby-enum-lazy/mrbgem.rake +7 -0
  526. data/resources/mruby/mrbgems/mruby-enum-lazy/mrblib/lazy.rb +178 -0
  527. data/resources/mruby/mrbgems/mruby-enum-lazy/test/lazy.rb +53 -0
  528. data/resources/mruby/mrbgems/mruby-enumerator/mrbgem.rake +7 -0
  529. data/resources/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb +645 -0
  530. data/resources/mruby/mrbgems/mruby-enumerator/test/enumerator.rb +546 -0
  531. data/resources/mruby/mrbgems/mruby-error/mrbgem.rake +10 -0
  532. data/resources/mruby/mrbgems/mruby-error/src/exception.c +100 -0
  533. data/resources/mruby/mrbgems/mruby-error/test/exception.c +59 -0
  534. data/resources/mruby/mrbgems/mruby-error/test/exception.rb +55 -0
  535. data/resources/mruby/mrbgems/mruby-eval/mrbgem.rake +7 -0
  536. data/resources/mruby/mrbgems/mruby-eval/src/eval.c +346 -0
  537. data/resources/mruby/mrbgems/mruby-eval/test/eval.rb +101 -0
  538. data/resources/mruby/mrbgems/mruby-exit/mrbgem.rake +5 -0
  539. data/resources/mruby/mrbgems/mruby-exit/src/mruby-exit.c +24 -0
  540. data/resources/mruby/mrbgems/mruby-fiber/mrbgem.rake +5 -0
  541. data/resources/mruby/mrbgems/mruby-fiber/src/fiber.c +420 -0
  542. data/resources/mruby/mrbgems/mruby-fiber/test/fiber.rb +208 -0
  543. data/resources/mruby/mrbgems/mruby-hash-ext/mrbgem.rake +8 -0
  544. data/resources/mruby/mrbgems/mruby-hash-ext/mrblib/hash.rb +502 -0
  545. data/resources/mruby/mrbgems/mruby-hash-ext/src/hash-ext.c +128 -0
  546. data/resources/mruby/mrbgems/mruby-hash-ext/test/hash.rb +300 -0
  547. data/resources/mruby/mrbgems/mruby-inline-struct/mrbgem.rake +5 -0
  548. data/resources/mruby/mrbgems/mruby-inline-struct/test/inline.c +83 -0
  549. data/resources/mruby/mrbgems/mruby-inline-struct/test/inline.rb +151 -0
  550. data/resources/mruby/mrbgems/mruby-io/README.md +193 -0
  551. data/resources/mruby/mrbgems/mruby-io/include/mruby/ext/io.h +38 -0
  552. data/resources/mruby/mrbgems/mruby-io/mrbgem.rake +17 -0
  553. data/resources/mruby/mrbgems/mruby-io/mrblib/file.rb +208 -0
  554. data/resources/mruby/mrbgems/mruby-io/mrblib/file_constants.rb +29 -0
  555. data/resources/mruby/mrbgems/mruby-io/mrblib/io.rb +387 -0
  556. data/resources/mruby/mrbgems/mruby-io/mrblib/kernel.rb +15 -0
  557. data/resources/mruby/mrbgems/mruby-io/run_test.rb +26 -0
  558. data/resources/mruby/mrbgems/mruby-io/src/file.c +489 -0
  559. data/resources/mruby/mrbgems/mruby-io/src/file_test.c +381 -0
  560. data/resources/mruby/mrbgems/mruby-io/src/io.c +1320 -0
  561. data/resources/mruby/mrbgems/mruby-io/src/mruby_io_gem.c +20 -0
  562. data/resources/mruby/mrbgems/mruby-io/test/file.rb +197 -0
  563. data/resources/mruby/mrbgems/mruby-io/test/file_test.rb +117 -0
  564. data/resources/mruby/mrbgems/mruby-io/test/gc_filedes.sh +4 -0
  565. data/resources/mruby/mrbgems/mruby-io/test/io.rb +642 -0
  566. data/resources/mruby/mrbgems/mruby-io/test/mruby_io_test.c +256 -0
  567. data/resources/mruby/mrbgems/mruby-kernel-ext/mrbgem.rake +5 -0
  568. data/resources/mruby/mrbgems/mruby-kernel-ext/mrblib/kernel.rb +13 -0
  569. data/resources/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +264 -0
  570. data/resources/mruby/mrbgems/mruby-kernel-ext/test/kernel.rb +86 -0
  571. data/resources/mruby/mrbgems/mruby-math/mrbgem.rake +5 -0
  572. data/resources/mruby/mrbgems/mruby-math/src/math.c +783 -0
  573. data/resources/mruby/mrbgems/mruby-math/test/math.rb +152 -0
  574. data/resources/mruby/mrbgems/mruby-method/README.md +59 -0
  575. data/resources/mruby/mrbgems/mruby-method/mrbgem.rake +7 -0
  576. data/resources/mruby/mrbgems/mruby-method/mrblib/kernel.rb +9 -0
  577. data/resources/mruby/mrbgems/mruby-method/mrblib/method.rb +20 -0
  578. data/resources/mruby/mrbgems/mruby-method/mrblib/unbound_method.rb +9 -0
  579. data/resources/mruby/mrbgems/mruby-method/src/method.c +418 -0
  580. data/resources/mruby/mrbgems/mruby-method/test/method.rb +425 -0
  581. data/resources/mruby/mrbgems/mruby-numeric-ext/mrbgem.rake +5 -0
  582. data/resources/mruby/mrbgems/mruby-numeric-ext/mrblib/numeric_ext.rb +25 -0
  583. data/resources/mruby/mrbgems/mruby-numeric-ext/src/numeric_ext.c +102 -0
  584. data/resources/mruby/mrbgems/mruby-numeric-ext/test/numeric.rb +28 -0
  585. data/resources/mruby/mrbgems/mruby-object-ext/mrbgem.rake +5 -0
  586. data/resources/mruby/mrbgems/mruby-object-ext/mrblib/object.rb +19 -0
  587. data/resources/mruby/mrbgems/mruby-object-ext/src/object.c +112 -0
  588. data/resources/mruby/mrbgems/mruby-object-ext/test/nil.rb +11 -0
  589. data/resources/mruby/mrbgems/mruby-object-ext/test/object.rb +53 -0
  590. data/resources/mruby/mrbgems/mruby-objectspace/mrbgem.rake +5 -0
  591. data/resources/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +187 -0
  592. data/resources/mruby/mrbgems/mruby-objectspace/test/objectspace.rb +60 -0
  593. data/resources/mruby/mrbgems/mruby-pack/README.md +70 -0
  594. data/resources/mruby/mrbgems/mruby-pack/mrbgem.rake +7 -0
  595. data/resources/mruby/mrbgems/mruby-pack/packtest.rb +157 -0
  596. data/resources/mruby/mrbgems/mruby-pack/run_test.rb +26 -0
  597. data/resources/mruby/mrbgems/mruby-pack/src/pack.c +1281 -0
  598. data/resources/mruby/mrbgems/mruby-pack/test/pack.rb +165 -0
  599. data/resources/mruby/mrbgems/mruby-print/mrbgem.rake +5 -0
  600. data/resources/mruby/mrbgems/mruby-print/mrblib/print.rb +64 -0
  601. data/resources/mruby/mrbgems/mruby-print/src/print.c +64 -0
  602. data/resources/mruby/mrbgems/mruby-proc-ext/mrbgem.rake +5 -0
  603. data/resources/mruby/mrbgems/mruby-proc-ext/mrblib/proc.rb +42 -0
  604. data/resources/mruby/mrbgems/mruby-proc-ext/src/proc.c +173 -0
  605. data/resources/mruby/mrbgems/mruby-proc-ext/test/proc.c +62 -0
  606. data/resources/mruby/mrbgems/mruby-proc-ext/test/proc.rb +96 -0
  607. data/resources/mruby/mrbgems/mruby-random/mrbgem.rake +5 -0
  608. data/resources/mruby/mrbgems/mruby-random/src/mt19937ar.c +224 -0
  609. data/resources/mruby/mrbgems/mruby-random/src/mt19937ar.h +80 -0
  610. data/resources/mruby/mrbgems/mruby-random/src/random.c +349 -0
  611. data/resources/mruby/mrbgems/mruby-random/src/random.h +12 -0
  612. data/resources/mruby/mrbgems/mruby-random/test/random.rb +88 -0
  613. data/resources/mruby/mrbgems/mruby-range-ext/mrbgem.rake +5 -0
  614. data/resources/mruby/mrbgems/mruby-range-ext/mrblib/range.rb +31 -0
  615. data/resources/mruby/mrbgems/mruby-range-ext/src/range.c +176 -0
  616. data/resources/mruby/mrbgems/mruby-range-ext/test/range.rb +32 -0
  617. data/resources/mruby/mrbgems/mruby-socket/README.md +55 -0
  618. data/resources/mruby/mrbgems/mruby-socket/mrbgem.rake +17 -0
  619. data/resources/mruby/mrbgems/mruby-socket/mrblib/socket.rb +621 -0
  620. data/resources/mruby/mrbgems/mruby-socket/run_test.rb +28 -0
  621. data/resources/mruby/mrbgems/mruby-socket/src/const.cstub +453 -0
  622. data/resources/mruby/mrbgems/mruby-socket/src/const.def +163 -0
  623. data/resources/mruby/mrbgems/mruby-socket/src/gen.rb +17 -0
  624. data/resources/mruby/mrbgems/mruby-socket/src/socket.c +928 -0
  625. data/resources/mruby/mrbgems/mruby-socket/test/addrinfo.rb +91 -0
  626. data/resources/mruby/mrbgems/mruby-socket/test/basicsocket.rb +17 -0
  627. data/resources/mruby/mrbgems/mruby-socket/test/ipsocket.rb +44 -0
  628. data/resources/mruby/mrbgems/mruby-socket/test/socket.rb +38 -0
  629. data/resources/mruby/mrbgems/mruby-socket/test/sockettest.c +46 -0
  630. data/resources/mruby/mrbgems/mruby-socket/test/tcpsocket.rb +4 -0
  631. data/resources/mruby/mrbgems/mruby-socket/test/udpsocket.rb +16 -0
  632. data/resources/mruby/mrbgems/mruby-socket/test/unix.rb +130 -0
  633. data/resources/mruby/mrbgems/mruby-sprintf/mrbgem.rake +5 -0
  634. data/resources/mruby/mrbgems/mruby-sprintf/mrblib/string.rb +9 -0
  635. data/resources/mruby/mrbgems/mruby-sprintf/src/kernel.c +30 -0
  636. data/resources/mruby/mrbgems/mruby-sprintf/src/sprintf.c +1126 -0
  637. data/resources/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +110 -0
  638. data/resources/mruby/mrbgems/mruby-string-ext/mrbgem.rake +6 -0
  639. data/resources/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +368 -0
  640. data/resources/mruby/mrbgems/mruby-string-ext/src/string.c +804 -0
  641. data/resources/mruby/mrbgems/mruby-string-ext/test/string.rb +682 -0
  642. data/resources/mruby/mrbgems/mruby-struct/mrbgem.rake +5 -0
  643. data/resources/mruby/mrbgems/mruby-struct/mrblib/struct.rb +103 -0
  644. data/resources/mruby/mrbgems/mruby-struct/src/struct.c +726 -0
  645. data/resources/mruby/mrbgems/mruby-struct/test/struct.rb +205 -0
  646. data/resources/mruby/mrbgems/mruby-symbol-ext/mrbgem.rake +5 -0
  647. data/resources/mruby/mrbgems/mruby-symbol-ext/mrblib/symbol.rb +78 -0
  648. data/resources/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +64 -0
  649. data/resources/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +48 -0
  650. data/resources/mruby/mrbgems/mruby-test/README.md +7 -0
  651. data/resources/mruby/mrbgems/mruby-test/driver.c +175 -0
  652. data/resources/mruby/mrbgems/mruby-test/init_mrbtest.c +38 -0
  653. data/resources/mruby/mrbgems/mruby-test/mrbgem.rake +191 -0
  654. data/resources/mruby/mrbgems/mruby-time/mrbgem.rake +5 -0
  655. data/resources/mruby/mrbgems/mruby-time/mrblib/time.rb +9 -0
  656. data/resources/mruby/mrbgems/mruby-time/src/time.c +869 -0
  657. data/resources/mruby/mrbgems/mruby-time/test/time.rb +228 -0
  658. data/resources/mruby/mrbgems/mruby-toplevel-ext/mrbgem.rake +5 -0
  659. data/resources/mruby/mrbgems/mruby-toplevel-ext/mrblib/toplevel.rb +11 -0
  660. data/resources/mruby/mrbgems/mruby-toplevel-ext/test/toplevel.rb +24 -0
  661. data/resources/mruby/mrblib/00class.rb +29 -0
  662. data/resources/mruby/mrblib/10error.rb +59 -0
  663. data/resources/mruby/mrblib/array.rb +243 -0
  664. data/resources/mruby/mrblib/compar.rb +84 -0
  665. data/resources/mruby/mrblib/enum.rb +348 -0
  666. data/resources/mruby/mrblib/float.rb +9 -0
  667. data/resources/mruby/mrblib/hash.rb +358 -0
  668. data/resources/mruby/mrblib/init_mrblib.c +11 -0
  669. data/resources/mruby/mrblib/kernel.rb +50 -0
  670. data/resources/mruby/mrblib/mrblib.rake +21 -0
  671. data/resources/mruby/mrblib/numeric.rb +163 -0
  672. data/resources/mruby/mrblib/range.rb +67 -0
  673. data/resources/mruby/mrblib/string.rb +275 -0
  674. data/resources/mruby/mruby-source.gemspec +18 -0
  675. data/resources/mruby/src/array.c +1251 -0
  676. data/resources/mruby/src/backtrace.c +285 -0
  677. data/resources/mruby/src/class.c +2546 -0
  678. data/resources/mruby/src/codedump.c +477 -0
  679. data/resources/mruby/src/compar.c +13 -0
  680. data/resources/mruby/src/crc.c +39 -0
  681. data/resources/mruby/src/debug.c +217 -0
  682. data/resources/mruby/src/dump.c +1106 -0
  683. data/resources/mruby/src/enum.c +14 -0
  684. data/resources/mruby/src/error.c +513 -0
  685. data/resources/mruby/src/error.h +3 -0
  686. data/resources/mruby/src/etc.c +246 -0
  687. data/resources/mruby/src/fmt_fp.c +374 -0
  688. data/resources/mruby/src/gc.c +1835 -0
  689. data/resources/mruby/src/hash.c +916 -0
  690. data/resources/mruby/src/init.c +51 -0
  691. data/resources/mruby/src/kernel.c +1264 -0
  692. data/resources/mruby/src/load.c +706 -0
  693. data/resources/mruby/src/mruby_core.rake +20 -0
  694. data/resources/mruby/src/numeric.c +1574 -0
  695. data/resources/mruby/src/object.c +618 -0
  696. data/resources/mruby/src/opcode.h +2 -0
  697. data/resources/mruby/src/pool.c +209 -0
  698. data/resources/mruby/src/print.c +47 -0
  699. data/resources/mruby/src/proc.c +313 -0
  700. data/resources/mruby/src/range.c +446 -0
  701. data/resources/mruby/src/state.c +307 -0
  702. data/resources/mruby/src/string.c +3025 -0
  703. data/resources/mruby/src/symbol.c +494 -0
  704. data/resources/mruby/src/value_array.h +27 -0
  705. data/resources/mruby/src/variable.c +982 -0
  706. data/resources/mruby/src/version.c +17 -0
  707. data/resources/mruby/src/vm.c +3020 -0
  708. data/resources/mruby/tasks/benchmark.rake +91 -0
  709. data/resources/mruby/tasks/gitlab.rake +118 -0
  710. data/resources/mruby/tasks/libmruby.rake +24 -0
  711. data/resources/mruby/tasks/mrbgems.rake +98 -0
  712. data/resources/mruby/tasks/toolchains/android.rake +321 -0
  713. data/resources/mruby/tasks/toolchains/clang.rake +9 -0
  714. data/resources/mruby/tasks/toolchains/gcc.rake +66 -0
  715. data/resources/mruby/tasks/toolchains/openwrt.rake +38 -0
  716. data/resources/mruby/tasks/toolchains/visualcpp.rake +68 -0
  717. data/resources/mruby/test/assert.rb +249 -0
  718. data/resources/mruby/test/bintest.rb +33 -0
  719. data/resources/mruby/test/report.rb +4 -0
  720. data/resources/mruby/test/t/argumenterror.rb +16 -0
  721. data/resources/mruby/test/t/array.rb +394 -0
  722. data/resources/mruby/test/t/basicobject.rb +11 -0
  723. data/resources/mruby/test/t/bs_block.rb +521 -0
  724. data/resources/mruby/test/t/bs_literal.rb +38 -0
  725. data/resources/mruby/test/t/class.rb +451 -0
  726. data/resources/mruby/test/t/codegen.rb +197 -0
  727. data/resources/mruby/test/t/comparable.rb +80 -0
  728. data/resources/mruby/test/t/ensure.rb +54 -0
  729. data/resources/mruby/test/t/enumerable.rb +134 -0
  730. data/resources/mruby/test/t/exception.rb +422 -0
  731. data/resources/mruby/test/t/false.rb +31 -0
  732. data/resources/mruby/test/t/float.rb +209 -0
  733. data/resources/mruby/test/t/gc.rb +45 -0
  734. data/resources/mruby/test/t/hash.rb +375 -0
  735. data/resources/mruby/test/t/indexerror.rb +6 -0
  736. data/resources/mruby/test/t/integer.rb +277 -0
  737. data/resources/mruby/test/t/iterations.rb +61 -0
  738. data/resources/mruby/test/t/kernel.rb +600 -0
  739. data/resources/mruby/test/t/lang.rb +74 -0
  740. data/resources/mruby/test/t/literals.rb +337 -0
  741. data/resources/mruby/test/t/localjumperror.rb +13 -0
  742. data/resources/mruby/test/t/methods.rb +109 -0
  743. data/resources/mruby/test/t/module.rb +914 -0
  744. data/resources/mruby/test/t/nameerror.rb +28 -0
  745. data/resources/mruby/test/t/nil.rb +39 -0
  746. data/resources/mruby/test/t/nomethoderror.rb +22 -0
  747. data/resources/mruby/test/t/numeric.rb +43 -0
  748. data/resources/mruby/test/t/object.rb +11 -0
  749. data/resources/mruby/test/t/proc.rb +180 -0
  750. data/resources/mruby/test/t/range.rb +95 -0
  751. data/resources/mruby/test/t/rangeerror.rb +6 -0
  752. data/resources/mruby/test/t/regexperror.rb +4 -0
  753. data/resources/mruby/test/t/runtimeerror.rb +6 -0
  754. data/resources/mruby/test/t/standarderror.rb +6 -0
  755. data/resources/mruby/test/t/string.rb +728 -0
  756. data/resources/mruby/test/t/superclass.rb +47 -0
  757. data/resources/mruby/test/t/symbol.rb +30 -0
  758. data/resources/mruby/test/t/syntax.rb +468 -0
  759. data/resources/mruby/test/t/true.rb +31 -0
  760. data/resources/mruby/test/t/typeerror.rb +6 -0
  761. data/resources/mruby/test/t/unicode.rb +39 -0
  762. data/resources/mruby/travis_config.rb +53 -0
  763. metadata +806 -0
@@ -0,0 +1,404 @@
1
+ /*
2
+ * Stack-less Just-In-Time compiler
3
+ *
4
+ * Copyright 2009-2012 Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without modification, are
7
+ * permitted provided that the following conditions are met:
8
+ *
9
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
10
+ * conditions and the following disclaimer.
11
+ *
12
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
13
+ * of conditions and the following disclaimer in the documentation and/or other materials
14
+ * provided with the distribution.
15
+ *
16
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY
17
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
19
+ * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
21
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
22
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
24
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
+ */
26
+
27
+ /* mips 32-bit arch dependent functions. */
28
+
29
+ static sljit_si load_immediate(struct sljit_compiler *compiler, sljit_si dst_ar, sljit_sw imm)
30
+ {
31
+ if (!(imm & ~0xffff))
32
+ return push_inst(compiler, ORI | SA(0) | TA(dst_ar) | IMM(imm), dst_ar);
33
+
34
+ if (imm < 0 && imm >= SIMM_MIN)
35
+ return push_inst(compiler, ADDIU | SA(0) | TA(dst_ar) | IMM(imm), dst_ar);
36
+
37
+ FAIL_IF(push_inst(compiler, LUI | TA(dst_ar) | IMM(imm >> 16), dst_ar));
38
+ return (imm & 0xffff) ? push_inst(compiler, ORI | SA(dst_ar) | TA(dst_ar) | IMM(imm), dst_ar) : SLJIT_SUCCESS;
39
+ }
40
+
41
+ #define EMIT_LOGICAL(op_imm, op_norm) \
42
+ if (flags & SRC2_IMM) { \
43
+ if (op & SLJIT_SET_E) \
44
+ FAIL_IF(push_inst(compiler, op_imm | S(src1) | TA(EQUAL_FLAG) | IMM(src2), EQUAL_FLAG)); \
45
+ if (CHECK_FLAGS(SLJIT_SET_E)) \
46
+ FAIL_IF(push_inst(compiler, op_imm | S(src1) | T(dst) | IMM(src2), DR(dst))); \
47
+ } \
48
+ else { \
49
+ if (op & SLJIT_SET_E) \
50
+ FAIL_IF(push_inst(compiler, op_norm | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG)); \
51
+ if (CHECK_FLAGS(SLJIT_SET_E)) \
52
+ FAIL_IF(push_inst(compiler, op_norm | S(src1) | T(src2) | D(dst), DR(dst))); \
53
+ }
54
+
55
+ #define EMIT_SHIFT(op_imm, op_norm) \
56
+ if (flags & SRC2_IMM) { \
57
+ if (op & SLJIT_SET_E) \
58
+ FAIL_IF(push_inst(compiler, op_imm | T(src1) | DA(EQUAL_FLAG) | SH_IMM(src2), EQUAL_FLAG)); \
59
+ if (CHECK_FLAGS(SLJIT_SET_E)) \
60
+ FAIL_IF(push_inst(compiler, op_imm | T(src1) | D(dst) | SH_IMM(src2), DR(dst))); \
61
+ } \
62
+ else { \
63
+ if (op & SLJIT_SET_E) \
64
+ FAIL_IF(push_inst(compiler, op_norm | S(src2) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG)); \
65
+ if (CHECK_FLAGS(SLJIT_SET_E)) \
66
+ FAIL_IF(push_inst(compiler, op_norm | S(src2) | T(src1) | D(dst), DR(dst))); \
67
+ }
68
+
69
+ static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, sljit_si op, sljit_si flags,
70
+ sljit_si dst, sljit_si src1, sljit_sw src2)
71
+ {
72
+ sljit_si overflow_ra = 0;
73
+
74
+ switch (GET_OPCODE(op)) {
75
+ case SLJIT_MOV:
76
+ case SLJIT_MOV_UI:
77
+ case SLJIT_MOV_SI:
78
+ case SLJIT_MOV_P:
79
+ SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
80
+ if (dst != src2)
81
+ return push_inst(compiler, ADDU | S(src2) | TA(0) | D(dst), DR(dst));
82
+ return SLJIT_SUCCESS;
83
+
84
+ case SLJIT_MOV_UB:
85
+ case SLJIT_MOV_SB:
86
+ SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
87
+ if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
88
+ if (op == SLJIT_MOV_SB) {
89
+ #if (defined SLJIT_MIPS_32_64 && SLJIT_MIPS_32_64)
90
+ return push_inst(compiler, SEB | T(src2) | D(dst), DR(dst));
91
+ #else
92
+ FAIL_IF(push_inst(compiler, SLL | T(src2) | D(dst) | SH_IMM(24), DR(dst)));
93
+ return push_inst(compiler, SRA | T(dst) | D(dst) | SH_IMM(24), DR(dst));
94
+ #endif
95
+ }
96
+ return push_inst(compiler, ANDI | S(src2) | T(dst) | IMM(0xff), DR(dst));
97
+ }
98
+ else if (dst != src2)
99
+ SLJIT_ASSERT_STOP();
100
+ return SLJIT_SUCCESS;
101
+
102
+ case SLJIT_MOV_UH:
103
+ case SLJIT_MOV_SH:
104
+ SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
105
+ if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
106
+ if (op == SLJIT_MOV_SH) {
107
+ #if (defined SLJIT_MIPS_32_64 && SLJIT_MIPS_32_64)
108
+ return push_inst(compiler, SEH | T(src2) | D(dst), DR(dst));
109
+ #else
110
+ FAIL_IF(push_inst(compiler, SLL | T(src2) | D(dst) | SH_IMM(16), DR(dst)));
111
+ return push_inst(compiler, SRA | T(dst) | D(dst) | SH_IMM(16), DR(dst));
112
+ #endif
113
+ }
114
+ return push_inst(compiler, ANDI | S(src2) | T(dst) | IMM(0xffff), DR(dst));
115
+ }
116
+ else if (dst != src2)
117
+ SLJIT_ASSERT_STOP();
118
+ return SLJIT_SUCCESS;
119
+
120
+ case SLJIT_NOT:
121
+ SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
122
+ if (op & SLJIT_SET_E)
123
+ FAIL_IF(push_inst(compiler, NOR | S(src2) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));
124
+ if (CHECK_FLAGS(SLJIT_SET_E))
125
+ FAIL_IF(push_inst(compiler, NOR | S(src2) | T(src2) | D(dst), DR(dst)));
126
+ return SLJIT_SUCCESS;
127
+
128
+ case SLJIT_CLZ:
129
+ SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
130
+ #if (defined SLJIT_MIPS_32_64 && SLJIT_MIPS_32_64)
131
+ if (op & SLJIT_SET_E)
132
+ FAIL_IF(push_inst(compiler, CLZ | S(src2) | TA(EQUAL_FLAG) | DA(EQUAL_FLAG), EQUAL_FLAG));
133
+ if (CHECK_FLAGS(SLJIT_SET_E))
134
+ FAIL_IF(push_inst(compiler, CLZ | S(src2) | T(dst) | D(dst), DR(dst)));
135
+ #else
136
+ if (SLJIT_UNLIKELY(flags & UNUSED_DEST)) {
137
+ FAIL_IF(push_inst(compiler, SRL | T(src2) | DA(EQUAL_FLAG) | SH_IMM(31), EQUAL_FLAG));
138
+ return push_inst(compiler, XORI | SA(EQUAL_FLAG) | TA(EQUAL_FLAG) | IMM(1), EQUAL_FLAG);
139
+ }
140
+ /* Nearly all instructions are unmovable in the following sequence. */
141
+ FAIL_IF(push_inst(compiler, ADDU_W | S(src2) | TA(0) | D(TMP_REG1), DR(TMP_REG1)));
142
+ /* Check zero. */
143
+ FAIL_IF(push_inst(compiler, BEQ | S(TMP_REG1) | TA(0) | IMM(5), UNMOVABLE_INS));
144
+ FAIL_IF(push_inst(compiler, ORI | SA(0) | T(dst) | IMM(32), UNMOVABLE_INS));
145
+ FAIL_IF(push_inst(compiler, ADDIU_W | SA(0) | T(dst) | IMM(-1), DR(dst)));
146
+ /* Loop for searching the highest bit. */
147
+ FAIL_IF(push_inst(compiler, ADDIU_W | S(dst) | T(dst) | IMM(1), DR(dst)));
148
+ FAIL_IF(push_inst(compiler, BGEZ | S(TMP_REG1) | IMM(-2), UNMOVABLE_INS));
149
+ FAIL_IF(push_inst(compiler, SLL | T(TMP_REG1) | D(TMP_REG1) | SH_IMM(1), UNMOVABLE_INS));
150
+ if (op & SLJIT_SET_E)
151
+ return push_inst(compiler, ADDU_W | S(dst) | TA(0) | DA(EQUAL_FLAG), EQUAL_FLAG);
152
+ #endif
153
+ return SLJIT_SUCCESS;
154
+
155
+ case SLJIT_ADD:
156
+ if (flags & SRC2_IMM) {
157
+ if (op & SLJIT_SET_O) {
158
+ FAIL_IF(push_inst(compiler, SRL | T(src1) | DA(TMP_EREG1) | SH_IMM(31), TMP_EREG1));
159
+ if (src2 < 0)
160
+ FAIL_IF(push_inst(compiler, XORI | SA(TMP_EREG1) | TA(TMP_EREG1) | IMM(1), TMP_EREG1));
161
+ }
162
+ if (op & SLJIT_SET_E)
163
+ FAIL_IF(push_inst(compiler, ADDIU | S(src1) | TA(EQUAL_FLAG) | IMM(src2), EQUAL_FLAG));
164
+ if (op & SLJIT_SET_C) {
165
+ if (src2 >= 0)
166
+ FAIL_IF(push_inst(compiler, ORI | S(src1) | TA(ULESS_FLAG) | IMM(src2), ULESS_FLAG));
167
+ else {
168
+ FAIL_IF(push_inst(compiler, ADDIU | SA(0) | TA(ULESS_FLAG) | IMM(src2), ULESS_FLAG));
169
+ FAIL_IF(push_inst(compiler, OR | S(src1) | TA(ULESS_FLAG) | DA(ULESS_FLAG), ULESS_FLAG));
170
+ }
171
+ }
172
+ /* dst may be the same as src1 or src2. */
173
+ if (CHECK_FLAGS(SLJIT_SET_E))
174
+ FAIL_IF(push_inst(compiler, ADDIU | S(src1) | T(dst) | IMM(src2), DR(dst)));
175
+ if (op & SLJIT_SET_O) {
176
+ FAIL_IF(push_inst(compiler, SRL | T(dst) | DA(OVERFLOW_FLAG) | SH_IMM(31), OVERFLOW_FLAG));
177
+ if (src2 < 0)
178
+ FAIL_IF(push_inst(compiler, XORI | SA(OVERFLOW_FLAG) | TA(OVERFLOW_FLAG) | IMM(1), OVERFLOW_FLAG));
179
+ }
180
+ }
181
+ else {
182
+ if (op & SLJIT_SET_O) {
183
+ FAIL_IF(push_inst(compiler, XOR | S(src1) | T(src2) | DA(TMP_EREG1), TMP_EREG1));
184
+ FAIL_IF(push_inst(compiler, SRL | TA(TMP_EREG1) | DA(TMP_EREG1) | SH_IMM(31), TMP_EREG1));
185
+ if (src1 != dst)
186
+ overflow_ra = DR(src1);
187
+ else if (src2 != dst)
188
+ overflow_ra = DR(src2);
189
+ else {
190
+ /* Rare ocasion. */
191
+ FAIL_IF(push_inst(compiler, ADDU | S(src1) | TA(0) | DA(TMP_EREG2), TMP_EREG2));
192
+ overflow_ra = TMP_EREG2;
193
+ }
194
+ }
195
+ if (op & SLJIT_SET_E)
196
+ FAIL_IF(push_inst(compiler, ADDU | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));
197
+ if (op & SLJIT_SET_C)
198
+ FAIL_IF(push_inst(compiler, OR | S(src1) | T(src2) | DA(ULESS_FLAG), ULESS_FLAG));
199
+ /* dst may be the same as src1 or src2. */
200
+ if (CHECK_FLAGS(SLJIT_SET_E))
201
+ FAIL_IF(push_inst(compiler, ADDU | S(src1) | T(src2) | D(dst), DR(dst)));
202
+ if (op & SLJIT_SET_O) {
203
+ FAIL_IF(push_inst(compiler, XOR | S(dst) | TA(overflow_ra) | DA(OVERFLOW_FLAG), OVERFLOW_FLAG));
204
+ FAIL_IF(push_inst(compiler, SRL | TA(OVERFLOW_FLAG) | DA(OVERFLOW_FLAG) | SH_IMM(31), OVERFLOW_FLAG));
205
+ }
206
+ }
207
+
208
+ /* a + b >= a | b (otherwise, the carry should be set to 1). */
209
+ if (op & SLJIT_SET_C)
210
+ FAIL_IF(push_inst(compiler, SLTU | S(dst) | TA(ULESS_FLAG) | DA(ULESS_FLAG), ULESS_FLAG));
211
+ if (op & SLJIT_SET_O)
212
+ return push_inst(compiler, MOVN | SA(0) | TA(TMP_EREG1) | DA(OVERFLOW_FLAG), OVERFLOW_FLAG);
213
+ return SLJIT_SUCCESS;
214
+
215
+ case SLJIT_ADDC:
216
+ if (flags & SRC2_IMM) {
217
+ if (op & SLJIT_SET_C) {
218
+ if (src2 >= 0)
219
+ FAIL_IF(push_inst(compiler, ORI | S(src1) | TA(TMP_EREG1) | IMM(src2), TMP_EREG1));
220
+ else {
221
+ FAIL_IF(push_inst(compiler, ADDIU | SA(0) | TA(TMP_EREG1) | IMM(src2), TMP_EREG1));
222
+ FAIL_IF(push_inst(compiler, OR | S(src1) | TA(TMP_EREG1) | DA(TMP_EREG1), TMP_EREG1));
223
+ }
224
+ }
225
+ FAIL_IF(push_inst(compiler, ADDIU | S(src1) | T(dst) | IMM(src2), DR(dst)));
226
+ } else {
227
+ if (op & SLJIT_SET_C)
228
+ FAIL_IF(push_inst(compiler, OR | S(src1) | T(src2) | DA(TMP_EREG1), TMP_EREG1));
229
+ /* dst may be the same as src1 or src2. */
230
+ FAIL_IF(push_inst(compiler, ADDU | S(src1) | T(src2) | D(dst), DR(dst)));
231
+ }
232
+ if (op & SLJIT_SET_C)
233
+ FAIL_IF(push_inst(compiler, SLTU | S(dst) | TA(TMP_EREG1) | DA(TMP_EREG1), TMP_EREG1));
234
+
235
+ FAIL_IF(push_inst(compiler, ADDU | S(dst) | TA(ULESS_FLAG) | D(dst), DR(dst)));
236
+ if (!(op & SLJIT_SET_C))
237
+ return SLJIT_SUCCESS;
238
+
239
+ /* Set TMP_EREG2 (dst == 0) && (ULESS_FLAG == 1). */
240
+ FAIL_IF(push_inst(compiler, SLTIU | S(dst) | TA(TMP_EREG2) | IMM(1), TMP_EREG2));
241
+ FAIL_IF(push_inst(compiler, AND | SA(TMP_EREG2) | TA(ULESS_FLAG) | DA(TMP_EREG2), TMP_EREG2));
242
+ /* Set carry flag. */
243
+ return push_inst(compiler, OR | SA(TMP_EREG2) | TA(TMP_EREG1) | DA(ULESS_FLAG), ULESS_FLAG);
244
+
245
+ case SLJIT_SUB:
246
+ if ((flags & SRC2_IMM) && ((op & (SLJIT_SET_S | SLJIT_SET_U)) || src2 == SIMM_MIN)) {
247
+ FAIL_IF(push_inst(compiler, ADDIU | SA(0) | T(TMP_REG2) | IMM(src2), DR(TMP_REG2)));
248
+ src2 = TMP_REG2;
249
+ flags &= ~SRC2_IMM;
250
+ }
251
+
252
+ if (flags & SRC2_IMM) {
253
+ if (op & SLJIT_SET_O) {
254
+ FAIL_IF(push_inst(compiler, SRL | T(src1) | DA(TMP_EREG1) | SH_IMM(31), TMP_EREG1));
255
+ if (src2 < 0)
256
+ FAIL_IF(push_inst(compiler, XORI | SA(TMP_EREG1) | TA(TMP_EREG1) | IMM(1), TMP_EREG1));
257
+ if (src1 != dst)
258
+ overflow_ra = DR(src1);
259
+ else {
260
+ /* Rare ocasion. */
261
+ FAIL_IF(push_inst(compiler, ADDU | S(src1) | TA(0) | DA(TMP_EREG2), TMP_EREG2));
262
+ overflow_ra = TMP_EREG2;
263
+ }
264
+ }
265
+ if (op & SLJIT_SET_E)
266
+ FAIL_IF(push_inst(compiler, ADDIU | S(src1) | TA(EQUAL_FLAG) | IMM(-src2), EQUAL_FLAG));
267
+ if (op & SLJIT_SET_C)
268
+ FAIL_IF(push_inst(compiler, SLTIU | S(src1) | TA(ULESS_FLAG) | IMM(src2), ULESS_FLAG));
269
+ /* dst may be the same as src1 or src2. */
270
+ if (CHECK_FLAGS(SLJIT_SET_E))
271
+ FAIL_IF(push_inst(compiler, ADDIU | S(src1) | T(dst) | IMM(-src2), DR(dst)));
272
+ }
273
+ else {
274
+ if (op & SLJIT_SET_O) {
275
+ FAIL_IF(push_inst(compiler, XOR | S(src1) | T(src2) | DA(TMP_EREG1), TMP_EREG1));
276
+ FAIL_IF(push_inst(compiler, SRL | TA(TMP_EREG1) | DA(TMP_EREG1) | SH_IMM(31), TMP_EREG1));
277
+ if (src1 != dst)
278
+ overflow_ra = DR(src1);
279
+ else {
280
+ /* Rare ocasion. */
281
+ FAIL_IF(push_inst(compiler, ADDU | S(src1) | TA(0) | DA(TMP_EREG2), TMP_EREG2));
282
+ overflow_ra = TMP_EREG2;
283
+ }
284
+ }
285
+ if (op & SLJIT_SET_E)
286
+ FAIL_IF(push_inst(compiler, SUBU | S(src1) | T(src2) | DA(EQUAL_FLAG), EQUAL_FLAG));
287
+ if (op & (SLJIT_SET_U | SLJIT_SET_C))
288
+ FAIL_IF(push_inst(compiler, SLTU | S(src1) | T(src2) | DA(ULESS_FLAG), ULESS_FLAG));
289
+ if (op & SLJIT_SET_U)
290
+ FAIL_IF(push_inst(compiler, SLTU | S(src2) | T(src1) | DA(UGREATER_FLAG), UGREATER_FLAG));
291
+ if (op & SLJIT_SET_S) {
292
+ FAIL_IF(push_inst(compiler, SLT | S(src1) | T(src2) | DA(LESS_FLAG), LESS_FLAG));
293
+ FAIL_IF(push_inst(compiler, SLT | S(src2) | T(src1) | DA(GREATER_FLAG), GREATER_FLAG));
294
+ }
295
+ /* dst may be the same as src1 or src2. */
296
+ if (CHECK_FLAGS(SLJIT_SET_E | SLJIT_SET_S | SLJIT_SET_U | SLJIT_SET_C))
297
+ FAIL_IF(push_inst(compiler, SUBU | S(src1) | T(src2) | D(dst), DR(dst)));
298
+ }
299
+
300
+ if (op & SLJIT_SET_O) {
301
+ FAIL_IF(push_inst(compiler, XOR | S(dst) | TA(overflow_ra) | DA(OVERFLOW_FLAG), OVERFLOW_FLAG));
302
+ FAIL_IF(push_inst(compiler, SRL | TA(OVERFLOW_FLAG) | DA(OVERFLOW_FLAG) | SH_IMM(31), OVERFLOW_FLAG));
303
+ return push_inst(compiler, MOVZ | SA(0) | TA(TMP_EREG1) | DA(OVERFLOW_FLAG), OVERFLOW_FLAG);
304
+ }
305
+ return SLJIT_SUCCESS;
306
+
307
+ case SLJIT_SUBC:
308
+ if ((flags & SRC2_IMM) && src2 == SIMM_MIN) {
309
+ FAIL_IF(push_inst(compiler, ADDIU | SA(0) | T(TMP_REG2) | IMM(src2), DR(TMP_REG2)));
310
+ src2 = TMP_REG2;
311
+ flags &= ~SRC2_IMM;
312
+ }
313
+
314
+ if (flags & SRC2_IMM) {
315
+ if (op & SLJIT_SET_C)
316
+ FAIL_IF(push_inst(compiler, SLTIU | S(src1) | TA(TMP_EREG1) | IMM(-src2), TMP_EREG1));
317
+ /* dst may be the same as src1 or src2. */
318
+ FAIL_IF(push_inst(compiler, ADDIU | S(src1) | T(dst) | IMM(-src2), DR(dst)));
319
+ }
320
+ else {
321
+ if (op & SLJIT_SET_C)
322
+ FAIL_IF(push_inst(compiler, SLTU | S(src1) | T(src2) | DA(TMP_EREG1), TMP_EREG1));
323
+ /* dst may be the same as src1 or src2. */
324
+ FAIL_IF(push_inst(compiler, SUBU | S(src1) | T(src2) | D(dst), DR(dst)));
325
+ }
326
+
327
+ if (op & SLJIT_SET_C)
328
+ FAIL_IF(push_inst(compiler, MOVZ | SA(ULESS_FLAG) | T(dst) | DA(TMP_EREG1), TMP_EREG1));
329
+
330
+ FAIL_IF(push_inst(compiler, SUBU | S(dst) | TA(ULESS_FLAG) | D(dst), DR(dst)));
331
+
332
+ if (op & SLJIT_SET_C)
333
+ FAIL_IF(push_inst(compiler, ADDU | SA(TMP_EREG1) | TA(0) | DA(ULESS_FLAG), ULESS_FLAG));
334
+
335
+ return SLJIT_SUCCESS;
336
+
337
+ case SLJIT_MUL:
338
+ SLJIT_ASSERT(!(flags & SRC2_IMM));
339
+ if (!(op & SLJIT_SET_O)) {
340
+ #if (defined SLJIT_MIPS_32_64 && SLJIT_MIPS_32_64)
341
+ return push_inst(compiler, MUL | S(src1) | T(src2) | D(dst), DR(dst));
342
+ #else
343
+ FAIL_IF(push_inst(compiler, MULT | S(src1) | T(src2), MOVABLE_INS));
344
+ return push_inst(compiler, MFLO | D(dst), DR(dst));
345
+ #endif
346
+ }
347
+ FAIL_IF(push_inst(compiler, MULT | S(src1) | T(src2), MOVABLE_INS));
348
+ FAIL_IF(push_inst(compiler, MFHI | DA(TMP_EREG1), TMP_EREG1));
349
+ FAIL_IF(push_inst(compiler, MFLO | D(dst), DR(dst)));
350
+ FAIL_IF(push_inst(compiler, SRA | T(dst) | DA(TMP_EREG2) | SH_IMM(31), TMP_EREG2));
351
+ return push_inst(compiler, SUBU | SA(TMP_EREG1) | TA(TMP_EREG2) | DA(OVERFLOW_FLAG), OVERFLOW_FLAG);
352
+
353
+ case SLJIT_AND:
354
+ EMIT_LOGICAL(ANDI, AND);
355
+ return SLJIT_SUCCESS;
356
+
357
+ case SLJIT_OR:
358
+ EMIT_LOGICAL(ORI, OR);
359
+ return SLJIT_SUCCESS;
360
+
361
+ case SLJIT_XOR:
362
+ EMIT_LOGICAL(XORI, XOR);
363
+ return SLJIT_SUCCESS;
364
+
365
+ case SLJIT_SHL:
366
+ EMIT_SHIFT(SLL, SLLV);
367
+ return SLJIT_SUCCESS;
368
+
369
+ case SLJIT_LSHR:
370
+ EMIT_SHIFT(SRL, SRLV);
371
+ return SLJIT_SUCCESS;
372
+
373
+ case SLJIT_ASHR:
374
+ EMIT_SHIFT(SRA, SRAV);
375
+ return SLJIT_SUCCESS;
376
+ }
377
+
378
+ SLJIT_ASSERT_STOP();
379
+ return SLJIT_SUCCESS;
380
+ }
381
+
382
+ static SLJIT_INLINE sljit_si emit_const(struct sljit_compiler *compiler, sljit_si dst, sljit_sw init_value)
383
+ {
384
+ FAIL_IF(push_inst(compiler, LUI | T(dst) | IMM(init_value >> 16), DR(dst)));
385
+ return push_inst(compiler, ORI | S(dst) | T(dst) | IMM(init_value), DR(dst));
386
+ }
387
+
388
+ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_addr)
389
+ {
390
+ sljit_ins *inst = (sljit_ins*)addr;
391
+
392
+ inst[0] = (inst[0] & 0xffff0000) | ((new_addr >> 16) & 0xffff);
393
+ inst[1] = (inst[1] & 0xffff0000) | (new_addr & 0xffff);
394
+ SLJIT_CACHE_FLUSH(inst, inst + 2);
395
+ }
396
+
397
+ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant)
398
+ {
399
+ sljit_ins *inst = (sljit_ins*)addr;
400
+
401
+ inst[0] = (inst[0] & 0xffff0000) | ((new_constant >> 16) & 0xffff);
402
+ inst[1] = (inst[1] & 0xffff0000) | (new_constant & 0xffff);
403
+ SLJIT_CACHE_FLUSH(inst, inst + 2);
404
+ }
@@ -0,0 +1,1881 @@
1
+ /*
2
+ * Stack-less Just-In-Time compiler
3
+ *
4
+ * Copyright 2009-2012 Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without modification, are
7
+ * permitted provided that the following conditions are met:
8
+ *
9
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
10
+ * conditions and the following disclaimer.
11
+ *
12
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
13
+ * of conditions and the following disclaimer in the documentation and/or other materials
14
+ * provided with the distribution.
15
+ *
16
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY
17
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
19
+ * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
21
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
22
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
24
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
+ */
26
+
27
+ /* Latest MIPS architecture. */
28
+ /* Automatically detect SLJIT_MIPS_32_64 */
29
+
30
+ SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST char* sljit_get_platform_name(void)
31
+ {
32
+ #if (defined SLJIT_MIPS_32_64 && SLJIT_MIPS_32_64)
33
+ return "MIPS" SLJIT_CPUINFO;
34
+ #else
35
+ return "MIPS III" SLJIT_CPUINFO;
36
+ #endif
37
+ }
38
+
39
+ /* Length of an instruction word
40
+ Both for mips-32 and mips-64 */
41
+ typedef sljit_ui sljit_ins;
42
+
43
+ #define TMP_REG1 (SLJIT_NO_REGISTERS + 1)
44
+ #define TMP_REG2 (SLJIT_NO_REGISTERS + 2)
45
+ #define TMP_REG3 (SLJIT_NO_REGISTERS + 3)
46
+
47
+ /* For position independent code, t9 must contain the function address. */
48
+ #define PIC_ADDR_REG TMP_REG2
49
+
50
+ /* TMP_EREG1 is used mainly for literal encoding on 64 bit. */
51
+ #define TMP_EREG1 15
52
+ #define TMP_EREG2 24
53
+ /* Floating point status register. */
54
+ #define FCSR_REG 31
55
+ /* Return address register. */
56
+ #define RETURN_ADDR_REG 31
57
+
58
+ /* Flags are keept in volatile registers. */
59
+ #define EQUAL_FLAG 7
60
+ /* And carry flag as well. */
61
+ #define ULESS_FLAG 10
62
+ #define UGREATER_FLAG 11
63
+ #define LESS_FLAG 12
64
+ #define GREATER_FLAG 13
65
+ #define OVERFLOW_FLAG 14
66
+
67
+ #define TMP_FREG1 (0)
68
+ #define TMP_FREG2 ((SLJIT_FLOAT_REG6 + 1) << 1)
69
+
70
+ static SLJIT_CONST sljit_ub reg_map[SLJIT_NO_REGISTERS + 4] = {
71
+ 0, 2, 5, 6, 3, 8, 16, 17, 18, 19, 20, 29, 4, 25, 9
72
+ };
73
+
74
+ /* --------------------------------------------------------------------- */
75
+ /* Instrucion forms */
76
+ /* --------------------------------------------------------------------- */
77
+
78
+ #define S(s) (reg_map[s] << 21)
79
+ #define T(t) (reg_map[t] << 16)
80
+ #define D(d) (reg_map[d] << 11)
81
+ /* Absolute registers. */
82
+ #define SA(s) ((s) << 21)
83
+ #define TA(t) ((t) << 16)
84
+ #define DA(d) ((d) << 11)
85
+ #define FT(t) ((t) << 16)
86
+ #define FS(s) ((s) << 11)
87
+ #define FD(d) ((d) << 6)
88
+ #define IMM(imm) ((imm) & 0xffff)
89
+ #define SH_IMM(imm) ((imm & 0x1f) << 6)
90
+
91
+ #define DR(dr) (reg_map[dr])
92
+ #define HI(opcode) ((opcode) << 26)
93
+ #define LO(opcode) (opcode)
94
+ /* S = (16 << 21) D = (17 << 21) */
95
+ #define FMT_SD (16 << 21)
96
+
97
+ #define ABS_fmt (HI(17) | FMT_SD | LO(5))
98
+ #define ADD_fmt (HI(17) | FMT_SD | LO(0))
99
+ #define ADDU (HI(0) | LO(33))
100
+ #define ADDIU (HI(9))
101
+ #define AND (HI(0) | LO(36))
102
+ #define ANDI (HI(12))
103
+ #define B (HI(4))
104
+ #define BAL (HI(1) | (17 << 16))
105
+ #define BC1F (HI(17) | (8 << 21))
106
+ #define BC1T (HI(17) | (8 << 21) | (1 << 16))
107
+ #define BEQ (HI(4))
108
+ #define BGEZ (HI(1) | (1 << 16))
109
+ #define BGTZ (HI(7))
110
+ #define BLEZ (HI(6))
111
+ #define BLTZ (HI(1) | (0 << 16))
112
+ #define BNE (HI(5))
113
+ #define BREAK (HI(0) | LO(13))
114
+ #define CFC1 (HI(17) | (2 << 21))
115
+ #define C_UN_fmt (HI(17) | FMT_SD | LO(49))
116
+ #define C_UEQ_fmt (HI(17) | FMT_SD | LO(51))
117
+ #define C_ULE_fmt (HI(17) | FMT_SD | LO(55))
118
+ #define C_ULT_fmt (HI(17) | FMT_SD | LO(53))
119
+ #define DIV (HI(0) | LO(26))
120
+ #define DIVU (HI(0) | LO(27))
121
+ #define DIV_fmt (HI(17) | FMT_SD | LO(3))
122
+ #define J (HI(2))
123
+ #define JAL (HI(3))
124
+ #define JALR (HI(0) | LO(9))
125
+ #define JR (HI(0) | LO(8))
126
+ #define LD (HI(55))
127
+ #define LUI (HI(15))
128
+ #define LW (HI(35))
129
+ #define MFHI (HI(0) | LO(16))
130
+ #define MFLO (HI(0) | LO(18))
131
+ #define MOV_fmt (HI(17) | FMT_SD | LO(6))
132
+ #define MOVN (HI(0) | LO(11))
133
+ #define MOVZ (HI(0) | LO(10))
134
+ #define MUL_fmt (HI(17) | FMT_SD | LO(2))
135
+ #define MULT (HI(0) | LO(24))
136
+ #define MULTU (HI(0) | LO(25))
137
+ #define NEG_fmt (HI(17) | FMT_SD | LO(7))
138
+ #define NOP (HI(0) | LO(0))
139
+ #define NOR (HI(0) | LO(39))
140
+ #define OR (HI(0) | LO(37))
141
+ #define ORI (HI(13))
142
+ #define SD (HI(63))
143
+ #define SLT (HI(0) | LO(42))
144
+ #define SLTI (HI(10))
145
+ #define SLTIU (HI(11))
146
+ #define SLTU (HI(0) | LO(43))
147
+ #define SLL (HI(0) | LO(0))
148
+ #define SLLV (HI(0) | LO(4))
149
+ #define SRL (HI(0) | LO(2))
150
+ #define SRLV (HI(0) | LO(6))
151
+ #define SRA (HI(0) | LO(3))
152
+ #define SRAV (HI(0) | LO(7))
153
+ #define SUB_fmt (HI(17) | FMT_SD | LO(1))
154
+ #define SUBU (HI(0) | LO(35))
155
+ #define SW (HI(43))
156
+ #define XOR (HI(0) | LO(38))
157
+ #define XORI (HI(14))
158
+
159
+ #if (defined SLJIT_MIPS_32_64 && SLJIT_MIPS_32_64)
160
+ #define CLZ (HI(28) | LO(32))
161
+ #define MUL (HI(28) | LO(2))
162
+ #define SEB (HI(31) | (16 << 6) | LO(32))
163
+ #define SEH (HI(31) | (24 << 6) | LO(32))
164
+ #endif
165
+
166
+ #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
167
+ #define ADDU_W ADDU
168
+ #define ADDIU_W ADDIU
169
+ #define SLL_W SLL
170
+ #define SUBU_W SUBU
171
+ #else
172
+ #define ADDU_W DADDU
173
+ #define ADDIU_W DADDIU
174
+ #define SLL_W DSLL
175
+ #define SUBU_W DSUBU
176
+ #endif
177
+
178
+ #define SIMM_MAX (0x7fff)
179
+ #define SIMM_MIN (-0x8000)
180
+ #define UIMM_MAX (0xffff)
181
+
182
+ /* dest_reg is the absolute name of the register
183
+ Useful for reordering instructions in the delay slot. */
184
+ static sljit_si push_inst(struct sljit_compiler *compiler, sljit_ins ins, sljit_si delay_slot)
185
+ {
186
+ SLJIT_ASSERT(delay_slot == MOVABLE_INS || delay_slot >= UNMOVABLE_INS
187
+ || delay_slot == ((ins >> 11) & 0x1f) || delay_slot == ((ins >> 16) & 0x1f));
188
+ sljit_ins *ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins));
189
+ FAIL_IF(!ptr);
190
+ *ptr = ins;
191
+ compiler->size++;
192
+ compiler->delay_slot = delay_slot;
193
+ return SLJIT_SUCCESS;
194
+ }
195
+
196
+ static SLJIT_INLINE sljit_ins invert_branch(sljit_si flags)
197
+ {
198
+ return (flags & IS_BIT26_COND) ? (1 << 26) : (1 << 16);
199
+ }
200
+
201
+ static SLJIT_INLINE sljit_ins* optimize_jump(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code)
202
+ {
203
+ sljit_sw diff;
204
+ sljit_uw target_addr;
205
+ sljit_ins *inst;
206
+ sljit_ins saved_inst;
207
+
208
+ if (jump->flags & SLJIT_REWRITABLE_JUMP)
209
+ return code_ptr;
210
+
211
+ if (jump->flags & JUMP_ADDR)
212
+ target_addr = jump->u.target;
213
+ else {
214
+ SLJIT_ASSERT(jump->flags & JUMP_LABEL);
215
+ target_addr = (sljit_uw)(code + jump->u.label->size);
216
+ }
217
+ inst = (sljit_ins*)jump->addr;
218
+ if (jump->flags & IS_COND)
219
+ inst--;
220
+
221
+ /* B instructions. */
222
+ if (jump->flags & IS_MOVABLE) {
223
+ diff = ((sljit_sw)target_addr - (sljit_sw)(inst)) >> 2;
224
+ if (diff <= SIMM_MAX && diff >= SIMM_MIN) {
225
+ jump->flags |= PATCH_B;
226
+
227
+ if (!(jump->flags & IS_COND)) {
228
+ inst[0] = inst[-1];
229
+ inst[-1] = (jump->flags & IS_JAL) ? BAL : B;
230
+ jump->addr -= sizeof(sljit_ins);
231
+ return inst;
232
+ }
233
+ saved_inst = inst[0];
234
+ inst[0] = inst[-1];
235
+ inst[-1] = saved_inst ^ invert_branch(jump->flags);
236
+ jump->addr -= 2 * sizeof(sljit_ins);
237
+ return inst;
238
+ }
239
+ }
240
+
241
+ diff = ((sljit_sw)target_addr - (sljit_sw)(inst + 1)) >> 2;
242
+ if (diff <= SIMM_MAX && diff >= SIMM_MIN) {
243
+ jump->flags |= PATCH_B;
244
+
245
+ if (!(jump->flags & IS_COND)) {
246
+ inst[0] = (jump->flags & IS_JAL) ? BAL : B;
247
+ inst[1] = NOP;
248
+ return inst + 1;
249
+ }
250
+ inst[0] = inst[0] ^ invert_branch(jump->flags);
251
+ inst[1] = NOP;
252
+ jump->addr -= sizeof(sljit_ins);
253
+ return inst + 1;
254
+ }
255
+
256
+ if (jump->flags & IS_COND) {
257
+ if ((target_addr & ~0xfffffff) == ((jump->addr + 3 * sizeof(sljit_ins)) & ~0xfffffff)) {
258
+ jump->flags |= PATCH_J;
259
+ inst[0] = (inst[0] & 0xffff0000) | 3;
260
+ inst[1] = NOP;
261
+ inst[2] = J;
262
+ inst[3] = NOP;
263
+ jump->addr += sizeof(sljit_ins);
264
+ return inst + 3;
265
+ }
266
+ return code_ptr;
267
+ }
268
+
269
+ /* J instuctions. */
270
+ if (jump->flags & IS_MOVABLE) {
271
+ if ((target_addr & ~0xfffffff) == (jump->addr & ~0xfffffff)) {
272
+ jump->flags |= PATCH_J;
273
+ inst[0] = inst[-1];
274
+ inst[-1] = (jump->flags & IS_JAL) ? JAL : J;
275
+ jump->addr -= sizeof(sljit_ins);
276
+ return inst;
277
+ }
278
+ }
279
+
280
+ if ((target_addr & ~0xfffffff) == ((jump->addr + sizeof(sljit_ins)) & ~0xfffffff)) {
281
+ jump->flags |= PATCH_J;
282
+ inst[0] = (jump->flags & IS_JAL) ? JAL : J;
283
+ inst[1] = NOP;
284
+ return inst + 1;
285
+ }
286
+
287
+ return code_ptr;
288
+ }
289
+
290
+ #ifdef __GNUC__
291
+ static __attribute__ ((noinline)) void sljit_cache_flush(void* code, void* code_ptr)
292
+ {
293
+ SLJIT_CACHE_FLUSH(code, code_ptr);
294
+ }
295
+ #endif
296
+
297
+ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)
298
+ {
299
+ struct sljit_memory_fragment *buf;
300
+ sljit_ins *code;
301
+ sljit_ins *code_ptr;
302
+ sljit_ins *buf_ptr;
303
+ sljit_ins *buf_end;
304
+ sljit_uw word_count;
305
+ sljit_uw addr;
306
+
307
+ struct sljit_label *label;
308
+ struct sljit_jump *jump;
309
+ struct sljit_const *const_;
310
+
311
+ CHECK_ERROR_PTR();
312
+ check_sljit_generate_code(compiler);
313
+ reverse_buf(compiler);
314
+
315
+ code = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins));
316
+ PTR_FAIL_WITH_EXEC_IF(code);
317
+ buf = compiler->buf;
318
+
319
+ code_ptr = code;
320
+ word_count = 0;
321
+ label = compiler->labels;
322
+ jump = compiler->jumps;
323
+ const_ = compiler->consts;
324
+ do {
325
+ buf_ptr = (sljit_ins*)buf->memory;
326
+ buf_end = buf_ptr + (buf->used_size >> 2);
327
+ do {
328
+ *code_ptr = *buf_ptr++;
329
+ SLJIT_ASSERT(!label || label->size >= word_count);
330
+ SLJIT_ASSERT(!jump || jump->addr >= word_count);
331
+ SLJIT_ASSERT(!const_ || const_->addr >= word_count);
332
+ /* These structures are ordered by their address. */
333
+ if (label && label->size == word_count) {
334
+ /* Just recording the address. */
335
+ label->addr = (sljit_uw)code_ptr;
336
+ label->size = code_ptr - code;
337
+ label = label->next;
338
+ }
339
+ if (jump && jump->addr == word_count) {
340
+ #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
341
+ jump->addr = (sljit_uw)(code_ptr - 3);
342
+ #else
343
+ #error "Implementation required"
344
+ #endif
345
+ code_ptr = optimize_jump(jump, code_ptr, code);
346
+ jump = jump->next;
347
+ }
348
+ if (const_ && const_->addr == word_count) {
349
+ /* Just recording the address. */
350
+ const_->addr = (sljit_uw)code_ptr;
351
+ const_ = const_->next;
352
+ }
353
+ code_ptr ++;
354
+ word_count ++;
355
+ } while (buf_ptr < buf_end);
356
+
357
+ buf = buf->next;
358
+ } while (buf);
359
+
360
+ if (label && label->size == word_count) {
361
+ label->addr = (sljit_uw)code_ptr;
362
+ label->size = code_ptr - code;
363
+ label = label->next;
364
+ }
365
+
366
+ SLJIT_ASSERT(!label);
367
+ SLJIT_ASSERT(!jump);
368
+ SLJIT_ASSERT(!const_);
369
+ SLJIT_ASSERT(code_ptr - code <= (sljit_sw)compiler->size);
370
+
371
+ jump = compiler->jumps;
372
+ while (jump) {
373
+ do {
374
+ addr = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target;
375
+ buf_ptr = (sljit_ins*)jump->addr;
376
+
377
+ if (jump->flags & PATCH_B) {
378
+ addr = (sljit_sw)(addr - (jump->addr + sizeof(sljit_ins))) >> 2;
379
+ SLJIT_ASSERT((sljit_sw)addr <= SIMM_MAX && (sljit_sw)addr >= SIMM_MIN);
380
+ buf_ptr[0] = (buf_ptr[0] & 0xffff0000) | (addr & 0xffff);
381
+ break;
382
+ }
383
+ if (jump->flags & PATCH_J) {
384
+ SLJIT_ASSERT((addr & ~0xfffffff) == ((jump->addr + sizeof(sljit_ins)) & ~0xfffffff));
385
+ buf_ptr[0] |= (addr >> 2) & 0x03ffffff;
386
+ break;
387
+ }
388
+
389
+ /* Set the fields of immediate loads. */
390
+ #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
391
+ buf_ptr[0] = (buf_ptr[0] & 0xffff0000) | ((addr >> 16) & 0xffff);
392
+ buf_ptr[1] = (buf_ptr[1] & 0xffff0000) | (addr & 0xffff);
393
+ #else
394
+ #error "Implementation required"
395
+ #endif
396
+ } while (0);
397
+ jump = jump->next;
398
+ }
399
+
400
+ compiler->error = SLJIT_ERR_COMPILED;
401
+ compiler->executable_size = compiler->size * sizeof(sljit_ins);
402
+ #ifndef __GNUC__
403
+ SLJIT_CACHE_FLUSH(code, code_ptr);
404
+ #else
405
+ /* GCC workaround for invalid code generation with -O2. */
406
+ sljit_cache_flush(code, code_ptr);
407
+ #endif
408
+ return code;
409
+ }
410
+
411
+ /* --------------------------------------------------------------------- */
412
+ /* Entry, exit */
413
+ /* --------------------------------------------------------------------- */
414
+
415
+ /* Creates an index in data_transfer_insts array. */
416
+ #define LOAD_DATA 0x01
417
+ #define WORD_DATA 0x00
418
+ #define BYTE_DATA 0x02
419
+ #define HALF_DATA 0x04
420
+ #define INT_DATA 0x06
421
+ #define SIGNED_DATA 0x08
422
+ /* Separates integer and floating point registers */
423
+ #define GPR_REG 0x0f
424
+ #define DOUBLE_DATA 0x10
425
+
426
+ #define MEM_MASK 0x1f
427
+
428
+ #define WRITE_BACK 0x00020
429
+ #define ARG_TEST 0x00040
430
+ #define ALT_KEEP_CACHE 0x00080
431
+ #define CUMULATIVE_OP 0x00100
432
+ #define LOGICAL_OP 0x00200
433
+ #define IMM_OP 0x00400
434
+ #define SRC2_IMM 0x00800
435
+
436
+ #define UNUSED_DEST 0x01000
437
+ #define REG_DEST 0x02000
438
+ #define REG1_SOURCE 0x04000
439
+ #define REG2_SOURCE 0x08000
440
+ #define SLOW_SRC1 0x10000
441
+ #define SLOW_SRC2 0x20000
442
+ #define SLOW_DEST 0x40000
443
+
444
+ /* Only these flags are set. UNUSED_DEST is not set when no flags should be set. */
445
+ #define CHECK_FLAGS(list) \
446
+ (!(flags & UNUSED_DEST) || (op & GET_FLAGS(~(list))))
447
+
448
+ #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
449
+ #define STACK_STORE SW
450
+ #define STACK_LOAD LW
451
+ #else
452
+ #define STACK_STORE SD
453
+ #define STACK_LOAD LD
454
+ #endif
455
+
456
+ #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
457
+ #include "sljitNativeMIPS_32.c"
458
+ #else
459
+ #include "sljitNativeMIPS_64.c"
460
+ #endif
461
+
462
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compiler, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_si local_size)
463
+ {
464
+ sljit_ins base;
465
+
466
+ CHECK_ERROR();
467
+ check_sljit_emit_enter(compiler, args, scratches, saveds, local_size);
468
+
469
+ compiler->scratches = scratches;
470
+ compiler->saveds = saveds;
471
+ #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
472
+ compiler->logical_local_size = local_size;
473
+ #endif
474
+
475
+ local_size += (saveds + 1 + 4) * sizeof(sljit_sw);
476
+ local_size = (local_size + 15) & ~0xf;
477
+ compiler->local_size = local_size;
478
+
479
+ if (local_size <= SIMM_MAX) {
480
+ /* Frequent case. */
481
+ FAIL_IF(push_inst(compiler, ADDIU_W | S(SLJIT_LOCALS_REG) | T(SLJIT_LOCALS_REG) | IMM(-local_size), DR(SLJIT_LOCALS_REG)));
482
+ base = S(SLJIT_LOCALS_REG);
483
+ }
484
+ else {
485
+ FAIL_IF(load_immediate(compiler, DR(TMP_REG1), local_size));
486
+ FAIL_IF(push_inst(compiler, ADDU_W | S(SLJIT_LOCALS_REG) | TA(0) | D(TMP_REG2), DR(TMP_REG2)));
487
+ FAIL_IF(push_inst(compiler, SUBU_W | S(SLJIT_LOCALS_REG) | T(TMP_REG1) | D(SLJIT_LOCALS_REG), DR(SLJIT_LOCALS_REG)));
488
+ base = S(TMP_REG2);
489
+ local_size = 0;
490
+ }
491
+
492
+ FAIL_IF(push_inst(compiler, STACK_STORE | base | TA(RETURN_ADDR_REG) | IMM(local_size - 1 * (sljit_si)sizeof(sljit_sw)), MOVABLE_INS));
493
+ if (saveds >= 1)
494
+ FAIL_IF(push_inst(compiler, STACK_STORE | base | T(SLJIT_SAVED_REG1) | IMM(local_size - 2 * (sljit_si)sizeof(sljit_sw)), MOVABLE_INS));
495
+ if (saveds >= 2)
496
+ FAIL_IF(push_inst(compiler, STACK_STORE | base | T(SLJIT_SAVED_REG2) | IMM(local_size - 3 * (sljit_si)sizeof(sljit_sw)), MOVABLE_INS));
497
+ if (saveds >= 3)
498
+ FAIL_IF(push_inst(compiler, STACK_STORE | base | T(SLJIT_SAVED_REG3) | IMM(local_size - 4 * (sljit_si)sizeof(sljit_sw)), MOVABLE_INS));
499
+ if (saveds >= 4)
500
+ FAIL_IF(push_inst(compiler, STACK_STORE | base | T(SLJIT_SAVED_EREG1) | IMM(local_size - 5 * (sljit_si)sizeof(sljit_sw)), MOVABLE_INS));
501
+ if (saveds >= 5)
502
+ FAIL_IF(push_inst(compiler, STACK_STORE | base | T(SLJIT_SAVED_EREG2) | IMM(local_size - 6 * (sljit_si)sizeof(sljit_sw)), MOVABLE_INS));
503
+
504
+ if (args >= 1)
505
+ FAIL_IF(push_inst(compiler, ADDU_W | SA(4) | TA(0) | D(SLJIT_SAVED_REG1), DR(SLJIT_SAVED_REG1)));
506
+ if (args >= 2)
507
+ FAIL_IF(push_inst(compiler, ADDU_W | SA(5) | TA(0) | D(SLJIT_SAVED_REG2), DR(SLJIT_SAVED_REG2)));
508
+ if (args >= 3)
509
+ FAIL_IF(push_inst(compiler, ADDU_W | SA(6) | TA(0) | D(SLJIT_SAVED_REG3), DR(SLJIT_SAVED_REG3)));
510
+
511
+ return SLJIT_SUCCESS;
512
+ }
513
+
514
+ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_context(struct sljit_compiler *compiler, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_si local_size)
515
+ {
516
+ CHECK_ERROR_VOID();
517
+ check_sljit_set_context(compiler, args, scratches, saveds, local_size);
518
+
519
+ compiler->scratches = scratches;
520
+ compiler->saveds = saveds;
521
+ #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
522
+ compiler->logical_local_size = local_size;
523
+ #endif
524
+
525
+ local_size += (saveds + 1 + 4) * sizeof(sljit_sw);
526
+ compiler->local_size = (local_size + 15) & ~0xf;
527
+ }
528
+
529
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw)
530
+ {
531
+ sljit_si local_size;
532
+ sljit_ins base;
533
+
534
+ CHECK_ERROR();
535
+ check_sljit_emit_return(compiler, op, src, srcw);
536
+
537
+ FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));
538
+
539
+ local_size = compiler->local_size;
540
+ if (local_size <= SIMM_MAX)
541
+ base = S(SLJIT_LOCALS_REG);
542
+ else {
543
+ FAIL_IF(load_immediate(compiler, DR(TMP_REG1), local_size));
544
+ FAIL_IF(push_inst(compiler, ADDU_W | S(SLJIT_LOCALS_REG) | T(TMP_REG1) | D(TMP_REG1), DR(TMP_REG1)));
545
+ base = S(TMP_REG1);
546
+ local_size = 0;
547
+ }
548
+
549
+ FAIL_IF(push_inst(compiler, STACK_LOAD | base | TA(RETURN_ADDR_REG) | IMM(local_size - 1 * (sljit_si)sizeof(sljit_sw)), RETURN_ADDR_REG));
550
+ if (compiler->saveds >= 5)
551
+ FAIL_IF(push_inst(compiler, STACK_LOAD | base | T(SLJIT_SAVED_EREG2) | IMM(local_size - 6 * (sljit_si)sizeof(sljit_sw)), DR(SLJIT_SAVED_EREG2)));
552
+ if (compiler->saveds >= 4)
553
+ FAIL_IF(push_inst(compiler, STACK_LOAD | base | T(SLJIT_SAVED_EREG1) | IMM(local_size - 5 * (sljit_si)sizeof(sljit_sw)), DR(SLJIT_SAVED_EREG1)));
554
+ if (compiler->saveds >= 3)
555
+ FAIL_IF(push_inst(compiler, STACK_LOAD | base | T(SLJIT_SAVED_REG3) | IMM(local_size - 4 * (sljit_si)sizeof(sljit_sw)), DR(SLJIT_SAVED_REG3)));
556
+ if (compiler->saveds >= 2)
557
+ FAIL_IF(push_inst(compiler, STACK_LOAD | base | T(SLJIT_SAVED_REG2) | IMM(local_size - 3 * (sljit_si)sizeof(sljit_sw)), DR(SLJIT_SAVED_REG2)));
558
+ if (compiler->saveds >= 1)
559
+ FAIL_IF(push_inst(compiler, STACK_LOAD | base | T(SLJIT_SAVED_REG1) | IMM(local_size - 2 * (sljit_si)sizeof(sljit_sw)), DR(SLJIT_SAVED_REG1)));
560
+
561
+ FAIL_IF(push_inst(compiler, JR | SA(RETURN_ADDR_REG), UNMOVABLE_INS));
562
+ if (compiler->local_size <= SIMM_MAX)
563
+ return push_inst(compiler, ADDIU_W | S(SLJIT_LOCALS_REG) | T(SLJIT_LOCALS_REG) | IMM(compiler->local_size), UNMOVABLE_INS);
564
+ else
565
+ return push_inst(compiler, ADDU_W | S(TMP_REG1) | TA(0) | D(SLJIT_LOCALS_REG), UNMOVABLE_INS);
566
+ }
567
+
568
+ #undef STACK_STORE
569
+ #undef STACK_LOAD
570
+
571
+ /* --------------------------------------------------------------------- */
572
+ /* Operators */
573
+ /* --------------------------------------------------------------------- */
574
+
575
+ #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
576
+ #define ARCH_32_64(a, b) a
577
+ #else
578
+ #define ARCH_32_64(a, b) b
579
+ #endif
580
+
581
+ static SLJIT_CONST sljit_ins data_transfer_insts[16 + 4] = {
582
+ /* u w s */ ARCH_32_64(HI(43) /* sw */, HI(63) /* sd */),
583
+ /* u w l */ ARCH_32_64(HI(35) /* lw */, HI(55) /* ld */),
584
+ /* u b s */ HI(40) /* sb */,
585
+ /* u b l */ HI(36) /* lbu */,
586
+ /* u h s */ HI(41) /* sh */,
587
+ /* u h l */ HI(37) /* lhu */,
588
+ /* u i s */ HI(43) /* sw */,
589
+ /* u i l */ ARCH_32_64(HI(35) /* lw */, HI(39) /* lwu */),
590
+
591
+ /* s w s */ ARCH_32_64(HI(43) /* sw */, HI(63) /* sd */),
592
+ /* s w l */ ARCH_32_64(HI(35) /* lw */, HI(55) /* ld */),
593
+ /* s b s */ HI(40) /* sb */,
594
+ /* s b l */ HI(32) /* lb */,
595
+ /* s h s */ HI(41) /* sh */,
596
+ /* s h l */ HI(33) /* lh */,
597
+ /* s i s */ HI(43) /* sw */,
598
+ /* s i l */ HI(35) /* lw */,
599
+
600
+ /* d s */ HI(61) /* sdc1 */,
601
+ /* d l */ HI(53) /* ldc1 */,
602
+ /* s s */ HI(57) /* swc1 */,
603
+ /* s l */ HI(49) /* lwc1 */,
604
+ };
605
+
606
+ #undef ARCH_32_64
607
+
608
+ /* reg_ar is an absoulute register! */
609
+
610
+ /* Can perform an operation using at most 1 instruction. */
611
+ static sljit_si getput_arg_fast(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg_ar, sljit_si arg, sljit_sw argw)
612
+ {
613
+ SLJIT_ASSERT(arg & SLJIT_MEM);
614
+
615
+ if ((!(flags & WRITE_BACK) || !(arg & 0xf)) && !(arg & 0xf0) && argw <= SIMM_MAX && argw >= SIMM_MIN) {
616
+ /* Works for both absoulte and relative addresses. */
617
+ if (SLJIT_UNLIKELY(flags & ARG_TEST))
618
+ return 1;
619
+ FAIL_IF(push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | S(arg & 0xf)
620
+ | TA(reg_ar) | IMM(argw), ((flags & MEM_MASK) <= GPR_REG && (flags & LOAD_DATA)) ? reg_ar : MOVABLE_INS));
621
+ return -1;
622
+ }
623
+ return 0;
624
+ }
625
+
626
+ /* See getput_arg below.
627
+ Note: can_cache is called only for binary operators. Those
628
+ operators always uses word arguments without write back. */
629
+ static sljit_si can_cache(sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_sw next_argw)
630
+ {
631
+ SLJIT_ASSERT((arg & SLJIT_MEM) && (next_arg & SLJIT_MEM));
632
+
633
+ /* Simple operation except for updates. */
634
+ if (arg & 0xf0) {
635
+ argw &= 0x3;
636
+ next_argw &= 0x3;
637
+ if (argw && argw == next_argw && (arg == next_arg || (arg & 0xf0) == (next_arg & 0xf0)))
638
+ return 1;
639
+ return 0;
640
+ }
641
+
642
+ if (arg == next_arg) {
643
+ if (((next_argw - argw) <= SIMM_MAX && (next_argw - argw) >= SIMM_MIN))
644
+ return 1;
645
+ return 0;
646
+ }
647
+
648
+ return 0;
649
+ }
650
+
651
+ /* Emit the necessary instructions. See can_cache above. */
652
+ static sljit_si getput_arg(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg_ar, sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_sw next_argw)
653
+ {
654
+ sljit_si tmp_ar, base, delay_slot;
655
+
656
+ SLJIT_ASSERT(arg & SLJIT_MEM);
657
+ if (!(next_arg & SLJIT_MEM)) {
658
+ next_arg = 0;
659
+ next_argw = 0;
660
+ }
661
+
662
+ if ((flags & MEM_MASK) <= GPR_REG && (flags & LOAD_DATA)) {
663
+ tmp_ar = reg_ar;
664
+ delay_slot = reg_ar;
665
+ } else {
666
+ tmp_ar = DR(TMP_REG1);
667
+ delay_slot = MOVABLE_INS;
668
+ }
669
+ base = arg & 0xf;
670
+
671
+ if (SLJIT_UNLIKELY(arg & 0xf0)) {
672
+ argw &= 0x3;
673
+ if ((flags & WRITE_BACK) && reg_ar == DR(base)) {
674
+ SLJIT_ASSERT(!(flags & LOAD_DATA) && DR(TMP_REG1) != reg_ar);
675
+ FAIL_IF(push_inst(compiler, ADDU_W | SA(reg_ar) | TA(0) | D(TMP_REG1), DR(TMP_REG1)));
676
+ reg_ar = DR(TMP_REG1);
677
+ }
678
+
679
+ /* Using the cache. */
680
+ if (argw == compiler->cache_argw) {
681
+ if (!(flags & WRITE_BACK)) {
682
+ if (arg == compiler->cache_arg)
683
+ return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | S(TMP_REG3) | TA(reg_ar), delay_slot);
684
+ if ((SLJIT_MEM | (arg & 0xf0)) == compiler->cache_arg) {
685
+ if (arg == next_arg && argw == (next_argw & 0x3)) {
686
+ compiler->cache_arg = arg;
687
+ compiler->cache_argw = argw;
688
+ FAIL_IF(push_inst(compiler, ADDU_W | S(base) | T(TMP_REG3) | D(TMP_REG3), DR(TMP_REG3)));
689
+ return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | S(TMP_REG3) | TA(reg_ar), delay_slot);
690
+ }
691
+ FAIL_IF(push_inst(compiler, ADDU_W | S(base) | T(TMP_REG3) | DA(tmp_ar), tmp_ar));
692
+ return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | SA(tmp_ar) | TA(reg_ar), delay_slot);
693
+ }
694
+ }
695
+ else {
696
+ if ((SLJIT_MEM | (arg & 0xf0)) == compiler->cache_arg) {
697
+ FAIL_IF(push_inst(compiler, ADDU_W | S(base) | T(TMP_REG3) | D(base), DR(base)));
698
+ return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | S(base) | TA(reg_ar), delay_slot);
699
+ }
700
+ }
701
+ }
702
+
703
+ if (SLJIT_UNLIKELY(argw)) {
704
+ compiler->cache_arg = SLJIT_MEM | (arg & 0xf0);
705
+ compiler->cache_argw = argw;
706
+ FAIL_IF(push_inst(compiler, SLL_W | T((arg >> 4) & 0xf) | D(TMP_REG3) | SH_IMM(argw), DR(TMP_REG3)));
707
+ }
708
+
709
+ if (!(flags & WRITE_BACK)) {
710
+ if (arg == next_arg && argw == (next_argw & 0x3)) {
711
+ compiler->cache_arg = arg;
712
+ compiler->cache_argw = argw;
713
+ FAIL_IF(push_inst(compiler, ADDU_W | S(base) | T(!argw ? ((arg >> 4) & 0xf) : TMP_REG3) | D(TMP_REG3), DR(TMP_REG3)));
714
+ tmp_ar = DR(TMP_REG3);
715
+ }
716
+ else
717
+ FAIL_IF(push_inst(compiler, ADDU_W | S(base) | T(!argw ? ((arg >> 4) & 0xf) : TMP_REG3) | DA(tmp_ar), tmp_ar));
718
+ return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | SA(tmp_ar) | TA(reg_ar), delay_slot);
719
+ }
720
+ FAIL_IF(push_inst(compiler, ADDU_W | S(base) | T(!argw ? ((arg >> 4) & 0xf) : TMP_REG3) | D(base), DR(base)));
721
+ return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | S(base) | TA(reg_ar), delay_slot);
722
+ }
723
+
724
+ if (SLJIT_UNLIKELY(flags & WRITE_BACK) && base) {
725
+ /* Update only applies if a base register exists. */
726
+ if (reg_ar == DR(base)) {
727
+ SLJIT_ASSERT(!(flags & LOAD_DATA) && DR(TMP_REG1) != reg_ar);
728
+ if (argw <= SIMM_MAX && argw >= SIMM_MIN) {
729
+ FAIL_IF(push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | S(base) | TA(reg_ar) | IMM(argw), MOVABLE_INS));
730
+ if (argw)
731
+ return push_inst(compiler, ADDIU_W | S(base) | T(base) | IMM(argw), DR(base));
732
+ return SLJIT_SUCCESS;
733
+ }
734
+ FAIL_IF(push_inst(compiler, ADDU_W | SA(reg_ar) | TA(0) | D(TMP_REG1), DR(TMP_REG1)));
735
+ reg_ar = DR(TMP_REG1);
736
+ }
737
+
738
+ if (argw <= SIMM_MAX && argw >= SIMM_MIN) {
739
+ if (argw)
740
+ FAIL_IF(push_inst(compiler, ADDIU_W | S(base) | T(base) | IMM(argw), DR(base)));
741
+ }
742
+ else {
743
+ if (compiler->cache_arg == SLJIT_MEM && argw - compiler->cache_argw <= SIMM_MAX && argw - compiler->cache_argw >= SIMM_MIN) {
744
+ if (argw != compiler->cache_argw) {
745
+ FAIL_IF(push_inst(compiler, ADDIU_W | S(TMP_REG3) | T(TMP_REG3) | IMM(argw - compiler->cache_argw), DR(TMP_REG3)));
746
+ compiler->cache_argw = argw;
747
+ }
748
+ FAIL_IF(push_inst(compiler, ADDU_W | S(base) | T(TMP_REG3) | D(base), DR(base)));
749
+ }
750
+ else {
751
+ compiler->cache_arg = SLJIT_MEM;
752
+ compiler->cache_argw = argw;
753
+ FAIL_IF(load_immediate(compiler, DR(TMP_REG3), argw));
754
+ FAIL_IF(push_inst(compiler, ADDU_W | S(base) | T(TMP_REG3) | D(base), DR(base)));
755
+ }
756
+ }
757
+ return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | S(base) | TA(reg_ar), delay_slot);
758
+ }
759
+
760
+ if (compiler->cache_arg == arg && argw - compiler->cache_argw <= SIMM_MAX && argw - compiler->cache_argw >= SIMM_MIN) {
761
+ if (argw != compiler->cache_argw) {
762
+ FAIL_IF(push_inst(compiler, ADDIU_W | S(TMP_REG3) | T(TMP_REG3) | IMM(argw - compiler->cache_argw), DR(TMP_REG3)));
763
+ compiler->cache_argw = argw;
764
+ }
765
+ return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | S(TMP_REG3) | TA(reg_ar), delay_slot);
766
+ }
767
+
768
+ if (compiler->cache_arg == SLJIT_MEM && argw - compiler->cache_argw <= SIMM_MAX && argw - compiler->cache_argw >= SIMM_MIN) {
769
+ if (argw != compiler->cache_argw)
770
+ FAIL_IF(push_inst(compiler, ADDIU_W | S(TMP_REG3) | T(TMP_REG3) | IMM(argw - compiler->cache_argw), DR(TMP_REG3)));
771
+ }
772
+ else {
773
+ compiler->cache_arg = SLJIT_MEM;
774
+ FAIL_IF(load_immediate(compiler, DR(TMP_REG3), argw));
775
+ }
776
+ compiler->cache_argw = argw;
777
+
778
+ if (!base)
779
+ return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | S(TMP_REG3) | TA(reg_ar), delay_slot);
780
+
781
+ if (arg == next_arg && next_argw - argw <= SIMM_MAX && next_argw - argw >= SIMM_MIN) {
782
+ compiler->cache_arg = arg;
783
+ FAIL_IF(push_inst(compiler, ADDU_W | S(TMP_REG3) | T(base) | D(TMP_REG3), DR(TMP_REG3)));
784
+ return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | S(TMP_REG3) | TA(reg_ar), delay_slot);
785
+ }
786
+
787
+ FAIL_IF(push_inst(compiler, ADDU_W | S(TMP_REG3) | T(base) | DA(tmp_ar), tmp_ar));
788
+ return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | SA(tmp_ar) | TA(reg_ar), delay_slot);
789
+ }
790
+
791
+ static SLJIT_INLINE sljit_si emit_op_mem(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg_ar, sljit_si arg, sljit_sw argw)
792
+ {
793
+ if (getput_arg_fast(compiler, flags, reg_ar, arg, argw))
794
+ return compiler->error;
795
+ compiler->cache_arg = 0;
796
+ compiler->cache_argw = 0;
797
+ return getput_arg(compiler, flags, reg_ar, arg, argw, 0, 0);
798
+ }
799
+
800
+ static SLJIT_INLINE sljit_si emit_op_mem2(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg, sljit_si arg1, sljit_sw arg1w, sljit_si arg2, sljit_sw arg2w)
801
+ {
802
+ if (getput_arg_fast(compiler, flags, reg, arg1, arg1w))
803
+ return compiler->error;
804
+ return getput_arg(compiler, flags, reg, arg1, arg1w, arg2, arg2w);
805
+ }
806
+
807
+ static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si flags,
808
+ sljit_si dst, sljit_sw dstw,
809
+ sljit_si src1, sljit_sw src1w,
810
+ sljit_si src2, sljit_sw src2w)
811
+ {
812
+ /* arg1 goes to TMP_REG1 or src reg
813
+ arg2 goes to TMP_REG2, imm or src reg
814
+ TMP_REG3 can be used for caching
815
+ result goes to TMP_REG2, so put result can use TMP_REG1 and TMP_REG3. */
816
+ sljit_si dst_r = TMP_REG2;
817
+ sljit_si src1_r;
818
+ sljit_sw src2_r = 0;
819
+ sljit_si sugg_src2_r = TMP_REG2;
820
+
821
+ if (!(flags & ALT_KEEP_CACHE)) {
822
+ compiler->cache_arg = 0;
823
+ compiler->cache_argw = 0;
824
+ }
825
+
826
+ if (SLJIT_UNLIKELY(dst == SLJIT_UNUSED)) {
827
+ if (op >= SLJIT_MOV && op <= SLJIT_MOVU_SI && !(src2 & SLJIT_MEM))
828
+ return SLJIT_SUCCESS;
829
+ if (GET_FLAGS(op))
830
+ flags |= UNUSED_DEST;
831
+ }
832
+ else if (dst <= TMP_REG3) {
833
+ dst_r = dst;
834
+ flags |= REG_DEST;
835
+ if (op >= SLJIT_MOV && op <= SLJIT_MOVU_SI)
836
+ sugg_src2_r = dst_r;
837
+ }
838
+ else if ((dst & SLJIT_MEM) && !getput_arg_fast(compiler, flags | ARG_TEST, DR(TMP_REG1), dst, dstw))
839
+ flags |= SLOW_DEST;
840
+
841
+ if (flags & IMM_OP) {
842
+ if ((src2 & SLJIT_IMM) && src2w) {
843
+ if ((!(flags & LOGICAL_OP) && (src2w <= SIMM_MAX && src2w >= SIMM_MIN))
844
+ || ((flags & LOGICAL_OP) && !(src2w & ~UIMM_MAX))) {
845
+ flags |= SRC2_IMM;
846
+ src2_r = src2w;
847
+ }
848
+ }
849
+ if (!(flags & SRC2_IMM) && (flags & CUMULATIVE_OP) && (src1 & SLJIT_IMM) && src1w) {
850
+ if ((!(flags & LOGICAL_OP) && (src1w <= SIMM_MAX && src1w >= SIMM_MIN))
851
+ || ((flags & LOGICAL_OP) && !(src1w & ~UIMM_MAX))) {
852
+ flags |= SRC2_IMM;
853
+ src2_r = src1w;
854
+
855
+ /* And swap arguments. */
856
+ src1 = src2;
857
+ src1w = src2w;
858
+ src2 = SLJIT_IMM;
859
+ /* src2w = src2_r unneeded. */
860
+ }
861
+ }
862
+ }
863
+
864
+ /* Source 1. */
865
+ if (src1 <= TMP_REG3) {
866
+ src1_r = src1;
867
+ flags |= REG1_SOURCE;
868
+ }
869
+ else if (src1 & SLJIT_IMM) {
870
+ if (src1w) {
871
+ FAIL_IF(load_immediate(compiler, DR(TMP_REG1), src1w));
872
+ src1_r = TMP_REG1;
873
+ }
874
+ else
875
+ src1_r = 0;
876
+ }
877
+ else {
878
+ if (getput_arg_fast(compiler, flags | LOAD_DATA, DR(TMP_REG1), src1, src1w))
879
+ FAIL_IF(compiler->error);
880
+ else
881
+ flags |= SLOW_SRC1;
882
+ src1_r = TMP_REG1;
883
+ }
884
+
885
+ /* Source 2. */
886
+ if (src2 <= TMP_REG3) {
887
+ src2_r = src2;
888
+ flags |= REG2_SOURCE;
889
+ if (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOVU_SI)
890
+ dst_r = src2_r;
891
+ }
892
+ else if (src2 & SLJIT_IMM) {
893
+ if (!(flags & SRC2_IMM)) {
894
+ if (src2w) {
895
+ FAIL_IF(load_immediate(compiler, DR(sugg_src2_r), src2w));
896
+ src2_r = sugg_src2_r;
897
+ }
898
+ else {
899
+ src2_r = 0;
900
+ if ((op >= SLJIT_MOV && op <= SLJIT_MOVU_SI) && (dst & SLJIT_MEM))
901
+ dst_r = 0;
902
+ }
903
+ }
904
+ }
905
+ else {
906
+ if (getput_arg_fast(compiler, flags | LOAD_DATA, DR(sugg_src2_r), src2, src2w))
907
+ FAIL_IF(compiler->error);
908
+ else
909
+ flags |= SLOW_SRC2;
910
+ src2_r = sugg_src2_r;
911
+ }
912
+
913
+ if ((flags & (SLOW_SRC1 | SLOW_SRC2)) == (SLOW_SRC1 | SLOW_SRC2)) {
914
+ SLJIT_ASSERT(src2_r == TMP_REG2);
915
+ if (!can_cache(src1, src1w, src2, src2w) && can_cache(src1, src1w, dst, dstw)) {
916
+ FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, DR(TMP_REG2), src2, src2w, src1, src1w));
917
+ FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, DR(TMP_REG1), src1, src1w, dst, dstw));
918
+ }
919
+ else {
920
+ FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, DR(TMP_REG1), src1, src1w, src2, src2w));
921
+ FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, DR(TMP_REG2), src2, src2w, dst, dstw));
922
+ }
923
+ }
924
+ else if (flags & SLOW_SRC1)
925
+ FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, DR(TMP_REG1), src1, src1w, dst, dstw));
926
+ else if (flags & SLOW_SRC2)
927
+ FAIL_IF(getput_arg(compiler, flags | LOAD_DATA, DR(sugg_src2_r), src2, src2w, dst, dstw));
928
+
929
+ FAIL_IF(emit_single_op(compiler, op, flags, dst_r, src1_r, src2_r));
930
+
931
+ if (dst & SLJIT_MEM) {
932
+ if (!(flags & SLOW_DEST)) {
933
+ getput_arg_fast(compiler, flags, DR(dst_r), dst, dstw);
934
+ return compiler->error;
935
+ }
936
+ return getput_arg(compiler, flags, DR(dst_r), dst, dstw, 0, 0);
937
+ }
938
+
939
+ return SLJIT_SUCCESS;
940
+ }
941
+
942
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler, sljit_si op)
943
+ {
944
+ CHECK_ERROR();
945
+ check_sljit_emit_op0(compiler, op);
946
+
947
+ op = GET_OPCODE(op);
948
+ switch (op) {
949
+ case SLJIT_BREAKPOINT:
950
+ return push_inst(compiler, BREAK, UNMOVABLE_INS);
951
+ case SLJIT_NOP:
952
+ return push_inst(compiler, NOP, UNMOVABLE_INS);
953
+ case SLJIT_UMUL:
954
+ case SLJIT_SMUL:
955
+ FAIL_IF(push_inst(compiler, (op == SLJIT_UMUL ? MULTU : MULT) | S(SLJIT_SCRATCH_REG1) | T(SLJIT_SCRATCH_REG2), MOVABLE_INS));
956
+ FAIL_IF(push_inst(compiler, MFLO | D(SLJIT_SCRATCH_REG1), DR(SLJIT_SCRATCH_REG1)));
957
+ return push_inst(compiler, MFHI | D(SLJIT_SCRATCH_REG2), DR(SLJIT_SCRATCH_REG2));
958
+ case SLJIT_UDIV:
959
+ case SLJIT_SDIV:
960
+ #if !(defined SLJIT_MIPS_32_64 && SLJIT_MIPS_32_64)
961
+ FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
962
+ FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
963
+ #endif
964
+ FAIL_IF(push_inst(compiler, (op == SLJIT_UDIV ? DIVU : DIV) | S(SLJIT_SCRATCH_REG1) | T(SLJIT_SCRATCH_REG2), MOVABLE_INS));
965
+ FAIL_IF(push_inst(compiler, MFLO | D(SLJIT_SCRATCH_REG1), DR(SLJIT_SCRATCH_REG1)));
966
+ return push_inst(compiler, MFHI | D(SLJIT_SCRATCH_REG2), DR(SLJIT_SCRATCH_REG2));
967
+ }
968
+
969
+ return SLJIT_SUCCESS;
970
+ }
971
+
972
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler, sljit_si op,
973
+ sljit_si dst, sljit_sw dstw,
974
+ sljit_si src, sljit_sw srcw)
975
+ {
976
+ #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
977
+ # define flags 0
978
+ #endif
979
+
980
+ CHECK_ERROR();
981
+ check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw);
982
+ ADJUST_LOCAL_OFFSET(dst, dstw);
983
+ ADJUST_LOCAL_OFFSET(src, srcw);
984
+
985
+ switch (GET_OPCODE(op)) {
986
+ case SLJIT_MOV:
987
+ case SLJIT_MOV_P:
988
+ return emit_op(compiler, SLJIT_MOV, flags | WORD_DATA, dst, dstw, TMP_REG1, 0, src, srcw);
989
+
990
+ case SLJIT_MOV_UI:
991
+ return emit_op(compiler, SLJIT_MOV_UI, flags | INT_DATA, dst, dstw, TMP_REG1, 0, src, srcw);
992
+
993
+ case SLJIT_MOV_SI:
994
+ return emit_op(compiler, SLJIT_MOV_SI, flags | INT_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, srcw);
995
+
996
+ case SLJIT_MOV_UB:
997
+ return emit_op(compiler, SLJIT_MOV_UB, flags | BYTE_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_ub)srcw : srcw);
998
+
999
+ case SLJIT_MOV_SB:
1000
+ return emit_op(compiler, SLJIT_MOV_SB, flags | BYTE_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_sb)srcw : srcw);
1001
+
1002
+ case SLJIT_MOV_UH:
1003
+ return emit_op(compiler, SLJIT_MOV_UH, flags | HALF_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_uh)srcw : srcw);
1004
+
1005
+ case SLJIT_MOV_SH:
1006
+ return emit_op(compiler, SLJIT_MOV_SH, flags | HALF_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_sh)srcw : srcw);
1007
+
1008
+ case SLJIT_MOVU:
1009
+ case SLJIT_MOVU_P:
1010
+ return emit_op(compiler, SLJIT_MOV, flags | WORD_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw);
1011
+
1012
+ case SLJIT_MOVU_UI:
1013
+ return emit_op(compiler, SLJIT_MOV_UI, flags | INT_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw);
1014
+
1015
+ case SLJIT_MOVU_SI:
1016
+ return emit_op(compiler, SLJIT_MOV_SI, flags | INT_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw);
1017
+
1018
+ case SLJIT_MOVU_UB:
1019
+ return emit_op(compiler, SLJIT_MOV_UB, flags | BYTE_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_ub)srcw : srcw);
1020
+
1021
+ case SLJIT_MOVU_SB:
1022
+ return emit_op(compiler, SLJIT_MOV_SB, flags | BYTE_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_sb)srcw : srcw);
1023
+
1024
+ case SLJIT_MOVU_UH:
1025
+ return emit_op(compiler, SLJIT_MOV_UH, flags | HALF_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_uh)srcw : srcw);
1026
+
1027
+ case SLJIT_MOVU_SH:
1028
+ return emit_op(compiler, SLJIT_MOV_SH, flags | HALF_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_sh)srcw : srcw);
1029
+
1030
+ case SLJIT_NOT:
1031
+ return emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, src, srcw);
1032
+
1033
+ case SLJIT_NEG:
1034
+ return emit_op(compiler, SLJIT_SUB | GET_ALL_FLAGS(op), flags | IMM_OP, dst, dstw, SLJIT_IMM, 0, src, srcw);
1035
+
1036
+ case SLJIT_CLZ:
1037
+ return emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, src, srcw);
1038
+ }
1039
+
1040
+ return SLJIT_SUCCESS;
1041
+ #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
1042
+ # undef flags
1043
+ #endif
1044
+ }
1045
+
1046
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler, sljit_si op,
1047
+ sljit_si dst, sljit_sw dstw,
1048
+ sljit_si src1, sljit_sw src1w,
1049
+ sljit_si src2, sljit_sw src2w)
1050
+ {
1051
+ #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
1052
+ # define flags 0
1053
+ #endif
1054
+
1055
+ CHECK_ERROR();
1056
+ check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w);
1057
+ ADJUST_LOCAL_OFFSET(dst, dstw);
1058
+ ADJUST_LOCAL_OFFSET(src1, src1w);
1059
+ ADJUST_LOCAL_OFFSET(src2, src2w);
1060
+
1061
+ switch (GET_OPCODE(op)) {
1062
+ case SLJIT_ADD:
1063
+ case SLJIT_ADDC:
1064
+ return emit_op(compiler, op, flags | CUMULATIVE_OP | IMM_OP, dst, dstw, src1, src1w, src2, src2w);
1065
+
1066
+ case SLJIT_SUB:
1067
+ case SLJIT_SUBC:
1068
+ return emit_op(compiler, op, flags | IMM_OP, dst, dstw, src1, src1w, src2, src2w);
1069
+
1070
+ case SLJIT_MUL:
1071
+ return emit_op(compiler, op, flags | CUMULATIVE_OP, dst, dstw, src1, src1w, src2, src2w);
1072
+
1073
+ case SLJIT_AND:
1074
+ case SLJIT_OR:
1075
+ case SLJIT_XOR:
1076
+ return emit_op(compiler, op, flags | CUMULATIVE_OP | LOGICAL_OP | IMM_OP, dst, dstw, src1, src1w, src2, src2w);
1077
+
1078
+ case SLJIT_SHL:
1079
+ case SLJIT_LSHR:
1080
+ case SLJIT_ASHR:
1081
+ #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
1082
+ if (src2 & SLJIT_IMM)
1083
+ src2w &= 0x1f;
1084
+ #else
1085
+ SLJIT_ASSERT_STOP();
1086
+ #endif
1087
+ return emit_op(compiler, op, flags | IMM_OP, dst, dstw, src1, src1w, src2, src2w);
1088
+ }
1089
+
1090
+ return SLJIT_SUCCESS;
1091
+ #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
1092
+ # undef flags
1093
+ #endif
1094
+ }
1095
+
1096
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg)
1097
+ {
1098
+ check_sljit_get_register_index(reg);
1099
+ return reg_map[reg];
1100
+ }
1101
+
1102
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *compiler,
1103
+ void *instruction, sljit_si size)
1104
+ {
1105
+ CHECK_ERROR();
1106
+ check_sljit_emit_op_custom(compiler, instruction, size);
1107
+ SLJIT_ASSERT(size == 4);
1108
+
1109
+ return push_inst(compiler, *(sljit_ins*)instruction, UNMOVABLE_INS);
1110
+ }
1111
+
1112
+ /* --------------------------------------------------------------------- */
1113
+ /* Floating point operators */
1114
+ /* --------------------------------------------------------------------- */
1115
+
1116
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_is_fpu_available(void)
1117
+ {
1118
+ #if (defined SLJIT_QEMU && SLJIT_QEMU)
1119
+ /* Qemu says fir is 0 by default. */
1120
+ return 1;
1121
+ #elif defined(__GNUC__)
1122
+ sljit_sw fir;
1123
+ asm ("cfc1 %0, $0" : "=r"(fir));
1124
+ return (fir >> 22) & 0x1;
1125
+ #else
1126
+ #error "FIR check is not implemented for this architecture"
1127
+ #endif
1128
+ }
1129
+
1130
+ #define FLOAT_DATA(op) (DOUBLE_DATA | ((op & SLJIT_SINGLE_OP) >> 7))
1131
+ #define FMT(op) (((op & SLJIT_SINGLE_OP) ^ SLJIT_SINGLE_OP) << (21 - 8))
1132
+
1133
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compiler, sljit_si op,
1134
+ sljit_si dst, sljit_sw dstw,
1135
+ sljit_si src, sljit_sw srcw)
1136
+ {
1137
+ sljit_si dst_fr;
1138
+
1139
+ CHECK_ERROR();
1140
+ check_sljit_emit_fop1(compiler, op, dst, dstw, src, srcw);
1141
+ SLJIT_COMPILE_ASSERT((SLJIT_SINGLE_OP == 0x100) && !(DOUBLE_DATA & 0x2), float_transfer_bit_error);
1142
+
1143
+ compiler->cache_arg = 0;
1144
+ compiler->cache_argw = 0;
1145
+
1146
+ if (GET_OPCODE(op) == SLJIT_CMPD) {
1147
+ if (dst > SLJIT_FLOAT_REG6) {
1148
+ FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, dst, dstw, src, srcw));
1149
+ dst = TMP_FREG1;
1150
+ }
1151
+ else
1152
+ dst <<= 1;
1153
+
1154
+ if (src > SLJIT_FLOAT_REG6) {
1155
+ FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src, srcw, 0, 0));
1156
+ src = TMP_FREG2;
1157
+ }
1158
+ else
1159
+ src <<= 1;
1160
+
1161
+ /* src and dst are swapped. */
1162
+ if (op & SLJIT_SET_E) {
1163
+ FAIL_IF(push_inst(compiler, C_UEQ_fmt | FMT(op) | FT(src) | FS(dst), UNMOVABLE_INS));
1164
+ FAIL_IF(push_inst(compiler, CFC1 | TA(EQUAL_FLAG) | DA(FCSR_REG), EQUAL_FLAG));
1165
+ FAIL_IF(push_inst(compiler, SRL | TA(EQUAL_FLAG) | DA(EQUAL_FLAG) | SH_IMM(23), EQUAL_FLAG));
1166
+ FAIL_IF(push_inst(compiler, ANDI | SA(EQUAL_FLAG) | TA(EQUAL_FLAG) | IMM(1), EQUAL_FLAG));
1167
+ }
1168
+ if (op & SLJIT_SET_S) {
1169
+ /* Mixing the instructions for the two checks. */
1170
+ FAIL_IF(push_inst(compiler, C_ULT_fmt | FMT(op) | FT(src) | FS(dst), UNMOVABLE_INS));
1171
+ FAIL_IF(push_inst(compiler, CFC1 | TA(ULESS_FLAG) | DA(FCSR_REG), ULESS_FLAG));
1172
+ FAIL_IF(push_inst(compiler, C_ULT_fmt | FMT(op) | FT(dst) | FS(src), UNMOVABLE_INS));
1173
+ FAIL_IF(push_inst(compiler, SRL | TA(ULESS_FLAG) | DA(ULESS_FLAG) | SH_IMM(23), ULESS_FLAG));
1174
+ FAIL_IF(push_inst(compiler, ANDI | SA(ULESS_FLAG) | TA(ULESS_FLAG) | IMM(1), ULESS_FLAG));
1175
+ FAIL_IF(push_inst(compiler, CFC1 | TA(UGREATER_FLAG) | DA(FCSR_REG), UGREATER_FLAG));
1176
+ FAIL_IF(push_inst(compiler, SRL | TA(UGREATER_FLAG) | DA(UGREATER_FLAG) | SH_IMM(23), UGREATER_FLAG));
1177
+ FAIL_IF(push_inst(compiler, ANDI | SA(UGREATER_FLAG) | TA(UGREATER_FLAG) | IMM(1), UGREATER_FLAG));
1178
+ }
1179
+ return push_inst(compiler, C_UN_fmt | FMT(op) | FT(src) | FS(dst), FCSR_FCC);
1180
+ }
1181
+
1182
+ dst_fr = (dst > SLJIT_FLOAT_REG6) ? TMP_FREG1 : (dst << 1);
1183
+
1184
+ if (src > SLJIT_FLOAT_REG6) {
1185
+ FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, dst_fr, src, srcw, dst, dstw));
1186
+ src = dst_fr;
1187
+ }
1188
+ else
1189
+ src <<= 1;
1190
+
1191
+ switch (GET_OPCODE(op)) {
1192
+ case SLJIT_MOVD:
1193
+ if (src != dst_fr && dst_fr != TMP_FREG1)
1194
+ FAIL_IF(push_inst(compiler, MOV_fmt | FMT(op) | FS(src) | FD(dst_fr), MOVABLE_INS));
1195
+ break;
1196
+ case SLJIT_NEGD:
1197
+ FAIL_IF(push_inst(compiler, NEG_fmt | FMT(op) | FS(src) | FD(dst_fr), MOVABLE_INS));
1198
+ break;
1199
+ case SLJIT_ABSD:
1200
+ FAIL_IF(push_inst(compiler, ABS_fmt | FMT(op) | FS(src) | FD(dst_fr), MOVABLE_INS));
1201
+ break;
1202
+ }
1203
+
1204
+ if (dst_fr == TMP_FREG1) {
1205
+ if (GET_OPCODE(op) == SLJIT_MOVD)
1206
+ dst_fr = src;
1207
+ FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op), dst_fr, dst, dstw, 0, 0));
1208
+ }
1209
+
1210
+ return SLJIT_SUCCESS;
1211
+ }
1212
+
1213
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compiler, sljit_si op,
1214
+ sljit_si dst, sljit_sw dstw,
1215
+ sljit_si src1, sljit_sw src1w,
1216
+ sljit_si src2, sljit_sw src2w)
1217
+ {
1218
+ sljit_si dst_fr, flags = 0;
1219
+
1220
+ CHECK_ERROR();
1221
+ check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w);
1222
+
1223
+ compiler->cache_arg = 0;
1224
+ compiler->cache_argw = 0;
1225
+
1226
+ dst_fr = (dst > SLJIT_FLOAT_REG6) ? TMP_FREG2 : (dst << 1);
1227
+
1228
+ if (src1 > SLJIT_FLOAT_REG6) {
1229
+ if (getput_arg_fast(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w)) {
1230
+ FAIL_IF(compiler->error);
1231
+ src1 = TMP_FREG1;
1232
+ } else
1233
+ flags |= SLOW_SRC1;
1234
+ }
1235
+ else
1236
+ src1 <<= 1;
1237
+
1238
+ if (src2 > SLJIT_FLOAT_REG6) {
1239
+ if (getput_arg_fast(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w)) {
1240
+ FAIL_IF(compiler->error);
1241
+ src2 = TMP_FREG2;
1242
+ } else
1243
+ flags |= SLOW_SRC2;
1244
+ }
1245
+ else
1246
+ src2 <<= 1;
1247
+
1248
+ if ((flags & (SLOW_SRC1 | SLOW_SRC2)) == (SLOW_SRC1 | SLOW_SRC2)) {
1249
+ if (!can_cache(src1, src1w, src2, src2w) && can_cache(src1, src1w, dst, dstw)) {
1250
+ FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w, src1, src1w));
1251
+ FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, dst, dstw));
1252
+ }
1253
+ else {
1254
+ FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, src2, src2w));
1255
+ FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w, dst, dstw));
1256
+ }
1257
+ }
1258
+ else if (flags & SLOW_SRC1)
1259
+ FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, dst, dstw));
1260
+ else if (flags & SLOW_SRC2)
1261
+ FAIL_IF(getput_arg(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG2, src2, src2w, dst, dstw));
1262
+
1263
+ if (flags & SLOW_SRC1)
1264
+ src1 = TMP_FREG1;
1265
+ if (flags & SLOW_SRC2)
1266
+ src2 = TMP_FREG2;
1267
+
1268
+ switch (GET_OPCODE(op)) {
1269
+ case SLJIT_ADDD:
1270
+ FAIL_IF(push_inst(compiler, ADD_fmt | FMT(op) | FT(src2) | FS(src1) | FD(dst_fr), MOVABLE_INS));
1271
+ break;
1272
+
1273
+ case SLJIT_SUBD:
1274
+ FAIL_IF(push_inst(compiler, SUB_fmt | FMT(op) | FT(src2) | FS(src1) | FD(dst_fr), MOVABLE_INS));
1275
+ break;
1276
+
1277
+ case SLJIT_MULD:
1278
+ FAIL_IF(push_inst(compiler, MUL_fmt | FMT(op) | FT(src2) | FS(src1) | FD(dst_fr), MOVABLE_INS));
1279
+ break;
1280
+
1281
+ case SLJIT_DIVD:
1282
+ FAIL_IF(push_inst(compiler, DIV_fmt | FMT(op) | FT(src2) | FS(src1) | FD(dst_fr), MOVABLE_INS));
1283
+ break;
1284
+ }
1285
+
1286
+ if (dst_fr == TMP_FREG2)
1287
+ FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op), TMP_FREG2, dst, dstw, 0, 0));
1288
+
1289
+ return SLJIT_SUCCESS;
1290
+ }
1291
+
1292
+ /* --------------------------------------------------------------------- */
1293
+ /* Other instructions */
1294
+ /* --------------------------------------------------------------------- */
1295
+
1296
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw)
1297
+ {
1298
+ CHECK_ERROR();
1299
+ check_sljit_emit_fast_enter(compiler, dst, dstw);
1300
+ ADJUST_LOCAL_OFFSET(dst, dstw);
1301
+
1302
+ /* For UNUSED dst. Uncommon, but possible. */
1303
+ if (dst == SLJIT_UNUSED)
1304
+ return SLJIT_SUCCESS;
1305
+
1306
+ if (dst <= TMP_REG3)
1307
+ return push_inst(compiler, ADDU_W | SA(RETURN_ADDR_REG) | TA(0) | D(dst), DR(dst));
1308
+
1309
+ /* Memory. */
1310
+ return emit_op_mem(compiler, WORD_DATA, RETURN_ADDR_REG, dst, dstw);
1311
+ }
1312
+
1313
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_si src, sljit_sw srcw)
1314
+ {
1315
+ CHECK_ERROR();
1316
+ check_sljit_emit_fast_return(compiler, src, srcw);
1317
+ ADJUST_LOCAL_OFFSET(src, srcw);
1318
+
1319
+ if (src <= TMP_REG3)
1320
+ FAIL_IF(push_inst(compiler, ADDU_W | S(src) | TA(0) | DA(RETURN_ADDR_REG), RETURN_ADDR_REG));
1321
+ else if (src & SLJIT_MEM)
1322
+ FAIL_IF(emit_op_mem(compiler, WORD_DATA | LOAD_DATA, RETURN_ADDR_REG, src, srcw));
1323
+ else if (src & SLJIT_IMM)
1324
+ FAIL_IF(load_immediate(compiler, RETURN_ADDR_REG, srcw));
1325
+
1326
+ FAIL_IF(push_inst(compiler, JR | SA(RETURN_ADDR_REG), UNMOVABLE_INS));
1327
+ return push_inst(compiler, NOP, UNMOVABLE_INS);
1328
+ }
1329
+
1330
+ /* --------------------------------------------------------------------- */
1331
+ /* Conditional instructions */
1332
+ /* --------------------------------------------------------------------- */
1333
+
1334
+ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler)
1335
+ {
1336
+ struct sljit_label *label;
1337
+
1338
+ CHECK_ERROR_PTR();
1339
+ check_sljit_emit_label(compiler);
1340
+
1341
+ if (compiler->last_label && compiler->last_label->size == compiler->size)
1342
+ return compiler->last_label;
1343
+
1344
+ label = (struct sljit_label*)ensure_abuf(compiler, sizeof(struct sljit_label));
1345
+ PTR_FAIL_IF(!label);
1346
+ set_label(label, compiler);
1347
+ compiler->delay_slot = UNMOVABLE_INS;
1348
+ return label;
1349
+ }
1350
+
1351
+ #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
1352
+ #define JUMP_LENGTH 4
1353
+ #else
1354
+ #error "Implementation required"
1355
+ #endif
1356
+
1357
+ #define BR_Z(src) \
1358
+ inst = BEQ | SA(src) | TA(0) | JUMP_LENGTH; \
1359
+ flags = IS_BIT26_COND; \
1360
+ delay_check = src;
1361
+
1362
+ #define BR_NZ(src) \
1363
+ inst = BNE | SA(src) | TA(0) | JUMP_LENGTH; \
1364
+ flags = IS_BIT26_COND; \
1365
+ delay_check = src;
1366
+
1367
+ #define BR_T() \
1368
+ inst = BC1T | JUMP_LENGTH; \
1369
+ flags = IS_BIT16_COND; \
1370
+ delay_check = FCSR_FCC;
1371
+
1372
+ #define BR_F() \
1373
+ inst = BC1F | JUMP_LENGTH; \
1374
+ flags = IS_BIT16_COND; \
1375
+ delay_check = FCSR_FCC;
1376
+
1377
+ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_si type)
1378
+ {
1379
+ struct sljit_jump *jump;
1380
+ sljit_ins inst;
1381
+ sljit_si flags = 0;
1382
+ sljit_si delay_check = UNMOVABLE_INS;
1383
+
1384
+ CHECK_ERROR_PTR();
1385
+ check_sljit_emit_jump(compiler, type);
1386
+
1387
+ jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
1388
+ PTR_FAIL_IF(!jump);
1389
+ set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);
1390
+ type &= 0xff;
1391
+
1392
+ switch (type) {
1393
+ case SLJIT_C_EQUAL:
1394
+ case SLJIT_C_FLOAT_NOT_EQUAL:
1395
+ BR_NZ(EQUAL_FLAG);
1396
+ break;
1397
+ case SLJIT_C_NOT_EQUAL:
1398
+ case SLJIT_C_FLOAT_EQUAL:
1399
+ BR_Z(EQUAL_FLAG);
1400
+ break;
1401
+ case SLJIT_C_LESS:
1402
+ case SLJIT_C_FLOAT_LESS:
1403
+ BR_Z(ULESS_FLAG);
1404
+ break;
1405
+ case SLJIT_C_GREATER_EQUAL:
1406
+ case SLJIT_C_FLOAT_GREATER_EQUAL:
1407
+ BR_NZ(ULESS_FLAG);
1408
+ break;
1409
+ case SLJIT_C_GREATER:
1410
+ case SLJIT_C_FLOAT_GREATER:
1411
+ BR_Z(UGREATER_FLAG);
1412
+ break;
1413
+ case SLJIT_C_LESS_EQUAL:
1414
+ case SLJIT_C_FLOAT_LESS_EQUAL:
1415
+ BR_NZ(UGREATER_FLAG);
1416
+ break;
1417
+ case SLJIT_C_SIG_LESS:
1418
+ BR_Z(LESS_FLAG);
1419
+ break;
1420
+ case SLJIT_C_SIG_GREATER_EQUAL:
1421
+ BR_NZ(LESS_FLAG);
1422
+ break;
1423
+ case SLJIT_C_SIG_GREATER:
1424
+ BR_Z(GREATER_FLAG);
1425
+ break;
1426
+ case SLJIT_C_SIG_LESS_EQUAL:
1427
+ BR_NZ(GREATER_FLAG);
1428
+ break;
1429
+ case SLJIT_C_OVERFLOW:
1430
+ case SLJIT_C_MUL_OVERFLOW:
1431
+ BR_Z(OVERFLOW_FLAG);
1432
+ break;
1433
+ case SLJIT_C_NOT_OVERFLOW:
1434
+ case SLJIT_C_MUL_NOT_OVERFLOW:
1435
+ BR_NZ(OVERFLOW_FLAG);
1436
+ break;
1437
+ case SLJIT_C_FLOAT_UNORDERED:
1438
+ BR_F();
1439
+ break;
1440
+ case SLJIT_C_FLOAT_ORDERED:
1441
+ BR_T();
1442
+ break;
1443
+ default:
1444
+ /* Not conditional branch. */
1445
+ inst = 0;
1446
+ break;
1447
+ }
1448
+
1449
+ jump->flags |= flags;
1450
+ if (compiler->delay_slot == MOVABLE_INS || (compiler->delay_slot != UNMOVABLE_INS && compiler->delay_slot != delay_check))
1451
+ jump->flags |= IS_MOVABLE;
1452
+
1453
+ if (inst)
1454
+ PTR_FAIL_IF(push_inst(compiler, inst, UNMOVABLE_INS));
1455
+
1456
+ PTR_FAIL_IF(emit_const(compiler, TMP_REG2, 0));
1457
+ if (type <= SLJIT_JUMP) {
1458
+ PTR_FAIL_IF(push_inst(compiler, JR | S(TMP_REG2), UNMOVABLE_INS));
1459
+ jump->addr = compiler->size;
1460
+ PTR_FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
1461
+ } else {
1462
+ SLJIT_ASSERT(DR(PIC_ADDR_REG) == 25 && PIC_ADDR_REG == TMP_REG2);
1463
+ /* Cannot be optimized out if type is >= CALL0. */
1464
+ jump->flags |= IS_JAL | (type >= SLJIT_CALL0 ? SLJIT_REWRITABLE_JUMP : 0);
1465
+ PTR_FAIL_IF(push_inst(compiler, JALR | S(TMP_REG2) | DA(RETURN_ADDR_REG), UNMOVABLE_INS));
1466
+ jump->addr = compiler->size;
1467
+ /* A NOP if type < CALL1. */
1468
+ PTR_FAIL_IF(push_inst(compiler, ADDU_W | S(SLJIT_SCRATCH_REG1) | TA(0) | DA(4), UNMOVABLE_INS));
1469
+ }
1470
+ return jump;
1471
+ }
1472
+
1473
+ #define RESOLVE_IMM1() \
1474
+ if (src1 & SLJIT_IMM) { \
1475
+ if (src1w) { \
1476
+ PTR_FAIL_IF(load_immediate(compiler, DR(TMP_REG1), src1w)); \
1477
+ src1 = TMP_REG1; \
1478
+ } \
1479
+ else \
1480
+ src1 = 0; \
1481
+ }
1482
+
1483
+ #define RESOLVE_IMM2() \
1484
+ if (src2 & SLJIT_IMM) { \
1485
+ if (src2w) { \
1486
+ PTR_FAIL_IF(load_immediate(compiler, DR(TMP_REG2), src2w)); \
1487
+ src2 = TMP_REG2; \
1488
+ } \
1489
+ else \
1490
+ src2 = 0; \
1491
+ }
1492
+
1493
+ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, sljit_si type,
1494
+ sljit_si src1, sljit_sw src1w,
1495
+ sljit_si src2, sljit_sw src2w)
1496
+ {
1497
+ struct sljit_jump *jump;
1498
+ sljit_si flags;
1499
+ sljit_ins inst;
1500
+
1501
+ CHECK_ERROR_PTR();
1502
+ check_sljit_emit_cmp(compiler, type, src1, src1w, src2, src2w);
1503
+ ADJUST_LOCAL_OFFSET(src1, src1w);
1504
+ ADJUST_LOCAL_OFFSET(src2, src2w);
1505
+
1506
+ compiler->cache_arg = 0;
1507
+ compiler->cache_argw = 0;
1508
+ flags = ((type & SLJIT_INT_OP) ? INT_DATA : WORD_DATA) | LOAD_DATA;
1509
+ if (src1 & SLJIT_MEM) {
1510
+ PTR_FAIL_IF(emit_op_mem2(compiler, flags, DR(TMP_REG1), src1, src1w, src2, src2w));
1511
+ src1 = TMP_REG1;
1512
+ }
1513
+ if (src2 & SLJIT_MEM) {
1514
+ PTR_FAIL_IF(emit_op_mem2(compiler, flags, DR(TMP_REG2), src2, src2w, 0, 0));
1515
+ src2 = TMP_REG2;
1516
+ }
1517
+
1518
+ jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
1519
+ PTR_FAIL_IF(!jump);
1520
+ set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);
1521
+ type &= 0xff;
1522
+
1523
+ if (type <= SLJIT_C_NOT_EQUAL) {
1524
+ RESOLVE_IMM1();
1525
+ RESOLVE_IMM2();
1526
+ jump->flags |= IS_BIT26_COND;
1527
+ if (compiler->delay_slot == MOVABLE_INS || (compiler->delay_slot != UNMOVABLE_INS && compiler->delay_slot != DR(src1) && compiler->delay_slot != DR(src2)))
1528
+ jump->flags |= IS_MOVABLE;
1529
+ PTR_FAIL_IF(push_inst(compiler, (type == SLJIT_C_EQUAL ? BNE : BEQ) | S(src1) | T(src2) | JUMP_LENGTH, UNMOVABLE_INS));
1530
+ }
1531
+ else if (type >= SLJIT_C_SIG_LESS && (((src1 & SLJIT_IMM) && (src1w == 0)) || ((src2 & SLJIT_IMM) && (src2w == 0)))) {
1532
+ inst = NOP;
1533
+ if ((src1 & SLJIT_IMM) && (src1w == 0)) {
1534
+ RESOLVE_IMM2();
1535
+ switch (type) {
1536
+ case SLJIT_C_SIG_LESS:
1537
+ inst = BLEZ;
1538
+ jump->flags |= IS_BIT26_COND;
1539
+ break;
1540
+ case SLJIT_C_SIG_GREATER_EQUAL:
1541
+ inst = BGTZ;
1542
+ jump->flags |= IS_BIT26_COND;
1543
+ break;
1544
+ case SLJIT_C_SIG_GREATER:
1545
+ inst = BGEZ;
1546
+ jump->flags |= IS_BIT16_COND;
1547
+ break;
1548
+ case SLJIT_C_SIG_LESS_EQUAL:
1549
+ inst = BLTZ;
1550
+ jump->flags |= IS_BIT16_COND;
1551
+ break;
1552
+ }
1553
+ src1 = src2;
1554
+ }
1555
+ else {
1556
+ RESOLVE_IMM1();
1557
+ switch (type) {
1558
+ case SLJIT_C_SIG_LESS:
1559
+ inst = BGEZ;
1560
+ jump->flags |= IS_BIT16_COND;
1561
+ break;
1562
+ case SLJIT_C_SIG_GREATER_EQUAL:
1563
+ inst = BLTZ;
1564
+ jump->flags |= IS_BIT16_COND;
1565
+ break;
1566
+ case SLJIT_C_SIG_GREATER:
1567
+ inst = BLEZ;
1568
+ jump->flags |= IS_BIT26_COND;
1569
+ break;
1570
+ case SLJIT_C_SIG_LESS_EQUAL:
1571
+ inst = BGTZ;
1572
+ jump->flags |= IS_BIT26_COND;
1573
+ break;
1574
+ }
1575
+ }
1576
+ PTR_FAIL_IF(push_inst(compiler, inst | S(src1) | JUMP_LENGTH, UNMOVABLE_INS));
1577
+ }
1578
+ else {
1579
+ if (type == SLJIT_C_LESS || type == SLJIT_C_GREATER_EQUAL || type == SLJIT_C_SIG_LESS || type == SLJIT_C_SIG_GREATER_EQUAL) {
1580
+ RESOLVE_IMM1();
1581
+ if ((src2 & SLJIT_IMM) && src2w <= SIMM_MAX && src2w >= SIMM_MIN)
1582
+ PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_C_LESS_EQUAL ? SLTIU : SLTI) | S(src1) | T(TMP_REG1) | IMM(src2w), DR(TMP_REG1)));
1583
+ else {
1584
+ RESOLVE_IMM2();
1585
+ PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_C_LESS_EQUAL ? SLTU : SLT) | S(src1) | T(src2) | D(TMP_REG1), DR(TMP_REG1)));
1586
+ }
1587
+ type = (type == SLJIT_C_LESS || type == SLJIT_C_SIG_LESS) ? SLJIT_C_NOT_EQUAL : SLJIT_C_EQUAL;
1588
+ }
1589
+ else {
1590
+ RESOLVE_IMM2();
1591
+ if ((src1 & SLJIT_IMM) && src1w <= SIMM_MAX && src1w >= SIMM_MIN)
1592
+ PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_C_LESS_EQUAL ? SLTIU : SLTI) | S(src2) | T(TMP_REG1) | IMM(src1w), DR(TMP_REG1)));
1593
+ else {
1594
+ RESOLVE_IMM1();
1595
+ PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_C_LESS_EQUAL ? SLTU : SLT) | S(src2) | T(src1) | D(TMP_REG1), DR(TMP_REG1)));
1596
+ }
1597
+ type = (type == SLJIT_C_GREATER || type == SLJIT_C_SIG_GREATER) ? SLJIT_C_NOT_EQUAL : SLJIT_C_EQUAL;
1598
+ }
1599
+
1600
+ jump->flags |= IS_BIT26_COND;
1601
+ PTR_FAIL_IF(push_inst(compiler, (type == SLJIT_C_EQUAL ? BNE : BEQ) | S(TMP_REG1) | TA(0) | JUMP_LENGTH, UNMOVABLE_INS));
1602
+ }
1603
+
1604
+ PTR_FAIL_IF(emit_const(compiler, TMP_REG2, 0));
1605
+ PTR_FAIL_IF(push_inst(compiler, JR | S(TMP_REG2), UNMOVABLE_INS));
1606
+ jump->addr = compiler->size;
1607
+ PTR_FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
1608
+ return jump;
1609
+ }
1610
+
1611
+ #undef RESOLVE_IMM1
1612
+ #undef RESOLVE_IMM2
1613
+
1614
+ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_si type,
1615
+ sljit_si src1, sljit_sw src1w,
1616
+ sljit_si src2, sljit_sw src2w)
1617
+ {
1618
+ struct sljit_jump *jump;
1619
+ sljit_ins inst;
1620
+ sljit_si if_true;
1621
+
1622
+ CHECK_ERROR_PTR();
1623
+ check_sljit_emit_fcmp(compiler, type, src1, src1w, src2, src2w);
1624
+
1625
+ compiler->cache_arg = 0;
1626
+ compiler->cache_argw = 0;
1627
+
1628
+ if (src1 > SLJIT_FLOAT_REG6) {
1629
+ PTR_FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(type) | LOAD_DATA, TMP_FREG1, src1, src1w, src2, src2w));
1630
+ src1 = TMP_FREG1;
1631
+ }
1632
+ else
1633
+ src1 <<= 1;
1634
+
1635
+ if (src2 > SLJIT_FLOAT_REG6) {
1636
+ PTR_FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(type) | LOAD_DATA, TMP_FREG2, src2, src2w, 0, 0));
1637
+ src2 = TMP_FREG2;
1638
+ }
1639
+ else
1640
+ src2 <<= 1;
1641
+
1642
+ jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
1643
+ PTR_FAIL_IF(!jump);
1644
+ set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);
1645
+ jump->flags |= IS_BIT16_COND;
1646
+
1647
+ switch (type & 0xff) {
1648
+ case SLJIT_C_FLOAT_EQUAL:
1649
+ inst = C_UEQ_fmt;
1650
+ if_true = 1;
1651
+ break;
1652
+ case SLJIT_C_FLOAT_NOT_EQUAL:
1653
+ inst = C_UEQ_fmt;
1654
+ if_true = 0;
1655
+ break;
1656
+ case SLJIT_C_FLOAT_LESS:
1657
+ inst = C_ULT_fmt;
1658
+ if_true = 1;
1659
+ break;
1660
+ case SLJIT_C_FLOAT_GREATER_EQUAL:
1661
+ inst = C_ULT_fmt;
1662
+ if_true = 0;
1663
+ break;
1664
+ case SLJIT_C_FLOAT_GREATER:
1665
+ inst = C_ULE_fmt;
1666
+ if_true = 0;
1667
+ break;
1668
+ case SLJIT_C_FLOAT_LESS_EQUAL:
1669
+ inst = C_ULE_fmt;
1670
+ if_true = 1;
1671
+ break;
1672
+ case SLJIT_C_FLOAT_UNORDERED:
1673
+ inst = C_UN_fmt;
1674
+ if_true = 1;
1675
+ break;
1676
+ case SLJIT_C_FLOAT_ORDERED:
1677
+ default: /* Make compilers happy. */
1678
+ inst = C_UN_fmt;
1679
+ if_true = 0;
1680
+ break;
1681
+ }
1682
+
1683
+ PTR_FAIL_IF(push_inst(compiler, inst | FMT(type) | FT(src2) | FS(src1), UNMOVABLE_INS));
1684
+ /* Intentionally the other opcode. */
1685
+ PTR_FAIL_IF(push_inst(compiler, (if_true ? BC1F : BC1T) | JUMP_LENGTH, UNMOVABLE_INS));
1686
+ PTR_FAIL_IF(emit_const(compiler, TMP_REG2, 0));
1687
+ PTR_FAIL_IF(push_inst(compiler, JR | S(TMP_REG2), UNMOVABLE_INS));
1688
+ jump->addr = compiler->size;
1689
+ PTR_FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
1690
+ return jump;
1691
+ }
1692
+
1693
+ #undef JUMP_LENGTH
1694
+ #undef BR_Z
1695
+ #undef BR_NZ
1696
+ #undef BR_T
1697
+ #undef BR_F
1698
+
1699
+ #undef FLOAT_DATA
1700
+ #undef FMT
1701
+
1702
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compiler, sljit_si type, sljit_si src, sljit_sw srcw)
1703
+ {
1704
+ sljit_si src_r = TMP_REG2;
1705
+ struct sljit_jump *jump = NULL;
1706
+
1707
+ CHECK_ERROR();
1708
+ check_sljit_emit_ijump(compiler, type, src, srcw);
1709
+ ADJUST_LOCAL_OFFSET(src, srcw);
1710
+
1711
+ if (src <= TMP_REG3) {
1712
+ if (DR(src) != 4)
1713
+ src_r = src;
1714
+ else
1715
+ FAIL_IF(push_inst(compiler, ADDU_W | S(src) | TA(0) | D(TMP_REG2), DR(TMP_REG2)));
1716
+ }
1717
+
1718
+ if (type >= SLJIT_CALL0) {
1719
+ SLJIT_ASSERT(DR(PIC_ADDR_REG) == 25 && PIC_ADDR_REG == TMP_REG2);
1720
+ if (src & (SLJIT_IMM | SLJIT_MEM)) {
1721
+ if (src & SLJIT_IMM)
1722
+ FAIL_IF(load_immediate(compiler, DR(PIC_ADDR_REG), srcw));
1723
+ else {
1724
+ SLJIT_ASSERT(src_r == TMP_REG2 && (src & SLJIT_MEM));
1725
+ FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, TMP_REG2, 0, TMP_REG1, 0, src, srcw));
1726
+ }
1727
+ FAIL_IF(push_inst(compiler, JALR | S(PIC_ADDR_REG) | DA(RETURN_ADDR_REG), UNMOVABLE_INS));
1728
+ /* We need an extra instruction in any case. */
1729
+ return push_inst(compiler, ADDU_W | S(SLJIT_SCRATCH_REG1) | TA(0) | DA(4), UNMOVABLE_INS);
1730
+ }
1731
+
1732
+ /* Register input. */
1733
+ if (type >= SLJIT_CALL1)
1734
+ FAIL_IF(push_inst(compiler, ADDU_W | S(SLJIT_SCRATCH_REG1) | TA(0) | DA(4), 4));
1735
+ FAIL_IF(push_inst(compiler, JALR | S(src_r) | DA(RETURN_ADDR_REG), UNMOVABLE_INS));
1736
+ return push_inst(compiler, ADDU_W | S(src_r) | TA(0) | D(PIC_ADDR_REG), UNMOVABLE_INS);
1737
+ }
1738
+
1739
+ if (src & SLJIT_IMM) {
1740
+ jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
1741
+ FAIL_IF(!jump);
1742
+ set_jump(jump, compiler, JUMP_ADDR | ((type >= SLJIT_FAST_CALL) ? IS_JAL : 0));
1743
+ jump->u.target = srcw;
1744
+
1745
+ if (compiler->delay_slot != UNMOVABLE_INS)
1746
+ jump->flags |= IS_MOVABLE;
1747
+
1748
+ FAIL_IF(emit_const(compiler, TMP_REG2, 0));
1749
+ }
1750
+ else if (src & SLJIT_MEM)
1751
+ FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, TMP_REG2, 0, TMP_REG1, 0, src, srcw));
1752
+
1753
+ FAIL_IF(push_inst(compiler, JR | S(src_r), UNMOVABLE_INS));
1754
+ if (jump)
1755
+ jump->addr = compiler->size;
1756
+ FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
1757
+ return SLJIT_SUCCESS;
1758
+ }
1759
+
1760
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_si op,
1761
+ sljit_si dst, sljit_sw dstw,
1762
+ sljit_si src, sljit_sw srcw,
1763
+ sljit_si type)
1764
+ {
1765
+ sljit_si sugg_dst_ar, dst_ar;
1766
+ sljit_si flags = GET_ALL_FLAGS(op);
1767
+
1768
+ CHECK_ERROR();
1769
+ check_sljit_emit_op_flags(compiler, op, dst, dstw, src, srcw, type);
1770
+ ADJUST_LOCAL_OFFSET(dst, dstw);
1771
+
1772
+ if (dst == SLJIT_UNUSED)
1773
+ return SLJIT_SUCCESS;
1774
+
1775
+ op = GET_OPCODE(op);
1776
+ sugg_dst_ar = DR((op < SLJIT_ADD && dst <= TMP_REG3) ? dst : TMP_REG2);
1777
+
1778
+ compiler->cache_arg = 0;
1779
+ compiler->cache_argw = 0;
1780
+ if (op >= SLJIT_ADD && (src & SLJIT_MEM)) {
1781
+ ADJUST_LOCAL_OFFSET(src, srcw);
1782
+ FAIL_IF(emit_op_mem2(compiler, WORD_DATA | LOAD_DATA, DR(TMP_REG1), src, srcw, dst, dstw));
1783
+ src = TMP_REG1;
1784
+ srcw = 0;
1785
+ }
1786
+
1787
+ switch (type) {
1788
+ case SLJIT_C_EQUAL:
1789
+ case SLJIT_C_NOT_EQUAL:
1790
+ FAIL_IF(push_inst(compiler, SLTIU | SA(EQUAL_FLAG) | TA(sugg_dst_ar) | IMM(1), sugg_dst_ar));
1791
+ dst_ar = sugg_dst_ar;
1792
+ break;
1793
+ case SLJIT_C_LESS:
1794
+ case SLJIT_C_GREATER_EQUAL:
1795
+ case SLJIT_C_FLOAT_LESS:
1796
+ case SLJIT_C_FLOAT_GREATER_EQUAL:
1797
+ dst_ar = ULESS_FLAG;
1798
+ break;
1799
+ case SLJIT_C_GREATER:
1800
+ case SLJIT_C_LESS_EQUAL:
1801
+ case SLJIT_C_FLOAT_GREATER:
1802
+ case SLJIT_C_FLOAT_LESS_EQUAL:
1803
+ dst_ar = UGREATER_FLAG;
1804
+ break;
1805
+ case SLJIT_C_SIG_LESS:
1806
+ case SLJIT_C_SIG_GREATER_EQUAL:
1807
+ dst_ar = LESS_FLAG;
1808
+ break;
1809
+ case SLJIT_C_SIG_GREATER:
1810
+ case SLJIT_C_SIG_LESS_EQUAL:
1811
+ dst_ar = GREATER_FLAG;
1812
+ break;
1813
+ case SLJIT_C_OVERFLOW:
1814
+ case SLJIT_C_NOT_OVERFLOW:
1815
+ dst_ar = OVERFLOW_FLAG;
1816
+ break;
1817
+ case SLJIT_C_MUL_OVERFLOW:
1818
+ case SLJIT_C_MUL_NOT_OVERFLOW:
1819
+ FAIL_IF(push_inst(compiler, SLTIU | SA(OVERFLOW_FLAG) | TA(sugg_dst_ar) | IMM(1), sugg_dst_ar));
1820
+ dst_ar = sugg_dst_ar;
1821
+ type ^= 0x1; /* Flip type bit for the XORI below. */
1822
+ break;
1823
+ case SLJIT_C_FLOAT_EQUAL:
1824
+ case SLJIT_C_FLOAT_NOT_EQUAL:
1825
+ dst_ar = EQUAL_FLAG;
1826
+ break;
1827
+
1828
+ case SLJIT_C_FLOAT_UNORDERED:
1829
+ case SLJIT_C_FLOAT_ORDERED:
1830
+ FAIL_IF(push_inst(compiler, CFC1 | TA(sugg_dst_ar) | DA(FCSR_REG), sugg_dst_ar));
1831
+ FAIL_IF(push_inst(compiler, SRL | TA(sugg_dst_ar) | DA(sugg_dst_ar) | SH_IMM(23), sugg_dst_ar));
1832
+ FAIL_IF(push_inst(compiler, ANDI | SA(sugg_dst_ar) | TA(sugg_dst_ar) | IMM(1), sugg_dst_ar));
1833
+ dst_ar = sugg_dst_ar;
1834
+ break;
1835
+
1836
+ default:
1837
+ SLJIT_ASSERT_STOP();
1838
+ dst_ar = sugg_dst_ar;
1839
+ break;
1840
+ }
1841
+
1842
+ if (type & 0x1) {
1843
+ FAIL_IF(push_inst(compiler, XORI | SA(dst_ar) | TA(sugg_dst_ar) | IMM(1), sugg_dst_ar));
1844
+ dst_ar = sugg_dst_ar;
1845
+ }
1846
+
1847
+ if (op >= SLJIT_ADD) {
1848
+ if (DR(TMP_REG2) != dst_ar)
1849
+ FAIL_IF(push_inst(compiler, ADDU_W | SA(dst_ar) | TA(0) | D(TMP_REG2), DR(TMP_REG2)));
1850
+ return emit_op(compiler, op | flags, CUMULATIVE_OP | LOGICAL_OP | IMM_OP | ALT_KEEP_CACHE, dst, dstw, src, srcw, TMP_REG2, 0);
1851
+ }
1852
+
1853
+ if (dst & SLJIT_MEM)
1854
+ return emit_op_mem(compiler, WORD_DATA, dst_ar, dst, dstw);
1855
+
1856
+ if (sugg_dst_ar != dst_ar)
1857
+ return push_inst(compiler, ADDU_W | SA(dst_ar) | TA(0) | DA(sugg_dst_ar), sugg_dst_ar);
1858
+ return SLJIT_SUCCESS;
1859
+ }
1860
+
1861
+ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw, sljit_sw init_value)
1862
+ {
1863
+ struct sljit_const *const_;
1864
+ sljit_si reg;
1865
+
1866
+ CHECK_ERROR_PTR();
1867
+ check_sljit_emit_const(compiler, dst, dstw, init_value);
1868
+ ADJUST_LOCAL_OFFSET(dst, dstw);
1869
+
1870
+ const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));
1871
+ PTR_FAIL_IF(!const_);
1872
+ set_const(const_, compiler);
1873
+
1874
+ reg = (dst <= TMP_REG3) ? dst : TMP_REG2;
1875
+
1876
+ PTR_FAIL_IF(emit_const(compiler, reg, init_value));
1877
+
1878
+ if (dst & SLJIT_MEM)
1879
+ PTR_FAIL_IF(emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0));
1880
+ return const_;
1881
+ }