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