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,1748 @@
|
|
|
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
|
+
* Mozilla TraceMonkey Team
|
|
25
|
+
* Asko Tontti <atontti@cc.hut.fi>
|
|
26
|
+
*
|
|
27
|
+
* Alternatively, the contents of this file may be used under the terms of
|
|
28
|
+
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
29
|
+
* 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
|
+
#ifdef _MAC
|
|
42
|
+
// for MakeDataExecutable
|
|
43
|
+
#include <CoreServices/CoreServices.h>
|
|
44
|
+
#endif
|
|
45
|
+
|
|
46
|
+
#if defined AVMPLUS_UNIX || defined AVMPLUS_MAC
|
|
47
|
+
#include <sys/mman.h>
|
|
48
|
+
#include <errno.h>
|
|
49
|
+
#include <stdlib.h>
|
|
50
|
+
#endif
|
|
51
|
+
#include "nanojit.h"
|
|
52
|
+
|
|
53
|
+
namespace nanojit
|
|
54
|
+
{
|
|
55
|
+
#ifdef FEATURE_NANOJIT
|
|
56
|
+
|
|
57
|
+
#ifdef NJ_VERBOSE
|
|
58
|
+
const char *regNames[] = {
|
|
59
|
+
"eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
|
|
60
|
+
"xmm0","xmm1","xmm2","xmm3","xmm4","xmm5","xmm6","xmm7",
|
|
61
|
+
"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7"
|
|
62
|
+
};
|
|
63
|
+
#endif
|
|
64
|
+
|
|
65
|
+
const Register Assembler::argRegs[] = { ECX, EDX };
|
|
66
|
+
const Register Assembler::retRegs[] = { EAX, EDX };
|
|
67
|
+
const Register Assembler::savedRegs[] = { EBX, ESI, EDI };
|
|
68
|
+
|
|
69
|
+
const static uint8_t max_abi_regs[] = {
|
|
70
|
+
2, /* ABI_FASTCALL */
|
|
71
|
+
1, /* ABI_THISCALL */
|
|
72
|
+
0, /* ABI_STDCALL */
|
|
73
|
+
0 /* ABI_CDECL */
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
void Assembler::nInit(AvmCore* core)
|
|
78
|
+
{
|
|
79
|
+
(void) core;
|
|
80
|
+
OSDep::getDate();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
NIns* Assembler::genPrologue()
|
|
84
|
+
{
|
|
85
|
+
/**
|
|
86
|
+
* Prologue
|
|
87
|
+
*/
|
|
88
|
+
uint32_t stackNeeded = STACK_GRANULARITY * _activation.highwatermark;
|
|
89
|
+
|
|
90
|
+
uint32_t stackPushed =
|
|
91
|
+
STACK_GRANULARITY + // returnaddr
|
|
92
|
+
STACK_GRANULARITY + // ebp
|
|
93
|
+
STACK_GRANULARITY; // dummy
|
|
94
|
+
|
|
95
|
+
if (!_thisfrag->lirbuf->explicitSavedRegs)
|
|
96
|
+
stackPushed += NumSavedRegs * STACK_GRANULARITY;
|
|
97
|
+
|
|
98
|
+
uint32_t aligned = alignUp(stackNeeded + stackPushed, NJ_ALIGN_STACK);
|
|
99
|
+
uint32_t amt = aligned - stackPushed;
|
|
100
|
+
|
|
101
|
+
// Reserve stackNeeded bytes, padded
|
|
102
|
+
// to preserve NJ_ALIGN_STACK-byte alignment.
|
|
103
|
+
if (amt)
|
|
104
|
+
SUBi(SP, amt);
|
|
105
|
+
|
|
106
|
+
verbose_only( outputAddr=true; asm_output("[frag entry]"); )
|
|
107
|
+
NIns *fragEntry = _nIns;
|
|
108
|
+
MR(FP, SP); // Establish our own FP.
|
|
109
|
+
PUSHr(FP); // Save caller's FP.
|
|
110
|
+
|
|
111
|
+
if (!_thisfrag->lirbuf->explicitSavedRegs) {
|
|
112
|
+
PUSHr(FP); // dummy
|
|
113
|
+
for (int i = 0; i < NumSavedRegs; ++i)
|
|
114
|
+
PUSHr(savedRegs[i]);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return fragEntry;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
void Assembler::nFragExit(LInsp guard)
|
|
121
|
+
{
|
|
122
|
+
SideExit *exit = guard->record()->exit;
|
|
123
|
+
bool trees = _frago->core()->config.tree_opt;
|
|
124
|
+
Fragment *frag = exit->target;
|
|
125
|
+
GuardRecord *lr = 0;
|
|
126
|
+
bool destKnown = (frag && frag->fragEntry);
|
|
127
|
+
// Generate jump to epilog and initialize lr.
|
|
128
|
+
// If the guard is LIR_xtbl, use a jump table with epilog in every entry
|
|
129
|
+
if (guard->isop(LIR_xtbl)) {
|
|
130
|
+
lr = guard->record();
|
|
131
|
+
Register r = EBX;
|
|
132
|
+
SwitchInfo* si = guard->record()->exit->switchInfo;
|
|
133
|
+
emitJumpTable(si, _epilogue);
|
|
134
|
+
JMP_indirect(r);
|
|
135
|
+
LEAmi4(r, si->table, r);
|
|
136
|
+
} else {
|
|
137
|
+
// If the guard already exists, use a simple jump.
|
|
138
|
+
if (destKnown && !trees) {
|
|
139
|
+
JMP(frag->fragEntry);
|
|
140
|
+
lr = 0;
|
|
141
|
+
} else { // target doesn't exist. Use 0 jump offset and patch later
|
|
142
|
+
lr = guard->record();
|
|
143
|
+
JMP_long(_epilogue);
|
|
144
|
+
lr->jmp = _nIns;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// first restore ESP from EBP, undoing SUBi(SP,amt) from genPrologue
|
|
148
|
+
MR(SP,FP);
|
|
149
|
+
|
|
150
|
+
// return value is GuardRecord*
|
|
151
|
+
LDi(EAX, int(lr));
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
NIns *Assembler::genEpilogue()
|
|
155
|
+
{
|
|
156
|
+
RET();
|
|
157
|
+
|
|
158
|
+
if (!_thisfrag->lirbuf->explicitSavedRegs) {
|
|
159
|
+
for (int i = NumSavedRegs - 1; i >= 0; --i)
|
|
160
|
+
POPr(savedRegs[i]);
|
|
161
|
+
POPr(FP); // dummy
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
POPr(FP); // Restore caller's FP.
|
|
165
|
+
MR(SP,FP); // pop the stack frame
|
|
166
|
+
return _nIns;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
void Assembler::asm_call(LInsp ins)
|
|
170
|
+
{
|
|
171
|
+
const CallInfo* call = ins->callInfo();
|
|
172
|
+
// must be signed, not unsigned
|
|
173
|
+
uint32_t iargs = call->count_iargs();
|
|
174
|
+
int32_t fargs = call->count_args() - iargs - call->isIndirect();
|
|
175
|
+
|
|
176
|
+
bool imt = call->isInterface();
|
|
177
|
+
if (imt)
|
|
178
|
+
iargs --;
|
|
179
|
+
|
|
180
|
+
uint32_t max_regs = max_abi_regs[call->_abi];
|
|
181
|
+
if (max_regs > iargs)
|
|
182
|
+
max_regs = iargs;
|
|
183
|
+
|
|
184
|
+
int32_t istack = iargs-max_regs; // first 2 4B args are in registers
|
|
185
|
+
int32_t extra = 0;
|
|
186
|
+
const int32_t pushsize = 4*istack + 8*fargs; // actual stack space used
|
|
187
|
+
|
|
188
|
+
#if _MSC_VER
|
|
189
|
+
// msc is slack, and MIR doesn't do anything extra, so lets use this
|
|
190
|
+
// call-site alignment to at least have code size parity with MIR.
|
|
191
|
+
uint32_t align = 4;//NJ_ALIGN_STACK;
|
|
192
|
+
#else
|
|
193
|
+
uint32_t align = NJ_ALIGN_STACK;
|
|
194
|
+
#endif
|
|
195
|
+
|
|
196
|
+
if (pushsize) {
|
|
197
|
+
// stack re-alignment
|
|
198
|
+
// only pop our adjustment amount since callee pops args in FASTCALL mode
|
|
199
|
+
extra = alignUp(pushsize, align) - pushsize;
|
|
200
|
+
if (call->_abi == ABI_CDECL) {
|
|
201
|
+
// with CDECL only, caller pops args
|
|
202
|
+
ADDi(SP, extra+pushsize);
|
|
203
|
+
} else if (extra > 0) {
|
|
204
|
+
ADDi(SP, extra);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
bool indirect = false;
|
|
209
|
+
if (ins->isop(LIR_call) || ins->isop(LIR_fcall)) {
|
|
210
|
+
CALL(call);
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
// indirect call. x86 Calling conventions don't use EAX as an
|
|
214
|
+
// argument, and do use EAX as a return value. We need a register
|
|
215
|
+
// for the address to call, so we use EAX since it will always be
|
|
216
|
+
// available
|
|
217
|
+
NanoAssert(ins->isop(LIR_calli) || ins->isop(LIR_fcalli));
|
|
218
|
+
CALLr(call, EAX);
|
|
219
|
+
indirect = true;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// make sure fpu stack is empty before call (restoreCallerSaved)
|
|
223
|
+
NanoAssert(_allocator.isFree(FST0));
|
|
224
|
+
// note: this code requires that ref arguments (ARGSIZE_Q)
|
|
225
|
+
// be one of the first two arguments
|
|
226
|
+
// pre-assign registers to the first N 4B args based on the calling convention
|
|
227
|
+
uint32_t n = 0;
|
|
228
|
+
|
|
229
|
+
ArgSize sizes[2*MAXARGS];
|
|
230
|
+
uint32_t argc = call->get_sizes(sizes);
|
|
231
|
+
if (indirect) {
|
|
232
|
+
argc--;
|
|
233
|
+
asm_arg(ARGSIZE_LO, ins->arg(argc), EAX);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (imt) {
|
|
237
|
+
// interface thunk calling convention: put iid in EDX
|
|
238
|
+
NanoAssert(call->_abi == ABI_CDECL);
|
|
239
|
+
argc--;
|
|
240
|
+
asm_arg(ARGSIZE_LO, ins->arg(argc), EDX);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
for(uint32_t i=0; i < argc; i++)
|
|
244
|
+
{
|
|
245
|
+
uint32_t j = argc-i-1;
|
|
246
|
+
ArgSize sz = sizes[j];
|
|
247
|
+
Register r = UnknownReg;
|
|
248
|
+
if (n < max_regs && sz != ARGSIZE_F) {
|
|
249
|
+
r = argRegs[n++]; // tell asm_arg what reg to use
|
|
250
|
+
}
|
|
251
|
+
asm_arg(sz, ins->arg(j), r);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
if (extra > 0)
|
|
255
|
+
SUBi(SP, extra);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
void Assembler::nMarkExecute(Page* page, int flags)
|
|
259
|
+
{
|
|
260
|
+
NanoAssert(sizeof(Page) == NJ_PAGE_SIZE);
|
|
261
|
+
#if defined WIN32 || defined WIN64
|
|
262
|
+
DWORD dwIgnore;
|
|
263
|
+
static const DWORD kProtFlags[4] =
|
|
264
|
+
{
|
|
265
|
+
PAGE_READONLY, // 0
|
|
266
|
+
PAGE_READWRITE, // PAGE_WRITE
|
|
267
|
+
PAGE_EXECUTE_READ, // PAGE_EXEC
|
|
268
|
+
PAGE_EXECUTE_READWRITE // PAGE_EXEC|PAGE_WRITE
|
|
269
|
+
};
|
|
270
|
+
DWORD prot = kProtFlags[flags & (PAGE_WRITE|PAGE_EXEC)];
|
|
271
|
+
BOOL res = VirtualProtect(page, NJ_PAGE_SIZE, prot, &dwIgnore);
|
|
272
|
+
if (!res)
|
|
273
|
+
{
|
|
274
|
+
// todo: we can't abort or assert here, we have to fail gracefully.
|
|
275
|
+
NanoAssertMsg(false, "FATAL ERROR: VirtualProtect() failed\n");
|
|
276
|
+
}
|
|
277
|
+
#elif defined AVMPLUS_UNIX || defined AVMPLUS_MAC
|
|
278
|
+
static const int kProtFlags[4] =
|
|
279
|
+
{
|
|
280
|
+
PROT_READ, // 0
|
|
281
|
+
PROT_READ|PROT_WRITE, // PAGE_WRITE
|
|
282
|
+
PROT_READ|PROT_EXEC, // PAGE_EXEC
|
|
283
|
+
PROT_READ|PROT_WRITE|PROT_EXEC // PAGE_EXEC|PAGE_WRITE
|
|
284
|
+
};
|
|
285
|
+
int prot = kProtFlags[flags & (PAGE_WRITE|PAGE_EXEC)];
|
|
286
|
+
intptr_t addr = (intptr_t)page;
|
|
287
|
+
addr &= ~((uintptr_t)NJ_PAGE_SIZE - 1);
|
|
288
|
+
NanoAssert(addr == (intptr_t)page);
|
|
289
|
+
#if defined SOLARIS
|
|
290
|
+
if (mprotect((char *)addr, NJ_PAGE_SIZE, prot) == -1)
|
|
291
|
+
#else
|
|
292
|
+
if (mprotect((void *)addr, NJ_PAGE_SIZE, prot) == -1)
|
|
293
|
+
#endif
|
|
294
|
+
{
|
|
295
|
+
// todo: we can't abort or assert here, we have to fail gracefully.
|
|
296
|
+
NanoAssertMsg(false, "FATAL ERROR: mprotect(PROT_EXEC) failed\n");
|
|
297
|
+
abort();
|
|
298
|
+
}
|
|
299
|
+
#else
|
|
300
|
+
(void)page;
|
|
301
|
+
#endif
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
Register Assembler::nRegisterAllocFromSet(int set)
|
|
305
|
+
{
|
|
306
|
+
Register r;
|
|
307
|
+
RegAlloc ®s = _allocator;
|
|
308
|
+
#ifdef WIN32
|
|
309
|
+
_asm
|
|
310
|
+
{
|
|
311
|
+
mov ecx, regs
|
|
312
|
+
bsf eax, set // i = first bit set
|
|
313
|
+
btr RegAlloc::free[ecx], eax // free &= ~rmask(i)
|
|
314
|
+
mov r, eax
|
|
315
|
+
}
|
|
316
|
+
#elif defined WIN64
|
|
317
|
+
unsigned long tr, fr;
|
|
318
|
+
_BitScanForward(&tr, set);
|
|
319
|
+
_bittestandreset(&fr, tr);
|
|
320
|
+
regs.free = fr;
|
|
321
|
+
r = tr;
|
|
322
|
+
#else
|
|
323
|
+
asm(
|
|
324
|
+
"bsf %1, %%eax\n\t"
|
|
325
|
+
"btr %%eax, %2\n\t"
|
|
326
|
+
"movl %%eax, %0\n\t"
|
|
327
|
+
: "=m"(r) : "m"(set), "m"(regs.free) : "%eax", "memory" );
|
|
328
|
+
#endif /* WIN32 */
|
|
329
|
+
return r;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
void Assembler::nRegisterResetAll(RegAlloc& a)
|
|
333
|
+
{
|
|
334
|
+
// add scratch registers to our free list for the allocator
|
|
335
|
+
a.clear();
|
|
336
|
+
a.used = 0;
|
|
337
|
+
a.free = SavedRegs | ScratchRegs;
|
|
338
|
+
if (!config.sse2)
|
|
339
|
+
a.free &= ~XmmRegs;
|
|
340
|
+
debug_only( a.managed = a.free; )
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
NIns* Assembler::nPatchBranch(NIns* branch, NIns* targ)
|
|
344
|
+
{
|
|
345
|
+
NIns* was = 0;
|
|
346
|
+
intptr_t offset = intptr_t(targ) - intptr_t(branch);
|
|
347
|
+
if (branch[0] == JMP32) {
|
|
348
|
+
was = branch + *(int32_t*)&branch[1] + 5;
|
|
349
|
+
*(int32_t*)&branch[1] = offset - 5;
|
|
350
|
+
VALGRIND_DISCARD_TRANSLATIONS(&branch[1], sizeof(int32_t));
|
|
351
|
+
} else if (branch[0] == JCC32) {
|
|
352
|
+
was = branch + *(int32_t*)&branch[2] + 6;
|
|
353
|
+
*(int32_t*)&branch[2] = offset - 6;
|
|
354
|
+
VALGRIND_DISCARD_TRANSLATIONS(&branch[2], sizeof(int32_t));
|
|
355
|
+
} else
|
|
356
|
+
NanoAssertMsg(0, "Unknown branch type in nPatchBranch");
|
|
357
|
+
return was;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
RegisterMask Assembler::hint(LIns* i, RegisterMask allow)
|
|
361
|
+
{
|
|
362
|
+
uint32_t op = i->opcode();
|
|
363
|
+
int prefer = allow;
|
|
364
|
+
if (op == LIR_call || op == LIR_calli) {
|
|
365
|
+
prefer &= rmask(retRegs[0]);
|
|
366
|
+
}
|
|
367
|
+
else if (op == LIR_fcall || op == LIR_fcalli) {
|
|
368
|
+
prefer &= rmask(FST0);
|
|
369
|
+
}
|
|
370
|
+
else if (op == LIR_param) {
|
|
371
|
+
uint32_t max_regs = max_abi_regs[_thisfrag->lirbuf->abi];
|
|
372
|
+
if (i->imm8() < max_regs)
|
|
373
|
+
prefer &= rmask(Register(i->imm8()));
|
|
374
|
+
}
|
|
375
|
+
else if (op == LIR_callh || (op == LIR_rsh && i->oprnd1()->opcode()==LIR_callh)) {
|
|
376
|
+
prefer &= rmask(retRegs[1]);
|
|
377
|
+
}
|
|
378
|
+
else if (i->isCmp()) {
|
|
379
|
+
prefer &= AllowableFlagRegs;
|
|
380
|
+
}
|
|
381
|
+
else if (i->isconst()) {
|
|
382
|
+
prefer &= ScratchRegs;
|
|
383
|
+
}
|
|
384
|
+
return (_allocator.free & prefer) ? prefer : allow;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
void Assembler::asm_qjoin(LIns *ins)
|
|
388
|
+
{
|
|
389
|
+
int d = findMemFor(ins);
|
|
390
|
+
AvmAssert(d);
|
|
391
|
+
LIns* lo = ins->oprnd1();
|
|
392
|
+
LIns* hi = ins->oprnd2();
|
|
393
|
+
|
|
394
|
+
Reservation *resv = getresv(ins);
|
|
395
|
+
Register rr = resv->reg;
|
|
396
|
+
|
|
397
|
+
if (rr != UnknownReg && (rmask(rr) & FpRegs))
|
|
398
|
+
evict(rr);
|
|
399
|
+
|
|
400
|
+
if (hi->isconst())
|
|
401
|
+
{
|
|
402
|
+
STi(FP, d+4, hi->constval());
|
|
403
|
+
}
|
|
404
|
+
else
|
|
405
|
+
{
|
|
406
|
+
Register r = findRegFor(hi, GpRegs);
|
|
407
|
+
ST(FP, d+4, r);
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
if (lo->isconst())
|
|
411
|
+
{
|
|
412
|
+
STi(FP, d, lo->constval());
|
|
413
|
+
}
|
|
414
|
+
else
|
|
415
|
+
{
|
|
416
|
+
// okay if r gets recycled.
|
|
417
|
+
Register r = findRegFor(lo, GpRegs);
|
|
418
|
+
ST(FP, d, r);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
freeRsrcOf(ins, false); // if we had a reg in use, emit a ST to flush it to mem
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
void Assembler::asm_load(int d, Register r)
|
|
425
|
+
{
|
|
426
|
+
if (rmask(r) & FpRegs)
|
|
427
|
+
{
|
|
428
|
+
if (rmask(r) & XmmRegs) {
|
|
429
|
+
SSE_LDQ(r, d, FP);
|
|
430
|
+
} else {
|
|
431
|
+
FLDQ(d, FP);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
else
|
|
435
|
+
{
|
|
436
|
+
LD(r, d, FP);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
void Assembler::asm_restore(LInsp i, Reservation *resv, Register r)
|
|
441
|
+
{
|
|
442
|
+
if (i->isop(LIR_alloc)) {
|
|
443
|
+
verbose_only( if (_verbose) { outputForEOL(" <= remat %s size %d", _thisfrag->lirbuf->names->formatRef(i), i->size()); } )
|
|
444
|
+
LEA(r, disp(resv), FP);
|
|
445
|
+
}
|
|
446
|
+
else if (i->isconst()) {
|
|
447
|
+
if (!resv->arIndex) {
|
|
448
|
+
reserveFree(i);
|
|
449
|
+
}
|
|
450
|
+
LDi(r, i->constval());
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
int d = findMemFor(i);
|
|
454
|
+
verbose_only( if (_verbose) { outputForEOL(" <= restore %s", _thisfrag->lirbuf->names->formatRef(i)); } )
|
|
455
|
+
asm_load(d,r);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
void Assembler::asm_store32(LIns *value, int dr, LIns *base)
|
|
460
|
+
{
|
|
461
|
+
if (value->isconst())
|
|
462
|
+
{
|
|
463
|
+
Register rb = getBaseReg(base, dr, GpRegs);
|
|
464
|
+
int c = value->constval();
|
|
465
|
+
STi(rb, dr, c);
|
|
466
|
+
}
|
|
467
|
+
else
|
|
468
|
+
{
|
|
469
|
+
// make sure what is in a register
|
|
470
|
+
Reservation *rA, *rB;
|
|
471
|
+
Register ra, rb;
|
|
472
|
+
if (base->isop(LIR_alloc)) {
|
|
473
|
+
rb = FP;
|
|
474
|
+
dr += findMemFor(base);
|
|
475
|
+
ra = findRegFor(value, GpRegs);
|
|
476
|
+
} else if (base->isconst()) {
|
|
477
|
+
// absolute address
|
|
478
|
+
dr += base->constval();
|
|
479
|
+
ra = findRegFor(value, GpRegs);
|
|
480
|
+
rb = UnknownReg;
|
|
481
|
+
} else {
|
|
482
|
+
findRegFor2(GpRegs, value, rA, base, rB);
|
|
483
|
+
ra = rA->reg;
|
|
484
|
+
rb = rB->reg;
|
|
485
|
+
}
|
|
486
|
+
ST(rb, dr, ra);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
void Assembler::asm_spill(Register rr, int d, bool pop, bool quad)
|
|
491
|
+
{
|
|
492
|
+
(void)quad;
|
|
493
|
+
if (d)
|
|
494
|
+
{
|
|
495
|
+
// save to spill location
|
|
496
|
+
if (rmask(rr) & FpRegs)
|
|
497
|
+
{
|
|
498
|
+
if (rmask(rr) & XmmRegs) {
|
|
499
|
+
SSE_STQ(d, FP, rr);
|
|
500
|
+
} else {
|
|
501
|
+
FSTQ((pop?1:0), d, FP);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
else
|
|
505
|
+
{
|
|
506
|
+
ST(FP, d, rr);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
else if (pop && (rmask(rr) & x87Regs))
|
|
510
|
+
{
|
|
511
|
+
// pop the fpu result since it isn't used
|
|
512
|
+
FSTP(FST0);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
void Assembler::asm_load64(LInsp ins)
|
|
517
|
+
{
|
|
518
|
+
LIns* base = ins->oprnd1();
|
|
519
|
+
int db = ins->oprnd2()->constval();
|
|
520
|
+
Reservation *resv = getresv(ins);
|
|
521
|
+
Register rr = resv->reg;
|
|
522
|
+
|
|
523
|
+
if (rr != UnknownReg && rmask(rr) & XmmRegs)
|
|
524
|
+
{
|
|
525
|
+
freeRsrcOf(ins, false);
|
|
526
|
+
Register rb = getBaseReg(base, db, GpRegs);
|
|
527
|
+
SSE_LDQ(rr, db, rb);
|
|
528
|
+
}
|
|
529
|
+
else
|
|
530
|
+
{
|
|
531
|
+
int dr = disp(resv);
|
|
532
|
+
Register rb;
|
|
533
|
+
if (base->isop(LIR_alloc)) {
|
|
534
|
+
rb = FP;
|
|
535
|
+
db += findMemFor(base);
|
|
536
|
+
} else {
|
|
537
|
+
rb = findRegFor(base, GpRegs);
|
|
538
|
+
}
|
|
539
|
+
resv->reg = UnknownReg;
|
|
540
|
+
|
|
541
|
+
// don't use an fpu reg to simply load & store the value.
|
|
542
|
+
if (dr)
|
|
543
|
+
asm_mmq(FP, dr, rb, db);
|
|
544
|
+
|
|
545
|
+
freeRsrcOf(ins, false);
|
|
546
|
+
|
|
547
|
+
if (rr != UnknownReg)
|
|
548
|
+
{
|
|
549
|
+
NanoAssert(rmask(rr)&FpRegs);
|
|
550
|
+
_allocator.retire(rr);
|
|
551
|
+
FLDQ(db, rb);
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
void Assembler::asm_store64(LInsp value, int dr, LInsp base)
|
|
557
|
+
{
|
|
558
|
+
if (value->isconstq())
|
|
559
|
+
{
|
|
560
|
+
// if a constant 64-bit value just store it now rather than
|
|
561
|
+
// generating a pointless store/load/store sequence
|
|
562
|
+
Register rb;
|
|
563
|
+
if (base->isop(LIR_alloc)) {
|
|
564
|
+
rb = FP;
|
|
565
|
+
dr += findMemFor(base);
|
|
566
|
+
} else {
|
|
567
|
+
rb = findRegFor(base, GpRegs);
|
|
568
|
+
}
|
|
569
|
+
const int32_t* p = (const int32_t*) (value-2);
|
|
570
|
+
STi(rb, dr+4, p[1]);
|
|
571
|
+
STi(rb, dr, p[0]);
|
|
572
|
+
return;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
if (value->isop(LIR_ldq) || value->isop(LIR_ldqc) || value->isop(LIR_qjoin))
|
|
576
|
+
{
|
|
577
|
+
// value is 64bit struct or int64_t, or maybe a double.
|
|
578
|
+
// it may be live in an FPU reg. Either way, don't
|
|
579
|
+
// put it in an FPU reg just to load & store it.
|
|
580
|
+
|
|
581
|
+
// a) if we know it's not a double, this is right.
|
|
582
|
+
// b) if we guarded that its a double, this store could be on
|
|
583
|
+
// the side exit, copying a non-double.
|
|
584
|
+
// c) maybe its a double just being stored. oh well.
|
|
585
|
+
|
|
586
|
+
if (config.sse2) {
|
|
587
|
+
Register rv = findRegFor(value, XmmRegs);
|
|
588
|
+
Register rb;
|
|
589
|
+
if (base->isop(LIR_alloc)) {
|
|
590
|
+
rb = FP;
|
|
591
|
+
dr += findMemFor(base);
|
|
592
|
+
} else {
|
|
593
|
+
rb = findRegFor(base, GpRegs);
|
|
594
|
+
}
|
|
595
|
+
SSE_STQ(dr, rb, rv);
|
|
596
|
+
return;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
int da = findMemFor(value);
|
|
600
|
+
Register rb;
|
|
601
|
+
if (base->isop(LIR_alloc)) {
|
|
602
|
+
rb = FP;
|
|
603
|
+
dr += findMemFor(base);
|
|
604
|
+
} else {
|
|
605
|
+
rb = findRegFor(base, GpRegs);
|
|
606
|
+
}
|
|
607
|
+
asm_mmq(rb, dr, FP, da);
|
|
608
|
+
return;
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
Register rb;
|
|
612
|
+
if (base->isop(LIR_alloc)) {
|
|
613
|
+
rb = FP;
|
|
614
|
+
dr += findMemFor(base);
|
|
615
|
+
} else {
|
|
616
|
+
rb = findRegFor(base, GpRegs);
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
// if value already in a reg, use that, otherwise
|
|
620
|
+
// try to get it into XMM regs before FPU regs.
|
|
621
|
+
Reservation* rA = getresv(value);
|
|
622
|
+
Register rv;
|
|
623
|
+
int pop = !rA || rA->reg==UnknownReg;
|
|
624
|
+
if (pop) {
|
|
625
|
+
rv = findRegFor(value, config.sse2 ? XmmRegs : FpRegs);
|
|
626
|
+
} else {
|
|
627
|
+
rv = rA->reg;
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
if (rmask(rv) & XmmRegs) {
|
|
631
|
+
SSE_STQ(dr, rb, rv);
|
|
632
|
+
} else {
|
|
633
|
+
FSTQ(pop, dr, rb);
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
/**
|
|
638
|
+
* copy 64 bits: (rd+dd) <- (rs+ds)
|
|
639
|
+
*/
|
|
640
|
+
void Assembler::asm_mmq(Register rd, int dd, Register rs, int ds)
|
|
641
|
+
{
|
|
642
|
+
// value is either a 64bit struct or maybe a float
|
|
643
|
+
// that isn't live in an FPU reg. Either way, don't
|
|
644
|
+
// put it in an FPU reg just to load & store it.
|
|
645
|
+
if (config.sse2)
|
|
646
|
+
{
|
|
647
|
+
// use SSE to load+store 64bits
|
|
648
|
+
Register t = registerAlloc(XmmRegs);
|
|
649
|
+
_allocator.addFree(t);
|
|
650
|
+
SSE_STQ(dd, rd, t);
|
|
651
|
+
SSE_LDQ(t, ds, rs);
|
|
652
|
+
}
|
|
653
|
+
else
|
|
654
|
+
{
|
|
655
|
+
// get a scratch reg
|
|
656
|
+
Register t = registerAlloc(GpRegs & ~(rmask(rd)|rmask(rs)));
|
|
657
|
+
_allocator.addFree(t);
|
|
658
|
+
ST(rd, dd+4, t);
|
|
659
|
+
LD(t, ds+4, rs);
|
|
660
|
+
ST(rd, dd, t);
|
|
661
|
+
LD(t, ds, rs);
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
NIns* Assembler::asm_branch(bool branchOnFalse, LInsp cond, NIns* targ, bool isfar)
|
|
666
|
+
{
|
|
667
|
+
NIns* at = 0;
|
|
668
|
+
LOpcode condop = cond->opcode();
|
|
669
|
+
NanoAssert(cond->isCond());
|
|
670
|
+
|
|
671
|
+
if (condop >= LIR_feq && condop <= LIR_fge)
|
|
672
|
+
{
|
|
673
|
+
return asm_jmpcc(branchOnFalse, cond, targ);
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
// produce the branch
|
|
677
|
+
if (branchOnFalse)
|
|
678
|
+
{
|
|
679
|
+
if (condop == LIR_eq)
|
|
680
|
+
JNE(targ, isfar);
|
|
681
|
+
else if (condop == LIR_ov)
|
|
682
|
+
JNO(targ, isfar);
|
|
683
|
+
else if (condop == LIR_cs)
|
|
684
|
+
JNC(targ, isfar);
|
|
685
|
+
else if (condop == LIR_lt)
|
|
686
|
+
JNL(targ, isfar);
|
|
687
|
+
else if (condop == LIR_le)
|
|
688
|
+
JNLE(targ, isfar);
|
|
689
|
+
else if (condop == LIR_gt)
|
|
690
|
+
JNG(targ, isfar);
|
|
691
|
+
else if (condop == LIR_ge)
|
|
692
|
+
JNGE(targ, isfar);
|
|
693
|
+
else if (condop == LIR_ult)
|
|
694
|
+
JNB(targ, isfar);
|
|
695
|
+
else if (condop == LIR_ule)
|
|
696
|
+
JNBE(targ, isfar);
|
|
697
|
+
else if (condop == LIR_ugt)
|
|
698
|
+
JNA(targ, isfar);
|
|
699
|
+
else //if (condop == LIR_uge)
|
|
700
|
+
JNAE(targ, isfar);
|
|
701
|
+
}
|
|
702
|
+
else // op == LIR_xt
|
|
703
|
+
{
|
|
704
|
+
if (condop == LIR_eq)
|
|
705
|
+
JE(targ, isfar);
|
|
706
|
+
else if (condop == LIR_ov)
|
|
707
|
+
JO(targ, isfar);
|
|
708
|
+
else if (condop == LIR_cs)
|
|
709
|
+
JC(targ, isfar);
|
|
710
|
+
else if (condop == LIR_lt)
|
|
711
|
+
JL(targ, isfar);
|
|
712
|
+
else if (condop == LIR_le)
|
|
713
|
+
JLE(targ, isfar);
|
|
714
|
+
else if (condop == LIR_gt)
|
|
715
|
+
JG(targ, isfar);
|
|
716
|
+
else if (condop == LIR_ge)
|
|
717
|
+
JGE(targ, isfar);
|
|
718
|
+
else if (condop == LIR_ult)
|
|
719
|
+
JB(targ, isfar);
|
|
720
|
+
else if (condop == LIR_ule)
|
|
721
|
+
JBE(targ, isfar);
|
|
722
|
+
else if (condop == LIR_ugt)
|
|
723
|
+
JA(targ, isfar);
|
|
724
|
+
else //if (condop == LIR_uge)
|
|
725
|
+
JAE(targ, isfar);
|
|
726
|
+
}
|
|
727
|
+
at = _nIns;
|
|
728
|
+
asm_cmp(cond);
|
|
729
|
+
return at;
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
void Assembler::asm_switch(LIns* ins, NIns* exit)
|
|
733
|
+
{
|
|
734
|
+
LIns* diff = ins->oprnd1();
|
|
735
|
+
findSpecificRegFor(diff, EBX);
|
|
736
|
+
JMP(exit);
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
void Assembler::asm_cmp(LIns *cond)
|
|
740
|
+
{
|
|
741
|
+
LOpcode condop = cond->opcode();
|
|
742
|
+
|
|
743
|
+
// LIR_ov and LIR_cs recycle the flags set by arithmetic ops
|
|
744
|
+
if ((condop == LIR_ov) || (condop == LIR_cs))
|
|
745
|
+
return;
|
|
746
|
+
|
|
747
|
+
LInsp lhs = cond->oprnd1();
|
|
748
|
+
LInsp rhs = cond->oprnd2();
|
|
749
|
+
Reservation *rA, *rB;
|
|
750
|
+
|
|
751
|
+
NanoAssert((!lhs->isQuad() && !rhs->isQuad()) || (lhs->isQuad() && rhs->isQuad()));
|
|
752
|
+
|
|
753
|
+
// Not supported yet.
|
|
754
|
+
NanoAssert(!lhs->isQuad() && !rhs->isQuad());
|
|
755
|
+
|
|
756
|
+
// ready to issue the compare
|
|
757
|
+
if (rhs->isconst())
|
|
758
|
+
{
|
|
759
|
+
int c = rhs->constval();
|
|
760
|
+
if (c == 0 && cond->isop(LIR_eq)) {
|
|
761
|
+
Register r = findRegFor(lhs, GpRegs);
|
|
762
|
+
TEST(r,r);
|
|
763
|
+
}
|
|
764
|
+
else if (!rhs->isQuad()) {
|
|
765
|
+
Register r = getBaseReg(lhs, c, GpRegs);
|
|
766
|
+
CMPi(r, c);
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
else
|
|
770
|
+
{
|
|
771
|
+
findRegFor2(GpRegs, lhs, rA, rhs, rB);
|
|
772
|
+
Register ra = rA->reg;
|
|
773
|
+
Register rb = rB->reg;
|
|
774
|
+
CMP(ra, rb);
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
void Assembler::asm_loop(LInsp ins, NInsList& loopJumps)
|
|
779
|
+
{
|
|
780
|
+
JMP_long(0);
|
|
781
|
+
loopJumps.add(_nIns);
|
|
782
|
+
|
|
783
|
+
// If the target we are looping to is in a different fragment, we have to restore
|
|
784
|
+
// SP since we will target fragEntry and not loopEntry.
|
|
785
|
+
if (ins->record()->exit->target != _thisfrag)
|
|
786
|
+
MR(SP,FP);
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
void Assembler::asm_fcond(LInsp ins)
|
|
790
|
+
{
|
|
791
|
+
// only want certain regs
|
|
792
|
+
Register r = prepResultReg(ins, AllowableFlagRegs);
|
|
793
|
+
asm_setcc(r, ins);
|
|
794
|
+
|
|
795
|
+
// SETcc only sets low 8 bits, so extend
|
|
796
|
+
MOVZX8(r,r);
|
|
797
|
+
SETNP(r);
|
|
798
|
+
|
|
799
|
+
asm_fcmp(ins);
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
void Assembler::asm_cond(LInsp ins)
|
|
803
|
+
{
|
|
804
|
+
// only want certain regs
|
|
805
|
+
LOpcode op = ins->opcode();
|
|
806
|
+
Register r = prepResultReg(ins, AllowableFlagRegs);
|
|
807
|
+
// SETcc only sets low 8 bits, so extend
|
|
808
|
+
MOVZX8(r,r);
|
|
809
|
+
if (op == LIR_eq)
|
|
810
|
+
SETE(r);
|
|
811
|
+
else if (op == LIR_ov)
|
|
812
|
+
SETO(r);
|
|
813
|
+
else if (op == LIR_cs)
|
|
814
|
+
SETC(r);
|
|
815
|
+
else if (op == LIR_lt)
|
|
816
|
+
SETL(r);
|
|
817
|
+
else if (op == LIR_le)
|
|
818
|
+
SETLE(r);
|
|
819
|
+
else if (op == LIR_gt)
|
|
820
|
+
SETG(r);
|
|
821
|
+
else if (op == LIR_ge)
|
|
822
|
+
SETGE(r);
|
|
823
|
+
else if (op == LIR_ult)
|
|
824
|
+
SETB(r);
|
|
825
|
+
else if (op == LIR_ule)
|
|
826
|
+
SETBE(r);
|
|
827
|
+
else if (op == LIR_ugt)
|
|
828
|
+
SETA(r);
|
|
829
|
+
else // if (op == LIR_uge)
|
|
830
|
+
SETAE(r);
|
|
831
|
+
asm_cmp(ins);
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
void Assembler::asm_arith(LInsp ins)
|
|
835
|
+
{
|
|
836
|
+
LOpcode op = ins->opcode();
|
|
837
|
+
LInsp lhs = ins->oprnd1();
|
|
838
|
+
LInsp rhs = ins->oprnd2();
|
|
839
|
+
|
|
840
|
+
Register rb = UnknownReg;
|
|
841
|
+
RegisterMask allow = GpRegs;
|
|
842
|
+
bool forceReg = (op == LIR_mul || !rhs->isconst());
|
|
843
|
+
|
|
844
|
+
/* Even if lhs == rhs && forceReg, shift instructions require ECX on the rhs. */
|
|
845
|
+
if ((lhs != rhs || (op == LIR_lsh || op == LIR_rsh || op == LIR_ush)) && forceReg)
|
|
846
|
+
{
|
|
847
|
+
if ((rb = asm_binop_rhs_reg(ins)) == UnknownReg) {
|
|
848
|
+
rb = findRegFor(rhs, allow);
|
|
849
|
+
}
|
|
850
|
+
allow &= ~rmask(rb);
|
|
851
|
+
}
|
|
852
|
+
else if ((op == LIR_add||op == LIR_addp) && lhs->isop(LIR_alloc) && rhs->isconst()) {
|
|
853
|
+
// add alloc+const, use lea
|
|
854
|
+
Register rr = prepResultReg(ins, allow);
|
|
855
|
+
int d = findMemFor(lhs) + rhs->constval();
|
|
856
|
+
LEA(rr, d, FP);
|
|
857
|
+
return;
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
Register rr = prepResultReg(ins, allow);
|
|
861
|
+
Reservation* rA = getresv(lhs);
|
|
862
|
+
Register ra;
|
|
863
|
+
// if this is last use of lhs in reg, we can re-use result reg
|
|
864
|
+
if (rA == 0 || (ra = rA->reg) == UnknownReg)
|
|
865
|
+
ra = findSpecificRegFor(lhs, rr);
|
|
866
|
+
// else, rA already has a register assigned.
|
|
867
|
+
|
|
868
|
+
if (forceReg)
|
|
869
|
+
{
|
|
870
|
+
if (lhs == rhs)
|
|
871
|
+
rb = ra;
|
|
872
|
+
|
|
873
|
+
switch (op) {
|
|
874
|
+
case LIR_add:
|
|
875
|
+
case LIR_addp:
|
|
876
|
+
ADD(rr, rb);
|
|
877
|
+
break;
|
|
878
|
+
case LIR_sub:
|
|
879
|
+
SUB(rr, rb);
|
|
880
|
+
break;
|
|
881
|
+
case LIR_mul:
|
|
882
|
+
MUL(rr, rb);
|
|
883
|
+
break;
|
|
884
|
+
case LIR_and:
|
|
885
|
+
AND(rr, rb);
|
|
886
|
+
break;
|
|
887
|
+
case LIR_or:
|
|
888
|
+
OR(rr, rb);
|
|
889
|
+
break;
|
|
890
|
+
case LIR_xor:
|
|
891
|
+
XOR(rr, rb);
|
|
892
|
+
break;
|
|
893
|
+
case LIR_lsh:
|
|
894
|
+
SHL(rr, rb);
|
|
895
|
+
break;
|
|
896
|
+
case LIR_rsh:
|
|
897
|
+
SAR(rr, rb);
|
|
898
|
+
break;
|
|
899
|
+
case LIR_ush:
|
|
900
|
+
SHR(rr, rb);
|
|
901
|
+
break;
|
|
902
|
+
default:
|
|
903
|
+
NanoAssertMsg(0, "Unsupported");
|
|
904
|
+
}
|
|
905
|
+
}
|
|
906
|
+
else
|
|
907
|
+
{
|
|
908
|
+
int c = rhs->constval();
|
|
909
|
+
switch (op) {
|
|
910
|
+
case LIR_addp:
|
|
911
|
+
// this doesn't set cc's, only use it when cc's not required.
|
|
912
|
+
LEA(rr, c, ra);
|
|
913
|
+
ra = rr; // suppress mov
|
|
914
|
+
break;
|
|
915
|
+
case LIR_add:
|
|
916
|
+
ADDi(rr, c);
|
|
917
|
+
break;
|
|
918
|
+
case LIR_sub:
|
|
919
|
+
SUBi(rr, c);
|
|
920
|
+
break;
|
|
921
|
+
case LIR_and:
|
|
922
|
+
ANDi(rr, c);
|
|
923
|
+
break;
|
|
924
|
+
case LIR_or:
|
|
925
|
+
ORi(rr, c);
|
|
926
|
+
break;
|
|
927
|
+
case LIR_xor:
|
|
928
|
+
XORi(rr, c);
|
|
929
|
+
break;
|
|
930
|
+
case LIR_lsh:
|
|
931
|
+
SHLi(rr, c);
|
|
932
|
+
break;
|
|
933
|
+
case LIR_rsh:
|
|
934
|
+
SARi(rr, c);
|
|
935
|
+
break;
|
|
936
|
+
case LIR_ush:
|
|
937
|
+
SHRi(rr, c);
|
|
938
|
+
break;
|
|
939
|
+
default:
|
|
940
|
+
NanoAssertMsg(0, "Unsupported");
|
|
941
|
+
break;
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
if ( rr != ra )
|
|
946
|
+
MR(rr,ra);
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
void Assembler::asm_neg_not(LInsp ins)
|
|
950
|
+
{
|
|
951
|
+
LOpcode op = ins->opcode();
|
|
952
|
+
Register rr = prepResultReg(ins, GpRegs);
|
|
953
|
+
|
|
954
|
+
LIns* lhs = ins->oprnd1();
|
|
955
|
+
Reservation *rA = getresv(lhs);
|
|
956
|
+
// if this is last use of lhs in reg, we can re-use result reg
|
|
957
|
+
Register ra;
|
|
958
|
+
if (rA == 0 || (ra=rA->reg) == UnknownReg)
|
|
959
|
+
ra = findSpecificRegFor(lhs, rr);
|
|
960
|
+
// else, rA already has a register assigned.
|
|
961
|
+
|
|
962
|
+
if (op == LIR_not)
|
|
963
|
+
NOT(rr);
|
|
964
|
+
else
|
|
965
|
+
NEG(rr);
|
|
966
|
+
|
|
967
|
+
if ( rr != ra )
|
|
968
|
+
MR(rr,ra);
|
|
969
|
+
}
|
|
970
|
+
|
|
971
|
+
void Assembler::asm_ld(LInsp ins)
|
|
972
|
+
{
|
|
973
|
+
LOpcode op = ins->opcode();
|
|
974
|
+
LIns* base = ins->oprnd1();
|
|
975
|
+
LIns* disp = ins->oprnd2();
|
|
976
|
+
Register rr = prepResultReg(ins, GpRegs);
|
|
977
|
+
int d = disp->constval();
|
|
978
|
+
|
|
979
|
+
if (base->isconst()) {
|
|
980
|
+
intptr_t addr = base->constval();
|
|
981
|
+
addr += d;
|
|
982
|
+
if (op == LIR_ldcb)
|
|
983
|
+
LD8Zdm(rr, addr);
|
|
984
|
+
else if (op == LIR_ldcs)
|
|
985
|
+
LD16Zdm(rr, addr);
|
|
986
|
+
else
|
|
987
|
+
LDdm(rr, addr);
|
|
988
|
+
return;
|
|
989
|
+
}
|
|
990
|
+
|
|
991
|
+
/* Search for add(X,Y) */
|
|
992
|
+
if (base->opcode() == LIR_piadd) {
|
|
993
|
+
int scale = 0;
|
|
994
|
+
LIns *lhs = base->oprnd1();
|
|
995
|
+
LIns *rhs = base->oprnd2();
|
|
996
|
+
|
|
997
|
+
/* See if we can bypass any SHLs, by searching for
|
|
998
|
+
* add(X, shl(Y,Z)) -> mov r, [X+Y*Z]
|
|
999
|
+
*/
|
|
1000
|
+
if (rhs->opcode() == LIR_pilsh && rhs->oprnd2()->isconst()) {
|
|
1001
|
+
scale = rhs->oprnd2()->constval();
|
|
1002
|
+
if (scale >= 1 && scale <= 3)
|
|
1003
|
+
rhs = rhs->oprnd1();
|
|
1004
|
+
else
|
|
1005
|
+
scale = 0;
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
Register rleft;
|
|
1009
|
+
Reservation *rL = getresv(lhs);
|
|
1010
|
+
|
|
1011
|
+
/* Does LHS have a register yet? If not, re-use the result reg.
|
|
1012
|
+
* @todo -- If LHS is const, we could eliminate a register use.
|
|
1013
|
+
*/
|
|
1014
|
+
if (rL == NULL || rL->reg == UnknownReg)
|
|
1015
|
+
rleft = findSpecificRegFor(lhs, rr);
|
|
1016
|
+
else
|
|
1017
|
+
rleft = rL->reg;
|
|
1018
|
+
|
|
1019
|
+
Register rright = UnknownReg;
|
|
1020
|
+
Reservation *rR = getresv(rhs);
|
|
1021
|
+
|
|
1022
|
+
/* Does RHS have a register yet? If not, try to re-use the result reg. */
|
|
1023
|
+
if (rr != rleft && (rR == NULL || rR->reg == UnknownReg))
|
|
1024
|
+
rright = findSpecificRegFor(rhs, rr);
|
|
1025
|
+
if (rright == UnknownReg)
|
|
1026
|
+
rright = findRegFor(rhs, GpRegs & ~(rmask(rleft)));
|
|
1027
|
+
|
|
1028
|
+
if (op == LIR_ldcb)
|
|
1029
|
+
LD8Zsib(rr, d, rleft, rright, scale);
|
|
1030
|
+
else if (op == LIR_ldcs)
|
|
1031
|
+
LD16Zsib(rr, d, rleft, rright, scale);
|
|
1032
|
+
else
|
|
1033
|
+
LDsib(rr, d, rleft, rright, scale);
|
|
1034
|
+
|
|
1035
|
+
return;
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
Register ra = getBaseReg(base, d, GpRegs);
|
|
1039
|
+
if (op == LIR_ldcb)
|
|
1040
|
+
LD8Z(rr, d, ra);
|
|
1041
|
+
else if (op == LIR_ldcs)
|
|
1042
|
+
LD16Z(rr, d, ra);
|
|
1043
|
+
else
|
|
1044
|
+
LD(rr, d, ra);
|
|
1045
|
+
}
|
|
1046
|
+
|
|
1047
|
+
void Assembler::asm_cmov(LInsp ins)
|
|
1048
|
+
{
|
|
1049
|
+
LOpcode op = ins->opcode();
|
|
1050
|
+
LIns* condval = ins->oprnd1();
|
|
1051
|
+
NanoAssert(condval->isCmp());
|
|
1052
|
+
|
|
1053
|
+
LIns* values = ins->oprnd2();
|
|
1054
|
+
|
|
1055
|
+
NanoAssert(values->opcode() == LIR_2);
|
|
1056
|
+
LIns* iftrue = values->oprnd1();
|
|
1057
|
+
LIns* iffalse = values->oprnd2();
|
|
1058
|
+
|
|
1059
|
+
NanoAssert(op == LIR_qcmov || (!iftrue->isQuad() && !iffalse->isQuad()));
|
|
1060
|
+
|
|
1061
|
+
const Register rr = prepResultReg(ins, GpRegs);
|
|
1062
|
+
|
|
1063
|
+
// this code assumes that neither LD nor MR nor MRcc set any of the condition flags.
|
|
1064
|
+
// (This is true on Intel, is it true on all architectures?)
|
|
1065
|
+
const Register iffalsereg = findRegFor(iffalse, GpRegs & ~rmask(rr));
|
|
1066
|
+
if (op == LIR_cmov) {
|
|
1067
|
+
switch (condval->opcode())
|
|
1068
|
+
{
|
|
1069
|
+
// note that these are all opposites...
|
|
1070
|
+
case LIR_eq: MRNE(rr, iffalsereg); break;
|
|
1071
|
+
case LIR_ov: MRNO(rr, iffalsereg); break;
|
|
1072
|
+
case LIR_cs: MRNC(rr, iffalsereg); break;
|
|
1073
|
+
case LIR_lt: MRGE(rr, iffalsereg); break;
|
|
1074
|
+
case LIR_le: MRG(rr, iffalsereg); break;
|
|
1075
|
+
case LIR_gt: MRLE(rr, iffalsereg); break;
|
|
1076
|
+
case LIR_ge: MRL(rr, iffalsereg); break;
|
|
1077
|
+
case LIR_ult: MRAE(rr, iffalsereg); break;
|
|
1078
|
+
case LIR_ule: MRA(rr, iffalsereg); break;
|
|
1079
|
+
case LIR_ugt: MRBE(rr, iffalsereg); break;
|
|
1080
|
+
case LIR_uge: MRB(rr, iffalsereg); break;
|
|
1081
|
+
default: debug_only( NanoAssert(0); ) break;
|
|
1082
|
+
}
|
|
1083
|
+
} else if (op == LIR_qcmov) {
|
|
1084
|
+
NanoAssert(0);
|
|
1085
|
+
}
|
|
1086
|
+
/*const Register iftruereg =*/ findSpecificRegFor(iftrue, rr);
|
|
1087
|
+
asm_cmp(condval);
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
void Assembler::asm_qhi(LInsp ins)
|
|
1091
|
+
{
|
|
1092
|
+
Register rr = prepResultReg(ins, GpRegs);
|
|
1093
|
+
LIns *q = ins->oprnd1();
|
|
1094
|
+
int d = findMemFor(q);
|
|
1095
|
+
LD(rr, d+4, FP);
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
void Assembler::asm_param(LInsp ins)
|
|
1099
|
+
{
|
|
1100
|
+
uint32_t a = ins->imm8();
|
|
1101
|
+
uint32_t kind = ins->imm8b();
|
|
1102
|
+
if (kind == 0) {
|
|
1103
|
+
// ordinary param
|
|
1104
|
+
AbiKind abi = _thisfrag->lirbuf->abi;
|
|
1105
|
+
uint32_t abi_regcount = max_abi_regs[abi];
|
|
1106
|
+
if (a < abi_regcount) {
|
|
1107
|
+
// incoming arg in register
|
|
1108
|
+
prepResultReg(ins, rmask(argRegs[a]));
|
|
1109
|
+
} else {
|
|
1110
|
+
// incoming arg is on stack, and EBP points nearby (see genPrologue)
|
|
1111
|
+
Register r = prepResultReg(ins, GpRegs);
|
|
1112
|
+
int d = (a - abi_regcount) * sizeof(intptr_t) + 8;
|
|
1113
|
+
LD(r, d, FP);
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
else {
|
|
1117
|
+
// saved param
|
|
1118
|
+
prepResultReg(ins, rmask(savedRegs[a]));
|
|
1119
|
+
}
|
|
1120
|
+
}
|
|
1121
|
+
|
|
1122
|
+
void Assembler::asm_short(LInsp ins)
|
|
1123
|
+
{
|
|
1124
|
+
Register rr = prepResultReg(ins, GpRegs);
|
|
1125
|
+
int32_t val = ins->imm16();
|
|
1126
|
+
if (val == 0)
|
|
1127
|
+
XOR(rr,rr);
|
|
1128
|
+
else
|
|
1129
|
+
LDi(rr, val);
|
|
1130
|
+
}
|
|
1131
|
+
|
|
1132
|
+
void Assembler::asm_int(LInsp ins)
|
|
1133
|
+
{
|
|
1134
|
+
Register rr = prepResultReg(ins, GpRegs);
|
|
1135
|
+
int32_t val = ins->imm32();
|
|
1136
|
+
if (val == 0)
|
|
1137
|
+
XOR(rr,rr);
|
|
1138
|
+
else
|
|
1139
|
+
LDi(rr, val);
|
|
1140
|
+
}
|
|
1141
|
+
|
|
1142
|
+
void Assembler::asm_quad(LInsp ins)
|
|
1143
|
+
{
|
|
1144
|
+
Reservation *rR = getresv(ins);
|
|
1145
|
+
Register rr = rR->reg;
|
|
1146
|
+
if (rr != UnknownReg)
|
|
1147
|
+
{
|
|
1148
|
+
// @todo -- add special-cases for 0 and 1
|
|
1149
|
+
_allocator.retire(rr);
|
|
1150
|
+
rR->reg = UnknownReg;
|
|
1151
|
+
NanoAssert((rmask(rr) & FpRegs) != 0);
|
|
1152
|
+
|
|
1153
|
+
const double d = ins->constvalf();
|
|
1154
|
+
const uint64_t q = ins->constvalq();
|
|
1155
|
+
if (rmask(rr) & XmmRegs) {
|
|
1156
|
+
if (q == 0.0) {
|
|
1157
|
+
// test (int64)0 since -0.0 == 0.0
|
|
1158
|
+
SSE_XORPDr(rr, rr);
|
|
1159
|
+
} else if (d == 1.0) {
|
|
1160
|
+
// 1.0 is extremely frequent and worth special-casing!
|
|
1161
|
+
static const double k_ONE = 1.0;
|
|
1162
|
+
LDSDm(rr, &k_ONE);
|
|
1163
|
+
} else {
|
|
1164
|
+
findMemFor(ins);
|
|
1165
|
+
const int d = disp(rR);
|
|
1166
|
+
SSE_LDQ(rr, d, FP);
|
|
1167
|
+
}
|
|
1168
|
+
} else {
|
|
1169
|
+
if (q == 0.0) {
|
|
1170
|
+
// test (int64)0 since -0.0 == 0.0
|
|
1171
|
+
FLDZ();
|
|
1172
|
+
} else if (d == 1.0) {
|
|
1173
|
+
FLD1();
|
|
1174
|
+
} else {
|
|
1175
|
+
findMemFor(ins);
|
|
1176
|
+
int d = disp(rR);
|
|
1177
|
+
FLDQ(d,FP);
|
|
1178
|
+
}
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1182
|
+
// @todo, if we used xor, ldsd, fldz, etc above, we don't need mem here
|
|
1183
|
+
int d = disp(rR);
|
|
1184
|
+
freeRsrcOf(ins, false);
|
|
1185
|
+
if (d)
|
|
1186
|
+
{
|
|
1187
|
+
const int32_t* p = (const int32_t*) (ins-2);
|
|
1188
|
+
STi(FP,d+4,p[1]);
|
|
1189
|
+
STi(FP,d,p[0]);
|
|
1190
|
+
}
|
|
1191
|
+
}
|
|
1192
|
+
|
|
1193
|
+
void Assembler::asm_qlo(LInsp ins)
|
|
1194
|
+
{
|
|
1195
|
+
LIns *q = ins->oprnd1();
|
|
1196
|
+
|
|
1197
|
+
if (!config.sse2)
|
|
1198
|
+
{
|
|
1199
|
+
Register rr = prepResultReg(ins, GpRegs);
|
|
1200
|
+
int d = findMemFor(q);
|
|
1201
|
+
LD(rr, d, FP);
|
|
1202
|
+
}
|
|
1203
|
+
else
|
|
1204
|
+
{
|
|
1205
|
+
Reservation *resv = getresv(ins);
|
|
1206
|
+
Register rr = resv->reg;
|
|
1207
|
+
if (rr == UnknownReg) {
|
|
1208
|
+
// store quad in spill loc
|
|
1209
|
+
int d = disp(resv);
|
|
1210
|
+
freeRsrcOf(ins, false);
|
|
1211
|
+
Register qr = findRegFor(q, XmmRegs);
|
|
1212
|
+
SSE_MOVDm(d, FP, qr);
|
|
1213
|
+
} else {
|
|
1214
|
+
freeRsrcOf(ins, false);
|
|
1215
|
+
Register qr = findRegFor(q, XmmRegs);
|
|
1216
|
+
SSE_MOVD(rr,qr);
|
|
1217
|
+
}
|
|
1218
|
+
}
|
|
1219
|
+
}
|
|
1220
|
+
|
|
1221
|
+
void Assembler::asm_fneg(LInsp ins)
|
|
1222
|
+
{
|
|
1223
|
+
if (config.sse2)
|
|
1224
|
+
{
|
|
1225
|
+
LIns *lhs = ins->oprnd1();
|
|
1226
|
+
|
|
1227
|
+
Register rr = prepResultReg(ins, XmmRegs);
|
|
1228
|
+
Reservation *rA = getresv(lhs);
|
|
1229
|
+
Register ra;
|
|
1230
|
+
|
|
1231
|
+
// if this is last use of lhs in reg, we can re-use result reg
|
|
1232
|
+
if (rA == 0 || (ra = rA->reg) == UnknownReg) {
|
|
1233
|
+
ra = findSpecificRegFor(lhs, rr);
|
|
1234
|
+
} else if ((rmask(ra) & XmmRegs) == 0) {
|
|
1235
|
+
/* We need this case on AMD64, because it's possible that
|
|
1236
|
+
* an earlier instruction has done a quadword load and reserved a
|
|
1237
|
+
* GPR. If so, ask for a new register.
|
|
1238
|
+
*/
|
|
1239
|
+
ra = findRegFor(lhs, XmmRegs);
|
|
1240
|
+
}
|
|
1241
|
+
// else, rA already has a register assigned.
|
|
1242
|
+
|
|
1243
|
+
#if defined __SUNPRO_CC
|
|
1244
|
+
// from Sun Studio C++ Readme: #pragma align inside namespace requires mangled names
|
|
1245
|
+
static uint32_t temp[] = {0, 0, 0, 0, 0, 0, 0};
|
|
1246
|
+
static uint32_t *negateMask = (uint32_t *)alignUp(temp, 16);
|
|
1247
|
+
negateMask[1] = 0x80000000;
|
|
1248
|
+
#else
|
|
1249
|
+
static const AVMPLUS_ALIGN16(uint32_t) negateMask[] = {0,0x80000000,0,0};
|
|
1250
|
+
#endif
|
|
1251
|
+
SSE_XORPD(rr, negateMask);
|
|
1252
|
+
|
|
1253
|
+
if (rr != ra)
|
|
1254
|
+
SSE_MOVSD(rr, ra);
|
|
1255
|
+
}
|
|
1256
|
+
else
|
|
1257
|
+
{
|
|
1258
|
+
Register rr = prepResultReg(ins, FpRegs);
|
|
1259
|
+
|
|
1260
|
+
LIns* lhs = ins->oprnd1();
|
|
1261
|
+
|
|
1262
|
+
// lhs into reg, prefer same reg as result
|
|
1263
|
+
Reservation* rA = getresv(lhs);
|
|
1264
|
+
// if this is last use of lhs in reg, we can re-use result reg
|
|
1265
|
+
if (rA == 0 || rA->reg == UnknownReg)
|
|
1266
|
+
findSpecificRegFor(lhs, rr);
|
|
1267
|
+
// else, rA already has a different reg assigned
|
|
1268
|
+
|
|
1269
|
+
NanoAssert(getresv(lhs)!=0 && getresv(lhs)->reg==FST0);
|
|
1270
|
+
// assume that the lhs is in ST(0) and rhs is on stack
|
|
1271
|
+
FCHS();
|
|
1272
|
+
|
|
1273
|
+
// if we had more than one fpu reg, this is where
|
|
1274
|
+
// we would move ra into rr if rr != ra.
|
|
1275
|
+
}
|
|
1276
|
+
}
|
|
1277
|
+
|
|
1278
|
+
void Assembler::asm_arg(ArgSize sz, LInsp p, Register r)
|
|
1279
|
+
{
|
|
1280
|
+
if (sz == ARGSIZE_Q)
|
|
1281
|
+
{
|
|
1282
|
+
// ref arg - use lea
|
|
1283
|
+
if (r != UnknownReg)
|
|
1284
|
+
{
|
|
1285
|
+
// arg in specific reg
|
|
1286
|
+
int da = findMemFor(p);
|
|
1287
|
+
LEA(r, da, FP);
|
|
1288
|
+
}
|
|
1289
|
+
else
|
|
1290
|
+
{
|
|
1291
|
+
NanoAssert(0); // not supported
|
|
1292
|
+
}
|
|
1293
|
+
}
|
|
1294
|
+
else if (sz == ARGSIZE_LO)
|
|
1295
|
+
{
|
|
1296
|
+
if (r != UnknownReg) {
|
|
1297
|
+
// arg goes in specific register
|
|
1298
|
+
if (p->isconst()) {
|
|
1299
|
+
LDi(r, p->constval());
|
|
1300
|
+
} else {
|
|
1301
|
+
Reservation* rA = getresv(p);
|
|
1302
|
+
if (rA) {
|
|
1303
|
+
if (rA->reg == UnknownReg) {
|
|
1304
|
+
// load it into the arg reg
|
|
1305
|
+
int d = findMemFor(p);
|
|
1306
|
+
if (p->isop(LIR_alloc)) {
|
|
1307
|
+
LEA(r, d, FP);
|
|
1308
|
+
} else {
|
|
1309
|
+
LD(r, d, FP);
|
|
1310
|
+
}
|
|
1311
|
+
} else {
|
|
1312
|
+
// it must be in a saved reg
|
|
1313
|
+
MR(r, rA->reg);
|
|
1314
|
+
}
|
|
1315
|
+
}
|
|
1316
|
+
else {
|
|
1317
|
+
// this is the last use, so fine to assign it
|
|
1318
|
+
// to the scratch reg, it's dead after this point.
|
|
1319
|
+
findSpecificRegFor(p, r);
|
|
1320
|
+
}
|
|
1321
|
+
}
|
|
1322
|
+
}
|
|
1323
|
+
else {
|
|
1324
|
+
asm_pusharg(p);
|
|
1325
|
+
}
|
|
1326
|
+
}
|
|
1327
|
+
else
|
|
1328
|
+
{
|
|
1329
|
+
NanoAssert(sz == ARGSIZE_F);
|
|
1330
|
+
asm_farg(p);
|
|
1331
|
+
}
|
|
1332
|
+
}
|
|
1333
|
+
|
|
1334
|
+
void Assembler::asm_pusharg(LInsp p)
|
|
1335
|
+
{
|
|
1336
|
+
// arg goes on stack
|
|
1337
|
+
Reservation* rA = getresv(p);
|
|
1338
|
+
if (rA == 0 && p->isconst())
|
|
1339
|
+
{
|
|
1340
|
+
// small const we push directly
|
|
1341
|
+
PUSHi(p->constval());
|
|
1342
|
+
}
|
|
1343
|
+
else if (rA == 0 || p->isop(LIR_alloc))
|
|
1344
|
+
{
|
|
1345
|
+
Register ra = findRegFor(p, GpRegs);
|
|
1346
|
+
PUSHr(ra);
|
|
1347
|
+
}
|
|
1348
|
+
else if (rA->reg == UnknownReg)
|
|
1349
|
+
{
|
|
1350
|
+
PUSHm(disp(rA), FP);
|
|
1351
|
+
}
|
|
1352
|
+
else
|
|
1353
|
+
{
|
|
1354
|
+
PUSHr(rA->reg);
|
|
1355
|
+
}
|
|
1356
|
+
}
|
|
1357
|
+
|
|
1358
|
+
void Assembler::asm_farg(LInsp p)
|
|
1359
|
+
{
|
|
1360
|
+
NanoAssert(p->isQuad());
|
|
1361
|
+
Register r = findRegFor(p, FpRegs);
|
|
1362
|
+
if (rmask(r) & XmmRegs) {
|
|
1363
|
+
SSE_STQ(0, SP, r);
|
|
1364
|
+
} else {
|
|
1365
|
+
FSTPQ(0, SP);
|
|
1366
|
+
/* It's possible that the same LIns* with r=FST0 will appear in the argument list more
|
|
1367
|
+
* than once. In this case FST0 will not have been evicted and the multiple pop
|
|
1368
|
+
* actions will unbalance the FPU stack. A quick fix is to always evict FST0 manually.
|
|
1369
|
+
*/
|
|
1370
|
+
evict(FST0);
|
|
1371
|
+
}
|
|
1372
|
+
SUBi(ESP,8);
|
|
1373
|
+
}
|
|
1374
|
+
|
|
1375
|
+
void Assembler::asm_fop(LInsp ins)
|
|
1376
|
+
{
|
|
1377
|
+
LOpcode op = ins->opcode();
|
|
1378
|
+
if (config.sse2)
|
|
1379
|
+
{
|
|
1380
|
+
LIns *lhs = ins->oprnd1();
|
|
1381
|
+
LIns *rhs = ins->oprnd2();
|
|
1382
|
+
|
|
1383
|
+
RegisterMask allow = XmmRegs;
|
|
1384
|
+
Register rb = UnknownReg;
|
|
1385
|
+
if (lhs != rhs) {
|
|
1386
|
+
rb = findRegFor(rhs,allow);
|
|
1387
|
+
allow &= ~rmask(rb);
|
|
1388
|
+
}
|
|
1389
|
+
|
|
1390
|
+
Register rr = prepResultReg(ins, allow);
|
|
1391
|
+
Reservation *rA = getresv(lhs);
|
|
1392
|
+
Register ra;
|
|
1393
|
+
|
|
1394
|
+
// if this is last use of lhs in reg, we can re-use result reg
|
|
1395
|
+
if (rA == 0 || (ra = rA->reg) == UnknownReg) {
|
|
1396
|
+
ra = findSpecificRegFor(lhs, rr);
|
|
1397
|
+
} else if ((rmask(ra) & XmmRegs) == 0) {
|
|
1398
|
+
/* We need this case on AMD64, because it's possible that
|
|
1399
|
+
* an earlier instruction has done a quadword load and reserved a
|
|
1400
|
+
* GPR. If so, ask for a new register.
|
|
1401
|
+
*/
|
|
1402
|
+
ra = findRegFor(lhs, XmmRegs);
|
|
1403
|
+
}
|
|
1404
|
+
else {
|
|
1405
|
+
// rA already has a register assigned but maybe not from the allow set
|
|
1406
|
+
ra = findRegFor(lhs, allow);
|
|
1407
|
+
}
|
|
1408
|
+
|
|
1409
|
+
if (lhs == rhs)
|
|
1410
|
+
rb = ra;
|
|
1411
|
+
|
|
1412
|
+
if (op == LIR_fadd)
|
|
1413
|
+
SSE_ADDSD(rr, rb);
|
|
1414
|
+
else if (op == LIR_fsub)
|
|
1415
|
+
SSE_SUBSD(rr, rb);
|
|
1416
|
+
else if (op == LIR_fmul)
|
|
1417
|
+
SSE_MULSD(rr, rb);
|
|
1418
|
+
else //if (op == LIR_fdiv)
|
|
1419
|
+
SSE_DIVSD(rr, rb);
|
|
1420
|
+
|
|
1421
|
+
if (rr != ra)
|
|
1422
|
+
SSE_MOVSD(rr, ra);
|
|
1423
|
+
}
|
|
1424
|
+
else
|
|
1425
|
+
{
|
|
1426
|
+
// we swap lhs/rhs on purpose here, works out better
|
|
1427
|
+
// if you only have one fpu reg. use divr/subr.
|
|
1428
|
+
LIns* rhs = ins->oprnd1();
|
|
1429
|
+
LIns* lhs = ins->oprnd2();
|
|
1430
|
+
Register rr = prepResultReg(ins, rmask(FST0));
|
|
1431
|
+
|
|
1432
|
+
// make sure rhs is in memory
|
|
1433
|
+
int db = findMemFor(rhs);
|
|
1434
|
+
|
|
1435
|
+
// lhs into reg, prefer same reg as result
|
|
1436
|
+
Reservation* rA = getresv(lhs);
|
|
1437
|
+
// last use of lhs in reg, can reuse rr
|
|
1438
|
+
if (rA == 0 || rA->reg == UnknownReg)
|
|
1439
|
+
findSpecificRegFor(lhs, rr);
|
|
1440
|
+
// else, rA already has a different reg assigned
|
|
1441
|
+
|
|
1442
|
+
NanoAssert(getresv(lhs)!=0 && getresv(lhs)->reg==FST0);
|
|
1443
|
+
// assume that the lhs is in ST(0) and rhs is on stack
|
|
1444
|
+
if (op == LIR_fadd)
|
|
1445
|
+
{ FADD(db, FP); }
|
|
1446
|
+
else if (op == LIR_fsub)
|
|
1447
|
+
{ FSUBR(db, FP); }
|
|
1448
|
+
else if (op == LIR_fmul)
|
|
1449
|
+
{ FMUL(db, FP); }
|
|
1450
|
+
else if (op == LIR_fdiv)
|
|
1451
|
+
{ FDIVR(db, FP); }
|
|
1452
|
+
}
|
|
1453
|
+
}
|
|
1454
|
+
|
|
1455
|
+
void Assembler::asm_i2f(LInsp ins)
|
|
1456
|
+
{
|
|
1457
|
+
// where our result goes
|
|
1458
|
+
Register rr = prepResultReg(ins, FpRegs);
|
|
1459
|
+
if (rmask(rr) & XmmRegs)
|
|
1460
|
+
{
|
|
1461
|
+
// todo support int value in memory
|
|
1462
|
+
Register gr = findRegFor(ins->oprnd1(), GpRegs);
|
|
1463
|
+
SSE_CVTSI2SD(rr, gr);
|
|
1464
|
+
}
|
|
1465
|
+
else
|
|
1466
|
+
{
|
|
1467
|
+
int d = findMemFor(ins->oprnd1());
|
|
1468
|
+
FILD(d, FP);
|
|
1469
|
+
}
|
|
1470
|
+
}
|
|
1471
|
+
|
|
1472
|
+
Register Assembler::asm_prep_fcall(Reservation *rR, LInsp ins)
|
|
1473
|
+
{
|
|
1474
|
+
if (rR) {
|
|
1475
|
+
Register rr;
|
|
1476
|
+
if ((rr=rR->reg) != UnknownReg && (rmask(rr) & XmmRegs))
|
|
1477
|
+
evict(rr);
|
|
1478
|
+
}
|
|
1479
|
+
return prepResultReg(ins, rmask(FST0));
|
|
1480
|
+
}
|
|
1481
|
+
|
|
1482
|
+
void Assembler::asm_u2f(LInsp ins)
|
|
1483
|
+
{
|
|
1484
|
+
// where our result goes
|
|
1485
|
+
Register rr = prepResultReg(ins, FpRegs);
|
|
1486
|
+
if (rmask(rr) & XmmRegs)
|
|
1487
|
+
{
|
|
1488
|
+
// don't call findRegFor, we want a reg we can stomp on for a very short time,
|
|
1489
|
+
// not a reg that will continue to be associated with the LIns
|
|
1490
|
+
Register gr = registerAlloc(GpRegs);
|
|
1491
|
+
|
|
1492
|
+
// technique inspired by gcc disassembly
|
|
1493
|
+
// Edwin explains it:
|
|
1494
|
+
//
|
|
1495
|
+
// gr is 0..2^32-1
|
|
1496
|
+
//
|
|
1497
|
+
// sub gr,0x80000000
|
|
1498
|
+
//
|
|
1499
|
+
// now gr is -2^31..2^31-1, i.e. the range of int, but not the same value
|
|
1500
|
+
// as before
|
|
1501
|
+
//
|
|
1502
|
+
// cvtsi2sd rr,gr
|
|
1503
|
+
//
|
|
1504
|
+
// rr is now a double with the int value range
|
|
1505
|
+
//
|
|
1506
|
+
// addsd rr, 2147483648.0
|
|
1507
|
+
//
|
|
1508
|
+
// adding back double(0x80000000) makes the range 0..2^32-1.
|
|
1509
|
+
|
|
1510
|
+
static const double k_NEGONE = 2147483648.0;
|
|
1511
|
+
SSE_ADDSDm(rr, &k_NEGONE);
|
|
1512
|
+
|
|
1513
|
+
SSE_CVTSI2SD(rr, gr);
|
|
1514
|
+
|
|
1515
|
+
Reservation* resv = getresv(ins->oprnd1());
|
|
1516
|
+
Register xr;
|
|
1517
|
+
if (resv && (xr = resv->reg) != UnknownReg && (rmask(xr) & GpRegs))
|
|
1518
|
+
{
|
|
1519
|
+
LEA(gr, 0x80000000, xr);
|
|
1520
|
+
}
|
|
1521
|
+
else
|
|
1522
|
+
{
|
|
1523
|
+
const int d = findMemFor(ins->oprnd1());
|
|
1524
|
+
SUBi(gr, 0x80000000);
|
|
1525
|
+
LD(gr, d, FP);
|
|
1526
|
+
}
|
|
1527
|
+
|
|
1528
|
+
// ok, we're done with it
|
|
1529
|
+
_allocator.addFree(gr);
|
|
1530
|
+
}
|
|
1531
|
+
else
|
|
1532
|
+
{
|
|
1533
|
+
const int disp = -8;
|
|
1534
|
+
const Register base = SP;
|
|
1535
|
+
Register gr = findRegFor(ins->oprnd1(), GpRegs);
|
|
1536
|
+
NanoAssert(rr == FST0);
|
|
1537
|
+
FILDQ(disp, base);
|
|
1538
|
+
STi(base, disp+4, 0); // high 32 bits = 0
|
|
1539
|
+
ST(base, disp, gr); // low 32 bits = unsigned value
|
|
1540
|
+
}
|
|
1541
|
+
}
|
|
1542
|
+
|
|
1543
|
+
void Assembler::asm_nongp_copy(Register r, Register s)
|
|
1544
|
+
{
|
|
1545
|
+
if ((rmask(r) & XmmRegs) && (rmask(s) & XmmRegs)) {
|
|
1546
|
+
SSE_MOVSD(r, s);
|
|
1547
|
+
} else if ((rmask(r) & GpRegs) && (rmask(s) & XmmRegs)) {
|
|
1548
|
+
SSE_MOVD(r, s);
|
|
1549
|
+
} else {
|
|
1550
|
+
if (rmask(r) & XmmRegs) {
|
|
1551
|
+
// x87 -> xmm
|
|
1552
|
+
NanoAssertMsg(false, "Should not move data from GPR to XMM");
|
|
1553
|
+
} else {
|
|
1554
|
+
// xmm -> x87
|
|
1555
|
+
NanoAssertMsg(false, "Should not move data from GPR/XMM to x87 FPU");
|
|
1556
|
+
}
|
|
1557
|
+
}
|
|
1558
|
+
}
|
|
1559
|
+
|
|
1560
|
+
NIns * Assembler::asm_jmpcc(bool branchOnFalse, LIns *cond, NIns *targ)
|
|
1561
|
+
{
|
|
1562
|
+
LOpcode c = cond->opcode();
|
|
1563
|
+
if (config.sse2 && c != LIR_feq) {
|
|
1564
|
+
LIns *lhs = cond->oprnd1();
|
|
1565
|
+
LIns *rhs = cond->oprnd2();
|
|
1566
|
+
if (c == LIR_flt) {
|
|
1567
|
+
LIns *t = lhs; lhs = rhs; rhs = t;
|
|
1568
|
+
c = LIR_fgt;
|
|
1569
|
+
}
|
|
1570
|
+
else if (c == LIR_fle) {
|
|
1571
|
+
LIns *t = lhs; lhs = rhs; rhs = t;
|
|
1572
|
+
c = LIR_fge;
|
|
1573
|
+
}
|
|
1574
|
+
|
|
1575
|
+
if (c == LIR_fgt) {
|
|
1576
|
+
if (branchOnFalse) { JNA(targ, false); } else { JA(targ, false); }
|
|
1577
|
+
}
|
|
1578
|
+
else { // if (c == LIR_fge)
|
|
1579
|
+
if (branchOnFalse) { JNAE(targ, false); } else { JAE(targ, false); }
|
|
1580
|
+
}
|
|
1581
|
+
NIns *at = _nIns;
|
|
1582
|
+
Reservation *rA, *rB;
|
|
1583
|
+
findRegFor2(XmmRegs, lhs, rA, rhs, rB);
|
|
1584
|
+
SSE_UCOMISD(rA->reg, rB->reg);
|
|
1585
|
+
return at;
|
|
1586
|
+
}
|
|
1587
|
+
|
|
1588
|
+
if (branchOnFalse)
|
|
1589
|
+
JP(targ, false);
|
|
1590
|
+
else
|
|
1591
|
+
JNP(targ, false);
|
|
1592
|
+
NIns *at = _nIns;
|
|
1593
|
+
asm_fcmp(cond);
|
|
1594
|
+
return at;
|
|
1595
|
+
}
|
|
1596
|
+
|
|
1597
|
+
void Assembler::asm_setcc(Register r, LIns *cond)
|
|
1598
|
+
{
|
|
1599
|
+
LOpcode c = cond->opcode();
|
|
1600
|
+
if (config.sse2 && c != LIR_feq) {
|
|
1601
|
+
MOVZX8(r,r);
|
|
1602
|
+
LIns *lhs = cond->oprnd1();
|
|
1603
|
+
LIns *rhs = cond->oprnd2();
|
|
1604
|
+
if (c == LIR_flt) {
|
|
1605
|
+
LIns *t = lhs; lhs = rhs; rhs = t;
|
|
1606
|
+
SETA(r);
|
|
1607
|
+
}
|
|
1608
|
+
else if (c == LIR_fle) {
|
|
1609
|
+
LIns *t = lhs; lhs = rhs; rhs = t;
|
|
1610
|
+
SETAE(r);
|
|
1611
|
+
}
|
|
1612
|
+
else if (c == LIR_fgt) {
|
|
1613
|
+
SETA(r);
|
|
1614
|
+
}
|
|
1615
|
+
else { // if (c == LIR_fge)
|
|
1616
|
+
SETAE(r);
|
|
1617
|
+
}
|
|
1618
|
+
Reservation *rA, *rB;
|
|
1619
|
+
findRegFor2(XmmRegs, lhs, rA, rhs, rB);
|
|
1620
|
+
SSE_UCOMISD(rA->reg, rB->reg);
|
|
1621
|
+
return;
|
|
1622
|
+
}
|
|
1623
|
+
// SETcc only sets low 8 bits, so extend
|
|
1624
|
+
MOVZX8(r,r);
|
|
1625
|
+
SETNP(r);
|
|
1626
|
+
asm_fcmp(cond);
|
|
1627
|
+
}
|
|
1628
|
+
|
|
1629
|
+
void Assembler::asm_fcmp(LIns *cond)
|
|
1630
|
+
{
|
|
1631
|
+
LOpcode condop = cond->opcode();
|
|
1632
|
+
NanoAssert(condop >= LIR_feq && condop <= LIR_fge);
|
|
1633
|
+
LIns* lhs = cond->oprnd1();
|
|
1634
|
+
LIns* rhs = cond->oprnd2();
|
|
1635
|
+
|
|
1636
|
+
int mask;
|
|
1637
|
+
if (condop == LIR_feq)
|
|
1638
|
+
mask = 0x44;
|
|
1639
|
+
else if (condop == LIR_fle)
|
|
1640
|
+
mask = 0x41;
|
|
1641
|
+
else if (condop == LIR_flt)
|
|
1642
|
+
mask = 0x05;
|
|
1643
|
+
else if (condop == LIR_fge) {
|
|
1644
|
+
// swap, use le
|
|
1645
|
+
condop = LIR_fle;
|
|
1646
|
+
LIns* t = lhs; lhs = rhs; rhs = t;
|
|
1647
|
+
mask = 0x41;
|
|
1648
|
+
} else { // if (condop == LIR_fgt)
|
|
1649
|
+
// swap, use lt
|
|
1650
|
+
condop = LIR_flt;
|
|
1651
|
+
LIns* t = lhs; lhs = rhs; rhs = t;
|
|
1652
|
+
mask = 0x05;
|
|
1653
|
+
}
|
|
1654
|
+
|
|
1655
|
+
if (config.sse2)
|
|
1656
|
+
{
|
|
1657
|
+
// UNORDERED: ZF,PF,CF <- 111;
|
|
1658
|
+
// GREATER_THAN: ZF,PF,CF <- 000;
|
|
1659
|
+
// LESS_THAN: ZF,PF,CF <- 001;
|
|
1660
|
+
// EQUAL: ZF,PF,CF <- 100;
|
|
1661
|
+
|
|
1662
|
+
if (condop == LIR_feq && lhs == rhs) {
|
|
1663
|
+
// nan check
|
|
1664
|
+
Register r = findRegFor(lhs, XmmRegs);
|
|
1665
|
+
SSE_UCOMISD(r, r);
|
|
1666
|
+
}
|
|
1667
|
+
else {
|
|
1668
|
+
evict(EAX);
|
|
1669
|
+
TEST_AH(mask);
|
|
1670
|
+
LAHF();
|
|
1671
|
+
|
|
1672
|
+
Reservation *rA, *rB;
|
|
1673
|
+
findRegFor2(XmmRegs, lhs, rA, rhs, rB);
|
|
1674
|
+
SSE_UCOMISD(rA->reg, rB->reg);
|
|
1675
|
+
}
|
|
1676
|
+
}
|
|
1677
|
+
else
|
|
1678
|
+
{
|
|
1679
|
+
evict(EAX);
|
|
1680
|
+
TEST_AH(mask);
|
|
1681
|
+
FNSTSW_AX();
|
|
1682
|
+
NanoAssert(lhs->isQuad() && rhs->isQuad());
|
|
1683
|
+
Reservation *rA;
|
|
1684
|
+
if (lhs != rhs)
|
|
1685
|
+
{
|
|
1686
|
+
// compare two different numbers
|
|
1687
|
+
int d = findMemFor(rhs);
|
|
1688
|
+
rA = getresv(lhs);
|
|
1689
|
+
int pop = !rA || rA->reg == UnknownReg;
|
|
1690
|
+
findSpecificRegFor(lhs, FST0);
|
|
1691
|
+
// lhs is in ST(0) and rhs is on stack
|
|
1692
|
+
FCOM(pop, d, FP);
|
|
1693
|
+
}
|
|
1694
|
+
else
|
|
1695
|
+
{
|
|
1696
|
+
// compare n to itself, this is a NaN test.
|
|
1697
|
+
rA = getresv(lhs);
|
|
1698
|
+
int pop = !rA || rA->reg == UnknownReg;
|
|
1699
|
+
findSpecificRegFor(lhs, FST0);
|
|
1700
|
+
// value in ST(0)
|
|
1701
|
+
if (pop)
|
|
1702
|
+
FCOMPP();
|
|
1703
|
+
else
|
|
1704
|
+
FCOMP();
|
|
1705
|
+
FLDr(FST0); // DUP
|
|
1706
|
+
}
|
|
1707
|
+
}
|
|
1708
|
+
}
|
|
1709
|
+
|
|
1710
|
+
void Assembler::nativePageReset()
|
|
1711
|
+
{
|
|
1712
|
+
}
|
|
1713
|
+
|
|
1714
|
+
Register Assembler::asm_binop_rhs_reg(LInsp ins)
|
|
1715
|
+
{
|
|
1716
|
+
LOpcode op = ins->opcode();
|
|
1717
|
+
LIns *rhs = ins->oprnd2();
|
|
1718
|
+
|
|
1719
|
+
if (op == LIR_lsh || op == LIR_rsh || op == LIR_ush)
|
|
1720
|
+
return findSpecificRegFor(rhs, ECX);
|
|
1721
|
+
|
|
1722
|
+
return UnknownReg;
|
|
1723
|
+
}
|
|
1724
|
+
|
|
1725
|
+
void Assembler::nativePageSetup()
|
|
1726
|
+
{
|
|
1727
|
+
if (!_nIns) _nIns = pageAlloc();
|
|
1728
|
+
if (!_nExitIns) _nExitIns = pageAlloc(true);
|
|
1729
|
+
}
|
|
1730
|
+
|
|
1731
|
+
// enough room for n bytes
|
|
1732
|
+
void Assembler::underrunProtect(int n)
|
|
1733
|
+
{
|
|
1734
|
+
NanoAssertMsg(n<=LARGEST_UNDERRUN_PROT, "constant LARGEST_UNDERRUN_PROT is too small");
|
|
1735
|
+
NIns *eip = this->_nIns;
|
|
1736
|
+
Page *p = (Page*)pageTop(eip-1);
|
|
1737
|
+
NIns *top = (NIns*) &p->code[0];
|
|
1738
|
+
if (eip - n < top) {
|
|
1739
|
+
// We are done with the current page. Tell Valgrind that new code
|
|
1740
|
+
// has been generated.
|
|
1741
|
+
VALGRIND_DISCARD_TRANSLATIONS(pageTop(p), NJ_PAGE_SIZE);
|
|
1742
|
+
_nIns = pageAlloc(_inExit);
|
|
1743
|
+
JMP(eip);
|
|
1744
|
+
}
|
|
1745
|
+
}
|
|
1746
|
+
|
|
1747
|
+
#endif /* FEATURE_NANOJIT */
|
|
1748
|
+
}
|