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