mustang 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (560) hide show
  1. data/.rspec +1 -0
  2. data/Isolate +9 -0
  3. data/README.md +6 -12
  4. data/Rakefile +30 -4
  5. data/TODO.md +9 -0
  6. data/ext/v8/extconf.rb +56 -0
  7. data/ext/v8/v8.cpp +37 -0
  8. data/ext/v8/v8_array.cpp +161 -0
  9. data/ext/v8/v8_array.h +17 -0
  10. data/ext/v8/v8_base.cpp +147 -0
  11. data/ext/v8/v8_base.h +23 -0
  12. data/ext/v8/v8_cast.cpp +151 -0
  13. data/ext/v8/v8_cast.h +64 -0
  14. data/ext/v8/v8_context.cpp +174 -0
  15. data/ext/v8/v8_context.h +12 -0
  16. data/ext/v8/v8_date.cpp +61 -0
  17. data/ext/v8/v8_date.h +16 -0
  18. data/ext/v8/v8_errors.cpp +147 -0
  19. data/ext/v8/v8_errors.h +19 -0
  20. data/ext/v8/v8_external.cpp +66 -0
  21. data/ext/v8/v8_external.h +16 -0
  22. data/ext/v8/v8_function.cpp +182 -0
  23. data/ext/v8/v8_function.h +14 -0
  24. data/ext/v8/v8_integer.cpp +70 -0
  25. data/ext/v8/v8_integer.h +16 -0
  26. data/ext/v8/v8_macros.h +30 -0
  27. data/ext/v8/v8_main.cpp +53 -0
  28. data/ext/v8/v8_main.h +13 -0
  29. data/ext/v8/v8_number.cpp +62 -0
  30. data/ext/v8/v8_number.h +16 -0
  31. data/ext/v8/v8_object.cpp +172 -0
  32. data/ext/v8/v8_object.h +17 -0
  33. data/ext/v8/v8_ref.cpp +72 -0
  34. data/ext/v8/v8_ref.h +43 -0
  35. data/ext/v8/v8_regexp.cpp +148 -0
  36. data/ext/v8/v8_regexp.h +16 -0
  37. data/ext/v8/v8_string.cpp +78 -0
  38. data/ext/v8/v8_string.h +16 -0
  39. data/ext/v8/v8_value.cpp +370 -0
  40. data/ext/v8/v8_value.h +19 -0
  41. data/gemspec.yml +2 -1
  42. data/lib/core_ext/class.rb +14 -0
  43. data/lib/core_ext/object.rb +12 -0
  44. data/lib/core_ext/symbol.rb +23 -0
  45. data/lib/mustang.rb +44 -0
  46. data/lib/mustang/context.rb +69 -0
  47. data/lib/mustang/errors.rb +36 -0
  48. data/lib/support/delegated.rb +25 -0
  49. data/lib/v8/array.rb +21 -0
  50. data/lib/v8/context.rb +13 -0
  51. data/lib/v8/date.rb +20 -0
  52. data/lib/v8/error.rb +15 -0
  53. data/lib/v8/external.rb +16 -0
  54. data/lib/v8/function.rb +11 -0
  55. data/lib/v8/integer.rb +16 -0
  56. data/lib/v8/number.rb +16 -0
  57. data/lib/v8/object.rb +66 -0
  58. data/lib/v8/regexp.rb +23 -0
  59. data/lib/v8/string.rb +27 -0
  60. data/mustang.gemspec +3 -0
  61. data/spec/core_ext/class_spec.rb +19 -0
  62. data/spec/core_ext/object_spec.rb +19 -0
  63. data/spec/core_ext/symbol_spec.rb +27 -0
  64. data/spec/fixtures/test1.js +2 -0
  65. data/spec/fixtures/test2.js +2 -0
  66. data/spec/spec_helper.rb +20 -0
  67. data/spec/v8/array_spec.rb +88 -0
  68. data/spec/v8/cast_spec.rb +151 -0
  69. data/spec/v8/context_spec.rb +78 -0
  70. data/spec/v8/data_spec.rb +39 -0
  71. data/spec/v8/date_spec.rb +45 -0
  72. data/spec/v8/empty_spec.rb +27 -0
  73. data/spec/v8/errors_spec.rb +142 -0
  74. data/spec/v8/external_spec.rb +44 -0
  75. data/spec/v8/function_spec.rb +170 -0
  76. data/spec/v8/integer_spec.rb +41 -0
  77. data/spec/v8/main_spec.rb +18 -0
  78. data/spec/v8/null_spec.rb +27 -0
  79. data/spec/v8/number_spec.rb +40 -0
  80. data/spec/v8/object_spec.rb +79 -0
  81. data/spec/v8/primitive_spec.rb +9 -0
  82. data/spec/v8/regexp_spec.rb +65 -0
  83. data/spec/v8/string_spec.rb +48 -0
  84. data/spec/v8/undefined_spec.rb +27 -0
  85. data/spec/v8/value_spec.rb +215 -0
  86. data/vendor/v8/.gitignore +2 -0
  87. data/vendor/v8/AUTHORS +3 -1
  88. data/vendor/v8/ChangeLog +117 -0
  89. data/vendor/v8/SConstruct +334 -53
  90. data/vendor/v8/include/v8-debug.h +21 -11
  91. data/vendor/v8/include/v8-preparser.h +1 -1
  92. data/vendor/v8/include/v8-profiler.h +122 -43
  93. data/vendor/v8/include/v8-testing.h +5 -0
  94. data/vendor/v8/include/v8.h +171 -17
  95. data/vendor/v8/preparser/SConscript +38 -0
  96. data/vendor/v8/preparser/preparser-process.cc +77 -114
  97. data/vendor/v8/samples/shell.cc +232 -46
  98. data/vendor/v8/src/SConscript +29 -5
  99. data/vendor/v8/src/accessors.cc +70 -211
  100. data/vendor/v8/{test/cctest/test-mips.cc → src/allocation-inl.h} +15 -18
  101. data/vendor/v8/src/allocation.cc +0 -82
  102. data/vendor/v8/src/allocation.h +9 -42
  103. data/vendor/v8/src/api.cc +1645 -1156
  104. data/vendor/v8/src/api.h +76 -12
  105. data/vendor/v8/src/apiutils.h +0 -7
  106. data/vendor/v8/src/arguments.h +15 -4
  107. data/vendor/v8/src/arm/assembler-arm-inl.h +10 -9
  108. data/vendor/v8/src/arm/assembler-arm.cc +62 -23
  109. data/vendor/v8/src/arm/assembler-arm.h +76 -11
  110. data/vendor/v8/src/arm/builtins-arm.cc +39 -33
  111. data/vendor/v8/src/arm/code-stubs-arm.cc +1182 -402
  112. data/vendor/v8/src/arm/code-stubs-arm.h +20 -54
  113. data/vendor/v8/src/arm/codegen-arm.cc +159 -106
  114. data/vendor/v8/src/arm/codegen-arm.h +6 -6
  115. data/vendor/v8/src/arm/constants-arm.h +16 -1
  116. data/vendor/v8/src/arm/cpu-arm.cc +7 -5
  117. data/vendor/v8/src/arm/debug-arm.cc +6 -4
  118. data/vendor/v8/src/arm/deoptimizer-arm.cc +51 -14
  119. data/vendor/v8/src/arm/disasm-arm.cc +47 -15
  120. data/vendor/v8/src/arm/frames-arm.h +1 -1
  121. data/vendor/v8/src/arm/full-codegen-arm.cc +724 -408
  122. data/vendor/v8/src/arm/ic-arm.cc +90 -85
  123. data/vendor/v8/src/arm/lithium-arm.cc +140 -69
  124. data/vendor/v8/src/arm/lithium-arm.h +161 -46
  125. data/vendor/v8/src/arm/lithium-codegen-arm.cc +567 -297
  126. data/vendor/v8/src/arm/lithium-codegen-arm.h +21 -9
  127. data/vendor/v8/src/arm/lithium-gap-resolver-arm.cc +2 -0
  128. data/vendor/v8/src/arm/macro-assembler-arm.cc +457 -96
  129. data/vendor/v8/src/arm/macro-assembler-arm.h +115 -18
  130. data/vendor/v8/src/arm/regexp-macro-assembler-arm.cc +20 -13
  131. data/vendor/v8/src/arm/regexp-macro-assembler-arm.h +1 -0
  132. data/vendor/v8/src/arm/simulator-arm.cc +184 -101
  133. data/vendor/v8/src/arm/simulator-arm.h +26 -21
  134. data/vendor/v8/src/arm/stub-cache-arm.cc +450 -467
  135. data/vendor/v8/src/arm/virtual-frame-arm.cc +14 -12
  136. data/vendor/v8/src/arm/virtual-frame-arm.h +11 -8
  137. data/vendor/v8/src/array.js +35 -18
  138. data/vendor/v8/src/assembler.cc +186 -92
  139. data/vendor/v8/src/assembler.h +106 -69
  140. data/vendor/v8/src/ast-inl.h +5 -0
  141. data/vendor/v8/src/ast.cc +46 -35
  142. data/vendor/v8/src/ast.h +107 -50
  143. data/vendor/v8/src/atomicops.h +2 -0
  144. data/vendor/v8/src/atomicops_internals_mips_gcc.h +169 -0
  145. data/vendor/v8/src/bootstrapper.cc +649 -399
  146. data/vendor/v8/src/bootstrapper.h +94 -27
  147. data/vendor/v8/src/builtins.cc +359 -227
  148. data/vendor/v8/src/builtins.h +157 -123
  149. data/vendor/v8/src/checks.cc +2 -2
  150. data/vendor/v8/src/checks.h +4 -0
  151. data/vendor/v8/src/code-stubs.cc +27 -17
  152. data/vendor/v8/src/code-stubs.h +38 -17
  153. data/vendor/v8/src/codegen-inl.h +5 -1
  154. data/vendor/v8/src/codegen.cc +27 -17
  155. data/vendor/v8/src/codegen.h +9 -9
  156. data/vendor/v8/src/compilation-cache.cc +92 -206
  157. data/vendor/v8/src/compilation-cache.h +205 -30
  158. data/vendor/v8/src/compiler.cc +107 -120
  159. data/vendor/v8/src/compiler.h +17 -2
  160. data/vendor/v8/src/contexts.cc +22 -15
  161. data/vendor/v8/src/contexts.h +14 -8
  162. data/vendor/v8/src/conversions.cc +86 -30
  163. data/vendor/v8/src/counters.cc +19 -4
  164. data/vendor/v8/src/counters.h +28 -16
  165. data/vendor/v8/src/cpu-profiler-inl.h +4 -3
  166. data/vendor/v8/src/cpu-profiler.cc +123 -72
  167. data/vendor/v8/src/cpu-profiler.h +33 -19
  168. data/vendor/v8/src/cpu.h +2 -0
  169. data/vendor/v8/src/d8-debug.cc +3 -3
  170. data/vendor/v8/src/d8-debug.h +7 -6
  171. data/vendor/v8/src/d8-posix.cc +2 -0
  172. data/vendor/v8/src/d8.cc +22 -12
  173. data/vendor/v8/src/d8.gyp +3 -0
  174. data/vendor/v8/src/d8.js +618 -0
  175. data/vendor/v8/src/data-flow.h +3 -3
  176. data/vendor/v8/src/dateparser.h +4 -2
  177. data/vendor/v8/src/debug-agent.cc +10 -9
  178. data/vendor/v8/src/debug-agent.h +9 -11
  179. data/vendor/v8/src/debug-debugger.js +121 -0
  180. data/vendor/v8/src/debug.cc +331 -227
  181. data/vendor/v8/src/debug.h +248 -219
  182. data/vendor/v8/src/deoptimizer.cc +173 -62
  183. data/vendor/v8/src/deoptimizer.h +119 -19
  184. data/vendor/v8/src/disasm.h +3 -0
  185. data/vendor/v8/src/disassembler.cc +10 -9
  186. data/vendor/v8/src/execution.cc +185 -129
  187. data/vendor/v8/src/execution.h +47 -78
  188. data/vendor/v8/src/extensions/experimental/break-iterator.cc +250 -0
  189. data/vendor/v8/src/extensions/experimental/break-iterator.h +89 -0
  190. data/vendor/v8/src/extensions/experimental/experimental.gyp +2 -0
  191. data/vendor/v8/src/extensions/experimental/i18n-extension.cc +22 -2
  192. data/vendor/v8/src/extensions/externalize-string-extension.cc +2 -2
  193. data/vendor/v8/src/extensions/gc-extension.cc +1 -1
  194. data/vendor/v8/src/factory.cc +261 -154
  195. data/vendor/v8/src/factory.h +162 -158
  196. data/vendor/v8/src/flag-definitions.h +17 -11
  197. data/vendor/v8/src/frame-element.cc +0 -5
  198. data/vendor/v8/src/frame-element.h +9 -13
  199. data/vendor/v8/src/frames-inl.h +7 -0
  200. data/vendor/v8/src/frames.cc +56 -46
  201. data/vendor/v8/src/frames.h +36 -25
  202. data/vendor/v8/src/full-codegen.cc +15 -24
  203. data/vendor/v8/src/full-codegen.h +13 -41
  204. data/vendor/v8/src/func-name-inferrer.cc +7 -6
  205. data/vendor/v8/src/func-name-inferrer.h +1 -1
  206. data/vendor/v8/src/gdb-jit.cc +1 -0
  207. data/vendor/v8/src/global-handles.cc +118 -56
  208. data/vendor/v8/src/global-handles.h +98 -40
  209. data/vendor/v8/src/globals.h +2 -2
  210. data/vendor/v8/src/handles-inl.h +106 -9
  211. data/vendor/v8/src/handles.cc +220 -157
  212. data/vendor/v8/src/handles.h +38 -59
  213. data/vendor/v8/src/hashmap.h +3 -3
  214. data/vendor/v8/src/heap-inl.h +141 -25
  215. data/vendor/v8/src/heap-profiler.cc +117 -63
  216. data/vendor/v8/src/heap-profiler.h +38 -21
  217. data/vendor/v8/src/heap.cc +805 -564
  218. data/vendor/v8/src/heap.h +640 -594
  219. data/vendor/v8/src/hydrogen-instructions.cc +216 -73
  220. data/vendor/v8/src/hydrogen-instructions.h +259 -124
  221. data/vendor/v8/src/hydrogen.cc +996 -1171
  222. data/vendor/v8/src/hydrogen.h +163 -144
  223. data/vendor/v8/src/ia32/assembler-ia32-inl.h +12 -11
  224. data/vendor/v8/src/ia32/assembler-ia32.cc +85 -39
  225. data/vendor/v8/src/ia32/assembler-ia32.h +82 -16
  226. data/vendor/v8/src/ia32/builtins-ia32.cc +64 -58
  227. data/vendor/v8/src/ia32/code-stubs-ia32.cc +248 -324
  228. data/vendor/v8/src/ia32/code-stubs-ia32.h +3 -44
  229. data/vendor/v8/src/ia32/codegen-ia32.cc +217 -165
  230. data/vendor/v8/src/ia32/codegen-ia32.h +3 -0
  231. data/vendor/v8/src/ia32/cpu-ia32.cc +6 -5
  232. data/vendor/v8/src/ia32/debug-ia32.cc +8 -5
  233. data/vendor/v8/src/ia32/deoptimizer-ia32.cc +124 -14
  234. data/vendor/v8/src/ia32/disasm-ia32.cc +85 -62
  235. data/vendor/v8/src/ia32/frames-ia32.h +1 -1
  236. data/vendor/v8/src/ia32/full-codegen-ia32.cc +348 -435
  237. data/vendor/v8/src/ia32/ic-ia32.cc +91 -91
  238. data/vendor/v8/src/ia32/lithium-codegen-ia32.cc +500 -255
  239. data/vendor/v8/src/ia32/lithium-codegen-ia32.h +13 -4
  240. data/vendor/v8/src/ia32/lithium-gap-resolver-ia32.cc +6 -0
  241. data/vendor/v8/src/ia32/lithium-ia32.cc +122 -45
  242. data/vendor/v8/src/ia32/lithium-ia32.h +128 -41
  243. data/vendor/v8/src/ia32/macro-assembler-ia32.cc +109 -84
  244. data/vendor/v8/src/ia32/macro-assembler-ia32.h +18 -9
  245. data/vendor/v8/src/ia32/regexp-macro-assembler-ia32.cc +26 -15
  246. data/vendor/v8/src/ia32/regexp-macro-assembler-ia32.h +1 -0
  247. data/vendor/v8/src/ia32/register-allocator-ia32.cc +30 -30
  248. data/vendor/v8/src/ia32/simulator-ia32.h +4 -4
  249. data/vendor/v8/src/ia32/stub-cache-ia32.cc +383 -400
  250. data/vendor/v8/src/ia32/virtual-frame-ia32.cc +36 -13
  251. data/vendor/v8/src/ia32/virtual-frame-ia32.h +11 -5
  252. data/vendor/v8/src/ic-inl.h +12 -2
  253. data/vendor/v8/src/ic.cc +304 -221
  254. data/vendor/v8/src/ic.h +115 -58
  255. data/vendor/v8/src/interpreter-irregexp.cc +25 -21
  256. data/vendor/v8/src/interpreter-irregexp.h +2 -1
  257. data/vendor/v8/src/isolate.cc +883 -0
  258. data/vendor/v8/src/isolate.h +1304 -0
  259. data/vendor/v8/src/json.js +10 -10
  260. data/vendor/v8/src/jsregexp.cc +111 -80
  261. data/vendor/v8/src/jsregexp.h +6 -7
  262. data/vendor/v8/src/jump-target-heavy.cc +5 -8
  263. data/vendor/v8/src/jump-target-heavy.h +0 -6
  264. data/vendor/v8/src/jump-target-inl.h +1 -1
  265. data/vendor/v8/src/jump-target-light.cc +3 -3
  266. data/vendor/v8/src/lithium-allocator-inl.h +2 -0
  267. data/vendor/v8/src/lithium-allocator.cc +42 -30
  268. data/vendor/v8/src/lithium-allocator.h +8 -22
  269. data/vendor/v8/src/lithium.cc +1 -0
  270. data/vendor/v8/src/liveedit.cc +141 -99
  271. data/vendor/v8/src/liveedit.h +7 -2
  272. data/vendor/v8/src/liveobjectlist-inl.h +90 -0
  273. data/vendor/v8/src/liveobjectlist.cc +2537 -1
  274. data/vendor/v8/src/liveobjectlist.h +245 -35
  275. data/vendor/v8/src/log-utils.cc +122 -35
  276. data/vendor/v8/src/log-utils.h +33 -36
  277. data/vendor/v8/src/log.cc +299 -241
  278. data/vendor/v8/src/log.h +177 -110
  279. data/vendor/v8/src/mark-compact.cc +612 -470
  280. data/vendor/v8/src/mark-compact.h +153 -80
  281. data/vendor/v8/src/messages.cc +16 -14
  282. data/vendor/v8/src/messages.js +30 -7
  283. data/vendor/v8/src/mips/assembler-mips-inl.h +155 -35
  284. data/vendor/v8/src/mips/assembler-mips.cc +1093 -219
  285. data/vendor/v8/src/mips/assembler-mips.h +552 -153
  286. data/vendor/v8/src/mips/builtins-mips.cc +43 -100
  287. data/vendor/v8/src/mips/code-stubs-mips.cc +752 -0
  288. data/vendor/v8/src/mips/code-stubs-mips.h +511 -0
  289. data/vendor/v8/src/mips/codegen-mips-inl.h +8 -14
  290. data/vendor/v8/src/mips/codegen-mips.cc +672 -896
  291. data/vendor/v8/src/mips/codegen-mips.h +271 -69
  292. data/vendor/v8/src/mips/constants-mips.cc +44 -20
  293. data/vendor/v8/src/mips/constants-mips.h +238 -40
  294. data/vendor/v8/src/mips/cpu-mips.cc +20 -3
  295. data/vendor/v8/src/mips/debug-mips.cc +35 -7
  296. data/vendor/v8/src/mips/deoptimizer-mips.cc +91 -0
  297. data/vendor/v8/src/mips/disasm-mips.cc +329 -93
  298. data/vendor/v8/src/mips/frames-mips.cc +2 -50
  299. data/vendor/v8/src/mips/frames-mips.h +24 -9
  300. data/vendor/v8/src/mips/full-codegen-mips.cc +473 -23
  301. data/vendor/v8/src/mips/ic-mips.cc +81 -45
  302. data/vendor/v8/src/mips/jump-target-mips.cc +11 -106
  303. data/vendor/v8/src/mips/lithium-codegen-mips.h +65 -0
  304. data/vendor/v8/src/mips/lithium-mips.h +304 -0
  305. data/vendor/v8/src/mips/macro-assembler-mips.cc +2391 -390
  306. data/vendor/v8/src/mips/macro-assembler-mips.h +718 -121
  307. data/vendor/v8/src/mips/regexp-macro-assembler-mips.cc +478 -0
  308. data/vendor/v8/src/mips/regexp-macro-assembler-mips.h +250 -0
  309. data/vendor/v8/src/mips/register-allocator-mips-inl.h +0 -3
  310. data/vendor/v8/src/mips/register-allocator-mips.h +3 -2
  311. data/vendor/v8/src/mips/simulator-mips.cc +1009 -221
  312. data/vendor/v8/src/mips/simulator-mips.h +119 -36
  313. data/vendor/v8/src/mips/stub-cache-mips.cc +331 -148
  314. data/vendor/v8/src/mips/{fast-codegen-mips.cc → virtual-frame-mips-inl.h} +11 -30
  315. data/vendor/v8/src/mips/virtual-frame-mips.cc +137 -149
  316. data/vendor/v8/src/mips/virtual-frame-mips.h +294 -312
  317. data/vendor/v8/src/mirror-debugger.js +9 -8
  318. data/vendor/v8/src/mksnapshot.cc +2 -2
  319. data/vendor/v8/src/objects-debug.cc +16 -16
  320. data/vendor/v8/src/objects-inl.h +421 -195
  321. data/vendor/v8/src/objects-printer.cc +7 -7
  322. data/vendor/v8/src/objects-visiting.cc +1 -1
  323. data/vendor/v8/src/objects-visiting.h +33 -12
  324. data/vendor/v8/src/objects.cc +935 -658
  325. data/vendor/v8/src/objects.h +234 -139
  326. data/vendor/v8/src/parser.cc +484 -439
  327. data/vendor/v8/src/parser.h +35 -14
  328. data/vendor/v8/src/platform-cygwin.cc +173 -107
  329. data/vendor/v8/src/platform-freebsd.cc +224 -72
  330. data/vendor/v8/src/platform-linux.cc +234 -95
  331. data/vendor/v8/src/platform-macos.cc +215 -82
  332. data/vendor/v8/src/platform-nullos.cc +9 -3
  333. data/vendor/v8/src/platform-openbsd.cc +22 -7
  334. data/vendor/v8/src/platform-posix.cc +30 -5
  335. data/vendor/v8/src/platform-solaris.cc +120 -38
  336. data/vendor/v8/src/platform-tls-mac.h +62 -0
  337. data/vendor/v8/src/platform-tls-win32.h +62 -0
  338. data/vendor/v8/src/platform-tls.h +50 -0
  339. data/vendor/v8/src/platform-win32.cc +195 -97
  340. data/vendor/v8/src/platform.h +72 -15
  341. data/vendor/v8/src/preparse-data.cc +2 -0
  342. data/vendor/v8/src/preparser-api.cc +8 -2
  343. data/vendor/v8/src/preparser.cc +1 -1
  344. data/vendor/v8/src/prettyprinter.cc +43 -52
  345. data/vendor/v8/src/prettyprinter.h +1 -1
  346. data/vendor/v8/src/profile-generator-inl.h +0 -28
  347. data/vendor/v8/src/profile-generator.cc +942 -685
  348. data/vendor/v8/src/profile-generator.h +210 -176
  349. data/vendor/v8/src/property.cc +6 -0
  350. data/vendor/v8/src/property.h +14 -3
  351. data/vendor/v8/src/regexp-macro-assembler-irregexp.cc +1 -1
  352. data/vendor/v8/src/regexp-macro-assembler.cc +28 -19
  353. data/vendor/v8/src/regexp-macro-assembler.h +11 -6
  354. data/vendor/v8/src/regexp-stack.cc +18 -10
  355. data/vendor/v8/src/regexp-stack.h +45 -21
  356. data/vendor/v8/src/regexp.js +3 -3
  357. data/vendor/v8/src/register-allocator-inl.h +3 -3
  358. data/vendor/v8/src/register-allocator.cc +1 -7
  359. data/vendor/v8/src/register-allocator.h +5 -15
  360. data/vendor/v8/src/rewriter.cc +2 -1
  361. data/vendor/v8/src/runtime-profiler.cc +158 -128
  362. data/vendor/v8/src/runtime-profiler.h +131 -15
  363. data/vendor/v8/src/runtime.cc +2409 -1692
  364. data/vendor/v8/src/runtime.h +93 -17
  365. data/vendor/v8/src/safepoint-table.cc +3 -0
  366. data/vendor/v8/src/safepoint-table.h +9 -3
  367. data/vendor/v8/src/scanner-base.cc +21 -28
  368. data/vendor/v8/src/scanner-base.h +22 -11
  369. data/vendor/v8/src/scanner.cc +3 -5
  370. data/vendor/v8/src/scanner.h +4 -2
  371. data/vendor/v8/src/scopeinfo.cc +11 -16
  372. data/vendor/v8/src/scopeinfo.h +26 -15
  373. data/vendor/v8/src/scopes.cc +67 -37
  374. data/vendor/v8/src/scopes.h +26 -12
  375. data/vendor/v8/src/serialize.cc +193 -154
  376. data/vendor/v8/src/serialize.h +41 -36
  377. data/vendor/v8/src/small-pointer-list.h +163 -0
  378. data/vendor/v8/src/snapshot-common.cc +1 -1
  379. data/vendor/v8/src/snapshot.h +3 -1
  380. data/vendor/v8/src/spaces-inl.h +30 -25
  381. data/vendor/v8/src/spaces.cc +263 -370
  382. data/vendor/v8/src/spaces.h +178 -166
  383. data/vendor/v8/src/string-search.cc +4 -3
  384. data/vendor/v8/src/string-search.h +21 -20
  385. data/vendor/v8/src/string-stream.cc +32 -24
  386. data/vendor/v8/src/string.js +7 -7
  387. data/vendor/v8/src/stub-cache.cc +324 -248
  388. data/vendor/v8/src/stub-cache.h +181 -155
  389. data/vendor/v8/src/token.cc +3 -3
  390. data/vendor/v8/src/token.h +3 -3
  391. data/vendor/v8/src/top.cc +218 -390
  392. data/vendor/v8/src/type-info.cc +98 -32
  393. data/vendor/v8/src/type-info.h +10 -3
  394. data/vendor/v8/src/unicode.cc +1 -1
  395. data/vendor/v8/src/unicode.h +1 -1
  396. data/vendor/v8/src/utils.h +3 -0
  397. data/vendor/v8/src/v8-counters.cc +18 -11
  398. data/vendor/v8/src/v8-counters.h +34 -13
  399. data/vendor/v8/src/v8.cc +66 -121
  400. data/vendor/v8/src/v8.h +7 -4
  401. data/vendor/v8/src/v8globals.h +18 -12
  402. data/vendor/v8/src/{memory.h → v8memory.h} +0 -0
  403. data/vendor/v8/src/v8natives.js +59 -18
  404. data/vendor/v8/src/v8threads.cc +127 -114
  405. data/vendor/v8/src/v8threads.h +42 -35
  406. data/vendor/v8/src/v8utils.h +2 -39
  407. data/vendor/v8/src/variables.h +1 -1
  408. data/vendor/v8/src/version.cc +26 -5
  409. data/vendor/v8/src/version.h +4 -0
  410. data/vendor/v8/src/virtual-frame-heavy-inl.h +2 -4
  411. data/vendor/v8/src/virtual-frame-light-inl.h +5 -4
  412. data/vendor/v8/src/vm-state-inl.h +21 -17
  413. data/vendor/v8/src/vm-state.h +7 -5
  414. data/vendor/v8/src/win32-headers.h +1 -0
  415. data/vendor/v8/src/x64/assembler-x64-inl.h +12 -11
  416. data/vendor/v8/src/x64/assembler-x64.cc +80 -40
  417. data/vendor/v8/src/x64/assembler-x64.h +67 -17
  418. data/vendor/v8/src/x64/builtins-x64.cc +34 -33
  419. data/vendor/v8/src/x64/code-stubs-x64.cc +636 -377
  420. data/vendor/v8/src/x64/code-stubs-x64.h +14 -48
  421. data/vendor/v8/src/x64/codegen-x64-inl.h +1 -1
  422. data/vendor/v8/src/x64/codegen-x64.cc +158 -136
  423. data/vendor/v8/src/x64/codegen-x64.h +4 -1
  424. data/vendor/v8/src/x64/cpu-x64.cc +7 -5
  425. data/vendor/v8/src/x64/debug-x64.cc +8 -6
  426. data/vendor/v8/src/x64/deoptimizer-x64.cc +195 -20
  427. data/vendor/v8/src/x64/disasm-x64.cc +42 -23
  428. data/vendor/v8/src/x64/frames-x64.cc +1 -1
  429. data/vendor/v8/src/x64/frames-x64.h +2 -2
  430. data/vendor/v8/src/x64/full-codegen-x64.cc +780 -218
  431. data/vendor/v8/src/x64/ic-x64.cc +77 -79
  432. data/vendor/v8/src/x64/jump-target-x64.cc +1 -1
  433. data/vendor/v8/src/x64/lithium-codegen-x64.cc +698 -181
  434. data/vendor/v8/src/x64/lithium-codegen-x64.h +31 -6
  435. data/vendor/v8/src/x64/lithium-x64.cc +136 -54
  436. data/vendor/v8/src/x64/lithium-x64.h +142 -51
  437. data/vendor/v8/src/x64/macro-assembler-x64.cc +456 -187
  438. data/vendor/v8/src/x64/macro-assembler-x64.h +166 -34
  439. data/vendor/v8/src/x64/regexp-macro-assembler-x64.cc +44 -28
  440. data/vendor/v8/src/x64/regexp-macro-assembler-x64.h +8 -4
  441. data/vendor/v8/src/x64/register-allocator-x64-inl.h +3 -3
  442. data/vendor/v8/src/x64/register-allocator-x64.cc +12 -8
  443. data/vendor/v8/src/x64/simulator-x64.h +5 -5
  444. data/vendor/v8/src/x64/stub-cache-x64.cc +299 -344
  445. data/vendor/v8/src/x64/virtual-frame-x64.cc +37 -13
  446. data/vendor/v8/src/x64/virtual-frame-x64.h +13 -7
  447. data/vendor/v8/src/zone-inl.h +49 -3
  448. data/vendor/v8/src/zone.cc +42 -41
  449. data/vendor/v8/src/zone.h +37 -34
  450. data/vendor/v8/test/benchmarks/testcfg.py +100 -0
  451. data/vendor/v8/test/cctest/SConscript +5 -4
  452. data/vendor/v8/test/cctest/cctest.h +3 -2
  453. data/vendor/v8/test/cctest/cctest.status +6 -11
  454. data/vendor/v8/test/cctest/test-accessors.cc +3 -3
  455. data/vendor/v8/test/cctest/test-alloc.cc +39 -33
  456. data/vendor/v8/test/cctest/test-api.cc +1092 -205
  457. data/vendor/v8/test/cctest/test-assembler-arm.cc +39 -25
  458. data/vendor/v8/test/cctest/test-assembler-ia32.cc +36 -37
  459. data/vendor/v8/test/cctest/test-assembler-mips.cc +1098 -40
  460. data/vendor/v8/test/cctest/test-assembler-x64.cc +32 -25
  461. data/vendor/v8/test/cctest/test-ast.cc +1 -0
  462. data/vendor/v8/test/cctest/test-circular-queue.cc +8 -5
  463. data/vendor/v8/test/cctest/test-compiler.cc +24 -24
  464. data/vendor/v8/test/cctest/test-cpu-profiler.cc +140 -5
  465. data/vendor/v8/test/cctest/test-dataflow.cc +1 -0
  466. data/vendor/v8/test/cctest/test-debug.cc +136 -77
  467. data/vendor/v8/test/cctest/test-decls.cc +1 -1
  468. data/vendor/v8/test/cctest/test-deoptimization.cc +25 -24
  469. data/vendor/v8/test/cctest/test-disasm-arm.cc +9 -4
  470. data/vendor/v8/test/cctest/test-disasm-ia32.cc +10 -8
  471. data/vendor/v8/test/cctest/test-func-name-inference.cc +10 -4
  472. data/vendor/v8/test/cctest/test-heap-profiler.cc +226 -164
  473. data/vendor/v8/test/cctest/test-heap.cc +240 -217
  474. data/vendor/v8/test/cctest/test-liveedit.cc +1 -0
  475. data/vendor/v8/test/cctest/test-log-stack-tracer.cc +18 -20
  476. data/vendor/v8/test/cctest/test-log.cc +114 -108
  477. data/vendor/v8/test/cctest/test-macro-assembler-x64.cc +247 -177
  478. data/vendor/v8/test/cctest/test-mark-compact.cc +129 -90
  479. data/vendor/v8/test/cctest/test-parsing.cc +15 -14
  480. data/vendor/v8/test/cctest/test-platform-linux.cc +1 -0
  481. data/vendor/v8/test/cctest/test-platform-tls.cc +66 -0
  482. data/vendor/v8/test/cctest/test-platform-win32.cc +1 -0
  483. data/vendor/v8/test/cctest/test-profile-generator.cc +1 -1
  484. data/vendor/v8/test/cctest/test-regexp.cc +53 -41
  485. data/vendor/v8/test/cctest/test-reloc-info.cc +18 -11
  486. data/vendor/v8/test/cctest/test-serialize.cc +44 -43
  487. data/vendor/v8/test/cctest/test-sockets.cc +8 -3
  488. data/vendor/v8/test/cctest/test-spaces.cc +47 -29
  489. data/vendor/v8/test/cctest/test-strings.cc +20 -20
  490. data/vendor/v8/test/cctest/test-thread-termination.cc +8 -3
  491. data/vendor/v8/test/cctest/test-threads.cc +5 -3
  492. data/vendor/v8/test/cctest/test-utils.cc +5 -4
  493. data/vendor/v8/test/cctest/testcfg.py +7 -3
  494. data/vendor/v8/test/es5conform/es5conform.status +2 -77
  495. data/vendor/v8/test/es5conform/testcfg.py +1 -1
  496. data/vendor/v8/test/message/testcfg.py +1 -1
  497. data/vendor/v8/test/mjsunit/accessors-on-global-object.js +3 -3
  498. data/vendor/v8/test/mjsunit/array-concat.js +43 -1
  499. data/vendor/v8/test/mjsunit/array-join.js +25 -0
  500. data/vendor/v8/test/mjsunit/bitops-info.js +7 -1
  501. data/vendor/v8/test/mjsunit/compiler/array-length.js +2 -2
  502. data/vendor/v8/test/mjsunit/compiler/global-accessors.js +47 -0
  503. data/vendor/v8/test/mjsunit/compiler/pic.js +1 -1
  504. data/vendor/v8/test/mjsunit/compiler/regress-loadfield.js +65 -0
  505. data/vendor/v8/test/mjsunit/math-sqrt.js +5 -1
  506. data/vendor/v8/test/mjsunit/mjsunit.js +59 -8
  507. data/vendor/v8/test/mjsunit/mjsunit.status +0 -12
  508. data/vendor/v8/test/mjsunit/mul-exhaustive.js +129 -11
  509. data/vendor/v8/test/mjsunit/negate-zero.js +1 -1
  510. data/vendor/v8/test/mjsunit/object-freeze.js +5 -13
  511. data/vendor/v8/test/mjsunit/object-prevent-extensions.js +9 -50
  512. data/vendor/v8/test/mjsunit/object-seal.js +4 -13
  513. data/vendor/v8/test/mjsunit/override-eval-with-non-function.js +36 -0
  514. data/vendor/v8/test/mjsunit/regress/regress-1145.js +54 -0
  515. data/vendor/v8/test/mjsunit/regress/regress-1172-bis.js +37 -0
  516. data/vendor/v8/test/mjsunit/regress/regress-1181.js +54 -0
  517. data/vendor/v8/test/mjsunit/regress/regress-1207.js +35 -0
  518. data/vendor/v8/test/mjsunit/regress/regress-1209.js +34 -0
  519. data/vendor/v8/test/mjsunit/regress/regress-1210.js +48 -0
  520. data/vendor/v8/test/mjsunit/regress/regress-1213.js +43 -0
  521. data/vendor/v8/test/mjsunit/regress/regress-1218.js +29 -0
  522. data/vendor/v8/test/mjsunit/regress/regress-1229.js +79 -0
  523. data/vendor/v8/test/mjsunit/regress/regress-1233.js +47 -0
  524. data/vendor/v8/test/mjsunit/regress/regress-1236.js +34 -0
  525. data/vendor/v8/test/mjsunit/regress/regress-1237.js +36 -0
  526. data/vendor/v8/test/mjsunit/regress/regress-1240.js +39 -0
  527. data/vendor/v8/test/mjsunit/regress/regress-1257.js +58 -0
  528. data/vendor/v8/test/mjsunit/regress/regress-1278.js +69 -0
  529. data/vendor/v8/test/mjsunit/regress/regress-create-exception.js +1 -0
  530. data/vendor/v8/test/mjsunit/regress/regress-lazy-deopt-reloc.js +52 -0
  531. data/vendor/v8/test/mjsunit/sin-cos.js +15 -10
  532. data/vendor/v8/test/mjsunit/smi-negative-zero.js +2 -2
  533. data/vendor/v8/test/mjsunit/str-to-num.js +1 -1
  534. data/vendor/v8/test/mjsunit/strict-mode.js +435 -0
  535. data/vendor/v8/test/mjsunit/testcfg.py +23 -6
  536. data/vendor/v8/test/mozilla/mozilla.status +0 -2
  537. data/vendor/v8/test/mozilla/testcfg.py +1 -1
  538. data/vendor/v8/test/preparser/empty.js +28 -0
  539. data/vendor/v8/test/preparser/functions-only.js +38 -0
  540. data/vendor/v8/test/preparser/non-alphanum.js +34 -0
  541. data/vendor/v8/test/preparser/symbols-only.js +49 -0
  542. data/vendor/v8/test/preparser/testcfg.py +90 -0
  543. data/vendor/v8/test/sputnik/testcfg.py +1 -1
  544. data/vendor/v8/test/test262/README +16 -0
  545. data/vendor/v8/test/test262/harness-adapt.js +80 -0
  546. data/vendor/v8/test/test262/test262.status +1506 -0
  547. data/vendor/v8/test/test262/testcfg.py +123 -0
  548. data/vendor/v8/tools/freebsd-tick-processor +10 -0
  549. data/vendor/v8/tools/gyp/v8.gyp +8 -33
  550. data/vendor/v8/tools/linux-tick-processor +5 -3
  551. data/vendor/v8/tools/test.py +37 -14
  552. data/vendor/v8/tools/tickprocessor.js +22 -8
  553. data/vendor/v8/tools/visual_studio/v8_base.vcproj +13 -1
  554. data/vendor/v8/tools/visual_studio/v8_base_arm.vcproj +5 -1
  555. data/vendor/v8/tools/visual_studio/v8_base_x64.vcproj +5 -1
  556. data/vendor/v8/tools/visual_studio/x64.vsprops +1 -0
  557. metadata +1495 -1341
  558. data/ext/extconf.rb +0 -22
  559. data/ext/mustang.cpp +0 -58
  560. data/vendor/v8/src/top.h +0 -608
