therubyracer 0.6.3 → 0.7.0.pre

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of therubyracer might be problematic. Click here for more details.

Files changed (520) hide show
  1. data/Rakefile +10 -9
  2. data/ext/v8/callbacks.cpp +15 -8
  3. data/ext/v8/converters.cpp +7 -8
  4. data/ext/v8/converters.h +0 -2
  5. data/ext/v8/extconf.rb +2 -0
  6. data/ext/v8/rr.cpp +169 -0
  7. data/ext/v8/rr.h +34 -0
  8. data/ext/v8/upstream/{2.0.6 → 2.1.10}/AUTHORS +8 -1
  9. data/ext/v8/upstream/{2.0.6 → 2.1.10}/ChangeLog +198 -0
  10. data/ext/v8/upstream/{2.0.6 → 2.1.10}/LICENSE +0 -0
  11. data/ext/v8/upstream/{2.0.6 → 2.1.10}/SConstruct +152 -38
  12. data/ext/v8/upstream/{2.0.6 → 2.1.10}/include/v8-debug.h +52 -4
  13. data/ext/v8/upstream/2.1.10/include/v8-profiler.h +176 -0
  14. data/ext/v8/upstream/{2.0.6 → 2.1.10}/include/v8.h +227 -48
  15. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/SConscript +60 -10
  16. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/accessors.cc +5 -39
  17. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/accessors.h +0 -0
  18. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/allocation.cc +0 -0
  19. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/allocation.h +0 -0
  20. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/api.cc +477 -57
  21. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/api.h +8 -4
  22. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/apinatives.js +1 -1
  23. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/apiutils.h +0 -0
  24. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arguments.h +5 -6
  25. data/ext/v8/upstream/{2.0.6/src/arm/assembler-thumb2-inl.h → 2.1.10/src/arm/assembler-arm-inl.h} +42 -27
  26. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/assembler-arm.cc +430 -216
  27. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/assembler-arm.h +199 -110
  28. data/ext/v8/upstream/{2.0.6/src/arm/assembler-arm-inl.h → 2.1.10/src/arm/assembler-thumb2-inl.h} +4 -18
  29. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/assembler-thumb2.cc +142 -85
  30. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/assembler-thumb2.h +18 -9
  31. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/builtins-arm.cc +127 -87
  32. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/codegen-arm-inl.h +3 -5
  33. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/codegen-arm.cc +4634 -1427
  34. data/ext/v8/upstream/2.1.10/src/arm/codegen-arm.h +946 -0
  35. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/constants-arm.cc +21 -3
  36. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/constants-arm.h +39 -13
  37. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/cpu-arm.cc +9 -3
  38. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/debug-arm.cc +34 -8
  39. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/disasm-arm.cc +262 -117
  40. data/ext/v8/upstream/2.1.10/src/arm/fast-codegen-arm.cc +238 -0
  41. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/frames-arm.cc +0 -0
  42. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/frames-arm.h +0 -0
  43. data/ext/v8/upstream/{2.0.6/src/arm/fast-codegen-arm.cc → 2.1.10/src/arm/full-codegen-arm.cc} +453 -283
  44. data/ext/v8/upstream/2.1.10/src/arm/ic-arm.cc +1833 -0
  45. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/jump-target-arm.cc +3 -29
  46. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/macro-assembler-arm.cc +564 -104
  47. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/macro-assembler-arm.h +255 -46
  48. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/regexp-macro-assembler-arm.cc +78 -104
  49. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/regexp-macro-assembler-arm.h +6 -22
  50. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/register-allocator-arm-inl.h +0 -3
  51. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/register-allocator-arm.cc +0 -0
  52. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/register-allocator-arm.h +2 -1
  53. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/simulator-arm.cc +557 -180
  54. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/simulator-arm.h +52 -4
  55. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/arm/stub-cache-arm.cc +904 -240
  56. data/ext/v8/upstream/2.1.10/src/arm/virtual-frame-arm.cc +668 -0
  57. data/ext/v8/upstream/2.1.10/src/arm/virtual-frame-arm.h +503 -0
  58. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/array.js +82 -109
  59. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/assembler.cc +49 -13
  60. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/assembler.h +27 -5
  61. data/ext/v8/upstream/2.1.10/src/ast.cc +1138 -0
  62. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ast.h +354 -53
  63. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/bootstrapper.cc +609 -501
  64. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/bootstrapper.h +27 -8
  65. data/ext/v8/upstream/2.1.10/src/builtins.cc +1512 -0
  66. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/builtins.h +41 -25
  67. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/bytecodes-irregexp.h +0 -0
  68. data/ext/v8/upstream/2.1.10/src/cached-powers.h +119 -0
  69. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/char-predicates-inl.h +0 -0
  70. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/char-predicates.h +0 -0
  71. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/checks.cc +0 -0
  72. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/checks.h +25 -1
  73. data/ext/v8/upstream/2.1.10/src/circular-queue-inl.h +101 -0
  74. data/ext/v8/upstream/2.1.10/src/circular-queue.cc +121 -0
  75. data/ext/v8/upstream/2.1.10/src/circular-queue.h +129 -0
  76. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/code-stubs.cc +23 -8
  77. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/code-stubs.h +16 -4
  78. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/code.h +0 -0
  79. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/codegen-inl.h +6 -34
  80. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/codegen.cc +73 -92
  81. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/codegen.h +164 -68
  82. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/compilation-cache.cc +117 -73
  83. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/compilation-cache.h +18 -17
  84. data/ext/v8/upstream/2.1.10/src/compiler.cc +623 -0
  85. data/ext/v8/upstream/2.1.10/src/compiler.h +299 -0
  86. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/contexts.cc +0 -0
  87. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/contexts.h +8 -11
  88. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/conversions-inl.h +28 -13
  89. data/ext/v8/upstream/2.1.10/src/conversions.cc +1105 -0
  90. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/conversions.h +9 -4
  91. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/counters.cc +0 -0
  92. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/counters.h +1 -1
  93. data/ext/v8/upstream/2.1.10/src/cpu-profiler-inl.h +99 -0
  94. data/ext/v8/upstream/2.1.10/src/cpu-profiler.cc +494 -0
  95. data/ext/v8/upstream/2.1.10/src/cpu-profiler.h +277 -0
  96. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/cpu.h +0 -0
  97. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/d8-debug.cc +15 -4
  98. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/d8-debug.h +0 -0
  99. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/d8-posix.cc +18 -0
  100. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/d8-readline.cc +2 -2
  101. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/d8-windows.cc +0 -0
  102. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/d8.cc +10 -6
  103. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/d8.h +2 -0
  104. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/d8.js +43 -38
  105. data/ext/v8/upstream/2.1.10/src/data-flow.cc +755 -0
  106. data/ext/v8/upstream/2.1.10/src/data-flow.h +278 -0
  107. data/ext/v8/upstream/{2.0.6/src/date-delay.js → 2.1.10/src/date.js} +100 -110
  108. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/dateparser-inl.h +11 -2
  109. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/dateparser.cc +24 -26
  110. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/dateparser.h +8 -4
  111. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/debug-agent.cc +3 -1
  112. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/debug-agent.h +0 -0
  113. data/ext/v8/upstream/{2.0.6/src/debug-delay.js → 2.1.10/src/debug-debugger.js} +111 -15
  114. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/debug.cc +156 -96
  115. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/debug.h +53 -5
  116. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/disasm.h +0 -0
  117. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/disassembler.cc +2 -8
  118. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/disassembler.h +0 -0
  119. data/ext/v8/upstream/2.1.10/src/diy-fp.cc +58 -0
  120. data/ext/v8/upstream/2.1.10/src/diy-fp.h +117 -0
  121. data/ext/v8/upstream/2.1.10/src/double.h +169 -0
  122. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/dtoa-config.c +4 -3
  123. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/execution.cc +22 -22
  124. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/execution.h +17 -4
  125. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/factory.cc +70 -46
  126. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/factory.h +27 -17
  127. data/ext/v8/upstream/2.1.10/src/fast-codegen.cc +746 -0
  128. data/ext/v8/upstream/2.1.10/src/fast-codegen.h +161 -0
  129. data/ext/v8/upstream/2.1.10/src/fast-dtoa.cc +512 -0
  130. data/ext/v8/upstream/2.1.10/src/fast-dtoa.h +59 -0
  131. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/flag-definitions.h +32 -11
  132. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/flags.cc +0 -0
  133. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/flags.h +0 -0
  134. data/ext/v8/upstream/2.1.10/src/flow-graph.cc +763 -0
  135. data/ext/v8/upstream/2.1.10/src/flow-graph.h +180 -0
  136. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/frame-element.cc +1 -4
  137. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/frame-element.h +49 -11
  138. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/frames-inl.h +2 -0
  139. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/frames.cc +91 -17
  140. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/frames.h +24 -2
  141. data/ext/v8/upstream/{2.0.6/src/fast-codegen.cc → 2.1.10/src/full-codegen.cc} +549 -198
  142. data/ext/v8/upstream/{2.0.6/src/fast-codegen.h → 2.1.10/src/full-codegen.h} +109 -29
  143. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/func-name-inferrer.cc +0 -0
  144. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/func-name-inferrer.h +0 -0
  145. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/global-handles.cc +0 -0
  146. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/global-handles.h +0 -0
  147. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/globals.h +67 -43
  148. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/handles-inl.h +0 -0
  149. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/handles.cc +124 -129
  150. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/handles.h +33 -15
  151. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/hashmap.cc +0 -0
  152. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/hashmap.h +0 -0
  153. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/heap-inl.h +56 -12
  154. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/heap-profiler.cc +2 -2
  155. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/heap-profiler.h +2 -0
  156. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/heap.cc +413 -221
  157. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/heap.h +192 -67
  158. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/assembler-ia32-inl.h +6 -0
  159. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/assembler-ia32.cc +187 -32
  160. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/assembler-ia32.h +31 -4
  161. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/builtins-ia32.cc +160 -133
  162. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/codegen-ia32-inl.h +0 -0
  163. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/codegen-ia32.cc +5533 -2177
  164. data/ext/v8/upstream/{2.0.6/src/x64/codegen-x64.h → 2.1.10/src/ia32/codegen-ia32.h} +453 -134
  165. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/cpu-ia32.cc +0 -0
  166. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/debug-ia32.cc +63 -8
  167. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/disasm-ia32.cc +99 -16
  168. data/ext/v8/upstream/2.1.10/src/ia32/fast-codegen-ia32.cc +950 -0
  169. data/ext/v8/upstream/2.1.10/src/ia32/fast-codegen-ia32.h +155 -0
  170. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/frames-ia32.cc +0 -0
  171. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/frames-ia32.h +0 -0
  172. data/ext/v8/upstream/{2.0.6/src/ia32/fast-codegen-ia32.cc → 2.1.10/src/ia32/full-codegen-ia32.cc} +454 -253
  173. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/ic-ia32.cc +545 -390
  174. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/jump-target-ia32.cc +1 -0
  175. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/macro-assembler-ia32.cc +330 -139
  176. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/macro-assembler-ia32.h +96 -30
  177. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/regexp-macro-assembler-ia32.cc +73 -89
  178. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/regexp-macro-assembler-ia32.h +6 -21
  179. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/register-allocator-ia32-inl.h +0 -0
  180. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/register-allocator-ia32.cc +59 -5
  181. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/register-allocator-ia32.h +0 -0
  182. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/simulator-ia32.cc +0 -0
  183. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/simulator-ia32.h +2 -2
  184. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/stub-cache-ia32.cc +745 -303
  185. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/virtual-frame-ia32.cc +278 -71
  186. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ia32/virtual-frame-ia32.h +78 -22
  187. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ic-inl.h +0 -0
  188. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ic.cc +172 -89
  189. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/ic.h +51 -20
  190. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/interpreter-irregexp.cc +0 -0
  191. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/interpreter-irregexp.h +0 -0
  192. data/ext/v8/upstream/{2.0.6/src/json-delay.js → 2.1.10/src/json.js} +26 -12
  193. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/jsregexp.cc +151 -118
  194. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/jsregexp.h +31 -7
  195. data/ext/v8/upstream/2.1.10/src/jump-target-heavy-inl.h +51 -0
  196. data/ext/v8/upstream/{2.0.6/src/jump-target.cc → 2.1.10/src/jump-target-heavy.cc} +164 -184
  197. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/jump-target-inl.h +8 -9
  198. data/ext/v8/upstream/{2.0.6/src/usage-analyzer.h → 2.1.10/src/jump-target-light-inl.h} +9 -7
  199. data/ext/v8/upstream/2.1.10/src/jump-target-light.cc +86 -0
  200. data/ext/v8/upstream/2.1.10/src/jump-target.cc +155 -0
  201. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/jump-target.h +6 -0
  202. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/list-inl.h +0 -0
  203. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/list.h +2 -1
  204. data/ext/v8/upstream/2.1.10/src/liveedit-debugger.js +944 -0
  205. data/ext/v8/upstream/2.1.10/src/liveedit.cc +1468 -0
  206. data/ext/v8/upstream/2.1.10/src/liveedit.h +170 -0
  207. data/ext/v8/upstream/2.1.10/src/log-inl.h +59 -0
  208. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/log-utils.cc +3 -9
  209. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/log-utils.h +1 -4
  210. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/log.cc +198 -95
  211. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/log.h +50 -49
  212. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/macro-assembler.h +9 -0
  213. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/macros.py +30 -11
  214. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/mark-compact.cc +464 -152
  215. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/mark-compact.h +41 -20
  216. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/math.js +9 -8
  217. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/memory.h +0 -0
  218. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/messages.cc +1 -0
  219. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/messages.h +0 -0
  220. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/messages.js +46 -9
  221. data/ext/v8/upstream/2.1.10/src/mips/assembler-mips-inl.h +215 -0
  222. data/ext/v8/upstream/2.1.10/src/mips/assembler-mips.cc +1208 -0
  223. data/ext/v8/upstream/2.1.10/src/mips/assembler-mips.h +665 -0
  224. data/ext/v8/upstream/2.1.10/src/mips/builtins-mips.cc +202 -0
  225. data/ext/v8/upstream/2.1.10/src/mips/codegen-mips-inl.h +70 -0
  226. data/ext/v8/upstream/2.1.10/src/mips/codegen-mips.cc +1428 -0
  227. data/ext/v8/upstream/{2.0.6/src/arm/codegen-arm.h → 2.1.10/src/mips/codegen-mips.h} +103 -205
  228. data/ext/v8/upstream/2.1.10/src/mips/constants-mips.cc +323 -0
  229. data/ext/v8/upstream/2.1.10/src/mips/constants-mips.h +525 -0
  230. data/ext/v8/upstream/2.1.10/src/mips/cpu-mips.cc +69 -0
  231. data/ext/v8/upstream/2.1.10/src/mips/debug-mips.cc +128 -0
  232. data/ext/v8/upstream/2.1.10/src/mips/disasm-mips.cc +784 -0
  233. data/ext/v8/upstream/2.1.10/src/mips/fast-codegen-mips.cc +74 -0
  234. data/ext/v8/upstream/2.1.10/src/mips/frames-mips.cc +99 -0
  235. data/ext/v8/upstream/2.1.10/src/mips/frames-mips.h +164 -0
  236. data/ext/v8/upstream/2.1.10/src/mips/full-codegen-mips.cc +273 -0
  237. data/ext/v8/upstream/2.1.10/src/mips/ic-mips.cc +217 -0
  238. data/ext/v8/upstream/2.1.10/src/mips/jump-target-mips.cc +172 -0
  239. data/ext/v8/upstream/2.1.10/src/mips/macro-assembler-mips.cc +1323 -0
  240. data/ext/v8/upstream/2.1.10/src/mips/macro-assembler-mips.h +461 -0
  241. data/ext/v8/upstream/2.1.10/src/mips/register-allocator-mips-inl.h +137 -0
  242. data/ext/v8/upstream/2.1.10/src/mips/register-allocator-mips.cc +60 -0
  243. data/ext/v8/upstream/2.1.10/src/mips/register-allocator-mips.h +46 -0
  244. data/ext/v8/upstream/2.1.10/src/mips/simulator-mips.cc +1648 -0
  245. data/ext/v8/upstream/2.1.10/src/mips/simulator-mips.h +311 -0
  246. data/ext/v8/upstream/2.1.10/src/mips/stub-cache-mips.cc +400 -0
  247. data/ext/v8/upstream/2.1.10/src/mips/virtual-frame-mips.cc +316 -0
  248. data/ext/v8/upstream/{2.0.6/src/arm/virtual-frame-arm.h → 2.1.10/src/mips/virtual-frame-mips.h} +87 -71
  249. data/ext/v8/upstream/{2.0.6/src/mirror-delay.js → 2.1.10/src/mirror-debugger.js} +51 -45
  250. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/mksnapshot.cc +97 -10
  251. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/natives.h +6 -6
  252. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/objects-debug.cc +47 -5
  253. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/objects-inl.h +154 -38
  254. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/objects.cc +528 -280
  255. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/objects.h +302 -95
  256. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/oprofile-agent.cc +25 -33
  257. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/oprofile-agent.h +9 -1
  258. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/parser.cc +444 -72
  259. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/parser.h +4 -2
  260. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/platform-freebsd.cc +32 -13
  261. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/platform-linux.cc +59 -25
  262. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/platform-macos.cc +30 -13
  263. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/platform-nullos.cc +0 -0
  264. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/platform-openbsd.cc +21 -2
  265. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/platform-posix.cc +0 -18
  266. data/ext/v8/upstream/2.1.10/src/platform-solaris.cc +607 -0
  267. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/platform-win32.cc +16 -17
  268. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/platform.h +25 -8
  269. data/ext/v8/upstream/2.1.10/src/powers-ten.h +2461 -0
  270. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/prettyprinter.cc +49 -29
  271. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/prettyprinter.h +3 -1
  272. data/ext/v8/upstream/2.1.10/src/profile-generator-inl.h +124 -0
  273. data/ext/v8/upstream/2.1.10/src/profile-generator.cc +583 -0
  274. data/ext/v8/upstream/2.1.10/src/profile-generator.h +364 -0
  275. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/property.cc +1 -1
  276. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/property.h +12 -24
  277. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/regexp-macro-assembler-irregexp-inl.h +2 -2
  278. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/regexp-macro-assembler-irregexp.cc +2 -2
  279. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/regexp-macro-assembler-irregexp.h +2 -2
  280. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/regexp-macro-assembler-tracer.cc +2 -2
  281. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/regexp-macro-assembler-tracer.h +0 -0
  282. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/regexp-macro-assembler.cc +33 -10
  283. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/regexp-macro-assembler.h +12 -4
  284. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/regexp-stack.cc +0 -0
  285. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/regexp-stack.h +0 -0
  286. data/ext/v8/upstream/{2.0.6/src/regexp-delay.js → 2.1.10/src/regexp.js} +180 -58
  287. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/register-allocator-inl.h +68 -1
  288. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/register-allocator.cc +5 -2
  289. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/register-allocator.h +42 -17
  290. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/rewriter.cc +110 -4
  291. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/rewriter.h +0 -0
  292. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/runtime.cc +2733 -623
  293. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/runtime.h +43 -20
  294. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/runtime.js +46 -35
  295. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/scanner.cc +278 -36
  296. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/scanner.h +97 -26
  297. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/scopeinfo.cc +3 -3
  298. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/scopeinfo.h +1 -0
  299. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/scopes.cc +11 -12
  300. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/scopes.h +0 -1
  301. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/serialize.cc +298 -175
  302. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/serialize.h +184 -40
  303. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/shell.h +0 -0
  304. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/simulator.h +2 -0
  305. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/smart-pointer.h +0 -0
  306. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/snapshot-common.cc +16 -31
  307. data/ext/v8/upstream/2.1.10/src/snapshot-empty.cc +50 -0
  308. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/snapshot.h +13 -1
  309. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/spaces-inl.h +35 -27
  310. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/spaces.cc +256 -42
  311. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/spaces.h +136 -42
  312. data/ext/v8/upstream/{2.0.6/src/zone-inl.h → 2.1.10/src/splay-tree-inl.h} +102 -89
  313. data/ext/v8/upstream/2.1.10/src/splay-tree.h +203 -0
  314. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/string-stream.cc +0 -0
  315. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/string-stream.h +0 -0
  316. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/string.js +260 -149
  317. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/stub-cache.cc +195 -69
  318. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/stub-cache.h +127 -12
  319. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/third_party/dtoa/COPYING +0 -0
  320. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/third_party/dtoa/dtoa.c +0 -0
  321. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/third_party/valgrind/valgrind.h +0 -0
  322. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/token.cc +0 -0
  323. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/token.h +0 -0
  324. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/top.cc +26 -31
  325. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/top.h +3 -4
  326. data/ext/v8/upstream/2.1.10/src/type-info.cc +53 -0
  327. data/ext/v8/upstream/2.1.10/src/type-info.h +244 -0
  328. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/unicode-inl.h +0 -0
  329. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/unicode.cc +0 -0
  330. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/unicode.h +0 -0
  331. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/uri.js +6 -6
  332. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/utils.cc +0 -37
  333. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/utils.h +121 -50
  334. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/v8-counters.cc +0 -0
  335. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/v8-counters.h +130 -98
  336. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/v8.cc +42 -11
  337. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/v8.h +4 -2
  338. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/v8natives.js +202 -37
  339. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/v8threads.cc +11 -0
  340. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/v8threads.h +15 -0
  341. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/variables.cc +7 -51
  342. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/variables.h +5 -35
  343. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/version.cc +3 -3
  344. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/version.h +0 -0
  345. data/ext/v8/upstream/2.1.10/src/virtual-frame-heavy-inl.h +152 -0
  346. data/ext/v8/upstream/{2.0.6/src/virtual-frame.cc → 2.1.10/src/virtual-frame-heavy.cc} +107 -176
  347. data/ext/v8/upstream/2.1.10/src/virtual-frame-inl.h +39 -0
  348. data/ext/v8/upstream/2.1.10/src/virtual-frame-light-inl.h +69 -0
  349. data/ext/v8/upstream/2.1.10/src/virtual-frame-light.cc +49 -0
  350. data/ext/v8/upstream/2.1.10/src/virtual-frame.cc +49 -0
  351. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/virtual-frame.h +2 -0
  352. data/ext/v8/upstream/{2.0.6/src/log-inl.h → 2.1.10/src/vm-state-inl.h} +28 -20
  353. data/ext/v8/upstream/{2.0.6/src/snapshot-empty.cc → 2.1.10/src/vm-state.cc} +5 -6
  354. data/ext/v8/upstream/2.1.10/src/vm-state.h +75 -0
  355. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/assembler-x64-inl.h +11 -0
  356. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/assembler-x64.cc +285 -93
  357. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/assembler-x64.h +81 -78
  358. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/builtins-x64.cc +130 -87
  359. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/codegen-x64-inl.h +0 -0
  360. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/codegen-x64.cc +4520 -1317
  361. data/ext/v8/upstream/{2.0.6/src/ia32/codegen-ia32.h → 2.1.10/src/x64/codegen-x64.h} +362 -141
  362. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/cpu-x64.cc +0 -0
  363. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/debug-x64.cc +20 -4
  364. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/disasm-x64.cc +121 -44
  365. data/ext/v8/upstream/2.1.10/src/x64/fast-codegen-x64.cc +246 -0
  366. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/frames-x64.cc +0 -0
  367. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/frames-x64.h +0 -0
  368. data/ext/v8/upstream/{2.0.6/src/x64/fast-codegen-x64.cc → 2.1.10/src/x64/full-codegen-x64.cc} +404 -231
  369. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/ic-x64.cc +346 -117
  370. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/jump-target-x64.cc +1 -0
  371. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/macro-assembler-x64.cc +537 -181
  372. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/macro-assembler-x64.h +140 -34
  373. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/regexp-macro-assembler-x64.cc +74 -96
  374. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/regexp-macro-assembler-x64.h +8 -25
  375. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/register-allocator-x64-inl.h +1 -1
  376. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/register-allocator-x64.cc +3 -0
  377. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/register-allocator-x64.h +0 -0
  378. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/simulator-x64.cc +0 -0
  379. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/simulator-x64.h +2 -2
  380. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/stub-cache-x64.cc +785 -288
  381. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/virtual-frame-x64.cc +128 -52
  382. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/x64/virtual-frame-x64.h +40 -19
  383. data/ext/v8/upstream/2.1.10/src/zone-inl.h +82 -0
  384. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/zone.cc +1 -0
  385. data/ext/v8/upstream/{2.0.6 → 2.1.10}/src/zone.h +6 -90
  386. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/codemap.js +12 -0
  387. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/consarray.js +0 -0
  388. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/csvparser.js +22 -37
  389. data/ext/v8/upstream/2.1.10/tools/generate-ten-powers.scm +286 -0
  390. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/gyp/v8.gyp +86 -24
  391. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/js2c.py +22 -22
  392. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/jsmin.py +0 -0
  393. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/linux-tick-processor +10 -1
  394. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/linux-tick-processor.py +0 -0
  395. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/logreader.js +34 -16
  396. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/mac-nm +0 -0
  397. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/mac-tick-processor +0 -0
  398. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/oprofile/annotate +0 -0
  399. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/oprofile/common +0 -0
  400. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/oprofile/dump +0 -0
  401. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/oprofile/report +0 -0
  402. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/oprofile/reset +0 -0
  403. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/oprofile/run +0 -0
  404. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/oprofile/shutdown +0 -0
  405. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/oprofile/start +0 -0
  406. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/presubmit.py +0 -0
  407. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/process-heap-prof.py +0 -0
  408. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/profile.js +70 -0
  409. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/profile_view.js +0 -0
  410. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/run-valgrind.py +0 -0
  411. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/splaytree.js +0 -0
  412. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/splaytree.py +0 -0
  413. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/stats-viewer.py +0 -0
  414. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/test.py +7 -7
  415. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/tickprocessor-driver.js +7 -1
  416. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/tickprocessor.js +140 -9
  417. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/tickprocessor.py +40 -4
  418. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/utils.py +6 -0
  419. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/README.txt +0 -0
  420. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/arm.vsprops +1 -1
  421. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/common.vsprops +1 -2
  422. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/d8.vcproj +0 -6
  423. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/d8_arm.vcproj +193 -199
  424. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/d8_x64.vcproj +16 -8
  425. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/d8js2c.cmd +0 -0
  426. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/debug.vsprops +0 -0
  427. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/ia32.vsprops +5 -1
  428. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/js2c.cmd +1 -1
  429. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/release.vsprops +0 -0
  430. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8.sln +0 -0
  431. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8.vcproj +11 -7
  432. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_arm.sln +0 -0
  433. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_arm.vcproj +227 -223
  434. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_base.vcproj +137 -5
  435. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_base_arm.vcproj +116 -4
  436. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_base_x64.vcproj +125 -4
  437. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_cctest.vcproj +12 -6
  438. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_cctest_arm.vcproj +12 -6
  439. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_cctest_x64.vcproj +11 -11
  440. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_mksnapshot.vcproj +0 -6
  441. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_mksnapshot_x64.vcproj +0 -6
  442. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_process_sample.vcproj +0 -6
  443. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_process_sample_arm.vcproj +145 -151
  444. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_process_sample_x64.vcproj +16 -6
  445. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_shell_sample.vcproj +0 -6
  446. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_shell_sample_arm.vcproj +145 -151
  447. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_shell_sample_x64.vcproj +16 -8
  448. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_snapshot.vcproj +0 -0
  449. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_snapshot_cc.vcproj +0 -0
  450. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_snapshot_cc_x64.vcproj +0 -0
  451. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_snapshot_x64.vcproj +0 -0
  452. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_x64.sln +0 -0
  453. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/v8_x64.vcproj +11 -7
  454. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/visual_studio/x64.vsprops +5 -1
  455. data/ext/v8/upstream/2.1.10/tools/windows-tick-processor.bat +29 -0
  456. data/ext/v8/upstream/{2.0.6 → 2.1.10}/tools/windows-tick-processor.py +0 -0
  457. data/ext/v8/upstream/Makefile +8 -2
  458. data/ext/v8/v8.cpp +21 -73
  459. data/ext/v8/v8_array.cpp +56 -0
  460. data/ext/v8/v8_array.h +8 -0
  461. data/ext/v8/v8_callbacks.cpp +121 -0
  462. data/ext/v8/v8_callbacks.h +8 -0
  463. data/ext/v8/v8_cxt.cpp +74 -77
  464. data/ext/v8/v8_cxt.h +2 -9
  465. data/ext/v8/v8_date.cpp +26 -0
  466. data/ext/v8/v8_date.h +6 -0
  467. data/ext/v8/v8_exception.cpp +55 -0
  468. data/ext/v8/v8_exception.h +6 -0
  469. data/ext/v8/v8_external.cpp +50 -0
  470. data/ext/v8/v8_external.h +8 -0
  471. data/ext/v8/v8_func.cpp +76 -18
  472. data/ext/v8/v8_func.h +5 -4
  473. data/ext/v8/v8_msg.cpp +55 -46
  474. data/ext/v8/v8_msg.h +3 -11
  475. data/ext/v8/v8_obj.cpp +67 -36
  476. data/ext/v8/v8_obj.h +6 -8
  477. data/ext/v8/v8_ref.cpp +25 -9
  478. data/ext/v8/v8_ref.h +3 -5
  479. data/ext/v8/v8_script.cpp +17 -10
  480. data/ext/v8/v8_script.h +3 -3
  481. data/ext/v8/v8_str.cpp +34 -6
  482. data/ext/v8/v8_str.h +4 -2
  483. data/ext/v8/v8_template.cpp +195 -33
  484. data/ext/v8/v8_template.h +4 -5
  485. data/ext/v8/v8_try_catch.cpp +99 -0
  486. data/ext/v8/v8_try_catch.h +5 -0
  487. data/ext/v8/v8_value.cpp +164 -0
  488. data/ext/v8/v8_value.h +10 -0
  489. data/lib/v8.rb +3 -1
  490. data/lib/v8/access.rb +60 -0
  491. data/lib/v8/array.rb +15 -0
  492. data/lib/v8/callbacks.rb +88 -0
  493. data/lib/v8/cli.rb +1 -1
  494. data/lib/v8/context.rb +55 -66
  495. data/lib/v8/function.rb +20 -2
  496. data/lib/v8/object.rb +14 -12
  497. data/lib/v8/ruby_error.rb +3 -0
  498. data/lib/v8/to.rb +59 -7
  499. data/spec/ext/cxt_spec.rb +2 -15
  500. data/spec/ext/func_spec.rb +17 -10
  501. data/spec/ext/try_catch_spec.rb +32 -0
  502. data/spec/foo.rb +17 -0
  503. data/spec/redjs/jsapi_spec.rb +173 -96
  504. data/spec/spec_helper.rb +7 -0
  505. data/spec/v8/to_spec.rb +0 -1
  506. data/therubyracer.gemspec +6 -6
  507. metadata +493 -386
  508. data/ext/v8/upstream/2.0.6/src/arm/ic-arm.cc +0 -849
  509. data/ext/v8/upstream/2.0.6/src/arm/virtual-frame-arm.cc +0 -412
  510. data/ext/v8/upstream/2.0.6/src/ast.cc +0 -512
  511. data/ext/v8/upstream/2.0.6/src/builtins.cc +0 -851
  512. data/ext/v8/upstream/2.0.6/src/compiler.cc +0 -1132
  513. data/ext/v8/upstream/2.0.6/src/compiler.h +0 -107
  514. data/ext/v8/upstream/2.0.6/src/conversions.cc +0 -709
  515. data/ext/v8/upstream/2.0.6/src/usage-analyzer.cc +0 -426
  516. data/ext/v8/upstream/2.0.6/tools/windows-tick-processor.bat +0 -5
  517. data/ext/v8/upstream/no-strict-aliasing.patch +0 -13
  518. data/ext/v8/v8_standalone.cpp +0 -69
  519. data/ext/v8/v8_standalone.h +0 -31
  520. data/spec/ext/obj_spec.rb +0 -13
