johnson 1.2.0 → 2.0.0.pre0
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.
- data/CHANGELOG.rdoc +8 -0
- data/Manifest.txt +762 -48
- data/README.rdoc +2 -1
- data/Rakefile +90 -18
- data/ext/spidermonkey/conversions.c +9 -2
- data/ext/spidermonkey/ruby_land_proxy.c +1 -1
- data/ext/spidermonkey/runtime.h +1 -1
- data/ext/tracemonkey/context.cc +125 -0
- data/ext/tracemonkey/context.h +19 -0
- data/ext/tracemonkey/conversions.cc +365 -0
- data/ext/tracemonkey/conversions.h +32 -0
- data/ext/tracemonkey/debugger.cc +234 -0
- data/ext/tracemonkey/debugger.h +10 -0
- data/ext/tracemonkey/extconf.rb +37 -0
- data/ext/tracemonkey/extensions.cc +37 -0
- data/ext/tracemonkey/extensions.h +12 -0
- data/ext/tracemonkey/global.cc +40 -0
- data/ext/tracemonkey/global.h +11 -0
- data/ext/tracemonkey/idhash.cc +16 -0
- data/ext/tracemonkey/idhash.h +8 -0
- data/ext/tracemonkey/immutable_node.cc +1199 -0
- data/ext/tracemonkey/immutable_node.cc.erb +559 -0
- data/ext/tracemonkey/immutable_node.h +22 -0
- data/ext/tracemonkey/jroot.h +215 -0
- data/ext/tracemonkey/js_land_proxy.cc +620 -0
- data/ext/tracemonkey/js_land_proxy.h +20 -0
- data/ext/tracemonkey/ruby_land_proxy.cc +618 -0
- data/ext/tracemonkey/ruby_land_proxy.h +38 -0
- data/ext/tracemonkey/runtime.cc +454 -0
- data/ext/tracemonkey/runtime.h +27 -0
- data/ext/tracemonkey/split_global.cc +392 -0
- data/ext/tracemonkey/split_global.h +11 -0
- data/ext/tracemonkey/tracemonkey.cc +23 -0
- data/ext/tracemonkey/tracemonkey.h +32 -0
- data/lib/johnson.rb +12 -4
- data/lib/johnson/error.rb +5 -0
- data/lib/johnson/js/prelude.js +16 -1
- data/lib/johnson/parser.rb +2 -1
- data/lib/johnson/runtime.rb +87 -26
- data/lib/johnson/spidermonkey/runtime.rb +7 -16
- data/lib/johnson/tracemonkey.rb +13 -0
- data/lib/johnson/tracemonkey/context.rb +10 -0
- data/lib/johnson/tracemonkey/debugger.rb +67 -0
- data/lib/johnson/tracemonkey/immutable_node.rb +282 -0
- data/lib/johnson/tracemonkey/js_land_proxy.rb +64 -0
- data/lib/johnson/tracemonkey/mutable_tree_visitor.rb +242 -0
- data/lib/johnson/tracemonkey/ruby_land_proxy.rb +17 -0
- data/lib/johnson/tracemonkey/runtime.rb +80 -0
- data/test/{johnson_test.rb → generic/johnson_test.rb} +1 -1
- data/test/{parser_test.rb → generic/parser_test.rb} +1 -1
- data/test/helper.rb +23 -4
- data/test/johnson/{browser_test.rb → generic/browser_test.rb} +1 -1
- data/test/johnson/{conversions → generic/conversions}/array_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/boolean_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/callable_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/file_test.rb +1 -1
- data/test/johnson/generic/conversions/helper.rb +1 -0
- data/test/johnson/{conversions → generic/conversions}/nil_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/number_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/regexp_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/string_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/struct_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/symbol_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/thread_test.rb +1 -1
- data/test/johnson/{custom_conversions_test.rb → generic/custom_conversions_test.rb} +1 -1
- data/test/johnson/generic/default_test.rb +12 -0
- data/test/johnson/{error_test.rb → generic/error_test.rb} +1 -1
- data/test/johnson/{extensions_test.rb → generic/extensions_test.rb} +1 -1
- data/test/johnson/generic/helper.rb +1 -0
- data/test/johnson/{nodes → generic/nodes}/array_literal_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/array_node_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/binary_node_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/bracket_access_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/delete_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/do_while_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/dot_accessor_test.rb +1 -1
- data/test/johnson/generic/nodes/export_test.rb +11 -0
- data/test/johnson/{nodes → generic/nodes}/for_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/function_test.rb +1 -1
- data/test/johnson/generic/nodes/helper.rb +1 -0
- data/test/johnson/{nodes → generic/nodes}/if_test.rb +16 -6
- data/test/johnson/generic/nodes/import_test.rb +15 -0
- data/test/johnson/{nodes → generic/nodes}/label_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/let_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/object_literal_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/return_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/semi_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/switch_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/ternary_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/throw_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/try_node_test.rb +36 -6
- data/test/johnson/{nodes → generic/nodes}/typeof_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/unary_node_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/void_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/while_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/with_test.rb +1 -1
- data/test/johnson/{prelude_test.rb → generic/prelude_test.rb} +1 -1
- data/test/johnson/{runtime_test.rb → generic/runtime_test.rb} +3 -6
- data/test/johnson/generic/version_test.rb +13 -0
- data/test/johnson/{visitors → generic/visitors}/dot_visitor_test.rb +1 -1
- data/test/johnson/{visitors → generic/visitors}/enumerating_visitor_test.rb +1 -1
- data/test/johnson/generic/visitors/helper.rb +1 -0
- data/test/johnson/spidermonkey/js_land_proxy_test.rb +1 -5
- data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +11 -7
- data/test/johnson/tracemonkey/context_test.rb +21 -0
- data/test/johnson/tracemonkey/immutable_node_test.rb +34 -0
- data/test/johnson/tracemonkey/js_land_proxy_test.rb +273 -0
- data/test/johnson/tracemonkey/ruby_land_proxy_test.rb +274 -0
- data/test/johnson/tracemonkey/runtime_test.rb +41 -0
- data/test/johnson/tracemonkey/split_global_test.rb +32 -0
- data/vendor/spidermonkey/js.pkg +2 -0
- data/vendor/tracemonkey/Makefile.in +668 -0
- data/vendor/tracemonkey/Makefile.ref +483 -0
- data/vendor/tracemonkey/README.html +54 -0
- data/vendor/tracemonkey/SpiderMonkey.rsp +11 -0
- data/vendor/tracemonkey/Y.js +19 -0
- data/vendor/tracemonkey/aclocal.m4 +9 -0
- data/vendor/tracemonkey/bench.sh +5 -0
- data/vendor/tracemonkey/build/autoconf/acoutput-fast.pl +202 -0
- data/vendor/tracemonkey/build/autoconf/altoptions.m4 +154 -0
- data/vendor/tracemonkey/build/autoconf/config.guess +1537 -0
- data/vendor/tracemonkey/build/autoconf/config.sub +1595 -0
- data/vendor/tracemonkey/build/autoconf/install-sh +119 -0
- data/vendor/tracemonkey/build/autoconf/make-makefile +315 -0
- data/vendor/tracemonkey/build/autoconf/match-dir.sh +101 -0
- data/vendor/tracemonkey/build/autoconf/moznbytetype.m4 +136 -0
- data/vendor/tracemonkey/build/autoconf/nspr.m4 +82 -0
- data/vendor/tracemonkey/build/autoconf/pkg.m4 +59 -0
- data/vendor/tracemonkey/build/autoconf/update-makefile.sh +118 -0
- data/vendor/tracemonkey/build/cygwin-wrapper +75 -0
- data/vendor/tracemonkey/build/hcc +111 -0
- data/vendor/tracemonkey/build/hcpp +155 -0
- data/vendor/tracemonkey/build/unix/mddepend.pl +165 -0
- data/vendor/tracemonkey/build/unix/uniq.pl +63 -0
- data/vendor/tracemonkey/build/win32/pgomerge.py +40 -0
- data/vendor/tracemonkey/builtins.tbl +91 -0
- data/vendor/tracemonkey/call.js +13 -0
- data/vendor/tracemonkey/config.mk +206 -0
- data/vendor/tracemonkey/config/Makefile.in +106 -0
- data/vendor/tracemonkey/config/Moz/Milestone.pm +232 -0
- data/vendor/tracemonkey/config/autoconf.mk.in +362 -0
- data/vendor/tracemonkey/config/check-sync-dirs.py +103 -0
- data/vendor/tracemonkey/config/check-sync-exceptions +7 -0
- data/vendor/tracemonkey/config/config.mk +881 -0
- data/vendor/tracemonkey/config/fastcwd.pl +66 -0
- data/vendor/tracemonkey/config/gcc_hidden.h +2 -0
- data/vendor/tracemonkey/config/insure.mk +53 -0
- data/vendor/tracemonkey/config/make-system-wrappers.pl +59 -0
- data/vendor/tracemonkey/config/milestone.pl +112 -0
- data/vendor/tracemonkey/config/milestone.txt +13 -0
- data/vendor/tracemonkey/config/mkdepend/Makefile.in +84 -0
- data/vendor/tracemonkey/config/mkdepend/cppsetup.c +233 -0
- data/vendor/tracemonkey/config/mkdepend/def.h +184 -0
- data/vendor/tracemonkey/config/mkdepend/ifparser.c +551 -0
- data/vendor/tracemonkey/config/mkdepend/ifparser.h +83 -0
- data/vendor/tracemonkey/config/mkdepend/imakemdep.h +733 -0
- data/vendor/tracemonkey/config/mkdepend/include.c +337 -0
- data/vendor/tracemonkey/config/mkdepend/main.c +860 -0
- data/vendor/tracemonkey/config/mkdepend/mkdepend.man +382 -0
- data/vendor/tracemonkey/config/mkdepend/parse.c +686 -0
- data/vendor/tracemonkey/config/mkdepend/pr.c +124 -0
- data/vendor/tracemonkey/config/nfspwd.pl +50 -0
- data/vendor/tracemonkey/config/nsinstall.c +481 -0
- data/vendor/tracemonkey/config/nsinstall.py +155 -0
- data/vendor/tracemonkey/config/pathsub.c +247 -0
- data/vendor/tracemonkey/config/pathsub.h +74 -0
- data/vendor/tracemonkey/config/preprocessor.pl +671 -0
- data/vendor/tracemonkey/config/revdepth-nt.pl +48 -0
- data/vendor/tracemonkey/config/revdepth.pl +51 -0
- data/vendor/tracemonkey/config/rules.mk +2310 -0
- data/vendor/tracemonkey/config/static-checking-config.mk +21 -0
- data/vendor/tracemonkey/config/static-checking.js +92 -0
- data/vendor/tracemonkey/config/string-format.js +61 -0
- data/vendor/tracemonkey/config/system-headers +1035 -0
- data/vendor/tracemonkey/config/version.mk +85 -0
- data/vendor/tracemonkey/config/version_win.pl +442 -0
- data/vendor/tracemonkey/configure +14183 -0
- data/vendor/tracemonkey/configure.in +5363 -0
- data/vendor/tracemonkey/correct.sh +23 -0
- data/vendor/tracemonkey/correct/check-3d-morph.js +55 -0
- data/vendor/tracemonkey/correct/check-3d-raytrace.js +445 -0
- data/vendor/tracemonkey/correct/check-access-binary-trees.js +52 -0
- data/vendor/tracemonkey/correct/check-access-fannkuch.js +66 -0
- data/vendor/tracemonkey/correct/check-access-nbody.js +171 -0
- data/vendor/tracemonkey/correct/check-access-nsieve.js +40 -0
- data/vendor/tracemonkey/correct/check-bitops-3bit-bits-in-byte.js +35 -0
- data/vendor/tracemonkey/correct/check-bitops-bits-in-byte.js +24 -0
- data/vendor/tracemonkey/correct/check-bitops-bitwise-and.js +29 -0
- data/vendor/tracemonkey/correct/check-bitops-nsieve-bits.js +40 -0
- data/vendor/tracemonkey/correct/check-controlflow-recursive.js +27 -0
- data/vendor/tracemonkey/correct/check-date-format-tofte.js +302 -0
- data/vendor/tracemonkey/correct/check-date-format-xparb.js +421 -0
- data/vendor/tracemonkey/correct/check-mont.js +119 -0
- data/vendor/tracemonkey/dtoa.c +3335 -0
- data/vendor/tracemonkey/editline/Makefile.in +55 -0
- data/vendor/tracemonkey/editline/Makefile.ref +143 -0
- data/vendor/tracemonkey/editline/README +83 -0
- data/vendor/tracemonkey/editline/editline.3 +175 -0
- data/vendor/tracemonkey/editline/editline.c +1371 -0
- data/vendor/tracemonkey/editline/editline.h +135 -0
- data/vendor/tracemonkey/editline/sysunix.c +182 -0
- data/vendor/tracemonkey/editline/unix.h +82 -0
- data/vendor/tracemonkey/if.js +13 -0
- data/vendor/tracemonkey/imacro_asm.js.in +396 -0
- data/vendor/tracemonkey/imacros.c.out +1034 -0
- data/vendor/tracemonkey/imacros.jsasm +770 -0
- data/vendor/tracemonkey/javascript-trace.d +73 -0
- data/vendor/tracemonkey/jitstats.tbl +55 -0
- data/vendor/tracemonkey/js-config.h.in +82 -0
- data/vendor/tracemonkey/js-config.in +111 -0
- data/vendor/tracemonkey/js.mdp +0 -0
- data/vendor/tracemonkey/js.msg +312 -0
- data/vendor/tracemonkey/js3240.rc +79 -0
- data/vendor/tracemonkey/jsOS240.def +654 -0
- data/vendor/tracemonkey/jsapi.cpp +6005 -0
- data/vendor/tracemonkey/jsapi.h +2727 -0
- data/vendor/tracemonkey/jsarena.cpp +450 -0
- data/vendor/tracemonkey/jsarena.h +318 -0
- data/vendor/tracemonkey/jsarray.cpp +3664 -0
- data/vendor/tracemonkey/jsarray.h +238 -0
- data/vendor/tracemonkey/jsatom.cpp +1244 -0
- data/vendor/tracemonkey/jsatom.h +493 -0
- data/vendor/tracemonkey/jsbit.h +249 -0
- data/vendor/tracemonkey/jsbool.cpp +184 -0
- data/vendor/tracemonkey/jsbool.h +88 -0
- data/vendor/tracemonkey/jsbuiltins.cpp +415 -0
- data/vendor/tracemonkey/jsbuiltins.h +456 -0
- data/vendor/tracemonkey/jsclist.h +139 -0
- data/vendor/tracemonkey/jscntxt.cpp +1816 -0
- data/vendor/tracemonkey/jscntxt.h +1541 -0
- data/vendor/tracemonkey/jscompat.h +57 -0
- data/vendor/tracemonkey/jsconfig.mk +181 -0
- data/vendor/tracemonkey/jscpucfg.cpp +194 -0
- data/vendor/tracemonkey/jscpucfg.h +91 -0
- data/vendor/tracemonkey/jsdate.cpp +2465 -0
- data/vendor/tracemonkey/jsdate.h +129 -0
- data/vendor/tracemonkey/jsdbgapi.cpp +2017 -0
- data/vendor/tracemonkey/jsdbgapi.h +500 -0
- data/vendor/tracemonkey/jsdhash.cpp +876 -0
- data/vendor/tracemonkey/jsdhash.h +588 -0
- data/vendor/tracemonkey/jsdtoa.cpp +572 -0
- data/vendor/tracemonkey/jsdtoa.h +131 -0
- data/vendor/tracemonkey/jsdtracef.c +318 -0
- data/vendor/tracemonkey/jsdtracef.h +81 -0
- data/vendor/tracemonkey/jsemit.cpp +7292 -0
- data/vendor/tracemonkey/jsemit.h +802 -0
- data/vendor/tracemonkey/jsexn.cpp +1337 -0
- data/vendor/tracemonkey/jsexn.h +96 -0
- data/vendor/tracemonkey/jsfile.cpp +2747 -0
- data/vendor/tracemonkey/jsfile.h +56 -0
- data/vendor/tracemonkey/jsfile.msg +90 -0
- data/vendor/tracemonkey/jsfun.cpp +3089 -0
- data/vendor/tracemonkey/jsfun.h +366 -0
- data/vendor/tracemonkey/jsgc.cpp +3816 -0
- data/vendor/tracemonkey/jsgc.h +429 -0
- data/vendor/tracemonkey/jshash.cpp +477 -0
- data/vendor/tracemonkey/jshash.h +151 -0
- data/vendor/tracemonkey/jsify.pl +483 -0
- data/vendor/tracemonkey/jsinterp.cpp +7441 -0
- data/vendor/tracemonkey/jsinterp.h +666 -0
- data/vendor/tracemonkey/jsinvoke.cpp +42 -0
- data/vendor/tracemonkey/jsiter.cpp +1040 -0
- data/vendor/tracemonkey/jsiter.h +140 -0
- data/vendor/tracemonkey/jskeyword.tbl +124 -0
- data/vendor/tracemonkey/jskwgen.cpp +460 -0
- data/vendor/tracemonkey/jslibmath.h +69 -0
- data/vendor/tracemonkey/jslock.cpp +1512 -0
- data/vendor/tracemonkey/jslock.h +325 -0
- data/vendor/tracemonkey/jslocko.asm +60 -0
- data/vendor/tracemonkey/jslog2.cpp +111 -0
- data/vendor/tracemonkey/jslong.h +167 -0
- data/vendor/tracemonkey/jsmath.cpp +806 -0
- data/vendor/tracemonkey/jsmath.h +63 -0
- data/vendor/tracemonkey/jsnum.cpp +1374 -0
- data/vendor/tracemonkey/jsnum.h +280 -0
- data/vendor/tracemonkey/jsobj.cpp +6165 -0
- data/vendor/tracemonkey/jsobj.h +870 -0
- data/vendor/tracemonkey/json.cpp +1338 -0
- data/vendor/tracemonkey/json.h +108 -0
- data/vendor/tracemonkey/jsopcode.cpp +5484 -0
- data/vendor/tracemonkey/jsopcode.h +434 -0
- data/vendor/tracemonkey/jsopcode.tbl +591 -0
- data/vendor/tracemonkey/jsoplengen.cpp +121 -0
- data/vendor/tracemonkey/jsotypes.h +202 -0
- data/vendor/tracemonkey/jsparse.cpp +9257 -0
- data/vendor/tracemonkey/jsparse.h +900 -0
- data/vendor/tracemonkey/jsprf.cpp +1262 -0
- data/vendor/tracemonkey/jsprf.h +150 -0
- data/vendor/tracemonkey/jsproto.tbl +117 -0
- data/vendor/tracemonkey/jsprvtd.h +366 -0
- data/vendor/tracemonkey/jspubtd.h +585 -0
- data/vendor/tracemonkey/jsregexp.cpp +5051 -0
- data/vendor/tracemonkey/jsregexp.h +199 -0
- data/vendor/tracemonkey/jsreops.tbl +145 -0
- data/vendor/tracemonkey/jsscan.cpp +2040 -0
- data/vendor/tracemonkey/jsscan.h +467 -0
- data/vendor/tracemonkey/jsscope.cpp +1966 -0
- data/vendor/tracemonkey/jsscope.h +487 -0
- data/vendor/tracemonkey/jsscript.cpp +1932 -0
- data/vendor/tracemonkey/jsscript.h +345 -0
- data/vendor/tracemonkey/jsshell.msg +54 -0
- data/vendor/tracemonkey/jsstack.js +167 -0
- data/vendor/tracemonkey/jsstaticcheck.h +69 -0
- data/vendor/tracemonkey/jsstddef.h +87 -0
- data/vendor/tracemonkey/jsstdint.h +96 -0
- data/vendor/tracemonkey/jsstr.cpp +5277 -0
- data/vendor/tracemonkey/jsstr.h +702 -0
- data/vendor/tracemonkey/jstracer.cpp +10991 -0
- data/vendor/tracemonkey/jstracer.h +794 -0
- data/vendor/tracemonkey/jstypes.h +481 -0
- data/vendor/tracemonkey/jsutil.cpp +361 -0
- data/vendor/tracemonkey/jsutil.h +178 -0
- data/vendor/tracemonkey/jsversion.h +243 -0
- data/vendor/tracemonkey/jswince.asm +44 -0
- data/vendor/tracemonkey/jsxdrapi.cpp +800 -0
- data/vendor/tracemonkey/jsxdrapi.h +220 -0
- data/vendor/tracemonkey/jsxml.cpp +8327 -0
- data/vendor/tracemonkey/jsxml.h +305 -0
- data/vendor/tracemonkey/liveconnect/LiveConnect.dsp +157 -0
- data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsp +120 -0
- data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsw +44 -0
- data/vendor/tracemonkey/liveconnect/Makefile.in +105 -0
- data/vendor/tracemonkey/liveconnect/Makefile.ref +169 -0
- data/vendor/tracemonkey/liveconnect/README.html +712 -0
- data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSException.h +14 -0
- data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSObject.h +155 -0
- data/vendor/tracemonkey/liveconnect/classes/Makefile.in +89 -0
- data/vendor/tracemonkey/liveconnect/classes/Makefile.ref +57 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/Makefile.ref +47 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSException.java +140 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSObject.java +183 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSProxy.java +58 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSRunnable.java +70 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSUtil.java +59 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/Makefile.ref +53 -0
- data/vendor/tracemonkey/liveconnect/config/AIX4.1.mk +45 -0
- data/vendor/tracemonkey/liveconnect/config/AIX4.2.mk +45 -0
- data/vendor/tracemonkey/liveconnect/config/AIX4.3.mk +50 -0
- data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.10.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.20.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/HP-UXB.11.00.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/IRIX6.2.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/IRIX6.3.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/IRIX6.5.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/Linux_All.mk +73 -0
- data/vendor/tracemonkey/liveconnect/config/OSF1V4.0.mk +65 -0
- data/vendor/tracemonkey/liveconnect/config/OSF1V5.0.mk +62 -0
- data/vendor/tracemonkey/liveconnect/config/SunOS5.5.1.mk +55 -0
- data/vendor/tracemonkey/liveconnect/config/SunOS5.6.mk +39 -0
- data/vendor/tracemonkey/liveconnect/config/SunOS5.7.mk +39 -0
- data/vendor/tracemonkey/liveconnect/config/SunOS5.8.mk +39 -0
- data/vendor/tracemonkey/liveconnect/config/WINNT4.0.mk +53 -0
- data/vendor/tracemonkey/liveconnect/jsj.c +886 -0
- data/vendor/tracemonkey/liveconnect/jsj.msg +98 -0
- data/vendor/tracemonkey/liveconnect/jsj_JSObject.c +1377 -0
- data/vendor/tracemonkey/liveconnect/jsj_JavaArray.c +474 -0
- data/vendor/tracemonkey/liveconnect/jsj_JavaClass.c +737 -0
- data/vendor/tracemonkey/liveconnect/jsj_JavaMember.c +191 -0
- data/vendor/tracemonkey/liveconnect/jsj_JavaObject.c +1079 -0
- data/vendor/tracemonkey/liveconnect/jsj_JavaPackage.c +569 -0
- data/vendor/tracemonkey/liveconnect/jsj_array.c +207 -0
- data/vendor/tracemonkey/liveconnect/jsj_class.c +770 -0
- data/vendor/tracemonkey/liveconnect/jsj_convert.c +902 -0
- data/vendor/tracemonkey/liveconnect/jsj_field.c +421 -0
- data/vendor/tracemonkey/liveconnect/jsj_hash.c +488 -0
- data/vendor/tracemonkey/liveconnect/jsj_hash.h +161 -0
- data/vendor/tracemonkey/liveconnect/jsj_method.c +1825 -0
- data/vendor/tracemonkey/liveconnect/jsj_nodl.c +1 -0
- data/vendor/tracemonkey/liveconnect/jsj_private.h +677 -0
- data/vendor/tracemonkey/liveconnect/jsj_simpleapi.c +219 -0
- data/vendor/tracemonkey/liveconnect/jsj_utils.c +513 -0
- data/vendor/tracemonkey/liveconnect/jsjava.h +316 -0
- data/vendor/tracemonkey/liveconnect/netscape_javascript_JSObject.h +155 -0
- data/vendor/tracemonkey/liveconnect/nsCLiveconnect.cpp +785 -0
- data/vendor/tracemonkey/liveconnect/nsCLiveconnect.h +197 -0
- data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.cpp +118 -0
- data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.h +76 -0
- data/vendor/tracemonkey/liveconnect/nsILiveconnect.h +197 -0
- data/vendor/tracemonkey/liveconnect/nsISecureLiveconnect.h +94 -0
- data/vendor/tracemonkey/liveconnect/nsISecurityContext.h +136 -0
- data/vendor/tracemonkey/lock_SunOS.s +119 -0
- data/vendor/tracemonkey/mandelbrot-results.js +3 -0
- data/vendor/tracemonkey/math-partial-sums.js +32 -0
- data/vendor/tracemonkey/math-trace-tests.js +507 -0
- data/vendor/tracemonkey/md5.js +289 -0
- data/vendor/tracemonkey/nanojit/Assembler.cpp +1984 -0
- data/vendor/tracemonkey/nanojit/Assembler.h +375 -0
- data/vendor/tracemonkey/nanojit/Fragmento.cpp +651 -0
- data/vendor/tracemonkey/nanojit/Fragmento.h +237 -0
- data/vendor/tracemonkey/nanojit/LIR.cpp +2314 -0
- data/vendor/tracemonkey/nanojit/LIR.h +879 -0
- data/vendor/tracemonkey/nanojit/LIRopcode.tbl +252 -0
- data/vendor/tracemonkey/nanojit/Native.h +127 -0
- data/vendor/tracemonkey/nanojit/NativeARM.cpp +1742 -0
- data/vendor/tracemonkey/nanojit/NativeARM.h +844 -0
- data/vendor/tracemonkey/nanojit/NativeSparc.cpp +1130 -0
- data/vendor/tracemonkey/nanojit/NativeSparc.h +948 -0
- data/vendor/tracemonkey/nanojit/NativeThumb.cpp +1322 -0
- data/vendor/tracemonkey/nanojit/NativeThumb.h +525 -0
- data/vendor/tracemonkey/nanojit/Nativei386.cpp +1748 -0
- data/vendor/tracemonkey/nanojit/Nativei386.h +857 -0
- data/vendor/tracemonkey/nanojit/RegAlloc.cpp +183 -0
- data/vendor/tracemonkey/nanojit/RegAlloc.h +95 -0
- data/vendor/tracemonkey/nanojit/TraceTreeDrawer.cpp +306 -0
- data/vendor/tracemonkey/nanojit/TraceTreeDrawer.h +88 -0
- data/vendor/tracemonkey/nanojit/avmplus.cpp +56 -0
- data/vendor/tracemonkey/nanojit/avmplus.h +1016 -0
- data/vendor/tracemonkey/nanojit/nanojit.h +253 -0
- data/vendor/tracemonkey/perfect.js +39 -0
- data/vendor/tracemonkey/plify_jsdhash.sed +35 -0
- data/vendor/tracemonkey/prmjtime.cpp +869 -0
- data/vendor/tracemonkey/prmjtime.h +103 -0
- data/vendor/tracemonkey/ref-config/AIX4.1.mk +65 -0
- data/vendor/tracemonkey/ref-config/AIX4.2.mk +64 -0
- data/vendor/tracemonkey/ref-config/AIX4.3.mk +65 -0
- data/vendor/tracemonkey/ref-config/Darwin.mk +85 -0
- data/vendor/tracemonkey/ref-config/Darwin1.3.mk +81 -0
- data/vendor/tracemonkey/ref-config/Darwin1.4.mk +41 -0
- data/vendor/tracemonkey/ref-config/Darwin5.2.mk +81 -0
- data/vendor/tracemonkey/ref-config/Darwin5.3.mk +81 -0
- data/vendor/tracemonkey/ref-config/Darwin64.mk +72 -0
- data/vendor/tracemonkey/ref-config/HP-UXB.10.10.mk +77 -0
- data/vendor/tracemonkey/ref-config/HP-UXB.10.20.mk +77 -0
- data/vendor/tracemonkey/ref-config/HP-UXB.11.00.mk +80 -0
- data/vendor/tracemonkey/ref-config/IRIX.mk +87 -0
- data/vendor/tracemonkey/ref-config/IRIX5.3.mk +44 -0
- data/vendor/tracemonkey/ref-config/IRIX6.1.mk +44 -0
- data/vendor/tracemonkey/ref-config/IRIX6.2.mk +44 -0
- data/vendor/tracemonkey/ref-config/IRIX6.3.mk +44 -0
- data/vendor/tracemonkey/ref-config/IRIX6.5.mk +44 -0
- data/vendor/tracemonkey/ref-config/Linux_All.mk +105 -0
- data/vendor/tracemonkey/ref-config/Mac_OS10.0.mk +82 -0
- data/vendor/tracemonkey/ref-config/OSF1V4.0.mk +72 -0
- data/vendor/tracemonkey/ref-config/OSF1V5.0.mk +69 -0
- data/vendor/tracemonkey/ref-config/SunOS4.1.4.mk +101 -0
- data/vendor/tracemonkey/ref-config/SunOS5.10.mk +50 -0
- data/vendor/tracemonkey/ref-config/SunOS5.3.mk +91 -0
- data/vendor/tracemonkey/ref-config/SunOS5.4.mk +92 -0
- data/vendor/tracemonkey/ref-config/SunOS5.5.1.mk +44 -0
- data/vendor/tracemonkey/ref-config/SunOS5.5.mk +87 -0
- data/vendor/tracemonkey/ref-config/SunOS5.6.mk +89 -0
- data/vendor/tracemonkey/ref-config/SunOS5.7.mk +44 -0
- data/vendor/tracemonkey/ref-config/SunOS5.8.mk +44 -0
- data/vendor/tracemonkey/ref-config/SunOS5.9.mk +44 -0
- data/vendor/tracemonkey/ref-config/WINNT4.0.mk +118 -0
- data/vendor/tracemonkey/ref-config/WINNT5.0.mk +118 -0
- data/vendor/tracemonkey/ref-config/WINNT5.1.mk +118 -0
- data/vendor/tracemonkey/ref-config/WINNT5.2.mk +118 -0
- data/vendor/tracemonkey/ref-config/WINNT6.0.mk +118 -0
- data/vendor/tracemonkey/ref-config/dgux.mk +64 -0
- data/vendor/tracemonkey/resource.h +15 -0
- data/vendor/tracemonkey/rules.mk +206 -0
- data/vendor/tracemonkey/shell/Makefile.in +72 -0
- data/vendor/tracemonkey/shell/js.cpp +4719 -0
- data/vendor/tracemonkey/t/3d-cube.js +337 -0
- data/vendor/tracemonkey/t/3d-morph.js +54 -0
- data/vendor/tracemonkey/t/3d-raytrace.js +441 -0
- data/vendor/tracemonkey/t/access-binary-trees.js +50 -0
- data/vendor/tracemonkey/t/access-fannkuch.js +66 -0
- data/vendor/tracemonkey/t/access-nbody.js +169 -0
- data/vendor/tracemonkey/t/access-nsieve.js +38 -0
- data/vendor/tracemonkey/t/bitops-3bit-bits-in-byte.js +32 -0
- data/vendor/tracemonkey/t/bitops-bits-in-byte.js +21 -0
- data/vendor/tracemonkey/t/bitops-bitwise-and.js +28 -0
- data/vendor/tracemonkey/t/bitops-nsieve-bits.js +32 -0
- data/vendor/tracemonkey/t/controlflow-recursive.js +25 -0
- data/vendor/tracemonkey/t/crypto-aes.js +422 -0
- data/vendor/tracemonkey/t/crypto-md5.js +286 -0
- data/vendor/tracemonkey/t/crypto-sha1.js +224 -0
- data/vendor/tracemonkey/t/date-format-tofte.js +299 -0
- data/vendor/tracemonkey/t/date-format-xparb.js +417 -0
- data/vendor/tracemonkey/t/math-cordic.js +95 -0
- data/vendor/tracemonkey/t/math-partial-sums.js +33 -0
- data/vendor/tracemonkey/t/math-spectral-norm.js +51 -0
- data/vendor/tracemonkey/t/regexp-dna.js +1712 -0
- data/vendor/tracemonkey/t/string-base64.js +135 -0
- data/vendor/tracemonkey/t/string-fasta.js +85 -0
- data/vendor/tracemonkey/t/string-tagcloud.js +265 -0
- data/vendor/tracemonkey/t/string-unpack-code.js +68 -0
- data/vendor/tracemonkey/t/string-validate-input.js +89 -0
- data/vendor/tracemonkey/time.sh +13 -0
- data/vendor/tracemonkey/trace-test.js +5564 -0
- data/vendor/tracemonkey/v8/base.js +187 -0
- data/vendor/tracemonkey/v8/crypto.js +1689 -0
- data/vendor/tracemonkey/v8/deltablue.js +880 -0
- data/vendor/tracemonkey/v8/earley-boyer.js +4682 -0
- data/vendor/tracemonkey/v8/raytrace.js +3418 -0
- data/vendor/tracemonkey/v8/richards.js +539 -0
- data/vendor/tracemonkey/v8/run-crypto.js +44 -0
- data/vendor/tracemonkey/v8/run-deltablue.js +44 -0
- data/vendor/tracemonkey/v8/run-earley-boyer.js +44 -0
- data/vendor/tracemonkey/v8/run-raytrace.js +44 -0
- data/vendor/tracemonkey/v8/run-richards.js +44 -0
- data/vendor/tracemonkey/v8/run.js +49 -0
- data/vendor/tracemonkey/vprof/readme.txt +93 -0
- data/vendor/tracemonkey/vprof/vprof.cpp +360 -0
- data/vendor/tracemonkey/vprof/vprof.h +245 -0
- data/vendor/tracemonkey/xpconnect/Makefile.in +67 -0
- data/vendor/tracemonkey/xpconnect/crashtests/117307-1.html +20 -0
- data/vendor/tracemonkey/xpconnect/crashtests/193710.html +11 -0
- data/vendor/tracemonkey/xpconnect/crashtests/290162-1.html +5 -0
- data/vendor/tracemonkey/xpconnect/crashtests/326615-1.html +16 -0
- data/vendor/tracemonkey/xpconnect/crashtests/328553-1.html +13 -0
- data/vendor/tracemonkey/xpconnect/crashtests/346258-1.html +12 -0
- data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame1.xhtml +16 -0
- data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame2.xhtml +15 -0
- data/vendor/tracemonkey/xpconnect/crashtests/346512-1.xhtml +30 -0
- data/vendor/tracemonkey/xpconnect/crashtests/382133-1.html +3 -0
- data/vendor/tracemonkey/xpconnect/crashtests/386680-1.html +22 -0
- data/vendor/tracemonkey/xpconnect/crashtests/394810-1.html +4 -0
- data/vendor/tracemonkey/xpconnect/crashtests/400349-1.html +20 -0
- data/vendor/tracemonkey/xpconnect/crashtests/403356-1.html +13 -0
- data/vendor/tracemonkey/xpconnect/crashtests/418139-1.svg +22 -0
- data/vendor/tracemonkey/xpconnect/crashtests/420513-1.html +11 -0
- data/vendor/tracemonkey/xpconnect/crashtests/453935-1.html +37 -0
- data/vendor/tracemonkey/xpconnect/crashtests/462926.html +12 -0
- data/vendor/tracemonkey/xpconnect/crashtests/468552-1.html +18 -0
- data/vendor/tracemonkey/xpconnect/crashtests/471366-1.html +12 -0
- data/vendor/tracemonkey/xpconnect/crashtests/475185-1.html +13 -0
- data/vendor/tracemonkey/xpconnect/crashtests/475291-1.html +14 -0
- data/vendor/tracemonkey/xpconnect/crashtests/503286-1.html +23 -0
- data/vendor/tracemonkey/xpconnect/crashtests/crashtests.list +21 -0
- data/vendor/tracemonkey/xpconnect/idl/Makefile.in +78 -0
- data/vendor/tracemonkey/xpconnect/idl/XPCIDispatch.idl +51 -0
- data/vendor/tracemonkey/xpconnect/idl/mozIJSSubScriptLoader.idl +64 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIActiveXSecurityPolicy.idl +67 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIDispatchSupport.idl +119 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIJSContextStack.idl +85 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIJSRuntimeService.idl +51 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIScriptError.idl +102 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIScriptableInterfaces.idl +67 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptNotify.idl +66 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptable.idl +183 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIXPCSecurityManager.idl +114 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIXPConnect.idl +819 -0
- data/vendor/tracemonkey/xpconnect/idl/xpcIJSModuleLoader.idl +95 -0
- data/vendor/tracemonkey/xpconnect/idl/xpcIJSWeakReference.idl +49 -0
- data/vendor/tracemonkey/xpconnect/idl/xpccomponents.idl +254 -0
- data/vendor/tracemonkey/xpconnect/idl/xpcexception.idl +66 -0
- data/vendor/tracemonkey/xpconnect/idl/xpcjsid.idl +83 -0
- data/vendor/tracemonkey/xpconnect/loader/ISO8601DateUtils.jsm +176 -0
- data/vendor/tracemonkey/xpconnect/loader/Makefile.in +63 -0
- data/vendor/tracemonkey/xpconnect/loader/XPCOMUtils.jsm +267 -0
- data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.cpp +1717 -0
- data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.h +172 -0
- data/vendor/tracemonkey/xpconnect/loader/mozJSLoaderConstructors.h +101 -0
- data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.cpp +360 -0
- data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.h +66 -0
- data/vendor/tracemonkey/xpconnect/public/Makefile.in +54 -0
- data/vendor/tracemonkey/xpconnect/public/nsAXPCNativeCallContext.h +89 -0
- data/vendor/tracemonkey/xpconnect/public/nsAutoJSValHolder.h +168 -0
- data/vendor/tracemonkey/xpconnect/public/xpc_map_end.h +327 -0
- data/vendor/tracemonkey/xpconnect/sample/Makefile.in +71 -0
- data/vendor/tracemonkey/xpconnect/sample/README +39 -0
- data/vendor/tracemonkey/xpconnect/sample/xpcsample1.cpp +337 -0
- data/vendor/tracemonkey/xpconnect/sample/xpcsample1.idl +82 -0
- data/vendor/tracemonkey/xpconnect/sample/xpcsample1.js +21 -0
- data/vendor/tracemonkey/xpconnect/shell/Makefile.in +106 -0
- data/vendor/tracemonkey/xpconnect/shell/jsshell.msg +50 -0
- data/vendor/tracemonkey/xpconnect/shell/xpcshell.cpp +1817 -0
- data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.h +43 -0
- data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.mm +54 -0
- data/vendor/tracemonkey/xpconnect/src/Makefile.in +228 -0
- data/vendor/tracemonkey/xpconnect/src/README +3 -0
- data/vendor/tracemonkey/xpconnect/src/XPCCrossOriginWrapper.cpp +1186 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispConvert.cpp +593 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispInlines.h +667 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispInterface.cpp +383 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispObject.cpp +516 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispParamPropJSClass.cpp +223 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispParams.cpp +103 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispPrivate.h +1401 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispTearOff.cpp +547 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispTypeInfo.cpp +471 -0
- data/vendor/tracemonkey/xpconnect/src/XPCIDispatchClassInfo.cpp +139 -0
- data/vendor/tracemonkey/xpconnect/src/XPCIDispatchExtension.cpp +362 -0
- data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.cpp +1350 -0
- data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.h +88 -0
- data/vendor/tracemonkey/xpconnect/src/XPCSafeJSObjectWrapper.cpp +1148 -0
- data/vendor/tracemonkey/xpconnect/src/XPCSystemOnlyWrapper.cpp +718 -0
- data/vendor/tracemonkey/xpconnect/src/XPCWrapper.cpp +850 -0
- data/vendor/tracemonkey/xpconnect/src/XPCWrapper.h +394 -0
- data/vendor/tracemonkey/xpconnect/src/dom_quickstubs.qsconf +568 -0
- data/vendor/tracemonkey/xpconnect/src/nsDispatchSupport.cpp +348 -0
- data/vendor/tracemonkey/xpconnect/src/nsScriptError.cpp +201 -0
- data/vendor/tracemonkey/xpconnect/src/nsXPConnect.cpp +2609 -0
- data/vendor/tracemonkey/xpconnect/src/qsgen.py +1487 -0
- data/vendor/tracemonkey/xpconnect/src/xpc.msg +217 -0
- data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.cpp +148 -0
- data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.h +56 -0
- data/vendor/tracemonkey/xpconnect/src/xpccallcontext.cpp +579 -0
- data/vendor/tracemonkey/xpconnect/src/xpccomponents.cpp +4144 -0
- data/vendor/tracemonkey/xpconnect/src/xpccontext.cpp +115 -0
- data/vendor/tracemonkey/xpconnect/src/xpcconvert.cpp +2298 -0
- data/vendor/tracemonkey/xpconnect/src/xpcdebug.cpp +481 -0
- data/vendor/tracemonkey/xpconnect/src/xpcexception.cpp +502 -0
- data/vendor/tracemonkey/xpconnect/src/xpcforwards.h +114 -0
- data/vendor/tracemonkey/xpconnect/src/xpcinlines.h +772 -0
- data/vendor/tracemonkey/xpconnect/src/xpcjsid.cpp +1025 -0
- data/vendor/tracemonkey/xpconnect/src/xpcjsruntime.cpp +1342 -0
- data/vendor/tracemonkey/xpconnect/src/xpclog.cpp +128 -0
- data/vendor/tracemonkey/xpconnect/src/xpclog.h +101 -0
- data/vendor/tracemonkey/xpconnect/src/xpcmaps.cpp +761 -0
- data/vendor/tracemonkey/xpconnect/src/xpcmaps.h +713 -0
- data/vendor/tracemonkey/xpconnect/src/xpcmodule.cpp +136 -0
- data/vendor/tracemonkey/xpconnect/src/xpcprivate.h +4138 -0
- data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.cpp +1128 -0
- data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.h +480 -0
- data/vendor/tracemonkey/xpconnect/src/xpcruntimesvc.cpp +179 -0
- data/vendor/tracemonkey/xpconnect/src/xpcstack.cpp +342 -0
- data/vendor/tracemonkey/xpconnect/src/xpcstring.cpp +139 -0
- data/vendor/tracemonkey/xpconnect/src/xpcthreadcontext.cpp +599 -0
- data/vendor/tracemonkey/xpconnect/src/xpcthrower.cpp +399 -0
- data/vendor/tracemonkey/xpconnect/src/xpcvariant.cpp +850 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappedjs.cpp +670 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappedjsclass.cpp +2015 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappednative.cpp +3482 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeinfo.cpp +945 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappednativejsops.cpp +2003 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeproto.cpp +302 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappednativescope.cpp +991 -0
- data/vendor/tracemonkey/xpconnect/tests/Makefile.in +75 -0
- data/vendor/tracemonkey/xpconnect/tests/TestXPC.cpp +785 -0
- data/vendor/tracemonkey/xpconnect/tests/chrome/Makefile.in +51 -0
- data/vendor/tracemonkey/xpconnect/tests/chrome/test_bug500931.xul +43 -0
- data/vendor/tracemonkey/xpconnect/tests/components/Makefile.in +85 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_array.cpp +388 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_attributes.cpp +305 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_calljs.cpp +135 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_child.cpp +225 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_const.cpp +76 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_domstring.cpp +118 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_echo.cpp +616 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_in.cpp +204 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_inout.cpp +171 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_module.cpp +77 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_multiple.cpp +554 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_noisy.cpp +154 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_out.cpp +335 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_overloaded.cpp +250 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_private.h +192 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_string.cpp +185 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_variant.cpp +355 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.cpp +12 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.h +28 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCDispUtilities.h +28 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.cpp +86 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.def +9 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsp +318 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsw +29 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.idl +454 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.rc +145 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.cpp +44 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.h +56 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.cpp +221 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.h +53 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.cpp +699 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.h +138 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.cpp +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.h +41 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.cpp +256 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.h +88 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.cpp +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.h +43 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.cpp +29 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.h +45 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.cpp +177 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.h +50 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/resource.h +36 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Arrays/XPCIDispatchArrayTests.js +54 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Attributes/XPCIDispatchAttributeTests.js +150 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCIDispatchInstantiations.js +122 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCStress.js +58 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Methods/XPCIDispatchMethodTests.js +376 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/shell.js +377 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/General/XPCIDispatchTestWrappedJS.js +76 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/shell.js +377 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/exectests.cmd +1 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/jsDriver.pl +1288 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/Makefile.in +61 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest.idl +312 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest2.idl +51 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_attributes.idl +67 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_calljs.idl +59 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_const.idl +61 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_domstring.idl +59 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_in.idl +88 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_inout.idl +86 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_multiple.idl +77 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_out.idl +142 -0
- data/vendor/tracemonkey/xpconnect/tests/js/checkid.js +82 -0
- data/vendor/tracemonkey/xpconnect/tests/js/evaluate.js +311 -0
- data/vendor/tracemonkey/xpconnect/tests/js/exceptions-2.js +153 -0
- data/vendor/tracemonkey/xpconnect/tests/js/exceptions-3.js +194 -0
- data/vendor/tracemonkey/xpconnect/tests/js/exceptions-4.js +297 -0
- data/vendor/tracemonkey/xpconnect/tests/js/exceptions-5.js +343 -0
- data/vendor/tracemonkey/xpconnect/tests/js/exceptions.js +230 -0
- data/vendor/tracemonkey/xpconnect/tests/js/javascript.js +96 -0
- data/vendor/tracemonkey/xpconnect/tests/js/multiple-2.js +151 -0
- data/vendor/tracemonkey/xpconnect/tests/js/multiple-3.js +148 -0
- data/vendor/tracemonkey/xpconnect/tests/js/multiple-4.js +152 -0
- data/vendor/tracemonkey/xpconnect/tests/js/multiple.js +137 -0
- data/vendor/tracemonkey/xpconnect/tests/js/notscriptable.js +104 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/simpletest.js +36 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/speed.js +60 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/testxpc.js +464 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/threads.js +74 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/try.js +27 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_array.js +308 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_callcontext.js +68 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_echo.js +636 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_and_sort.js +28 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_constants.js +15 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_create.js +200 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_exceptions.js +167 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_ids.js +135 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_observer.js +36 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_overloaded.js +14 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_primitives.js +141 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_propertybag.js +36 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant.js +339 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant_array.js +30 -0
- data/vendor/tracemonkey/xpconnect/tests/js/readonlyattributes.js +74 -0
- data/vendor/tracemonkey/xpconnect/tests/js/readwriteattributes.js +101 -0
- data/vendor/tracemonkey/xpconnect/tests/js/scriptable.js +120 -0
- data/vendor/tracemonkey/xpconnect/tests/js/testin.js +203 -0
- data/vendor/tracemonkey/xpconnect/tests/js/xpcfun.js +234 -0
- data/vendor/tracemonkey/xpconnect/tests/js/xpctest_primitives.js +200 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/Makefile.in +66 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/bug500931_helper.html +7 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/inner.html +7 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug361111.xul +29 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug384632.html +32 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug390488.html +65 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug393269.html +46 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug396851.html +43 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug428021.html +41 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug446584.html +49 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug448587.html +31 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug462428.html +42 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug478438.html +66 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484107.html +100 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484459.html +36 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug500691.html +28 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_wrappers.html +116 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/bogus_element_type.jsm +1 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/bogus_exports_type.jsm +1 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/bug451678_subscript.js +2 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/component_import.js +144 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importA.jsm +44 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importB.jsm +45 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/syntax_error.jsm +1 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_bogus_files.js +88 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_bug408412.js +51 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_bug451678.js +52 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_bug_442086.js +68 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_import.js +127 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_js_weak_references.js +63 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_recursive_import.js +62 -0
- data/vendor/tracemonkey/xpconnect/tools/Makefile.in +49 -0
- data/vendor/tracemonkey/xpconnect/tools/idl/Makefile.in +53 -0
- data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsCompiler.idl +60 -0
- data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsProfiler.idl +57 -0
- data/vendor/tracemonkey/xpconnect/tools/js/CompileJSFiles.js +28 -0
- data/vendor/tracemonkey/xpconnect/tools/js/ListJSFiles.js +18 -0
- data/vendor/tracemonkey/xpconnect/tools/src/Makefile.in +76 -0
- data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsCompiler.cpp +161 -0
- data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsModule.cpp +65 -0
- data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsProfiler.cpp +370 -0
- data/vendor/tracemonkey/xpconnect/tools/src/xpctools_private.h +236 -0
- metadata +782 -107
- data/test/johnson/nodes/export_test.rb +0 -9
- data/test/johnson/nodes/import_test.rb +0 -13
- data/test/johnson/version_test.rb +0 -13
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
2
|
+
* vim: set ts=8 sw=4 et tw=0 ft=C:
|
|
3
|
+
*
|
|
4
|
+
* ***** BEGIN LICENSE BLOCK *****
|
|
5
|
+
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
6
|
+
*
|
|
7
|
+
* The contents of this file are subject to the Mozilla Public License Version
|
|
8
|
+
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
9
|
+
* the License. You may obtain a copy of the License at
|
|
10
|
+
* http://www.mozilla.org/MPL/
|
|
11
|
+
*
|
|
12
|
+
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
13
|
+
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
14
|
+
* for the specific language governing rights and limitations under the
|
|
15
|
+
* License.
|
|
16
|
+
*
|
|
17
|
+
* The Original Code is SpiderMonkey nanojit.
|
|
18
|
+
*
|
|
19
|
+
* The Initial Developer of the Original Code is
|
|
20
|
+
* the Mozilla Corporation.
|
|
21
|
+
* Portions created by the Initial Developer are Copyright (C) 2008
|
|
22
|
+
* the Initial Developer. All Rights Reserved.
|
|
23
|
+
*
|
|
24
|
+
* Contributor(s):
|
|
25
|
+
* Jeff Walden <jwalden+code@mit.edu>
|
|
26
|
+
*
|
|
27
|
+
* Alternatively, the contents of this file may be used under the terms of
|
|
28
|
+
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
|
29
|
+
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
30
|
+
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
31
|
+
* of those above. If you wish to allow use of your version of this file only
|
|
32
|
+
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
33
|
+
* use your version of this file under the terms of the MPL, indicate your
|
|
34
|
+
* decision by deleting the provisions above and replace them with the notice
|
|
35
|
+
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
36
|
+
* the provisions above, a recipient may use your version of this file under
|
|
37
|
+
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
38
|
+
*
|
|
39
|
+
* ***** END LICENSE BLOCK ***** */
|
|
40
|
+
|
|
41
|
+
/*
|
|
42
|
+
* Definitions of LIR opcodes. If you need to allocate an opcode, look
|
|
43
|
+
* for a name of the form unused* and claim it.
|
|
44
|
+
*
|
|
45
|
+
* Includers must define OPDEF and OPDEF64 macros of the following forms:
|
|
46
|
+
*
|
|
47
|
+
* #define OPDEF(op,val,operands) ...
|
|
48
|
+
* #define OPDEF64(op,val,operands) ...
|
|
49
|
+
*
|
|
50
|
+
* Selected arguments can then be used within the macro expansions.
|
|
51
|
+
*
|
|
52
|
+
* Field Description
|
|
53
|
+
* op Bytecode name, token-pasted after "LIR_" to form an LOpcode
|
|
54
|
+
* val Bytecode value, which is the LOpcode enumerator value
|
|
55
|
+
* operands Number of operands for this instruction
|
|
56
|
+
*
|
|
57
|
+
* This file is best viewed with 128 columns:
|
|
58
|
+
12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678
|
|
59
|
+
*/
|
|
60
|
+
|
|
61
|
+
/* op val name operands */
|
|
62
|
+
|
|
63
|
+
/* special operations (must be 0..N) */
|
|
64
|
+
OPDEF(start, 0, 0)
|
|
65
|
+
OPDEF(nearskip, 1, 0) // must be skip-1 and lsb=1
|
|
66
|
+
OPDEF(skip, 2, 0)
|
|
67
|
+
OPDEF(neartramp, 3, 0) // must be tramp-1 and lsb=1
|
|
68
|
+
OPDEF(tramp, 4, 0)
|
|
69
|
+
|
|
70
|
+
OPDEF(unused1, 5, 2)
|
|
71
|
+
OPDEF(unused2, 6, 2)
|
|
72
|
+
OPDEF(unused3, 7, 2)
|
|
73
|
+
OPDEF(unused4, 8, 2)
|
|
74
|
+
|
|
75
|
+
/* non-pure operations */
|
|
76
|
+
OPDEF(addp, 9, 2)
|
|
77
|
+
OPDEF(param, 10, 0)
|
|
78
|
+
OPDEF(st, 11, 2) // 32-bit store
|
|
79
|
+
OPDEF(ld, 12, 2) // 32-bit load
|
|
80
|
+
OPDEF(alloc, 13, 0) // alloca some stack space
|
|
81
|
+
OPDEF(sti, 14, 2)
|
|
82
|
+
OPDEF(ret, 15, 1)
|
|
83
|
+
OPDEF(live, 16, 1) // extend live range of reference
|
|
84
|
+
OPDEF(calli, 17, 0) // indirect call
|
|
85
|
+
OPDEF(call, 18, 0) // subroutine call returning a 32-bit value
|
|
86
|
+
|
|
87
|
+
/* guards */
|
|
88
|
+
OPDEF(loop, 19, 0) // loop fragment
|
|
89
|
+
OPDEF(x, 20, 0) // exit always
|
|
90
|
+
|
|
91
|
+
/* branches */
|
|
92
|
+
OPDEF(j, 21, 0) // jump always
|
|
93
|
+
OPDEF(jt, 22, 1) // jump true
|
|
94
|
+
OPDEF(jf, 23, 1) // jump false
|
|
95
|
+
OPDEF(label, 24, 0) // a jump target
|
|
96
|
+
OPDEF(ji, 25, 2) // jump indirect
|
|
97
|
+
/* operators */
|
|
98
|
+
|
|
99
|
+
/*
|
|
100
|
+
* NB: Opcodes ldcs through uge must remain continuous to aid in
|
|
101
|
+
* common-subexpression-elimination detection code.
|
|
102
|
+
*/
|
|
103
|
+
|
|
104
|
+
OPDEF(ldcs, 26, 2) // non-volatile 16-bit load
|
|
105
|
+
|
|
106
|
+
/*
|
|
107
|
+
* feq though fge must only be used on float arguments. They return integers.
|
|
108
|
+
* For all except feq, (op ^ 1) is the op which flips the
|
|
109
|
+
* left and right sides of the comparison, so (lt ^ 1) == gt, or the operator
|
|
110
|
+
* "<" is xored with 1 to get ">". Similarly, (op ^ 3) is the complement of
|
|
111
|
+
* op, so (lt ^ 1) == ge, or the complement of the operator "<" is ">=" xored
|
|
112
|
+
* with 3. NB: These opcodes must remain continuous so that comparison-opcode
|
|
113
|
+
* detection works correctly.
|
|
114
|
+
*/
|
|
115
|
+
OPDEF(feq, 27, 2) // floating-point equality [2 float inputs]
|
|
116
|
+
OPDEF(flt, 28, 2) // floating-point less than: arg1 < arg2
|
|
117
|
+
OPDEF(fgt, 29, 2) // floating-point greater than: arg1 > arg2
|
|
118
|
+
OPDEF(fle, 30, 2) // arg1 <= arg2, both floating-point
|
|
119
|
+
OPDEF(fge, 31, 2) // arg1 >= arg2, both floating-point
|
|
120
|
+
|
|
121
|
+
OPDEF(short, 32, 0) // constant 16-bit integer
|
|
122
|
+
OPDEF(int, 33, 0) // constant 32-bit integer
|
|
123
|
+
OPDEF(cmov, 34, 2) // conditional move (op1=cond, op2=cond(iftrue,iffalse))
|
|
124
|
+
OPDEF(ldc, 35, 2) // non-volatile load
|
|
125
|
+
|
|
126
|
+
// neg through ush are all integer operations
|
|
127
|
+
OPDEF(neg, 36, 1) // numeric negation [ 1 integer input / integer output ]
|
|
128
|
+
OPDEF(add, 37, 2) // integer addition [ 2 operand integer intputs / integer output ]
|
|
129
|
+
OPDEF(sub, 38, 2) // integer subtraction
|
|
130
|
+
OPDEF(mul, 39, 2) // integer multiplication
|
|
131
|
+
#if defined(NANOJIT_64BIT)
|
|
132
|
+
OPDEF(callh, 40, 0)
|
|
133
|
+
#else
|
|
134
|
+
OPDEF(callh, 40, 1)
|
|
135
|
+
#endif
|
|
136
|
+
OPDEF(and, 41, 2)
|
|
137
|
+
OPDEF(or, 42, 2)
|
|
138
|
+
OPDEF(xor, 43, 2)
|
|
139
|
+
OPDEF(not, 44, 1)
|
|
140
|
+
OPDEF(lsh, 45, 2)
|
|
141
|
+
OPDEF(rsh, 46, 2) // >>
|
|
142
|
+
OPDEF(ush, 47, 2) // >>>
|
|
143
|
+
|
|
144
|
+
// conditional guards, op^1 to complement. Only things that are
|
|
145
|
+
// isCond() can be passed to these.
|
|
146
|
+
OPDEF(xt, 48, 1) // exit if true 0x30 0011 0000
|
|
147
|
+
OPDEF(xf, 49, 1) // exit if false 0x31 0011 0001
|
|
148
|
+
|
|
149
|
+
// qlo and qhi take a single quad argument and return its low and high
|
|
150
|
+
// 32 bits respectively as 32-bit integers.
|
|
151
|
+
OPDEF(qlo, 50, 1)
|
|
152
|
+
OPDEF(qhi, 51, 1)
|
|
153
|
+
|
|
154
|
+
OPDEF(ldcb, 52, 2) // non-volatile 8-bit load
|
|
155
|
+
|
|
156
|
+
OPDEF(ov, 53, 1)
|
|
157
|
+
OPDEF(cs, 54, 1)
|
|
158
|
+
|
|
159
|
+
// Integer (all sizes) relational operators. (op ^ 1) is the op which flips the
|
|
160
|
+
// left and right sides of the comparison, so (lt ^ 1) == gt, or the operator
|
|
161
|
+
// "<" is xored with 1 to get ">". Similarly, (op ^ 3) is the complement of
|
|
162
|
+
// op, so (lt ^ 1) == ge, or the complement of the operator "<" is ">=" xored
|
|
163
|
+
// with 3. 'u' prefix indicates the unsigned integer variant.
|
|
164
|
+
// NB: These opcodes must remain continuous so that comparison-opcode detection
|
|
165
|
+
// works correctly.
|
|
166
|
+
OPDEF(eq, 55, 2) // integer equality
|
|
167
|
+
OPDEF(lt, 56, 2) // 0x38 0011 1000
|
|
168
|
+
OPDEF(gt, 57, 2) // 0x39 0011 1001
|
|
169
|
+
OPDEF(le, 58, 2) // 0x3A 0011 1010
|
|
170
|
+
OPDEF(ge, 59, 2) // 0x3B 0011 1011
|
|
171
|
+
OPDEF(ult, 60, 2) // 0x3C 0011 1100
|
|
172
|
+
OPDEF(ugt, 61, 2) // 0x3D 0011 1101
|
|
173
|
+
OPDEF(ule, 62, 2) // 0x3E 0011 1110
|
|
174
|
+
OPDEF(uge, 63, 2) // 0x3F 0011 1111
|
|
175
|
+
|
|
176
|
+
OPDEF64(2, 0, 2) // wraps a pair of refs
|
|
177
|
+
OPDEF64(file, 1, 2)
|
|
178
|
+
OPDEF64(line, 2, 2)
|
|
179
|
+
OPDEF64(xbarrier, 3, 1) // memory barrier (dummy guard)
|
|
180
|
+
OPDEF64(xtbl, 4, 1) // exit via indirect jump
|
|
181
|
+
|
|
182
|
+
OPDEF64(unused5_64, 5, 2)
|
|
183
|
+
OPDEF64(unused6_64, 6, 2)
|
|
184
|
+
OPDEF64(unused7_64, 7, 2)
|
|
185
|
+
OPDEF64(unused8_64, 8, 2)
|
|
186
|
+
OPDEF64(unused9_64, 9, 2)
|
|
187
|
+
OPDEF64(unused10_64, 10, 2)
|
|
188
|
+
|
|
189
|
+
OPDEF64(stq, LIR_st, 2) // quad store
|
|
190
|
+
OPDEF64(ldq, LIR_ld, 2) // quad load
|
|
191
|
+
|
|
192
|
+
OPDEF64(unused13_64, 13, 2)
|
|
193
|
+
|
|
194
|
+
OPDEF64(stqi, LIR_sti, 2)
|
|
195
|
+
OPDEF64(fret, LIR_ret, 1)
|
|
196
|
+
|
|
197
|
+
OPDEF64(unused16_64, 16, 2)
|
|
198
|
+
|
|
199
|
+
OPDEF64(fcalli, LIR_calli, 0)
|
|
200
|
+
OPDEF64(fcall, LIR_call, 0) // subroutine call returning quad
|
|
201
|
+
|
|
202
|
+
OPDEF64(unused19_64, 19, 2)
|
|
203
|
+
OPDEF64(unused20_64, 20, 2)
|
|
204
|
+
OPDEF64(unused21_64, 21, 2)
|
|
205
|
+
OPDEF64(unused22_64, 22, 2)
|
|
206
|
+
OPDEF64(unused23_64, 23, 2)
|
|
207
|
+
OPDEF64(qiand, 24, 2)
|
|
208
|
+
OPDEF64(qiadd, 25, 2)
|
|
209
|
+
OPDEF64(unused26_64, 26, 2)
|
|
210
|
+
OPDEF64(unused27_64, 27, 2)
|
|
211
|
+
OPDEF64(unused28_64, 28, 2)
|
|
212
|
+
OPDEF64(unused29_64, 29, 2)
|
|
213
|
+
OPDEF64(unused30_64, 30, 2)
|
|
214
|
+
OPDEF64(unused31_64, 31, 2)
|
|
215
|
+
OPDEF64(unused32_64, 32, 2)
|
|
216
|
+
|
|
217
|
+
OPDEF64(quad, LIR_int, 0) // quad constant value
|
|
218
|
+
OPDEF64(qcmov, LIR_cmov, 2)
|
|
219
|
+
OPDEF64(ldqc, LIR_ldc, 2)
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
/* floating-point arithmetic operations */
|
|
223
|
+
OPDEF64(fneg, LIR_neg, 1)
|
|
224
|
+
OPDEF64(fadd, LIR_add, 2)
|
|
225
|
+
OPDEF64(fsub, LIR_sub, 2)
|
|
226
|
+
OPDEF64(fmul, LIR_mul, 2)
|
|
227
|
+
OPDEF64(fdiv, 40, 2)
|
|
228
|
+
|
|
229
|
+
OPDEF64(qjoin, 41, 2)
|
|
230
|
+
OPDEF64(i2f, 42, 1) // convert an integer to a float
|
|
231
|
+
OPDEF64(u2f, 43, 1) // convert an unsigned integer to a float
|
|
232
|
+
OPDEF64(qior, 44, 2)
|
|
233
|
+
OPDEF64(qilsh, LIR_lsh, 2)
|
|
234
|
+
|
|
235
|
+
OPDEF64(unused46_64, 46, 2)
|
|
236
|
+
OPDEF64(unused47_64, 47, 2)
|
|
237
|
+
OPDEF64(unused48_64, 48, 2)
|
|
238
|
+
OPDEF64(unused49_64, 49, 2)
|
|
239
|
+
OPDEF64(unused50_64, 50, 2)
|
|
240
|
+
OPDEF64(unused51_64, 51, 2)
|
|
241
|
+
OPDEF64(unused52_64, 52, 2)
|
|
242
|
+
OPDEF64(unused53_64, 53, 2)
|
|
243
|
+
OPDEF64(unused54_64, 54, 2)
|
|
244
|
+
OPDEF64(unused55_64, 55, 2)
|
|
245
|
+
OPDEF64(unused56_64, 56, 2)
|
|
246
|
+
OPDEF64(unused57_64, 57, 2)
|
|
247
|
+
OPDEF64(unused58_64, 58, 2)
|
|
248
|
+
OPDEF64(unused59_64, 59, 2)
|
|
249
|
+
OPDEF64(unused60_64, 60, 2)
|
|
250
|
+
OPDEF64(unused61_64, 61, 2)
|
|
251
|
+
OPDEF64(unused62_64, 62, 2)
|
|
252
|
+
OPDEF64(unused63_64, 63, 2)
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/* -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 4 -*- */
|
|
2
|
+
/* ***** BEGIN LICENSE BLOCK *****
|
|
3
|
+
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
4
|
+
*
|
|
5
|
+
* The contents of this file are subject to the Mozilla Public License Version
|
|
6
|
+
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
7
|
+
* the License. You may obtain a copy of the License at
|
|
8
|
+
* http://www.mozilla.org/MPL/
|
|
9
|
+
*
|
|
10
|
+
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
11
|
+
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
12
|
+
* for the specific language governing rights and limitations under the
|
|
13
|
+
* License.
|
|
14
|
+
*
|
|
15
|
+
* The Original Code is [Open Source Virtual Machine].
|
|
16
|
+
*
|
|
17
|
+
* The Initial Developer of the Original Code is
|
|
18
|
+
* Adobe System Incorporated.
|
|
19
|
+
* Portions created by the Initial Developer are Copyright (C) 2004-2007
|
|
20
|
+
* the Initial Developer. All Rights Reserved.
|
|
21
|
+
*
|
|
22
|
+
* Contributor(s):
|
|
23
|
+
* Adobe AS3 Team
|
|
24
|
+
*
|
|
25
|
+
* Alternatively, the contents of this file may be used under the terms of
|
|
26
|
+
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
27
|
+
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
28
|
+
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
29
|
+
* of those above. If you wish to allow use of your version of this file only
|
|
30
|
+
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
31
|
+
* use your version of this file under the terms of the MPL, indicate your
|
|
32
|
+
* decision by deleting the provisions above and replace them with the notice
|
|
33
|
+
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
34
|
+
* the provisions above, a recipient may use your version of this file under
|
|
35
|
+
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
36
|
+
*
|
|
37
|
+
* ***** END LICENSE BLOCK ***** */
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
#ifndef __nanojit_Native__
|
|
41
|
+
#define __nanojit_Native__
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
#ifdef NANOJIT_IA32
|
|
45
|
+
#include "Nativei386.h"
|
|
46
|
+
#elif defined(NANOJIT_ARM)
|
|
47
|
+
#ifdef THUMB
|
|
48
|
+
#include "NativeThumb.h"
|
|
49
|
+
#else
|
|
50
|
+
#include "NativeARM.h"
|
|
51
|
+
#endif
|
|
52
|
+
#elif defined(NANOJIT_PPC)
|
|
53
|
+
#include "NativePpc.h"
|
|
54
|
+
#elif defined(NANOJIT_SPARC)
|
|
55
|
+
#include "NativeSparc.h"
|
|
56
|
+
#elif defined(NANOJIT_AMD64)
|
|
57
|
+
#include "NativeAMD64.h"
|
|
58
|
+
#else
|
|
59
|
+
#error "unknown nanojit architecture"
|
|
60
|
+
#endif
|
|
61
|
+
|
|
62
|
+
namespace nanojit {
|
|
63
|
+
const uint32_t NJ_PAGE_SIZE = 1 << NJ_LOG2_PAGE_SIZE;
|
|
64
|
+
|
|
65
|
+
class Fragment;
|
|
66
|
+
struct SideExit;
|
|
67
|
+
struct SwitchInfo;
|
|
68
|
+
|
|
69
|
+
struct GuardRecord
|
|
70
|
+
{
|
|
71
|
+
void* jmp;
|
|
72
|
+
GuardRecord* next;
|
|
73
|
+
SideExit* exit;
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
struct SideExit
|
|
77
|
+
{
|
|
78
|
+
GuardRecord* guards;
|
|
79
|
+
Fragment* from;
|
|
80
|
+
Fragment* target;
|
|
81
|
+
SwitchInfo* switchInfo;
|
|
82
|
+
|
|
83
|
+
void addGuard(GuardRecord* gr)
|
|
84
|
+
{
|
|
85
|
+
NanoAssert(gr->next == NULL);
|
|
86
|
+
NanoAssert(guards != gr);
|
|
87
|
+
gr->next = guards;
|
|
88
|
+
guards = gr;
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
#ifdef NJ_STACK_GROWTH_UP
|
|
94
|
+
#define stack_direction(n) n
|
|
95
|
+
#else
|
|
96
|
+
#define stack_direction(n) -n
|
|
97
|
+
#endif
|
|
98
|
+
|
|
99
|
+
#define isSPorFP(r) ( (r)==SP || (r)==FP )
|
|
100
|
+
|
|
101
|
+
#if defined(_MSC_VER) && _MSC_VER < 1400
|
|
102
|
+
static void asm_output(const char *f, ...) {}
|
|
103
|
+
#define gpn(r) regNames[(r)]
|
|
104
|
+
#define fpn(r) regNames[(r)]
|
|
105
|
+
#elif defined(NJ_VERBOSE)
|
|
106
|
+
#define asm_output(...) do {\
|
|
107
|
+
counter_increment(native);\
|
|
108
|
+
if (verbose_enabled()) {\
|
|
109
|
+
outline[0]='\0';\
|
|
110
|
+
if (outputAddr) sprintf(outline, " %10p ",_nIns);\
|
|
111
|
+
else sprintf(outline, " ");\
|
|
112
|
+
sprintf(&outline[14], ##__VA_ARGS__);\
|
|
113
|
+
Assembler::outputAlign(outline, 45);\
|
|
114
|
+
RegAlloc::formatRegisters(_allocator, outline, _thisfrag);\
|
|
115
|
+
Assembler::output_asm(outline);\
|
|
116
|
+
outputAddr=false; /* set =true if you like to see addresses for each native instruction */ \
|
|
117
|
+
}\
|
|
118
|
+
} while (0) /* no semi */
|
|
119
|
+
#define gpn(r) regNames[(r)]
|
|
120
|
+
#define fpn(r) regNames[(r)]
|
|
121
|
+
#else
|
|
122
|
+
#define asm_output(...)
|
|
123
|
+
#define gpn(r)
|
|
124
|
+
#define fpn(r)
|
|
125
|
+
#endif /* NJ_VERBOSE */
|
|
126
|
+
|
|
127
|
+
#endif // __nanojit_Native__
|
|
@@ -0,0 +1,1742 @@
|
|
|
1
|
+
/* -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*- */
|
|
2
|
+
/* ***** BEGIN LICENSE BLOCK *****
|
|
3
|
+
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
4
|
+
*
|
|
5
|
+
* The contents of this file are subject to the Mozilla Public License Version
|
|
6
|
+
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
7
|
+
* the License. You may obtain a copy of the License at
|
|
8
|
+
* http://www.mozilla.org/MPL/
|
|
9
|
+
*
|
|
10
|
+
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
11
|
+
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
12
|
+
* for the specific language governing rights and limitations under the
|
|
13
|
+
* License.
|
|
14
|
+
*
|
|
15
|
+
* The Original Code is [Open Source Virtual Machine].
|
|
16
|
+
*
|
|
17
|
+
* The Initial Developer of the Original Code is
|
|
18
|
+
* Adobe System Incorporated.
|
|
19
|
+
* Portions created by the Initial Developer are Copyright (C) 2004-2007
|
|
20
|
+
* the Initial Developer. All Rights Reserved.
|
|
21
|
+
*
|
|
22
|
+
* Contributor(s):
|
|
23
|
+
* Adobe AS3 Team
|
|
24
|
+
* Vladimir Vukicevic <vladimir@pobox.com>
|
|
25
|
+
*
|
|
26
|
+
* Alternatively, the contents of this file may be used under the terms of
|
|
27
|
+
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
28
|
+
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
29
|
+
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
30
|
+
* of those above. If you wish to allow use of your version of this file only
|
|
31
|
+
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
32
|
+
* use your version of this file under the terms of the MPL, indicate your
|
|
33
|
+
* decision by deleting the provisions above and replace them with the notice
|
|
34
|
+
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
35
|
+
* the provisions above, a recipient may use your version of this file under
|
|
36
|
+
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
37
|
+
*
|
|
38
|
+
* ***** END LICENSE BLOCK ***** */
|
|
39
|
+
|
|
40
|
+
#include "nanojit.h"
|
|
41
|
+
|
|
42
|
+
#ifdef AVMPLUS_PORTING_API
|
|
43
|
+
#include "portapi_nanojit.h"
|
|
44
|
+
#endif
|
|
45
|
+
|
|
46
|
+
#ifdef UNDER_CE
|
|
47
|
+
#include <cmnintrin.h>
|
|
48
|
+
#endif
|
|
49
|
+
|
|
50
|
+
#if defined(AVMPLUS_LINUX)
|
|
51
|
+
#include <signal.h>
|
|
52
|
+
#include <setjmp.h>
|
|
53
|
+
#include <asm/unistd.h>
|
|
54
|
+
extern "C" void __clear_cache(char *BEG, char *END);
|
|
55
|
+
#endif
|
|
56
|
+
|
|
57
|
+
// assume EABI, except under CE
|
|
58
|
+
#ifdef UNDER_CE
|
|
59
|
+
#undef NJ_ARM_EABI
|
|
60
|
+
#else
|
|
61
|
+
#define NJ_ARM_EABI
|
|
62
|
+
#endif
|
|
63
|
+
|
|
64
|
+
#ifdef FEATURE_NANOJIT
|
|
65
|
+
|
|
66
|
+
namespace nanojit
|
|
67
|
+
{
|
|
68
|
+
|
|
69
|
+
#ifdef NJ_VERBOSE
|
|
70
|
+
const char* regNames[] = {"r0","r1","r2","r3","r4","r5","r6","r7","r8","r9","r10","fp","ip","sp","lr","pc",
|
|
71
|
+
"d0","d1","d2","d3","d4","d5","d6","d7","s14"};
|
|
72
|
+
const char* condNames[] = {"eq","ne","cs","cc","mi","pl","vs","vc","hi","ls","ge","lt","gt","le",""/*al*/,"nv"};
|
|
73
|
+
const char* shiftNames[] = { "lsl", "lsl", "lsr", "lsr", "asr", "asr", "ror", "ror" };
|
|
74
|
+
#endif
|
|
75
|
+
|
|
76
|
+
const Register Assembler::argRegs[] = { R0, R1, R2, R3 };
|
|
77
|
+
const Register Assembler::retRegs[] = { R0, R1 };
|
|
78
|
+
const Register Assembler::savedRegs[] = { R4, R5, R6, R7, R8, R9, R10 };
|
|
79
|
+
|
|
80
|
+
void
|
|
81
|
+
Assembler::nInit(AvmCore*)
|
|
82
|
+
{
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
NIns*
|
|
86
|
+
Assembler::genPrologue()
|
|
87
|
+
{
|
|
88
|
+
/**
|
|
89
|
+
* Prologue
|
|
90
|
+
*/
|
|
91
|
+
|
|
92
|
+
// NJ_RESV_OFFSET is space at the top of the stack for us
|
|
93
|
+
// to use for parameter passing (8 bytes at the moment)
|
|
94
|
+
uint32_t stackNeeded = STACK_GRANULARITY * _activation.highwatermark + NJ_STACK_OFFSET;
|
|
95
|
+
uint32_t savingCount = 2;
|
|
96
|
+
|
|
97
|
+
uint32_t savingMask = rmask(FP) | rmask(LR);
|
|
98
|
+
|
|
99
|
+
if (!_thisfrag->lirbuf->explicitSavedRegs) {
|
|
100
|
+
for (int i = 0; i < NumSavedRegs; ++i)
|
|
101
|
+
savingMask |= rmask(savedRegs[i]);
|
|
102
|
+
savingCount += NumSavedRegs;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// so for alignment purposes we've pushed return addr and fp
|
|
106
|
+
uint32_t stackPushed = STACK_GRANULARITY * savingCount;
|
|
107
|
+
uint32_t aligned = alignUp(stackNeeded + stackPushed, NJ_ALIGN_STACK);
|
|
108
|
+
int32_t amt = aligned - stackPushed;
|
|
109
|
+
|
|
110
|
+
// Make room on stack for what we are doing
|
|
111
|
+
if (amt)
|
|
112
|
+
SUBi(SP, SP, amt);
|
|
113
|
+
|
|
114
|
+
verbose_only( verbose_outputf(" %p:",_nIns); )
|
|
115
|
+
verbose_only( verbose_output(" patch entry"); )
|
|
116
|
+
NIns *patchEntry = _nIns;
|
|
117
|
+
|
|
118
|
+
MOV(FP, SP);
|
|
119
|
+
PUSH_mask(savingMask);
|
|
120
|
+
return patchEntry;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
void
|
|
124
|
+
Assembler::nFragExit(LInsp guard)
|
|
125
|
+
{
|
|
126
|
+
SideExit* exit = guard->record()->exit;
|
|
127
|
+
Fragment *frag = exit->target;
|
|
128
|
+
GuardRecord *lr;
|
|
129
|
+
|
|
130
|
+
if (frag && frag->fragEntry) {
|
|
131
|
+
JMP_far(frag->fragEntry);
|
|
132
|
+
lr = 0;
|
|
133
|
+
} else {
|
|
134
|
+
// target doesn't exit yet. emit jump to epilog, and set up to patch later.
|
|
135
|
+
lr = guard->record();
|
|
136
|
+
|
|
137
|
+
// jump to the epilogue; JMP_far will insert an extra dummy insn for later
|
|
138
|
+
// patching.
|
|
139
|
+
JMP_far(_epilogue);
|
|
140
|
+
|
|
141
|
+
// stick the jmp pointer to the start of the sequence
|
|
142
|
+
lr->jmp = _nIns;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// pop the stack frame first
|
|
146
|
+
MOV(SP, FP);
|
|
147
|
+
|
|
148
|
+
#ifdef NJ_VERBOSE
|
|
149
|
+
if (_frago->core()->config.show_stats) {
|
|
150
|
+
// load R1 with Fragment *fromFrag, target fragment
|
|
151
|
+
// will make use of this when calling fragenter().
|
|
152
|
+
int fromfrag = int((Fragment*)_thisfrag);
|
|
153
|
+
LDi(argRegs[1], fromfrag);
|
|
154
|
+
}
|
|
155
|
+
#endif
|
|
156
|
+
|
|
157
|
+
// return value is GuardRecord*; note that this goes into
|
|
158
|
+
// R2, not R0 -- genEpilogue will move it into R0. Otherwise
|
|
159
|
+
// we want R0 to have the original value that it had at the
|
|
160
|
+
// start of trace.
|
|
161
|
+
LDi(R2, int(lr));
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
NIns*
|
|
165
|
+
Assembler::genEpilogue()
|
|
166
|
+
{
|
|
167
|
+
BX(LR); // return
|
|
168
|
+
|
|
169
|
+
RegisterMask savingMask = rmask(FP) | rmask(LR);
|
|
170
|
+
|
|
171
|
+
if (!_thisfrag->lirbuf->explicitSavedRegs)
|
|
172
|
+
for (int i = 0; i < NumSavedRegs; ++i)
|
|
173
|
+
savingMask |= rmask(savedRegs[i]);
|
|
174
|
+
|
|
175
|
+
POP_mask(savingMask); // regs
|
|
176
|
+
|
|
177
|
+
MOV(SP,FP);
|
|
178
|
+
|
|
179
|
+
// this is needed if we jump here from nFragExit
|
|
180
|
+
MOV(R0,R2); // return LinkRecord*
|
|
181
|
+
|
|
182
|
+
return _nIns;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/* gcc/linux use the ARM EABI; Windows CE uses the legacy abi.
|
|
186
|
+
*
|
|
187
|
+
* Under EABI:
|
|
188
|
+
* - doubles are 64-bit aligned both in registers and on the stack.
|
|
189
|
+
* If the next available argument register is R1, it is skipped
|
|
190
|
+
* and the double is placed in R2:R3. If R0:R1 or R2:R3 are not
|
|
191
|
+
* available, the double is placed on the stack, 64-bit aligned.
|
|
192
|
+
* - 32-bit arguments are placed in registers and 32-bit aligned
|
|
193
|
+
* on the stack.
|
|
194
|
+
*
|
|
195
|
+
* Under legacy ABI:
|
|
196
|
+
* - doubles are placed in subsequent arg registers; if the next
|
|
197
|
+
* available register is r3, the low order word goes into r3
|
|
198
|
+
* and the high order goes on the stack.
|
|
199
|
+
* - 32-bit arguments are placed in the next available arg register,
|
|
200
|
+
* - both doubles and 32-bit arguments are placed on stack with 32-bit
|
|
201
|
+
* alignment.
|
|
202
|
+
*/
|
|
203
|
+
|
|
204
|
+
void
|
|
205
|
+
Assembler::asm_arg(ArgSize sz, LInsp p, Register r)
|
|
206
|
+
{
|
|
207
|
+
// should never be called -- the ARM-specific longer form of
|
|
208
|
+
// asm_arg is used on ARM.
|
|
209
|
+
NanoAssert(0);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/*
|
|
213
|
+
* asm_arg will update r and stkd to indicate where the next
|
|
214
|
+
* argument should go. If r == UnknownReg, then the argument
|
|
215
|
+
* is placed on the stack at stkd, and stkd is updated.
|
|
216
|
+
*
|
|
217
|
+
* Note that this currently doesn't actually use stkd on input,
|
|
218
|
+
* except for figuring out alignment; it always pushes to SP.
|
|
219
|
+
* See TODO in asm_call.
|
|
220
|
+
*/
|
|
221
|
+
void
|
|
222
|
+
Assembler::asm_arg(ArgSize sz, LInsp arg, Register& r, int& stkd)
|
|
223
|
+
{
|
|
224
|
+
if (sz == ARGSIZE_F) {
|
|
225
|
+
#ifdef NJ_ARM_EABI
|
|
226
|
+
NanoAssert(r == UnknownReg || r == R0 || r == R2);
|
|
227
|
+
|
|
228
|
+
// if we're about to put this on the stack, make sure the
|
|
229
|
+
// stack is 64-bit aligned
|
|
230
|
+
if (r == UnknownReg && (stkd&7) != 0) {
|
|
231
|
+
SUBi(SP, SP, 4);
|
|
232
|
+
stkd += 4;
|
|
233
|
+
}
|
|
234
|
+
#endif
|
|
235
|
+
|
|
236
|
+
Reservation* argRes = getresv(arg);
|
|
237
|
+
|
|
238
|
+
// handle qjoin first; won't ever show up if VFP is available
|
|
239
|
+
if (arg->isop(LIR_qjoin)) {
|
|
240
|
+
asm_arg(ARGSIZE_LO, arg->oprnd1(), r, stkd);
|
|
241
|
+
asm_arg(ARGSIZE_LO, arg->oprnd2(), r, stkd);
|
|
242
|
+
} else if (!argRes || argRes->reg == UnknownReg || !AvmCore::config.vfp) {
|
|
243
|
+
// if we don't have a register allocated,
|
|
244
|
+
// or we're not vfp, just read from memory.
|
|
245
|
+
if (arg->isop(LIR_quad)) {
|
|
246
|
+
const int32_t* p = (const int32_t*) (arg-2);
|
|
247
|
+
|
|
248
|
+
// XXX use some load-multiple action here from our const pool?
|
|
249
|
+
for (int k = 0; k < 2; k++) {
|
|
250
|
+
if (r != UnknownReg) {
|
|
251
|
+
asm_ld_imm(r, *p++);
|
|
252
|
+
r = nextreg(r);
|
|
253
|
+
if (r == R4)
|
|
254
|
+
r = UnknownReg;
|
|
255
|
+
} else {
|
|
256
|
+
STR_preindex(IP, SP, -4);
|
|
257
|
+
asm_ld_imm(IP, *p++);
|
|
258
|
+
stkd += 4;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
} else {
|
|
262
|
+
int d = findMemFor(arg);
|
|
263
|
+
|
|
264
|
+
for (int k = 0; k < 2; k++) {
|
|
265
|
+
if (r != UnknownReg) {
|
|
266
|
+
LDR(r, FP, d + k*4);
|
|
267
|
+
r = nextreg(r);
|
|
268
|
+
if (r == R4)
|
|
269
|
+
r = UnknownReg;
|
|
270
|
+
} else {
|
|
271
|
+
STR_preindex(IP, SP, -4);
|
|
272
|
+
LDR(IP, FP, d + k*4);
|
|
273
|
+
stkd += 4;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
} else {
|
|
278
|
+
// handle the VFP with-register case
|
|
279
|
+
Register sr = argRes->reg;
|
|
280
|
+
if (r != UnknownReg && r < R3) {
|
|
281
|
+
FMRRD(r, nextreg(r), sr);
|
|
282
|
+
|
|
283
|
+
// make sure the next register is correct on return
|
|
284
|
+
if (r == R0)
|
|
285
|
+
r = R2;
|
|
286
|
+
else
|
|
287
|
+
r = UnknownReg;
|
|
288
|
+
} else if (r == R3) {
|
|
289
|
+
// legacy ABI only
|
|
290
|
+
STR_preindex(IP, SP, -4);
|
|
291
|
+
FMRDL(IP, sr);
|
|
292
|
+
FMRDH(r, sr);
|
|
293
|
+
stkd += 4;
|
|
294
|
+
|
|
295
|
+
r = UnknownReg;
|
|
296
|
+
} else {
|
|
297
|
+
FSTD(sr, SP, 0);
|
|
298
|
+
SUB(SP, SP, 8);
|
|
299
|
+
stkd += 8;
|
|
300
|
+
r = UnknownReg;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
} else if (sz == ARGSIZE_LO) {
|
|
304
|
+
if (r != UnknownReg) {
|
|
305
|
+
if (arg->isconst()) {
|
|
306
|
+
asm_ld_imm(r, arg->constval());
|
|
307
|
+
} else {
|
|
308
|
+
Reservation* argRes = getresv(arg);
|
|
309
|
+
if (argRes) {
|
|
310
|
+
if (argRes->reg == UnknownReg) {
|
|
311
|
+
// load it into the arg reg
|
|
312
|
+
int d = findMemFor(arg);
|
|
313
|
+
if (arg->isop(LIR_alloc)) {
|
|
314
|
+
asm_add_imm(r, FP, d);
|
|
315
|
+
} else {
|
|
316
|
+
LDR(r, FP, d);
|
|
317
|
+
}
|
|
318
|
+
} else {
|
|
319
|
+
MOV(r, argRes->reg);
|
|
320
|
+
}
|
|
321
|
+
} else {
|
|
322
|
+
findSpecificRegFor(arg, r);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
if (r < R3)
|
|
327
|
+
r = nextreg(r);
|
|
328
|
+
else
|
|
329
|
+
r = UnknownReg;
|
|
330
|
+
} else {
|
|
331
|
+
int d = findMemFor(arg);
|
|
332
|
+
STR_preindex(IP, SP, -4);
|
|
333
|
+
if (arg->isop(LIR_alloc)) {
|
|
334
|
+
asm_add_imm(IP, FP, d);
|
|
335
|
+
} else {
|
|
336
|
+
LDR(IP, FP, d);
|
|
337
|
+
}
|
|
338
|
+
stkd += 4;
|
|
339
|
+
}
|
|
340
|
+
} else {
|
|
341
|
+
NanoAssert(0);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
void
|
|
346
|
+
Assembler::asm_call(LInsp ins)
|
|
347
|
+
{
|
|
348
|
+
const CallInfo* call = ins->callInfo();
|
|
349
|
+
Reservation *callRes = getresv(ins);
|
|
350
|
+
|
|
351
|
+
uint32_t atypes = call->_argtypes;
|
|
352
|
+
uint32_t roffset = 0;
|
|
353
|
+
|
|
354
|
+
// skip return type
|
|
355
|
+
ArgSize rsize = (ArgSize)(atypes & 3);
|
|
356
|
+
|
|
357
|
+
atypes >>= 2;
|
|
358
|
+
|
|
359
|
+
// if we're using VFP, and the return type is a double,
|
|
360
|
+
// it'll come back in R0/R1. We need to either place it
|
|
361
|
+
// in the result fp reg, or store it.
|
|
362
|
+
|
|
363
|
+
if (AvmCore::config.vfp && rsize == ARGSIZE_F) {
|
|
364
|
+
NanoAssert(ins->opcode() == LIR_fcall);
|
|
365
|
+
NanoAssert(callRes);
|
|
366
|
+
|
|
367
|
+
Register rr = callRes->reg;
|
|
368
|
+
int d = disp(callRes);
|
|
369
|
+
freeRsrcOf(ins, rr != UnknownReg);
|
|
370
|
+
|
|
371
|
+
if (rr != UnknownReg) {
|
|
372
|
+
NanoAssert(IsFpReg(rr));
|
|
373
|
+
FMDRR(rr,R0,R1);
|
|
374
|
+
} else {
|
|
375
|
+
NanoAssert(d);
|
|
376
|
+
STR(R0, FP, d+0);
|
|
377
|
+
STR(R1, FP, d+4);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// make the call
|
|
382
|
+
BL((NIns*)(call->_address));
|
|
383
|
+
|
|
384
|
+
ArgSize sizes[MAXARGS];
|
|
385
|
+
uint32_t argc = call->get_sizes(sizes);
|
|
386
|
+
|
|
387
|
+
Register r = R0;
|
|
388
|
+
int stkd = 0;
|
|
389
|
+
|
|
390
|
+
// XXX TODO we should go through the args and figure out how much
|
|
391
|
+
// stack space we'll need, allocate it up front, and then do
|
|
392
|
+
// SP-relative stores using stkd instead of doing STR_preindex for
|
|
393
|
+
// every stack write like we currently do in asm_arg.
|
|
394
|
+
|
|
395
|
+
for(uint32_t i = 0; i < argc; i++) {
|
|
396
|
+
uint32_t j = argc - i - 1;
|
|
397
|
+
ArgSize sz = sizes[j];
|
|
398
|
+
LInsp arg = ins->arg(j);
|
|
399
|
+
|
|
400
|
+
NanoAssert(r < R4 || r == UnknownReg);
|
|
401
|
+
|
|
402
|
+
#ifdef NJ_ARM_EABI
|
|
403
|
+
if (sz == ARGSIZE_F) {
|
|
404
|
+
if (r == R1)
|
|
405
|
+
r = R2;
|
|
406
|
+
else if (r == R3)
|
|
407
|
+
r = UnknownReg;
|
|
408
|
+
}
|
|
409
|
+
#endif
|
|
410
|
+
|
|
411
|
+
asm_arg(sz, arg, r, stkd);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
void
|
|
416
|
+
Assembler::nMarkExecute(Page* page, int flags)
|
|
417
|
+
{
|
|
418
|
+
NanoAssert(sizeof(Page) == NJ_PAGE_SIZE);
|
|
419
|
+
#ifdef UNDER_CE
|
|
420
|
+
static const DWORD kProtFlags[4] = {
|
|
421
|
+
PAGE_READONLY, // 0
|
|
422
|
+
PAGE_READWRITE, // PAGE_WRITE
|
|
423
|
+
PAGE_EXECUTE_READ, // PAGE_EXEC
|
|
424
|
+
PAGE_EXECUTE_READWRITE // PAGE_EXEC|PAGE_WRITE
|
|
425
|
+
};
|
|
426
|
+
DWORD prot = kProtFlags[flags & (PAGE_WRITE|PAGE_EXEC)];
|
|
427
|
+
DWORD dwOld;
|
|
428
|
+
BOOL res = VirtualProtect(page, NJ_PAGE_SIZE, prot, &dwOld);
|
|
429
|
+
if (!res)
|
|
430
|
+
{
|
|
431
|
+
// todo: we can't abort or assert here, we have to fail gracefully.
|
|
432
|
+
NanoAssertMsg(false, "FATAL ERROR: VirtualProtect() failed\n");
|
|
433
|
+
}
|
|
434
|
+
#endif
|
|
435
|
+
#ifdef AVMPLUS_PORTING_API
|
|
436
|
+
NanoJIT_PortAPI_MarkExecutable(page, (void*)((char*)page+NJ_PAGE_SIZE), flags);
|
|
437
|
+
// todo, must add error-handling to the portapi
|
|
438
|
+
#endif
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
Register
|
|
442
|
+
Assembler::nRegisterAllocFromSet(int set)
|
|
443
|
+
{
|
|
444
|
+
// Note: The clz instruction only works on armv5 and up.
|
|
445
|
+
#if defined(UNDER_CE)
|
|
446
|
+
Register r;
|
|
447
|
+
r = (Register)_CountLeadingZeros(set);
|
|
448
|
+
r = (Register)(31-r);
|
|
449
|
+
_allocator.free &= ~rmask(r);
|
|
450
|
+
return r;
|
|
451
|
+
#elif defined(__ARMCC__)
|
|
452
|
+
register int i;
|
|
453
|
+
__asm { clz i,set }
|
|
454
|
+
Register r = Register(31-i);
|
|
455
|
+
_allocator.free &= ~rmask(r);
|
|
456
|
+
return r;
|
|
457
|
+
#else
|
|
458
|
+
// need to implement faster way
|
|
459
|
+
int i=0;
|
|
460
|
+
while (!(set & rmask((Register)i)))
|
|
461
|
+
i ++;
|
|
462
|
+
_allocator.free &= ~rmask((Register)i);
|
|
463
|
+
return (Register) i;
|
|
464
|
+
#endif
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
void
|
|
468
|
+
Assembler::nRegisterResetAll(RegAlloc& a)
|
|
469
|
+
{
|
|
470
|
+
// add scratch registers to our free list for the allocator
|
|
471
|
+
a.clear();
|
|
472
|
+
a.used = 0;
|
|
473
|
+
a.free =
|
|
474
|
+
rmask(R0) | rmask(R1) | rmask(R2) | rmask(R3) | rmask(R4) |
|
|
475
|
+
rmask(R5) | rmask(R6) | rmask(R7) | rmask(R8) | rmask(R9) |
|
|
476
|
+
rmask(R10);
|
|
477
|
+
if (AvmCore::config.vfp)
|
|
478
|
+
a.free |= FpRegs;
|
|
479
|
+
|
|
480
|
+
debug_only(a.managed = a.free);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
NIns*
|
|
484
|
+
Assembler::nPatchBranch(NIns* at, NIns* target)
|
|
485
|
+
{
|
|
486
|
+
// Patch the jump in a loop, as emitted by JMP_far.
|
|
487
|
+
// Figure out which, and do the right thing.
|
|
488
|
+
|
|
489
|
+
NIns* was = 0;
|
|
490
|
+
|
|
491
|
+
if (at[0] == (NIns)( COND_AL | (0x51<<20) | (PC<<16) | (PC<<12) | (4) )) {
|
|
492
|
+
// this needed to be emitted with a 32-bit immediate.
|
|
493
|
+
was = (NIns*) at[1];
|
|
494
|
+
} else {
|
|
495
|
+
// nope, just a regular PC-relative B; calculate the destination address
|
|
496
|
+
// based on at and the offset.
|
|
497
|
+
NanoAssert((at[0] & 0xff000000) == (COND_AL | (0xA<<24)));
|
|
498
|
+
was = (NIns*) (((intptr_t)at + 8) + (intptr_t)((at[0] & 0xffffff) << 2));
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
// let's see how we have to emit it
|
|
502
|
+
intptr_t offs = PC_OFFSET_FROM(target, at);
|
|
503
|
+
if (isS24(offs>>2)) {
|
|
504
|
+
// great, just stick it in at[0]
|
|
505
|
+
at[0] = (NIns)( COND_AL | (0xA<<24) | ((offs >> 2) & 0xffffff) );
|
|
506
|
+
// and reset at[1] for good measure
|
|
507
|
+
at[1] = BKPT_insn;
|
|
508
|
+
} else {
|
|
509
|
+
at[0] = (NIns)( COND_AL | (0x51<<20) | (PC<<16) | (PC<<12) | (4) );
|
|
510
|
+
at[1] = (NIns)(target);
|
|
511
|
+
}
|
|
512
|
+
VALGRIND_DISCARD_TRANSLATIONS(at, 2*sizeof(NIns));
|
|
513
|
+
|
|
514
|
+
#if defined(UNDER_CE)
|
|
515
|
+
// we changed the code, so we need to do this (sadly)
|
|
516
|
+
FlushInstructionCache(GetCurrentProcess(), NULL, NULL);
|
|
517
|
+
#elif defined(AVMPLUS_LINUX)
|
|
518
|
+
__clear_cache((char*)at, (char*)(at+3));
|
|
519
|
+
#endif
|
|
520
|
+
|
|
521
|
+
#ifdef AVMPLUS_PORTING_API
|
|
522
|
+
NanoJIT_PortAPI_FlushInstructionCache(at, at+3);
|
|
523
|
+
#endif
|
|
524
|
+
|
|
525
|
+
return was;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
RegisterMask
|
|
529
|
+
Assembler::hint(LIns* i, RegisterMask allow /* = ~0 */)
|
|
530
|
+
{
|
|
531
|
+
uint32_t op = i->opcode();
|
|
532
|
+
int prefer = ~0;
|
|
533
|
+
|
|
534
|
+
if (op==LIR_call || op==LIR_fcall)
|
|
535
|
+
prefer = rmask(R0);
|
|
536
|
+
else if (op == LIR_callh)
|
|
537
|
+
prefer = rmask(R1);
|
|
538
|
+
else if (op == LIR_param)
|
|
539
|
+
prefer = rmask(imm2register(i->imm8()));
|
|
540
|
+
|
|
541
|
+
if (_allocator.free & allow & prefer)
|
|
542
|
+
allow &= prefer;
|
|
543
|
+
return allow;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
void
|
|
547
|
+
Assembler::asm_qjoin(LIns *ins)
|
|
548
|
+
{
|
|
549
|
+
int d = findMemFor(ins);
|
|
550
|
+
NanoAssert(d);
|
|
551
|
+
LIns* lo = ins->oprnd1();
|
|
552
|
+
LIns* hi = ins->oprnd2();
|
|
553
|
+
|
|
554
|
+
Register r = findRegFor(hi, GpRegs);
|
|
555
|
+
STR(r, FP, d+4);
|
|
556
|
+
|
|
557
|
+
// okay if r gets recycled.
|
|
558
|
+
r = findRegFor(lo, GpRegs);
|
|
559
|
+
STR(r, FP, d);
|
|
560
|
+
freeRsrcOf(ins, false); // if we had a reg in use, emit a ST to flush it to mem
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
void
|
|
564
|
+
Assembler::asm_store32(LIns *value, int dr, LIns *base)
|
|
565
|
+
{
|
|
566
|
+
Reservation *rA, *rB;
|
|
567
|
+
Register ra, rb;
|
|
568
|
+
if (base->isop(LIR_alloc)) {
|
|
569
|
+
rb = FP;
|
|
570
|
+
dr += findMemFor(base);
|
|
571
|
+
ra = findRegFor(value, GpRegs);
|
|
572
|
+
} else {
|
|
573
|
+
findRegFor2(GpRegs, value, rA, base, rB);
|
|
574
|
+
ra = rA->reg;
|
|
575
|
+
rb = rB->reg;
|
|
576
|
+
}
|
|
577
|
+
STR(ra, rb, dr);
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
void
|
|
581
|
+
Assembler::asm_restore(LInsp i, Reservation *resv, Register r)
|
|
582
|
+
{
|
|
583
|
+
if (i->isop(LIR_alloc)) {
|
|
584
|
+
asm_add_imm(r, FP, disp(resv));
|
|
585
|
+
}
|
|
586
|
+
#if 0
|
|
587
|
+
/* This seriously regresses crypto-aes (by about 50%!), with or
|
|
588
|
+
* without the S8/U8 check (which ensures that we can do this
|
|
589
|
+
* const load in one instruction). I have no idea why, because a
|
|
590
|
+
* microbenchmark of const mov vs. loading from memory shows that
|
|
591
|
+
* the mov is faster, though not by much.
|
|
592
|
+
*/
|
|
593
|
+
else if (i->isconst() && (isS8(i->constval()) || isU8(i->constval()))) {
|
|
594
|
+
if (!resv->arIndex)
|
|
595
|
+
reserveFree(i);
|
|
596
|
+
asm_ld_imm(r, i->constval());
|
|
597
|
+
}
|
|
598
|
+
#endif
|
|
599
|
+
else {
|
|
600
|
+
int d = findMemFor(i);
|
|
601
|
+
if (IsFpReg(r)) {
|
|
602
|
+
if (isS8(d >> 2)) {
|
|
603
|
+
FLDD(r, FP, d);
|
|
604
|
+
} else {
|
|
605
|
+
FLDD(r, IP, 0);
|
|
606
|
+
ADDi(IP, FP, d);
|
|
607
|
+
}
|
|
608
|
+
} else {
|
|
609
|
+
LDR(r, FP, d);
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
verbose_only(
|
|
614
|
+
if (_verbose)
|
|
615
|
+
outputf(" restore %s",_thisfrag->lirbuf->names->formatRef(i));
|
|
616
|
+
)
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
void
|
|
620
|
+
Assembler::asm_spill(Register rr, int d, bool pop, bool quad)
|
|
621
|
+
{
|
|
622
|
+
(void) pop;
|
|
623
|
+
(void) quad;
|
|
624
|
+
if (d) {
|
|
625
|
+
if (IsFpReg(rr)) {
|
|
626
|
+
if (isS8(d >> 2)) {
|
|
627
|
+
FSTD(rr, FP, d);
|
|
628
|
+
} else {
|
|
629
|
+
FSTD(rr, IP, 0);
|
|
630
|
+
ADDi(IP, FP, d);
|
|
631
|
+
}
|
|
632
|
+
} else {
|
|
633
|
+
STR(rr, FP, d);
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
void
|
|
639
|
+
Assembler::asm_load64(LInsp ins)
|
|
640
|
+
{
|
|
641
|
+
///asm_output("<<< load64");
|
|
642
|
+
|
|
643
|
+
LIns* base = ins->oprnd1();
|
|
644
|
+
int offset = ins->oprnd2()->constval();
|
|
645
|
+
|
|
646
|
+
Reservation *resv = getresv(ins);
|
|
647
|
+
Register rr = resv->reg;
|
|
648
|
+
int d = disp(resv);
|
|
649
|
+
|
|
650
|
+
freeRsrcOf(ins, false);
|
|
651
|
+
|
|
652
|
+
if (AvmCore::config.vfp) {
|
|
653
|
+
Register rb = findRegFor(base, GpRegs);
|
|
654
|
+
|
|
655
|
+
NanoAssert(rb != UnknownReg);
|
|
656
|
+
NanoAssert(rr == UnknownReg || IsFpReg(rr));
|
|
657
|
+
|
|
658
|
+
if (rr != UnknownReg) {
|
|
659
|
+
if (!isS8(offset >> 2) || (offset&3) != 0) {
|
|
660
|
+
FLDD(rr,IP,0);
|
|
661
|
+
ADDi(IP, rb, offset);
|
|
662
|
+
} else {
|
|
663
|
+
FLDD(rr,rb,offset);
|
|
664
|
+
}
|
|
665
|
+
} else {
|
|
666
|
+
asm_mmq(FP, d, rb, offset);
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
// *(FP+dr) <- *(rb+db)
|
|
670
|
+
} else {
|
|
671
|
+
NanoAssert(resv->reg == UnknownReg && d != 0);
|
|
672
|
+
Register rb = findRegFor(base, GpRegs);
|
|
673
|
+
asm_mmq(FP, d, rb, offset);
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
//asm_output(">>> load64");
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
void
|
|
680
|
+
Assembler::asm_store64(LInsp value, int dr, LInsp base)
|
|
681
|
+
{
|
|
682
|
+
//asm_output("<<< store64 (dr: %d)", dr);
|
|
683
|
+
|
|
684
|
+
if (AvmCore::config.vfp) {
|
|
685
|
+
//Reservation *valResv = getresv(value);
|
|
686
|
+
Register rb = findRegFor(base, GpRegs);
|
|
687
|
+
|
|
688
|
+
if (value->isconstq()) {
|
|
689
|
+
const int32_t* p = (const int32_t*) (value-2);
|
|
690
|
+
|
|
691
|
+
underrunProtect(LD32_size*2 + 8);
|
|
692
|
+
|
|
693
|
+
// XXX use another reg, get rid of dependency
|
|
694
|
+
STR(IP, rb, dr);
|
|
695
|
+
LD32_nochk(IP, p[0]);
|
|
696
|
+
STR(IP, rb, dr+4);
|
|
697
|
+
LD32_nochk(IP, p[1]);
|
|
698
|
+
|
|
699
|
+
return;
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
Register rv = findRegFor(value, FpRegs);
|
|
703
|
+
|
|
704
|
+
NanoAssert(rb != UnknownReg);
|
|
705
|
+
NanoAssert(rv != UnknownReg);
|
|
706
|
+
|
|
707
|
+
Register baseReg = rb;
|
|
708
|
+
intptr_t baseOffset = dr;
|
|
709
|
+
|
|
710
|
+
if (!isS8(dr)) {
|
|
711
|
+
baseReg = IP;
|
|
712
|
+
baseOffset = 0;
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
FSTD(rv, baseReg, baseOffset);
|
|
716
|
+
|
|
717
|
+
if (!isS8(dr)) {
|
|
718
|
+
ADDi(IP, rb, dr);
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
// if it's a constant, make sure our baseReg/baseOffset location
|
|
722
|
+
// has the right value
|
|
723
|
+
if (value->isconstq()) {
|
|
724
|
+
const int32_t* p = (const int32_t*) (value-2);
|
|
725
|
+
|
|
726
|
+
underrunProtect(4*4);
|
|
727
|
+
asm_quad_nochk(rv, p);
|
|
728
|
+
}
|
|
729
|
+
} else {
|
|
730
|
+
int da = findMemFor(value);
|
|
731
|
+
Register rb = findRegFor(base, GpRegs);
|
|
732
|
+
asm_mmq(rb, dr, FP, da);
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
//asm_output(">>> store64");
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
// stick a quad into register rr, where p points to the two
|
|
739
|
+
// 32-bit parts of the quad, optinally also storing at FP+d
|
|
740
|
+
void
|
|
741
|
+
Assembler::asm_quad_nochk(Register rr, const int32_t* p)
|
|
742
|
+
{
|
|
743
|
+
// We're not going to use a slot, because it might be too far
|
|
744
|
+
// away. Instead, we're going to stick a branch in the stream to
|
|
745
|
+
// jump over the constants, and then load from a short PC relative
|
|
746
|
+
// offset.
|
|
747
|
+
|
|
748
|
+
// stream should look like:
|
|
749
|
+
// branch A
|
|
750
|
+
// p[0]
|
|
751
|
+
// p[1]
|
|
752
|
+
// A: FLDD PC-16
|
|
753
|
+
|
|
754
|
+
FLDD(rr, PC, -16);
|
|
755
|
+
|
|
756
|
+
*(--_nIns) = (NIns) p[1];
|
|
757
|
+
*(--_nIns) = (NIns) p[0];
|
|
758
|
+
|
|
759
|
+
JMP_nochk(_nIns+2);
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
void
|
|
763
|
+
Assembler::asm_quad(LInsp ins)
|
|
764
|
+
{
|
|
765
|
+
//asm_output(">>> asm_quad");
|
|
766
|
+
|
|
767
|
+
Reservation *res = getresv(ins);
|
|
768
|
+
int d = disp(res);
|
|
769
|
+
Register rr = res->reg;
|
|
770
|
+
|
|
771
|
+
NanoAssert(d || rr != UnknownReg);
|
|
772
|
+
|
|
773
|
+
const int32_t* p = (const int32_t*) (ins-2);
|
|
774
|
+
|
|
775
|
+
freeRsrcOf(ins, false);
|
|
776
|
+
|
|
777
|
+
if (AvmCore::config.vfp &&
|
|
778
|
+
rr != UnknownReg)
|
|
779
|
+
{
|
|
780
|
+
if (d)
|
|
781
|
+
FSTD(rr, FP, d);
|
|
782
|
+
|
|
783
|
+
underrunProtect(4*4);
|
|
784
|
+
asm_quad_nochk(rr, p);
|
|
785
|
+
} else {
|
|
786
|
+
STR(IP, FP, d+4);
|
|
787
|
+
asm_ld_imm(IP, p[1]);
|
|
788
|
+
STR(IP, FP, d);
|
|
789
|
+
asm_ld_imm(IP, p[0]);
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
//asm_output("<<< asm_quad");
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
void
|
|
796
|
+
Assembler::asm_nongp_copy(Register r, Register s)
|
|
797
|
+
{
|
|
798
|
+
if ((rmask(r) & FpRegs) && (rmask(s) & FpRegs)) {
|
|
799
|
+
// fp->fp
|
|
800
|
+
FCPYD(r, s);
|
|
801
|
+
} else if ((rmask(r) & GpRegs) && (rmask(s) & FpRegs)) {
|
|
802
|
+
// fp->gp
|
|
803
|
+
// who's doing this and why?
|
|
804
|
+
NanoAssert(0);
|
|
805
|
+
// FMRS(r, loSingleVfp(s));
|
|
806
|
+
} else {
|
|
807
|
+
NanoAssert(0);
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
Register
|
|
812
|
+
Assembler::asm_binop_rhs_reg(LInsp)
|
|
813
|
+
{
|
|
814
|
+
return UnknownReg;
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
/**
|
|
818
|
+
* copy 64 bits: (rd+dd) <- (rs+ds)
|
|
819
|
+
*/
|
|
820
|
+
void
|
|
821
|
+
Assembler::asm_mmq(Register rd, int dd, Register rs, int ds)
|
|
822
|
+
{
|
|
823
|
+
// value is either a 64bit struct or maybe a float
|
|
824
|
+
// that isn't live in an FPU reg. Either way, don't
|
|
825
|
+
// put it in an FPU reg just to load & store it.
|
|
826
|
+
|
|
827
|
+
// Don't use this with PC-relative loads; the registerAlloc might
|
|
828
|
+
// end up spilling a reg (and thus the offset could end up being
|
|
829
|
+
// bogus)!
|
|
830
|
+
NanoAssert(rs != PC);
|
|
831
|
+
|
|
832
|
+
// use both IP and a second scratch reg
|
|
833
|
+
Register t = registerAlloc(GpRegs & ~(rmask(rd)|rmask(rs)));
|
|
834
|
+
_allocator.addFree(t);
|
|
835
|
+
|
|
836
|
+
// XXX maybe figure out if we can use LDRD/STRD -- hard to
|
|
837
|
+
// ensure right register allocation
|
|
838
|
+
STR(IP, rd, dd+4);
|
|
839
|
+
STR(t, rd, dd);
|
|
840
|
+
LDR(IP, rs, ds+4);
|
|
841
|
+
LDR(t, rs, ds);
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
void
|
|
845
|
+
Assembler::nativePageReset()
|
|
846
|
+
{
|
|
847
|
+
_nSlot = 0;
|
|
848
|
+
_nExitSlot = 0;
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
void
|
|
852
|
+
Assembler::nativePageSetup()
|
|
853
|
+
{
|
|
854
|
+
if (!_nIns) _nIns = pageAlloc();
|
|
855
|
+
if (!_nExitIns) _nExitIns = pageAlloc(true);
|
|
856
|
+
//fprintf(stderr, "assemble onto %x exits into %x\n", (int)_nIns, (int)_nExitIns);
|
|
857
|
+
|
|
858
|
+
if (!_nSlot)
|
|
859
|
+
{
|
|
860
|
+
// This needs to be done or the samepage macro gets confused; pageAlloc
|
|
861
|
+
// gives us a pointer to just past the end of the page.
|
|
862
|
+
_nIns--;
|
|
863
|
+
_nExitIns--;
|
|
864
|
+
|
|
865
|
+
// constpool starts at top of page and goes down,
|
|
866
|
+
// code starts at bottom of page and moves up
|
|
867
|
+
_nSlot = pageDataStart(_nIns); //(int*)(&((Page*)pageTop(_nIns))->lir[0]);
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
// Note: underrunProtect should not touch any registers, even IP; it
|
|
872
|
+
// might need to allocate a new page in the middle of an IP-using
|
|
873
|
+
// sequence.
|
|
874
|
+
void
|
|
875
|
+
Assembler::underrunProtect(int bytes)
|
|
876
|
+
{
|
|
877
|
+
NanoAssertMsg(bytes<=LARGEST_UNDERRUN_PROT, "constant LARGEST_UNDERRUN_PROT is too small");
|
|
878
|
+
intptr_t u = bytes + sizeof(PageHeader)/sizeof(NIns) + 8;
|
|
879
|
+
if ( (samepage(_nIns,_nSlot) && (((intptr_t)_nIns-u) <= intptr_t(_nSlot+1))) ||
|
|
880
|
+
(!samepage((intptr_t)_nIns-u,_nIns)) )
|
|
881
|
+
{
|
|
882
|
+
NIns* target = _nIns;
|
|
883
|
+
|
|
884
|
+
_nIns = pageAlloc(_inExit);
|
|
885
|
+
|
|
886
|
+
// XXX _nIns at this point points to one past the end of
|
|
887
|
+
// the page, intended to be written into using *(--_nIns).
|
|
888
|
+
// However, (guess) something seems to be storing the value
|
|
889
|
+
// of _nIns as is, and then later generating a jump to a bogus
|
|
890
|
+
// address. So pre-decrement to ensure that it's always
|
|
891
|
+
// valid; we end up skipping using the last instruction this
|
|
892
|
+
// way.
|
|
893
|
+
_nIns--;
|
|
894
|
+
|
|
895
|
+
// Update slot, either to _nIns (if decremented above), or
|
|
896
|
+
// _nIns-1 once the above bug is fixed/found.
|
|
897
|
+
_nSlot = pageDataStart(_nIns);
|
|
898
|
+
|
|
899
|
+
// If samepage() is used on _nIns and _nSlot, it'll fail, since _nIns
|
|
900
|
+
// points to one past the end of the page right now. Assume that
|
|
901
|
+
// JMP_nochk won't ever try to write to _nSlot, and so won't ever
|
|
902
|
+
// check samepage(). See B_cond_chk macro.
|
|
903
|
+
JMP_nochk(target);
|
|
904
|
+
} else if (!_nSlot) {
|
|
905
|
+
// make sure that there's always a slot pointer
|
|
906
|
+
_nSlot = pageDataStart(_nIns);
|
|
907
|
+
}
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
void
|
|
911
|
+
Assembler::JMP_far(NIns* addr)
|
|
912
|
+
{
|
|
913
|
+
// we may have to stick an immediate into the stream, so always
|
|
914
|
+
// reserve space
|
|
915
|
+
underrunProtect(8);
|
|
916
|
+
|
|
917
|
+
intptr_t offs = PC_OFFSET_FROM(addr,_nIns-2);
|
|
918
|
+
|
|
919
|
+
if (isS24(offs>>2)) {
|
|
920
|
+
BKPT_nochk();
|
|
921
|
+
*(--_nIns) = (NIns)( COND_AL | (0xA<<24) | ((offs>>2) & 0xFFFFFF) );
|
|
922
|
+
|
|
923
|
+
asm_output("b %p", addr);
|
|
924
|
+
} else {
|
|
925
|
+
// the address
|
|
926
|
+
*(--_nIns) = (NIns)((addr));
|
|
927
|
+
// ldr pc, [pc - #4] // load the address into pc, reading it from [pc-4] (e.g.,
|
|
928
|
+
// the next instruction)
|
|
929
|
+
*(--_nIns) = (NIns)( COND_AL | (0x51<<20) | (PC<<16) | (PC<<12) | (4));
|
|
930
|
+
|
|
931
|
+
asm_output("b %p (32-bit)", addr);
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
void
|
|
936
|
+
Assembler::BL(NIns* addr)
|
|
937
|
+
{
|
|
938
|
+
intptr_t offs = PC_OFFSET_FROM(addr,_nIns-1);
|
|
939
|
+
|
|
940
|
+
//fprintf (stderr, "BL: 0x%x (offs: %d [%x]) @ 0x%08x\n", addr, offs, offs, (intptr_t)(_nIns-1));
|
|
941
|
+
|
|
942
|
+
// try to do this with a single S24 call
|
|
943
|
+
if (isS24(offs>>2)) {
|
|
944
|
+
underrunProtect(4);
|
|
945
|
+
|
|
946
|
+
// recompute offset in case underrunProtect had to allocate a new page.
|
|
947
|
+
offs = PC_OFFSET_FROM(addr,_nIns-1);
|
|
948
|
+
*(--_nIns) = (NIns)( COND_AL | (0xB<<24) | ((offs>>2) & 0xFFFFFF) );
|
|
949
|
+
|
|
950
|
+
asm_output("bl %p", addr);
|
|
951
|
+
} else {
|
|
952
|
+
underrunProtect(12);
|
|
953
|
+
|
|
954
|
+
// the address
|
|
955
|
+
*(--_nIns) = (NIns)((addr));
|
|
956
|
+
// ldr pc, [pc - #4] // load the address into ip, reading it from [pc-4]
|
|
957
|
+
*(--_nIns) = (NIns)( COND_AL | (0x51<<20) | (PC<<16) | (PC<<12) | (4));
|
|
958
|
+
// add lr, pc, #4 // set lr to be past the address that we wrote
|
|
959
|
+
*(--_nIns) = (NIns)( COND_AL | OP_IMM | (1<<23) | (PC<<16) | (LR<<12) | (4) );
|
|
960
|
+
|
|
961
|
+
asm_output("bl %p (32-bit)", addr);
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
void
|
|
966
|
+
Assembler::LD32_nochk(Register r, int32_t imm)
|
|
967
|
+
{
|
|
968
|
+
if (imm == 0) {
|
|
969
|
+
EOR(r, r, r);
|
|
970
|
+
return;
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
if (AvmCore::config.v6t2) {
|
|
974
|
+
// We can just emit a movw/movt pair
|
|
975
|
+
// the movt is only necessary if the high 16 bits are nonzero
|
|
976
|
+
if (((imm >> 16) & 0xFFFF) != 0)
|
|
977
|
+
MOVT(r, (imm >> 16) & 0xFFFF);
|
|
978
|
+
MOVW(r, imm & 0xFFFF);
|
|
979
|
+
return;
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
// We should always reach the const pool, since it's on the same page (<4096);
|
|
983
|
+
// if we can't, someone didn't underrunProtect enough.
|
|
984
|
+
|
|
985
|
+
*(++_nSlot) = (int)imm;
|
|
986
|
+
|
|
987
|
+
//fprintf (stderr, "wrote slot(2) %p with %08x, jmp @ %p\n", _nSlot, (intptr_t)imm, _nIns-1);
|
|
988
|
+
|
|
989
|
+
int offset = PC_OFFSET_FROM(_nSlot,_nIns-1);
|
|
990
|
+
|
|
991
|
+
NanoAssert(isS12(offset) && (offset < 0));
|
|
992
|
+
|
|
993
|
+
asm_output(" (%d(PC) = 0x%x)", offset, imm);
|
|
994
|
+
|
|
995
|
+
LDR_nochk(r,PC,offset);
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
void
|
|
999
|
+
Assembler::asm_ldr_chk(Register d, Register b, int32_t off, bool chk)
|
|
1000
|
+
{
|
|
1001
|
+
if (IsFpReg(d)) {
|
|
1002
|
+
FLDD_chk(d,b,off,chk);
|
|
1003
|
+
return;
|
|
1004
|
+
}
|
|
1005
|
+
|
|
1006
|
+
if (off > -4096 && off < 4096) {
|
|
1007
|
+
if (chk) underrunProtect(4);
|
|
1008
|
+
*(--_nIns) = (NIns)( COND_AL | ((off < 0 ? 0x51 : 0x59)<<20) | (b<<16) | (d<<12) | ((off < 0 ? -off : off)&0xFFF) );
|
|
1009
|
+
} else {
|
|
1010
|
+
if (chk) underrunProtect(4+LD32_size);
|
|
1011
|
+
NanoAssert(b != IP);
|
|
1012
|
+
*(--_nIns) = (NIns)( COND_AL | (0x79<<20) | (b<<16) | (d<<12) | IP );
|
|
1013
|
+
LD32_nochk(IP, off);
|
|
1014
|
+
}
|
|
1015
|
+
|
|
1016
|
+
asm_output("ldr %s, [%s, #%d]",gpn(d),gpn(b),(off));
|
|
1017
|
+
}
|
|
1018
|
+
|
|
1019
|
+
void
|
|
1020
|
+
Assembler::asm_ld_imm(Register d, int32_t imm)
|
|
1021
|
+
{
|
|
1022
|
+
if (imm == 0) {
|
|
1023
|
+
EOR(d, d, d);
|
|
1024
|
+
} else if (isS8(imm) || isU8(imm)) {
|
|
1025
|
+
underrunProtect(4);
|
|
1026
|
+
if (imm < 0)
|
|
1027
|
+
*(--_nIns) = (NIns)( COND_AL | 0x3E<<20 | d<<12 | (imm^0xFFFFFFFF)&0xFF );
|
|
1028
|
+
else
|
|
1029
|
+
*(--_nIns) = (NIns)( COND_AL | 0x3B<<20 | d<<12 | imm&0xFF );
|
|
1030
|
+
asm_output("ld %s,0x%x",gpn(d), imm);
|
|
1031
|
+
} else {
|
|
1032
|
+
underrunProtect(LD32_size);
|
|
1033
|
+
LD32_nochk(d, imm);
|
|
1034
|
+
}
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1037
|
+
// Branch to target address _t with condition _c, doing underrun
|
|
1038
|
+
// checks (_chk == 1) or skipping them (_chk == 0).
|
|
1039
|
+
//
|
|
1040
|
+
// If the jump fits in a relative jump (+/-32MB), emit that.
|
|
1041
|
+
// If the jump is unconditional, emit the dest address inline in
|
|
1042
|
+
// the instruction stream and load it into pc.
|
|
1043
|
+
// If the jump has a condition, but noone's mucked with _nIns and our _nSlot
|
|
1044
|
+
// pointer is valid, stick the constant in the slot and emit a conditional
|
|
1045
|
+
// load into pc.
|
|
1046
|
+
// Otherwise, emit the conditional load into pc from a nearby constant,
|
|
1047
|
+
// and emit a jump to jump over it it in case the condition fails.
|
|
1048
|
+
//
|
|
1049
|
+
// NB: JMP_nochk depends on this not calling samepage() when _c == AL
|
|
1050
|
+
void
|
|
1051
|
+
Assembler::B_cond_chk(ConditionCode _c, NIns* _t, bool _chk)
|
|
1052
|
+
{
|
|
1053
|
+
int32_t offs = PC_OFFSET_FROM(_t,_nIns-1);
|
|
1054
|
+
//fprintf(stderr, "B_cond_chk target: 0x%08x offset: %d @0x%08x\n", _t, offs, _nIns-1);
|
|
1055
|
+
|
|
1056
|
+
// optimistically check if this will fit in 24 bits
|
|
1057
|
+
if (isS24(offs>>2)) {
|
|
1058
|
+
if (_chk) underrunProtect(4);
|
|
1059
|
+
// recalculate the offset, because underrunProtect may have
|
|
1060
|
+
// moved _nIns to a new page
|
|
1061
|
+
offs = PC_OFFSET_FROM(_t,_nIns-1);
|
|
1062
|
+
}
|
|
1063
|
+
|
|
1064
|
+
if (isS24(offs>>2)) {
|
|
1065
|
+
// the underrunProtect for this was done above
|
|
1066
|
+
*(--_nIns) = (NIns)( ((_c)<<28) | (0xA<<24) | (((offs)>>2) & 0xFFFFFF) );
|
|
1067
|
+
} else if (_c == AL) {
|
|
1068
|
+
if(_chk) underrunProtect(8);
|
|
1069
|
+
*(--_nIns) = (NIns)(_t);
|
|
1070
|
+
*(--_nIns) = (NIns)( COND_AL | (0x51<<20) | (PC<<16) | (PC<<12) | 0x4 );
|
|
1071
|
+
} else if (samepage(_nIns,_nSlot)) {
|
|
1072
|
+
if(_chk) underrunProtect(8);
|
|
1073
|
+
*(++_nSlot) = (NIns)(_t);
|
|
1074
|
+
offs = PC_OFFSET_FROM(_nSlot,_nIns-1);
|
|
1075
|
+
NanoAssert(offs < 0);
|
|
1076
|
+
*(--_nIns) = (NIns)( ((_c)<<28) | (0x51<<20) | (PC<<16) | (PC<<12) | ((-offs) & 0xFFFFFF) );
|
|
1077
|
+
} else {
|
|
1078
|
+
if(_chk) underrunProtect(12);
|
|
1079
|
+
*(--_nIns) = (NIns)(_t);
|
|
1080
|
+
*(--_nIns) = (NIns)( COND_AL | (0xA<<24) | ((-4)>>2) & 0xFFFFFF );
|
|
1081
|
+
*(--_nIns) = (NIns)( ((_c)<<28) | (0x51<<20) | (PC<<16) | (PC<<12) | 0x0 );
|
|
1082
|
+
}
|
|
1083
|
+
|
|
1084
|
+
asm_output("b%s %p", condNames[_c], (void*)(_t));
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
void
|
|
1088
|
+
Assembler::asm_add_imm(Register rd, Register rn, int32_t imm, int stat)
|
|
1089
|
+
{
|
|
1090
|
+
int rot = 16;
|
|
1091
|
+
uint32_t immval;
|
|
1092
|
+
bool pos;
|
|
1093
|
+
|
|
1094
|
+
if (imm >= 0) {
|
|
1095
|
+
immval = (uint32_t) imm;
|
|
1096
|
+
pos = true;
|
|
1097
|
+
} else {
|
|
1098
|
+
immval = (uint32_t) (-imm);
|
|
1099
|
+
pos = false;
|
|
1100
|
+
}
|
|
1101
|
+
|
|
1102
|
+
while (immval > 255 &&
|
|
1103
|
+
immval && ((immval & 0x3) == 0))
|
|
1104
|
+
{
|
|
1105
|
+
immval >>= 2;
|
|
1106
|
+
rot--;
|
|
1107
|
+
}
|
|
1108
|
+
|
|
1109
|
+
rot &= 0xf;
|
|
1110
|
+
|
|
1111
|
+
if (immval < 256) {
|
|
1112
|
+
if (pos) {
|
|
1113
|
+
ALUi_rot(AL, add, stat, rd, rn, immval, rot);
|
|
1114
|
+
} else {
|
|
1115
|
+
ALUi_rot(AL, sub, stat, rd, rn, immval, rot);
|
|
1116
|
+
}
|
|
1117
|
+
} else {
|
|
1118
|
+
// add scratch to rn, after loading the value into scratch.
|
|
1119
|
+
// make sure someone isn't trying to use IP as an operand
|
|
1120
|
+
NanoAssert(rn != IP);
|
|
1121
|
+
ALUr(AL, add, stat, rd, rn, IP);
|
|
1122
|
+
asm_ld_imm(IP, imm);
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1126
|
+
void
|
|
1127
|
+
Assembler::asm_sub_imm(Register rd, Register rn, int32_t imm, int stat)
|
|
1128
|
+
{
|
|
1129
|
+
if (imm > -256 && imm < 256) {
|
|
1130
|
+
if (imm >= 0)
|
|
1131
|
+
ALUi(AL, sub, stat, rd, rn, imm);
|
|
1132
|
+
else
|
|
1133
|
+
ALUi(AL, add, stat, rd, rn, -imm);
|
|
1134
|
+
} else if (imm >= 0) {
|
|
1135
|
+
if (imm <= 510) {
|
|
1136
|
+
/* between 0 and 510, inclusive */
|
|
1137
|
+
int rem = imm - 255;
|
|
1138
|
+
NanoAssert(rem < 256);
|
|
1139
|
+
ALUi(AL, sub, stat, rd, rn, rem & 0xff);
|
|
1140
|
+
ALUi(AL, sub, stat, rd, rn, 0xff);
|
|
1141
|
+
} else {
|
|
1142
|
+
/* more than 510 */
|
|
1143
|
+
NanoAssert(rn != IP);
|
|
1144
|
+
ALUr(AL, sub, stat, rd, rn, IP);
|
|
1145
|
+
asm_ld_imm(IP, imm);
|
|
1146
|
+
}
|
|
1147
|
+
} else {
|
|
1148
|
+
if (imm >= -510) {
|
|
1149
|
+
/* between -510 and -1, inclusive */
|
|
1150
|
+
int rem = -imm - 255;
|
|
1151
|
+
ALUi(AL, add, stat, rd, rn, rem & 0xff);
|
|
1152
|
+
ALUi(AL, add, stat, rd, rn, 0xff);
|
|
1153
|
+
} else {
|
|
1154
|
+
/* less than -510 */
|
|
1155
|
+
NanoAssert(rn != IP);
|
|
1156
|
+
ALUr(AL, add, stat, rd, rn, IP);
|
|
1157
|
+
asm_ld_imm(IP, -imm);
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1161
|
+
|
|
1162
|
+
/*
|
|
1163
|
+
* VFP
|
|
1164
|
+
*/
|
|
1165
|
+
|
|
1166
|
+
void
|
|
1167
|
+
Assembler::asm_i2f(LInsp ins)
|
|
1168
|
+
{
|
|
1169
|
+
Register rr = prepResultReg(ins, FpRegs);
|
|
1170
|
+
Register srcr = findRegFor(ins->oprnd1(), GpRegs);
|
|
1171
|
+
|
|
1172
|
+
// todo: support int value in memory, as per x86
|
|
1173
|
+
NanoAssert(srcr != UnknownReg);
|
|
1174
|
+
|
|
1175
|
+
FSITOD(rr, FpSingleScratch);
|
|
1176
|
+
FMSR(FpSingleScratch, srcr);
|
|
1177
|
+
}
|
|
1178
|
+
|
|
1179
|
+
void
|
|
1180
|
+
Assembler::asm_u2f(LInsp ins)
|
|
1181
|
+
{
|
|
1182
|
+
Register rr = prepResultReg(ins, FpRegs);
|
|
1183
|
+
Register sr = findRegFor(ins->oprnd1(), GpRegs);
|
|
1184
|
+
|
|
1185
|
+
// todo: support int value in memory, as per x86
|
|
1186
|
+
NanoAssert(sr != UnknownReg);
|
|
1187
|
+
|
|
1188
|
+
FUITOD(rr, FpSingleScratch);
|
|
1189
|
+
FMSR(FpSingleScratch, sr);
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
void
|
|
1193
|
+
Assembler::asm_fneg(LInsp ins)
|
|
1194
|
+
{
|
|
1195
|
+
LInsp lhs = ins->oprnd1();
|
|
1196
|
+
Register rr = prepResultReg(ins, FpRegs);
|
|
1197
|
+
|
|
1198
|
+
Reservation* rA = getresv(lhs);
|
|
1199
|
+
Register sr;
|
|
1200
|
+
|
|
1201
|
+
if (!rA || rA->reg == UnknownReg)
|
|
1202
|
+
sr = findRegFor(lhs, FpRegs);
|
|
1203
|
+
else
|
|
1204
|
+
sr = rA->reg;
|
|
1205
|
+
|
|
1206
|
+
FNEGD(rr, sr);
|
|
1207
|
+
}
|
|
1208
|
+
|
|
1209
|
+
void
|
|
1210
|
+
Assembler::asm_fop(LInsp ins)
|
|
1211
|
+
{
|
|
1212
|
+
LInsp lhs = ins->oprnd1();
|
|
1213
|
+
LInsp rhs = ins->oprnd2();
|
|
1214
|
+
LOpcode op = ins->opcode();
|
|
1215
|
+
|
|
1216
|
+
NanoAssert(op >= LIR_fadd && op <= LIR_fdiv);
|
|
1217
|
+
|
|
1218
|
+
// rr = ra OP rb
|
|
1219
|
+
|
|
1220
|
+
Register rr = prepResultReg(ins, FpRegs);
|
|
1221
|
+
|
|
1222
|
+
Register ra = findRegFor(lhs, FpRegs);
|
|
1223
|
+
Register rb = (rhs == lhs) ? ra : findRegFor(rhs, FpRegs);
|
|
1224
|
+
|
|
1225
|
+
// XXX special-case 1.0 and 0.0
|
|
1226
|
+
|
|
1227
|
+
if (op == LIR_fadd)
|
|
1228
|
+
FADDD(rr,ra,rb);
|
|
1229
|
+
else if (op == LIR_fsub)
|
|
1230
|
+
FSUBD(rr,ra,rb);
|
|
1231
|
+
else if (op == LIR_fmul)
|
|
1232
|
+
FMULD(rr,ra,rb);
|
|
1233
|
+
else //if (op == LIR_fdiv)
|
|
1234
|
+
FDIVD(rr,ra,rb);
|
|
1235
|
+
}
|
|
1236
|
+
|
|
1237
|
+
void
|
|
1238
|
+
Assembler::asm_fcmp(LInsp ins)
|
|
1239
|
+
{
|
|
1240
|
+
LInsp lhs = ins->oprnd1();
|
|
1241
|
+
LInsp rhs = ins->oprnd2();
|
|
1242
|
+
LOpcode op = ins->opcode();
|
|
1243
|
+
|
|
1244
|
+
NanoAssert(op >= LIR_feq && op <= LIR_fge);
|
|
1245
|
+
|
|
1246
|
+
Register ra = findRegFor(lhs, FpRegs);
|
|
1247
|
+
Register rb = findRegFor(rhs, FpRegs);
|
|
1248
|
+
|
|
1249
|
+
FMSTAT();
|
|
1250
|
+
FCMPD(ra, rb);
|
|
1251
|
+
}
|
|
1252
|
+
|
|
1253
|
+
Register
|
|
1254
|
+
Assembler::asm_prep_fcall(Reservation*, LInsp)
|
|
1255
|
+
{
|
|
1256
|
+
// We have nothing to do here; we do it all in asm_call.
|
|
1257
|
+
return UnknownReg;
|
|
1258
|
+
}
|
|
1259
|
+
|
|
1260
|
+
NIns*
|
|
1261
|
+
Assembler::asm_branch(bool branchOnFalse, LInsp cond, NIns* targ, bool isfar)
|
|
1262
|
+
{
|
|
1263
|
+
// ignore isfar -- we figure this out on our own.
|
|
1264
|
+
// XXX noone actually uses the far param in nj anyway... (always false)
|
|
1265
|
+
(void)isfar;
|
|
1266
|
+
|
|
1267
|
+
NIns* at = 0;
|
|
1268
|
+
LOpcode condop = cond->opcode();
|
|
1269
|
+
NanoAssert(cond->isCond());
|
|
1270
|
+
|
|
1271
|
+
if (condop >= LIR_feq && condop <= LIR_fge)
|
|
1272
|
+
{
|
|
1273
|
+
ConditionCode cc = NV;
|
|
1274
|
+
|
|
1275
|
+
if (branchOnFalse) {
|
|
1276
|
+
switch (condop) {
|
|
1277
|
+
case LIR_feq: cc = NE; break;
|
|
1278
|
+
case LIR_flt: cc = PL; break;
|
|
1279
|
+
case LIR_fgt: cc = LE; break;
|
|
1280
|
+
case LIR_fle: cc = HI; break;
|
|
1281
|
+
case LIR_fge: cc = LT; break;
|
|
1282
|
+
default: NanoAssert(0); break;
|
|
1283
|
+
}
|
|
1284
|
+
} else {
|
|
1285
|
+
switch (condop) {
|
|
1286
|
+
case LIR_feq: cc = EQ; break;
|
|
1287
|
+
case LIR_flt: cc = MI; break;
|
|
1288
|
+
case LIR_fgt: cc = GT; break;
|
|
1289
|
+
case LIR_fle: cc = LS; break;
|
|
1290
|
+
case LIR_fge: cc = GE; break;
|
|
1291
|
+
default: NanoAssert(0); break;
|
|
1292
|
+
}
|
|
1293
|
+
}
|
|
1294
|
+
|
|
1295
|
+
B_cond(cc, targ);
|
|
1296
|
+
asm_output("b(%d) 0x%08x", cc, (unsigned int) targ);
|
|
1297
|
+
|
|
1298
|
+
NIns *at = _nIns;
|
|
1299
|
+
asm_fcmp(cond);
|
|
1300
|
+
return at;
|
|
1301
|
+
}
|
|
1302
|
+
|
|
1303
|
+
// produce the branch
|
|
1304
|
+
if (branchOnFalse) {
|
|
1305
|
+
if (condop == LIR_eq)
|
|
1306
|
+
JNE(targ);
|
|
1307
|
+
else if (condop == LIR_ov)
|
|
1308
|
+
JNO(targ);
|
|
1309
|
+
else if (condop == LIR_cs)
|
|
1310
|
+
JNC(targ);
|
|
1311
|
+
else if (condop == LIR_lt)
|
|
1312
|
+
JNL(targ);
|
|
1313
|
+
else if (condop == LIR_le)
|
|
1314
|
+
JNLE(targ);
|
|
1315
|
+
else if (condop == LIR_gt)
|
|
1316
|
+
JNG(targ);
|
|
1317
|
+
else if (condop == LIR_ge)
|
|
1318
|
+
JNGE(targ);
|
|
1319
|
+
else if (condop == LIR_ult)
|
|
1320
|
+
JNB(targ);
|
|
1321
|
+
else if (condop == LIR_ule)
|
|
1322
|
+
JNBE(targ);
|
|
1323
|
+
else if (condop == LIR_ugt)
|
|
1324
|
+
JNA(targ);
|
|
1325
|
+
else //if (condop == LIR_uge)
|
|
1326
|
+
JNAE(targ);
|
|
1327
|
+
} else // op == LIR_xt
|
|
1328
|
+
{
|
|
1329
|
+
if (condop == LIR_eq)
|
|
1330
|
+
JE(targ);
|
|
1331
|
+
else if (condop == LIR_ov)
|
|
1332
|
+
JO(targ);
|
|
1333
|
+
else if (condop == LIR_cs)
|
|
1334
|
+
JC(targ);
|
|
1335
|
+
else if (condop == LIR_lt)
|
|
1336
|
+
JL(targ);
|
|
1337
|
+
else if (condop == LIR_le)
|
|
1338
|
+
JLE(targ);
|
|
1339
|
+
else if (condop == LIR_gt)
|
|
1340
|
+
JG(targ);
|
|
1341
|
+
else if (condop == LIR_ge)
|
|
1342
|
+
JGE(targ);
|
|
1343
|
+
else if (condop == LIR_ult)
|
|
1344
|
+
JB(targ);
|
|
1345
|
+
else if (condop == LIR_ule)
|
|
1346
|
+
JBE(targ);
|
|
1347
|
+
else if (condop == LIR_ugt)
|
|
1348
|
+
JA(targ);
|
|
1349
|
+
else //if (condop == LIR_uge)
|
|
1350
|
+
JAE(targ);
|
|
1351
|
+
}
|
|
1352
|
+
at = _nIns;
|
|
1353
|
+
asm_cmp(cond);
|
|
1354
|
+
return at;
|
|
1355
|
+
}
|
|
1356
|
+
|
|
1357
|
+
void
|
|
1358
|
+
Assembler::asm_cmp(LIns *cond)
|
|
1359
|
+
{
|
|
1360
|
+
LOpcode condop = cond->opcode();
|
|
1361
|
+
|
|
1362
|
+
// LIR_ov and LIR_cs recycle the flags set by arithmetic ops
|
|
1363
|
+
if ((condop == LIR_ov) || (condop == LIR_cs))
|
|
1364
|
+
return;
|
|
1365
|
+
|
|
1366
|
+
LInsp lhs = cond->oprnd1();
|
|
1367
|
+
LInsp rhs = cond->oprnd2();
|
|
1368
|
+
Reservation *rA, *rB;
|
|
1369
|
+
|
|
1370
|
+
// Not supported yet.
|
|
1371
|
+
NanoAssert(!lhs->isQuad() && !rhs->isQuad());
|
|
1372
|
+
|
|
1373
|
+
// ready to issue the compare
|
|
1374
|
+
if (rhs->isconst()) {
|
|
1375
|
+
int c = rhs->constval();
|
|
1376
|
+
if (c == 0 && cond->isop(LIR_eq)) {
|
|
1377
|
+
Register r = findRegFor(lhs, GpRegs);
|
|
1378
|
+
TEST(r,r);
|
|
1379
|
+
// No 64-bit immediates so fall-back to below
|
|
1380
|
+
} else if (!rhs->isQuad()) {
|
|
1381
|
+
Register r = getBaseReg(lhs, c, GpRegs);
|
|
1382
|
+
asm_cmpi(r, c);
|
|
1383
|
+
} else {
|
|
1384
|
+
NanoAssert(0);
|
|
1385
|
+
}
|
|
1386
|
+
} else {
|
|
1387
|
+
findRegFor2(GpRegs, lhs, rA, rhs, rB);
|
|
1388
|
+
Register ra = rA->reg;
|
|
1389
|
+
Register rb = rB->reg;
|
|
1390
|
+
CMP(ra, rb);
|
|
1391
|
+
}
|
|
1392
|
+
}
|
|
1393
|
+
|
|
1394
|
+
void
|
|
1395
|
+
Assembler::asm_cmpi(Register r, int32_t imm)
|
|
1396
|
+
{
|
|
1397
|
+
if (imm < 0) {
|
|
1398
|
+
if (imm > -256) {
|
|
1399
|
+
ALUi(AL, cmn, 1, 0, r, -imm);
|
|
1400
|
+
} else {
|
|
1401
|
+
CMP(r, IP);
|
|
1402
|
+
asm_ld_imm(IP, imm);
|
|
1403
|
+
}
|
|
1404
|
+
} else {
|
|
1405
|
+
if (imm < 256) {
|
|
1406
|
+
ALUi(AL, cmp, 1, 0, r, imm);
|
|
1407
|
+
} else {
|
|
1408
|
+
CMP(r, IP);
|
|
1409
|
+
asm_ld_imm(IP, imm);
|
|
1410
|
+
}
|
|
1411
|
+
}
|
|
1412
|
+
}
|
|
1413
|
+
|
|
1414
|
+
void
|
|
1415
|
+
Assembler::asm_loop(LInsp ins, NInsList& loopJumps)
|
|
1416
|
+
{
|
|
1417
|
+
// XXX asm_loop should be in Assembler.cpp!
|
|
1418
|
+
|
|
1419
|
+
JMP_far(0);
|
|
1420
|
+
loopJumps.add(_nIns);
|
|
1421
|
+
|
|
1422
|
+
// If the target we are looping to is in a different fragment, we have to restore
|
|
1423
|
+
// SP since we will target fragEntry and not loopEntry.
|
|
1424
|
+
if (ins->record()->exit->target != _thisfrag)
|
|
1425
|
+
MOV(SP,FP);
|
|
1426
|
+
}
|
|
1427
|
+
|
|
1428
|
+
void
|
|
1429
|
+
Assembler::asm_fcond(LInsp ins)
|
|
1430
|
+
{
|
|
1431
|
+
// only want certain regs
|
|
1432
|
+
Register r = prepResultReg(ins, AllowableFlagRegs);
|
|
1433
|
+
|
|
1434
|
+
switch (ins->opcode()) {
|
|
1435
|
+
case LIR_feq: SET(r,EQ,NE); break;
|
|
1436
|
+
case LIR_flt: SET(r,MI,PL); break;
|
|
1437
|
+
case LIR_fgt: SET(r,GT,LE); break;
|
|
1438
|
+
case LIR_fle: SET(r,LS,HI); break;
|
|
1439
|
+
case LIR_fge: SET(r,GE,LT); break;
|
|
1440
|
+
default: NanoAssert(0); break;
|
|
1441
|
+
}
|
|
1442
|
+
|
|
1443
|
+
asm_fcmp(ins);
|
|
1444
|
+
}
|
|
1445
|
+
|
|
1446
|
+
void
|
|
1447
|
+
Assembler::asm_cond(LInsp ins)
|
|
1448
|
+
{
|
|
1449
|
+
// only want certain regs
|
|
1450
|
+
LOpcode op = ins->opcode();
|
|
1451
|
+
Register r = prepResultReg(ins, AllowableFlagRegs);
|
|
1452
|
+
// SETcc only sets low 8 bits, so extend
|
|
1453
|
+
MOVZX8(r,r);
|
|
1454
|
+
if (op == LIR_eq)
|
|
1455
|
+
SETE(r);
|
|
1456
|
+
else if (op == LIR_ov)
|
|
1457
|
+
SETO(r);
|
|
1458
|
+
else if (op == LIR_cs)
|
|
1459
|
+
SETC(r);
|
|
1460
|
+
else if (op == LIR_lt)
|
|
1461
|
+
SETL(r);
|
|
1462
|
+
else if (op == LIR_le)
|
|
1463
|
+
SETLE(r);
|
|
1464
|
+
else if (op == LIR_gt)
|
|
1465
|
+
SETG(r);
|
|
1466
|
+
else if (op == LIR_ge)
|
|
1467
|
+
SETGE(r);
|
|
1468
|
+
else if (op == LIR_ult)
|
|
1469
|
+
SETB(r);
|
|
1470
|
+
else if (op == LIR_ule)
|
|
1471
|
+
SETBE(r);
|
|
1472
|
+
else if (op == LIR_ugt)
|
|
1473
|
+
SETA(r);
|
|
1474
|
+
else // if (op == LIR_uge)
|
|
1475
|
+
SETAE(r);
|
|
1476
|
+
asm_cmp(ins);
|
|
1477
|
+
}
|
|
1478
|
+
|
|
1479
|
+
void
|
|
1480
|
+
Assembler::asm_arith(LInsp ins)
|
|
1481
|
+
{
|
|
1482
|
+
LOpcode op = ins->opcode();
|
|
1483
|
+
LInsp lhs = ins->oprnd1();
|
|
1484
|
+
LInsp rhs = ins->oprnd2();
|
|
1485
|
+
|
|
1486
|
+
Register rb = UnknownReg;
|
|
1487
|
+
RegisterMask allow = GpRegs;
|
|
1488
|
+
bool forceReg = (op == LIR_mul || !rhs->isconst());
|
|
1489
|
+
|
|
1490
|
+
// Arm can't do an immediate op with immediates
|
|
1491
|
+
// outside of +/-255 (for AND) r outside of
|
|
1492
|
+
// 0..255 for others.
|
|
1493
|
+
if (!forceReg) {
|
|
1494
|
+
if (rhs->isconst() && !isU8(rhs->constval()))
|
|
1495
|
+
forceReg = true;
|
|
1496
|
+
}
|
|
1497
|
+
|
|
1498
|
+
if (lhs != rhs && forceReg) {
|
|
1499
|
+
if ((rb = asm_binop_rhs_reg(ins)) == UnknownReg) {
|
|
1500
|
+
rb = findRegFor(rhs, allow);
|
|
1501
|
+
}
|
|
1502
|
+
allow &= ~rmask(rb);
|
|
1503
|
+
} else if ((op == LIR_add||op == LIR_addp) && lhs->isop(LIR_alloc) && rhs->isconst()) {
|
|
1504
|
+
// add alloc+const, rr wants the address of the allocated space plus a constant
|
|
1505
|
+
Register rr = prepResultReg(ins, allow);
|
|
1506
|
+
int d = findMemFor(lhs) + rhs->constval();
|
|
1507
|
+
asm_add_imm(rr, FP, d);
|
|
1508
|
+
}
|
|
1509
|
+
|
|
1510
|
+
Register rr = prepResultReg(ins, allow);
|
|
1511
|
+
Reservation* rA = getresv(lhs);
|
|
1512
|
+
Register ra;
|
|
1513
|
+
// if this is last use of lhs in reg, we can re-use result reg
|
|
1514
|
+
if (rA == 0 || (ra = rA->reg) == UnknownReg)
|
|
1515
|
+
ra = findSpecificRegFor(lhs, rr);
|
|
1516
|
+
// else, rA already has a register assigned.
|
|
1517
|
+
NanoAssert(ra != UnknownReg);
|
|
1518
|
+
|
|
1519
|
+
if (forceReg) {
|
|
1520
|
+
if (lhs == rhs)
|
|
1521
|
+
rb = ra;
|
|
1522
|
+
|
|
1523
|
+
if (op == LIR_add || op == LIR_addp)
|
|
1524
|
+
ADDs(rr, ra, rb, 1);
|
|
1525
|
+
else if (op == LIR_sub)
|
|
1526
|
+
SUB(rr, ra, rb);
|
|
1527
|
+
else if (op == LIR_mul)
|
|
1528
|
+
MUL(rr, rb);
|
|
1529
|
+
else if (op == LIR_and)
|
|
1530
|
+
AND(rr, ra, rb);
|
|
1531
|
+
else if (op == LIR_or)
|
|
1532
|
+
ORR(rr, ra, rb);
|
|
1533
|
+
else if (op == LIR_xor)
|
|
1534
|
+
EOR(rr, ra, rb);
|
|
1535
|
+
else if (op == LIR_lsh)
|
|
1536
|
+
SHL(rr, ra, rb);
|
|
1537
|
+
else if (op == LIR_rsh)
|
|
1538
|
+
SAR(rr, ra, rb);
|
|
1539
|
+
else if (op == LIR_ush)
|
|
1540
|
+
SHR(rr, ra, rb);
|
|
1541
|
+
else
|
|
1542
|
+
NanoAssertMsg(0, "Unsupported");
|
|
1543
|
+
} else {
|
|
1544
|
+
int c = rhs->constval();
|
|
1545
|
+
if (op == LIR_add || op == LIR_addp)
|
|
1546
|
+
ADDi(rr, ra, c);
|
|
1547
|
+
else if (op == LIR_sub)
|
|
1548
|
+
SUBi(rr, ra, c);
|
|
1549
|
+
else if (op == LIR_and)
|
|
1550
|
+
ANDi(rr, ra, c);
|
|
1551
|
+
else if (op == LIR_or)
|
|
1552
|
+
ORRi(rr, ra, c);
|
|
1553
|
+
else if (op == LIR_xor)
|
|
1554
|
+
EORi(rr, ra, c);
|
|
1555
|
+
else if (op == LIR_lsh)
|
|
1556
|
+
SHLi(rr, ra, c);
|
|
1557
|
+
else if (op == LIR_rsh)
|
|
1558
|
+
SARi(rr, ra, c);
|
|
1559
|
+
else if (op == LIR_ush)
|
|
1560
|
+
SHRi(rr, ra, c);
|
|
1561
|
+
else
|
|
1562
|
+
NanoAssertMsg(0, "Unsupported");
|
|
1563
|
+
}
|
|
1564
|
+
}
|
|
1565
|
+
|
|
1566
|
+
void
|
|
1567
|
+
Assembler::asm_neg_not(LInsp ins)
|
|
1568
|
+
{
|
|
1569
|
+
LOpcode op = ins->opcode();
|
|
1570
|
+
Register rr = prepResultReg(ins, GpRegs);
|
|
1571
|
+
|
|
1572
|
+
LIns* lhs = ins->oprnd1();
|
|
1573
|
+
Reservation *rA = getresv(lhs);
|
|
1574
|
+
// if this is last use of lhs in reg, we can re-use result reg
|
|
1575
|
+
Register ra;
|
|
1576
|
+
if (rA == 0 || (ra=rA->reg) == UnknownReg)
|
|
1577
|
+
ra = findSpecificRegFor(lhs, rr);
|
|
1578
|
+
// else, rA already has a register assigned.
|
|
1579
|
+
NanoAssert(ra != UnknownReg);
|
|
1580
|
+
|
|
1581
|
+
if (op == LIR_not)
|
|
1582
|
+
MVN(rr, ra);
|
|
1583
|
+
else
|
|
1584
|
+
RSBS(rr, ra);
|
|
1585
|
+
}
|
|
1586
|
+
|
|
1587
|
+
void
|
|
1588
|
+
Assembler::asm_ld(LInsp ins)
|
|
1589
|
+
{
|
|
1590
|
+
LOpcode op = ins->opcode();
|
|
1591
|
+
LIns* base = ins->oprnd1();
|
|
1592
|
+
LIns* disp = ins->oprnd2();
|
|
1593
|
+
Register rr = prepResultReg(ins, GpRegs);
|
|
1594
|
+
int d = disp->constval();
|
|
1595
|
+
Register ra = getBaseReg(base, d, GpRegs);
|
|
1596
|
+
|
|
1597
|
+
// these will always be 4-byte aligned
|
|
1598
|
+
if (op == LIR_ld || op == LIR_ldc) {
|
|
1599
|
+
LD(rr, d, ra);
|
|
1600
|
+
return;
|
|
1601
|
+
}
|
|
1602
|
+
|
|
1603
|
+
// these will be 2 or 4-byte aligned
|
|
1604
|
+
if (op == LIR_ldcs) {
|
|
1605
|
+
LDRH(rr, d, ra);
|
|
1606
|
+
return;
|
|
1607
|
+
}
|
|
1608
|
+
|
|
1609
|
+
// aaand this is just any byte.
|
|
1610
|
+
if (op == LIR_ldcb) {
|
|
1611
|
+
LDRB(rr, d, ra);
|
|
1612
|
+
return;
|
|
1613
|
+
}
|
|
1614
|
+
|
|
1615
|
+
NanoAssertMsg(0, "Unsupported instruction in asm_ld");
|
|
1616
|
+
}
|
|
1617
|
+
|
|
1618
|
+
void
|
|
1619
|
+
Assembler::asm_cmov(LInsp ins)
|
|
1620
|
+
{
|
|
1621
|
+
NanoAssert(ins->opcode() == LIR_cmov);
|
|
1622
|
+
LIns* condval = ins->oprnd1();
|
|
1623
|
+
NanoAssert(condval->isCmp());
|
|
1624
|
+
|
|
1625
|
+
LIns* values = ins->oprnd2();
|
|
1626
|
+
|
|
1627
|
+
NanoAssert(values->opcode() == LIR_2);
|
|
1628
|
+
LIns* iftrue = values->oprnd1();
|
|
1629
|
+
LIns* iffalse = values->oprnd2();
|
|
1630
|
+
|
|
1631
|
+
NanoAssert(!iftrue->isQuad() && !iffalse->isQuad());
|
|
1632
|
+
|
|
1633
|
+
const Register rr = prepResultReg(ins, GpRegs);
|
|
1634
|
+
|
|
1635
|
+
// this code assumes that neither LD nor MR nor MRcc set any of the condition flags.
|
|
1636
|
+
// (This is true on Intel, is it true on all architectures?)
|
|
1637
|
+
const Register iffalsereg = findRegFor(iffalse, GpRegs & ~rmask(rr));
|
|
1638
|
+
switch (condval->opcode()) {
|
|
1639
|
+
// note that these are all opposites...
|
|
1640
|
+
case LIR_eq: MOVNE(rr, iffalsereg); break;
|
|
1641
|
+
case LIR_ov: MOVVC(rr, iffalsereg); break;
|
|
1642
|
+
case LIR_cs: MOVNC(rr, iffalsereg); break;
|
|
1643
|
+
case LIR_lt: MOVGE(rr, iffalsereg); break;
|
|
1644
|
+
case LIR_le: MOVGT(rr, iffalsereg); break;
|
|
1645
|
+
case LIR_gt: MOVLE(rr, iffalsereg); break;
|
|
1646
|
+
case LIR_ge: MOVLT(rr, iffalsereg); break;
|
|
1647
|
+
case LIR_ult: MOVCS(rr, iffalsereg); break;
|
|
1648
|
+
case LIR_ule: MOVHI(rr, iffalsereg); break;
|
|
1649
|
+
case LIR_ugt: MOVLS(rr, iffalsereg); break;
|
|
1650
|
+
case LIR_uge: MOVCC(rr, iffalsereg); break;
|
|
1651
|
+
default: debug_only( NanoAssert(0) ); break;
|
|
1652
|
+
}
|
|
1653
|
+
/*const Register iftruereg =*/ findSpecificRegFor(iftrue, rr);
|
|
1654
|
+
asm_cmp(condval);
|
|
1655
|
+
}
|
|
1656
|
+
|
|
1657
|
+
void
|
|
1658
|
+
Assembler::asm_qhi(LInsp ins)
|
|
1659
|
+
{
|
|
1660
|
+
Register rr = prepResultReg(ins, GpRegs);
|
|
1661
|
+
LIns *q = ins->oprnd1();
|
|
1662
|
+
int d = findMemFor(q);
|
|
1663
|
+
LD(rr, d+4, FP);
|
|
1664
|
+
}
|
|
1665
|
+
|
|
1666
|
+
void
|
|
1667
|
+
Assembler::asm_qlo(LInsp ins)
|
|
1668
|
+
{
|
|
1669
|
+
Register rr = prepResultReg(ins, GpRegs);
|
|
1670
|
+
LIns *q = ins->oprnd1();
|
|
1671
|
+
int d = findMemFor(q);
|
|
1672
|
+
LD(rr, d, FP);
|
|
1673
|
+
|
|
1674
|
+
#if 0
|
|
1675
|
+
LIns *q = ins->oprnd1();
|
|
1676
|
+
|
|
1677
|
+
Reservation *resv = getresv(ins);
|
|
1678
|
+
Register rr = resv->reg;
|
|
1679
|
+
if (rr == UnknownReg) {
|
|
1680
|
+
// store quad in spill loc
|
|
1681
|
+
int d = disp(resv);
|
|
1682
|
+
freeRsrcOf(ins, false);
|
|
1683
|
+
Register qr = findRegFor(q, XmmRegs);
|
|
1684
|
+
SSE_MOVDm(d, FP, qr);
|
|
1685
|
+
} else {
|
|
1686
|
+
freeRsrcOf(ins, false);
|
|
1687
|
+
Register qr = findRegFor(q, XmmRegs);
|
|
1688
|
+
SSE_MOVD(rr,qr);
|
|
1689
|
+
}
|
|
1690
|
+
#endif
|
|
1691
|
+
}
|
|
1692
|
+
|
|
1693
|
+
|
|
1694
|
+
void
|
|
1695
|
+
Assembler::asm_param(LInsp ins)
|
|
1696
|
+
{
|
|
1697
|
+
uint32_t a = ins->imm8();
|
|
1698
|
+
uint32_t kind = ins->imm8b();
|
|
1699
|
+
if (kind == 0) {
|
|
1700
|
+
// ordinary param
|
|
1701
|
+
AbiKind abi = _thisfrag->lirbuf->abi;
|
|
1702
|
+
uint32_t abi_regcount = abi == ABI_FASTCALL ? 2 : abi == ABI_THISCALL ? 1 : 0;
|
|
1703
|
+
if (a < abi_regcount) {
|
|
1704
|
+
// incoming arg in register
|
|
1705
|
+
prepResultReg(ins, rmask(argRegs[a]));
|
|
1706
|
+
} else {
|
|
1707
|
+
// incoming arg is on stack, and EBP points nearby (see genPrologue)
|
|
1708
|
+
Register r = prepResultReg(ins, GpRegs);
|
|
1709
|
+
int d = (a - abi_regcount) * sizeof(intptr_t) + 8;
|
|
1710
|
+
LD(r, d, FP);
|
|
1711
|
+
}
|
|
1712
|
+
} else {
|
|
1713
|
+
// saved param
|
|
1714
|
+
prepResultReg(ins, rmask(savedRegs[a]));
|
|
1715
|
+
}
|
|
1716
|
+
}
|
|
1717
|
+
|
|
1718
|
+
void
|
|
1719
|
+
Assembler::asm_short(LInsp ins)
|
|
1720
|
+
{
|
|
1721
|
+
Register rr = prepResultReg(ins, GpRegs);
|
|
1722
|
+
int32_t val = ins->imm16();
|
|
1723
|
+
if (val == 0)
|
|
1724
|
+
EOR(rr,rr,rr);
|
|
1725
|
+
else
|
|
1726
|
+
LDi(rr, val);
|
|
1727
|
+
}
|
|
1728
|
+
|
|
1729
|
+
void
|
|
1730
|
+
Assembler::asm_int(LInsp ins)
|
|
1731
|
+
{
|
|
1732
|
+
Register rr = prepResultReg(ins, GpRegs);
|
|
1733
|
+
int32_t val = ins->imm32();
|
|
1734
|
+
if (val == 0)
|
|
1735
|
+
EOR(rr,rr,rr);
|
|
1736
|
+
else
|
|
1737
|
+
LDi(rr, val);
|
|
1738
|
+
}
|
|
1739
|
+
|
|
1740
|
+
}
|
|
1741
|
+
|
|
1742
|
+
#endif /* FEATURE_NANOJIT */
|