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,2836 @@
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
+ SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST char* sljit_get_platform_name(void)
28
+ {
29
+ return "x86" SLJIT_CPUINFO;
30
+ }
31
+
32
+ /*
33
+ 32b register indexes:
34
+ 0 - EAX
35
+ 1 - ECX
36
+ 2 - EDX
37
+ 3 - EBX
38
+ 4 - none
39
+ 5 - EBP
40
+ 6 - ESI
41
+ 7 - EDI
42
+ */
43
+
44
+ /*
45
+ 64b register indexes:
46
+ 0 - RAX
47
+ 1 - RCX
48
+ 2 - RDX
49
+ 3 - RBX
50
+ 4 - none
51
+ 5 - RBP
52
+ 6 - RSI
53
+ 7 - RDI
54
+ 8 - R8 - From now on REX prefix is required
55
+ 9 - R9
56
+ 10 - R10
57
+ 11 - R11
58
+ 12 - R12
59
+ 13 - R13
60
+ 14 - R14
61
+ 15 - R15
62
+ */
63
+
64
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
65
+
66
+ /* Last register + 1. */
67
+ #define TMP_REGISTER (SLJIT_NO_REGISTERS + 1)
68
+
69
+ static SLJIT_CONST sljit_ub reg_map[SLJIT_NO_REGISTERS + 2] = {
70
+ 0, 0, 2, 1, 0, 0, 3, 6, 7, 0, 0, 4, 5
71
+ };
72
+
73
+ #define CHECK_EXTRA_REGS(p, w, do) \
74
+ if (p >= SLJIT_TEMPORARY_EREG1 && p <= SLJIT_TEMPORARY_EREG2) { \
75
+ w = compiler->scratches_start + (p - SLJIT_TEMPORARY_EREG1) * sizeof(sljit_sw); \
76
+ p = SLJIT_MEM1(SLJIT_LOCALS_REG); \
77
+ do; \
78
+ } \
79
+ else if (p >= SLJIT_SAVED_EREG1 && p <= SLJIT_SAVED_EREG2) { \
80
+ w = compiler->saveds_start + (p - SLJIT_SAVED_EREG1) * sizeof(sljit_sw); \
81
+ p = SLJIT_MEM1(SLJIT_LOCALS_REG); \
82
+ do; \
83
+ }
84
+
85
+ #else /* SLJIT_CONFIG_X86_32 */
86
+
87
+ /* Last register + 1. */
88
+ #define TMP_REGISTER (SLJIT_NO_REGISTERS + 1)
89
+ #define TMP_REG2 (SLJIT_NO_REGISTERS + 2)
90
+ #define TMP_REG3 (SLJIT_NO_REGISTERS + 3)
91
+
92
+ /* Note: r12 & 0x7 == 0b100, which decoded as SIB byte present
93
+ Note: avoid to use r12 and r13 for memory addessing
94
+ therefore r12 is better for SAVED_EREG than SAVED_REG. */
95
+ #ifndef _WIN64
96
+ /* 1st passed in rdi, 2nd argument passed in rsi, 3rd in rdx. */
97
+ static SLJIT_CONST sljit_ub reg_map[SLJIT_NO_REGISTERS + 4] = {
98
+ 0, 0, 6, 1, 8, 11, 3, 15, 14, 13, 12, 4, 2, 7, 9
99
+ };
100
+ /* low-map. reg_map & 0x7. */
101
+ static SLJIT_CONST sljit_ub reg_lmap[SLJIT_NO_REGISTERS + 4] = {
102
+ 0, 0, 6, 1, 0, 3, 3, 7, 6, 5, 4, 4, 2, 7, 1
103
+ };
104
+ #else
105
+ /* 1st passed in rcx, 2nd argument passed in rdx, 3rd in r8. */
106
+ static SLJIT_CONST sljit_ub reg_map[SLJIT_NO_REGISTERS + 4] = {
107
+ 0, 0, 2, 1, 11, 13, 3, 6, 7, 14, 15, 4, 10, 8, 9
108
+ };
109
+ /* low-map. reg_map & 0x7. */
110
+ static SLJIT_CONST sljit_ub reg_lmap[SLJIT_NO_REGISTERS + 4] = {
111
+ 0, 0, 2, 1, 3, 5, 3, 6, 7, 6, 7, 4, 2, 0, 1
112
+ };
113
+ #endif
114
+
115
+ #define REX_W 0x48
116
+ #define REX_R 0x44
117
+ #define REX_X 0x42
118
+ #define REX_B 0x41
119
+ #define REX 0x40
120
+
121
+ #define IS_HALFWORD(x) ((x) <= 0x7fffffffll && (x) >= -0x80000000ll)
122
+ #define NOT_HALFWORD(x) ((x) > 0x7fffffffll || (x) < -0x80000000ll)
123
+
124
+ #define CHECK_EXTRA_REGS(p, w, do)
125
+
126
+ #endif /* SLJIT_CONFIG_X86_32 */
127
+
128
+ #if (defined SLJIT_SSE2 && SLJIT_SSE2)
129
+ #define TMP_FREG (0)
130
+ #endif
131
+
132
+ /* Size flags for emit_x86_instruction: */
133
+ #define EX86_BIN_INS 0x0010
134
+ #define EX86_SHIFT_INS 0x0020
135
+ #define EX86_REX 0x0040
136
+ #define EX86_NO_REXW 0x0080
137
+ #define EX86_BYTE_ARG 0x0100
138
+ #define EX86_HALF_ARG 0x0200
139
+ #define EX86_PREF_66 0x0400
140
+
141
+ #if (defined SLJIT_SSE2 && SLJIT_SSE2)
142
+ #define EX86_SSE2 0x0800
143
+ #define EX86_PREF_F2 0x1000
144
+ #define EX86_PREF_F3 0x2000
145
+ #endif
146
+
147
+ /* --------------------------------------------------------------------- */
148
+ /* Instrucion forms */
149
+ /* --------------------------------------------------------------------- */
150
+
151
+ #define ADD (/* BINARY */ 0 << 3)
152
+ #define ADD_EAX_i32 0x05
153
+ #define ADD_r_rm 0x03
154
+ #define ADD_rm_r 0x01
155
+ #define ADDSD_x_xm 0x58
156
+ #define ADC (/* BINARY */ 2 << 3)
157
+ #define ADC_EAX_i32 0x15
158
+ #define ADC_r_rm 0x13
159
+ #define ADC_rm_r 0x11
160
+ #define AND (/* BINARY */ 4 << 3)
161
+ #define AND_EAX_i32 0x25
162
+ #define AND_r_rm 0x23
163
+ #define AND_rm_r 0x21
164
+ #define ANDPD_x_xm 0x54
165
+ #define BSR_r_rm (/* GROUP_0F */ 0xbd)
166
+ #define CALL_i32 0xe8
167
+ #define CALL_rm (/* GROUP_FF */ 2 << 3)
168
+ #define CDQ 0x99
169
+ #define CMOVNE_r_rm (/* GROUP_0F */ 0x45)
170
+ #define CMP (/* BINARY */ 7 << 3)
171
+ #define CMP_EAX_i32 0x3d
172
+ #define CMP_r_rm 0x3b
173
+ #define CMP_rm_r 0x39
174
+ #define DIV (/* GROUP_F7 */ 6 << 3)
175
+ #define DIVSD_x_xm 0x5e
176
+ #define INT3 0xcc
177
+ #define IDIV (/* GROUP_F7 */ 7 << 3)
178
+ #define IMUL (/* GROUP_F7 */ 5 << 3)
179
+ #define IMUL_r_rm (/* GROUP_0F */ 0xaf)
180
+ #define IMUL_r_rm_i8 0x6b
181
+ #define IMUL_r_rm_i32 0x69
182
+ #define JE_i8 0x74
183
+ #define JMP_i8 0xeb
184
+ #define JMP_i32 0xe9
185
+ #define JMP_rm (/* GROUP_FF */ 4 << 3)
186
+ #define LEA_r_m 0x8d
187
+ #define MOV_r_rm 0x8b
188
+ #define MOV_r_i32 0xb8
189
+ #define MOV_rm_r 0x89
190
+ #define MOV_rm_i32 0xc7
191
+ #define MOV_rm8_i8 0xc6
192
+ #define MOV_rm8_r8 0x88
193
+ #define MOVSD_x_xm 0x10
194
+ #define MOVSD_xm_x 0x11
195
+ #define MOVSXD_r_rm 0x63
196
+ #define MOVSX_r_rm8 (/* GROUP_0F */ 0xbe)
197
+ #define MOVSX_r_rm16 (/* GROUP_0F */ 0xbf)
198
+ #define MOVZX_r_rm8 (/* GROUP_0F */ 0xb6)
199
+ #define MOVZX_r_rm16 (/* GROUP_0F */ 0xb7)
200
+ #define MUL (/* GROUP_F7 */ 4 << 3)
201
+ #define MULSD_x_xm 0x59
202
+ #define NEG_rm (/* GROUP_F7 */ 3 << 3)
203
+ #define NOP 0x90
204
+ #define NOT_rm (/* GROUP_F7 */ 2 << 3)
205
+ #define OR (/* BINARY */ 1 << 3)
206
+ #define OR_r_rm 0x0b
207
+ #define OR_EAX_i32 0x0d
208
+ #define OR_rm_r 0x09
209
+ #define POP_r 0x58
210
+ #define POP_rm 0x8f
211
+ #define POPF 0x9d
212
+ #define PUSH_i32 0x68
213
+ #define PUSH_r 0x50
214
+ #define PUSH_rm (/* GROUP_FF */ 6 << 3)
215
+ #define PUSHF 0x9c
216
+ #define RET_near 0xc3
217
+ #define RET_i16 0xc2
218
+ #define SBB (/* BINARY */ 3 << 3)
219
+ #define SBB_EAX_i32 0x1d
220
+ #define SBB_r_rm 0x1b
221
+ #define SBB_rm_r 0x19
222
+ #define SAR (/* SHIFT */ 7 << 3)
223
+ #define SHL (/* SHIFT */ 4 << 3)
224
+ #define SHR (/* SHIFT */ 5 << 3)
225
+ #define SUB (/* BINARY */ 5 << 3)
226
+ #define SUB_EAX_i32 0x2d
227
+ #define SUB_r_rm 0x2b
228
+ #define SUB_rm_r 0x29
229
+ #define SUBSD_x_xm 0x5c
230
+ #define TEST_EAX_i32 0xa9
231
+ #define TEST_rm_r 0x85
232
+ #define UCOMISD_x_xm 0x2e
233
+ #define XCHG_EAX_r 0x90
234
+ #define XCHG_r_rm 0x87
235
+ #define XOR (/* BINARY */ 6 << 3)
236
+ #define XOR_EAX_i32 0x35
237
+ #define XOR_r_rm 0x33
238
+ #define XOR_rm_r 0x31
239
+ #define XORPD_x_xm 0x57
240
+
241
+ #define GROUP_0F 0x0f
242
+ #define GROUP_F7 0xf7
243
+ #define GROUP_FF 0xff
244
+ #define GROUP_BINARY_81 0x81
245
+ #define GROUP_BINARY_83 0x83
246
+ #define GROUP_SHIFT_1 0xd1
247
+ #define GROUP_SHIFT_N 0xc1
248
+ #define GROUP_SHIFT_CL 0xd3
249
+
250
+ #define MOD_REG 0xc0
251
+ #define MOD_DISP8 0x40
252
+
253
+ #define INC_SIZE(s) (*inst++ = (s), compiler->size += (s))
254
+
255
+ #define PUSH_REG(r) (*inst++ = (PUSH_r + (r)))
256
+ #define POP_REG(r) (*inst++ = (POP_r + (r)))
257
+ #define RET() (*inst++ = (RET_near))
258
+ #define RET_I16(n) (*inst++ = (RET_i16), *inst++ = n, *inst++ = 0)
259
+ /* r32, r/m32 */
260
+ #define MOV_RM(mod, reg, rm) (*inst++ = (MOV_r_rm), *inst++ = (mod) << 6 | (reg) << 3 | (rm))
261
+
262
+ /* Multithreading does not affect these static variables, since they store
263
+ built-in CPU features. Therefore they can be overwritten by different threads
264
+ if they detect the CPU features in the same time. */
265
+ #if (defined SLJIT_SSE2 && SLJIT_SSE2) && (defined SLJIT_DETECT_SSE2 && SLJIT_DETECT_SSE2)
266
+ static sljit_si cpu_has_sse2 = -1;
267
+ #endif
268
+ static sljit_si cpu_has_cmov = -1;
269
+
270
+ #if defined(_MSC_VER) && (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
271
+ #if _MSC_VER >= 1400
272
+ #include <intrin.h>
273
+ #else
274
+ #error "MSVC does not support inline assembly in 64 bit mode"
275
+ #endif
276
+ #endif /* _MSC_VER && SLJIT_CONFIG_X86_64 */
277
+
278
+ static void get_cpu_features(void)
279
+ {
280
+ sljit_ui features;
281
+
282
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
283
+
284
+ #if defined(__GNUC__) || defined(__INTEL_COMPILER) || defined(__SUNPRO_C)
285
+ /* AT&T syntax. */
286
+ __asm__ (
287
+ "pushl %%ebx\n"
288
+ "movl $0x1, %%eax\n"
289
+ "cpuid\n"
290
+ "popl %%ebx\n"
291
+ "movl %%edx, %0\n"
292
+ : "=g" (features)
293
+ :
294
+ : "%eax", "%ecx", "%edx"
295
+ );
296
+ #elif defined(_MSC_VER) || defined(__BORLANDC__)
297
+ /* Intel syntax. */
298
+ __asm {
299
+ mov eax, 1
300
+ push ebx
301
+ cpuid
302
+ pop ebx
303
+ mov features, edx
304
+ }
305
+ #else
306
+ # error "SLJIT_DETECT_SSE2 is not implemented for this C compiler"
307
+ #endif
308
+
309
+ #else /* SLJIT_CONFIG_X86_32 */
310
+
311
+ #if defined(__GNUC__) || defined(__INTEL_COMPILER) || defined(__SUNPRO_C)
312
+ /* AT&T syntax. */
313
+ __asm__ (
314
+ "pushq %%rbx\n"
315
+ "movl $0x1, %%eax\n"
316
+ "cpuid\n"
317
+ "popq %%rbx\n"
318
+ "movl %%edx, %0\n"
319
+ : "=g" (features)
320
+ :
321
+ : "%rax", "%rcx", "%rdx"
322
+ );
323
+ #elif defined(_MSC_VER) && _MSC_VER >= 1400
324
+ int CPUInfo[4];
325
+
326
+ __cpuid(CPUInfo, 1);
327
+ features = (sljit_ui)CPUInfo[3];
328
+ #else
329
+ __asm {
330
+ mov eax, 1
331
+ push rbx
332
+ cpuid
333
+ pop rbx
334
+ mov features, edx
335
+ }
336
+ #endif
337
+
338
+ #endif /* SLJIT_CONFIG_X86_32 */
339
+
340
+ #if (defined SLJIT_SSE2 && SLJIT_SSE2) && (defined SLJIT_DETECT_SSE2 && SLJIT_DETECT_SSE2)
341
+ cpu_has_sse2 = (features >> 26) & 0x1;
342
+ #endif
343
+ cpu_has_cmov = (features >> 15) & 0x1;
344
+ }
345
+
346
+ static sljit_ub get_jump_code(sljit_si type)
347
+ {
348
+ switch (type) {
349
+ case SLJIT_C_EQUAL:
350
+ case SLJIT_C_FLOAT_EQUAL:
351
+ return 0x84 /* je */;
352
+
353
+ case SLJIT_C_NOT_EQUAL:
354
+ case SLJIT_C_FLOAT_NOT_EQUAL:
355
+ return 0x85 /* jne */;
356
+
357
+ case SLJIT_C_LESS:
358
+ case SLJIT_C_FLOAT_LESS:
359
+ return 0x82 /* jc */;
360
+
361
+ case SLJIT_C_GREATER_EQUAL:
362
+ case SLJIT_C_FLOAT_GREATER_EQUAL:
363
+ return 0x83 /* jae */;
364
+
365
+ case SLJIT_C_GREATER:
366
+ case SLJIT_C_FLOAT_GREATER:
367
+ return 0x87 /* jnbe */;
368
+
369
+ case SLJIT_C_LESS_EQUAL:
370
+ case SLJIT_C_FLOAT_LESS_EQUAL:
371
+ return 0x86 /* jbe */;
372
+
373
+ case SLJIT_C_SIG_LESS:
374
+ return 0x8c /* jl */;
375
+
376
+ case SLJIT_C_SIG_GREATER_EQUAL:
377
+ return 0x8d /* jnl */;
378
+
379
+ case SLJIT_C_SIG_GREATER:
380
+ return 0x8f /* jnle */;
381
+
382
+ case SLJIT_C_SIG_LESS_EQUAL:
383
+ return 0x8e /* jle */;
384
+
385
+ case SLJIT_C_OVERFLOW:
386
+ case SLJIT_C_MUL_OVERFLOW:
387
+ return 0x80 /* jo */;
388
+
389
+ case SLJIT_C_NOT_OVERFLOW:
390
+ case SLJIT_C_MUL_NOT_OVERFLOW:
391
+ return 0x81 /* jno */;
392
+
393
+ case SLJIT_C_FLOAT_UNORDERED:
394
+ return 0x8a /* jp */;
395
+
396
+ case SLJIT_C_FLOAT_ORDERED:
397
+ return 0x8b /* jpo */;
398
+ }
399
+ return 0;
400
+ }
401
+
402
+ static sljit_ub* generate_far_jump_code(struct sljit_jump *jump, sljit_ub *code_ptr, sljit_si type);
403
+
404
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
405
+ static sljit_ub* generate_fixed_jump(sljit_ub *code_ptr, sljit_sw addr, sljit_si type);
406
+ #endif
407
+
408
+ static sljit_ub* generate_near_jump_code(struct sljit_jump *jump, sljit_ub *code_ptr, sljit_ub *code, sljit_si type)
409
+ {
410
+ sljit_si short_jump;
411
+ sljit_uw label_addr;
412
+
413
+ if (jump->flags & JUMP_LABEL)
414
+ label_addr = (sljit_uw)(code + jump->u.label->size);
415
+ else
416
+ label_addr = jump->u.target;
417
+ short_jump = (sljit_sw)(label_addr - (jump->addr + 2)) >= -128 && (sljit_sw)(label_addr - (jump->addr + 2)) <= 127;
418
+
419
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
420
+ if ((sljit_sw)(label_addr - (jump->addr + 1)) > 0x7fffffffll || (sljit_sw)(label_addr - (jump->addr + 1)) < -0x80000000ll)
421
+ return generate_far_jump_code(jump, code_ptr, type);
422
+ #endif
423
+
424
+ if (type == SLJIT_JUMP) {
425
+ if (short_jump)
426
+ *code_ptr++ = JMP_i8;
427
+ else
428
+ *code_ptr++ = JMP_i32;
429
+ jump->addr++;
430
+ }
431
+ else if (type >= SLJIT_FAST_CALL) {
432
+ short_jump = 0;
433
+ *code_ptr++ = CALL_i32;
434
+ jump->addr++;
435
+ }
436
+ else if (short_jump) {
437
+ *code_ptr++ = get_jump_code(type) - 0x10;
438
+ jump->addr++;
439
+ }
440
+ else {
441
+ *code_ptr++ = GROUP_0F;
442
+ *code_ptr++ = get_jump_code(type);
443
+ jump->addr += 2;
444
+ }
445
+
446
+ if (short_jump) {
447
+ jump->flags |= PATCH_MB;
448
+ code_ptr += sizeof(sljit_sb);
449
+ } else {
450
+ jump->flags |= PATCH_MW;
451
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
452
+ code_ptr += sizeof(sljit_sw);
453
+ #else
454
+ code_ptr += sizeof(sljit_si);
455
+ #endif
456
+ }
457
+
458
+ return code_ptr;
459
+ }
460
+
461
+ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)
462
+ {
463
+ struct sljit_memory_fragment *buf;
464
+ sljit_ub *code;
465
+ sljit_ub *code_ptr;
466
+ sljit_ub *buf_ptr;
467
+ sljit_ub *buf_end;
468
+ sljit_ub len;
469
+
470
+ struct sljit_label *label;
471
+ struct sljit_jump *jump;
472
+ struct sljit_const *const_;
473
+
474
+ CHECK_ERROR_PTR();
475
+ check_sljit_generate_code(compiler);
476
+ reverse_buf(compiler);
477
+
478
+ /* Second code generation pass. */
479
+ code = (sljit_ub*)SLJIT_MALLOC_EXEC(compiler->size);
480
+ PTR_FAIL_WITH_EXEC_IF(code);
481
+ buf = compiler->buf;
482
+
483
+ code_ptr = code;
484
+ label = compiler->labels;
485
+ jump = compiler->jumps;
486
+ const_ = compiler->consts;
487
+ do {
488
+ buf_ptr = buf->memory;
489
+ buf_end = buf_ptr + buf->used_size;
490
+ do {
491
+ len = *buf_ptr++;
492
+ if (len > 0) {
493
+ /* The code is already generated. */
494
+ SLJIT_MEMMOVE(code_ptr, buf_ptr, len);
495
+ code_ptr += len;
496
+ buf_ptr += len;
497
+ }
498
+ else {
499
+ if (*buf_ptr >= 4) {
500
+ jump->addr = (sljit_uw)code_ptr;
501
+ if (!(jump->flags & SLJIT_REWRITABLE_JUMP))
502
+ code_ptr = generate_near_jump_code(jump, code_ptr, code, *buf_ptr - 4);
503
+ else
504
+ code_ptr = generate_far_jump_code(jump, code_ptr, *buf_ptr - 4);
505
+ jump = jump->next;
506
+ }
507
+ else if (*buf_ptr == 0) {
508
+ label->addr = (sljit_uw)code_ptr;
509
+ label->size = code_ptr - code;
510
+ label = label->next;
511
+ }
512
+ else if (*buf_ptr == 1) {
513
+ const_->addr = ((sljit_uw)code_ptr) - sizeof(sljit_sw);
514
+ const_ = const_->next;
515
+ }
516
+ else {
517
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
518
+ *code_ptr++ = (*buf_ptr == 2) ? CALL_i32 : JMP_i32;
519
+ buf_ptr++;
520
+ *(sljit_sw*)code_ptr = *(sljit_sw*)buf_ptr - ((sljit_sw)code_ptr + sizeof(sljit_sw));
521
+ code_ptr += sizeof(sljit_sw);
522
+ buf_ptr += sizeof(sljit_sw) - 1;
523
+ #else
524
+ code_ptr = generate_fixed_jump(code_ptr, *(sljit_sw*)(buf_ptr + 1), *buf_ptr);
525
+ buf_ptr += sizeof(sljit_sw);
526
+ #endif
527
+ }
528
+ buf_ptr++;
529
+ }
530
+ } while (buf_ptr < buf_end);
531
+ SLJIT_ASSERT(buf_ptr == buf_end);
532
+ buf = buf->next;
533
+ } while (buf);
534
+
535
+ SLJIT_ASSERT(!label);
536
+ SLJIT_ASSERT(!jump);
537
+ SLJIT_ASSERT(!const_);
538
+
539
+ jump = compiler->jumps;
540
+ while (jump) {
541
+ if (jump->flags & PATCH_MB) {
542
+ SLJIT_ASSERT((sljit_sw)(jump->u.label->addr - (jump->addr + sizeof(sljit_sb))) >= -128 && (sljit_sw)(jump->u.label->addr - (jump->addr + sizeof(sljit_sb))) <= 127);
543
+ *(sljit_ub*)jump->addr = (sljit_ub)(jump->u.label->addr - (jump->addr + sizeof(sljit_sb)));
544
+ } else if (jump->flags & PATCH_MW) {
545
+ if (jump->flags & JUMP_LABEL) {
546
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
547
+ *(sljit_sw*)jump->addr = (sljit_sw)(jump->u.label->addr - (jump->addr + sizeof(sljit_sw)));
548
+ #else
549
+ SLJIT_ASSERT((sljit_sw)(jump->u.label->addr - (jump->addr + sizeof(sljit_si))) >= -0x80000000ll && (sljit_sw)(jump->u.label->addr - (jump->addr + sizeof(sljit_si))) <= 0x7fffffffll);
550
+ *(sljit_si*)jump->addr = (sljit_si)(jump->u.label->addr - (jump->addr + sizeof(sljit_si)));
551
+ #endif
552
+ }
553
+ else {
554
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
555
+ *(sljit_sw*)jump->addr = (sljit_sw)(jump->u.target - (jump->addr + sizeof(sljit_sw)));
556
+ #else
557
+ SLJIT_ASSERT((sljit_sw)(jump->u.target - (jump->addr + sizeof(sljit_si))) >= -0x80000000ll && (sljit_sw)(jump->u.target - (jump->addr + sizeof(sljit_si))) <= 0x7fffffffll);
558
+ *(sljit_si*)jump->addr = (sljit_si)(jump->u.target - (jump->addr + sizeof(sljit_si)));
559
+ #endif
560
+ }
561
+ }
562
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
563
+ else if (jump->flags & PATCH_MD)
564
+ *(sljit_sw*)jump->addr = jump->u.label->addr;
565
+ #endif
566
+
567
+ jump = jump->next;
568
+ }
569
+
570
+ /* Maybe we waste some space because of short jumps. */
571
+ SLJIT_ASSERT(code_ptr <= code + compiler->size);
572
+ compiler->error = SLJIT_ERR_COMPILED;
573
+ compiler->executable_size = compiler->size;
574
+ return (void*)code;
575
+ }
576
+
577
+ /* --------------------------------------------------------------------- */
578
+ /* Operators */
579
+ /* --------------------------------------------------------------------- */
580
+
581
+ static sljit_si emit_cum_binary(struct sljit_compiler *compiler,
582
+ sljit_ub op_rm, sljit_ub op_mr, sljit_ub op_imm, sljit_ub op_eax_imm,
583
+ sljit_si dst, sljit_sw dstw,
584
+ sljit_si src1, sljit_sw src1w,
585
+ sljit_si src2, sljit_sw src2w);
586
+
587
+ static sljit_si emit_non_cum_binary(struct sljit_compiler *compiler,
588
+ sljit_ub op_rm, sljit_ub op_mr, sljit_ub op_imm, sljit_ub op_eax_imm,
589
+ sljit_si dst, sljit_sw dstw,
590
+ sljit_si src1, sljit_sw src1w,
591
+ sljit_si src2, sljit_sw src2w);
592
+
593
+ static sljit_si emit_mov(struct sljit_compiler *compiler,
594
+ sljit_si dst, sljit_sw dstw,
595
+ sljit_si src, sljit_sw srcw);
596
+
597
+ static SLJIT_INLINE sljit_si emit_save_flags(struct sljit_compiler *compiler)
598
+ {
599
+ sljit_ub *inst;
600
+
601
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
602
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 5);
603
+ FAIL_IF(!inst);
604
+ INC_SIZE(5);
605
+ #else
606
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 6);
607
+ FAIL_IF(!inst);
608
+ INC_SIZE(6);
609
+ *inst++ = REX_W;
610
+ #endif
611
+ *inst++ = LEA_r_m; /* lea esp/rsp, [esp/rsp + sizeof(sljit_sw)] */
612
+ *inst++ = 0x64;
613
+ *inst++ = 0x24;
614
+ *inst++ = (sljit_ub)sizeof(sljit_sw);
615
+ *inst++ = PUSHF;
616
+ compiler->flags_saved = 1;
617
+ return SLJIT_SUCCESS;
618
+ }
619
+
620
+ static SLJIT_INLINE sljit_si emit_restore_flags(struct sljit_compiler *compiler, sljit_si keep_flags)
621
+ {
622
+ sljit_ub *inst;
623
+
624
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
625
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 5);
626
+ FAIL_IF(!inst);
627
+ INC_SIZE(5);
628
+ *inst++ = POPF;
629
+ #else
630
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 6);
631
+ FAIL_IF(!inst);
632
+ INC_SIZE(6);
633
+ *inst++ = POPF;
634
+ *inst++ = REX_W;
635
+ #endif
636
+ *inst++ = LEA_r_m; /* lea esp/rsp, [esp/rsp - sizeof(sljit_sw)] */
637
+ *inst++ = 0x64;
638
+ *inst++ = 0x24;
639
+ *inst++ = (sljit_ub)-(sljit_sb)sizeof(sljit_sw);
640
+ compiler->flags_saved = keep_flags;
641
+ return SLJIT_SUCCESS;
642
+ }
643
+
644
+ #ifdef _WIN32
645
+ #include <malloc.h>
646
+
647
+ static void SLJIT_CALL sljit_grow_stack(sljit_sw local_size)
648
+ {
649
+ /* Workaround for calling the internal _chkstk() function on Windows.
650
+ This function touches all 4k pages belongs to the requested stack space,
651
+ which size is passed in local_size. This is necessary on Windows where
652
+ the stack can only grow in 4k steps. However, this function just burn
653
+ CPU cycles if the stack is large enough, but you don't know it in advance.
654
+ I think this is a bad design even if it has some reasons. */
655
+ alloca(local_size);
656
+ }
657
+
658
+ #endif
659
+
660
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
661
+ #include "sljitNativeX86_32.c"
662
+ #else
663
+ #include "sljitNativeX86_64.c"
664
+ #endif
665
+
666
+ static sljit_si emit_mov(struct sljit_compiler *compiler,
667
+ sljit_si dst, sljit_sw dstw,
668
+ sljit_si src, sljit_sw srcw)
669
+ {
670
+ sljit_ub* inst;
671
+
672
+ if (dst == SLJIT_UNUSED) {
673
+ /* No destination, doesn't need to setup flags. */
674
+ if (src & SLJIT_MEM) {
675
+ inst = emit_x86_instruction(compiler, 1, TMP_REGISTER, 0, src, srcw);
676
+ FAIL_IF(!inst);
677
+ *inst = MOV_r_rm;
678
+ }
679
+ return SLJIT_SUCCESS;
680
+ }
681
+ if (src <= TMP_REGISTER) {
682
+ inst = emit_x86_instruction(compiler, 1, src, 0, dst, dstw);
683
+ FAIL_IF(!inst);
684
+ *inst = MOV_rm_r;
685
+ return SLJIT_SUCCESS;
686
+ }
687
+ if (src & SLJIT_IMM) {
688
+ if (dst <= TMP_REGISTER) {
689
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
690
+ return emit_do_imm(compiler, MOV_r_i32 + reg_map[dst], srcw);
691
+ #else
692
+ if (!compiler->mode32) {
693
+ if (NOT_HALFWORD(srcw))
694
+ return emit_load_imm64(compiler, dst, srcw);
695
+ }
696
+ else
697
+ return emit_do_imm32(compiler, (reg_map[dst] >= 8) ? REX_B : 0, MOV_r_i32 + reg_lmap[dst], srcw);
698
+ #endif
699
+ }
700
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
701
+ if (!compiler->mode32 && NOT_HALFWORD(srcw)) {
702
+ FAIL_IF(emit_load_imm64(compiler, TMP_REG2, srcw));
703
+ inst = emit_x86_instruction(compiler, 1, TMP_REG2, 0, dst, dstw);
704
+ FAIL_IF(!inst);
705
+ *inst = MOV_rm_r;
706
+ return SLJIT_SUCCESS;
707
+ }
708
+ #endif
709
+ inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, srcw, dst, dstw);
710
+ FAIL_IF(!inst);
711
+ *inst = MOV_rm_i32;
712
+ return SLJIT_SUCCESS;
713
+ }
714
+ if (dst <= TMP_REGISTER) {
715
+ inst = emit_x86_instruction(compiler, 1, dst, 0, src, srcw);
716
+ FAIL_IF(!inst);
717
+ *inst = MOV_r_rm;
718
+ return SLJIT_SUCCESS;
719
+ }
720
+
721
+ /* Memory to memory move. Requires two instruction. */
722
+ inst = emit_x86_instruction(compiler, 1, TMP_REGISTER, 0, src, srcw);
723
+ FAIL_IF(!inst);
724
+ *inst = MOV_r_rm;
725
+ inst = emit_x86_instruction(compiler, 1, TMP_REGISTER, 0, dst, dstw);
726
+ FAIL_IF(!inst);
727
+ *inst = MOV_rm_r;
728
+ return SLJIT_SUCCESS;
729
+ }
730
+
731
+ #define EMIT_MOV(compiler, dst, dstw, src, srcw) \
732
+ FAIL_IF(emit_mov(compiler, dst, dstw, src, srcw));
733
+
734
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler, sljit_si op)
735
+ {
736
+ sljit_ub *inst;
737
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
738
+ sljit_si size;
739
+ #endif
740
+
741
+ CHECK_ERROR();
742
+ check_sljit_emit_op0(compiler, op);
743
+
744
+ switch (GET_OPCODE(op)) {
745
+ case SLJIT_BREAKPOINT:
746
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 1);
747
+ FAIL_IF(!inst);
748
+ INC_SIZE(1);
749
+ *inst = INT3;
750
+ break;
751
+ case SLJIT_NOP:
752
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 1);
753
+ FAIL_IF(!inst);
754
+ INC_SIZE(1);
755
+ *inst = NOP;
756
+ break;
757
+ case SLJIT_UMUL:
758
+ case SLJIT_SMUL:
759
+ case SLJIT_UDIV:
760
+ case SLJIT_SDIV:
761
+ compiler->flags_saved = 0;
762
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
763
+ #ifdef _WIN64
764
+ SLJIT_COMPILE_ASSERT(
765
+ reg_map[SLJIT_SCRATCH_REG1] == 0
766
+ && reg_map[SLJIT_SCRATCH_REG2] == 2
767
+ && reg_map[TMP_REGISTER] > 7,
768
+ invalid_register_assignment_for_div_mul);
769
+ #else
770
+ SLJIT_COMPILE_ASSERT(
771
+ reg_map[SLJIT_SCRATCH_REG1] == 0
772
+ && reg_map[SLJIT_SCRATCH_REG2] < 7
773
+ && reg_map[TMP_REGISTER] == 2,
774
+ invalid_register_assignment_for_div_mul);
775
+ #endif
776
+ compiler->mode32 = op & SLJIT_INT_OP;
777
+ #endif
778
+
779
+ op = GET_OPCODE(op);
780
+ if (op == SLJIT_UDIV) {
781
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || defined(_WIN64)
782
+ EMIT_MOV(compiler, TMP_REGISTER, 0, SLJIT_SCRATCH_REG2, 0);
783
+ inst = emit_x86_instruction(compiler, 1, SLJIT_SCRATCH_REG2, 0, SLJIT_SCRATCH_REG2, 0);
784
+ #else
785
+ inst = emit_x86_instruction(compiler, 1, TMP_REGISTER, 0, TMP_REGISTER, 0);
786
+ #endif
787
+ FAIL_IF(!inst);
788
+ *inst = XOR_r_rm;
789
+ }
790
+
791
+ if (op == SLJIT_SDIV) {
792
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || defined(_WIN64)
793
+ EMIT_MOV(compiler, TMP_REGISTER, 0, SLJIT_SCRATCH_REG2, 0);
794
+ #endif
795
+
796
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
797
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 1);
798
+ FAIL_IF(!inst);
799
+ INC_SIZE(1);
800
+ *inst = CDQ;
801
+ #else
802
+ if (compiler->mode32) {
803
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 1);
804
+ FAIL_IF(!inst);
805
+ INC_SIZE(1);
806
+ *inst = CDQ;
807
+ } else {
808
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 2);
809
+ FAIL_IF(!inst);
810
+ INC_SIZE(2);
811
+ *inst++ = REX_W;
812
+ *inst = CDQ;
813
+ }
814
+ #endif
815
+ }
816
+
817
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
818
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 2);
819
+ FAIL_IF(!inst);
820
+ INC_SIZE(2);
821
+ *inst++ = GROUP_F7;
822
+ *inst = MOD_REG | ((op >= SLJIT_UDIV) ? reg_map[TMP_REGISTER] : reg_map[SLJIT_SCRATCH_REG2]);
823
+ #else
824
+ #ifdef _WIN64
825
+ size = (!compiler->mode32 || op >= SLJIT_UDIV) ? 3 : 2;
826
+ #else
827
+ size = (!compiler->mode32) ? 3 : 2;
828
+ #endif
829
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + size);
830
+ FAIL_IF(!inst);
831
+ INC_SIZE(size);
832
+ #ifdef _WIN64
833
+ if (!compiler->mode32)
834
+ *inst++ = REX_W | ((op >= SLJIT_UDIV) ? REX_B : 0);
835
+ else if (op >= SLJIT_UDIV)
836
+ *inst++ = REX_B;
837
+ *inst++ = GROUP_F7;
838
+ *inst = MOD_REG | ((op >= SLJIT_UDIV) ? reg_lmap[TMP_REGISTER] : reg_lmap[SLJIT_SCRATCH_REG2]);
839
+ #else
840
+ if (!compiler->mode32)
841
+ *inst++ = REX_W;
842
+ *inst++ = GROUP_F7;
843
+ *inst = MOD_REG | reg_map[SLJIT_SCRATCH_REG2];
844
+ #endif
845
+ #endif
846
+ switch (op) {
847
+ case SLJIT_UMUL:
848
+ *inst |= MUL;
849
+ break;
850
+ case SLJIT_SMUL:
851
+ *inst |= IMUL;
852
+ break;
853
+ case SLJIT_UDIV:
854
+ *inst |= DIV;
855
+ break;
856
+ case SLJIT_SDIV:
857
+ *inst |= IDIV;
858
+ break;
859
+ }
860
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) && !defined(_WIN64)
861
+ EMIT_MOV(compiler, SLJIT_SCRATCH_REG2, 0, TMP_REGISTER, 0);
862
+ #endif
863
+ break;
864
+ }
865
+
866
+ return SLJIT_SUCCESS;
867
+ }
868
+
869
+ #define ENCODE_PREFIX(prefix) \
870
+ do { \
871
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 1); \
872
+ FAIL_IF(!inst); \
873
+ INC_SIZE(1); \
874
+ *inst = (prefix); \
875
+ } while (0)
876
+
877
+ static sljit_si emit_mov_byte(struct sljit_compiler *compiler, sljit_si sign,
878
+ sljit_si dst, sljit_sw dstw,
879
+ sljit_si src, sljit_sw srcw)
880
+ {
881
+ sljit_ub* inst;
882
+ sljit_si dst_r;
883
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
884
+ sljit_si work_r;
885
+ #endif
886
+
887
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
888
+ compiler->mode32 = 0;
889
+ #endif
890
+
891
+ if (dst == SLJIT_UNUSED && !(src & SLJIT_MEM))
892
+ return SLJIT_SUCCESS; /* Empty instruction. */
893
+
894
+ if (src & SLJIT_IMM) {
895
+ if (dst <= TMP_REGISTER) {
896
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
897
+ return emit_do_imm(compiler, MOV_r_i32 + reg_map[dst], srcw);
898
+ #else
899
+ inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, srcw, dst, 0);
900
+ FAIL_IF(!inst);
901
+ *inst = MOV_rm_i32;
902
+ return SLJIT_SUCCESS;
903
+ #endif
904
+ }
905
+ inst = emit_x86_instruction(compiler, 1 | EX86_BYTE_ARG | EX86_NO_REXW, SLJIT_IMM, srcw, dst, dstw);
906
+ FAIL_IF(!inst);
907
+ *inst = MOV_rm8_i8;
908
+ return SLJIT_SUCCESS;
909
+ }
910
+
911
+ dst_r = (dst <= TMP_REGISTER) ? dst : TMP_REGISTER;
912
+
913
+ if ((dst & SLJIT_MEM) && src <= TMP_REGISTER) {
914
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
915
+ if (reg_map[src] >= 4) {
916
+ SLJIT_ASSERT(dst_r == TMP_REGISTER);
917
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src, 0);
918
+ } else
919
+ dst_r = src;
920
+ #else
921
+ dst_r = src;
922
+ #endif
923
+ }
924
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
925
+ else if (src <= TMP_REGISTER && reg_map[src] >= 4) {
926
+ /* src, dst are registers. */
927
+ SLJIT_ASSERT(dst >= SLJIT_SCRATCH_REG1 && dst <= TMP_REGISTER);
928
+ if (reg_map[dst] < 4) {
929
+ if (dst != src)
930
+ EMIT_MOV(compiler, dst, 0, src, 0);
931
+ inst = emit_x86_instruction(compiler, 2, dst, 0, dst, 0);
932
+ FAIL_IF(!inst);
933
+ *inst++ = GROUP_0F;
934
+ *inst = sign ? MOVSX_r_rm8 : MOVZX_r_rm8;
935
+ }
936
+ else {
937
+ if (dst != src)
938
+ EMIT_MOV(compiler, dst, 0, src, 0);
939
+ if (sign) {
940
+ /* shl reg, 24 */
941
+ inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, 24, dst, 0);
942
+ FAIL_IF(!inst);
943
+ *inst |= SHL;
944
+ /* sar reg, 24 */
945
+ inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, 24, dst, 0);
946
+ FAIL_IF(!inst);
947
+ *inst |= SAR;
948
+ }
949
+ else {
950
+ inst = emit_x86_instruction(compiler, 1 | EX86_BIN_INS, SLJIT_IMM, 0xff, dst, 0);
951
+ FAIL_IF(!inst);
952
+ *(inst + 1) |= AND;
953
+ }
954
+ }
955
+ return SLJIT_SUCCESS;
956
+ }
957
+ #endif
958
+ else {
959
+ /* src can be memory addr or reg_map[src] < 4 on x86_32 architectures. */
960
+ inst = emit_x86_instruction(compiler, 2, dst_r, 0, src, srcw);
961
+ FAIL_IF(!inst);
962
+ *inst++ = GROUP_0F;
963
+ *inst = sign ? MOVSX_r_rm8 : MOVZX_r_rm8;
964
+ }
965
+
966
+ if (dst & SLJIT_MEM) {
967
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
968
+ if (dst_r == TMP_REGISTER) {
969
+ /* Find a non-used register, whose reg_map[src] < 4. */
970
+ if ((dst & 0xf) == SLJIT_SCRATCH_REG1) {
971
+ if ((dst & 0xf0) == (SLJIT_SCRATCH_REG2 << 4))
972
+ work_r = SLJIT_SCRATCH_REG3;
973
+ else
974
+ work_r = SLJIT_SCRATCH_REG2;
975
+ }
976
+ else {
977
+ if ((dst & 0xf0) != (SLJIT_SCRATCH_REG1 << 4))
978
+ work_r = SLJIT_SCRATCH_REG1;
979
+ else if ((dst & 0xf) == SLJIT_SCRATCH_REG2)
980
+ work_r = SLJIT_SCRATCH_REG3;
981
+ else
982
+ work_r = SLJIT_SCRATCH_REG2;
983
+ }
984
+
985
+ if (work_r == SLJIT_SCRATCH_REG1) {
986
+ ENCODE_PREFIX(XCHG_EAX_r + reg_map[TMP_REGISTER]);
987
+ }
988
+ else {
989
+ inst = emit_x86_instruction(compiler, 1, work_r, 0, dst_r, 0);
990
+ FAIL_IF(!inst);
991
+ *inst = XCHG_r_rm;
992
+ }
993
+
994
+ inst = emit_x86_instruction(compiler, 1, work_r, 0, dst, dstw);
995
+ FAIL_IF(!inst);
996
+ *inst = MOV_rm8_r8;
997
+
998
+ if (work_r == SLJIT_SCRATCH_REG1) {
999
+ ENCODE_PREFIX(XCHG_EAX_r + reg_map[TMP_REGISTER]);
1000
+ }
1001
+ else {
1002
+ inst = emit_x86_instruction(compiler, 1, work_r, 0, dst_r, 0);
1003
+ FAIL_IF(!inst);
1004
+ *inst = XCHG_r_rm;
1005
+ }
1006
+ }
1007
+ else {
1008
+ inst = emit_x86_instruction(compiler, 1, dst_r, 0, dst, dstw);
1009
+ FAIL_IF(!inst);
1010
+ *inst = MOV_rm8_r8;
1011
+ }
1012
+ #else
1013
+ inst = emit_x86_instruction(compiler, 1 | EX86_REX | EX86_NO_REXW, dst_r, 0, dst, dstw);
1014
+ FAIL_IF(!inst);
1015
+ *inst = MOV_rm8_r8;
1016
+ #endif
1017
+ }
1018
+
1019
+ return SLJIT_SUCCESS;
1020
+ }
1021
+
1022
+ static sljit_si emit_mov_half(struct sljit_compiler *compiler, sljit_si sign,
1023
+ sljit_si dst, sljit_sw dstw,
1024
+ sljit_si src, sljit_sw srcw)
1025
+ {
1026
+ sljit_ub* inst;
1027
+ sljit_si dst_r;
1028
+
1029
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
1030
+ compiler->mode32 = 0;
1031
+ #endif
1032
+
1033
+ if (dst == SLJIT_UNUSED && !(src & SLJIT_MEM))
1034
+ return SLJIT_SUCCESS; /* Empty instruction. */
1035
+
1036
+ if (src & SLJIT_IMM) {
1037
+ if (dst <= TMP_REGISTER) {
1038
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
1039
+ return emit_do_imm(compiler, MOV_r_i32 + reg_map[dst], srcw);
1040
+ #else
1041
+ inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, srcw, dst, 0);
1042
+ FAIL_IF(!inst);
1043
+ *inst = MOV_rm_i32;
1044
+ return SLJIT_SUCCESS;
1045
+ #endif
1046
+ }
1047
+ inst = emit_x86_instruction(compiler, 1 | EX86_HALF_ARG | EX86_NO_REXW | EX86_PREF_66, SLJIT_IMM, srcw, dst, dstw);
1048
+ FAIL_IF(!inst);
1049
+ *inst = MOV_rm_i32;
1050
+ return SLJIT_SUCCESS;
1051
+ }
1052
+
1053
+ dst_r = (dst <= TMP_REGISTER) ? dst : TMP_REGISTER;
1054
+
1055
+ if ((dst & SLJIT_MEM) && src <= TMP_REGISTER)
1056
+ dst_r = src;
1057
+ else {
1058
+ inst = emit_x86_instruction(compiler, 2, dst_r, 0, src, srcw);
1059
+ FAIL_IF(!inst);
1060
+ *inst++ = GROUP_0F;
1061
+ *inst = sign ? MOVSX_r_rm16 : MOVZX_r_rm16;
1062
+ }
1063
+
1064
+ if (dst & SLJIT_MEM) {
1065
+ inst = emit_x86_instruction(compiler, 1 | EX86_NO_REXW | EX86_PREF_66, dst_r, 0, dst, dstw);
1066
+ FAIL_IF(!inst);
1067
+ *inst = MOV_rm_r;
1068
+ }
1069
+
1070
+ return SLJIT_SUCCESS;
1071
+ }
1072
+
1073
+ static sljit_si emit_unary(struct sljit_compiler *compiler, sljit_ub opcode,
1074
+ sljit_si dst, sljit_sw dstw,
1075
+ sljit_si src, sljit_sw srcw)
1076
+ {
1077
+ sljit_ub* inst;
1078
+
1079
+ if (dst == SLJIT_UNUSED) {
1080
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src, srcw);
1081
+ inst = emit_x86_instruction(compiler, 1, 0, 0, TMP_REGISTER, 0);
1082
+ FAIL_IF(!inst);
1083
+ *inst++ = GROUP_F7;
1084
+ *inst |= opcode;
1085
+ return SLJIT_SUCCESS;
1086
+ }
1087
+ if (dst == src && dstw == srcw) {
1088
+ /* Same input and output */
1089
+ inst = emit_x86_instruction(compiler, 1, 0, 0, dst, dstw);
1090
+ FAIL_IF(!inst);
1091
+ *inst++ = GROUP_F7;
1092
+ *inst |= opcode;
1093
+ return SLJIT_SUCCESS;
1094
+ }
1095
+ if (dst <= TMP_REGISTER) {
1096
+ EMIT_MOV(compiler, dst, 0, src, srcw);
1097
+ inst = emit_x86_instruction(compiler, 1, 0, 0, dst, dstw);
1098
+ FAIL_IF(!inst);
1099
+ *inst++ = GROUP_F7;
1100
+ *inst |= opcode;
1101
+ return SLJIT_SUCCESS;
1102
+ }
1103
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src, srcw);
1104
+ inst = emit_x86_instruction(compiler, 1, 0, 0, TMP_REGISTER, 0);
1105
+ FAIL_IF(!inst);
1106
+ *inst++ = GROUP_F7;
1107
+ *inst |= opcode;
1108
+ EMIT_MOV(compiler, dst, dstw, TMP_REGISTER, 0);
1109
+ return SLJIT_SUCCESS;
1110
+ }
1111
+
1112
+ static sljit_si emit_not_with_flags(struct sljit_compiler *compiler,
1113
+ sljit_si dst, sljit_sw dstw,
1114
+ sljit_si src, sljit_sw srcw)
1115
+ {
1116
+ sljit_ub* inst;
1117
+
1118
+ if (dst == SLJIT_UNUSED) {
1119
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src, srcw);
1120
+ inst = emit_x86_instruction(compiler, 1, 0, 0, TMP_REGISTER, 0);
1121
+ FAIL_IF(!inst);
1122
+ *inst++ = GROUP_F7;
1123
+ *inst |= NOT_rm;
1124
+ inst = emit_x86_instruction(compiler, 1, TMP_REGISTER, 0, TMP_REGISTER, 0);
1125
+ FAIL_IF(!inst);
1126
+ *inst = OR_r_rm;
1127
+ return SLJIT_SUCCESS;
1128
+ }
1129
+ if (dst <= TMP_REGISTER) {
1130
+ EMIT_MOV(compiler, dst, 0, src, srcw);
1131
+ inst = emit_x86_instruction(compiler, 1, 0, 0, dst, dstw);
1132
+ FAIL_IF(!inst);
1133
+ *inst++ = GROUP_F7;
1134
+ *inst |= NOT_rm;
1135
+ inst = emit_x86_instruction(compiler, 1, dst, 0, dst, 0);
1136
+ FAIL_IF(!inst);
1137
+ *inst = OR_r_rm;
1138
+ return SLJIT_SUCCESS;
1139
+ }
1140
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src, srcw);
1141
+ inst = emit_x86_instruction(compiler, 1, 0, 0, TMP_REGISTER, 0);
1142
+ FAIL_IF(!inst);
1143
+ *inst++ = GROUP_F7;
1144
+ *inst |= NOT_rm;
1145
+ inst = emit_x86_instruction(compiler, 1, TMP_REGISTER, 0, TMP_REGISTER, 0);
1146
+ FAIL_IF(!inst);
1147
+ *inst = OR_r_rm;
1148
+ EMIT_MOV(compiler, dst, dstw, TMP_REGISTER, 0);
1149
+ return SLJIT_SUCCESS;
1150
+ }
1151
+
1152
+ static sljit_si emit_clz(struct sljit_compiler *compiler, sljit_si op_flags,
1153
+ sljit_si dst, sljit_sw dstw,
1154
+ sljit_si src, sljit_sw srcw)
1155
+ {
1156
+ sljit_ub* inst;
1157
+ sljit_si dst_r;
1158
+
1159
+ SLJIT_UNUSED_ARG(op_flags);
1160
+ if (SLJIT_UNLIKELY(dst == SLJIT_UNUSED)) {
1161
+ /* Just set the zero flag. */
1162
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src, srcw);
1163
+ inst = emit_x86_instruction(compiler, 1, 0, 0, TMP_REGISTER, 0);
1164
+ FAIL_IF(!inst);
1165
+ *inst++ = GROUP_F7;
1166
+ *inst |= NOT_rm;
1167
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
1168
+ inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, 31, TMP_REGISTER, 0);
1169
+ #else
1170
+ inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_IMM, !(op_flags & SLJIT_INT_OP) ? 63 : 31, TMP_REGISTER, 0);
1171
+ #endif
1172
+ FAIL_IF(!inst);
1173
+ *inst |= SHR;
1174
+ return SLJIT_SUCCESS;
1175
+ }
1176
+
1177
+ if (SLJIT_UNLIKELY(src & SLJIT_IMM)) {
1178
+ EMIT_MOV(compiler, TMP_REGISTER, 0, SLJIT_IMM, srcw);
1179
+ src = TMP_REGISTER;
1180
+ srcw = 0;
1181
+ }
1182
+
1183
+ inst = emit_x86_instruction(compiler, 2, TMP_REGISTER, 0, src, srcw);
1184
+ FAIL_IF(!inst);
1185
+ *inst++ = GROUP_0F;
1186
+ *inst = BSR_r_rm;
1187
+
1188
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
1189
+ if (dst <= TMP_REGISTER)
1190
+ dst_r = dst;
1191
+ else {
1192
+ /* Find an unused temporary register. */
1193
+ if ((dst & 0xf) != SLJIT_SCRATCH_REG1 && (dst & 0xf0) != (SLJIT_SCRATCH_REG1 << 4))
1194
+ dst_r = SLJIT_SCRATCH_REG1;
1195
+ else if ((dst & 0xf) != SLJIT_SCRATCH_REG2 && (dst & 0xf0) != (SLJIT_SCRATCH_REG2 << 4))
1196
+ dst_r = SLJIT_SCRATCH_REG2;
1197
+ else
1198
+ dst_r = SLJIT_SCRATCH_REG3;
1199
+ EMIT_MOV(compiler, dst, dstw, dst_r, 0);
1200
+ }
1201
+ EMIT_MOV(compiler, dst_r, 0, SLJIT_IMM, 32 + 31);
1202
+ #else
1203
+ dst_r = (dst <= TMP_REGISTER) ? dst : TMP_REG2;
1204
+ compiler->mode32 = 0;
1205
+ EMIT_MOV(compiler, dst_r, 0, SLJIT_IMM, !(op_flags & SLJIT_INT_OP) ? 64 + 63 : 32 + 31);
1206
+ compiler->mode32 = op_flags & SLJIT_INT_OP;
1207
+ #endif
1208
+
1209
+ if (cpu_has_cmov == -1)
1210
+ get_cpu_features();
1211
+
1212
+ if (cpu_has_cmov) {
1213
+ inst = emit_x86_instruction(compiler, 2, dst_r, 0, TMP_REGISTER, 0);
1214
+ FAIL_IF(!inst);
1215
+ *inst++ = GROUP_0F;
1216
+ *inst = CMOVNE_r_rm;
1217
+ } else {
1218
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
1219
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 4);
1220
+ FAIL_IF(!inst);
1221
+ INC_SIZE(4);
1222
+
1223
+ *inst++ = JE_i8;
1224
+ *inst++ = 2;
1225
+ *inst++ = MOV_r_rm;
1226
+ *inst++ = MOD_REG | (reg_map[dst_r] << 3) | reg_map[TMP_REGISTER];
1227
+ #else
1228
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 5);
1229
+ FAIL_IF(!inst);
1230
+ INC_SIZE(5);
1231
+
1232
+ *inst++ = JE_i8;
1233
+ *inst++ = 3;
1234
+ *inst++ = REX_W | (reg_map[dst_r] >= 8 ? REX_R : 0) | (reg_map[TMP_REGISTER] >= 8 ? REX_B : 0);
1235
+ *inst++ = MOV_r_rm;
1236
+ *inst++ = MOD_REG | (reg_lmap[dst_r] << 3) | reg_lmap[TMP_REGISTER];
1237
+ #endif
1238
+ }
1239
+
1240
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
1241
+ inst = emit_x86_instruction(compiler, 1 | EX86_BIN_INS, SLJIT_IMM, 31, dst_r, 0);
1242
+ #else
1243
+ inst = emit_x86_instruction(compiler, 1 | EX86_BIN_INS, SLJIT_IMM, !(op_flags & SLJIT_INT_OP) ? 63 : 31, dst_r, 0);
1244
+ #endif
1245
+ FAIL_IF(!inst);
1246
+ *(inst + 1) |= XOR;
1247
+
1248
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
1249
+ if (dst & SLJIT_MEM) {
1250
+ inst = emit_x86_instruction(compiler, 1, dst_r, 0, dst, dstw);
1251
+ FAIL_IF(!inst);
1252
+ *inst = XCHG_r_rm;
1253
+ }
1254
+ #else
1255
+ if (dst & SLJIT_MEM)
1256
+ EMIT_MOV(compiler, dst, dstw, TMP_REG2, 0);
1257
+ #endif
1258
+ return SLJIT_SUCCESS;
1259
+ }
1260
+
1261
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler, sljit_si op,
1262
+ sljit_si dst, sljit_sw dstw,
1263
+ sljit_si src, sljit_sw srcw)
1264
+ {
1265
+ sljit_ub* inst;
1266
+ sljit_si update = 0;
1267
+ sljit_si op_flags = GET_ALL_FLAGS(op);
1268
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
1269
+ sljit_si dst_is_ereg = 0;
1270
+ sljit_si src_is_ereg = 0;
1271
+ #else
1272
+ # define src_is_ereg 0
1273
+ #endif
1274
+
1275
+ CHECK_ERROR();
1276
+ check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw);
1277
+ ADJUST_LOCAL_OFFSET(dst, dstw);
1278
+ ADJUST_LOCAL_OFFSET(src, srcw);
1279
+
1280
+ CHECK_EXTRA_REGS(dst, dstw, dst_is_ereg = 1);
1281
+ CHECK_EXTRA_REGS(src, srcw, src_is_ereg = 1);
1282
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
1283
+ compiler->mode32 = op_flags & SLJIT_INT_OP;
1284
+ #endif
1285
+
1286
+ op = GET_OPCODE(op);
1287
+ if (op >= SLJIT_MOV && op <= SLJIT_MOVU_P) {
1288
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
1289
+ compiler->mode32 = 0;
1290
+ #endif
1291
+
1292
+ if (op_flags & SLJIT_INT_OP) {
1293
+ if (src <= TMP_REGISTER && src == dst) {
1294
+ if (!TYPE_CAST_NEEDED(op))
1295
+ return SLJIT_SUCCESS;
1296
+ }
1297
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
1298
+ if (op == SLJIT_MOV_SI && (src & SLJIT_MEM))
1299
+ op = SLJIT_MOV_UI;
1300
+ if (op == SLJIT_MOVU_SI && (src & SLJIT_MEM))
1301
+ op = SLJIT_MOVU_UI;
1302
+ if (op == SLJIT_MOV_UI && (src & SLJIT_IMM))
1303
+ op = SLJIT_MOV_SI;
1304
+ if (op == SLJIT_MOVU_UI && (src & SLJIT_IMM))
1305
+ op = SLJIT_MOVU_SI;
1306
+ #endif
1307
+ }
1308
+
1309
+ SLJIT_COMPILE_ASSERT(SLJIT_MOV + 8 == SLJIT_MOVU, movu_offset);
1310
+ if (op >= SLJIT_MOVU) {
1311
+ update = 1;
1312
+ op -= 8;
1313
+ }
1314
+
1315
+ if (src & SLJIT_IMM) {
1316
+ switch (op) {
1317
+ case SLJIT_MOV_UB:
1318
+ srcw = (sljit_ub)srcw;
1319
+ break;
1320
+ case SLJIT_MOV_SB:
1321
+ srcw = (sljit_sb)srcw;
1322
+ break;
1323
+ case SLJIT_MOV_UH:
1324
+ srcw = (sljit_uh)srcw;
1325
+ break;
1326
+ case SLJIT_MOV_SH:
1327
+ srcw = (sljit_sh)srcw;
1328
+ break;
1329
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
1330
+ case SLJIT_MOV_UI:
1331
+ srcw = (sljit_ui)srcw;
1332
+ break;
1333
+ case SLJIT_MOV_SI:
1334
+ srcw = (sljit_si)srcw;
1335
+ break;
1336
+ #endif
1337
+ }
1338
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
1339
+ if (SLJIT_UNLIKELY(dst_is_ereg))
1340
+ return emit_mov(compiler, dst, dstw, src, srcw);
1341
+ #endif
1342
+ }
1343
+
1344
+ if (SLJIT_UNLIKELY(update) && (src & SLJIT_MEM) && !src_is_ereg && (src & 0xf) && (srcw != 0 || (src & 0xf0) != 0)) {
1345
+ inst = emit_x86_instruction(compiler, 1, src & 0xf, 0, src, srcw);
1346
+ FAIL_IF(!inst);
1347
+ *inst = LEA_r_m;
1348
+ src &= SLJIT_MEM | 0xf;
1349
+ srcw = 0;
1350
+ }
1351
+
1352
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
1353
+ if (SLJIT_UNLIKELY(dst_is_ereg) && (!(op == SLJIT_MOV || op == SLJIT_MOV_UI || op == SLJIT_MOV_SI || op == SLJIT_MOV_P) || (src & SLJIT_MEM))) {
1354
+ SLJIT_ASSERT(dst == SLJIT_MEM1(SLJIT_LOCALS_REG));
1355
+ dst = TMP_REGISTER;
1356
+ }
1357
+ #endif
1358
+
1359
+ switch (op) {
1360
+ case SLJIT_MOV:
1361
+ case SLJIT_MOV_P:
1362
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
1363
+ case SLJIT_MOV_UI:
1364
+ case SLJIT_MOV_SI:
1365
+ #endif
1366
+ FAIL_IF(emit_mov(compiler, dst, dstw, src, srcw));
1367
+ break;
1368
+ case SLJIT_MOV_UB:
1369
+ FAIL_IF(emit_mov_byte(compiler, 0, dst, dstw, src, srcw));
1370
+ break;
1371
+ case SLJIT_MOV_SB:
1372
+ FAIL_IF(emit_mov_byte(compiler, 1, dst, dstw, src, srcw));
1373
+ break;
1374
+ case SLJIT_MOV_UH:
1375
+ FAIL_IF(emit_mov_half(compiler, 0, dst, dstw, src, srcw));
1376
+ break;
1377
+ case SLJIT_MOV_SH:
1378
+ FAIL_IF(emit_mov_half(compiler, 1, dst, dstw, src, srcw));
1379
+ break;
1380
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
1381
+ case SLJIT_MOV_UI:
1382
+ FAIL_IF(emit_mov_int(compiler, 0, dst, dstw, src, srcw));
1383
+ break;
1384
+ case SLJIT_MOV_SI:
1385
+ FAIL_IF(emit_mov_int(compiler, 1, dst, dstw, src, srcw));
1386
+ break;
1387
+ #endif
1388
+ }
1389
+
1390
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
1391
+ if (SLJIT_UNLIKELY(dst_is_ereg) && dst == TMP_REGISTER)
1392
+ return emit_mov(compiler, SLJIT_MEM1(SLJIT_LOCALS_REG), dstw, TMP_REGISTER, 0);
1393
+ #endif
1394
+
1395
+ if (SLJIT_UNLIKELY(update) && (dst & SLJIT_MEM) && (dst & 0xf) && (dstw != 0 || (dst & 0xf0) != 0)) {
1396
+ inst = emit_x86_instruction(compiler, 1, dst & 0xf, 0, dst, dstw);
1397
+ FAIL_IF(!inst);
1398
+ *inst = LEA_r_m;
1399
+ }
1400
+ return SLJIT_SUCCESS;
1401
+ }
1402
+
1403
+ if (SLJIT_UNLIKELY(GET_FLAGS(op_flags)))
1404
+ compiler->flags_saved = 0;
1405
+
1406
+ switch (op) {
1407
+ case SLJIT_NOT:
1408
+ if (SLJIT_UNLIKELY(op_flags & SLJIT_SET_E))
1409
+ return emit_not_with_flags(compiler, dst, dstw, src, srcw);
1410
+ return emit_unary(compiler, NOT_rm, dst, dstw, src, srcw);
1411
+
1412
+ case SLJIT_NEG:
1413
+ if (SLJIT_UNLIKELY(op_flags & SLJIT_KEEP_FLAGS) && !compiler->flags_saved)
1414
+ FAIL_IF(emit_save_flags(compiler));
1415
+ return emit_unary(compiler, NEG_rm, dst, dstw, src, srcw);
1416
+
1417
+ case SLJIT_CLZ:
1418
+ if (SLJIT_UNLIKELY(op_flags & SLJIT_KEEP_FLAGS) && !compiler->flags_saved)
1419
+ FAIL_IF(emit_save_flags(compiler));
1420
+ return emit_clz(compiler, op_flags, dst, dstw, src, srcw);
1421
+ }
1422
+
1423
+ return SLJIT_SUCCESS;
1424
+
1425
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
1426
+ # undef src_is_ereg
1427
+ #endif
1428
+ }
1429
+
1430
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
1431
+
1432
+ #define BINARY_IMM(op_imm, op_mr, immw, arg, argw) \
1433
+ if (IS_HALFWORD(immw) || compiler->mode32) { \
1434
+ inst = emit_x86_instruction(compiler, 1 | EX86_BIN_INS, SLJIT_IMM, immw, arg, argw); \
1435
+ FAIL_IF(!inst); \
1436
+ *(inst + 1) |= (op_imm); \
1437
+ } \
1438
+ else { \
1439
+ FAIL_IF(emit_load_imm64(compiler, TMP_REG2, immw)); \
1440
+ inst = emit_x86_instruction(compiler, 1, TMP_REG2, 0, arg, argw); \
1441
+ FAIL_IF(!inst); \
1442
+ *inst = (op_mr); \
1443
+ }
1444
+
1445
+ #define BINARY_EAX_IMM(op_eax_imm, immw) \
1446
+ FAIL_IF(emit_do_imm32(compiler, (!compiler->mode32) ? REX_W : 0, (op_eax_imm), immw))
1447
+
1448
+ #else
1449
+
1450
+ #define BINARY_IMM(op_imm, op_mr, immw, arg, argw) \
1451
+ inst = emit_x86_instruction(compiler, 1 | EX86_BIN_INS, SLJIT_IMM, immw, arg, argw); \
1452
+ FAIL_IF(!inst); \
1453
+ *(inst + 1) |= (op_imm);
1454
+
1455
+ #define BINARY_EAX_IMM(op_eax_imm, immw) \
1456
+ FAIL_IF(emit_do_imm(compiler, (op_eax_imm), immw))
1457
+
1458
+ #endif
1459
+
1460
+ static sljit_si emit_cum_binary(struct sljit_compiler *compiler,
1461
+ sljit_ub op_rm, sljit_ub op_mr, sljit_ub op_imm, sljit_ub op_eax_imm,
1462
+ sljit_si dst, sljit_sw dstw,
1463
+ sljit_si src1, sljit_sw src1w,
1464
+ sljit_si src2, sljit_sw src2w)
1465
+ {
1466
+ sljit_ub* inst;
1467
+
1468
+ if (dst == SLJIT_UNUSED) {
1469
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src1, src1w);
1470
+ if (src2 & SLJIT_IMM) {
1471
+ BINARY_IMM(op_imm, op_mr, src2w, TMP_REGISTER, 0);
1472
+ }
1473
+ else {
1474
+ inst = emit_x86_instruction(compiler, 1, TMP_REGISTER, 0, src2, src2w);
1475
+ FAIL_IF(!inst);
1476
+ *inst = op_rm;
1477
+ }
1478
+ return SLJIT_SUCCESS;
1479
+ }
1480
+
1481
+ if (dst == src1 && dstw == src1w) {
1482
+ if (src2 & SLJIT_IMM) {
1483
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
1484
+ if ((dst == SLJIT_SCRATCH_REG1) && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) {
1485
+ #else
1486
+ if ((dst == SLJIT_SCRATCH_REG1) && (src2w > 127 || src2w < -128)) {
1487
+ #endif
1488
+ BINARY_EAX_IMM(op_eax_imm, src2w);
1489
+ }
1490
+ else {
1491
+ BINARY_IMM(op_imm, op_mr, src2w, dst, dstw);
1492
+ }
1493
+ }
1494
+ else if (dst <= TMP_REGISTER) {
1495
+ inst = emit_x86_instruction(compiler, 1, dst, dstw, src2, src2w);
1496
+ FAIL_IF(!inst);
1497
+ *inst = op_rm;
1498
+ }
1499
+ else if (src2 <= TMP_REGISTER) {
1500
+ /* Special exception for sljit_emit_op_flags. */
1501
+ inst = emit_x86_instruction(compiler, 1, src2, src2w, dst, dstw);
1502
+ FAIL_IF(!inst);
1503
+ *inst = op_mr;
1504
+ }
1505
+ else {
1506
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src2, src2w);
1507
+ inst = emit_x86_instruction(compiler, 1, TMP_REGISTER, 0, dst, dstw);
1508
+ FAIL_IF(!inst);
1509
+ *inst = op_mr;
1510
+ }
1511
+ return SLJIT_SUCCESS;
1512
+ }
1513
+
1514
+ /* Only for cumulative operations. */
1515
+ if (dst == src2 && dstw == src2w) {
1516
+ if (src1 & SLJIT_IMM) {
1517
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
1518
+ if ((dst == SLJIT_SCRATCH_REG1) && (src1w > 127 || src1w < -128) && (compiler->mode32 || IS_HALFWORD(src1w))) {
1519
+ #else
1520
+ if ((dst == SLJIT_SCRATCH_REG1) && (src1w > 127 || src1w < -128)) {
1521
+ #endif
1522
+ BINARY_EAX_IMM(op_eax_imm, src1w);
1523
+ }
1524
+ else {
1525
+ BINARY_IMM(op_imm, op_mr, src1w, dst, dstw);
1526
+ }
1527
+ }
1528
+ else if (dst <= TMP_REGISTER) {
1529
+ inst = emit_x86_instruction(compiler, 1, dst, dstw, src1, src1w);
1530
+ FAIL_IF(!inst);
1531
+ *inst = op_rm;
1532
+ }
1533
+ else if (src1 <= TMP_REGISTER) {
1534
+ inst = emit_x86_instruction(compiler, 1, src1, src1w, dst, dstw);
1535
+ FAIL_IF(!inst);
1536
+ *inst = op_mr;
1537
+ }
1538
+ else {
1539
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src1, src1w);
1540
+ inst = emit_x86_instruction(compiler, 1, TMP_REGISTER, 0, dst, dstw);
1541
+ FAIL_IF(!inst);
1542
+ *inst = op_mr;
1543
+ }
1544
+ return SLJIT_SUCCESS;
1545
+ }
1546
+
1547
+ /* General version. */
1548
+ if (dst <= TMP_REGISTER) {
1549
+ EMIT_MOV(compiler, dst, 0, src1, src1w);
1550
+ if (src2 & SLJIT_IMM) {
1551
+ BINARY_IMM(op_imm, op_mr, src2w, dst, 0);
1552
+ }
1553
+ else {
1554
+ inst = emit_x86_instruction(compiler, 1, dst, 0, src2, src2w);
1555
+ FAIL_IF(!inst);
1556
+ *inst = op_rm;
1557
+ }
1558
+ }
1559
+ else {
1560
+ /* This version requires less memory writing. */
1561
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src1, src1w);
1562
+ if (src2 & SLJIT_IMM) {
1563
+ BINARY_IMM(op_imm, op_mr, src2w, TMP_REGISTER, 0);
1564
+ }
1565
+ else {
1566
+ inst = emit_x86_instruction(compiler, 1, TMP_REGISTER, 0, src2, src2w);
1567
+ FAIL_IF(!inst);
1568
+ *inst = op_rm;
1569
+ }
1570
+ EMIT_MOV(compiler, dst, dstw, TMP_REGISTER, 0);
1571
+ }
1572
+
1573
+ return SLJIT_SUCCESS;
1574
+ }
1575
+
1576
+ static sljit_si emit_non_cum_binary(struct sljit_compiler *compiler,
1577
+ sljit_ub op_rm, sljit_ub op_mr, sljit_ub op_imm, sljit_ub op_eax_imm,
1578
+ sljit_si dst, sljit_sw dstw,
1579
+ sljit_si src1, sljit_sw src1w,
1580
+ sljit_si src2, sljit_sw src2w)
1581
+ {
1582
+ sljit_ub* inst;
1583
+
1584
+ if (dst == SLJIT_UNUSED) {
1585
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src1, src1w);
1586
+ if (src2 & SLJIT_IMM) {
1587
+ BINARY_IMM(op_imm, op_mr, src2w, TMP_REGISTER, 0);
1588
+ }
1589
+ else {
1590
+ inst = emit_x86_instruction(compiler, 1, TMP_REGISTER, 0, src2, src2w);
1591
+ FAIL_IF(!inst);
1592
+ *inst = op_rm;
1593
+ }
1594
+ return SLJIT_SUCCESS;
1595
+ }
1596
+
1597
+ if (dst == src1 && dstw == src1w) {
1598
+ if (src2 & SLJIT_IMM) {
1599
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
1600
+ if ((dst == SLJIT_SCRATCH_REG1) && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) {
1601
+ #else
1602
+ if ((dst == SLJIT_SCRATCH_REG1) && (src2w > 127 || src2w < -128)) {
1603
+ #endif
1604
+ BINARY_EAX_IMM(op_eax_imm, src2w);
1605
+ }
1606
+ else {
1607
+ BINARY_IMM(op_imm, op_mr, src2w, dst, dstw);
1608
+ }
1609
+ }
1610
+ else if (dst <= TMP_REGISTER) {
1611
+ inst = emit_x86_instruction(compiler, 1, dst, dstw, src2, src2w);
1612
+ FAIL_IF(!inst);
1613
+ *inst = op_rm;
1614
+ }
1615
+ else if (src2 <= TMP_REGISTER) {
1616
+ inst = emit_x86_instruction(compiler, 1, src2, src2w, dst, dstw);
1617
+ FAIL_IF(!inst);
1618
+ *inst = op_mr;
1619
+ }
1620
+ else {
1621
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src2, src2w);
1622
+ inst = emit_x86_instruction(compiler, 1, TMP_REGISTER, 0, dst, dstw);
1623
+ FAIL_IF(!inst);
1624
+ *inst = op_mr;
1625
+ }
1626
+ return SLJIT_SUCCESS;
1627
+ }
1628
+
1629
+ /* General version. */
1630
+ if (dst <= TMP_REGISTER && dst != src2) {
1631
+ EMIT_MOV(compiler, dst, 0, src1, src1w);
1632
+ if (src2 & SLJIT_IMM) {
1633
+ BINARY_IMM(op_imm, op_mr, src2w, dst, 0);
1634
+ }
1635
+ else {
1636
+ inst = emit_x86_instruction(compiler, 1, dst, 0, src2, src2w);
1637
+ FAIL_IF(!inst);
1638
+ *inst = op_rm;
1639
+ }
1640
+ }
1641
+ else {
1642
+ /* This version requires less memory writing. */
1643
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src1, src1w);
1644
+ if (src2 & SLJIT_IMM) {
1645
+ BINARY_IMM(op_imm, op_mr, src2w, TMP_REGISTER, 0);
1646
+ }
1647
+ else {
1648
+ inst = emit_x86_instruction(compiler, 1, TMP_REGISTER, 0, src2, src2w);
1649
+ FAIL_IF(!inst);
1650
+ *inst = op_rm;
1651
+ }
1652
+ EMIT_MOV(compiler, dst, dstw, TMP_REGISTER, 0);
1653
+ }
1654
+
1655
+ return SLJIT_SUCCESS;
1656
+ }
1657
+
1658
+ static sljit_si emit_mul(struct sljit_compiler *compiler,
1659
+ sljit_si dst, sljit_sw dstw,
1660
+ sljit_si src1, sljit_sw src1w,
1661
+ sljit_si src2, sljit_sw src2w)
1662
+ {
1663
+ sljit_ub* inst;
1664
+ sljit_si dst_r;
1665
+
1666
+ dst_r = (dst <= TMP_REGISTER) ? dst : TMP_REGISTER;
1667
+
1668
+ /* Register destination. */
1669
+ if (dst_r == src1 && !(src2 & SLJIT_IMM)) {
1670
+ inst = emit_x86_instruction(compiler, 2, dst_r, 0, src2, src2w);
1671
+ FAIL_IF(!inst);
1672
+ *inst++ = GROUP_0F;
1673
+ *inst = IMUL_r_rm;
1674
+ }
1675
+ else if (dst_r == src2 && !(src1 & SLJIT_IMM)) {
1676
+ inst = emit_x86_instruction(compiler, 2, dst_r, 0, src1, src1w);
1677
+ FAIL_IF(!inst);
1678
+ *inst++ = GROUP_0F;
1679
+ *inst = IMUL_r_rm;
1680
+ }
1681
+ else if (src1 & SLJIT_IMM) {
1682
+ if (src2 & SLJIT_IMM) {
1683
+ EMIT_MOV(compiler, dst_r, 0, SLJIT_IMM, src2w);
1684
+ src2 = dst_r;
1685
+ src2w = 0;
1686
+ }
1687
+
1688
+ if (src1w <= 127 && src1w >= -128) {
1689
+ inst = emit_x86_instruction(compiler, 1, dst_r, 0, src2, src2w);
1690
+ FAIL_IF(!inst);
1691
+ *inst = IMUL_r_rm_i8;
1692
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 1);
1693
+ FAIL_IF(!inst);
1694
+ INC_SIZE(1);
1695
+ *inst = (sljit_sb)src1w;
1696
+ }
1697
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
1698
+ else {
1699
+ inst = emit_x86_instruction(compiler, 1, dst_r, 0, src2, src2w);
1700
+ FAIL_IF(!inst);
1701
+ *inst = IMUL_r_rm_i32;
1702
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 4);
1703
+ FAIL_IF(!inst);
1704
+ INC_SIZE(4);
1705
+ *(sljit_sw*)inst = src1w;
1706
+ }
1707
+ #else
1708
+ else if (IS_HALFWORD(src1w)) {
1709
+ inst = emit_x86_instruction(compiler, 1, dst_r, 0, src2, src2w);
1710
+ FAIL_IF(!inst);
1711
+ *inst = IMUL_r_rm_i32;
1712
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 4);
1713
+ FAIL_IF(!inst);
1714
+ INC_SIZE(4);
1715
+ *(sljit_si*)inst = (sljit_si)src1w;
1716
+ }
1717
+ else {
1718
+ EMIT_MOV(compiler, TMP_REG2, 0, SLJIT_IMM, src1w);
1719
+ if (dst_r != src2)
1720
+ EMIT_MOV(compiler, dst_r, 0, src2, src2w);
1721
+ inst = emit_x86_instruction(compiler, 2, dst_r, 0, TMP_REG2, 0);
1722
+ FAIL_IF(!inst);
1723
+ *inst++ = GROUP_0F;
1724
+ *inst = IMUL_r_rm;
1725
+ }
1726
+ #endif
1727
+ }
1728
+ else if (src2 & SLJIT_IMM) {
1729
+ /* Note: src1 is NOT immediate. */
1730
+
1731
+ if (src2w <= 127 && src2w >= -128) {
1732
+ inst = emit_x86_instruction(compiler, 1, dst_r, 0, src1, src1w);
1733
+ FAIL_IF(!inst);
1734
+ *inst = IMUL_r_rm_i8;
1735
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 1);
1736
+ FAIL_IF(!inst);
1737
+ INC_SIZE(1);
1738
+ *inst = (sljit_sb)src2w;
1739
+ }
1740
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
1741
+ else {
1742
+ inst = emit_x86_instruction(compiler, 1, dst_r, 0, src1, src1w);
1743
+ FAIL_IF(!inst);
1744
+ *inst = IMUL_r_rm_i32;
1745
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 4);
1746
+ FAIL_IF(!inst);
1747
+ INC_SIZE(4);
1748
+ *(sljit_sw*)inst = src2w;
1749
+ }
1750
+ #else
1751
+ else if (IS_HALFWORD(src2w)) {
1752
+ inst = emit_x86_instruction(compiler, 1, dst_r, 0, src1, src1w);
1753
+ FAIL_IF(!inst);
1754
+ *inst = IMUL_r_rm_i32;
1755
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 4);
1756
+ FAIL_IF(!inst);
1757
+ INC_SIZE(4);
1758
+ *(sljit_si*)inst = (sljit_si)src2w;
1759
+ }
1760
+ else {
1761
+ EMIT_MOV(compiler, TMP_REG2, 0, SLJIT_IMM, src1w);
1762
+ if (dst_r != src1)
1763
+ EMIT_MOV(compiler, dst_r, 0, src1, src1w);
1764
+ inst = emit_x86_instruction(compiler, 2, dst_r, 0, TMP_REG2, 0);
1765
+ FAIL_IF(!inst);
1766
+ *inst++ = GROUP_0F;
1767
+ *inst = IMUL_r_rm;
1768
+ }
1769
+ #endif
1770
+ }
1771
+ else {
1772
+ /* Neither argument is immediate. */
1773
+ if (ADDRESSING_DEPENDS_ON(src2, dst_r))
1774
+ dst_r = TMP_REGISTER;
1775
+ EMIT_MOV(compiler, dst_r, 0, src1, src1w);
1776
+ inst = emit_x86_instruction(compiler, 2, dst_r, 0, src2, src2w);
1777
+ FAIL_IF(!inst);
1778
+ *inst++ = GROUP_0F;
1779
+ *inst = IMUL_r_rm;
1780
+ }
1781
+
1782
+ if (dst_r == TMP_REGISTER)
1783
+ EMIT_MOV(compiler, dst, dstw, TMP_REGISTER, 0);
1784
+
1785
+ return SLJIT_SUCCESS;
1786
+ }
1787
+
1788
+ static sljit_si emit_lea_binary(struct sljit_compiler *compiler,
1789
+ sljit_si dst, sljit_sw dstw,
1790
+ sljit_si src1, sljit_sw src1w,
1791
+ sljit_si src2, sljit_sw src2w)
1792
+ {
1793
+ sljit_ub* inst;
1794
+ sljit_si dst_r, done = 0;
1795
+
1796
+ /* These cases better be left to handled by normal way. */
1797
+ if (dst == src1 && dstw == src1w)
1798
+ return SLJIT_ERR_UNSUPPORTED;
1799
+ if (dst == src2 && dstw == src2w)
1800
+ return SLJIT_ERR_UNSUPPORTED;
1801
+
1802
+ dst_r = (dst <= TMP_REGISTER) ? dst : TMP_REGISTER;
1803
+
1804
+ if (src1 <= TMP_REGISTER) {
1805
+ if (src2 <= TMP_REGISTER || src2 == TMP_REGISTER) {
1806
+ inst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM2(src1, src2), 0);
1807
+ FAIL_IF(!inst);
1808
+ *inst = LEA_r_m;
1809
+ done = 1;
1810
+ }
1811
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
1812
+ if ((src2 & SLJIT_IMM) && (compiler->mode32 || IS_HALFWORD(src2w))) {
1813
+ inst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM1(src1), (sljit_si)src2w);
1814
+ #else
1815
+ if (src2 & SLJIT_IMM) {
1816
+ inst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM1(src1), src2w);
1817
+ #endif
1818
+ FAIL_IF(!inst);
1819
+ *inst = LEA_r_m;
1820
+ done = 1;
1821
+ }
1822
+ }
1823
+ else if (src2 <= TMP_REGISTER) {
1824
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
1825
+ if ((src1 & SLJIT_IMM) && (compiler->mode32 || IS_HALFWORD(src1w))) {
1826
+ inst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM1(src2), (sljit_si)src1w);
1827
+ #else
1828
+ if (src1 & SLJIT_IMM) {
1829
+ inst = emit_x86_instruction(compiler, 1, dst_r, 0, SLJIT_MEM1(src2), src1w);
1830
+ #endif
1831
+ FAIL_IF(!inst);
1832
+ *inst = LEA_r_m;
1833
+ done = 1;
1834
+ }
1835
+ }
1836
+
1837
+ if (done) {
1838
+ if (dst_r == TMP_REGISTER)
1839
+ return emit_mov(compiler, dst, dstw, TMP_REGISTER, 0);
1840
+ return SLJIT_SUCCESS;
1841
+ }
1842
+ return SLJIT_ERR_UNSUPPORTED;
1843
+ }
1844
+
1845
+ static sljit_si emit_cmp_binary(struct sljit_compiler *compiler,
1846
+ sljit_si src1, sljit_sw src1w,
1847
+ sljit_si src2, sljit_sw src2w)
1848
+ {
1849
+ sljit_ub* inst;
1850
+
1851
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
1852
+ if (src1 == SLJIT_SCRATCH_REG1 && (src2 & SLJIT_IMM) && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) {
1853
+ #else
1854
+ if (src1 == SLJIT_SCRATCH_REG1 && (src2 & SLJIT_IMM) && (src2w > 127 || src2w < -128)) {
1855
+ #endif
1856
+ BINARY_EAX_IMM(CMP_EAX_i32, src2w);
1857
+ return SLJIT_SUCCESS;
1858
+ }
1859
+
1860
+ if (src1 <= TMP_REGISTER) {
1861
+ if (src2 & SLJIT_IMM) {
1862
+ BINARY_IMM(CMP, CMP_rm_r, src2w, src1, 0);
1863
+ }
1864
+ else {
1865
+ inst = emit_x86_instruction(compiler, 1, src1, 0, src2, src2w);
1866
+ FAIL_IF(!inst);
1867
+ *inst = CMP_r_rm;
1868
+ }
1869
+ return SLJIT_SUCCESS;
1870
+ }
1871
+
1872
+ if (src2 <= TMP_REGISTER && !(src1 & SLJIT_IMM)) {
1873
+ inst = emit_x86_instruction(compiler, 1, src2, 0, src1, src1w);
1874
+ FAIL_IF(!inst);
1875
+ *inst = CMP_rm_r;
1876
+ return SLJIT_SUCCESS;
1877
+ }
1878
+
1879
+ if (src2 & SLJIT_IMM) {
1880
+ if (src1 & SLJIT_IMM) {
1881
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src1, src1w);
1882
+ src1 = TMP_REGISTER;
1883
+ src1w = 0;
1884
+ }
1885
+ BINARY_IMM(CMP, CMP_rm_r, src2w, src1, src1w);
1886
+ }
1887
+ else {
1888
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src1, src1w);
1889
+ inst = emit_x86_instruction(compiler, 1, TMP_REGISTER, 0, src2, src2w);
1890
+ FAIL_IF(!inst);
1891
+ *inst = CMP_r_rm;
1892
+ }
1893
+ return SLJIT_SUCCESS;
1894
+ }
1895
+
1896
+ static sljit_si emit_test_binary(struct sljit_compiler *compiler,
1897
+ sljit_si src1, sljit_sw src1w,
1898
+ sljit_si src2, sljit_sw src2w)
1899
+ {
1900
+ sljit_ub* inst;
1901
+
1902
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
1903
+ if (src1 == SLJIT_SCRATCH_REG1 && (src2 & SLJIT_IMM) && (src2w > 127 || src2w < -128) && (compiler->mode32 || IS_HALFWORD(src2w))) {
1904
+ #else
1905
+ if (src1 == SLJIT_SCRATCH_REG1 && (src2 & SLJIT_IMM) && (src2w > 127 || src2w < -128)) {
1906
+ #endif
1907
+ BINARY_EAX_IMM(TEST_EAX_i32, src2w);
1908
+ return SLJIT_SUCCESS;
1909
+ }
1910
+
1911
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
1912
+ if (src2 == SLJIT_SCRATCH_REG1 && (src2 & SLJIT_IMM) && (src1w > 127 || src1w < -128) && (compiler->mode32 || IS_HALFWORD(src1w))) {
1913
+ #else
1914
+ if (src2 == SLJIT_SCRATCH_REG1 && (src1 & SLJIT_IMM) && (src1w > 127 || src1w < -128)) {
1915
+ #endif
1916
+ BINARY_EAX_IMM(TEST_EAX_i32, src1w);
1917
+ return SLJIT_SUCCESS;
1918
+ }
1919
+
1920
+ if (src1 <= TMP_REGISTER) {
1921
+ if (src2 & SLJIT_IMM) {
1922
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
1923
+ if (IS_HALFWORD(src2w) || compiler->mode32) {
1924
+ inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, src2w, src1, 0);
1925
+ FAIL_IF(!inst);
1926
+ *inst = GROUP_F7;
1927
+ }
1928
+ else {
1929
+ FAIL_IF(emit_load_imm64(compiler, TMP_REG2, src2w));
1930
+ inst = emit_x86_instruction(compiler, 1, TMP_REG2, 0, src1, 0);
1931
+ FAIL_IF(!inst);
1932
+ *inst = TEST_rm_r;
1933
+ }
1934
+ #else
1935
+ inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, src2w, src1, 0);
1936
+ FAIL_IF(!inst);
1937
+ *inst = GROUP_F7;
1938
+ #endif
1939
+ }
1940
+ else {
1941
+ inst = emit_x86_instruction(compiler, 1, src1, 0, src2, src2w);
1942
+ FAIL_IF(!inst);
1943
+ *inst = TEST_rm_r;
1944
+ }
1945
+ return SLJIT_SUCCESS;
1946
+ }
1947
+
1948
+ if (src2 <= TMP_REGISTER) {
1949
+ if (src1 & SLJIT_IMM) {
1950
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
1951
+ if (IS_HALFWORD(src1w) || compiler->mode32) {
1952
+ inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, src1w, src2, 0);
1953
+ FAIL_IF(!inst);
1954
+ *inst = GROUP_F7;
1955
+ }
1956
+ else {
1957
+ FAIL_IF(emit_load_imm64(compiler, TMP_REG2, src1w));
1958
+ inst = emit_x86_instruction(compiler, 1, TMP_REG2, 0, src2, 0);
1959
+ FAIL_IF(!inst);
1960
+ *inst = TEST_rm_r;
1961
+ }
1962
+ #else
1963
+ inst = emit_x86_instruction(compiler, 1, src1, src1w, src2, 0);
1964
+ FAIL_IF(!inst);
1965
+ *inst = GROUP_F7;
1966
+ #endif
1967
+ }
1968
+ else {
1969
+ inst = emit_x86_instruction(compiler, 1, src2, 0, src1, src1w);
1970
+ FAIL_IF(!inst);
1971
+ *inst = TEST_rm_r;
1972
+ }
1973
+ return SLJIT_SUCCESS;
1974
+ }
1975
+
1976
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src1, src1w);
1977
+ if (src2 & SLJIT_IMM) {
1978
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
1979
+ if (IS_HALFWORD(src2w) || compiler->mode32) {
1980
+ inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, src2w, TMP_REGISTER, 0);
1981
+ FAIL_IF(!inst);
1982
+ *inst = GROUP_F7;
1983
+ }
1984
+ else {
1985
+ FAIL_IF(emit_load_imm64(compiler, TMP_REG2, src2w));
1986
+ inst = emit_x86_instruction(compiler, 1, TMP_REG2, 0, TMP_REGISTER, 0);
1987
+ FAIL_IF(!inst);
1988
+ *inst = TEST_rm_r;
1989
+ }
1990
+ #else
1991
+ inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, src2w, TMP_REGISTER, 0);
1992
+ FAIL_IF(!inst);
1993
+ *inst = GROUP_F7;
1994
+ #endif
1995
+ }
1996
+ else {
1997
+ inst = emit_x86_instruction(compiler, 1, TMP_REGISTER, 0, src2, src2w);
1998
+ FAIL_IF(!inst);
1999
+ *inst = TEST_rm_r;
2000
+ }
2001
+ return SLJIT_SUCCESS;
2002
+ }
2003
+
2004
+ static sljit_si emit_shift(struct sljit_compiler *compiler,
2005
+ sljit_ub mode,
2006
+ sljit_si dst, sljit_sw dstw,
2007
+ sljit_si src1, sljit_sw src1w,
2008
+ sljit_si src2, sljit_sw src2w)
2009
+ {
2010
+ sljit_ub* inst;
2011
+
2012
+ if ((src2 & SLJIT_IMM) || (src2 == SLJIT_PREF_SHIFT_REG)) {
2013
+ if (dst == src1 && dstw == src1w) {
2014
+ inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, src2, src2w, dst, dstw);
2015
+ FAIL_IF(!inst);
2016
+ *inst |= mode;
2017
+ return SLJIT_SUCCESS;
2018
+ }
2019
+ if (dst == SLJIT_UNUSED) {
2020
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src1, src1w);
2021
+ inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, src2, src2w, TMP_REGISTER, 0);
2022
+ FAIL_IF(!inst);
2023
+ *inst |= mode;
2024
+ return SLJIT_SUCCESS;
2025
+ }
2026
+ if (dst == SLJIT_PREF_SHIFT_REG && src2 == SLJIT_PREF_SHIFT_REG) {
2027
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src1, src1w);
2028
+ inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_PREF_SHIFT_REG, 0, TMP_REGISTER, 0);
2029
+ FAIL_IF(!inst);
2030
+ *inst |= mode;
2031
+ EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, TMP_REGISTER, 0);
2032
+ return SLJIT_SUCCESS;
2033
+ }
2034
+ if (dst <= TMP_REGISTER) {
2035
+ EMIT_MOV(compiler, dst, 0, src1, src1w);
2036
+ inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, src2, src2w, dst, 0);
2037
+ FAIL_IF(!inst);
2038
+ *inst |= mode;
2039
+ return SLJIT_SUCCESS;
2040
+ }
2041
+
2042
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src1, src1w);
2043
+ inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, src2, src2w, TMP_REGISTER, 0);
2044
+ FAIL_IF(!inst);
2045
+ *inst |= mode;
2046
+ EMIT_MOV(compiler, dst, dstw, TMP_REGISTER, 0);
2047
+ return SLJIT_SUCCESS;
2048
+ }
2049
+
2050
+ if (dst == SLJIT_PREF_SHIFT_REG) {
2051
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src1, src1w);
2052
+ EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, src2, src2w);
2053
+ inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_PREF_SHIFT_REG, 0, TMP_REGISTER, 0);
2054
+ FAIL_IF(!inst);
2055
+ *inst |= mode;
2056
+ EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, TMP_REGISTER, 0);
2057
+ }
2058
+ else if (dst <= TMP_REGISTER && dst != src2 && !ADDRESSING_DEPENDS_ON(src2, dst)) {
2059
+ if (src1 != dst)
2060
+ EMIT_MOV(compiler, dst, 0, src1, src1w);
2061
+ EMIT_MOV(compiler, TMP_REGISTER, 0, SLJIT_PREF_SHIFT_REG, 0);
2062
+ EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, src2, src2w);
2063
+ inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_PREF_SHIFT_REG, 0, dst, 0);
2064
+ FAIL_IF(!inst);
2065
+ *inst |= mode;
2066
+ EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, TMP_REGISTER, 0);
2067
+ }
2068
+ else {
2069
+ /* This case is really difficult, since ecx itself may used for
2070
+ addressing, and we must ensure to work even in that case. */
2071
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src1, src1w);
2072
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
2073
+ EMIT_MOV(compiler, TMP_REG2, 0, SLJIT_PREF_SHIFT_REG, 0);
2074
+ #else
2075
+ /* [esp+0] contains the flags. */
2076
+ EMIT_MOV(compiler, SLJIT_MEM1(SLJIT_LOCALS_REG), sizeof(sljit_sw), SLJIT_PREF_SHIFT_REG, 0);
2077
+ #endif
2078
+ EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, src2, src2w);
2079
+ inst = emit_x86_instruction(compiler, 1 | EX86_SHIFT_INS, SLJIT_PREF_SHIFT_REG, 0, TMP_REGISTER, 0);
2080
+ FAIL_IF(!inst);
2081
+ *inst |= mode;
2082
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
2083
+ EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, TMP_REG2, 0);
2084
+ #else
2085
+ EMIT_MOV(compiler, SLJIT_PREF_SHIFT_REG, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), sizeof(sljit_sw));
2086
+ #endif
2087
+ EMIT_MOV(compiler, dst, dstw, TMP_REGISTER, 0);
2088
+ }
2089
+
2090
+ return SLJIT_SUCCESS;
2091
+ }
2092
+
2093
+ static sljit_si emit_shift_with_flags(struct sljit_compiler *compiler,
2094
+ sljit_ub mode, sljit_si set_flags,
2095
+ sljit_si dst, sljit_sw dstw,
2096
+ sljit_si src1, sljit_sw src1w,
2097
+ sljit_si src2, sljit_sw src2w)
2098
+ {
2099
+ /* The CPU does not set flags if the shift count is 0. */
2100
+ if (src2 & SLJIT_IMM) {
2101
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
2102
+ if ((src2w & 0x3f) != 0 || (compiler->mode32 && (src2w & 0x1f) != 0))
2103
+ return emit_shift(compiler, mode, dst, dstw, src1, src1w, src2, src2w);
2104
+ #else
2105
+ if ((src2w & 0x1f) != 0)
2106
+ return emit_shift(compiler, mode, dst, dstw, src1, src1w, src2, src2w);
2107
+ #endif
2108
+ if (!set_flags)
2109
+ return emit_mov(compiler, dst, dstw, src1, src1w);
2110
+ /* OR dst, src, 0 */
2111
+ return emit_cum_binary(compiler, OR_r_rm, OR_rm_r, OR, OR_EAX_i32,
2112
+ dst, dstw, src1, src1w, SLJIT_IMM, 0);
2113
+ }
2114
+
2115
+ if (!set_flags)
2116
+ return emit_shift(compiler, mode, dst, dstw, src1, src1w, src2, src2w);
2117
+
2118
+ if (!(dst <= TMP_REGISTER))
2119
+ FAIL_IF(emit_cmp_binary(compiler, src1, src1w, SLJIT_IMM, 0));
2120
+
2121
+ FAIL_IF(emit_shift(compiler,mode, dst, dstw, src1, src1w, src2, src2w));
2122
+
2123
+ if (dst <= TMP_REGISTER)
2124
+ return emit_cmp_binary(compiler, dst, dstw, SLJIT_IMM, 0);
2125
+ return SLJIT_SUCCESS;
2126
+ }
2127
+
2128
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler, sljit_si op,
2129
+ sljit_si dst, sljit_sw dstw,
2130
+ sljit_si src1, sljit_sw src1w,
2131
+ sljit_si src2, sljit_sw src2w)
2132
+ {
2133
+ CHECK_ERROR();
2134
+ check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w);
2135
+ ADJUST_LOCAL_OFFSET(dst, dstw);
2136
+ ADJUST_LOCAL_OFFSET(src1, src1w);
2137
+ ADJUST_LOCAL_OFFSET(src2, src2w);
2138
+
2139
+ CHECK_EXTRA_REGS(dst, dstw, (void)0);
2140
+ CHECK_EXTRA_REGS(src1, src1w, (void)0);
2141
+ CHECK_EXTRA_REGS(src2, src2w, (void)0);
2142
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
2143
+ compiler->mode32 = op & SLJIT_INT_OP;
2144
+ #endif
2145
+
2146
+ if (GET_OPCODE(op) >= SLJIT_MUL) {
2147
+ if (SLJIT_UNLIKELY(GET_FLAGS(op)))
2148
+ compiler->flags_saved = 0;
2149
+ else if (SLJIT_UNLIKELY(op & SLJIT_KEEP_FLAGS) && !compiler->flags_saved)
2150
+ FAIL_IF(emit_save_flags(compiler));
2151
+ }
2152
+
2153
+ switch (GET_OPCODE(op)) {
2154
+ case SLJIT_ADD:
2155
+ if (!GET_FLAGS(op)) {
2156
+ if (emit_lea_binary(compiler, dst, dstw, src1, src1w, src2, src2w) != SLJIT_ERR_UNSUPPORTED)
2157
+ return compiler->error;
2158
+ }
2159
+ else
2160
+ compiler->flags_saved = 0;
2161
+ if (SLJIT_UNLIKELY(op & SLJIT_KEEP_FLAGS) && !compiler->flags_saved)
2162
+ FAIL_IF(emit_save_flags(compiler));
2163
+ return emit_cum_binary(compiler, ADD_r_rm, ADD_rm_r, ADD, ADD_EAX_i32,
2164
+ dst, dstw, src1, src1w, src2, src2w);
2165
+ case SLJIT_ADDC:
2166
+ if (SLJIT_UNLIKELY(compiler->flags_saved)) /* C flag must be restored. */
2167
+ FAIL_IF(emit_restore_flags(compiler, 1));
2168
+ else if (SLJIT_UNLIKELY(op & SLJIT_KEEP_FLAGS))
2169
+ FAIL_IF(emit_save_flags(compiler));
2170
+ if (SLJIT_UNLIKELY(GET_FLAGS(op)))
2171
+ compiler->flags_saved = 0;
2172
+ return emit_cum_binary(compiler, ADC_r_rm, ADC_rm_r, ADC, ADC_EAX_i32,
2173
+ dst, dstw, src1, src1w, src2, src2w);
2174
+ case SLJIT_SUB:
2175
+ if (!GET_FLAGS(op)) {
2176
+ if ((src2 & SLJIT_IMM) && emit_lea_binary(compiler, dst, dstw, src1, src1w, SLJIT_IMM, -src2w) != SLJIT_ERR_UNSUPPORTED)
2177
+ return compiler->error;
2178
+ }
2179
+ else
2180
+ compiler->flags_saved = 0;
2181
+ if (SLJIT_UNLIKELY(op & SLJIT_KEEP_FLAGS) && !compiler->flags_saved)
2182
+ FAIL_IF(emit_save_flags(compiler));
2183
+ if (dst == SLJIT_UNUSED)
2184
+ return emit_cmp_binary(compiler, src1, src1w, src2, src2w);
2185
+ return emit_non_cum_binary(compiler, SUB_r_rm, SUB_rm_r, SUB, SUB_EAX_i32,
2186
+ dst, dstw, src1, src1w, src2, src2w);
2187
+ case SLJIT_SUBC:
2188
+ if (SLJIT_UNLIKELY(compiler->flags_saved)) /* C flag must be restored. */
2189
+ FAIL_IF(emit_restore_flags(compiler, 1));
2190
+ else if (SLJIT_UNLIKELY(op & SLJIT_KEEP_FLAGS))
2191
+ FAIL_IF(emit_save_flags(compiler));
2192
+ if (SLJIT_UNLIKELY(GET_FLAGS(op)))
2193
+ compiler->flags_saved = 0;
2194
+ return emit_non_cum_binary(compiler, SBB_r_rm, SBB_rm_r, SBB, SBB_EAX_i32,
2195
+ dst, dstw, src1, src1w, src2, src2w);
2196
+ case SLJIT_MUL:
2197
+ return emit_mul(compiler, dst, dstw, src1, src1w, src2, src2w);
2198
+ case SLJIT_AND:
2199
+ if (dst == SLJIT_UNUSED)
2200
+ return emit_test_binary(compiler, src1, src1w, src2, src2w);
2201
+ return emit_cum_binary(compiler, AND_r_rm, AND_rm_r, AND, AND_EAX_i32,
2202
+ dst, dstw, src1, src1w, src2, src2w);
2203
+ case SLJIT_OR:
2204
+ return emit_cum_binary(compiler, OR_r_rm, OR_rm_r, OR, OR_EAX_i32,
2205
+ dst, dstw, src1, src1w, src2, src2w);
2206
+ case SLJIT_XOR:
2207
+ return emit_cum_binary(compiler, XOR_r_rm, XOR_rm_r, XOR, XOR_EAX_i32,
2208
+ dst, dstw, src1, src1w, src2, src2w);
2209
+ case SLJIT_SHL:
2210
+ return emit_shift_with_flags(compiler, SHL, GET_FLAGS(op),
2211
+ dst, dstw, src1, src1w, src2, src2w);
2212
+ case SLJIT_LSHR:
2213
+ return emit_shift_with_flags(compiler, SHR, GET_FLAGS(op),
2214
+ dst, dstw, src1, src1w, src2, src2w);
2215
+ case SLJIT_ASHR:
2216
+ return emit_shift_with_flags(compiler, SAR, GET_FLAGS(op),
2217
+ dst, dstw, src1, src1w, src2, src2w);
2218
+ }
2219
+
2220
+ return SLJIT_SUCCESS;
2221
+ }
2222
+
2223
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg)
2224
+ {
2225
+ check_sljit_get_register_index(reg);
2226
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
2227
+ if (reg == SLJIT_TEMPORARY_EREG1 || reg == SLJIT_TEMPORARY_EREG2
2228
+ || reg == SLJIT_SAVED_EREG1 || reg == SLJIT_SAVED_EREG2)
2229
+ return -1;
2230
+ #endif
2231
+ return reg_map[reg];
2232
+ }
2233
+
2234
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *compiler,
2235
+ void *instruction, sljit_si size)
2236
+ {
2237
+ sljit_ub *inst;
2238
+
2239
+ CHECK_ERROR();
2240
+ check_sljit_emit_op_custom(compiler, instruction, size);
2241
+ SLJIT_ASSERT(size > 0 && size < 16);
2242
+
2243
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + size);
2244
+ FAIL_IF(!inst);
2245
+ INC_SIZE(size);
2246
+ SLJIT_MEMMOVE(inst, instruction, size);
2247
+ return SLJIT_SUCCESS;
2248
+ }
2249
+
2250
+ /* --------------------------------------------------------------------- */
2251
+ /* Floating point operators */
2252
+ /* --------------------------------------------------------------------- */
2253
+
2254
+ #if (defined SLJIT_SSE2 && SLJIT_SSE2)
2255
+
2256
+ /* Alignment + 2 * 16 bytes. */
2257
+ static sljit_si sse2_data[3 + (4 + 4) * 2];
2258
+ static sljit_si *sse2_buffer;
2259
+
2260
+ static void init_compiler(void)
2261
+ {
2262
+ sse2_buffer = (sljit_si*)(((sljit_uw)sse2_data + 15) & ~0xf);
2263
+ /* Single precision constants. */
2264
+ sse2_buffer[0] = 0x80000000;
2265
+ sse2_buffer[4] = 0x7fffffff;
2266
+ /* Double precision constants. */
2267
+ sse2_buffer[8] = 0;
2268
+ sse2_buffer[9] = 0x80000000;
2269
+ sse2_buffer[12] = 0xffffffff;
2270
+ sse2_buffer[13] = 0x7fffffff;
2271
+ }
2272
+
2273
+ #endif
2274
+
2275
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_is_fpu_available(void)
2276
+ {
2277
+ #if (defined SLJIT_SSE2 && SLJIT_SSE2)
2278
+ #if (defined SLJIT_DETECT_SSE2 && SLJIT_DETECT_SSE2)
2279
+ if (cpu_has_sse2 == -1)
2280
+ get_cpu_features();
2281
+ return cpu_has_sse2;
2282
+ #else /* SLJIT_DETECT_SSE2 */
2283
+ return 1;
2284
+ #endif /* SLJIT_DETECT_SSE2 */
2285
+ #else /* SLJIT_SSE2 */
2286
+ return 0;
2287
+ #endif
2288
+ }
2289
+
2290
+ #if (defined SLJIT_SSE2 && SLJIT_SSE2)
2291
+
2292
+ static sljit_si emit_sse2(struct sljit_compiler *compiler, sljit_ub opcode,
2293
+ sljit_si single, sljit_si xmm1, sljit_si xmm2, sljit_sw xmm2w)
2294
+ {
2295
+ sljit_ub *inst;
2296
+
2297
+ inst = emit_x86_instruction(compiler, 2 | (single ? EX86_PREF_F3 : EX86_PREF_F2) | EX86_SSE2, xmm1, 0, xmm2, xmm2w);
2298
+ FAIL_IF(!inst);
2299
+ *inst++ = GROUP_0F;
2300
+ *inst = opcode;
2301
+ return SLJIT_SUCCESS;
2302
+ }
2303
+
2304
+ static sljit_si emit_sse2_logic(struct sljit_compiler *compiler, sljit_ub opcode,
2305
+ sljit_si pref66, sljit_si xmm1, sljit_si xmm2, sljit_sw xmm2w)
2306
+ {
2307
+ sljit_ub *inst;
2308
+
2309
+ inst = emit_x86_instruction(compiler, 2 | (pref66 ? EX86_PREF_66 : 0) | EX86_SSE2, xmm1, 0, xmm2, xmm2w);
2310
+ FAIL_IF(!inst);
2311
+ *inst++ = GROUP_0F;
2312
+ *inst = opcode;
2313
+ return SLJIT_SUCCESS;
2314
+ }
2315
+
2316
+ static SLJIT_INLINE sljit_si emit_sse2_load(struct sljit_compiler *compiler,
2317
+ sljit_si single, sljit_si dst, sljit_si src, sljit_sw srcw)
2318
+ {
2319
+ return emit_sse2(compiler, MOVSD_x_xm, single, dst, src, srcw);
2320
+ }
2321
+
2322
+ static SLJIT_INLINE sljit_si emit_sse2_store(struct sljit_compiler *compiler,
2323
+ sljit_si single, sljit_si dst, sljit_sw dstw, sljit_si src)
2324
+ {
2325
+ return emit_sse2(compiler, MOVSD_xm_x, single, src, dst, dstw);
2326
+ }
2327
+
2328
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compiler, sljit_si op,
2329
+ sljit_si dst, sljit_sw dstw,
2330
+ sljit_si src, sljit_sw srcw)
2331
+ {
2332
+ sljit_si dst_r;
2333
+
2334
+ CHECK_ERROR();
2335
+ check_sljit_emit_fop1(compiler, op, dst, dstw, src, srcw);
2336
+
2337
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
2338
+ compiler->mode32 = 1;
2339
+ #endif
2340
+
2341
+ if (GET_OPCODE(op) == SLJIT_CMPD) {
2342
+ compiler->flags_saved = 0;
2343
+ if (dst <= SLJIT_FLOAT_REG6)
2344
+ dst_r = dst;
2345
+ else {
2346
+ dst_r = TMP_FREG;
2347
+ FAIL_IF(emit_sse2_load(compiler, op & SLJIT_SINGLE_OP, dst_r, dst, dstw));
2348
+ }
2349
+ return emit_sse2_logic(compiler, UCOMISD_x_xm, !(op & SLJIT_SINGLE_OP), dst_r, src, srcw);
2350
+ }
2351
+
2352
+ if (op == SLJIT_MOVD) {
2353
+ if (dst <= SLJIT_FLOAT_REG6)
2354
+ return emit_sse2_load(compiler, op & SLJIT_SINGLE_OP, dst, src, srcw);
2355
+ if (src <= SLJIT_FLOAT_REG6)
2356
+ return emit_sse2_store(compiler, op & SLJIT_SINGLE_OP, dst, dstw, src);
2357
+ FAIL_IF(emit_sse2_load(compiler, op & SLJIT_SINGLE_OP, TMP_FREG, src, srcw));
2358
+ return emit_sse2_store(compiler, op & SLJIT_SINGLE_OP, dst, dstw, TMP_FREG);
2359
+ }
2360
+
2361
+ if (dst >= SLJIT_FLOAT_REG1 && dst <= SLJIT_FLOAT_REG6) {
2362
+ dst_r = dst;
2363
+ if (dst != src)
2364
+ FAIL_IF(emit_sse2_load(compiler, op & SLJIT_SINGLE_OP, dst_r, src, srcw));
2365
+ }
2366
+ else {
2367
+ dst_r = TMP_FREG;
2368
+ FAIL_IF(emit_sse2_load(compiler, op & SLJIT_SINGLE_OP, dst_r, src, srcw));
2369
+ }
2370
+
2371
+ switch (GET_OPCODE(op)) {
2372
+ case SLJIT_NEGD:
2373
+ FAIL_IF(emit_sse2_logic(compiler, XORPD_x_xm, 1, dst_r, SLJIT_MEM0(), (sljit_sw)(op & SLJIT_SINGLE_OP ? sse2_buffer : sse2_buffer + 8)));
2374
+ break;
2375
+
2376
+ case SLJIT_ABSD:
2377
+ FAIL_IF(emit_sse2_logic(compiler, ANDPD_x_xm, 1, dst_r, SLJIT_MEM0(), (sljit_sw)(op & SLJIT_SINGLE_OP ? sse2_buffer + 4 : sse2_buffer + 12)));
2378
+ break;
2379
+ }
2380
+
2381
+ if (dst_r == TMP_FREG)
2382
+ return emit_sse2_store(compiler, op & SLJIT_SINGLE_OP, dst, dstw, TMP_FREG);
2383
+ return SLJIT_SUCCESS;
2384
+ }
2385
+
2386
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compiler, sljit_si op,
2387
+ sljit_si dst, sljit_sw dstw,
2388
+ sljit_si src1, sljit_sw src1w,
2389
+ sljit_si src2, sljit_sw src2w)
2390
+ {
2391
+ sljit_si dst_r;
2392
+
2393
+ CHECK_ERROR();
2394
+ check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w);
2395
+
2396
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
2397
+ compiler->mode32 = 1;
2398
+ #endif
2399
+
2400
+ if (dst <= SLJIT_FLOAT_REG6) {
2401
+ dst_r = dst;
2402
+ if (dst == src1)
2403
+ ; /* Do nothing here. */
2404
+ else if (dst == src2 && (op == SLJIT_ADDD || op == SLJIT_MULD)) {
2405
+ /* Swap arguments. */
2406
+ src2 = src1;
2407
+ src2w = src1w;
2408
+ }
2409
+ else if (dst != src2)
2410
+ FAIL_IF(emit_sse2_load(compiler, op & SLJIT_SINGLE_OP, dst_r, src1, src1w));
2411
+ else {
2412
+ dst_r = TMP_FREG;
2413
+ FAIL_IF(emit_sse2_load(compiler, op & SLJIT_SINGLE_OP, TMP_FREG, src1, src1w));
2414
+ }
2415
+ }
2416
+ else {
2417
+ dst_r = TMP_FREG;
2418
+ FAIL_IF(emit_sse2_load(compiler, op & SLJIT_SINGLE_OP, TMP_FREG, src1, src1w));
2419
+ }
2420
+
2421
+ switch (GET_OPCODE(op)) {
2422
+ case SLJIT_ADDD:
2423
+ FAIL_IF(emit_sse2(compiler, ADDSD_x_xm, op & SLJIT_SINGLE_OP, dst_r, src2, src2w));
2424
+ break;
2425
+
2426
+ case SLJIT_SUBD:
2427
+ FAIL_IF(emit_sse2(compiler, SUBSD_x_xm, op & SLJIT_SINGLE_OP, dst_r, src2, src2w));
2428
+ break;
2429
+
2430
+ case SLJIT_MULD:
2431
+ FAIL_IF(emit_sse2(compiler, MULSD_x_xm, op & SLJIT_SINGLE_OP, dst_r, src2, src2w));
2432
+ break;
2433
+
2434
+ case SLJIT_DIVD:
2435
+ FAIL_IF(emit_sse2(compiler, DIVSD_x_xm, op & SLJIT_SINGLE_OP, dst_r, src2, src2w));
2436
+ break;
2437
+ }
2438
+
2439
+ if (dst_r == TMP_FREG)
2440
+ return emit_sse2_store(compiler, op & SLJIT_SINGLE_OP, dst, dstw, TMP_FREG);
2441
+ return SLJIT_SUCCESS;
2442
+ }
2443
+
2444
+ #else
2445
+
2446
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compiler, sljit_si op,
2447
+ sljit_si dst, sljit_sw dstw,
2448
+ sljit_si src, sljit_sw srcw)
2449
+ {
2450
+ CHECK_ERROR();
2451
+ /* Should cause an assertion fail. */
2452
+ check_sljit_emit_fop1(compiler, op, dst, dstw, src, srcw);
2453
+ compiler->error = SLJIT_ERR_UNSUPPORTED;
2454
+ return SLJIT_ERR_UNSUPPORTED;
2455
+ }
2456
+
2457
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compiler, sljit_si op,
2458
+ sljit_si dst, sljit_sw dstw,
2459
+ sljit_si src1, sljit_sw src1w,
2460
+ sljit_si src2, sljit_sw src2w)
2461
+ {
2462
+ CHECK_ERROR();
2463
+ /* Should cause an assertion fail. */
2464
+ check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w);
2465
+ compiler->error = SLJIT_ERR_UNSUPPORTED;
2466
+ return SLJIT_ERR_UNSUPPORTED;
2467
+ }
2468
+
2469
+ #endif
2470
+
2471
+ /* --------------------------------------------------------------------- */
2472
+ /* Conditional instructions */
2473
+ /* --------------------------------------------------------------------- */
2474
+
2475
+ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler)
2476
+ {
2477
+ sljit_ub *inst;
2478
+ struct sljit_label *label;
2479
+
2480
+ CHECK_ERROR_PTR();
2481
+ check_sljit_emit_label(compiler);
2482
+
2483
+ /* We should restore the flags before the label,
2484
+ since other taken jumps has their own flags as well. */
2485
+ if (SLJIT_UNLIKELY(compiler->flags_saved))
2486
+ PTR_FAIL_IF(emit_restore_flags(compiler, 0));
2487
+
2488
+ if (compiler->last_label && compiler->last_label->size == compiler->size)
2489
+ return compiler->last_label;
2490
+
2491
+ label = (struct sljit_label*)ensure_abuf(compiler, sizeof(struct sljit_label));
2492
+ PTR_FAIL_IF(!label);
2493
+ set_label(label, compiler);
2494
+
2495
+ inst = (sljit_ub*)ensure_buf(compiler, 2);
2496
+ PTR_FAIL_IF(!inst);
2497
+
2498
+ *inst++ = 0;
2499
+ *inst++ = 0;
2500
+
2501
+ return label;
2502
+ }
2503
+
2504
+ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_si type)
2505
+ {
2506
+ sljit_ub *inst;
2507
+ struct sljit_jump *jump;
2508
+
2509
+ CHECK_ERROR_PTR();
2510
+ check_sljit_emit_jump(compiler, type);
2511
+
2512
+ if (SLJIT_UNLIKELY(compiler->flags_saved)) {
2513
+ if ((type & 0xff) <= SLJIT_JUMP)
2514
+ PTR_FAIL_IF(emit_restore_flags(compiler, 0));
2515
+ compiler->flags_saved = 0;
2516
+ }
2517
+
2518
+ jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
2519
+ PTR_FAIL_IF_NULL(jump);
2520
+ set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);
2521
+ type &= 0xff;
2522
+
2523
+ if (type >= SLJIT_CALL1)
2524
+ PTR_FAIL_IF(call_with_args(compiler, type));
2525
+
2526
+ /* Worst case size. */
2527
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
2528
+ compiler->size += (type >= SLJIT_JUMP) ? 5 : 6;
2529
+ #else
2530
+ compiler->size += (type >= SLJIT_JUMP) ? (10 + 3) : (2 + 10 + 3);
2531
+ #endif
2532
+
2533
+ inst = (sljit_ub*)ensure_buf(compiler, 2);
2534
+ PTR_FAIL_IF_NULL(inst);
2535
+
2536
+ *inst++ = 0;
2537
+ *inst++ = type + 4;
2538
+ return jump;
2539
+ }
2540
+
2541
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compiler, sljit_si type, sljit_si src, sljit_sw srcw)
2542
+ {
2543
+ sljit_ub *inst;
2544
+ struct sljit_jump *jump;
2545
+
2546
+ CHECK_ERROR();
2547
+ check_sljit_emit_ijump(compiler, type, src, srcw);
2548
+ ADJUST_LOCAL_OFFSET(src, srcw);
2549
+
2550
+ CHECK_EXTRA_REGS(src, srcw, (void)0);
2551
+
2552
+ if (SLJIT_UNLIKELY(compiler->flags_saved)) {
2553
+ if (type <= SLJIT_JUMP)
2554
+ FAIL_IF(emit_restore_flags(compiler, 0));
2555
+ compiler->flags_saved = 0;
2556
+ }
2557
+
2558
+ if (type >= SLJIT_CALL1) {
2559
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
2560
+ #if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)
2561
+ if (src == SLJIT_SCRATCH_REG3) {
2562
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src, 0);
2563
+ src = TMP_REGISTER;
2564
+ }
2565
+ if (src == SLJIT_MEM1(SLJIT_LOCALS_REG) && type >= SLJIT_CALL3)
2566
+ srcw += sizeof(sljit_sw);
2567
+ #endif
2568
+ #endif
2569
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) && defined(_WIN64)
2570
+ if (src == SLJIT_SCRATCH_REG3) {
2571
+ EMIT_MOV(compiler, TMP_REGISTER, 0, src, 0);
2572
+ src = TMP_REGISTER;
2573
+ }
2574
+ #endif
2575
+ FAIL_IF(call_with_args(compiler, type));
2576
+ }
2577
+
2578
+ if (src == SLJIT_IMM) {
2579
+ jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
2580
+ FAIL_IF_NULL(jump);
2581
+ set_jump(jump, compiler, JUMP_ADDR);
2582
+ jump->u.target = srcw;
2583
+
2584
+ /* Worst case size. */
2585
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
2586
+ compiler->size += 5;
2587
+ #else
2588
+ compiler->size += 10 + 3;
2589
+ #endif
2590
+
2591
+ inst = (sljit_ub*)ensure_buf(compiler, 2);
2592
+ FAIL_IF_NULL(inst);
2593
+
2594
+ *inst++ = 0;
2595
+ *inst++ = type + 4;
2596
+ }
2597
+ else {
2598
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
2599
+ /* REX_W is not necessary (src is not immediate). */
2600
+ compiler->mode32 = 1;
2601
+ #endif
2602
+ inst = emit_x86_instruction(compiler, 1, 0, 0, src, srcw);
2603
+ FAIL_IF(!inst);
2604
+ *inst++ = GROUP_FF;
2605
+ *inst |= (type >= SLJIT_FAST_CALL) ? CALL_rm : JMP_rm;
2606
+ }
2607
+ return SLJIT_SUCCESS;
2608
+ }
2609
+
2610
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_si op,
2611
+ sljit_si dst, sljit_sw dstw,
2612
+ sljit_si src, sljit_sw srcw,
2613
+ sljit_si type)
2614
+ {
2615
+ sljit_ub *inst;
2616
+ sljit_ub cond_set = 0;
2617
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
2618
+ sljit_si reg;
2619
+ #else
2620
+ /* CHECK_EXTRA_REGS migh overwrite these values. */
2621
+ sljit_si dst_save = dst;
2622
+ sljit_sw dstw_save = dstw;
2623
+ #endif
2624
+
2625
+ CHECK_ERROR();
2626
+ check_sljit_emit_op_flags(compiler, op, dst, dstw, src, srcw, type);
2627
+
2628
+ if (dst == SLJIT_UNUSED)
2629
+ return SLJIT_SUCCESS;
2630
+
2631
+ ADJUST_LOCAL_OFFSET(dst, dstw);
2632
+ CHECK_EXTRA_REGS(dst, dstw, (void)0);
2633
+ if (SLJIT_UNLIKELY(compiler->flags_saved))
2634
+ FAIL_IF(emit_restore_flags(compiler, op & SLJIT_KEEP_FLAGS));
2635
+
2636
+ /* setcc = jcc + 0x10. */
2637
+ cond_set = get_jump_code(type) + 0x10;
2638
+
2639
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
2640
+ reg = (op == SLJIT_MOV && dst <= TMP_REGISTER) ? dst : TMP_REGISTER;
2641
+
2642
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 4 + 4);
2643
+ FAIL_IF(!inst);
2644
+ INC_SIZE(4 + 4);
2645
+ /* Set low register to conditional flag. */
2646
+ *inst++ = (reg_map[reg] <= 7) ? REX : REX_B;
2647
+ *inst++ = GROUP_0F;
2648
+ *inst++ = cond_set;
2649
+ *inst++ = MOD_REG | reg_lmap[reg];
2650
+ *inst++ = REX_W | (reg_map[reg] <= 7 ? 0 : (REX_B | REX_R));
2651
+ *inst++ = GROUP_0F;
2652
+ *inst++ = MOVZX_r_rm8;
2653
+ *inst = MOD_REG | (reg_lmap[reg] << 3) | reg_lmap[reg];
2654
+
2655
+ if (reg != TMP_REGISTER)
2656
+ return SLJIT_SUCCESS;
2657
+
2658
+ if (GET_OPCODE(op) < SLJIT_ADD) {
2659
+ compiler->mode32 = GET_OPCODE(op) != SLJIT_MOV;
2660
+ return emit_mov(compiler, dst, dstw, TMP_REGISTER, 0);
2661
+ }
2662
+ #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
2663
+ compiler->skip_checks = 1;
2664
+ #endif
2665
+ return sljit_emit_op2(compiler, op, dst, dstw, dst, dstw, TMP_REGISTER, 0);
2666
+ #else /* SLJIT_CONFIG_X86_64 */
2667
+ if (GET_OPCODE(op) < SLJIT_ADD && dst <= TMP_REGISTER) {
2668
+ if (reg_map[dst] <= 4) {
2669
+ /* Low byte is accessible. */
2670
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 3 + 3);
2671
+ FAIL_IF(!inst);
2672
+ INC_SIZE(3 + 3);
2673
+ /* Set low byte to conditional flag. */
2674
+ *inst++ = GROUP_0F;
2675
+ *inst++ = cond_set;
2676
+ *inst++ = MOD_REG | reg_map[dst];
2677
+
2678
+ *inst++ = GROUP_0F;
2679
+ *inst++ = MOVZX_r_rm8;
2680
+ *inst = MOD_REG | (reg_map[dst] << 3) | reg_map[dst];
2681
+ return SLJIT_SUCCESS;
2682
+ }
2683
+
2684
+ /* Low byte is not accessible. */
2685
+ if (cpu_has_cmov == -1)
2686
+ get_cpu_features();
2687
+
2688
+ if (cpu_has_cmov) {
2689
+ EMIT_MOV(compiler, TMP_REGISTER, 0, SLJIT_IMM, 1);
2690
+ /* a xor reg, reg operation would overwrite the flags. */
2691
+ EMIT_MOV(compiler, dst, 0, SLJIT_IMM, 0);
2692
+
2693
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 3);
2694
+ FAIL_IF(!inst);
2695
+ INC_SIZE(3);
2696
+
2697
+ *inst++ = GROUP_0F;
2698
+ /* cmovcc = setcc - 0x50. */
2699
+ *inst++ = cond_set - 0x50;
2700
+ *inst++ = MOD_REG | (reg_map[dst] << 3) | reg_map[TMP_REGISTER];
2701
+ return SLJIT_SUCCESS;
2702
+ }
2703
+
2704
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 1 + 3 + 3 + 1);
2705
+ FAIL_IF(!inst);
2706
+ INC_SIZE(1 + 3 + 3 + 1);
2707
+ *inst++ = XCHG_EAX_r + reg_map[TMP_REGISTER];
2708
+ /* Set al to conditional flag. */
2709
+ *inst++ = GROUP_0F;
2710
+ *inst++ = cond_set;
2711
+ *inst++ = MOD_REG | 0 /* eax */;
2712
+
2713
+ *inst++ = GROUP_0F;
2714
+ *inst++ = MOVZX_r_rm8;
2715
+ *inst++ = MOD_REG | (reg_map[dst] << 3) | 0 /* eax */;
2716
+ *inst++ = XCHG_EAX_r + reg_map[TMP_REGISTER];
2717
+ return SLJIT_SUCCESS;
2718
+ }
2719
+
2720
+ /* Set TMP_REGISTER to the bit. */
2721
+ inst = (sljit_ub*)ensure_buf(compiler, 1 + 1 + 3 + 3 + 1);
2722
+ FAIL_IF(!inst);
2723
+ INC_SIZE(1 + 3 + 3 + 1);
2724
+ *inst++ = XCHG_EAX_r + reg_map[TMP_REGISTER];
2725
+ /* Set al to conditional flag. */
2726
+ *inst++ = GROUP_0F;
2727
+ *inst++ = cond_set;
2728
+ *inst++ = MOD_REG | 0 /* eax */;
2729
+
2730
+ *inst++ = GROUP_0F;
2731
+ *inst++ = MOVZX_r_rm8;
2732
+ *inst++ = MOD_REG | (0 << 3) /* eax */ | 0 /* eax */;
2733
+
2734
+ *inst++ = XCHG_EAX_r + reg_map[TMP_REGISTER];
2735
+
2736
+ if (GET_OPCODE(op) < SLJIT_ADD)
2737
+ return emit_mov(compiler, dst, dstw, TMP_REGISTER, 0);
2738
+
2739
+ #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
2740
+ compiler->skip_checks = 1;
2741
+ #endif
2742
+ return sljit_emit_op2(compiler, op, dst_save, dstw_save, dst_save, dstw_save, TMP_REGISTER, 0);
2743
+ #endif /* SLJIT_CONFIG_X86_64 */
2744
+ }
2745
+
2746
+ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_local_base(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw, sljit_sw offset)
2747
+ {
2748
+ CHECK_ERROR();
2749
+ check_sljit_get_local_base(compiler, dst, dstw, offset);
2750
+ ADJUST_LOCAL_OFFSET(dst, dstw);
2751
+
2752
+ CHECK_EXTRA_REGS(dst, dstw, (void)0);
2753
+
2754
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
2755
+ compiler->mode32 = 0;
2756
+ #endif
2757
+
2758
+ ADJUST_LOCAL_OFFSET(SLJIT_MEM1(SLJIT_LOCALS_REG), offset);
2759
+
2760
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
2761
+ if (NOT_HALFWORD(offset)) {
2762
+ FAIL_IF(emit_load_imm64(compiler, TMP_REGISTER, offset));
2763
+ #if (defined SLJIT_DEBUG && SLJIT_DEBUG)
2764
+ SLJIT_ASSERT(emit_lea_binary(compiler, dst, dstw, SLJIT_LOCALS_REG, 0, TMP_REGISTER, 0) != SLJIT_ERR_UNSUPPORTED);
2765
+ return compiler->error;
2766
+ #else
2767
+ return emit_lea_binary(compiler, dst, dstw, SLJIT_LOCALS_REG, 0, TMP_REGISTER, 0);
2768
+ #endif
2769
+ }
2770
+ #endif
2771
+
2772
+ if (offset != 0)
2773
+ return emit_lea_binary(compiler, dst, dstw, SLJIT_LOCALS_REG, 0, SLJIT_IMM, offset);
2774
+ return emit_mov(compiler, dst, dstw, SLJIT_LOCALS_REG, 0);
2775
+ }
2776
+
2777
+ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw, sljit_sw init_value)
2778
+ {
2779
+ sljit_ub *inst;
2780
+ struct sljit_const *const_;
2781
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
2782
+ sljit_si reg;
2783
+ #endif
2784
+
2785
+ CHECK_ERROR_PTR();
2786
+ check_sljit_emit_const(compiler, dst, dstw, init_value);
2787
+ ADJUST_LOCAL_OFFSET(dst, dstw);
2788
+
2789
+ CHECK_EXTRA_REGS(dst, dstw, (void)0);
2790
+
2791
+ const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));
2792
+ PTR_FAIL_IF(!const_);
2793
+ set_const(const_, compiler);
2794
+
2795
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
2796
+ compiler->mode32 = 0;
2797
+ reg = (dst <= TMP_REGISTER) ? dst : TMP_REGISTER;
2798
+
2799
+ if (emit_load_imm64(compiler, reg, init_value))
2800
+ return NULL;
2801
+ #else
2802
+ if (dst == SLJIT_UNUSED)
2803
+ dst = TMP_REGISTER;
2804
+
2805
+ if (emit_mov(compiler, dst, dstw, SLJIT_IMM, init_value))
2806
+ return NULL;
2807
+ #endif
2808
+
2809
+ inst = (sljit_ub*)ensure_buf(compiler, 2);
2810
+ PTR_FAIL_IF(!inst);
2811
+
2812
+ *inst++ = 0;
2813
+ *inst++ = 1;
2814
+
2815
+ #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
2816
+ if (reg == TMP_REGISTER && dst != SLJIT_UNUSED)
2817
+ if (emit_mov(compiler, dst, dstw, TMP_REGISTER, 0))
2818
+ return NULL;
2819
+ #endif
2820
+
2821
+ return const_;
2822
+ }
2823
+
2824
+ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_addr)
2825
+ {
2826
+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
2827
+ *(sljit_sw*)addr = new_addr - (addr + 4);
2828
+ #else
2829
+ *(sljit_uw*)addr = new_addr;
2830
+ #endif
2831
+ }
2832
+
2833
+ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant)
2834
+ {
2835
+ *(sljit_sw*)addr = new_constant;
2836
+ }