@@ -32,14 +32,14 @@ namespace v8 {
32
32
  namespace internal {
33
33
 
34
34
 
35
- #ifndef V8_NATIVE_REGEXP
35
+ #ifdef V8_INTERPRETED_REGEXP
36
36
  class RegExpMacroAssemblerARM: public RegExpMacroAssembler {
37
37
  public:
38
38
  RegExpMacroAssemblerARM();
39
39
  virtual ~RegExpMacroAssemblerARM();
40
40
  };
41
41
 
42
- #else
42
+ #else // V8_INTERPRETED_REGEXP
43
43
  class RegExpMacroAssemblerARM: public NativeRegExpMacroAssembler {
44
44
  public:
45
45
  RegExpMacroAssemblerARM(Mode mode, int registers_to_save);
@@ -123,8 +123,7 @@ class RegExpMacroAssemblerARM: public NativeRegExpMacroAssembler {
123
123
  static const int kReturnAddress = kStoredRegisters + 8 * kPointerSize;
124
124
  // Stack parameters placed by caller.
125
125
  static const int kRegisterOutput = kReturnAddress + kPointerSize;
126
- static const int kAtStart = kRegisterOutput + kPointerSize;
127
- static const int kStackHighEnd = kAtStart + kPointerSize;
126
+ static const int kStackHighEnd = kRegisterOutput + kPointerSize;
128
127
  static const int kDirectCall = kStackHighEnd + kPointerSize;
129
128
 
130
129
  // Below the frame pointer.
@@ -136,8 +135,9 @@ class RegExpMacroAssemblerARM: public NativeRegExpMacroAssembler {
136
135
  // When adding local variables remember to push space for them in
137
136
  // the frame in GetCode.
138
137
  static const int kInputStartMinusOne = kInputString - kPointerSize;
138
+ static const int kAtStart = kInputStartMinusOne - kPointerSize;
139
139
  // First register address. Following registers are below it on the stack.
140
- static const int kRegisterZero = kInputStartMinusOne - kPointerSize;
140
+ static const int kRegisterZero = kAtStart - kPointerSize;
141
141
 
142
142
  // Initial size of code buffer.
143
143
  static const size_t kRegExpCodeSize = 1024;
@@ -206,22 +206,6 @@ class RegExpMacroAssemblerARM: public NativeRegExpMacroAssembler {
206
206
  // and increments it by a word size.
207
207
  inline void Pop(Register target);
208
208
 
209
- // Before calling a C-function from generated code, align arguments on stack.
210
- // After aligning the frame, non-register arguments must be stored in
211
- // sp[0], sp[4], etc., not pushed. The argument count assumes all arguments
212
- // are word sized.
213
- // Some compilers/platforms require the stack to be aligned when calling
214
- // C++ code.
215
- // Needs a scratch register to do some arithmetic. This register will be
216
- // trashed.
217
- inline void FrameAlign(int num_arguments, Register scratch);
218
-
219
- // Calls a C function and cleans up the space for arguments allocated
220
- // by FrameAlign. The called function is not allowed to trigger a garbage
221
- // collection.
222
- inline void CallCFunction(ExternalReference function,
223
- int num_arguments);
224
-
225
209
  // Calls a C function and cleans up the frame alignment done by
226
210
  // by FrameAlign. The called function *is* allowed to trigger a garbage
227
211
  // collection, but may not take more than four arguments (no arguments
@@ -274,7 +258,7 @@ class RegExpCEntryStub: public CodeStub {
274
258
  const char* GetName() { return "RegExpCEntryStub"; }
275
259
  };
276
260
 
277
- #endif // V8_NATIVE_REGEXP
261
+ #endif // V8_INTERPRETED_REGEXP
278
262
 
279
263
 
280
264
  }} // namespace v8::internal
@@ -92,9 +92,6 @@ Register RegisterAllocator::ToRegister(int num) {
92
92
 
93
93
  void RegisterAllocator::Initialize() {
94
94
  Reset();
95
- // The non-reserved r1 and lr registers are live on JS function entry.
96
- Use(r1); // JS function.
97
- Use(lr); // Return address.
98
95
  }
99
96
 
100
97
 
@@ -33,7 +33,8 @@ namespace internal {
33
33
 
34
34
  class RegisterAllocatorConstants : public AllStatic {
35
35
  public:
36
- static const int kNumRegisters = 12;
36
+ // No registers are currently managed by the register allocator on ARM.
37
+ static const int kNumRegisters = 0;
37
38
  static const int kInvalidRegister = -1;
38
39
  };
39
40
 
@@ -1,4 +1,4 @@
1
- // Copyright 2009 the V8 project authors. All rights reserved.
1
+ // Copyright 2010 the V8 project authors. All rights reserved.
2
2
  // Redistribution and use in source and binary forms, with or without
3
3
  // modification, are permitted provided that the following conditions are
4
4
  // met:
@@ -47,9 +47,9 @@ using ::v8::internal::ReadLine;
47
47
  using ::v8::internal::DeleteArray;
48
48
 
49
49
  // This macro provides a platform independent use of sscanf. The reason for
50
- // SScanF not being implemented in a platform independent was through
51
- // ::v8::internal::OS in the same way as SNPrintF is that the Windows C Run-Time
52
- // Library does not provide vsscanf.
50
+ // SScanF not being implemented in a platform independent way through
51
+ // ::v8::internal::OS in the same way as SNPrintF is that the
52
+ // Windows C Run-Time Library does not provide vsscanf.
53
53
  #define SScanF sscanf // NOLINT
54
54
 
55
55
  // The Debugger class is used by the simulator while debugging simulated ARM
@@ -72,6 +72,8 @@ class Debugger {
72
72
 
73
73
  int32_t GetRegisterValue(int regnum);
74
74
  bool GetValue(const char* desc, int32_t* value);
75
+ bool GetVFPSingleValue(const char* desc, float* value);
76
+ bool GetVFPDoubleValue(const char* desc, double* value);
75
77
 
76
78
  // Set or delete a breakpoint. Returns true if successful.
77
79
  bool SetBreakpoint(Instr* breakpc);
@@ -148,7 +150,33 @@ bool Debugger::GetValue(const char* desc, int32_t* value) {
148
150
  *value = GetRegisterValue(regnum);
149
151
  return true;
150
152
  } else {
151
- return SScanF(desc, "%i", value) == 1;
153
+ if (strncmp(desc, "0x", 2) == 0) {
154
+ return SScanF(desc + 2, "%x", reinterpret_cast<uint32_t*>(value)) == 1;
155
+ } else {
156
+ return SScanF(desc, "%u", reinterpret_cast<uint32_t*>(value)) == 1;
157
+ }
158
+ }
159
+ return false;
160
+ }
161
+
162
+
163
+ bool Debugger::GetVFPSingleValue(const char* desc, float* value) {
164
+ bool is_double;
165
+ int regnum = VFPRegisters::Number(desc, &is_double);
166
+ if (regnum != kNoRegister && !is_double) {
167
+ *value = sim_->get_float_from_s_register(regnum);
168
+ return true;
169
+ }
170
+ return false;
171
+ }
172
+
173
+
174
+ bool Debugger::GetVFPDoubleValue(const char* desc, double* value) {
175
+ bool is_double;
176
+ int regnum = VFPRegisters::Number(desc, &is_double);
177
+ if (regnum != kNoRegister && is_double) {
178
+ *value = sim_->get_double_from_d_register(regnum);
179
+ return true;
152
180
  }
153
181
  return false;
154
182
  }
@@ -207,6 +235,7 @@ void Debugger::Debug() {
207
235
  char cmd[COMMAND_SIZE + 1];
208
236
  char arg1[ARG_SIZE + 1];
209
237
  char arg2[ARG_SIZE + 1];
238
+ char* argv[3] = { cmd, arg1, arg2 };
210
239
 
211
240
  // make sure to have a proper terminating character if reaching the limit
212
241
  cmd[COMMAND_SIZE] = 0;
@@ -234,7 +263,7 @@ void Debugger::Debug() {
234
263
  } else {
235
264
  // Use sscanf to parse the individual parts of the command line. At the
236
265
  // moment no command expects more than two parameters.
237
- int args = SScanF(line,
266
+ int argc = SScanF(line,
238
267
  "%" XSTR(COMMAND_SIZE) "s "
239
268
  "%" XSTR(ARG_SIZE) "s "
240
269
  "%" XSTR(ARG_SIZE) "s",
@@ -247,8 +276,10 @@ void Debugger::Debug() {
247
276
  // Leave the debugger shell.
248
277
  done = true;
249
278
  } else if ((strcmp(cmd, "p") == 0) || (strcmp(cmd, "print") == 0)) {
250
- if (args == 2) {
279
+ if (argc == 2) {
251
280
  int32_t value;
281
+ float svalue;
282
+ double dvalue;
252
283
  if (strcmp(arg1, "all") == 0) {
253
284
  for (int i = 0; i < kNumRegisters; i++) {
254
285
  value = GetRegisterValue(i);
@@ -257,6 +288,10 @@ void Debugger::Debug() {
257
288
  } else {
258
289
  if (GetValue(arg1, &value)) {
259
290
  PrintF("%s: 0x%08x %d \n", arg1, value, value);
291
+ } else if (GetVFPSingleValue(arg1, &svalue)) {
292
+ PrintF("%s: %f \n", arg1, svalue);
293
+ } else if (GetVFPDoubleValue(arg1, &dvalue)) {
294
+ PrintF("%s: %lf \n", arg1, dvalue);
260
295
  } else {
261
296
  PrintF("%s unrecognized\n", arg1);
262
297
  }
@@ -266,7 +301,7 @@ void Debugger::Debug() {
266
301
  }
267
302
  } else if ((strcmp(cmd, "po") == 0)
268
303
  || (strcmp(cmd, "printobject") == 0)) {
269
- if (args == 2) {
304
+ if (argc == 2) {
270
305
  int32_t value;
271
306
  if (GetValue(arg1, &value)) {
272
307
  Object* obj = reinterpret_cast<Object*>(value);
@@ -283,6 +318,37 @@ void Debugger::Debug() {
283
318
  } else {
284
319
  PrintF("printobject <value>\n");
285
320
  }
321
+ } else if (strcmp(cmd, "stack") == 0 || strcmp(cmd, "mem") == 0) {
322
+ int32_t* cur = NULL;
323
+ int32_t* end = NULL;
324
+ int next_arg = 1;
325
+
326
+ if (strcmp(cmd, "stack") == 0) {
327
+ cur = reinterpret_cast<int32_t*>(sim_->get_register(Simulator::sp));
328
+ } else { // "mem"
329
+ int32_t value;
330
+ if (!GetValue(arg1, &value)) {
331
+ PrintF("%s unrecognized\n", arg1);
332
+ continue;
333
+ }
334
+ cur = reinterpret_cast<int32_t*>(value);
335
+ next_arg++;
336
+ }
337
+
338
+ int32_t words;
339
+ if (argc == next_arg) {
340
+ words = 10;
341
+ } else if (argc == next_arg + 1) {
342
+ if (!GetValue(argv[next_arg], &words)) {
343
+ words = 10;
344
+ }
345
+ }
346
+ end = cur + words;
347
+
348
+ while (cur < end) {
349
+ PrintF(" 0x%08x: 0x%08x %10d\n", cur, *cur, *cur);
350
+ cur++;
351
+ }
286
352
  } else if (strcmp(cmd, "disasm") == 0) {
287
353
  disasm::NameConverter converter;
288
354
  disasm::Disassembler dasm(converter);
@@ -292,10 +358,10 @@ void Debugger::Debug() {
292
358
  byte* cur = NULL;
293
359
  byte* end = NULL;
294
360
 
295
- if (args == 1) {
361
+ if (argc == 1) {
296
362
  cur = reinterpret_cast<byte*>(sim_->get_pc());
297
363
  end = cur + (10 * Instr::kInstrSize);
298
- } else if (args == 2) {
364
+ } else if (argc == 2) {
299
365
  int32_t value;
300
366
  if (GetValue(arg1, &value)) {
301
367
  cur = reinterpret_cast<byte*>(value);
@@ -321,7 +387,7 @@ void Debugger::Debug() {
321
387
  v8::internal::OS::DebugBreak();
322
388
  PrintF("regaining control from gdb\n");
323
389
  } else if (strcmp(cmd, "break") == 0) {
324
- if (args == 2) {
390
+ if (argc == 2) {
325
391
  int32_t value;
326
392
  if (GetValue(arg1, &value)) {
327
393
  if (!SetBreakpoint(reinterpret_cast<Instr*>(value))) {
@@ -355,6 +421,10 @@ void Debugger::Debug() {
355
421
  } else {
356
422
  PrintF("Not at debugger stop.");
357
423
  }
424
+ } else if ((strcmp(cmd, "t") == 0) || strcmp(cmd, "trace") == 0) {
425
+ ::v8::internal::FLAG_trace_sim = !::v8::internal::FLAG_trace_sim;
426
+ PrintF("Trace of executed instructions is %s\n",
427
+ ::v8::internal::FLAG_trace_sim ? "on" : "off");
358
428
  } else if ((strcmp(cmd, "h") == 0) || (strcmp(cmd, "help") == 0)) {
359
429
  PrintF("cont\n");
360
430
  PrintF(" continue execution (alias 'c')\n");
@@ -367,6 +437,10 @@ void Debugger::Debug() {
367
437
  PrintF(" print an object from a register (alias 'po')\n");
368
438
  PrintF("flags\n");
369
439
  PrintF(" print flags\n");
440
+ PrintF("stack [<words>]\n");
441
+ PrintF(" dump stack content, default dump 10 words)\n");
442
+ PrintF("mem <address> [<words>]\n");
443
+ PrintF(" dump memory content, default dump 10 words)\n");
370
444
  PrintF("disasm [<instructions>]\n");
371
445
  PrintF("disasm [[<address>] <instructions>]\n");
372
446
  PrintF(" disassemble code, default is 10 instructions from pc\n");
@@ -378,7 +452,9 @@ void Debugger::Debug() {
378
452
  PrintF(" delete the breakpoint\n");
379
453
  PrintF("unstop\n");
380
454
  PrintF(" ignore the stop instruction at the current location");
381
- PrintF(" from now on\n");
455
+ PrintF(" from now on\n");
456
+ PrintF("trace (alias 't')\n");
457
+ PrintF(" toogle the tracing of all executed statements\n");
382
458
  } else {
383
459
  PrintF("Unknown command: %s\n", cmd);
384
460
  }
@@ -398,6 +474,94 @@ void Debugger::Debug() {
398
474
  }
399
475
 
400
476
 
477
+ static bool ICacheMatch(void* one, void* two) {
478
+ ASSERT((reinterpret_cast<intptr_t>(one) & CachePage::kPageMask) == 0);
479
+ ASSERT((reinterpret_cast<intptr_t>(two) & CachePage::kPageMask) == 0);
480
+ return one == two;
481
+ }
482
+
483
+
484
+ static uint32_t ICacheHash(void* key) {
485
+ return static_cast<uint32_t>(reinterpret_cast<uintptr_t>(key)) >> 2;
486
+ }
487
+
488
+
489
+ static bool AllOnOnePage(uintptr_t start, int size) {
490
+ intptr_t start_page = (start & ~CachePage::kPageMask);
491
+ intptr_t end_page = ((start + size) & ~CachePage::kPageMask);
492
+ return start_page == end_page;
493
+ }
494
+
495
+
496
+ void Simulator::FlushICache(void* start_addr, size_t size) {
497
+ intptr_t start = reinterpret_cast<intptr_t>(start_addr);
498
+ int intra_line = (start & CachePage::kLineMask);
499
+ start -= intra_line;
500
+ size += intra_line;
501
+ size = ((size - 1) | CachePage::kLineMask) + 1;
502
+ int offset = (start & CachePage::kPageMask);
503
+ while (!AllOnOnePage(start, size - 1)) {
504
+ int bytes_to_flush = CachePage::kPageSize - offset;
505
+ FlushOnePage(start, bytes_to_flush);
506
+ start += bytes_to_flush;
507
+ size -= bytes_to_flush;
508
+ ASSERT_EQ(0, start & CachePage::kPageMask);
509
+ offset = 0;
510
+ }
511
+ if (size != 0) {
512
+ FlushOnePage(start, size);
513
+ }
514
+ }
515
+
516
+
517
+ CachePage* Simulator::GetCachePage(void* page) {
518
+ v8::internal::HashMap::Entry* entry = i_cache_->Lookup(page,
519
+ ICacheHash(page),
520
+ true);
521
+ if (entry->value == NULL) {
522
+ CachePage* new_page = new CachePage();
523
+ entry->value = new_page;
524
+ }
525
+ return reinterpret_cast<CachePage*>(entry->value);
526
+ }
527
+
528
+
529
+ // Flush from start up to and not including start + size.
530
+ void Simulator::FlushOnePage(intptr_t start, int size) {
531
+ ASSERT(size <= CachePage::kPageSize);
532
+ ASSERT(AllOnOnePage(start, size - 1));
533
+ ASSERT((start & CachePage::kLineMask) == 0);
534
+ ASSERT((size & CachePage::kLineMask) == 0);
535
+ void* page = reinterpret_cast<void*>(start & (~CachePage::kPageMask));
536
+ int offset = (start & CachePage::kPageMask);
537
+ CachePage* cache_page = GetCachePage(page);
538
+ char* valid_bytemap = cache_page->ValidityByte(offset);
539
+ memset(valid_bytemap, CachePage::LINE_INVALID, size >> CachePage::kLineShift);
540
+ }
541
+
542
+
543
+ void Simulator::CheckICache(Instr* instr) {
544
+ intptr_t address = reinterpret_cast<intptr_t>(instr);
545
+ void* page = reinterpret_cast<void*>(address & (~CachePage::kPageMask));
546
+ void* line = reinterpret_cast<void*>(address & (~CachePage::kLineMask));
547
+ int offset = (address & CachePage::kPageMask);
548
+ CachePage* cache_page = GetCachePage(page);
549
+ char* cache_valid_byte = cache_page->ValidityByte(offset);
550
+ bool cache_hit = (*cache_valid_byte == CachePage::LINE_VALID);
551
+ char* cached_line = cache_page->CachedData(offset & ~CachePage::kLineMask);
552
+ if (cache_hit) {
553
+ // Check that the data in memory matches the contents of the I-cache.
554
+ CHECK(memcmp(reinterpret_cast<void*>(instr),
555
+ cache_page->CachedData(offset),
556
+ Instr::kInstrSize) == 0);
557
+ } else {
558
+ // Cache miss. Load memory into the cache.
559
+ memcpy(cached_line, line, CachePage::kLineLength);
560
+ *cache_valid_byte = CachePage::LINE_VALID;
561
+ }
562
+ }
563
+
564
+
401
565
  // Create one simulator per thread and keep it in thread local storage.
402
566
  static v8::internal::Thread::LocalStorageKey simulator_key;
403
567
 
@@ -413,7 +577,13 @@ void Simulator::Initialize() {
413
577
  }
414
578
 
415
579
 
580
+ v8::internal::HashMap* Simulator::i_cache_ = NULL;
581
+
582
+
416
583
  Simulator::Simulator() {
584
+ if (i_cache_ == NULL) {
585
+ i_cache_ = new v8::internal::HashMap(&ICacheMatch);
586
+ }
417
587
  Initialize();
418
588
  // Setup simulator support first. Some of this information is needed to
419
589
  // setup the architecture state.
@@ -478,6 +648,9 @@ class Redirection {
478
648
  swi_instruction_((AL << 28) | (0xf << 24) | call_rt_redirected),
479
649
  fp_return_(fp_return),
480
650
  next_(list_) {
651
+ Simulator::current()->
652
+ FlushICache(reinterpret_cast<void*>(&swi_instruction_),
653
+ Instr::kInstrSize);
481
654
  list_ = this;
482
655
  }
483
656
 
@@ -890,8 +1063,13 @@ bool Simulator::OverflowFrom(int32_t alu_out,
890
1063
 
891
1064
  // Support for VFP comparisons.
892
1065
  void Simulator::Compute_FPSCR_Flags(double val1, double val2) {
1066
+ if (isnan(val1) || isnan(val2)) {
1067
+ n_flag_FPSCR_ = false;
1068
+ z_flag_FPSCR_ = false;
1069
+ c_flag_FPSCR_ = true;
1070
+ v_flag_FPSCR_ = true;
893
1071
  // All non-NaN cases.
894
- if (val1 == val2) {
1072
+ } else if (val1 == val2) {
895
1073
  n_flag_FPSCR_ = false;
896
1074
  z_flag_FPSCR_ = true;
897
1075
  c_flag_FPSCR_ = true;
@@ -1168,6 +1346,11 @@ void Simulator::SoftwareInterrupt(Instr* instr) {
1168
1346
  int swi = instr->SwiField();
1169
1347
  switch (swi) {
1170
1348
  case call_rt_redirected: {
1349
+ // Check if stack is aligned. Error if not aligned is reported below to
1350
+ // include information on the function called.
1351
+ bool stack_aligned =
1352
+ (get_register(sp)
1353
+ & (::v8::internal::FLAG_sim_stack_alignment - 1)) == 0;
1171
1354
  Redirection* redirection = Redirection::FromSwiInstruction(instr);
1172
1355
  int32_t arg0 = get_register(r0);
1173
1356
  int32_t arg1 = get_register(r1);
@@ -1181,12 +1364,17 @@ void Simulator::SoftwareInterrupt(Instr* instr) {
1181
1364
  reinterpret_cast<intptr_t>(redirection->external_function());
1182
1365
  SimulatorRuntimeFPCall target =
1183
1366
  reinterpret_cast<SimulatorRuntimeFPCall>(external);
1184
- if (::v8::internal::FLAG_trace_sim) {
1367
+ if (::v8::internal::FLAG_trace_sim || !stack_aligned) {
1185
1368
  double x, y;
1186
1369
  GetFpArgs(&x, &y);
1187
- PrintF("Call to host function at %p with args %f, %f\n",
1370
+ PrintF("Call to host function at %p with args %f, %f",
1188
1371
  FUNCTION_ADDR(target), x, y);
1372
+ if (!stack_aligned) {
1373
+ PrintF(" with unaligned stack %08x\n", get_register(sp));
1374
+ }
1375
+ PrintF("\n");
1189
1376
  }
1377
+ CHECK(stack_aligned);
1190
1378
  double result = target(arg0, arg1, arg2, arg3);
1191
1379
  SetFpResult(result);
1192
1380
  } else {
@@ -1194,15 +1382,20 @@ void Simulator::SoftwareInterrupt(Instr* instr) {
1194
1382
  reinterpret_cast<int32_t>(redirection->external_function());
1195
1383
  SimulatorRuntimeCall target =
1196
1384
  reinterpret_cast<SimulatorRuntimeCall>(external);
1197
- if (::v8::internal::FLAG_trace_sim) {
1385
+ if (::v8::internal::FLAG_trace_sim || !stack_aligned) {
1198
1386
  PrintF(
1199
- "Call to host function at %p with args %08x, %08x, %08x, %08x\n",
1387
+ "Call to host function at %p with args %08x, %08x, %08x, %08x",
1200
1388
  FUNCTION_ADDR(target),
1201
1389
  arg0,
1202
1390
  arg1,
1203
1391
  arg2,
1204
1392
  arg3);
1393
+ if (!stack_aligned) {
1394
+ PrintF(" with unaligned stack %08x\n", get_register(sp));
1395
+ }
1396
+ PrintF("\n");
1205
1397
  }
1398
+ CHECK(stack_aligned);
1206
1399
  int64_t result = target(arg0, arg1, arg2, arg3);
1207
1400
  int32_t lo_res = static_cast<int32_t>(result);
1208
1401
  int32_t hi_res = static_cast<int32_t>(result >> 32);
@@ -1424,6 +1617,50 @@ void Simulator::DecodeType01(Instr* instr) {
1424
1617
  }
1425
1618
  return;
1426
1619
  }
1620
+ } else if ((type == 0) && instr->IsMiscType0()) {
1621
+ if (instr->Bits(22, 21) == 1) {
1622
+ int rm = instr->RmField();
1623
+ switch (instr->Bits(7, 4)) {
1624
+ case BX:
1625
+ set_pc(get_register(rm));
1626
+ break;
1627
+ case BLX: {
1628
+ uint32_t old_pc = get_pc();
1629
+ set_pc(get_register(rm));
1630
+ set_register(lr, old_pc + Instr::kInstrSize);
1631
+ break;
1632
+ }
1633
+ case BKPT:
1634
+ v8::internal::OS::DebugBreak();
1635
+ break;
1636
+ default:
1637
+ UNIMPLEMENTED();
1638
+ }
1639
+ } else if (instr->Bits(22, 21) == 3) {
1640
+ int rm = instr->RmField();
1641
+ int rd = instr->RdField();
1642
+ switch (instr->Bits(7, 4)) {
1643
+ case CLZ: {
1644
+ uint32_t bits = get_register(rm);
1645
+ int leading_zeros = 0;
1646
+ if (bits == 0) {
1647
+ leading_zeros = 32;
1648
+ } else {
1649
+ while ((bits & 0x80000000u) == 0) {
1650
+ bits <<= 1;
1651
+ leading_zeros++;
1652
+ }
1653
+ }
1654
+ set_register(rd, leading_zeros);
1655
+ break;
1656
+ }
1657
+ default:
1658
+ UNIMPLEMENTED();
1659
+ }
1660
+ } else {
1661
+ PrintF("%08x\n", instr->InstructionBits());
1662
+ UNIMPLEMENTED();
1663
+ }
1427
1664
  } else {
1428
1665
  int rd = instr->RdField();
1429
1666
  int rn = instr->RnField();
@@ -1541,21 +1778,9 @@ void Simulator::DecodeType01(Instr* instr) {
1541
1778
  SetNZFlags(alu_out);
1542
1779
  SetCFlag(shifter_carry_out);
1543
1780
  } else {
1544
- ASSERT(type == 0);
1545
- int rm = instr->RmField();
1546
- switch (instr->Bits(7, 4)) {
1547
- case BX:
1548
- set_pc(get_register(rm));
1549
- break;
1550
- case BLX: {
1551
- uint32_t old_pc = get_pc();
1552
- set_pc(get_register(rm));
1553
- set_register(lr, old_pc + Instr::kInstrSize);
1554
- break;
1555
- }
1556
- default:
1557
- UNIMPLEMENTED();
1558
- }
1781
+ // Other instructions matching this pattern are handled in the
1782
+ // miscellaneous instructions part above.
1783
+ UNREACHABLE();
1559
1784
  }
1560
1785
  break;
1561
1786
  }
@@ -1583,27 +1808,9 @@ void Simulator::DecodeType01(Instr* instr) {
1583
1808
  SetCFlag(!CarryFrom(rn_val, shifter_operand));
1584
1809
  SetVFlag(OverflowFrom(alu_out, rn_val, shifter_operand, true));
1585
1810
  } else {
1586
- ASSERT(type == 0);
1587
- int rm = instr->RmField();
1588
- int rd = instr->RdField();
1589
- switch (instr->Bits(7, 4)) {
1590
- case CLZ: {
1591
- uint32_t bits = get_register(rm);
1592
- int leading_zeros = 0;
1593
- if (bits == 0) {
1594
- leading_zeros = 32;
1595
- } else {
1596
- while ((bits & 0x80000000u) == 0) {
1597
- bits <<= 1;
1598
- leading_zeros++;
1599
- }
1600
- }
1601
- set_register(rd, leading_zeros);
1602
- break;
1603
- }
1604
- default:
1605
- UNIMPLEMENTED();
1606
- }
1811
+ // Other instructions matching this pattern are handled in the
1812
+ // miscellaneous instructions part above.
1813
+ UNREACHABLE();
1607
1814
  }
1608
1815
  break;
1609
1816
  }
@@ -1730,7 +1937,7 @@ void Simulator::DecodeType2(Instr* instr) {
1730
1937
 
1731
1938
 
1732
1939
  void Simulator::DecodeType3(Instr* instr) {
1733
- ASSERT(instr->Bit(4) == 0);
1940
+ ASSERT(instr->Bits(6, 4) == 0x5 || instr->Bit(4) == 0);
1734
1941
  int rd = instr->RdField();
1735
1942
  int rn = instr->RnField();
1736
1943
  int32_t rn_val = get_register(rn);
@@ -1757,10 +1964,27 @@ void Simulator::DecodeType3(Instr* instr) {
1757
1964
  break;
1758
1965
  }
1759
1966
  case 3: {
1760
- // Format(instr, "'memop'cond'b 'rd, ['rn, +'shift_rm]'w");
1761
- addr = rn_val + shifter_operand;
1762
- if (instr->HasW()) {
1763
- set_register(rn, addr);
1967
+ // UBFX.
1968
+ if (instr->HasW() && (instr->Bits(6, 4) == 0x5)) {
1969
+ uint32_t widthminus1 = static_cast<uint32_t>(instr->Bits(20, 16));
1970
+ uint32_t lsbit = static_cast<uint32_t>(instr->ShiftAmountField());
1971
+ uint32_t msbit = widthminus1 + lsbit;
1972
+ if (msbit <= 31) {
1973
+ uint32_t rm_val =
1974
+ static_cast<uint32_t>(get_register(instr->RmField()));
1975
+ uint32_t extr_val = rm_val << (31 - msbit);
1976
+ extr_val = extr_val >> (31 - widthminus1);
1977
+ set_register(instr->RdField(), extr_val);
1978
+ } else {
1979
+ UNREACHABLE();
1980
+ }
1981
+ return;
1982
+ } else {
1983
+ // Format(instr, "'memop'cond'b 'rd, ['rn, +'shift_rm]'w");
1984
+ addr = rn_val + shifter_operand;
1985
+ if (instr->HasW()) {
1986
+ set_register(rn, addr);
1987
+ }
1764
1988
  }
1765
1989
  break;
1766
1990
  }
@@ -1774,7 +1998,8 @@ void Simulator::DecodeType3(Instr* instr) {
1774
1998
  uint8_t byte = ReadB(addr);
1775
1999
  set_register(rd, byte);
1776
2000
  } else {
1777
- UNIMPLEMENTED();
2001
+ uint8_t byte = get_register(rd);
2002
+ WriteB(addr, byte);
1778
2003
  }
1779
2004
  } else {
1780
2005
  if (instr->HasL()) {
@@ -1891,6 +2116,13 @@ void Simulator::DecodeUnconditional(Instr* instr) {
1891
2116
  }
1892
2117
 
1893
2118
 
2119
+ // Depending on value of last_bit flag glue register code from vm and m values
2120
+ // (where m is expected to be a single bit).
2121
+ static int GlueRegCode(bool last_bit, int vm, int m) {
2122
+ return last_bit ? ((vm << 1) | m) : ((m << 4) | vm);
2123
+ }
2124
+
2125
+
1894
2126
  // void Simulator::DecodeTypeVFP(Instr* instr)
1895
2127
  // The Following ARMv7 VFPv instructions are currently supported.
1896
2128
  // vmov :Sn = Rt
@@ -1905,114 +2137,212 @@ void Simulator::DecodeUnconditional(Instr* instr) {
1905
2137
  // VMRS
1906
2138
  void Simulator::DecodeTypeVFP(Instr* instr) {
1907
2139
  ASSERT((instr->TypeField() == 7) && (instr->Bit(24) == 0x0) );
2140
+ ASSERT(instr->Bits(11, 9) == 0x5);
1908
2141
 
1909
- int rt = instr->RtField();
1910
2142
  int vm = instr->VmField();
1911
- int vn = instr->VnField();
1912
2143
  int vd = instr->VdField();
2144
+ int vn = instr->VnField();
2145
+
2146
+ if (instr->Bit(4) == 0) {
2147
+ if (instr->Opc1Field() == 0x7) {
2148
+ // Other data processing instructions
2149
+ if ((instr->Opc2Field() == 0x7) && (instr->Opc3Field() == 0x3)) {
2150
+ DecodeVCVTBetweenDoubleAndSingle(instr);
2151
+ } else if ((instr->Opc2Field() == 0x8) && (instr->Opc3Field() & 0x1)) {
2152
+ DecodeVCVTBetweenFloatingPointAndInteger(instr);
2153
+ } else if (((instr->Opc2Field() >> 1) == 0x6) &&
2154
+ (instr->Opc3Field() & 0x1)) {
2155
+ DecodeVCVTBetweenFloatingPointAndInteger(instr);
2156
+ } else if (((instr->Opc2Field() == 0x4) || (instr->Opc2Field() == 0x5)) &&
2157
+ (instr->Opc3Field() & 0x1)) {
2158
+ DecodeVCMP(instr);
2159
+ } else {
2160
+ UNREACHABLE(); // Not used by V8.
2161
+ }
2162
+ } else if (instr->Opc1Field() == 0x3) {
2163
+ if (instr->SzField() != 0x1) {
2164
+ UNREACHABLE(); // Not used by V8.
2165
+ }
2166
+
2167
+ if (instr->Opc3Field() & 0x1) {
2168
+ // vsub
2169
+ double dn_value = get_double_from_d_register(vn);
2170
+ double dm_value = get_double_from_d_register(vm);
2171
+ double dd_value = dn_value - dm_value;
2172
+ set_d_register_from_double(vd, dd_value);
2173
+ } else {
2174
+ // vadd
2175
+ double dn_value = get_double_from_d_register(vn);
2176
+ double dm_value = get_double_from_d_register(vm);
2177
+ double dd_value = dn_value + dm_value;
2178
+ set_d_register_from_double(vd, dd_value);
2179
+ }
2180
+ } else if ((instr->Opc1Field() == 0x2) && !(instr->Opc3Field() & 0x1)) {
2181
+ // vmul
2182
+ if (instr->SzField() != 0x1) {
2183
+ UNREACHABLE(); // Not used by V8.
2184
+ }
1913
2185
 
1914
- if (instr->Bit(23) == 1) {
1915
- if ((instr->Bits(21, 19) == 0x7) &&
1916
- (instr->Bits(18, 16) == 0x5) &&
1917
- (instr->Bits(11, 9) == 0x5) &&
1918
- (instr->Bit(8) == 1) &&
1919
- (instr->Bit(6) == 1) &&
1920
- (instr->Bit(4) == 0)) {
1921
- double dm_val = get_double_from_d_register(vm);
1922
- int32_t int_value = static_cast<int32_t>(dm_val);
1923
- set_s_register_from_sinteger(((vd<<1) | instr->DField()), int_value);
1924
- } else if ((instr->Bits(21, 19) == 0x7) &&
1925
- (instr->Bits(18, 16) == 0x0) &&
1926
- (instr->Bits(11, 9) == 0x5) &&
1927
- (instr->Bit(8) == 1) &&
1928
- (instr->Bit(7) == 1) &&
1929
- (instr->Bit(6) == 1) &&
1930
- (instr->Bit(4) == 0)) {
1931
- int32_t int_value = get_sinteger_from_s_register(((vm<<1) |
1932
- instr->MField()));
1933
- double dbl_value = static_cast<double>(int_value);
1934
- set_d_register_from_double(vd, dbl_value);
1935
- } else if ((instr->Bit(21) == 0x0) &&
1936
- (instr->Bit(20) == 0x0) &&
1937
- (instr->Bits(11, 9) == 0x5) &&
1938
- (instr->Bit(8) == 1) &&
1939
- (instr->Bit(6) == 0) &&
1940
- (instr->Bit(4) == 0)) {
1941
2186
  double dn_value = get_double_from_d_register(vn);
1942
2187
  double dm_value = get_double_from_d_register(vm);
1943
- double dd_value = dn_value / dm_value;
2188
+ double dd_value = dn_value * dm_value;
1944
2189
  set_d_register_from_double(vd, dd_value);
1945
- } else if ((instr->Bits(21, 20) == 0x3) &&
1946
- (instr->Bits(19, 16) == 0x4) &&
1947
- (instr->Bits(11, 9) == 0x5) &&
1948
- (instr->Bit(8) == 0x1) &&
1949
- (instr->Bit(6) == 0x1) &&
1950
- (instr->Bit(4) == 0x0)) {
1951
- double dd_value = get_double_from_d_register(vd);
2190
+ } else if ((instr->Opc1Field() == 0x4) && !(instr->Opc3Field() & 0x1)) {
2191
+ // vdiv
2192
+ if (instr->SzField() != 0x1) {
2193
+ UNREACHABLE(); // Not used by V8.
2194
+ }
2195
+
2196
+ double dn_value = get_double_from_d_register(vn);
1952
2197
  double dm_value = get_double_from_d_register(vm);
1953
- Compute_FPSCR_Flags(dd_value, dm_value);
1954
- } else if ((instr->Bits(23, 20) == 0xF) &&
1955
- (instr->Bits(19, 16) == 0x1) &&
1956
- (instr->Bits(11, 8) == 0xA) &&
1957
- (instr->Bits(7, 5) == 0x0) &&
1958
- (instr->Bit(4) == 0x1) &&
1959
- (instr->Bits(3, 0) == 0x0)) {
1960
- if (instr->Bits(15, 12) == 0xF)
2198
+ double dd_value = dn_value / dm_value;
2199
+ set_d_register_from_double(vd, dd_value);
2200
+ } else {
2201
+ UNIMPLEMENTED(); // Not used by V8.
2202
+ }
2203
+ } else {
2204
+ if ((instr->VCField() == 0x0) &&
2205
+ (instr->VAField() == 0x0)) {
2206
+ DecodeVMOVBetweenCoreAndSinglePrecisionRegisters(instr);
2207
+ } else if ((instr->VLField() == 0x1) &&
2208
+ (instr->VCField() == 0x0) &&
2209
+ (instr->VAField() == 0x7) &&
2210
+ (instr->Bits(19, 16) == 0x1)) {
2211
+ // vmrs
2212
+ if (instr->RtField() == 0xF)
1961
2213
  Copy_FPSCR_to_APSR();
1962
2214
  else
1963
2215
  UNIMPLEMENTED(); // Not used by V8.
1964
2216
  } else {
1965
2217
  UNIMPLEMENTED(); // Not used by V8.
1966
2218
  }
1967
- } else if (instr->Bit(21) == 1) {
1968
- if ((instr->Bit(20) == 0x1) &&
1969
- (instr->Bits(11, 9) == 0x5) &&
1970
- (instr->Bit(8) == 0x1) &&
1971
- (instr->Bit(6) == 0) &&
1972
- (instr->Bit(4) == 0)) {
1973
- double dn_value = get_double_from_d_register(vn);
1974
- double dm_value = get_double_from_d_register(vm);
1975
- double dd_value = dn_value + dm_value;
1976
- set_d_register_from_double(vd, dd_value);
1977
- } else if ((instr->Bit(20) == 0x1) &&
1978
- (instr->Bits(11, 9) == 0x5) &&
1979
- (instr->Bit(8) == 0x1) &&
1980
- (instr->Bit(6) == 1) &&
1981
- (instr->Bit(4) == 0)) {
1982
- double dn_value = get_double_from_d_register(vn);
1983
- double dm_value = get_double_from_d_register(vm);
1984
- double dd_value = dn_value - dm_value;
1985
- set_d_register_from_double(vd, dd_value);
1986
- } else if ((instr->Bit(20) == 0x0) &&
1987
- (instr->Bits(11, 9) == 0x5) &&
1988
- (instr->Bit(8) == 0x1) &&
1989
- (instr->Bit(6) == 0) &&
1990
- (instr->Bit(4) == 0)) {
1991
- double dn_value = get_double_from_d_register(vn);
1992
- double dm_value = get_double_from_d_register(vm);
1993
- double dd_value = dn_value * dm_value;
1994
- set_d_register_from_double(vd, dd_value);
1995
- } else {
2219
+ }
2220
+ }
2221
+
2222
+
2223
+ void Simulator::DecodeVMOVBetweenCoreAndSinglePrecisionRegisters(Instr* instr) {
2224
+ ASSERT((instr->Bit(4) == 1) && (instr->VCField() == 0x0) &&
2225
+ (instr->VAField() == 0x0));
2226
+
2227
+ int t = instr->RtField();
2228
+ int n = GlueRegCode(true, instr->VnField(), instr->NField());
2229
+ bool to_arm_register = (instr->VLField() == 0x1);
2230
+
2231
+ if (to_arm_register) {
2232
+ int32_t int_value = get_sinteger_from_s_register(n);
2233
+ set_register(t, int_value);
2234
+ } else {
2235
+ int32_t rs_val = get_register(t);
2236
+ set_s_register_from_sinteger(n, rs_val);
2237
+ }
2238
+ }
2239
+
2240
+
2241
+ void Simulator::DecodeVCMP(Instr* instr) {
2242
+ ASSERT((instr->Bit(4) == 0) && (instr->Opc1Field() == 0x7));
2243
+ ASSERT(((instr->Opc2Field() == 0x4) || (instr->Opc2Field() == 0x5)) &&
2244
+ (instr->Opc3Field() & 0x1));
2245
+
2246
+ // Comparison.
2247
+ bool dp_operation = (instr->SzField() == 1);
2248
+
2249
+ if (instr->Bit(7) != 0) {
2250
+ // Raising exceptions for quiet NaNs are not supported.
2251
+ UNIMPLEMENTED(); // Not used by V8.
2252
+ }
2253
+
2254
+ int d = GlueRegCode(!dp_operation, instr->VdField(), instr->DField());
2255
+ int m = GlueRegCode(!dp_operation, instr->VmField(), instr->MField());
2256
+
2257
+ if (dp_operation) {
2258
+ double dd_value = get_double_from_d_register(d);
2259
+ double dm_value = get_double_from_d_register(m);
2260
+
2261
+ Compute_FPSCR_Flags(dd_value, dm_value);
2262
+ } else {
2263
+ UNIMPLEMENTED(); // Not used by V8.
2264
+ }
2265
+ }
2266
+
2267
+
2268
+ void Simulator::DecodeVCVTBetweenDoubleAndSingle(Instr* instr) {
2269
+ ASSERT((instr->Bit(4) == 0) && (instr->Opc1Field() == 0x7));
2270
+ ASSERT((instr->Opc2Field() == 0x7) && (instr->Opc3Field() == 0x3));
2271
+
2272
+ bool double_to_single = (instr->SzField() == 1);
2273
+ int dst = GlueRegCode(double_to_single, instr->VdField(), instr->DField());
2274
+ int src = GlueRegCode(!double_to_single, instr->VmField(), instr->MField());
2275
+
2276
+ if (double_to_single) {
2277
+ double val = get_double_from_d_register(src);
2278
+ set_s_register_from_float(dst, static_cast<float>(val));
2279
+ } else {
2280
+ float val = get_float_from_s_register(src);
2281
+ set_d_register_from_double(dst, static_cast<double>(val));
2282
+ }
2283
+ }
2284
+
2285
+
2286
+ void Simulator::DecodeVCVTBetweenFloatingPointAndInteger(Instr* instr) {
2287
+ ASSERT((instr->Bit(4) == 0) && (instr->Opc1Field() == 0x7));
2288
+ ASSERT(((instr->Opc2Field() == 0x8) && (instr->Opc3Field() & 0x1)) ||
2289
+ (((instr->Opc2Field() >> 1) == 0x6) && (instr->Opc3Field() & 0x1)));
2290
+
2291
+ // Conversion between floating-point and integer.
2292
+ int vd = instr->VdField();
2293
+ int d = instr->DField();
2294
+ int vm = instr->VmField();
2295
+ int m = instr->MField();
2296
+
2297
+ bool to_integer = (instr->Bit(18) == 1);
2298
+ bool dp_operation = (instr->SzField() == 1);
2299
+ if (to_integer) {
2300
+ bool unsigned_integer = (instr->Bit(16) == 0);
2301
+ if (instr->Bit(7) != 1) {
2302
+ // Only rounding towards zero supported.
1996
2303
  UNIMPLEMENTED(); // Not used by V8.
1997
2304
  }
2305
+
2306
+ int dst = GlueRegCode(true, vd, d);
2307
+ int src = GlueRegCode(!dp_operation, vm, m);
2308
+
2309
+ if (dp_operation) {
2310
+ double val = get_double_from_d_register(src);
2311
+
2312
+ int sint = unsigned_integer ? static_cast<uint32_t>(val) :
2313
+ static_cast<int32_t>(val);
2314
+
2315
+ set_s_register_from_sinteger(dst, sint);
2316
+ } else {
2317
+ float val = get_float_from_s_register(src);
2318
+
2319
+ int sint = unsigned_integer ? static_cast<uint32_t>(val) :
2320
+ static_cast<int32_t>(val);
2321
+
2322
+ set_s_register_from_sinteger(dst, sint);
2323
+ }
1998
2324
  } else {
1999
- if ((instr->Bit(20) == 0x0) &&
2000
- (instr->Bits(11, 8) == 0xA) &&
2001
- (instr->Bits(6, 5) == 0x0) &&
2002
- (instr->Bit(4) == 1) &&
2003
- (instr->Bits(3, 0) == 0x0)) {
2004
- int32_t rs_val = get_register(rt);
2005
- set_s_register_from_sinteger(((vn<<1) | instr->NField()), rs_val);
2006
- } else if ((instr->Bit(20) == 0x1) &&
2007
- (instr->Bits(11, 8) == 0xA) &&
2008
- (instr->Bits(6, 5) == 0x0) &&
2009
- (instr->Bit(4) == 1) &&
2010
- (instr->Bits(3, 0) == 0x0)) {
2011
- int32_t int_value = get_sinteger_from_s_register(((vn<<1) |
2012
- instr->NField()));
2013
- set_register(rt, int_value);
2325
+ bool unsigned_integer = (instr->Bit(7) == 0);
2326
+
2327
+ int dst = GlueRegCode(!dp_operation, vd, d);
2328
+ int src = GlueRegCode(true, vm, m);
2329
+
2330
+ int val = get_sinteger_from_s_register(src);
2331
+
2332
+ if (dp_operation) {
2333
+ if (unsigned_integer) {
2334
+ set_d_register_from_double(dst,
2335
+ static_cast<double>((uint32_t)val));
2336
+ } else {
2337
+ set_d_register_from_double(dst, static_cast<double>(val));
2338
+ }
2014
2339
  } else {
2015
- UNIMPLEMENTED(); // Not used by V8.
2340
+ if (unsigned_integer) {
2341
+ set_s_register_from_float(dst,
2342
+ static_cast<float>((uint32_t)val));
2343
+ } else {
2344
+ set_s_register_from_float(dst, static_cast<float>(val));
2345
+ }
2016
2346
  }
2017
2347
  }
2018
2348
  }
@@ -2022,48 +2352,96 @@ void Simulator::DecodeTypeVFP(Instr* instr) {
2022
2352
  // Decode Type 6 coprocessor instructions.
2023
2353
  // Dm = vmov(Rt, Rt2)
2024
2354
  // <Rt, Rt2> = vmov(Dm)
2355
+ // Ddst = MEM(Rbase + 4*offset).
2356
+ // MEM(Rbase + 4*offset) = Dsrc.
2025
2357
  void Simulator::DecodeType6CoprocessorIns(Instr* instr) {
2026
2358
  ASSERT((instr->TypeField() == 6));
2027
2359
 
2028
- int rt = instr->RtField();
2029
- int rn = instr->RnField();
2030
- int vm = instr->VmField();
2360
+ if (instr->CoprocessorField() == 0xA) {
2361
+ switch (instr->OpcodeField()) {
2362
+ case 0x8:
2363
+ case 0xC: { // Load and store float to memory.
2364
+ int rn = instr->RnField();
2365
+ int vd = instr->VdField();
2366
+ int offset = instr->Immed8Field();
2367
+ if (!instr->HasU()) {
2368
+ offset = -offset;
2369
+ }
2031
2370
 
2032
- if (instr->Bit(23) == 1) {
2033
- UNIMPLEMENTED();
2034
- } else if (instr->Bit(22) == 1) {
2035
- if ((instr->Bits(27, 24) == 0xC) &&
2036
- (instr->Bit(22) == 1) &&
2037
- (instr->Bits(11, 8) == 0xB) &&
2038
- (instr->Bits(7, 6) == 0x0) &&
2039
- (instr->Bit(4) == 1)) {
2040
- if (instr->Bit(20) == 0) {
2041
- int32_t rs_val = get_register(rt);
2042
- int32_t rn_val = get_register(rn);
2043
-
2044
- set_s_register_from_sinteger(2*vm, rs_val);
2045
- set_s_register_from_sinteger((2*vm+1), rn_val);
2046
-
2047
- } else if (instr->Bit(20) == 1) {
2048
- int32_t rt_int_value = get_sinteger_from_s_register(2*vm);
2049
- int32_t rn_int_value = get_sinteger_from_s_register(2*vm+1);
2050
-
2051
- set_register(rt, rt_int_value);
2052
- set_register(rn, rn_int_value);
2371
+ int32_t address = get_register(rn) + 4 * offset;
2372
+ if (instr->HasL()) {
2373
+ // Load double from memory: vldr.
2374
+ set_s_register_from_sinteger(vd, ReadW(address, instr));
2375
+ } else {
2376
+ // Store double to memory: vstr.
2377
+ WriteW(address, get_sinteger_from_s_register(vd), instr);
2378
+ }
2379
+ break;
2053
2380
  }
2054
- } else {
2055
- UNIMPLEMENTED();
2381
+ default:
2382
+ UNIMPLEMENTED(); // Not used by V8.
2383
+ break;
2384
+ }
2385
+ } else if (instr->CoprocessorField() == 0xB) {
2386
+ switch (instr->OpcodeField()) {
2387
+ case 0x2:
2388
+ // Load and store double to two GP registers
2389
+ if (instr->Bits(7, 4) != 0x1) {
2390
+ UNIMPLEMENTED(); // Not used by V8.
2391
+ } else {
2392
+ int rt = instr->RtField();
2393
+ int rn = instr->RnField();
2394
+ int vm = instr->VmField();
2395
+ if (instr->HasL()) {
2396
+ int32_t rt_int_value = get_sinteger_from_s_register(2*vm);
2397
+ int32_t rn_int_value = get_sinteger_from_s_register(2*vm+1);
2398
+
2399
+ set_register(rt, rt_int_value);
2400
+ set_register(rn, rn_int_value);
2401
+ } else {
2402
+ int32_t rs_val = get_register(rt);
2403
+ int32_t rn_val = get_register(rn);
2404
+
2405
+ set_s_register_from_sinteger(2*vm, rs_val);
2406
+ set_s_register_from_sinteger((2*vm+1), rn_val);
2407
+ }
2408
+ }
2409
+ break;
2410
+ case 0x8:
2411
+ case 0xC: { // Load and store double to memory.
2412
+ int rn = instr->RnField();
2413
+ int vd = instr->VdField();
2414
+ int offset = instr->Immed8Field();
2415
+ if (!instr->HasU()) {
2416
+ offset = -offset;
2417
+ }
2418
+ int32_t address = get_register(rn) + 4 * offset;
2419
+ if (instr->HasL()) {
2420
+ // Load double from memory: vldr.
2421
+ set_s_register_from_sinteger(2*vd, ReadW(address, instr));
2422
+ set_s_register_from_sinteger(2*vd + 1, ReadW(address + 4, instr));
2423
+ } else {
2424
+ // Store double to memory: vstr.
2425
+ WriteW(address, get_sinteger_from_s_register(2*vd), instr);
2426
+ WriteW(address + 4, get_sinteger_from_s_register(2*vd + 1), instr);
2427
+ }
2428
+ break;
2429
+ }
2430
+ default:
2431
+ UNIMPLEMENTED(); // Not used by V8.
2432
+ break;
2056
2433
  }
2057
- } else if (instr->Bit(21) == 1) {
2058
- UNIMPLEMENTED();
2059
2434
  } else {
2060
- UNIMPLEMENTED();
2435
+ UNIMPLEMENTED(); // Not used by V8.
2061
2436
  }
2062
2437
  }
2063
2438
 
2064
2439
 
2065
2440
  // Executes the current instruction.
2066
2441
  void Simulator::InstructionDecode(Instr* instr) {
2442
+ if (v8::internal::FLAG_check_icache) {
2443
+ CheckICache(instr);
2444
+ }
2067
2445
  pc_modified_ = false;
2068
2446
  if (::v8::internal::FLAG_trace_sim) {
2069
2447
  disasm::NameConverter converter;
@@ -2258,7 +2636,6 @@ uintptr_t Simulator::PopAddress() {
2258
2636
  return address;
2259
2637
  }
2260
2638
 
2261
-
2262
2639
  } } // namespace assembler::arm
2263
2640
 
2264
- #endif // !defined(__arm__)
2641
+ #endif // __arm__