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