@@ -58,17 +58,17 @@ TEST(0) {
58
58
  InitializeVM();
59
59
  v8::HandleScope scope;
60
60
 
61
- Assembler assm(NULL, 0);
61
+ Assembler assm(Isolate::Current(), NULL, 0);
62
62
 
63
63
  __ add(r0, r0, Operand(r1));
64
64
  __ mov(pc, Operand(lr));
65
65
 
66
66
  CodeDesc desc;
67
67
  assm.GetCode(&desc);
68
- Object* code = Heap::CreateCode(
68
+ Object* code = HEAP->CreateCode(
69
69
  desc,
70
70
  Code::ComputeFlags(Code::STUB),
71
- Handle<Object>(Heap::undefined_value()))->ToObjectChecked();
71
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
72
72
  CHECK(code->IsCode());
73
73
  #ifdef DEBUG
74
74
  Code::cast(code)->Print();
@@ -84,7 +84,7 @@ TEST(1) {
84
84
  InitializeVM();
85
85
  v8::HandleScope scope;
86
86
 
87
- Assembler assm(NULL, 0);
87
+ Assembler assm(Isolate::Current(), NULL, 0);
88
88
  Label L, C;
89
89
 
90
90
  __ mov(r1, Operand(r0));
@@ -102,10 +102,10 @@ TEST(1) {
102
102
 
103
103
  CodeDesc desc;
104
104
  assm.GetCode(&desc);
105
- Object* code = Heap::CreateCode(
105
+ Object* code = HEAP->CreateCode(
106
106
  desc,
107
107
  Code::ComputeFlags(Code::STUB),
108
- Handle<Object>(Heap::undefined_value()))->ToObjectChecked();
108
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
109
109
  CHECK(code->IsCode());
110
110
  #ifdef DEBUG
111
111
  Code::cast(code)->Print();
@@ -121,7 +121,7 @@ TEST(2) {
121
121
  InitializeVM();
122
122
  v8::HandleScope scope;
123
123
 
124
- Assembler assm(NULL, 0);
124
+ Assembler assm(Isolate::Current(), NULL, 0);
125
125
  Label L, C;
126
126
 
127
127
  __ mov(r1, Operand(r0));
@@ -139,7 +139,7 @@ TEST(2) {
139
139
 
140
140
  // some relocated stuff here, not executed
141
141
  __ RecordComment("dead code, just testing relocations");
142
- __ mov(r0, Operand(Factory::true_value()));
142
+ __ mov(r0, Operand(FACTORY->true_value()));
143
143
  __ RecordComment("dead code, just testing immediate operands");
144
144
  __ mov(r0, Operand(-1));
145
145
  __ mov(r0, Operand(0xFF000000));
@@ -148,10 +148,10 @@ TEST(2) {
148
148
 
149
149
  CodeDesc desc;
150
150
  assm.GetCode(&desc);
151
- Object* code = Heap::CreateCode(
151
+ Object* code = HEAP->CreateCode(
152
152
  desc,
153
153
  Code::ComputeFlags(Code::STUB),
154
- Handle<Object>(Heap::undefined_value()))->ToObjectChecked();
154
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
155
155
  CHECK(code->IsCode());
156
156
  #ifdef DEBUG
157
157
  Code::cast(code)->Print();
@@ -174,7 +174,7 @@ TEST(3) {
174
174
  } T;
175
175
  T t;
176
176
 
177
- Assembler assm(NULL, 0);
177
+ Assembler assm(Isolate::Current(), NULL, 0);
178
178
  Label L, C;
179
179
 
180
180
  __ mov(ip, Operand(sp));
@@ -196,10 +196,10 @@ TEST(3) {
196
196
 
197
197
  CodeDesc desc;
198
198
  assm.GetCode(&desc);
199
- Object* code = Heap::CreateCode(
199
+ Object* code = HEAP->CreateCode(
200
200
  desc,
201
201
  Code::ComputeFlags(Code::STUB),
202
- Handle<Object>(Heap::undefined_value()))->ToObjectChecked();
202
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
203
203
  CHECK(code->IsCode());
204
204
  #ifdef DEBUG
205
205
  Code::cast(code)->Print();
@@ -232,6 +232,8 @@ TEST(4) {
232
232
  double g;
233
233
  double h;
234
234
  int i;
235
+ double m;
236
+ double n;
235
237
  float x;
236
238
  float y;
237
239
  } T;
@@ -239,7 +241,7 @@ TEST(4) {
239
241
 
240
242
  // Create a function that accepts &t, and loads, manipulates, and stores
241
243
  // the doubles and floats.
242
- Assembler assm(NULL, 0);
244
+ Assembler assm(Isolate::Current(), NULL, 0);
243
245
  Label L, C;
244
246
 
245
247
 
@@ -297,14 +299,22 @@ TEST(4) {
297
299
  __ vabs(d0, d2);
298
300
  __ vstr(d0, r4, OFFSET_OF(T, h));
299
301
 
302
+ // Test vneg.
303
+ __ vldr(d1, r4, OFFSET_OF(T, m));
304
+ __ vneg(d0, d1);
305
+ __ vstr(d0, r4, OFFSET_OF(T, m));
306
+ __ vldr(d1, r4, OFFSET_OF(T, n));
307
+ __ vneg(d0, d1);
308
+ __ vstr(d0, r4, OFFSET_OF(T, n));
309
+
300
310
  __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit());
301
311
 
302
312
  CodeDesc desc;
303
313
  assm.GetCode(&desc);
304
- Object* code = Heap::CreateCode(
314
+ Object* code = HEAP->CreateCode(
305
315
  desc,
306
316
  Code::ComputeFlags(Code::STUB),
307
- Handle<Object>(Heap::undefined_value()))->ToObjectChecked();
317
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
308
318
  CHECK(code->IsCode());
309
319
  #ifdef DEBUG
310
320
  Code::cast(code)->Print();
@@ -319,12 +329,16 @@ TEST(4) {
319
329
  t.g = -2718.2818;
320
330
  t.h = 31415926.5;
321
331
  t.i = 0;
332
+ t.m = -2718.2818;
333
+ t.n = 123.456;
322
334
  t.x = 4.5;
323
335
  t.y = 9.0;
324
336
  Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
325
337
  USE(dummy);
326
338
  CHECK_EQ(4.5, t.y);
327
339
  CHECK_EQ(9.0, t.x);
340
+ CHECK_EQ(-123.456, t.n);
341
+ CHECK_EQ(2718.2818, t.m);
328
342
  CHECK_EQ(2, t.i);
329
343
  CHECK_EQ(2718.2818, t.g);
330
344
  CHECK_EQ(31415926.5, t.h);
@@ -343,7 +357,7 @@ TEST(5) {
343
357
  InitializeVM();
344
358
  v8::HandleScope scope;
345
359
 
346
- Assembler assm(NULL, 0);
360
+ Assembler assm(Isolate::Current(), NULL, 0);
347
361
 
348
362
  if (CpuFeatures::IsSupported(ARMv7)) {
349
363
  CpuFeatures::Scope scope(ARMv7);
@@ -357,10 +371,10 @@ TEST(5) {
357
371
 
358
372
  CodeDesc desc;
359
373
  assm.GetCode(&desc);
360
- Object* code = Heap::CreateCode(
374
+ Object* code = HEAP->CreateCode(
361
375
  desc,
362
376
  Code::ComputeFlags(Code::STUB),
363
- Handle<Object>(Heap::undefined_value()))->ToObjectChecked();
377
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
364
378
  CHECK(code->IsCode());
365
379
  #ifdef DEBUG
366
380
  Code::cast(code)->Print();
@@ -379,7 +393,7 @@ TEST(6) {
379
393
  InitializeVM();
380
394
  v8::HandleScope scope;
381
395
 
382
- Assembler assm(NULL, 0);
396
+ Assembler assm(Isolate::Current(), NULL, 0);
383
397
 
384
398
  if (CpuFeatures::IsSupported(ARMv7)) {
385
399
  CpuFeatures::Scope scope(ARMv7);
@@ -392,10 +406,10 @@ TEST(6) {
392
406
 
393
407
  CodeDesc desc;
394
408
  assm.GetCode(&desc);
395
- Object* code = Heap::CreateCode(
409
+ Object* code = HEAP->CreateCode(
396
410
  desc,
397
411
  Code::ComputeFlags(Code::STUB),
398
- Handle<Object>(Heap::undefined_value()))->ToObjectChecked();
412
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
399
413
  CHECK(code->IsCode());
400
414
  #ifdef DEBUG
401
415
  Code::cast(code)->Print();
@@ -422,7 +436,7 @@ static void TestRoundingMode(VCVTTypes types,
422
436
  InitializeVM();
423
437
  v8::HandleScope scope;
424
438
 
425
- Assembler assm(NULL, 0);
439
+ Assembler assm(Isolate::Current(), NULL, 0);
426
440
 
427
441
  if (CpuFeatures::IsSupported(VFP3)) {
428
442
  CpuFeatures::Scope scope(VFP3);
@@ -468,10 +482,10 @@ static void TestRoundingMode(VCVTTypes types,
468
482
 
469
483
  CodeDesc desc;
470
484
  assm.GetCode(&desc);
471
- Object* code = Heap::CreateCode(
485
+ Object* code = HEAP->CreateCode(
472
486
  desc,
473
487
  Code::ComputeFlags(Code::STUB),
474
- Handle<Object>(Heap::undefined_value()))->ToObjectChecked();
488
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
475
489
  CHECK(code->IsCode());
476
490
  #ifdef DEBUG
477
491
  Code::cast(code)->Print();
@@ -61,7 +61,7 @@ TEST(AssemblerIa320) {
61
61
  v8::HandleScope scope;
62
62
 
63
63
  v8::internal::byte buffer[256];
64
- Assembler assm(buffer, sizeof buffer);
64
+ Assembler assm(Isolate::Current(), buffer, sizeof buffer);
65
65
 
66
66
  __ mov(eax, Operand(esp, 4));
67
67
  __ add(eax, Operand(esp, 8));
@@ -69,10 +69,10 @@ TEST(AssemblerIa320) {
69
69
 
70
70
  CodeDesc desc;
71
71
  assm.GetCode(&desc);
72
- Object* code = Heap::CreateCode(desc,
73
- Code::ComputeFlags(Code::STUB),
74
- Handle<Object>(Heap::undefined_value()))->
75
- ToObjectChecked();
72
+ Object* code = HEAP->CreateCode(
73
+ desc,
74
+ Code::ComputeFlags(Code::STUB),
75
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
76
76
  CHECK(code->IsCode());
77
77
  #ifdef OBJECT_PRINT
78
78
  Code::cast(code)->Print();
@@ -89,7 +89,7 @@ TEST(AssemblerIa321) {
89
89
  v8::HandleScope scope;
90
90
 
91
91
  v8::internal::byte buffer[256];
92
- Assembler assm(buffer, sizeof buffer);
92
+ Assembler assm(Isolate::Current(), buffer, sizeof buffer);
93
93
  Label L, C;
94
94
 
95
95
  __ mov(edx, Operand(esp, 4));
@@ -107,10 +107,10 @@ TEST(AssemblerIa321) {
107
107
 
108
108
  CodeDesc desc;
109
109
  assm.GetCode(&desc);
110
- Object* code = Heap::CreateCode(desc,
111
- Code::ComputeFlags(Code::STUB),
112
- Handle<Object>(Heap::undefined_value()))->
113
- ToObjectChecked();
110
+ Object* code = HEAP->CreateCode(
111
+ desc,
112
+ Code::ComputeFlags(Code::STUB),
113
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
114
114
  CHECK(code->IsCode());
115
115
  #ifdef OBJECT_PRINT
116
116
  Code::cast(code)->Print();
@@ -127,7 +127,7 @@ TEST(AssemblerIa322) {
127
127
  v8::HandleScope scope;
128
128
 
129
129
  v8::internal::byte buffer[256];
130
- Assembler assm(buffer, sizeof buffer);
130
+ Assembler assm(Isolate::Current(), buffer, sizeof buffer);
131
131
  Label L, C;
132
132
 
133
133
  __ mov(edx, Operand(esp, 4));
@@ -144,16 +144,15 @@ TEST(AssemblerIa322) {
144
144
  __ ret(0);
145
145
 
146
146
  // some relocated stuff here, not executed
147
- __ mov(eax, Factory::true_value());
147
+ __ mov(eax, FACTORY->true_value());
148
148
  __ jmp(NULL, RelocInfo::RUNTIME_ENTRY);
149
149
 
150
150
  CodeDesc desc;
151
151
  assm.GetCode(&desc);
152
- Object* code = Heap::CreateCode(
152
+ Object* code = HEAP->CreateCode(
153
153
  desc,
154
154
  Code::ComputeFlags(Code::STUB),
155
- Handle<Object>(Heap::undefined_value()))->ToObjectChecked();
156
-
155
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
157
156
  CHECK(code->IsCode());
158
157
  #ifdef OBJECT_PRINT
159
158
  Code::cast(code)->Print();
@@ -168,13 +167,13 @@ TEST(AssemblerIa322) {
168
167
  typedef int (*F3)(float x);
169
168
 
170
169
  TEST(AssemblerIa323) {
170
+ InitializeVM();
171
171
  if (!CpuFeatures::IsSupported(SSE2)) return;
172
172
 
173
- InitializeVM();
174
173
  v8::HandleScope scope;
175
174
 
176
175
  v8::internal::byte buffer[256];
177
- Assembler assm(buffer, sizeof buffer);
176
+ Assembler assm(Isolate::Current(), buffer, sizeof buffer);
178
177
 
179
178
  CHECK(CpuFeatures::IsSupported(SSE2));
180
179
  { CpuFeatures::Scope fscope(SSE2);
@@ -184,10 +183,10 @@ TEST(AssemblerIa323) {
184
183
 
185
184
  CodeDesc desc;
186
185
  assm.GetCode(&desc);
187
- Code* code = Code::cast(Heap::CreateCode(
186
+ Code* code = Code::cast(HEAP->CreateCode(
188
187
  desc,
189
188
  Code::ComputeFlags(Code::STUB),
190
- Handle<Object>(Heap::undefined_value()))->ToObjectChecked());
189
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked());
191
190
  // don't print the code - our disassembler can't handle cvttss2si
192
191
  // instead print bytes
193
192
  Disassembler::Dump(stdout,
@@ -203,13 +202,13 @@ TEST(AssemblerIa323) {
203
202
  typedef int (*F4)(double x);
204
203
 
205
204
  TEST(AssemblerIa324) {
205
+ InitializeVM();
206
206
  if (!CpuFeatures::IsSupported(SSE2)) return;
207
207
 
208
- InitializeVM();
209
208
  v8::HandleScope scope;
210
209
 
211
210
  v8::internal::byte buffer[256];
212
- Assembler assm(buffer, sizeof buffer);
211
+ Assembler assm(Isolate::Current(), buffer, sizeof buffer);
213
212
 
214
213
  CHECK(CpuFeatures::IsSupported(SSE2));
215
214
  CpuFeatures::Scope fscope(SSE2);
@@ -218,10 +217,10 @@ TEST(AssemblerIa324) {
218
217
 
219
218
  CodeDesc desc;
220
219
  assm.GetCode(&desc);
221
- Code* code = Code::cast(Heap::CreateCode(
220
+ Code* code = Code::cast(HEAP->CreateCode(
222
221
  desc,
223
222
  Code::ComputeFlags(Code::STUB),
224
- Handle<Object>(Heap::undefined_value()))->ToObjectChecked());
223
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked());
225
224
  // don't print the code - our disassembler can't handle cvttsd2si
226
225
  // instead print bytes
227
226
  Disassembler::Dump(stdout,
@@ -240,17 +239,17 @@ TEST(AssemblerIa325) {
240
239
  v8::HandleScope scope;
241
240
 
242
241
  v8::internal::byte buffer[256];
243
- Assembler assm(buffer, sizeof buffer);
242
+ Assembler assm(Isolate::Current(), buffer, sizeof buffer);
244
243
 
245
244
  __ mov(eax, Operand(reinterpret_cast<intptr_t>(&baz), RelocInfo::NONE));
246
245
  __ ret(0);
247
246
 
248
247
  CodeDesc desc;
249
248
  assm.GetCode(&desc);
250
- Code* code = Code::cast(Heap::CreateCode(
249
+ Code* code = Code::cast(HEAP->CreateCode(
251
250
  desc,
252
251
  Code::ComputeFlags(Code::STUB),
253
- Handle<Object>(Heap::undefined_value()))->ToObjectChecked());
252
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked());
254
253
  F0 f = FUNCTION_CAST<F0>(code->entry());
255
254
  int res = f();
256
255
  CHECK_EQ(42, res);
@@ -260,14 +259,14 @@ TEST(AssemblerIa325) {
260
259
  typedef double (*F5)(double x, double y);
261
260
 
262
261
  TEST(AssemblerIa326) {
262
+ InitializeVM();
263
263
  if (!CpuFeatures::IsSupported(SSE2)) return;
264
264
 
265
- InitializeVM();
266
265
  v8::HandleScope scope;
267
266
  CHECK(CpuFeatures::IsSupported(SSE2));
268
267
  CpuFeatures::Scope fscope(SSE2);
269
268
  v8::internal::byte buffer[256];
270
- Assembler assm(buffer, sizeof buffer);
269
+ Assembler assm(Isolate::Current(), buffer, sizeof buffer);
271
270
 
272
271
  __ movdbl(xmm0, Operand(esp, 1 * kPointerSize));
273
272
  __ movdbl(xmm1, Operand(esp, 3 * kPointerSize));
@@ -284,10 +283,10 @@ TEST(AssemblerIa326) {
284
283
 
285
284
  CodeDesc desc;
286
285
  assm.GetCode(&desc);
287
- Code* code = Code::cast(Heap::CreateCode(
286
+ Code* code = Code::cast(HEAP->CreateCode(
288
287
  desc,
289
288
  Code::ComputeFlags(Code::STUB),
290
- Handle<Object>(Heap::undefined_value()))->ToObjectChecked());
289
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked());
291
290
  #ifdef DEBUG
292
291
  ::printf("\n---\n");
293
292
  // don't print the code - our disassembler can't handle SSE instructions
@@ -306,14 +305,14 @@ TEST(AssemblerIa326) {
306
305
  typedef double (*F6)(int x);
307
306
 
308
307
  TEST(AssemblerIa328) {
308
+ InitializeVM();
309
309
  if (!CpuFeatures::IsSupported(SSE2)) return;
310
310
 
311
- InitializeVM();
312
311
  v8::HandleScope scope;
313
312
  CHECK(CpuFeatures::IsSupported(SSE2));
314
313
  CpuFeatures::Scope fscope(SSE2);
315
314
  v8::internal::byte buffer[256];
316
- Assembler assm(buffer, sizeof buffer);
315
+ Assembler assm(Isolate::Current(), buffer, sizeof buffer);
317
316
  __ mov(eax, Operand(esp, 4));
318
317
  __ cvtsi2sd(xmm0, Operand(eax));
319
318
  // Copy xmm0 to st(0) using eight bytes of stack.
@@ -324,10 +323,10 @@ TEST(AssemblerIa328) {
324
323
  __ ret(0);
325
324
  CodeDesc desc;
326
325
  assm.GetCode(&desc);
327
- Code* code = Code::cast(Heap::CreateCode(
326
+ Code* code = Code::cast(HEAP->CreateCode(
328
327
  desc,
329
328
  Code::ComputeFlags(Code::STUB),
330
- Handle<Object>(Heap::undefined_value()))->ToObjectChecked());
329
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked());
331
330
  CHECK(code->IsCode());
332
331
  #ifdef OBJECT_PRINT
333
332
  Code::cast(code)->Print();
@@ -346,7 +345,7 @@ TEST(AssemblerIa329) {
346
345
  InitializeVM();
347
346
  v8::HandleScope scope;
348
347
  v8::internal::byte buffer[256];
349
- MacroAssembler assm(buffer, sizeof buffer);
348
+ MacroAssembler assm(Isolate::Current(), buffer, sizeof buffer);
350
349
  enum { kEqual = 0, kGreater = 1, kLess = 2, kNaN = 3, kUndefined = 4 };
351
350
  Label equal_l, less_l, greater_l, nan_l;
352
351
  __ fld_d(Operand(esp, 3 * kPointerSize));
@@ -379,10 +378,10 @@ TEST(AssemblerIa329) {
379
378
 
380
379
  CodeDesc desc;
381
380
  assm.GetCode(&desc);
382
- Code* code = Code::cast(Heap::CreateCode(
381
+ Code* code = Code::cast(HEAP->CreateCode(
383
382
  desc,
384
383
  Code::ComputeFlags(Code::STUB),
385
- Handle<Object>(Heap::undefined_value()))->ToObjectChecked());
384
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked());
386
385
  CHECK(code->IsCode());
387
386
  #ifdef OBJECT_PRINT
388
387
  Code::cast(code)->Print();
@@ -59,6 +59,7 @@ static void InitializeVM() {
59
59
 
60
60
  #define __ assm.
61
61
 
62
+
62
63
  TEST(MIPS0) {
63
64
  InitializeVM();
64
65
  v8::HandleScope scope;
@@ -72,14 +73,11 @@ TEST(MIPS0) {
72
73
 
73
74
  CodeDesc desc;
74
75
  assm.GetCode(&desc);
75
- Object* code = Heap::CreateCode(desc,
76
- NULL,
77
- Code::ComputeFlags(Code::STUB),
78
- Handle<Object>(Heap::undefined_value()));
76
+ Object* code = HEAP->CreateCode(
77
+ desc,
78
+ Code::ComputeFlags(Code::STUB),
79
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
79
80
  CHECK(code->IsCode());
80
- #ifdef DEBUG
81
- Code::cast(code)->Print();
82
- #endif
83
81
  F2 f = FUNCTION_CAST<F2>(Code::cast(code)->entry());
84
82
  int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 0xab0, 0xc, 0, 0, 0));
85
83
  ::printf("f() = %d\n", res);
@@ -100,12 +98,12 @@ TEST(MIPS1) {
100
98
  __ nop();
101
99
 
102
100
  __ bind(&L);
103
- __ add(v0, v0, a1);
101
+ __ addu(v0, v0, a1);
104
102
  __ addiu(a1, a1, -1);
105
103
 
106
104
  __ bind(&C);
107
105
  __ xori(v1, a1, 0);
108
- __ Branch(ne, &L, v1, Operand(0, RelocInfo::NONE));
106
+ __ Branch(&L, ne, v1, Operand(0));
109
107
  __ nop();
110
108
 
111
109
  __ jr(ra);
@@ -113,14 +111,11 @@ TEST(MIPS1) {
113
111
 
114
112
  CodeDesc desc;
115
113
  assm.GetCode(&desc);
116
- Object* code = Heap::CreateCode(desc,
117
- NULL,
118
- Code::ComputeFlags(Code::STUB),
119
- Handle<Object>(Heap::undefined_value()));
114
+ Object* code = HEAP->CreateCode(
115
+ desc,
116
+ Code::ComputeFlags(Code::STUB),
117
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
120
118
  CHECK(code->IsCode());
121
- #ifdef DEBUG
122
- Code::cast(code)->Print();
123
- #endif
124
119
  F1 f = FUNCTION_CAST<F1>(Code::cast(code)->entry());
125
120
  int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 50, 0, 0, 0, 0));
126
121
  ::printf("f() = %d\n", res);
@@ -166,62 +161,81 @@ TEST(MIPS2) {
166
161
  __ srav(v0, v0, t0); // 0xff234560
167
162
  __ sllv(v0, v0, t0); // 0xf2345600
168
163
  __ srlv(v0, v0, t0); // 0x0f234560
169
- __ Branch(ne, &error, v0, Operand(0x0f234560));
164
+ __ Branch(&error, ne, v0, Operand(0x0f234560));
170
165
  __ nop();
171
166
 
172
- __ add(v0, t0, t1); // 0x00001238
173
- __ sub(v0, v0, t0); // 0x00001234
174
- __ Branch(ne, &error, v0, Operand(0x00001234));
167
+ __ addu(v0, t0, t1); // 0x00001238
168
+ __ subu(v0, v0, t0); // 0x00001234
169
+ __ Branch(&error, ne, v0, Operand(0x00001234));
175
170
  __ nop();
176
171
  __ addu(v1, t3, t0);
177
- __ Branch(ne, &error, v1, Operand(0x80000003));
172
+ __ Branch(&error, ne, v1, Operand(0x80000003));
178
173
  __ nop();
179
174
  __ subu(v1, t7, t0); // 0x7ffffffc
180
- __ Branch(ne, &error, v1, Operand(0x7ffffffc));
175
+ __ Branch(&error, ne, v1, Operand(0x7ffffffc));
181
176
  __ nop();
182
177
 
183
178
  __ and_(v0, t1, t2); // 0x00001230
184
179
  __ or_(v0, v0, t1); // 0x00001234
185
180
  __ xor_(v0, v0, t2); // 0x1234444c
186
181
  __ nor(v0, v0, t2); // 0xedcba987
187
- __ Branch(ne, &error, v0, Operand(0xedcba983));
182
+ __ Branch(&error, ne, v0, Operand(0xedcba983));
188
183
  __ nop();
189
184
 
190
185
  __ slt(v0, t7, t3);
191
- __ Branch(ne, &error, v0, Operand(0x1));
186
+ __ Branch(&error, ne, v0, Operand(0x1));
192
187
  __ nop();
193
188
  __ sltu(v0, t7, t3);
194
- __ Branch(ne, &error, v0, Operand(0x0));
189
+ __ Branch(&error, ne, v0, Operand(0x0));
195
190
  __ nop();
196
191
  // End of SPECIAL class.
197
192
 
198
- __ addi(v0, zero_reg, 0x7421); // 0x00007421
199
- __ addi(v0, v0, -0x1); // 0x00007420
193
+ __ addiu(v0, zero_reg, 0x7421); // 0x00007421
194
+ __ addiu(v0, v0, -0x1); // 0x00007420
200
195
  __ addiu(v0, v0, -0x20); // 0x00007400
201
- __ Branch(ne, &error, v0, Operand(0x00007400));
196
+ __ Branch(&error, ne, v0, Operand(0x00007400));
202
197
  __ nop();
203
198
  __ addiu(v1, t3, 0x1); // 0x80000000
204
- __ Branch(ne, &error, v1, Operand(0x80000000));
199
+ __ Branch(&error, ne, v1, Operand(0x80000000));
205
200
  __ nop();
206
201
 
207
202
  __ slti(v0, t1, 0x00002000); // 0x1
208
203
  __ slti(v0, v0, 0xffff8000); // 0x0
209
- __ Branch(ne, &error, v0, Operand(0x0));
204
+ __ Branch(&error, ne, v0, Operand(0x0));
210
205
  __ nop();
211
206
  __ sltiu(v0, t1, 0x00002000); // 0x1
212
207
  __ sltiu(v0, v0, 0x00008000); // 0x1
213
- __ Branch(ne, &error, v0, Operand(0x1));
208
+ __ Branch(&error, ne, v0, Operand(0x1));
214
209
  __ nop();
215
210
 
216
211
  __ andi(v0, t1, 0xf0f0); // 0x00001030
217
212
  __ ori(v0, v0, 0x8a00); // 0x00009a30
218
213
  __ xori(v0, v0, 0x83cc); // 0x000019fc
219
- __ Branch(ne, &error, v0, Operand(0x000019fc));
214
+ __ Branch(&error, ne, v0, Operand(0x000019fc));
220
215
  __ nop();
221
216
  __ lui(v1, 0x8123); // 0x81230000
222
- __ Branch(ne, &error, v1, Operand(0x81230000));
217
+ __ Branch(&error, ne, v1, Operand(0x81230000));
223
218
  __ nop();
224
219
 
220
+ // Bit twiddling instructions & conditional moves.
221
+ // Uses t0-t7 as set above.
222
+ __ clz(v0, t0); // 29
223
+ __ clz(v1, t1); // 19
224
+ __ addu(v0, v0, v1); // 48
225
+ __ clz(v1, t2); // 3
226
+ __ addu(v0, v0, v1); // 51
227
+ __ clz(v1, t7); // 0
228
+ __ addu(v0, v0, v1); // 51
229
+ __ Branch(&error, ne, v0, Operand(51));
230
+ __ movn(a0, t3, t0); // Move a0<-t3 (t0 is NOT 0).
231
+ __ Ins(a0, t1, 12, 8); // 0x7ff34fff
232
+ __ Branch(&error, ne, a0, Operand(0x7ff34fff));
233
+ __ movz(a0, t6, t7); // a0 not updated (t7 is NOT 0).
234
+ __ Ext(a1, a0, 8, 12); // 0x34f
235
+ __ Branch(&error, ne, a1, Operand(0x34f));
236
+ __ movz(a0, t6, v1); // a0<-t6, v0 is 0, from 8 instr back.
237
+ __ Branch(&error, ne, a0, Operand(t6));
238
+
225
239
  // Everything was correctly executed. Load the expected result.
226
240
  __ li(v0, 0x31415926);
227
241
  __ b(&exit);
@@ -229,6 +243,7 @@ TEST(MIPS2) {
229
243
 
230
244
  __ bind(&error);
231
245
  // Got an error. Return a wrong result.
246
+ __ li(v0, 666);
232
247
 
233
248
  __ bind(&exit);
234
249
  __ jr(ra);
@@ -236,18 +251,1061 @@ TEST(MIPS2) {
236
251
 
237
252
  CodeDesc desc;
238
253
  assm.GetCode(&desc);
239
- Object* code = Heap::CreateCode(desc,
240
- NULL,
241
- Code::ComputeFlags(Code::STUB),
242
- Handle<Object>(Heap::undefined_value()));
254
+ Object* code = HEAP->CreateCode(
255
+ desc,
256
+ Code::ComputeFlags(Code::STUB),
257
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
243
258
  CHECK(code->IsCode());
244
- #ifdef DEBUG
245
- Code::cast(code)->Print();
246
- #endif
247
259
  F2 f = FUNCTION_CAST<F2>(Code::cast(code)->entry());
248
260
  int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 0xab0, 0xc, 0, 0, 0));
249
261
  ::printf("f() = %d\n", res);
250
262
  CHECK_EQ(0x31415926, res);
251
263
  }
252
264
 
265
+
266
+ TEST(MIPS3) {
267
+ // Test floating point instructions.
268
+ InitializeVM();
269
+ v8::HandleScope scope;
270
+
271
+ typedef struct {
272
+ double a;
273
+ double b;
274
+ double c;
275
+ double d;
276
+ double e;
277
+ double f;
278
+ double g;
279
+ } T;
280
+ T t;
281
+
282
+ // Create a function that accepts &t, and loads, manipulates, and stores
283
+ // the doubles t.a ... t.f.
284
+ MacroAssembler assm(NULL, 0);
285
+ Label L, C;
286
+
287
+ if (Isolate::Current()->cpu_features()->IsSupported(FPU)) {
288
+ CpuFeatures::Scope scope(FPU);
289
+
290
+ __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
291
+ __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) );
292
+ __ add_d(f8, f4, f6);
293
+ __ sdc1(f8, MemOperand(a0, OFFSET_OF(T, c)) ); // c = a + b.
294
+
295
+ __ mov_d(f10, f8); // c
296
+ __ neg_d(f12, f6); // -b
297
+ __ sub_d(f10, f10, f12);
298
+ __ sdc1(f10, MemOperand(a0, OFFSET_OF(T, d)) ); // d = c - (-b).
299
+
300
+ __ sdc1(f4, MemOperand(a0, OFFSET_OF(T, b)) ); // b = a.
301
+
302
+ __ li(t0, 120);
303
+ __ mtc1(t0, f14);
304
+ __ cvt_d_w(f14, f14); // f14 = 120.0.
305
+ __ mul_d(f10, f10, f14);
306
+ __ sdc1(f10, MemOperand(a0, OFFSET_OF(T, e)) ); // e = d * 120 = 1.8066e16.
307
+
308
+ __ div_d(f12, f10, f4);
309
+ __ sdc1(f12, MemOperand(a0, OFFSET_OF(T, f)) ); // f = e / a = 120.44.
310
+
311
+ __ sqrt_d(f14, f12);
312
+ __ sdc1(f14, MemOperand(a0, OFFSET_OF(T, g)) );
313
+ // g = sqrt(f) = 10.97451593465515908537
314
+
315
+ __ jr(ra);
316
+ __ nop();
317
+
318
+ CodeDesc desc;
319
+ assm.GetCode(&desc);
320
+ Object* code = HEAP->CreateCode(
321
+ desc,
322
+ Code::ComputeFlags(Code::STUB),
323
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
324
+ CHECK(code->IsCode());
325
+ F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
326
+ t.a = 1.5e14;
327
+ t.b = 2.75e11;
328
+ t.c = 0.0;
329
+ t.d = 0.0;
330
+ t.e = 0.0;
331
+ t.f = 0.0;
332
+ Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
333
+ USE(dummy);
334
+ CHECK_EQ(1.5e14, t.a);
335
+ CHECK_EQ(1.5e14, t.b);
336
+ CHECK_EQ(1.50275e14, t.c);
337
+ CHECK_EQ(1.50550e14, t.d);
338
+ CHECK_EQ(1.8066e16, t.e);
339
+ CHECK_EQ(120.44, t.f);
340
+ CHECK_EQ(10.97451593465515908537, t.g);
341
+ }
342
+ }
343
+
344
+
345
+ TEST(MIPS4) {
346
+ // Test moves between floating point and integer registers.
347
+ InitializeVM();
348
+ v8::HandleScope scope;
349
+
350
+ typedef struct {
351
+ double a;
352
+ double b;
353
+ double c;
354
+ } T;
355
+ T t;
356
+
357
+ Assembler assm(NULL, 0);
358
+ Label L, C;
359
+
360
+ if (Isolate::Current()->cpu_features()->IsSupported(FPU)) {
361
+ CpuFeatures::Scope scope(FPU);
362
+
363
+ __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
364
+ __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) );
365
+
366
+ // Swap f4 and f6, by using four integer registers, t0-t3.
367
+ __ mfc1(t0, f4);
368
+ __ mfc1(t1, f5);
369
+ __ mfc1(t2, f6);
370
+ __ mfc1(t3, f7);
371
+
372
+ __ mtc1(t0, f6);
373
+ __ mtc1(t1, f7);
374
+ __ mtc1(t2, f4);
375
+ __ mtc1(t3, f5);
376
+
377
+ // Store the swapped f4 and f5 back to memory.
378
+ __ sdc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
379
+ __ sdc1(f6, MemOperand(a0, OFFSET_OF(T, c)) );
380
+
381
+ __ jr(ra);
382
+ __ nop();
383
+
384
+ CodeDesc desc;
385
+ assm.GetCode(&desc);
386
+ Object* code = HEAP->CreateCode(
387
+ desc,
388
+ Code::ComputeFlags(Code::STUB),
389
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
390
+ CHECK(code->IsCode());
391
+ F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
392
+ t.a = 1.5e22;
393
+ t.b = 2.75e11;
394
+ t.c = 17.17;
395
+ Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
396
+ USE(dummy);
397
+
398
+ CHECK_EQ(2.75e11, t.a);
399
+ CHECK_EQ(2.75e11, t.b);
400
+ CHECK_EQ(1.5e22, t.c);
401
+ }
402
+ }
403
+
404
+
405
+ TEST(MIPS5) {
406
+ // Test conversions between doubles and integers.
407
+ InitializeVM();
408
+ v8::HandleScope scope;
409
+
410
+ typedef struct {
411
+ double a;
412
+ double b;
413
+ int i;
414
+ int j;
415
+ } T;
416
+ T t;
417
+
418
+ Assembler assm(NULL, 0);
419
+ Label L, C;
420
+
421
+ if (Isolate::Current()->cpu_features()->IsSupported(FPU)) {
422
+ CpuFeatures::Scope scope(FPU);
423
+
424
+ // Load all structure elements to registers.
425
+ __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
426
+ __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) );
427
+ __ lw(t0, MemOperand(a0, OFFSET_OF(T, i)) );
428
+ __ lw(t1, MemOperand(a0, OFFSET_OF(T, j)) );
429
+
430
+ // Convert double in f4 to int in element i.
431
+ __ cvt_w_d(f8, f4);
432
+ __ mfc1(t2, f8);
433
+ __ sw(t2, MemOperand(a0, OFFSET_OF(T, i)) );
434
+
435
+ // Convert double in f6 to int in element j.
436
+ __ cvt_w_d(f10, f6);
437
+ __ mfc1(t3, f10);
438
+ __ sw(t3, MemOperand(a0, OFFSET_OF(T, j)) );
439
+
440
+ // Convert int in original i (t0) to double in a.
441
+ __ mtc1(t0, f12);
442
+ __ cvt_d_w(f0, f12);
443
+ __ sdc1(f0, MemOperand(a0, OFFSET_OF(T, a)) );
444
+
445
+ // Convert int in original j (t1) to double in b.
446
+ __ mtc1(t1, f14);
447
+ __ cvt_d_w(f2, f14);
448
+ __ sdc1(f2, MemOperand(a0, OFFSET_OF(T, b)) );
449
+
450
+ __ jr(ra);
451
+ __ nop();
452
+
453
+ CodeDesc desc;
454
+ assm.GetCode(&desc);
455
+ Object* code = HEAP->CreateCode(
456
+ desc,
457
+ Code::ComputeFlags(Code::STUB),
458
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
459
+ CHECK(code->IsCode());
460
+ F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
461
+ t.a = 1.5e4;
462
+ t.b = 2.75e8;
463
+ t.i = 12345678;
464
+ t.j = -100000;
465
+ Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
466
+ USE(dummy);
467
+
468
+ CHECK_EQ(12345678.0, t.a);
469
+ CHECK_EQ(-100000.0, t.b);
470
+ CHECK_EQ(15000, t.i);
471
+ CHECK_EQ(275000000, t.j);
472
+ }
473
+ }
474
+
475
+
476
+ TEST(MIPS6) {
477
+ // Test simple memory loads and stores.
478
+ InitializeVM();
479
+ v8::HandleScope scope;
480
+
481
+ typedef struct {
482
+ uint32_t ui;
483
+ int32_t si;
484
+ int32_t r1;
485
+ int32_t r2;
486
+ int32_t r3;
487
+ int32_t r4;
488
+ int32_t r5;
489
+ int32_t r6;
490
+ } T;
491
+ T t;
492
+
493
+ Assembler assm(NULL, 0);
494
+ Label L, C;
495
+
496
+ // Basic word load/store.
497
+ __ lw(t0, MemOperand(a0, OFFSET_OF(T, ui)) );
498
+ __ sw(t0, MemOperand(a0, OFFSET_OF(T, r1)) );
499
+
500
+ // lh with positive data.
501
+ __ lh(t1, MemOperand(a0, OFFSET_OF(T, ui)) );
502
+ __ sw(t1, MemOperand(a0, OFFSET_OF(T, r2)) );
503
+
504
+ // lh with negative data.
505
+ __ lh(t2, MemOperand(a0, OFFSET_OF(T, si)) );
506
+ __ sw(t2, MemOperand(a0, OFFSET_OF(T, r3)) );
507
+
508
+ // lhu with negative data.
509
+ __ lhu(t3, MemOperand(a0, OFFSET_OF(T, si)) );
510
+ __ sw(t3, MemOperand(a0, OFFSET_OF(T, r4)) );
511
+
512
+ // lb with negative data.
513
+ __ lb(t4, MemOperand(a0, OFFSET_OF(T, si)) );
514
+ __ sw(t4, MemOperand(a0, OFFSET_OF(T, r5)) );
515
+
516
+ // sh writes only 1/2 of word.
517
+ __ lui(t5, 0x3333);
518
+ __ ori(t5, t5, 0x3333);
519
+ __ sw(t5, MemOperand(a0, OFFSET_OF(T, r6)) );
520
+ __ lhu(t5, MemOperand(a0, OFFSET_OF(T, si)) );
521
+ __ sh(t5, MemOperand(a0, OFFSET_OF(T, r6)) );
522
+
523
+ __ jr(ra);
524
+ __ nop();
525
+
526
+ CodeDesc desc;
527
+ assm.GetCode(&desc);
528
+ Object* code = HEAP->CreateCode(
529
+ desc,
530
+ Code::ComputeFlags(Code::STUB),
531
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
532
+ CHECK(code->IsCode());
533
+ F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
534
+ t.ui = 0x11223344;
535
+ t.si = 0x99aabbcc;
536
+ Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
537
+ USE(dummy);
538
+
539
+ CHECK_EQ(0x11223344, t.r1);
540
+ CHECK_EQ(0x3344, t.r2);
541
+ CHECK_EQ(0xffffbbcc, t.r3);
542
+ CHECK_EQ(0x0000bbcc, t.r4);
543
+ CHECK_EQ(0xffffffcc, t.r5);
544
+ CHECK_EQ(0x3333bbcc, t.r6);
545
+ }
546
+
547
+
548
+ TEST(MIPS7) {
549
+ // Test floating point compare and branch instructions.
550
+ InitializeVM();
551
+ v8::HandleScope scope;
552
+
553
+ typedef struct {
554
+ double a;
555
+ double b;
556
+ double c;
557
+ double d;
558
+ double e;
559
+ double f;
560
+ int32_t result;
561
+ } T;
562
+ T t;
563
+
564
+ // Create a function that accepts &t, and loads, manipulates, and stores
565
+ // the doubles t.a ... t.f.
566
+ MacroAssembler assm(NULL, 0);
567
+ Label neither_is_nan, less_than, outa_here;
568
+
569
+ if (Isolate::Current()->cpu_features()->IsSupported(FPU)) {
570
+ CpuFeatures::Scope scope(FPU);
571
+
572
+ __ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
573
+ __ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) );
574
+ __ c(UN, D, f4, f6);
575
+ __ bc1f(&neither_is_nan);
576
+ __ nop();
577
+ __ sw(zero_reg, MemOperand(a0, OFFSET_OF(T, result)) );
578
+ __ Branch(&outa_here);
579
+
580
+ __ bind(&neither_is_nan);
581
+
582
+ __ c(OLT, D, f6, f4, 2);
583
+ __ bc1t(&less_than, 2);
584
+ __ nop();
585
+ __ sw(zero_reg, MemOperand(a0, OFFSET_OF(T, result)) );
586
+ __ Branch(&outa_here);
587
+
588
+ __ bind(&less_than);
589
+ __ Addu(t0, zero_reg, Operand(1));
590
+ __ sw(t0, MemOperand(a0, OFFSET_OF(T, result)) ); // Set true.
591
+
592
+
593
+ // This test-case should have additional tests.
594
+
595
+ __ bind(&outa_here);
596
+
597
+ __ jr(ra);
598
+ __ nop();
599
+
600
+ CodeDesc desc;
601
+ assm.GetCode(&desc);
602
+ Object* code = HEAP->CreateCode(
603
+ desc,
604
+ Code::ComputeFlags(Code::STUB),
605
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
606
+ CHECK(code->IsCode());
607
+ F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
608
+ t.a = 1.5e14;
609
+ t.b = 2.75e11;
610
+ t.c = 2.0;
611
+ t.d = -4.0;
612
+ t.e = 0.0;
613
+ t.f = 0.0;
614
+ t.result = 0;
615
+ Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
616
+ USE(dummy);
617
+ CHECK_EQ(1.5e14, t.a);
618
+ CHECK_EQ(2.75e11, t.b);
619
+ CHECK_EQ(1, t.result);
620
+ }
621
+ }
622
+
623
+
624
+ TEST(MIPS8) {
625
+ // Test ROTR and ROTRV instructions.
626
+ InitializeVM();
627
+ v8::HandleScope scope;
628
+
629
+ typedef struct {
630
+ int32_t input;
631
+ int32_t result_rotr_4;
632
+ int32_t result_rotr_8;
633
+ int32_t result_rotr_12;
634
+ int32_t result_rotr_16;
635
+ int32_t result_rotr_20;
636
+ int32_t result_rotr_24;
637
+ int32_t result_rotr_28;
638
+ int32_t result_rotrv_4;
639
+ int32_t result_rotrv_8;
640
+ int32_t result_rotrv_12;
641
+ int32_t result_rotrv_16;
642
+ int32_t result_rotrv_20;
643
+ int32_t result_rotrv_24;
644
+ int32_t result_rotrv_28;
645
+ } T;
646
+ T t;
647
+
648
+ MacroAssembler assm(NULL, 0);
649
+
650
+ // Basic word load.
651
+ __ lw(t0, MemOperand(a0, OFFSET_OF(T, input)) );
652
+
653
+ // ROTR instruction (called through the Ror macro).
654
+ __ Ror(t1, t0, 0x0004);
655
+ __ Ror(t2, t0, 0x0008);
656
+ __ Ror(t3, t0, 0x000c);
657
+ __ Ror(t4, t0, 0x0010);
658
+ __ Ror(t5, t0, 0x0014);
659
+ __ Ror(t6, t0, 0x0018);
660
+ __ Ror(t7, t0, 0x001c);
661
+
662
+ // Basic word store.
663
+ __ sw(t1, MemOperand(a0, OFFSET_OF(T, result_rotr_4)) );
664
+ __ sw(t2, MemOperand(a0, OFFSET_OF(T, result_rotr_8)) );
665
+ __ sw(t3, MemOperand(a0, OFFSET_OF(T, result_rotr_12)) );
666
+ __ sw(t4, MemOperand(a0, OFFSET_OF(T, result_rotr_16)) );
667
+ __ sw(t5, MemOperand(a0, OFFSET_OF(T, result_rotr_20)) );
668
+ __ sw(t6, MemOperand(a0, OFFSET_OF(T, result_rotr_24)) );
669
+ __ sw(t7, MemOperand(a0, OFFSET_OF(T, result_rotr_28)) );
670
+
671
+ // ROTRV instruction (called through the Ror macro).
672
+ __ li(t7, 0x0004);
673
+ __ Ror(t1, t0, t7);
674
+ __ li(t7, 0x0008);
675
+ __ Ror(t2, t0, t7);
676
+ __ li(t7, 0x000C);
677
+ __ Ror(t3, t0, t7);
678
+ __ li(t7, 0x0010);
679
+ __ Ror(t4, t0, t7);
680
+ __ li(t7, 0x0014);
681
+ __ Ror(t5, t0, t7);
682
+ __ li(t7, 0x0018);
683
+ __ Ror(t6, t0, t7);
684
+ __ li(t7, 0x001C);
685
+ __ Ror(t7, t0, t7);
686
+
687
+ // Basic word store.
688
+ __ sw(t1, MemOperand(a0, OFFSET_OF(T, result_rotrv_4)) );
689
+ __ sw(t2, MemOperand(a0, OFFSET_OF(T, result_rotrv_8)) );
690
+ __ sw(t3, MemOperand(a0, OFFSET_OF(T, result_rotrv_12)) );
691
+ __ sw(t4, MemOperand(a0, OFFSET_OF(T, result_rotrv_16)) );
692
+ __ sw(t5, MemOperand(a0, OFFSET_OF(T, result_rotrv_20)) );
693
+ __ sw(t6, MemOperand(a0, OFFSET_OF(T, result_rotrv_24)) );
694
+ __ sw(t7, MemOperand(a0, OFFSET_OF(T, result_rotrv_28)) );
695
+
696
+ __ jr(ra);
697
+ __ nop();
698
+
699
+ CodeDesc desc;
700
+ assm.GetCode(&desc);
701
+ Object* code = HEAP->CreateCode(
702
+ desc,
703
+ Code::ComputeFlags(Code::STUB),
704
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
705
+ CHECK(code->IsCode());
706
+ F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
707
+ t.input = 0x12345678;
708
+ Object* dummy = CALL_GENERATED_CODE(f, &t, 0x0, 0, 0, 0);
709
+ USE(dummy);
710
+ CHECK_EQ(0x81234567, t.result_rotr_4);
711
+ CHECK_EQ(0x78123456, t.result_rotr_8);
712
+ CHECK_EQ(0x67812345, t.result_rotr_12);
713
+ CHECK_EQ(0x56781234, t.result_rotr_16);
714
+ CHECK_EQ(0x45678123, t.result_rotr_20);
715
+ CHECK_EQ(0x34567812, t.result_rotr_24);
716
+ CHECK_EQ(0x23456781, t.result_rotr_28);
717
+
718
+ CHECK_EQ(0x81234567, t.result_rotrv_4);
719
+ CHECK_EQ(0x78123456, t.result_rotrv_8);
720
+ CHECK_EQ(0x67812345, t.result_rotrv_12);
721
+ CHECK_EQ(0x56781234, t.result_rotrv_16);
722
+ CHECK_EQ(0x45678123, t.result_rotrv_20);
723
+ CHECK_EQ(0x34567812, t.result_rotrv_24);
724
+ CHECK_EQ(0x23456781, t.result_rotrv_28);
725
+ }
726
+
727
+
728
+ TEST(MIPS9) {
729
+ // Test BRANCH improvements.
730
+ InitializeVM();
731
+ v8::HandleScope scope;
732
+
733
+ MacroAssembler assm(NULL, 0);
734
+ Label exit, exit2, exit3;
735
+
736
+ __ Branch(&exit, ge, a0, Operand(0x00000000));
737
+ __ Branch(&exit2, ge, a0, Operand(0x00001FFF));
738
+ __ Branch(&exit3, ge, a0, Operand(0x0001FFFF));
739
+
740
+ __ bind(&exit);
741
+ __ bind(&exit2);
742
+ __ bind(&exit3);
743
+ __ jr(ra);
744
+ __ nop();
745
+
746
+ CodeDesc desc;
747
+ assm.GetCode(&desc);
748
+ Object* code = HEAP->CreateCode(
749
+ desc,
750
+ Code::ComputeFlags(Code::STUB),
751
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
752
+ CHECK(code->IsCode());
753
+ }
754
+
755
+
756
+ TEST(MIPS10) {
757
+ // Test conversions between doubles and long integers.
758
+ // Test hos the long ints map to FP regs pairs.
759
+ InitializeVM();
760
+ v8::HandleScope scope;
761
+
762
+ typedef struct {
763
+ double a;
764
+ double b;
765
+ int32_t dbl_mant;
766
+ int32_t dbl_exp;
767
+ int32_t long_hi;
768
+ int32_t long_lo;
769
+ int32_t b_long_hi;
770
+ int32_t b_long_lo;
771
+ } T;
772
+ T t;
773
+
774
+ Assembler assm(NULL, 0);
775
+ Label L, C;
776
+
777
+ if (Isolate::Current()->cpu_features()->IsSupported(FPU)) {
778
+ CpuFeatures::Scope scope(FPU);
779
+
780
+ // Load all structure elements to registers.
781
+ __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, a)));
782
+
783
+ // Save the raw bits of the double.
784
+ __ mfc1(t0, f0);
785
+ __ mfc1(t1, f1);
786
+ __ sw(t0, MemOperand(a0, OFFSET_OF(T, dbl_mant)));
787
+ __ sw(t1, MemOperand(a0, OFFSET_OF(T, dbl_exp)));
788
+
789
+ // Convert double in f0 to long, save hi/lo parts.
790
+ __ cvt_l_d(f0, f0);
791
+ __ mfc1(t0, f0); // f0 has LS 32 bits of long.
792
+ __ mfc1(t1, f1); // f1 has MS 32 bits of long.
793
+ __ sw(t0, MemOperand(a0, OFFSET_OF(T, long_lo)));
794
+ __ sw(t1, MemOperand(a0, OFFSET_OF(T, long_hi)));
795
+
796
+ // Convert the b long integers to double b.
797
+ __ lw(t0, MemOperand(a0, OFFSET_OF(T, b_long_lo)));
798
+ __ lw(t1, MemOperand(a0, OFFSET_OF(T, b_long_hi)));
799
+ __ mtc1(t0, f8); // f8 has LS 32-bits.
800
+ __ mtc1(t1, f9); // f9 has MS 32-bits.
801
+ __ cvt_d_l(f10, f8);
802
+ __ sdc1(f10, MemOperand(a0, OFFSET_OF(T, b)));
803
+
804
+ __ jr(ra);
805
+ __ nop();
806
+
807
+ CodeDesc desc;
808
+ assm.GetCode(&desc);
809
+ Object* code = HEAP->CreateCode(
810
+ desc,
811
+ Code::ComputeFlags(Code::STUB),
812
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
813
+ CHECK(code->IsCode());
814
+ F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
815
+ t.a = 2.147483647e9; // 0x7fffffff -> 0x41DFFFFFFFC00000 as double.
816
+ t.b_long_hi = 0x000000ff; // 0xFF00FF00FF -> 0x426FE01FE01FE000 as double.
817
+ t.b_long_lo = 0x00ff00ff;
818
+ Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
819
+ USE(dummy);
820
+
821
+ CHECK_EQ(0x41DFFFFF, t.dbl_exp);
822
+ CHECK_EQ(0xFFC00000, t.dbl_mant);
823
+ CHECK_EQ(0, t.long_hi);
824
+ CHECK_EQ(0x7fffffff, t.long_lo);
825
+ // 0xFF00FF00FF -> 1.095233372415e12.
826
+ CHECK_EQ(1.095233372415e12, t.b);
827
+ }
828
+ }
829
+
830
+
831
+ TEST(MIPS11) {
832
+ // Test LWL, LWR, SWL and SWR instructions.
833
+ InitializeVM();
834
+ v8::HandleScope scope;
835
+
836
+ typedef struct {
837
+ int32_t reg_init;
838
+ int32_t mem_init;
839
+ int32_t lwl_0;
840
+ int32_t lwl_1;
841
+ int32_t lwl_2;
842
+ int32_t lwl_3;
843
+ int32_t lwr_0;
844
+ int32_t lwr_1;
845
+ int32_t lwr_2;
846
+ int32_t lwr_3;
847
+ int32_t swl_0;
848
+ int32_t swl_1;
849
+ int32_t swl_2;
850
+ int32_t swl_3;
851
+ int32_t swr_0;
852
+ int32_t swr_1;
853
+ int32_t swr_2;
854
+ int32_t swr_3;
855
+ } T;
856
+ T t;
857
+
858
+ Assembler assm(NULL, 0);
859
+
860
+ // Test all combinations of LWL and vAddr.
861
+ __ lw(t0, MemOperand(a0, OFFSET_OF(T, reg_init)) );
862
+ __ lwl(t0, MemOperand(a0, OFFSET_OF(T, mem_init)) );
863
+ __ sw(t0, MemOperand(a0, OFFSET_OF(T, lwl_0)) );
864
+
865
+ __ lw(t1, MemOperand(a0, OFFSET_OF(T, reg_init)) );
866
+ __ lwl(t1, MemOperand(a0, OFFSET_OF(T, mem_init) + 1) );
867
+ __ sw(t1, MemOperand(a0, OFFSET_OF(T, lwl_1)) );
868
+
869
+ __ lw(t2, MemOperand(a0, OFFSET_OF(T, reg_init)) );
870
+ __ lwl(t2, MemOperand(a0, OFFSET_OF(T, mem_init) + 2) );
871
+ __ sw(t2, MemOperand(a0, OFFSET_OF(T, lwl_2)) );
872
+
873
+ __ lw(t3, MemOperand(a0, OFFSET_OF(T, reg_init)) );
874
+ __ lwl(t3, MemOperand(a0, OFFSET_OF(T, mem_init) + 3) );
875
+ __ sw(t3, MemOperand(a0, OFFSET_OF(T, lwl_3)) );
876
+
877
+ // Test all combinations of LWR and vAddr.
878
+ __ lw(t0, MemOperand(a0, OFFSET_OF(T, reg_init)) );
879
+ __ lwr(t0, MemOperand(a0, OFFSET_OF(T, mem_init)) );
880
+ __ sw(t0, MemOperand(a0, OFFSET_OF(T, lwr_0)) );
881
+
882
+ __ lw(t1, MemOperand(a0, OFFSET_OF(T, reg_init)) );
883
+ __ lwr(t1, MemOperand(a0, OFFSET_OF(T, mem_init) + 1) );
884
+ __ sw(t1, MemOperand(a0, OFFSET_OF(T, lwr_1)) );
885
+
886
+ __ lw(t2, MemOperand(a0, OFFSET_OF(T, reg_init)) );
887
+ __ lwr(t2, MemOperand(a0, OFFSET_OF(T, mem_init) + 2) );
888
+ __ sw(t2, MemOperand(a0, OFFSET_OF(T, lwr_2)) );
889
+
890
+ __ lw(t3, MemOperand(a0, OFFSET_OF(T, reg_init)) );
891
+ __ lwr(t3, MemOperand(a0, OFFSET_OF(T, mem_init) + 3) );
892
+ __ sw(t3, MemOperand(a0, OFFSET_OF(T, lwr_3)) );
893
+
894
+ // Test all combinations of SWL and vAddr.
895
+ __ lw(t0, MemOperand(a0, OFFSET_OF(T, mem_init)) );
896
+ __ sw(t0, MemOperand(a0, OFFSET_OF(T, swl_0)) );
897
+ __ lw(t0, MemOperand(a0, OFFSET_OF(T, reg_init)) );
898
+ __ swl(t0, MemOperand(a0, OFFSET_OF(T, swl_0)) );
899
+
900
+ __ lw(t1, MemOperand(a0, OFFSET_OF(T, mem_init)) );
901
+ __ sw(t1, MemOperand(a0, OFFSET_OF(T, swl_1)) );
902
+ __ lw(t1, MemOperand(a0, OFFSET_OF(T, reg_init)) );
903
+ __ swl(t1, MemOperand(a0, OFFSET_OF(T, swl_1) + 1) );
904
+
905
+ __ lw(t2, MemOperand(a0, OFFSET_OF(T, mem_init)) );
906
+ __ sw(t2, MemOperand(a0, OFFSET_OF(T, swl_2)) );
907
+ __ lw(t2, MemOperand(a0, OFFSET_OF(T, reg_init)) );
908
+ __ swl(t2, MemOperand(a0, OFFSET_OF(T, swl_2) + 2) );
909
+
910
+ __ lw(t3, MemOperand(a0, OFFSET_OF(T, mem_init)) );
911
+ __ sw(t3, MemOperand(a0, OFFSET_OF(T, swl_3)) );
912
+ __ lw(t3, MemOperand(a0, OFFSET_OF(T, reg_init)) );
913
+ __ swl(t3, MemOperand(a0, OFFSET_OF(T, swl_3) + 3) );
914
+
915
+ // Test all combinations of SWR and vAddr.
916
+ __ lw(t0, MemOperand(a0, OFFSET_OF(T, mem_init)) );
917
+ __ sw(t0, MemOperand(a0, OFFSET_OF(T, swr_0)) );
918
+ __ lw(t0, MemOperand(a0, OFFSET_OF(T, reg_init)) );
919
+ __ swr(t0, MemOperand(a0, OFFSET_OF(T, swr_0)) );
920
+
921
+ __ lw(t1, MemOperand(a0, OFFSET_OF(T, mem_init)) );
922
+ __ sw(t1, MemOperand(a0, OFFSET_OF(T, swr_1)) );
923
+ __ lw(t1, MemOperand(a0, OFFSET_OF(T, reg_init)) );
924
+ __ swr(t1, MemOperand(a0, OFFSET_OF(T, swr_1) + 1) );
925
+
926
+ __ lw(t2, MemOperand(a0, OFFSET_OF(T, mem_init)) );
927
+ __ sw(t2, MemOperand(a0, OFFSET_OF(T, swr_2)) );
928
+ __ lw(t2, MemOperand(a0, OFFSET_OF(T, reg_init)) );
929
+ __ swr(t2, MemOperand(a0, OFFSET_OF(T, swr_2) + 2) );
930
+
931
+ __ lw(t3, MemOperand(a0, OFFSET_OF(T, mem_init)) );
932
+ __ sw(t3, MemOperand(a0, OFFSET_OF(T, swr_3)) );
933
+ __ lw(t3, MemOperand(a0, OFFSET_OF(T, reg_init)) );
934
+ __ swr(t3, MemOperand(a0, OFFSET_OF(T, swr_3) + 3) );
935
+
936
+ __ jr(ra);
937
+ __ nop();
938
+
939
+ CodeDesc desc;
940
+ assm.GetCode(&desc);
941
+ Object* code = HEAP->CreateCode(
942
+ desc,
943
+ Code::ComputeFlags(Code::STUB),
944
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
945
+ CHECK(code->IsCode());
946
+ F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
947
+ t.reg_init = 0xaabbccdd;
948
+ t.mem_init = 0x11223344;
949
+
950
+ Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
951
+ USE(dummy);
952
+
953
+ CHECK_EQ(0x44bbccdd, t.lwl_0);
954
+ CHECK_EQ(0x3344ccdd, t.lwl_1);
955
+ CHECK_EQ(0x223344dd, t.lwl_2);
956
+ CHECK_EQ(0x11223344, t.lwl_3);
957
+
958
+ CHECK_EQ(0x11223344, t.lwr_0);
959
+ CHECK_EQ(0xaa112233, t.lwr_1);
960
+ CHECK_EQ(0xaabb1122, t.lwr_2);
961
+ CHECK_EQ(0xaabbcc11, t.lwr_3);
962
+
963
+ CHECK_EQ(0x112233aa, t.swl_0);
964
+ CHECK_EQ(0x1122aabb, t.swl_1);
965
+ CHECK_EQ(0x11aabbcc, t.swl_2);
966
+ CHECK_EQ(0xaabbccdd, t.swl_3);
967
+
968
+ CHECK_EQ(0xaabbccdd, t.swr_0);
969
+ CHECK_EQ(0xbbccdd44, t.swr_1);
970
+ CHECK_EQ(0xccdd3344, t.swr_2);
971
+ CHECK_EQ(0xdd223344, t.swr_3);
972
+ }
973
+
974
+
975
+ TEST(MIPS12) {
976
+ InitializeVM();
977
+ v8::HandleScope scope;
978
+
979
+ typedef struct {
980
+ int32_t x;
981
+ int32_t y;
982
+ int32_t y1;
983
+ int32_t y2;
984
+ int32_t y3;
985
+ int32_t y4;
986
+ } T;
987
+ T t;
988
+
989
+ MacroAssembler assm(NULL, 0);
990
+
991
+ __ mov(t6, fp); // Save frame pointer.
992
+ __ mov(fp, a0); // Access struct T by fp.
993
+ __ lw(t0, MemOperand(a0, OFFSET_OF(T, y)) );
994
+ __ lw(t3, MemOperand(a0, OFFSET_OF(T, y4)) );
995
+
996
+ __ addu(t1, t0, t3);
997
+ __ subu(t4, t0, t3);
998
+ __ nop();
999
+ __ Push(t0); // These instructions disappear after opt.
1000
+ __ Pop();
1001
+ __ addu(t0, t0, t0);
1002
+ __ nop();
1003
+ __ Pop(); // These instructions disappear after opt.
1004
+ __ Push(t3);
1005
+ __ nop();
1006
+ __ Push(t3); // These instructions disappear after opt.
1007
+ __ Pop(t3);
1008
+ __ nop();
1009
+ __ Push(t3);
1010
+ __ Pop(t4);
1011
+ __ nop();
1012
+ __ sw(t0, MemOperand(fp, OFFSET_OF(T, y)) );
1013
+ __ lw(t0, MemOperand(fp, OFFSET_OF(T, y)) );
1014
+ __ nop();
1015
+ __ sw(t0, MemOperand(fp, OFFSET_OF(T, y)) );
1016
+ __ lw(t1, MemOperand(fp, OFFSET_OF(T, y)) );
1017
+ __ nop();
1018
+ __ Push(t1);
1019
+ __ lw(t1, MemOperand(fp, OFFSET_OF(T, y)) );
1020
+ __ Pop(t1);
1021
+ __ nop();
1022
+ __ Push(t1);
1023
+ __ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) );
1024
+ __ Pop(t1);
1025
+ __ nop();
1026
+ __ Push(t1);
1027
+ __ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) );
1028
+ __ Pop(t2);
1029
+ __ nop();
1030
+ __ Push(t2);
1031
+ __ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) );
1032
+ __ Pop(t1);
1033
+ __ nop();
1034
+ __ Push(t1);
1035
+ __ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) );
1036
+ __ Pop(t3);
1037
+ __ nop();
1038
+
1039
+ __ mov(fp, t6);
1040
+ __ jr(ra);
1041
+ __ nop();
1042
+
1043
+ CodeDesc desc;
1044
+ assm.GetCode(&desc);
1045
+ Object* code = HEAP->CreateCode(
1046
+ desc,
1047
+ Code::ComputeFlags(Code::STUB),
1048
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
1049
+ CHECK(code->IsCode());
1050
+ F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
1051
+ t.x = 1;
1052
+ t.y = 2;
1053
+ t.y1 = 3;
1054
+ t.y2 = 4;
1055
+ t.y3 = 0XBABA;
1056
+ t.y4 = 0xDEDA;
1057
+
1058
+ Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
1059
+ USE(dummy);
1060
+
1061
+ CHECK_EQ(3, t.y1);
1062
+ }
1063
+
1064
+
1065
+ TEST(MIPS13) {
1066
+ // Test Cvt_d_uw and Trunc_uw_d macros.
1067
+ InitializeVM();
1068
+ v8::HandleScope scope;
1069
+
1070
+ typedef struct {
1071
+ double cvt_big_out;
1072
+ double cvt_small_out;
1073
+ uint32_t trunc_big_out;
1074
+ uint32_t trunc_small_out;
1075
+ uint32_t cvt_big_in;
1076
+ uint32_t cvt_small_in;
1077
+ } T;
1078
+ T t;
1079
+
1080
+ MacroAssembler assm(NULL, 0);
1081
+
1082
+ if (Isolate::Current()->cpu_features()->IsSupported(FPU)) {
1083
+ CpuFeatures::Scope scope(FPU);
1084
+
1085
+ __ sw(t0, MemOperand(a0, OFFSET_OF(T, cvt_small_in)));
1086
+ __ Cvt_d_uw(f10, t0);
1087
+ __ sdc1(f10, MemOperand(a0, OFFSET_OF(T, cvt_small_out)));
1088
+
1089
+ __ Trunc_uw_d(f10, f10);
1090
+ __ swc1(f10, MemOperand(a0, OFFSET_OF(T, trunc_small_out)));
1091
+
1092
+ __ sw(t0, MemOperand(a0, OFFSET_OF(T, cvt_big_in)));
1093
+ __ Cvt_d_uw(f8, t0);
1094
+ __ sdc1(f8, MemOperand(a0, OFFSET_OF(T, cvt_big_out)));
1095
+
1096
+ __ Trunc_uw_d(f8, f8);
1097
+ __ swc1(f8, MemOperand(a0, OFFSET_OF(T, trunc_big_out)));
1098
+
1099
+ __ jr(ra);
1100
+ __ nop();
1101
+
1102
+ CodeDesc desc;
1103
+ assm.GetCode(&desc);
1104
+ Object* code = HEAP->CreateCode(
1105
+ desc,
1106
+ Code::ComputeFlags(Code::STUB),
1107
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
1108
+ CHECK(code->IsCode());
1109
+ F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
1110
+
1111
+ t.cvt_big_in = 0xFFFFFFFF;
1112
+ t.cvt_small_in = 333;
1113
+
1114
+ Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
1115
+ USE(dummy);
1116
+
1117
+ CHECK_EQ(t.cvt_big_out, static_cast<double>(t.cvt_big_in));
1118
+ CHECK_EQ(t.cvt_small_out, static_cast<double>(t.cvt_small_in));
1119
+
1120
+ CHECK_EQ(static_cast<int>(t.trunc_big_out), static_cast<int>(t.cvt_big_in));
1121
+ CHECK_EQ(static_cast<int>(t.trunc_small_out),
1122
+ static_cast<int>(t.cvt_small_in));
1123
+ }
1124
+ }
1125
+
1126
+
1127
+ TEST(MIPS14) {
1128
+ // Test round, floor, ceil, trunc, cvt.
1129
+ InitializeVM();
1130
+ v8::HandleScope scope;
1131
+
1132
+ #define ROUND_STRUCT_ELEMENT(x) \
1133
+ int32_t x##_up_out; \
1134
+ int32_t x##_down_out; \
1135
+ int32_t neg_##x##_up_out; \
1136
+ int32_t neg_##x##_down_out; \
1137
+ int32_t x##_err1_out; \
1138
+ int32_t x##_err2_out; \
1139
+ int32_t x##_err3_out; \
1140
+ int32_t x##_err4_out; \
1141
+ int32_t x##_invalid_result;
1142
+
1143
+ typedef struct {
1144
+ double round_up_in;
1145
+ double round_down_in;
1146
+ double neg_round_up_in;
1147
+ double neg_round_down_in;
1148
+ double err1_in;
1149
+ double err2_in;
1150
+ double err3_in;
1151
+ double err4_in;
1152
+
1153
+ ROUND_STRUCT_ELEMENT(round)
1154
+ ROUND_STRUCT_ELEMENT(floor)
1155
+ ROUND_STRUCT_ELEMENT(ceil)
1156
+ ROUND_STRUCT_ELEMENT(trunc)
1157
+ ROUND_STRUCT_ELEMENT(cvt)
1158
+ } T;
1159
+ T t;
1160
+
1161
+ #undef ROUND_STRUCT_ELEMENT
1162
+
1163
+ MacroAssembler assm(NULL, 0);
1164
+
1165
+ if (Isolate::Current()->cpu_features()->IsSupported(FPU)) {
1166
+ CpuFeatures::Scope scope(FPU);
1167
+
1168
+ // Save FCSR.
1169
+ __ cfc1(a1, FCSR);
1170
+ // Disable FPU exceptions.
1171
+ __ ctc1(zero_reg, FCSR);
1172
+ #define RUN_ROUND_TEST(x) \
1173
+ __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, round_up_in))); \
1174
+ __ x##_w_d(f0, f0); \
1175
+ __ swc1(f0, MemOperand(a0, OFFSET_OF(T, x##_up_out))); \
1176
+ \
1177
+ __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, round_down_in))); \
1178
+ __ x##_w_d(f0, f0); \
1179
+ __ swc1(f0, MemOperand(a0, OFFSET_OF(T, x##_down_out))); \
1180
+ \
1181
+ __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, neg_round_up_in))); \
1182
+ __ x##_w_d(f0, f0); \
1183
+ __ swc1(f0, MemOperand(a0, OFFSET_OF(T, neg_##x##_up_out))); \
1184
+ \
1185
+ __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, neg_round_down_in))); \
1186
+ __ x##_w_d(f0, f0); \
1187
+ __ swc1(f0, MemOperand(a0, OFFSET_OF(T, neg_##x##_down_out))); \
1188
+ \
1189
+ __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, err1_in))); \
1190
+ __ ctc1(zero_reg, FCSR); \
1191
+ __ x##_w_d(f0, f0); \
1192
+ __ cfc1(a2, FCSR); \
1193
+ __ sw(a2, MemOperand(a0, OFFSET_OF(T, x##_err1_out))); \
1194
+ \
1195
+ __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, err2_in))); \
1196
+ __ ctc1(zero_reg, FCSR); \
1197
+ __ x##_w_d(f0, f0); \
1198
+ __ cfc1(a2, FCSR); \
1199
+ __ sw(a2, MemOperand(a0, OFFSET_OF(T, x##_err2_out))); \
1200
+ \
1201
+ __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, err3_in))); \
1202
+ __ ctc1(zero_reg, FCSR); \
1203
+ __ x##_w_d(f0, f0); \
1204
+ __ cfc1(a2, FCSR); \
1205
+ __ sw(a2, MemOperand(a0, OFFSET_OF(T, x##_err3_out))); \
1206
+ \
1207
+ __ ldc1(f0, MemOperand(a0, OFFSET_OF(T, err4_in))); \
1208
+ __ ctc1(zero_reg, FCSR); \
1209
+ __ x##_w_d(f0, f0); \
1210
+ __ cfc1(a2, FCSR); \
1211
+ __ sw(a2, MemOperand(a0, OFFSET_OF(T, x##_err4_out))); \
1212
+ __ swc1(f0, MemOperand(a0, OFFSET_OF(T, x##_invalid_result)));
1213
+
1214
+ RUN_ROUND_TEST(round)
1215
+ RUN_ROUND_TEST(floor)
1216
+ RUN_ROUND_TEST(ceil)
1217
+ RUN_ROUND_TEST(trunc)
1218
+ RUN_ROUND_TEST(cvt)
1219
+
1220
+ // Restore FCSR.
1221
+ __ ctc1(a1, FCSR);
1222
+
1223
+ #undef RUN_ROUND_TEST
1224
+
1225
+ __ jr(ra);
1226
+ __ nop();
1227
+
1228
+ CodeDesc desc;
1229
+ assm.GetCode(&desc);
1230
+ Object* code = HEAP->CreateCode(
1231
+ desc,
1232
+ Code::ComputeFlags(Code::STUB),
1233
+ Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
1234
+ CHECK(code->IsCode());
1235
+ F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
1236
+
1237
+ t.round_up_in = 123.51;
1238
+ t.round_down_in = 123.49;
1239
+ t.neg_round_up_in = -123.5;
1240
+ t.neg_round_down_in = -123.49;
1241
+ t.err1_in = 123.51;
1242
+ t.err2_in = 1;
1243
+ t.err3_in = static_cast<double>(1) + 0xFFFFFFFF;
1244
+ t.err4_in = NAN;
1245
+
1246
+ Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
1247
+ USE(dummy);
1248
+
1249
+ #define GET_FPU_ERR(x) ((x >> 2) & (32 - 1))
1250
+
1251
+ CHECK_EQ(124, t.round_up_out);
1252
+ CHECK_EQ(123, t.round_down_out);
1253
+ CHECK_EQ(-124, t.neg_round_up_out);
1254
+ CHECK_EQ(-123, t.neg_round_down_out);
1255
+
1256
+ // Inaccurate.
1257
+ CHECK_EQ(1, GET_FPU_ERR(t.round_err1_out));
1258
+ // No error.
1259
+ CHECK_EQ(0, GET_FPU_ERR(t.round_err2_out));
1260
+ // Invalid operation.
1261
+ CHECK_EQ(16, GET_FPU_ERR(t.round_err3_out));
1262
+ CHECK_EQ(16, GET_FPU_ERR(t.round_err4_out));
1263
+ CHECK_EQ(kFPUInvalidResult, t.round_invalid_result);
1264
+
1265
+ CHECK_EQ(123, t.floor_up_out);
1266
+ CHECK_EQ(123, t.floor_down_out);
1267
+ CHECK_EQ(-124, t.neg_floor_up_out);
1268
+ CHECK_EQ(-124, t.neg_floor_down_out);
1269
+
1270
+ // Inaccurate.
1271
+ CHECK_EQ(1, GET_FPU_ERR(t.floor_err1_out));
1272
+ // No error.
1273
+ CHECK_EQ(0, GET_FPU_ERR(t.floor_err2_out));
1274
+ // Invalid operation.
1275
+ CHECK_EQ(16, GET_FPU_ERR(t.floor_err3_out));
1276
+ CHECK_EQ(16, GET_FPU_ERR(t.floor_err4_out));
1277
+ CHECK_EQ(kFPUInvalidResult, t.floor_invalid_result);
1278
+
1279
+ CHECK_EQ(124, t.ceil_up_out);
1280
+ CHECK_EQ(124, t.ceil_down_out);
1281
+ CHECK_EQ(-123, t.neg_ceil_up_out);
1282
+ CHECK_EQ(-123, t.neg_ceil_down_out);
1283
+
1284
+ // Inaccurate.
1285
+ CHECK_EQ(1, GET_FPU_ERR(t.ceil_err1_out));
1286
+ // No error.
1287
+ CHECK_EQ(0, GET_FPU_ERR(t.ceil_err2_out));
1288
+ // Invalid operation.
1289
+ CHECK_EQ(16, GET_FPU_ERR(t.ceil_err3_out));
1290
+ CHECK_EQ(16, GET_FPU_ERR(t.ceil_err4_out));
1291
+ CHECK_EQ(kFPUInvalidResult, t.ceil_invalid_result);
1292
+
1293
+ // In rounding mode 0 cvt should behave like round.
1294
+ CHECK_EQ(t.round_up_out, t.cvt_up_out);
1295
+ CHECK_EQ(t.round_down_out, t.cvt_down_out);
1296
+ CHECK_EQ(t.neg_round_up_out, t.neg_cvt_up_out);
1297
+ CHECK_EQ(t.neg_round_down_out, t.neg_cvt_down_out);
1298
+
1299
+ // Inaccurate.
1300
+ CHECK_EQ(1, GET_FPU_ERR(t.cvt_err1_out));
1301
+ // No error.
1302
+ CHECK_EQ(0, GET_FPU_ERR(t.cvt_err2_out));
1303
+ // Invalid operation.
1304
+ CHECK_EQ(16, GET_FPU_ERR(t.cvt_err3_out));
1305
+ CHECK_EQ(16, GET_FPU_ERR(t.cvt_err4_out));
1306
+ CHECK_EQ(kFPUInvalidResult, t.cvt_invalid_result);
1307
+ }
1308
+ }
1309
+
1310
+
253
1311
  #undef __