therubyracer 0.9.0beta4 → 0.9.0beta5

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 (771) hide show
  1. data/.gitignore +1 -0
  2. data/Rakefile +0 -11
  3. data/ext/v8/extconf.rb +9 -9
  4. data/ext/v8/v8_external.cpp +40 -10
  5. data/lib/v8/cli.rb +2 -1
  6. data/lib/v8/version.rb +1 -1
  7. data/spec/redjs/.gitignore +1 -0
  8. data/therubyracer.gemspec +2 -3
  9. metadata +33 -779
  10. data/ext/v8/upstream/Makefile +0 -38
  11. data/ext/v8/upstream/detect_cpu.rb +0 -27
  12. data/ext/v8/upstream/fpic-on-linux-amd64.patch +0 -13
  13. data/ext/v8/upstream/scons/CHANGES.txt +0 -5183
  14. data/ext/v8/upstream/scons/LICENSE.txt +0 -20
  15. data/ext/v8/upstream/scons/MANIFEST +0 -202
  16. data/ext/v8/upstream/scons/PKG-INFO +0 -13
  17. data/ext/v8/upstream/scons/README.txt +0 -273
  18. data/ext/v8/upstream/scons/RELEASE.txt +0 -1040
  19. data/ext/v8/upstream/scons/engine/SCons/Action.py +0 -1256
  20. data/ext/v8/upstream/scons/engine/SCons/Builder.py +0 -868
  21. data/ext/v8/upstream/scons/engine/SCons/CacheDir.py +0 -217
  22. data/ext/v8/upstream/scons/engine/SCons/Conftest.py +0 -794
  23. data/ext/v8/upstream/scons/engine/SCons/Debug.py +0 -237
  24. data/ext/v8/upstream/scons/engine/SCons/Defaults.py +0 -485
  25. data/ext/v8/upstream/scons/engine/SCons/Environment.py +0 -2327
  26. data/ext/v8/upstream/scons/engine/SCons/Errors.py +0 -207
  27. data/ext/v8/upstream/scons/engine/SCons/Executor.py +0 -636
  28. data/ext/v8/upstream/scons/engine/SCons/Job.py +0 -435
  29. data/ext/v8/upstream/scons/engine/SCons/Memoize.py +0 -292
  30. data/ext/v8/upstream/scons/engine/SCons/Node/Alias.py +0 -153
  31. data/ext/v8/upstream/scons/engine/SCons/Node/FS.py +0 -3220
  32. data/ext/v8/upstream/scons/engine/SCons/Node/Python.py +0 -128
  33. data/ext/v8/upstream/scons/engine/SCons/Node/__init__.py +0 -1341
  34. data/ext/v8/upstream/scons/engine/SCons/Options/BoolOption.py +0 -50
  35. data/ext/v8/upstream/scons/engine/SCons/Options/EnumOption.py +0 -50
  36. data/ext/v8/upstream/scons/engine/SCons/Options/ListOption.py +0 -50
  37. data/ext/v8/upstream/scons/engine/SCons/Options/PackageOption.py +0 -50
  38. data/ext/v8/upstream/scons/engine/SCons/Options/PathOption.py +0 -76
  39. data/ext/v8/upstream/scons/engine/SCons/Options/__init__.py +0 -74
  40. data/ext/v8/upstream/scons/engine/SCons/PathList.py +0 -232
  41. data/ext/v8/upstream/scons/engine/SCons/Platform/__init__.py +0 -236
  42. data/ext/v8/upstream/scons/engine/SCons/Platform/aix.py +0 -70
  43. data/ext/v8/upstream/scons/engine/SCons/Platform/cygwin.py +0 -55
  44. data/ext/v8/upstream/scons/engine/SCons/Platform/darwin.py +0 -46
  45. data/ext/v8/upstream/scons/engine/SCons/Platform/hpux.py +0 -46
  46. data/ext/v8/upstream/scons/engine/SCons/Platform/irix.py +0 -44
  47. data/ext/v8/upstream/scons/engine/SCons/Platform/os2.py +0 -58
  48. data/ext/v8/upstream/scons/engine/SCons/Platform/posix.py +0 -264
  49. data/ext/v8/upstream/scons/engine/SCons/Platform/sunos.py +0 -50
  50. data/ext/v8/upstream/scons/engine/SCons/Platform/win32.py +0 -386
  51. data/ext/v8/upstream/scons/engine/SCons/SConf.py +0 -1038
  52. data/ext/v8/upstream/scons/engine/SCons/SConsign.py +0 -381
  53. data/ext/v8/upstream/scons/engine/SCons/Scanner/C.py +0 -132
  54. data/ext/v8/upstream/scons/engine/SCons/Scanner/D.py +0 -74
  55. data/ext/v8/upstream/scons/engine/SCons/Scanner/Dir.py +0 -111
  56. data/ext/v8/upstream/scons/engine/SCons/Scanner/Fortran.py +0 -320
  57. data/ext/v8/upstream/scons/engine/SCons/Scanner/IDL.py +0 -48
  58. data/ext/v8/upstream/scons/engine/SCons/Scanner/LaTeX.py +0 -378
  59. data/ext/v8/upstream/scons/engine/SCons/Scanner/Prog.py +0 -103
  60. data/ext/v8/upstream/scons/engine/SCons/Scanner/RC.py +0 -55
  61. data/ext/v8/upstream/scons/engine/SCons/Scanner/__init__.py +0 -415
  62. data/ext/v8/upstream/scons/engine/SCons/Script/Interactive.py +0 -386
  63. data/ext/v8/upstream/scons/engine/SCons/Script/Main.py +0 -1360
  64. data/ext/v8/upstream/scons/engine/SCons/Script/SConsOptions.py +0 -944
  65. data/ext/v8/upstream/scons/engine/SCons/Script/SConscript.py +0 -642
  66. data/ext/v8/upstream/scons/engine/SCons/Script/__init__.py +0 -414
  67. data/ext/v8/upstream/scons/engine/SCons/Sig.py +0 -63
  68. data/ext/v8/upstream/scons/engine/SCons/Subst.py +0 -911
  69. data/ext/v8/upstream/scons/engine/SCons/Taskmaster.py +0 -1030
  70. data/ext/v8/upstream/scons/engine/SCons/Tool/386asm.py +0 -61
  71. data/ext/v8/upstream/scons/engine/SCons/Tool/BitKeeper.py +0 -65
  72. data/ext/v8/upstream/scons/engine/SCons/Tool/CVS.py +0 -73
  73. data/ext/v8/upstream/scons/engine/SCons/Tool/FortranCommon.py +0 -247
  74. data/ext/v8/upstream/scons/engine/SCons/Tool/JavaCommon.py +0 -324
  75. data/ext/v8/upstream/scons/engine/SCons/Tool/MSCommon/__init__.py +0 -56
  76. data/ext/v8/upstream/scons/engine/SCons/Tool/MSCommon/arch.py +0 -61
  77. data/ext/v8/upstream/scons/engine/SCons/Tool/MSCommon/common.py +0 -210
  78. data/ext/v8/upstream/scons/engine/SCons/Tool/MSCommon/netframework.py +0 -84
  79. data/ext/v8/upstream/scons/engine/SCons/Tool/MSCommon/sdk.py +0 -321
  80. data/ext/v8/upstream/scons/engine/SCons/Tool/MSCommon/vc.py +0 -367
  81. data/ext/v8/upstream/scons/engine/SCons/Tool/MSCommon/vs.py +0 -497
  82. data/ext/v8/upstream/scons/engine/SCons/Tool/Perforce.py +0 -104
  83. data/ext/v8/upstream/scons/engine/SCons/Tool/PharLapCommon.py +0 -138
  84. data/ext/v8/upstream/scons/engine/SCons/Tool/RCS.py +0 -64
  85. data/ext/v8/upstream/scons/engine/SCons/Tool/SCCS.py +0 -64
  86. data/ext/v8/upstream/scons/engine/SCons/Tool/Subversion.py +0 -71
  87. data/ext/v8/upstream/scons/engine/SCons/Tool/__init__.py +0 -675
  88. data/ext/v8/upstream/scons/engine/SCons/Tool/aixc++.py +0 -82
  89. data/ext/v8/upstream/scons/engine/SCons/Tool/aixcc.py +0 -74
  90. data/ext/v8/upstream/scons/engine/SCons/Tool/aixf77.py +0 -80
  91. data/ext/v8/upstream/scons/engine/SCons/Tool/aixlink.py +0 -76
  92. data/ext/v8/upstream/scons/engine/SCons/Tool/applelink.py +0 -71
  93. data/ext/v8/upstream/scons/engine/SCons/Tool/ar.py +0 -63
  94. data/ext/v8/upstream/scons/engine/SCons/Tool/as.py +0 -78
  95. data/ext/v8/upstream/scons/engine/SCons/Tool/bcc32.py +0 -82
  96. data/ext/v8/upstream/scons/engine/SCons/Tool/c++.py +0 -99
  97. data/ext/v8/upstream/scons/engine/SCons/Tool/cc.py +0 -114
  98. data/ext/v8/upstream/scons/engine/SCons/Tool/cvf.py +0 -58
  99. data/ext/v8/upstream/scons/engine/SCons/Tool/default.py +0 -50
  100. data/ext/v8/upstream/scons/engine/SCons/Tool/dmd.py +0 -224
  101. data/ext/v8/upstream/scons/engine/SCons/Tool/dvi.py +0 -64
  102. data/ext/v8/upstream/scons/engine/SCons/Tool/dvipdf.py +0 -125
  103. data/ext/v8/upstream/scons/engine/SCons/Tool/dvips.py +0 -94
  104. data/ext/v8/upstream/scons/engine/SCons/Tool/f77.py +0 -62
  105. data/ext/v8/upstream/scons/engine/SCons/Tool/f90.py +0 -62
  106. data/ext/v8/upstream/scons/engine/SCons/Tool/f95.py +0 -63
  107. data/ext/v8/upstream/scons/engine/SCons/Tool/filesystem.py +0 -98
  108. data/ext/v8/upstream/scons/engine/SCons/Tool/fortran.py +0 -63
  109. data/ext/v8/upstream/scons/engine/SCons/Tool/g++.py +0 -90
  110. data/ext/v8/upstream/scons/engine/SCons/Tool/g77.py +0 -73
  111. data/ext/v8/upstream/scons/engine/SCons/Tool/gas.py +0 -53
  112. data/ext/v8/upstream/scons/engine/SCons/Tool/gcc.py +0 -80
  113. data/ext/v8/upstream/scons/engine/SCons/Tool/gfortran.py +0 -64
  114. data/ext/v8/upstream/scons/engine/SCons/Tool/gnulink.py +0 -63
  115. data/ext/v8/upstream/scons/engine/SCons/Tool/gs.py +0 -81
  116. data/ext/v8/upstream/scons/engine/SCons/Tool/hpc++.py +0 -85
  117. data/ext/v8/upstream/scons/engine/SCons/Tool/hpcc.py +0 -53
  118. data/ext/v8/upstream/scons/engine/SCons/Tool/hplink.py +0 -77
  119. data/ext/v8/upstream/scons/engine/SCons/Tool/icc.py +0 -59
  120. data/ext/v8/upstream/scons/engine/SCons/Tool/icl.py +0 -52
  121. data/ext/v8/upstream/scons/engine/SCons/Tool/ifl.py +0 -72
  122. data/ext/v8/upstream/scons/engine/SCons/Tool/ifort.py +0 -90
  123. data/ext/v8/upstream/scons/engine/SCons/Tool/ilink.py +0 -59
  124. data/ext/v8/upstream/scons/engine/SCons/Tool/ilink32.py +0 -60
  125. data/ext/v8/upstream/scons/engine/SCons/Tool/install.py +0 -229
  126. data/ext/v8/upstream/scons/engine/SCons/Tool/intelc.py +0 -490
  127. data/ext/v8/upstream/scons/engine/SCons/Tool/ipkg.py +0 -71
  128. data/ext/v8/upstream/scons/engine/SCons/Tool/jar.py +0 -110
  129. data/ext/v8/upstream/scons/engine/SCons/Tool/javac.py +0 -234
  130. data/ext/v8/upstream/scons/engine/SCons/Tool/javah.py +0 -138
  131. data/ext/v8/upstream/scons/engine/SCons/Tool/latex.py +0 -79
  132. data/ext/v8/upstream/scons/engine/SCons/Tool/lex.py +0 -99
  133. data/ext/v8/upstream/scons/engine/SCons/Tool/link.py +0 -121
  134. data/ext/v8/upstream/scons/engine/SCons/Tool/linkloc.py +0 -112
  135. data/ext/v8/upstream/scons/engine/SCons/Tool/m4.py +0 -63
  136. data/ext/v8/upstream/scons/engine/SCons/Tool/masm.py +0 -77
  137. data/ext/v8/upstream/scons/engine/SCons/Tool/midl.py +0 -90
  138. data/ext/v8/upstream/scons/engine/SCons/Tool/mingw.py +0 -159
  139. data/ext/v8/upstream/scons/engine/SCons/Tool/mslib.py +0 -64
  140. data/ext/v8/upstream/scons/engine/SCons/Tool/mslink.py +0 -266
  141. data/ext/v8/upstream/scons/engine/SCons/Tool/mssdk.py +0 -50
  142. data/ext/v8/upstream/scons/engine/SCons/Tool/msvc.py +0 -269
  143. data/ext/v8/upstream/scons/engine/SCons/Tool/msvs.py +0 -1439
  144. data/ext/v8/upstream/scons/engine/SCons/Tool/mwcc.py +0 -208
  145. data/ext/v8/upstream/scons/engine/SCons/Tool/mwld.py +0 -107
  146. data/ext/v8/upstream/scons/engine/SCons/Tool/nasm.py +0 -72
  147. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/__init__.py +0 -314
  148. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/ipk.py +0 -185
  149. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/msi.py +0 -526
  150. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/rpm.py +0 -367
  151. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/src_tarbz2.py +0 -43
  152. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/src_targz.py +0 -43
  153. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/src_zip.py +0 -43
  154. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/tarbz2.py +0 -44
  155. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/targz.py +0 -44
  156. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/zip.py +0 -44
  157. data/ext/v8/upstream/scons/engine/SCons/Tool/pdf.py +0 -78
  158. data/ext/v8/upstream/scons/engine/SCons/Tool/pdflatex.py +0 -83
  159. data/ext/v8/upstream/scons/engine/SCons/Tool/pdftex.py +0 -108
  160. data/ext/v8/upstream/scons/engine/SCons/Tool/qt.py +0 -336
  161. data/ext/v8/upstream/scons/engine/SCons/Tool/rmic.py +0 -121
  162. data/ext/v8/upstream/scons/engine/SCons/Tool/rpcgen.py +0 -70
  163. data/ext/v8/upstream/scons/engine/SCons/Tool/rpm.py +0 -132
  164. data/ext/v8/upstream/scons/engine/SCons/Tool/sgiar.py +0 -68
  165. data/ext/v8/upstream/scons/engine/SCons/Tool/sgic++.py +0 -58
  166. data/ext/v8/upstream/scons/engine/SCons/Tool/sgicc.py +0 -53
  167. data/ext/v8/upstream/scons/engine/SCons/Tool/sgilink.py +0 -63
  168. data/ext/v8/upstream/scons/engine/SCons/Tool/sunar.py +0 -67
  169. data/ext/v8/upstream/scons/engine/SCons/Tool/sunc++.py +0 -142
  170. data/ext/v8/upstream/scons/engine/SCons/Tool/suncc.py +0 -58
  171. data/ext/v8/upstream/scons/engine/SCons/Tool/sunf77.py +0 -63
  172. data/ext/v8/upstream/scons/engine/SCons/Tool/sunf90.py +0 -64
  173. data/ext/v8/upstream/scons/engine/SCons/Tool/sunf95.py +0 -64
  174. data/ext/v8/upstream/scons/engine/SCons/Tool/sunlink.py +0 -77
  175. data/ext/v8/upstream/scons/engine/SCons/Tool/swig.py +0 -186
  176. data/ext/v8/upstream/scons/engine/SCons/Tool/tar.py +0 -73
  177. data/ext/v8/upstream/scons/engine/SCons/Tool/tex.py +0 -805
  178. data/ext/v8/upstream/scons/engine/SCons/Tool/textfile.py +0 -175
  179. data/ext/v8/upstream/scons/engine/SCons/Tool/tlib.py +0 -53
  180. data/ext/v8/upstream/scons/engine/SCons/Tool/wix.py +0 -100
  181. data/ext/v8/upstream/scons/engine/SCons/Tool/yacc.py +0 -131
  182. data/ext/v8/upstream/scons/engine/SCons/Tool/zip.py +0 -100
  183. data/ext/v8/upstream/scons/engine/SCons/Util.py +0 -1645
  184. data/ext/v8/upstream/scons/engine/SCons/Variables/BoolVariable.py +0 -91
  185. data/ext/v8/upstream/scons/engine/SCons/Variables/EnumVariable.py +0 -107
  186. data/ext/v8/upstream/scons/engine/SCons/Variables/ListVariable.py +0 -139
  187. data/ext/v8/upstream/scons/engine/SCons/Variables/PackageVariable.py +0 -109
  188. data/ext/v8/upstream/scons/engine/SCons/Variables/PathVariable.py +0 -147
  189. data/ext/v8/upstream/scons/engine/SCons/Variables/__init__.py +0 -317
  190. data/ext/v8/upstream/scons/engine/SCons/Warnings.py +0 -228
  191. data/ext/v8/upstream/scons/engine/SCons/__init__.py +0 -49
  192. data/ext/v8/upstream/scons/engine/SCons/compat/__init__.py +0 -302
  193. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_UserString.py +0 -98
  194. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_hashlib.py +0 -91
  195. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_itertools.py +0 -124
  196. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_optparse.py +0 -1725
  197. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_sets.py +0 -583
  198. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_sets15.py +0 -176
  199. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_shlex.py +0 -325
  200. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_subprocess.py +0 -1296
  201. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_textwrap.py +0 -382
  202. data/ext/v8/upstream/scons/engine/SCons/compat/builtins.py +0 -187
  203. data/ext/v8/upstream/scons/engine/SCons/cpp.py +0 -598
  204. data/ext/v8/upstream/scons/engine/SCons/dblite.py +0 -248
  205. data/ext/v8/upstream/scons/engine/SCons/exitfuncs.py +0 -77
  206. data/ext/v8/upstream/scons/os_spawnv_fix.diff +0 -83
  207. data/ext/v8/upstream/scons/scons-time.1 +0 -1017
  208. data/ext/v8/upstream/scons/scons.1 +0 -15179
  209. data/ext/v8/upstream/scons/sconsign.1 +0 -208
  210. data/ext/v8/upstream/scons/script/scons +0 -184
  211. data/ext/v8/upstream/scons/script/scons-time +0 -1529
  212. data/ext/v8/upstream/scons/script/scons.bat +0 -31
  213. data/ext/v8/upstream/scons/script/sconsign +0 -508
  214. data/ext/v8/upstream/scons/setup.cfg +0 -6
  215. data/ext/v8/upstream/scons/setup.py +0 -427
  216. data/ext/v8/upstream/v8/.gitignore +0 -33
  217. data/ext/v8/upstream/v8/AUTHORS +0 -42
  218. data/ext/v8/upstream/v8/ChangeLog +0 -2663
  219. data/ext/v8/upstream/v8/LICENSE +0 -52
  220. data/ext/v8/upstream/v8/LICENSE.strongtalk +0 -29
  221. data/ext/v8/upstream/v8/LICENSE.v8 +0 -26
  222. data/ext/v8/upstream/v8/LICENSE.valgrind +0 -45
  223. data/ext/v8/upstream/v8/SConstruct +0 -1473
  224. data/ext/v8/upstream/v8/build/README.txt +0 -25
  225. data/ext/v8/upstream/v8/build/all.gyp +0 -18
  226. data/ext/v8/upstream/v8/build/armu.gypi +0 -32
  227. data/ext/v8/upstream/v8/build/common.gypi +0 -82
  228. data/ext/v8/upstream/v8/build/gyp_v8 +0 -145
  229. data/ext/v8/upstream/v8/include/v8-debug.h +0 -394
  230. data/ext/v8/upstream/v8/include/v8-preparser.h +0 -116
  231. data/ext/v8/upstream/v8/include/v8-profiler.h +0 -505
  232. data/ext/v8/upstream/v8/include/v8-testing.h +0 -104
  233. data/ext/v8/upstream/v8/include/v8.h +0 -4000
  234. data/ext/v8/upstream/v8/include/v8stdint.h +0 -53
  235. data/ext/v8/upstream/v8/preparser/SConscript +0 -38
  236. data/ext/v8/upstream/v8/preparser/preparser-process.cc +0 -169
  237. data/ext/v8/upstream/v8/src/SConscript +0 -380
  238. data/ext/v8/upstream/v8/src/accessors.cc +0 -766
  239. data/ext/v8/upstream/v8/src/accessors.h +0 -121
  240. data/ext/v8/upstream/v8/src/allocation-inl.h +0 -49
  241. data/ext/v8/upstream/v8/src/allocation.cc +0 -122
  242. data/ext/v8/upstream/v8/src/allocation.h +0 -143
  243. data/ext/v8/upstream/v8/src/api.cc +0 -5678
  244. data/ext/v8/upstream/v8/src/api.h +0 -572
  245. data/ext/v8/upstream/v8/src/apinatives.js +0 -110
  246. data/ext/v8/upstream/v8/src/apiutils.h +0 -73
  247. data/ext/v8/upstream/v8/src/arguments.h +0 -116
  248. data/ext/v8/upstream/v8/src/arm/assembler-arm-inl.h +0 -353
  249. data/ext/v8/upstream/v8/src/arm/assembler-arm.cc +0 -2877
  250. data/ext/v8/upstream/v8/src/arm/assembler-arm.h +0 -1382
  251. data/ext/v8/upstream/v8/src/arm/builtins-arm.cc +0 -1634
  252. data/ext/v8/upstream/v8/src/arm/code-stubs-arm.cc +0 -6917
  253. data/ext/v8/upstream/v8/src/arm/code-stubs-arm.h +0 -623
  254. data/ext/v8/upstream/v8/src/arm/codegen-arm-inl.h +0 -48
  255. data/ext/v8/upstream/v8/src/arm/codegen-arm.cc +0 -7437
  256. data/ext/v8/upstream/v8/src/arm/codegen-arm.h +0 -595
  257. data/ext/v8/upstream/v8/src/arm/constants-arm.cc +0 -152
  258. data/ext/v8/upstream/v8/src/arm/constants-arm.h +0 -778
  259. data/ext/v8/upstream/v8/src/arm/cpu-arm.cc +0 -149
  260. data/ext/v8/upstream/v8/src/arm/debug-arm.cc +0 -317
  261. data/ext/v8/upstream/v8/src/arm/deoptimizer-arm.cc +0 -737
  262. data/ext/v8/upstream/v8/src/arm/disasm-arm.cc +0 -1503
  263. data/ext/v8/upstream/v8/src/arm/frames-arm.cc +0 -45
  264. data/ext/v8/upstream/v8/src/arm/frames-arm.h +0 -168
  265. data/ext/v8/upstream/v8/src/arm/full-codegen-arm.cc +0 -4374
  266. data/ext/v8/upstream/v8/src/arm/ic-arm.cc +0 -1793
  267. data/ext/v8/upstream/v8/src/arm/jump-target-arm.cc +0 -174
  268. data/ext/v8/upstream/v8/src/arm/lithium-arm.cc +0 -2120
  269. data/ext/v8/upstream/v8/src/arm/lithium-arm.h +0 -2179
  270. data/ext/v8/upstream/v8/src/arm/lithium-codegen-arm.cc +0 -4132
  271. data/ext/v8/upstream/v8/src/arm/lithium-codegen-arm.h +0 -329
  272. data/ext/v8/upstream/v8/src/arm/lithium-gap-resolver-arm.cc +0 -305
  273. data/ext/v8/upstream/v8/src/arm/lithium-gap-resolver-arm.h +0 -84
  274. data/ext/v8/upstream/v8/src/arm/macro-assembler-arm.cc +0 -2939
  275. data/ext/v8/upstream/v8/src/arm/macro-assembler-arm.h +0 -1071
  276. data/ext/v8/upstream/v8/src/arm/regexp-macro-assembler-arm.cc +0 -1287
  277. data/ext/v8/upstream/v8/src/arm/regexp-macro-assembler-arm.h +0 -253
  278. data/ext/v8/upstream/v8/src/arm/register-allocator-arm-inl.h +0 -100
  279. data/ext/v8/upstream/v8/src/arm/register-allocator-arm.cc +0 -63
  280. data/ext/v8/upstream/v8/src/arm/register-allocator-arm.h +0 -44
  281. data/ext/v8/upstream/v8/src/arm/simulator-arm.cc +0 -3288
  282. data/ext/v8/upstream/v8/src/arm/simulator-arm.h +0 -413
  283. data/ext/v8/upstream/v8/src/arm/stub-cache-arm.cc +0 -4034
  284. data/ext/v8/upstream/v8/src/arm/virtual-frame-arm-inl.h +0 -59
  285. data/ext/v8/upstream/v8/src/arm/virtual-frame-arm.cc +0 -843
  286. data/ext/v8/upstream/v8/src/arm/virtual-frame-arm.h +0 -523
  287. data/ext/v8/upstream/v8/src/array.js +0 -1249
  288. data/ext/v8/upstream/v8/src/assembler.cc +0 -1067
  289. data/ext/v8/upstream/v8/src/assembler.h +0 -823
  290. data/ext/v8/upstream/v8/src/ast-inl.h +0 -112
  291. data/ext/v8/upstream/v8/src/ast.cc +0 -1078
  292. data/ext/v8/upstream/v8/src/ast.h +0 -2234
  293. data/ext/v8/upstream/v8/src/atomicops.h +0 -167
  294. data/ext/v8/upstream/v8/src/atomicops_internals_arm_gcc.h +0 -145
  295. data/ext/v8/upstream/v8/src/atomicops_internals_mips_gcc.h +0 -169
  296. data/ext/v8/upstream/v8/src/atomicops_internals_x86_gcc.cc +0 -126
  297. data/ext/v8/upstream/v8/src/atomicops_internals_x86_gcc.h +0 -287
  298. data/ext/v8/upstream/v8/src/atomicops_internals_x86_macosx.h +0 -301
  299. data/ext/v8/upstream/v8/src/atomicops_internals_x86_msvc.h +0 -203
  300. data/ext/v8/upstream/v8/src/bignum-dtoa.cc +0 -655
  301. data/ext/v8/upstream/v8/src/bignum-dtoa.h +0 -81
  302. data/ext/v8/upstream/v8/src/bignum.cc +0 -768
  303. data/ext/v8/upstream/v8/src/bignum.h +0 -140
  304. data/ext/v8/upstream/v8/src/bootstrapper.cc +0 -2138
  305. data/ext/v8/upstream/v8/src/bootstrapper.h +0 -185
  306. data/ext/v8/upstream/v8/src/builtins.cc +0 -1708
  307. data/ext/v8/upstream/v8/src/builtins.h +0 -368
  308. data/ext/v8/upstream/v8/src/bytecodes-irregexp.h +0 -105
  309. data/ext/v8/upstream/v8/src/cached-powers.cc +0 -177
  310. data/ext/v8/upstream/v8/src/cached-powers.h +0 -65
  311. data/ext/v8/upstream/v8/src/char-predicates-inl.h +0 -94
  312. data/ext/v8/upstream/v8/src/char-predicates.h +0 -65
  313. data/ext/v8/upstream/v8/src/checks.cc +0 -110
  314. data/ext/v8/upstream/v8/src/checks.h +0 -296
  315. data/ext/v8/upstream/v8/src/circular-queue-inl.h +0 -53
  316. data/ext/v8/upstream/v8/src/circular-queue.cc +0 -122
  317. data/ext/v8/upstream/v8/src/circular-queue.h +0 -103
  318. data/ext/v8/upstream/v8/src/code-stubs.cc +0 -240
  319. data/ext/v8/upstream/v8/src/code-stubs.h +0 -971
  320. data/ext/v8/upstream/v8/src/code.h +0 -68
  321. data/ext/v8/upstream/v8/src/codegen-inl.h +0 -68
  322. data/ext/v8/upstream/v8/src/codegen.cc +0 -505
  323. data/ext/v8/upstream/v8/src/codegen.h +0 -245
  324. data/ext/v8/upstream/v8/src/compilation-cache.cc +0 -540
  325. data/ext/v8/upstream/v8/src/compilation-cache.h +0 -287
  326. data/ext/v8/upstream/v8/src/compiler.cc +0 -792
  327. data/ext/v8/upstream/v8/src/compiler.h +0 -307
  328. data/ext/v8/upstream/v8/src/contexts.cc +0 -327
  329. data/ext/v8/upstream/v8/src/contexts.h +0 -382
  330. data/ext/v8/upstream/v8/src/conversions-inl.h +0 -110
  331. data/ext/v8/upstream/v8/src/conversions.cc +0 -1125
  332. data/ext/v8/upstream/v8/src/conversions.h +0 -122
  333. data/ext/v8/upstream/v8/src/counters.cc +0 -93
  334. data/ext/v8/upstream/v8/src/counters.h +0 -254
  335. data/ext/v8/upstream/v8/src/cpu-profiler-inl.h +0 -101
  336. data/ext/v8/upstream/v8/src/cpu-profiler.cc +0 -606
  337. data/ext/v8/upstream/v8/src/cpu-profiler.h +0 -305
  338. data/ext/v8/upstream/v8/src/cpu.h +0 -67
  339. data/ext/v8/upstream/v8/src/d8-debug.cc +0 -367
  340. data/ext/v8/upstream/v8/src/d8-debug.h +0 -158
  341. data/ext/v8/upstream/v8/src/d8-posix.cc +0 -695
  342. data/ext/v8/upstream/v8/src/d8-readline.cc +0 -128
  343. data/ext/v8/upstream/v8/src/d8-windows.cc +0 -42
  344. data/ext/v8/upstream/v8/src/d8.cc +0 -796
  345. data/ext/v8/upstream/v8/src/d8.gyp +0 -88
  346. data/ext/v8/upstream/v8/src/d8.h +0 -231
  347. data/ext/v8/upstream/v8/src/d8.js +0 -2798
  348. data/ext/v8/upstream/v8/src/data-flow.cc +0 -545
  349. data/ext/v8/upstream/v8/src/data-flow.h +0 -379
  350. data/ext/v8/upstream/v8/src/date.js +0 -1103
  351. data/ext/v8/upstream/v8/src/dateparser-inl.h +0 -125
  352. data/ext/v8/upstream/v8/src/dateparser.cc +0 -178
  353. data/ext/v8/upstream/v8/src/dateparser.h +0 -265
  354. data/ext/v8/upstream/v8/src/debug-agent.cc +0 -447
  355. data/ext/v8/upstream/v8/src/debug-agent.h +0 -129
  356. data/ext/v8/upstream/v8/src/debug-debugger.js +0 -2569
  357. data/ext/v8/upstream/v8/src/debug.cc +0 -3188
  358. data/ext/v8/upstream/v8/src/debug.h +0 -1055
  359. data/ext/v8/upstream/v8/src/deoptimizer.cc +0 -1296
  360. data/ext/v8/upstream/v8/src/deoptimizer.h +0 -629
  361. data/ext/v8/upstream/v8/src/disasm.h +0 -80
  362. data/ext/v8/upstream/v8/src/disassembler.cc +0 -339
  363. data/ext/v8/upstream/v8/src/disassembler.h +0 -56
  364. data/ext/v8/upstream/v8/src/diy-fp.cc +0 -58
  365. data/ext/v8/upstream/v8/src/diy-fp.h +0 -117
  366. data/ext/v8/upstream/v8/src/double.h +0 -238
  367. data/ext/v8/upstream/v8/src/dtoa.cc +0 -103
  368. data/ext/v8/upstream/v8/src/dtoa.h +0 -85
  369. data/ext/v8/upstream/v8/src/execution.cc +0 -791
  370. data/ext/v8/upstream/v8/src/execution.h +0 -291
  371. data/ext/v8/upstream/v8/src/extensions/experimental/break-iterator.cc +0 -250
  372. data/ext/v8/upstream/v8/src/extensions/experimental/break-iterator.h +0 -89
  373. data/ext/v8/upstream/v8/src/extensions/experimental/experimental.gyp +0 -55
  374. data/ext/v8/upstream/v8/src/extensions/experimental/i18n-extension.cc +0 -284
  375. data/ext/v8/upstream/v8/src/extensions/experimental/i18n-extension.h +0 -64
  376. data/ext/v8/upstream/v8/src/extensions/externalize-string-extension.cc +0 -141
  377. data/ext/v8/upstream/v8/src/extensions/externalize-string-extension.h +0 -50
  378. data/ext/v8/upstream/v8/src/extensions/gc-extension.cc +0 -58
  379. data/ext/v8/upstream/v8/src/extensions/gc-extension.h +0 -49
  380. data/ext/v8/upstream/v8/src/factory.cc +0 -1194
  381. data/ext/v8/upstream/v8/src/factory.h +0 -436
  382. data/ext/v8/upstream/v8/src/fast-dtoa.cc +0 -736
  383. data/ext/v8/upstream/v8/src/fast-dtoa.h +0 -83
  384. data/ext/v8/upstream/v8/src/fixed-dtoa.cc +0 -405
  385. data/ext/v8/upstream/v8/src/fixed-dtoa.h +0 -55
  386. data/ext/v8/upstream/v8/src/flag-definitions.h +0 -556
  387. data/ext/v8/upstream/v8/src/flags.cc +0 -551
  388. data/ext/v8/upstream/v8/src/flags.h +0 -79
  389. data/ext/v8/upstream/v8/src/frame-element.cc +0 -37
  390. data/ext/v8/upstream/v8/src/frame-element.h +0 -269
  391. data/ext/v8/upstream/v8/src/frames-inl.h +0 -236
  392. data/ext/v8/upstream/v8/src/frames.cc +0 -1273
  393. data/ext/v8/upstream/v8/src/frames.h +0 -854
  394. data/ext/v8/upstream/v8/src/full-codegen.cc +0 -1385
  395. data/ext/v8/upstream/v8/src/full-codegen.h +0 -753
  396. data/ext/v8/upstream/v8/src/func-name-inferrer.cc +0 -91
  397. data/ext/v8/upstream/v8/src/func-name-inferrer.h +0 -111
  398. data/ext/v8/upstream/v8/src/gdb-jit.cc +0 -1548
  399. data/ext/v8/upstream/v8/src/gdb-jit.h +0 -138
  400. data/ext/v8/upstream/v8/src/global-handles.cc +0 -596
  401. data/ext/v8/upstream/v8/src/global-handles.h +0 -239
  402. data/ext/v8/upstream/v8/src/globals.h +0 -325
  403. data/ext/v8/upstream/v8/src/handles-inl.h +0 -177
  404. data/ext/v8/upstream/v8/src/handles.cc +0 -965
  405. data/ext/v8/upstream/v8/src/handles.h +0 -372
  406. data/ext/v8/upstream/v8/src/hashmap.cc +0 -230
  407. data/ext/v8/upstream/v8/src/hashmap.h +0 -121
  408. data/ext/v8/upstream/v8/src/heap-inl.h +0 -703
  409. data/ext/v8/upstream/v8/src/heap-profiler.cc +0 -1173
  410. data/ext/v8/upstream/v8/src/heap-profiler.h +0 -396
  411. data/ext/v8/upstream/v8/src/heap.cc +0 -5856
  412. data/ext/v8/upstream/v8/src/heap.h +0 -2264
  413. data/ext/v8/upstream/v8/src/hydrogen-instructions.cc +0 -1639
  414. data/ext/v8/upstream/v8/src/hydrogen-instructions.h +0 -3657
  415. data/ext/v8/upstream/v8/src/hydrogen.cc +0 -6011
  416. data/ext/v8/upstream/v8/src/hydrogen.h +0 -1137
  417. data/ext/v8/upstream/v8/src/ia32/assembler-ia32-inl.h +0 -430
  418. data/ext/v8/upstream/v8/src/ia32/assembler-ia32.cc +0 -2846
  419. data/ext/v8/upstream/v8/src/ia32/assembler-ia32.h +0 -1159
  420. data/ext/v8/upstream/v8/src/ia32/builtins-ia32.cc +0 -1596
  421. data/ext/v8/upstream/v8/src/ia32/code-stubs-ia32.cc +0 -6549
  422. data/ext/v8/upstream/v8/src/ia32/code-stubs-ia32.h +0 -495
  423. data/ext/v8/upstream/v8/src/ia32/codegen-ia32-inl.h +0 -46
  424. data/ext/v8/upstream/v8/src/ia32/codegen-ia32.cc +0 -10385
  425. data/ext/v8/upstream/v8/src/ia32/codegen-ia32.h +0 -801
  426. data/ext/v8/upstream/v8/src/ia32/cpu-ia32.cc +0 -88
  427. data/ext/v8/upstream/v8/src/ia32/debug-ia32.cc +0 -312
  428. data/ext/v8/upstream/v8/src/ia32/deoptimizer-ia32.cc +0 -774
  429. data/ext/v8/upstream/v8/src/ia32/disasm-ia32.cc +0 -1620
  430. data/ext/v8/upstream/v8/src/ia32/frames-ia32.cc +0 -45
  431. data/ext/v8/upstream/v8/src/ia32/frames-ia32.h +0 -140
  432. data/ext/v8/upstream/v8/src/ia32/full-codegen-ia32.cc +0 -4357
  433. data/ext/v8/upstream/v8/src/ia32/ic-ia32.cc +0 -1779
  434. data/ext/v8/upstream/v8/src/ia32/jump-target-ia32.cc +0 -437
  435. data/ext/v8/upstream/v8/src/ia32/lithium-codegen-ia32.cc +0 -4158
  436. data/ext/v8/upstream/v8/src/ia32/lithium-codegen-ia32.h +0 -318
  437. data/ext/v8/upstream/v8/src/ia32/lithium-gap-resolver-ia32.cc +0 -466
  438. data/ext/v8/upstream/v8/src/ia32/lithium-gap-resolver-ia32.h +0 -110
  439. data/ext/v8/upstream/v8/src/ia32/lithium-ia32.cc +0 -2181
  440. data/ext/v8/upstream/v8/src/ia32/lithium-ia32.h +0 -2235
  441. data/ext/v8/upstream/v8/src/ia32/macro-assembler-ia32.cc +0 -2056
  442. data/ext/v8/upstream/v8/src/ia32/macro-assembler-ia32.h +0 -807
  443. data/ext/v8/upstream/v8/src/ia32/regexp-macro-assembler-ia32.cc +0 -1264
  444. data/ext/v8/upstream/v8/src/ia32/regexp-macro-assembler-ia32.h +0 -216
  445. data/ext/v8/upstream/v8/src/ia32/register-allocator-ia32-inl.h +0 -82
  446. data/ext/v8/upstream/v8/src/ia32/register-allocator-ia32.cc +0 -157
  447. data/ext/v8/upstream/v8/src/ia32/register-allocator-ia32.h +0 -43
  448. data/ext/v8/upstream/v8/src/ia32/simulator-ia32.cc +0 -30
  449. data/ext/v8/upstream/v8/src/ia32/simulator-ia32.h +0 -72
  450. data/ext/v8/upstream/v8/src/ia32/stub-cache-ia32.cc +0 -3711
  451. data/ext/v8/upstream/v8/src/ia32/virtual-frame-ia32.cc +0 -1366
  452. data/ext/v8/upstream/v8/src/ia32/virtual-frame-ia32.h +0 -650
  453. data/ext/v8/upstream/v8/src/ic-inl.h +0 -130
  454. data/ext/v8/upstream/v8/src/ic.cc +0 -2389
  455. data/ext/v8/upstream/v8/src/ic.h +0 -675
  456. data/ext/v8/upstream/v8/src/inspector.cc +0 -63
  457. data/ext/v8/upstream/v8/src/inspector.h +0 -62
  458. data/ext/v8/upstream/v8/src/interpreter-irregexp.cc +0 -659
  459. data/ext/v8/upstream/v8/src/interpreter-irregexp.h +0 -49
  460. data/ext/v8/upstream/v8/src/isolate.cc +0 -883
  461. data/ext/v8/upstream/v8/src/isolate.h +0 -1306
  462. data/ext/v8/upstream/v8/src/json.js +0 -342
  463. data/ext/v8/upstream/v8/src/jsregexp.cc +0 -5371
  464. data/ext/v8/upstream/v8/src/jsregexp.h +0 -1483
  465. data/ext/v8/upstream/v8/src/jump-target-heavy-inl.h +0 -51
  466. data/ext/v8/upstream/v8/src/jump-target-heavy.cc +0 -427
  467. data/ext/v8/upstream/v8/src/jump-target-heavy.h +0 -238
  468. data/ext/v8/upstream/v8/src/jump-target-inl.h +0 -48
  469. data/ext/v8/upstream/v8/src/jump-target-light-inl.h +0 -56
  470. data/ext/v8/upstream/v8/src/jump-target-light.cc +0 -111
  471. data/ext/v8/upstream/v8/src/jump-target-light.h +0 -193
  472. data/ext/v8/upstream/v8/src/jump-target.cc +0 -91
  473. data/ext/v8/upstream/v8/src/jump-target.h +0 -90
  474. data/ext/v8/upstream/v8/src/list-inl.h +0 -206
  475. data/ext/v8/upstream/v8/src/list.h +0 -164
  476. data/ext/v8/upstream/v8/src/lithium-allocator-inl.h +0 -142
  477. data/ext/v8/upstream/v8/src/lithium-allocator.cc +0 -2105
  478. data/ext/v8/upstream/v8/src/lithium-allocator.h +0 -630
  479. data/ext/v8/upstream/v8/src/lithium.cc +0 -169
  480. data/ext/v8/upstream/v8/src/lithium.h +0 -592
  481. data/ext/v8/upstream/v8/src/liveedit-debugger.js +0 -1082
  482. data/ext/v8/upstream/v8/src/liveedit.cc +0 -1693
  483. data/ext/v8/upstream/v8/src/liveedit.h +0 -179
  484. data/ext/v8/upstream/v8/src/liveobjectlist-inl.h +0 -126
  485. data/ext/v8/upstream/v8/src/liveobjectlist.cc +0 -2589
  486. data/ext/v8/upstream/v8/src/liveobjectlist.h +0 -322
  487. data/ext/v8/upstream/v8/src/log-inl.h +0 -59
  488. data/ext/v8/upstream/v8/src/log-utils.cc +0 -423
  489. data/ext/v8/upstream/v8/src/log-utils.h +0 -229
  490. data/ext/v8/upstream/v8/src/log.cc +0 -1666
  491. data/ext/v8/upstream/v8/src/log.h +0 -446
  492. data/ext/v8/upstream/v8/src/macro-assembler.h +0 -120
  493. data/ext/v8/upstream/v8/src/macros.py +0 -178
  494. data/ext/v8/upstream/v8/src/mark-compact.cc +0 -3092
  495. data/ext/v8/upstream/v8/src/mark-compact.h +0 -506
  496. data/ext/v8/upstream/v8/src/math.js +0 -264
  497. data/ext/v8/upstream/v8/src/messages.cc +0 -166
  498. data/ext/v8/upstream/v8/src/messages.h +0 -114
  499. data/ext/v8/upstream/v8/src/messages.js +0 -1090
  500. data/ext/v8/upstream/v8/src/mips/assembler-mips-inl.h +0 -335
  501. data/ext/v8/upstream/v8/src/mips/assembler-mips.cc +0 -2093
  502. data/ext/v8/upstream/v8/src/mips/assembler-mips.h +0 -1066
  503. data/ext/v8/upstream/v8/src/mips/builtins-mips.cc +0 -148
  504. data/ext/v8/upstream/v8/src/mips/code-stubs-mips.cc +0 -752
  505. data/ext/v8/upstream/v8/src/mips/code-stubs-mips.h +0 -511
  506. data/ext/v8/upstream/v8/src/mips/codegen-mips-inl.h +0 -64
  507. data/ext/v8/upstream/v8/src/mips/codegen-mips.cc +0 -1213
  508. data/ext/v8/upstream/v8/src/mips/codegen-mips.h +0 -633
  509. data/ext/v8/upstream/v8/src/mips/constants-mips.cc +0 -352
  510. data/ext/v8/upstream/v8/src/mips/constants-mips.h +0 -723
  511. data/ext/v8/upstream/v8/src/mips/cpu-mips.cc +0 -90
  512. data/ext/v8/upstream/v8/src/mips/debug-mips.cc +0 -155
  513. data/ext/v8/upstream/v8/src/mips/deoptimizer-mips.cc +0 -91
  514. data/ext/v8/upstream/v8/src/mips/disasm-mips.cc +0 -1023
  515. data/ext/v8/upstream/v8/src/mips/frames-mips.cc +0 -48
  516. data/ext/v8/upstream/v8/src/mips/frames-mips.h +0 -179
  517. data/ext/v8/upstream/v8/src/mips/full-codegen-mips.cc +0 -727
  518. data/ext/v8/upstream/v8/src/mips/ic-mips.cc +0 -244
  519. data/ext/v8/upstream/v8/src/mips/jump-target-mips.cc +0 -80
  520. data/ext/v8/upstream/v8/src/mips/lithium-codegen-mips.h +0 -65
  521. data/ext/v8/upstream/v8/src/mips/lithium-mips.h +0 -304
  522. data/ext/v8/upstream/v8/src/mips/macro-assembler-mips.cc +0 -3327
  523. data/ext/v8/upstream/v8/src/mips/macro-assembler-mips.h +0 -1058
  524. data/ext/v8/upstream/v8/src/mips/regexp-macro-assembler-mips.cc +0 -478
  525. data/ext/v8/upstream/v8/src/mips/regexp-macro-assembler-mips.h +0 -250
  526. data/ext/v8/upstream/v8/src/mips/register-allocator-mips-inl.h +0 -134
  527. data/ext/v8/upstream/v8/src/mips/register-allocator-mips.cc +0 -63
  528. data/ext/v8/upstream/v8/src/mips/register-allocator-mips.h +0 -47
  529. data/ext/v8/upstream/v8/src/mips/simulator-mips.cc +0 -2438
  530. data/ext/v8/upstream/v8/src/mips/simulator-mips.h +0 -394
  531. data/ext/v8/upstream/v8/src/mips/stub-cache-mips.cc +0 -601
  532. data/ext/v8/upstream/v8/src/mips/virtual-frame-mips-inl.h +0 -58
  533. data/ext/v8/upstream/v8/src/mips/virtual-frame-mips.cc +0 -307
  534. data/ext/v8/upstream/v8/src/mips/virtual-frame-mips.h +0 -530
  535. data/ext/v8/upstream/v8/src/mirror-debugger.js +0 -2381
  536. data/ext/v8/upstream/v8/src/mksnapshot.cc +0 -256
  537. data/ext/v8/upstream/v8/src/natives.h +0 -63
  538. data/ext/v8/upstream/v8/src/objects-debug.cc +0 -722
  539. data/ext/v8/upstream/v8/src/objects-inl.h +0 -4166
  540. data/ext/v8/upstream/v8/src/objects-printer.cc +0 -801
  541. data/ext/v8/upstream/v8/src/objects-visiting.cc +0 -142
  542. data/ext/v8/upstream/v8/src/objects-visiting.h +0 -422
  543. data/ext/v8/upstream/v8/src/objects.cc +0 -10296
  544. data/ext/v8/upstream/v8/src/objects.h +0 -6662
  545. data/ext/v8/upstream/v8/src/parser.cc +0 -5168
  546. data/ext/v8/upstream/v8/src/parser.h +0 -823
  547. data/ext/v8/upstream/v8/src/platform-cygwin.cc +0 -811
  548. data/ext/v8/upstream/v8/src/platform-freebsd.cc +0 -854
  549. data/ext/v8/upstream/v8/src/platform-linux.cc +0 -1120
  550. data/ext/v8/upstream/v8/src/platform-macos.cc +0 -865
  551. data/ext/v8/upstream/v8/src/platform-nullos.cc +0 -504
  552. data/ext/v8/upstream/v8/src/platform-openbsd.cc +0 -672
  553. data/ext/v8/upstream/v8/src/platform-posix.cc +0 -424
  554. data/ext/v8/upstream/v8/src/platform-solaris.cc +0 -796
  555. data/ext/v8/upstream/v8/src/platform-tls-mac.h +0 -62
  556. data/ext/v8/upstream/v8/src/platform-tls-win32.h +0 -62
  557. data/ext/v8/upstream/v8/src/platform-tls.h +0 -50
  558. data/ext/v8/upstream/v8/src/platform-win32.cc +0 -2072
  559. data/ext/v8/upstream/v8/src/platform.h +0 -693
  560. data/ext/v8/upstream/v8/src/preparse-data.cc +0 -185
  561. data/ext/v8/upstream/v8/src/preparse-data.h +0 -249
  562. data/ext/v8/upstream/v8/src/preparser-api.cc +0 -219
  563. data/ext/v8/upstream/v8/src/preparser.cc +0 -1205
  564. data/ext/v8/upstream/v8/src/preparser.h +0 -278
  565. data/ext/v8/upstream/v8/src/prettyprinter.cc +0 -1530
  566. data/ext/v8/upstream/v8/src/prettyprinter.h +0 -223
  567. data/ext/v8/upstream/v8/src/profile-generator-inl.h +0 -128
  568. data/ext/v8/upstream/v8/src/profile-generator.cc +0 -3095
  569. data/ext/v8/upstream/v8/src/profile-generator.h +0 -1125
  570. data/ext/v8/upstream/v8/src/property.cc +0 -102
  571. data/ext/v8/upstream/v8/src/property.h +0 -348
  572. data/ext/v8/upstream/v8/src/regexp-macro-assembler-irregexp-inl.h +0 -78
  573. data/ext/v8/upstream/v8/src/regexp-macro-assembler-irregexp.cc +0 -470
  574. data/ext/v8/upstream/v8/src/regexp-macro-assembler-irregexp.h +0 -142
  575. data/ext/v8/upstream/v8/src/regexp-macro-assembler-tracer.cc +0 -373
  576. data/ext/v8/upstream/v8/src/regexp-macro-assembler-tracer.h +0 -104
  577. data/ext/v8/upstream/v8/src/regexp-macro-assembler.cc +0 -266
  578. data/ext/v8/upstream/v8/src/regexp-macro-assembler.h +0 -236
  579. data/ext/v8/upstream/v8/src/regexp-stack.cc +0 -111
  580. data/ext/v8/upstream/v8/src/regexp-stack.h +0 -147
  581. data/ext/v8/upstream/v8/src/regexp.js +0 -483
  582. data/ext/v8/upstream/v8/src/register-allocator-inl.h +0 -141
  583. data/ext/v8/upstream/v8/src/register-allocator.cc +0 -98
  584. data/ext/v8/upstream/v8/src/register-allocator.h +0 -310
  585. data/ext/v8/upstream/v8/src/rewriter.cc +0 -1024
  586. data/ext/v8/upstream/v8/src/rewriter.h +0 -59
  587. data/ext/v8/upstream/v8/src/runtime-profiler.cc +0 -478
  588. data/ext/v8/upstream/v8/src/runtime-profiler.h +0 -192
  589. data/ext/v8/upstream/v8/src/runtime.cc +0 -11949
  590. data/ext/v8/upstream/v8/src/runtime.h +0 -643
  591. data/ext/v8/upstream/v8/src/runtime.js +0 -643
  592. data/ext/v8/upstream/v8/src/safepoint-table.cc +0 -256
  593. data/ext/v8/upstream/v8/src/safepoint-table.h +0 -269
  594. data/ext/v8/upstream/v8/src/scanner-base.cc +0 -964
  595. data/ext/v8/upstream/v8/src/scanner-base.h +0 -664
  596. data/ext/v8/upstream/v8/src/scanner.cc +0 -584
  597. data/ext/v8/upstream/v8/src/scanner.h +0 -196
  598. data/ext/v8/upstream/v8/src/scopeinfo.cc +0 -631
  599. data/ext/v8/upstream/v8/src/scopeinfo.h +0 -249
  600. data/ext/v8/upstream/v8/src/scopes.cc +0 -1093
  601. data/ext/v8/upstream/v8/src/scopes.h +0 -508
  602. data/ext/v8/upstream/v8/src/serialize.cc +0 -1574
  603. data/ext/v8/upstream/v8/src/serialize.h +0 -589
  604. data/ext/v8/upstream/v8/src/shell.h +0 -55
  605. data/ext/v8/upstream/v8/src/simulator.h +0 -43
  606. data/ext/v8/upstream/v8/src/small-pointer-list.h +0 -163
  607. data/ext/v8/upstream/v8/src/smart-pointer.h +0 -109
  608. data/ext/v8/upstream/v8/src/snapshot-common.cc +0 -82
  609. data/ext/v8/upstream/v8/src/snapshot-empty.cc +0 -50
  610. data/ext/v8/upstream/v8/src/snapshot.h +0 -73
  611. data/ext/v8/upstream/v8/src/spaces-inl.h +0 -529
  612. data/ext/v8/upstream/v8/src/spaces.cc +0 -3147
  613. data/ext/v8/upstream/v8/src/spaces.h +0 -2368
  614. data/ext/v8/upstream/v8/src/splay-tree-inl.h +0 -310
  615. data/ext/v8/upstream/v8/src/splay-tree.h +0 -203
  616. data/ext/v8/upstream/v8/src/string-search.cc +0 -41
  617. data/ext/v8/upstream/v8/src/string-search.h +0 -568
  618. data/ext/v8/upstream/v8/src/string-stream.cc +0 -592
  619. data/ext/v8/upstream/v8/src/string-stream.h +0 -191
  620. data/ext/v8/upstream/v8/src/string.js +0 -915
  621. data/ext/v8/upstream/v8/src/strtod.cc +0 -440
  622. data/ext/v8/upstream/v8/src/strtod.h +0 -40
  623. data/ext/v8/upstream/v8/src/stub-cache.cc +0 -1940
  624. data/ext/v8/upstream/v8/src/stub-cache.h +0 -866
  625. data/ext/v8/upstream/v8/src/third_party/valgrind/valgrind.h +0 -3925
  626. data/ext/v8/upstream/v8/src/token.cc +0 -63
  627. data/ext/v8/upstream/v8/src/token.h +0 -288
  628. data/ext/v8/upstream/v8/src/top.cc +0 -983
  629. data/ext/v8/upstream/v8/src/type-info.cc +0 -472
  630. data/ext/v8/upstream/v8/src/type-info.h +0 -290
  631. data/ext/v8/upstream/v8/src/unbound-queue-inl.h +0 -95
  632. data/ext/v8/upstream/v8/src/unbound-queue.h +0 -67
  633. data/ext/v8/upstream/v8/src/unicode-inl.h +0 -238
  634. data/ext/v8/upstream/v8/src/unicode.cc +0 -1624
  635. data/ext/v8/upstream/v8/src/unicode.h +0 -280
  636. data/ext/v8/upstream/v8/src/uri.js +0 -402
  637. data/ext/v8/upstream/v8/src/utils.cc +0 -371
  638. data/ext/v8/upstream/v8/src/utils.h +0 -796
  639. data/ext/v8/upstream/v8/src/v8-counters.cc +0 -62
  640. data/ext/v8/upstream/v8/src/v8-counters.h +0 -311
  641. data/ext/v8/upstream/v8/src/v8.cc +0 -215
  642. data/ext/v8/upstream/v8/src/v8.h +0 -130
  643. data/ext/v8/upstream/v8/src/v8checks.h +0 -64
  644. data/ext/v8/upstream/v8/src/v8dll-main.cc +0 -39
  645. data/ext/v8/upstream/v8/src/v8globals.h +0 -486
  646. data/ext/v8/upstream/v8/src/v8memory.h +0 -82
  647. data/ext/v8/upstream/v8/src/v8natives.js +0 -1293
  648. data/ext/v8/upstream/v8/src/v8preparserdll-main.cc +0 -39
  649. data/ext/v8/upstream/v8/src/v8threads.cc +0 -453
  650. data/ext/v8/upstream/v8/src/v8threads.h +0 -164
  651. data/ext/v8/upstream/v8/src/v8utils.h +0 -317
  652. data/ext/v8/upstream/v8/src/variables.cc +0 -132
  653. data/ext/v8/upstream/v8/src/variables.h +0 -212
  654. data/ext/v8/upstream/v8/src/version.cc +0 -116
  655. data/ext/v8/upstream/v8/src/version.h +0 -68
  656. data/ext/v8/upstream/v8/src/virtual-frame-heavy-inl.h +0 -190
  657. data/ext/v8/upstream/v8/src/virtual-frame-heavy.cc +0 -312
  658. data/ext/v8/upstream/v8/src/virtual-frame-inl.h +0 -39
  659. data/ext/v8/upstream/v8/src/virtual-frame-light-inl.h +0 -171
  660. data/ext/v8/upstream/v8/src/virtual-frame-light.cc +0 -52
  661. data/ext/v8/upstream/v8/src/virtual-frame.cc +0 -49
  662. data/ext/v8/upstream/v8/src/virtual-frame.h +0 -59
  663. data/ext/v8/upstream/v8/src/vm-state-inl.h +0 -138
  664. data/ext/v8/upstream/v8/src/vm-state.h +0 -70
  665. data/ext/v8/upstream/v8/src/win32-headers.h +0 -96
  666. data/ext/v8/upstream/v8/src/x64/assembler-x64-inl.h +0 -456
  667. data/ext/v8/upstream/v8/src/x64/assembler-x64.cc +0 -2954
  668. data/ext/v8/upstream/v8/src/x64/assembler-x64.h +0 -1630
  669. data/ext/v8/upstream/v8/src/x64/builtins-x64.cc +0 -1493
  670. data/ext/v8/upstream/v8/src/x64/code-stubs-x64.cc +0 -5132
  671. data/ext/v8/upstream/v8/src/x64/code-stubs-x64.h +0 -477
  672. data/ext/v8/upstream/v8/src/x64/codegen-x64-inl.h +0 -46
  673. data/ext/v8/upstream/v8/src/x64/codegen-x64.cc +0 -8843
  674. data/ext/v8/upstream/v8/src/x64/codegen-x64.h +0 -753
  675. data/ext/v8/upstream/v8/src/x64/cpu-x64.cc +0 -88
  676. data/ext/v8/upstream/v8/src/x64/debug-x64.cc +0 -318
  677. data/ext/v8/upstream/v8/src/x64/deoptimizer-x64.cc +0 -815
  678. data/ext/v8/upstream/v8/src/x64/disasm-x64.cc +0 -1752
  679. data/ext/v8/upstream/v8/src/x64/frames-x64.cc +0 -45
  680. data/ext/v8/upstream/v8/src/x64/frames-x64.h +0 -130
  681. data/ext/v8/upstream/v8/src/x64/full-codegen-x64.cc +0 -4339
  682. data/ext/v8/upstream/v8/src/x64/ic-x64.cc +0 -1752
  683. data/ext/v8/upstream/v8/src/x64/jump-target-x64.cc +0 -437
  684. data/ext/v8/upstream/v8/src/x64/lithium-codegen-x64.cc +0 -3970
  685. data/ext/v8/upstream/v8/src/x64/lithium-codegen-x64.h +0 -318
  686. data/ext/v8/upstream/v8/src/x64/lithium-gap-resolver-x64.cc +0 -320
  687. data/ext/v8/upstream/v8/src/x64/lithium-gap-resolver-x64.h +0 -74
  688. data/ext/v8/upstream/v8/src/x64/lithium-x64.cc +0 -2115
  689. data/ext/v8/upstream/v8/src/x64/lithium-x64.h +0 -2161
  690. data/ext/v8/upstream/v8/src/x64/macro-assembler-x64.cc +0 -2911
  691. data/ext/v8/upstream/v8/src/x64/macro-assembler-x64.h +0 -1984
  692. data/ext/v8/upstream/v8/src/x64/regexp-macro-assembler-x64.cc +0 -1398
  693. data/ext/v8/upstream/v8/src/x64/regexp-macro-assembler-x64.h +0 -282
  694. data/ext/v8/upstream/v8/src/x64/register-allocator-x64-inl.h +0 -87
  695. data/ext/v8/upstream/v8/src/x64/register-allocator-x64.cc +0 -95
  696. data/ext/v8/upstream/v8/src/x64/register-allocator-x64.h +0 -43
  697. data/ext/v8/upstream/v8/src/x64/simulator-x64.cc +0 -27
  698. data/ext/v8/upstream/v8/src/x64/simulator-x64.h +0 -71
  699. data/ext/v8/upstream/v8/src/x64/stub-cache-x64.cc +0 -3460
  700. data/ext/v8/upstream/v8/src/x64/virtual-frame-x64.cc +0 -1296
  701. data/ext/v8/upstream/v8/src/x64/virtual-frame-x64.h +0 -597
  702. data/ext/v8/upstream/v8/src/zone-inl.h +0 -129
  703. data/ext/v8/upstream/v8/src/zone.cc +0 -196
  704. data/ext/v8/upstream/v8/src/zone.h +0 -236
  705. data/ext/v8/upstream/v8/tools/codemap.js +0 -265
  706. data/ext/v8/upstream/v8/tools/consarray.js +0 -93
  707. data/ext/v8/upstream/v8/tools/csvparser.js +0 -78
  708. data/ext/v8/upstream/v8/tools/disasm.py +0 -92
  709. data/ext/v8/upstream/v8/tools/freebsd-tick-processor +0 -10
  710. data/ext/v8/upstream/v8/tools/gc-nvp-trace-processor.py +0 -328
  711. data/ext/v8/upstream/v8/tools/generate-ten-powers.scm +0 -286
  712. data/ext/v8/upstream/v8/tools/grokdump.py +0 -840
  713. data/ext/v8/upstream/v8/tools/gyp/v8.gyp +0 -844
  714. data/ext/v8/upstream/v8/tools/js2c.py +0 -380
  715. data/ext/v8/upstream/v8/tools/jsmin.py +0 -280
  716. data/ext/v8/upstream/v8/tools/linux-tick-processor +0 -35
  717. data/ext/v8/upstream/v8/tools/ll_prof.py +0 -919
  718. data/ext/v8/upstream/v8/tools/logreader.js +0 -185
  719. data/ext/v8/upstream/v8/tools/mac-nm +0 -18
  720. data/ext/v8/upstream/v8/tools/mac-tick-processor +0 -6
  721. data/ext/v8/upstream/v8/tools/oom_dump/README +0 -31
  722. data/ext/v8/upstream/v8/tools/oom_dump/SConstruct +0 -42
  723. data/ext/v8/upstream/v8/tools/oom_dump/oom_dump.cc +0 -288
  724. data/ext/v8/upstream/v8/tools/presubmit.py +0 -305
  725. data/ext/v8/upstream/v8/tools/process-heap-prof.py +0 -120
  726. data/ext/v8/upstream/v8/tools/profile.js +0 -751
  727. data/ext/v8/upstream/v8/tools/profile_view.js +0 -219
  728. data/ext/v8/upstream/v8/tools/run-valgrind.py +0 -77
  729. data/ext/v8/upstream/v8/tools/splaytree.js +0 -316
  730. data/ext/v8/upstream/v8/tools/stats-viewer.py +0 -468
  731. data/ext/v8/upstream/v8/tools/test.py +0 -1490
  732. data/ext/v8/upstream/v8/tools/tickprocessor-driver.js +0 -59
  733. data/ext/v8/upstream/v8/tools/tickprocessor.js +0 -877
  734. data/ext/v8/upstream/v8/tools/utils.py +0 -96
  735. data/ext/v8/upstream/v8/tools/visual_studio/README.txt +0 -70
  736. data/ext/v8/upstream/v8/tools/visual_studio/arm.vsprops +0 -14
  737. data/ext/v8/upstream/v8/tools/visual_studio/common.vsprops +0 -34
  738. data/ext/v8/upstream/v8/tools/visual_studio/d8.vcproj +0 -193
  739. data/ext/v8/upstream/v8/tools/visual_studio/d8_arm.vcproj +0 -193
  740. data/ext/v8/upstream/v8/tools/visual_studio/d8_x64.vcproj +0 -209
  741. data/ext/v8/upstream/v8/tools/visual_studio/d8js2c.cmd +0 -6
  742. data/ext/v8/upstream/v8/tools/visual_studio/debug.vsprops +0 -17
  743. data/ext/v8/upstream/v8/tools/visual_studio/ia32.vsprops +0 -17
  744. data/ext/v8/upstream/v8/tools/visual_studio/js2c.cmd +0 -6
  745. data/ext/v8/upstream/v8/tools/visual_studio/release.vsprops +0 -24
  746. data/ext/v8/upstream/v8/tools/visual_studio/v8.sln +0 -101
  747. data/ext/v8/upstream/v8/tools/visual_studio/v8.vcproj +0 -227
  748. data/ext/v8/upstream/v8/tools/visual_studio/v8_arm.sln +0 -74
  749. data/ext/v8/upstream/v8/tools/visual_studio/v8_arm.vcproj +0 -227
  750. data/ext/v8/upstream/v8/tools/visual_studio/v8_base.vcproj +0 -1308
  751. data/ext/v8/upstream/v8/tools/visual_studio/v8_base_arm.vcproj +0 -1238
  752. data/ext/v8/upstream/v8/tools/visual_studio/v8_base_x64.vcproj +0 -1300
  753. data/ext/v8/upstream/v8/tools/visual_studio/v8_cctest.vcproj +0 -265
  754. data/ext/v8/upstream/v8/tools/visual_studio/v8_cctest_arm.vcproj +0 -249
  755. data/ext/v8/upstream/v8/tools/visual_studio/v8_cctest_x64.vcproj +0 -257
  756. data/ext/v8/upstream/v8/tools/visual_studio/v8_mksnapshot.vcproj +0 -145
  757. data/ext/v8/upstream/v8/tools/visual_studio/v8_mksnapshot_x64.vcproj +0 -145
  758. data/ext/v8/upstream/v8/tools/visual_studio/v8_process_sample.vcproj +0 -145
  759. data/ext/v8/upstream/v8/tools/visual_studio/v8_process_sample_arm.vcproj +0 -145
  760. data/ext/v8/upstream/v8/tools/visual_studio/v8_process_sample_x64.vcproj +0 -161
  761. data/ext/v8/upstream/v8/tools/visual_studio/v8_shell_sample.vcproj +0 -147
  762. data/ext/v8/upstream/v8/tools/visual_studio/v8_shell_sample_arm.vcproj +0 -147
  763. data/ext/v8/upstream/v8/tools/visual_studio/v8_shell_sample_x64.vcproj +0 -163
  764. data/ext/v8/upstream/v8/tools/visual_studio/v8_snapshot.vcproj +0 -142
  765. data/ext/v8/upstream/v8/tools/visual_studio/v8_snapshot_cc.vcproj +0 -92
  766. data/ext/v8/upstream/v8/tools/visual_studio/v8_snapshot_cc_x64.vcproj +0 -92
  767. data/ext/v8/upstream/v8/tools/visual_studio/v8_snapshot_x64.vcproj +0 -142
  768. data/ext/v8/upstream/v8/tools/visual_studio/v8_x64.sln +0 -101
  769. data/ext/v8/upstream/v8/tools/visual_studio/v8_x64.vcproj +0 -227
  770. data/ext/v8/upstream/v8/tools/visual_studio/x64.vsprops +0 -18
  771. data/ext/v8/upstream/v8/tools/windows-tick-processor.bat +0 -30
@@ -1,1984 +0,0 @@
1
- // Copyright 2011 the V8 project authors. All rights reserved.
2
- // Redistribution and use in source and binary forms, with or without
3
- // modification, are permitted provided that the following conditions are
4
- // met:
5
- //
6
- // * Redistributions of source code must retain the above copyright
7
- // notice, this list of conditions and the following disclaimer.
8
- // * Redistributions in binary form must reproduce the above
9
- // copyright notice, this list of conditions and the following
10
- // disclaimer in the documentation and/or other materials provided
11
- // with the distribution.
12
- // * Neither the name of Google Inc. nor the names of its
13
- // contributors may be used to endorse or promote products derived
14
- // from this software without specific prior written permission.
15
- //
16
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
-
28
- #ifndef V8_X64_MACRO_ASSEMBLER_X64_H_
29
- #define V8_X64_MACRO_ASSEMBLER_X64_H_
30
-
31
- #include "assembler.h"
32
-
33
- namespace v8 {
34
- namespace internal {
35
-
36
- // Flags used for the AllocateInNewSpace functions.
37
- enum AllocationFlags {
38
- // No special flags.
39
- NO_ALLOCATION_FLAGS = 0,
40
- // Return the pointer to the allocated already tagged as a heap object.
41
- TAG_OBJECT = 1 << 0,
42
- // The content of the result register already contains the allocation top in
43
- // new space.
44
- RESULT_CONTAINS_TOP = 1 << 1
45
- };
46
-
47
- // Default scratch register used by MacroAssembler (and other code that needs
48
- // a spare register). The register isn't callee save, and not used by the
49
- // function calling convention.
50
- static const Register kScratchRegister = { 10 }; // r10.
51
- static const Register kSmiConstantRegister = { 12 }; // r12 (callee save).
52
- static const Register kRootRegister = { 13 }; // r13 (callee save).
53
- // Value of smi in kSmiConstantRegister.
54
- static const int kSmiConstantRegisterValue = 1;
55
- // Actual value of root register is offset from the root array's start
56
- // to take advantage of negitive 8-bit displacement values.
57
- static const int kRootRegisterBias = 128;
58
-
59
- // Convenience for platform-independent signatures.
60
- typedef Operand MemOperand;
61
-
62
- // Forward declaration.
63
- class JumpTarget;
64
- class CallWrapper;
65
-
66
- struct SmiIndex {
67
- SmiIndex(Register index_register, ScaleFactor scale)
68
- : reg(index_register),
69
- scale(scale) {}
70
- Register reg;
71
- ScaleFactor scale;
72
- };
73
-
74
- // MacroAssembler implements a collection of frequently used macros.
75
- class MacroAssembler: public Assembler {
76
- public:
77
- // The isolate parameter can be NULL if the macro assembler should
78
- // not use isolate-dependent functionality. In this case, it's the
79
- // responsibility of the caller to never invoke such function on the
80
- // macro assembler.
81
- MacroAssembler(Isolate* isolate, void* buffer, int size);
82
-
83
- // Prevent the use of the RootArray during the lifetime of this
84
- // scope object.
85
- class NoRootArrayScope BASE_EMBEDDED {
86
- public:
87
- explicit NoRootArrayScope(MacroAssembler* assembler)
88
- : variable_(&assembler->root_array_available_),
89
- old_value_(assembler->root_array_available_) {
90
- assembler->root_array_available_ = false;
91
- }
92
- ~NoRootArrayScope() {
93
- *variable_ = old_value_;
94
- }
95
- private:
96
- bool* variable_;
97
- bool old_value_;
98
- };
99
-
100
- // Operand pointing to an external reference.
101
- // May emit code to set up the scratch register. The operand is
102
- // only guaranteed to be correct as long as the scratch register
103
- // isn't changed.
104
- // If the operand is used more than once, use a scratch register
105
- // that is guaranteed not to be clobbered.
106
- Operand ExternalOperand(ExternalReference reference,
107
- Register scratch = kScratchRegister);
108
- // Loads and stores the value of an external reference.
109
- // Special case code for load and store to take advantage of
110
- // load_rax/store_rax if possible/necessary.
111
- // For other operations, just use:
112
- // Operand operand = ExternalOperand(extref);
113
- // operation(operand, ..);
114
- void Load(Register destination, ExternalReference source);
115
- void Store(ExternalReference destination, Register source);
116
- // Loads the address of the external reference into the destination
117
- // register.
118
- void LoadAddress(Register destination, ExternalReference source);
119
- // Returns the size of the code generated by LoadAddress.
120
- // Used by CallSize(ExternalReference) to find the size of a call.
121
- int LoadAddressSize(ExternalReference source);
122
-
123
- // Operations on roots in the root-array.
124
- void LoadRoot(Register destination, Heap::RootListIndex index);
125
- void StoreRoot(Register source, Heap::RootListIndex index);
126
- // Load a root value where the index (or part of it) is variable.
127
- // The variable_offset register is added to the fixed_offset value
128
- // to get the index into the root-array.
129
- void LoadRootIndexed(Register destination,
130
- Register variable_offset,
131
- int fixed_offset);
132
- void CompareRoot(Register with, Heap::RootListIndex index);
133
- void CompareRoot(const Operand& with, Heap::RootListIndex index);
134
- void PushRoot(Heap::RootListIndex index);
135
-
136
- // ---------------------------------------------------------------------------
137
- // GC Support
138
-
139
- // For page containing |object| mark region covering |addr| dirty.
140
- // RecordWriteHelper only works if the object is not in new
141
- // space.
142
- void RecordWriteHelper(Register object,
143
- Register addr,
144
- Register scratch);
145
-
146
- // Check if object is in new space. The condition cc can be equal or
147
- // not_equal. If it is equal a jump will be done if the object is on new
148
- // space. The register scratch can be object itself, but it will be clobbered.
149
- template <typename LabelType>
150
- void InNewSpace(Register object,
151
- Register scratch,
152
- Condition cc,
153
- LabelType* branch);
154
-
155
- // For page containing |object| mark region covering [object+offset]
156
- // dirty. |object| is the object being stored into, |value| is the
157
- // object being stored. If |offset| is zero, then the |scratch|
158
- // register contains the array index into the elements array
159
- // represented as an untagged 32-bit integer. All registers are
160
- // clobbered by the operation. RecordWrite filters out smis so it
161
- // does not update the write barrier if the value is a smi.
162
- void RecordWrite(Register object,
163
- int offset,
164
- Register value,
165
- Register scratch);
166
-
167
- // For page containing |object| mark region covering [address]
168
- // dirty. |object| is the object being stored into, |value| is the
169
- // object being stored. All registers are clobbered by the
170
- // operation. RecordWrite filters out smis so it does not update
171
- // the write barrier if the value is a smi.
172
- void RecordWrite(Register object,
173
- Register address,
174
- Register value);
175
-
176
- // For page containing |object| mark region covering [object+offset] dirty.
177
- // The value is known to not be a smi.
178
- // object is the object being stored into, value is the object being stored.
179
- // If offset is zero, then the scratch register contains the array index into
180
- // the elements array represented as an untagged 32-bit integer.
181
- // All registers are clobbered by the operation.
182
- void RecordWriteNonSmi(Register object,
183
- int offset,
184
- Register value,
185
- Register scratch);
186
-
187
- #ifdef ENABLE_DEBUGGER_SUPPORT
188
- // ---------------------------------------------------------------------------
189
- // Debugger Support
190
-
191
- void DebugBreak();
192
- #endif
193
-
194
- // ---------------------------------------------------------------------------
195
- // Activation frames
196
-
197
- void EnterInternalFrame() { EnterFrame(StackFrame::INTERNAL); }
198
- void LeaveInternalFrame() { LeaveFrame(StackFrame::INTERNAL); }
199
-
200
- void EnterConstructFrame() { EnterFrame(StackFrame::CONSTRUCT); }
201
- void LeaveConstructFrame() { LeaveFrame(StackFrame::CONSTRUCT); }
202
-
203
- // Enter specific kind of exit frame; either in normal or
204
- // debug mode. Expects the number of arguments in register rax and
205
- // sets up the number of arguments in register rdi and the pointer
206
- // to the first argument in register rsi.
207
- //
208
- // Allocates arg_stack_space * kPointerSize memory (not GCed) on the stack
209
- // accessible via StackSpaceOperand.
210
- void EnterExitFrame(int arg_stack_space = 0, bool save_doubles = false);
211
-
212
- // Enter specific kind of exit frame. Allocates arg_stack_space * kPointerSize
213
- // memory (not GCed) on the stack accessible via StackSpaceOperand.
214
- void EnterApiExitFrame(int arg_stack_space);
215
-
216
- // Leave the current exit frame. Expects/provides the return value in
217
- // register rax:rdx (untouched) and the pointer to the first
218
- // argument in register rsi.
219
- void LeaveExitFrame(bool save_doubles = false);
220
-
221
- // Leave the current exit frame. Expects/provides the return value in
222
- // register rax (untouched).
223
- void LeaveApiExitFrame();
224
-
225
- // Push and pop the registers that can hold pointers.
226
- void PushSafepointRegisters() { Pushad(); }
227
- void PopSafepointRegisters() { Popad(); }
228
- // Store the value in register src in the safepoint register stack
229
- // slot for register dst.
230
- void StoreToSafepointRegisterSlot(Register dst, Register src);
231
- void LoadFromSafepointRegisterSlot(Register dst, Register src);
232
-
233
- void InitializeRootRegister() {
234
- ExternalReference roots_address =
235
- ExternalReference::roots_address(isolate());
236
- movq(kRootRegister, roots_address);
237
- addq(kRootRegister, Immediate(kRootRegisterBias));
238
- }
239
-
240
- // ---------------------------------------------------------------------------
241
- // JavaScript invokes
242
-
243
- // Invoke the JavaScript function code by either calling or jumping.
244
- void InvokeCode(Register code,
245
- const ParameterCount& expected,
246
- const ParameterCount& actual,
247
- InvokeFlag flag,
248
- CallWrapper* call_wrapper = NULL);
249
-
250
- void InvokeCode(Handle<Code> code,
251
- const ParameterCount& expected,
252
- const ParameterCount& actual,
253
- RelocInfo::Mode rmode,
254
- InvokeFlag flag,
255
- CallWrapper* call_wrapper = NULL);
256
-
257
- // Invoke the JavaScript function in the given register. Changes the
258
- // current context to the context in the function before invoking.
259
- void InvokeFunction(Register function,
260
- const ParameterCount& actual,
261
- InvokeFlag flag,
262
- CallWrapper* call_wrapper = NULL);
263
-
264
- void InvokeFunction(JSFunction* function,
265
- const ParameterCount& actual,
266
- InvokeFlag flag,
267
- CallWrapper* call_wrapper = NULL);
268
-
269
- // Invoke specified builtin JavaScript function. Adds an entry to
270
- // the unresolved list if the name does not resolve.
271
- void InvokeBuiltin(Builtins::JavaScript id,
272
- InvokeFlag flag,
273
- CallWrapper* call_wrapper = NULL);
274
-
275
- // Store the function for the given builtin in the target register.
276
- void GetBuiltinFunction(Register target, Builtins::JavaScript id);
277
-
278
- // Store the code object for the given builtin in the target register.
279
- void GetBuiltinEntry(Register target, Builtins::JavaScript id);
280
-
281
-
282
- // ---------------------------------------------------------------------------
283
- // Smi tagging, untagging and operations on tagged smis.
284
-
285
- void InitializeSmiConstantRegister() {
286
- movq(kSmiConstantRegister,
287
- reinterpret_cast<uint64_t>(Smi::FromInt(kSmiConstantRegisterValue)),
288
- RelocInfo::NONE);
289
- }
290
-
291
- // Conversions between tagged smi values and non-tagged integer values.
292
-
293
- // Tag an integer value. The result must be known to be a valid smi value.
294
- // Only uses the low 32 bits of the src register. Sets the N and Z flags
295
- // based on the value of the resulting smi.
296
- void Integer32ToSmi(Register dst, Register src);
297
-
298
- // Stores an integer32 value into a memory field that already holds a smi.
299
- void Integer32ToSmiField(const Operand& dst, Register src);
300
-
301
- // Adds constant to src and tags the result as a smi.
302
- // Result must be a valid smi.
303
- void Integer64PlusConstantToSmi(Register dst, Register src, int constant);
304
-
305
- // Convert smi to 32-bit integer. I.e., not sign extended into
306
- // high 32 bits of destination.
307
- void SmiToInteger32(Register dst, Register src);
308
- void SmiToInteger32(Register dst, const Operand& src);
309
-
310
- // Convert smi to 64-bit integer (sign extended if necessary).
311
- void SmiToInteger64(Register dst, Register src);
312
- void SmiToInteger64(Register dst, const Operand& src);
313
-
314
- // Multiply a positive smi's integer value by a power of two.
315
- // Provides result as 64-bit integer value.
316
- void PositiveSmiTimesPowerOfTwoToInteger64(Register dst,
317
- Register src,
318
- int power);
319
-
320
- // Divide a positive smi's integer value by a power of two.
321
- // Provides result as 32-bit integer value.
322
- void PositiveSmiDivPowerOfTwoToInteger32(Register dst,
323
- Register src,
324
- int power);
325
-
326
-
327
- // Simple comparison of smis. Both sides must be known smis to use these,
328
- // otherwise use Cmp.
329
- void SmiCompare(Register smi1, Register smi2);
330
- void SmiCompare(Register dst, Smi* src);
331
- void SmiCompare(Register dst, const Operand& src);
332
- void SmiCompare(const Operand& dst, Register src);
333
- void SmiCompare(const Operand& dst, Smi* src);
334
- // Compare the int32 in src register to the value of the smi stored at dst.
335
- void SmiCompareInteger32(const Operand& dst, Register src);
336
- // Sets sign and zero flags depending on value of smi in register.
337
- void SmiTest(Register src);
338
-
339
- // Functions performing a check on a known or potential smi. Returns
340
- // a condition that is satisfied if the check is successful.
341
-
342
- // Is the value a tagged smi.
343
- Condition CheckSmi(Register src);
344
- Condition CheckSmi(const Operand& src);
345
-
346
- // Is the value a non-negative tagged smi.
347
- Condition CheckNonNegativeSmi(Register src);
348
-
349
- // Are both values tagged smis.
350
- Condition CheckBothSmi(Register first, Register second);
351
-
352
- // Are both values non-negative tagged smis.
353
- Condition CheckBothNonNegativeSmi(Register first, Register second);
354
-
355
- // Are either value a tagged smi.
356
- Condition CheckEitherSmi(Register first,
357
- Register second,
358
- Register scratch = kScratchRegister);
359
-
360
- // Is the value the minimum smi value (since we are using
361
- // two's complement numbers, negating the value is known to yield
362
- // a non-smi value).
363
- Condition CheckIsMinSmi(Register src);
364
-
365
- // Checks whether an 32-bit integer value is a valid for conversion
366
- // to a smi.
367
- Condition CheckInteger32ValidSmiValue(Register src);
368
-
369
- // Checks whether an 32-bit unsigned integer value is a valid for
370
- // conversion to a smi.
371
- Condition CheckUInteger32ValidSmiValue(Register src);
372
-
373
- // Check whether src is a Smi, and set dst to zero if it is a smi,
374
- // and to one if it isn't.
375
- void CheckSmiToIndicator(Register dst, Register src);
376
- void CheckSmiToIndicator(Register dst, const Operand& src);
377
-
378
- // Test-and-jump functions. Typically combines a check function
379
- // above with a conditional jump.
380
-
381
- // Jump if the value cannot be represented by a smi.
382
- template <typename LabelType>
383
- void JumpIfNotValidSmiValue(Register src, LabelType* on_invalid);
384
-
385
- // Jump if the unsigned integer value cannot be represented by a smi.
386
- template <typename LabelType>
387
- void JumpIfUIntNotValidSmiValue(Register src, LabelType* on_invalid);
388
-
389
- // Jump to label if the value is a tagged smi.
390
- template <typename LabelType>
391
- void JumpIfSmi(Register src, LabelType* on_smi);
392
-
393
- // Jump to label if the value is not a tagged smi.
394
- template <typename LabelType>
395
- void JumpIfNotSmi(Register src, LabelType* on_not_smi);
396
-
397
- // Jump to label if the value is not a non-negative tagged smi.
398
- template <typename LabelType>
399
- void JumpUnlessNonNegativeSmi(Register src, LabelType* on_not_smi);
400
-
401
- // Jump to label if the value, which must be a tagged smi, has value equal
402
- // to the constant.
403
- template <typename LabelType>
404
- void JumpIfSmiEqualsConstant(Register src,
405
- Smi* constant,
406
- LabelType* on_equals);
407
-
408
- // Jump if either or both register are not smi values.
409
- template <typename LabelType>
410
- void JumpIfNotBothSmi(Register src1,
411
- Register src2,
412
- LabelType* on_not_both_smi);
413
-
414
- // Jump if either or both register are not non-negative smi values.
415
- template <typename LabelType>
416
- void JumpUnlessBothNonNegativeSmi(Register src1, Register src2,
417
- LabelType* on_not_both_smi);
418
-
419
- // Operations on tagged smi values.
420
-
421
- // Smis represent a subset of integers. The subset is always equivalent to
422
- // a two's complement interpretation of a fixed number of bits.
423
-
424
- // Optimistically adds an integer constant to a supposed smi.
425
- // If the src is not a smi, or the result is not a smi, jump to
426
- // the label.
427
- template <typename LabelType>
428
- void SmiTryAddConstant(Register dst,
429
- Register src,
430
- Smi* constant,
431
- LabelType* on_not_smi_result);
432
-
433
- // Add an integer constant to a tagged smi, giving a tagged smi as result.
434
- // No overflow testing on the result is done.
435
- void SmiAddConstant(Register dst, Register src, Smi* constant);
436
-
437
- // Add an integer constant to a tagged smi, giving a tagged smi as result.
438
- // No overflow testing on the result is done.
439
- void SmiAddConstant(const Operand& dst, Smi* constant);
440
-
441
- // Add an integer constant to a tagged smi, giving a tagged smi as result,
442
- // or jumping to a label if the result cannot be represented by a smi.
443
- template <typename LabelType>
444
- void SmiAddConstant(Register dst,
445
- Register src,
446
- Smi* constant,
447
- LabelType* on_not_smi_result);
448
-
449
- // Subtract an integer constant from a tagged smi, giving a tagged smi as
450
- // result. No testing on the result is done. Sets the N and Z flags
451
- // based on the value of the resulting integer.
452
- void SmiSubConstant(Register dst, Register src, Smi* constant);
453
-
454
- // Subtract an integer constant from a tagged smi, giving a tagged smi as
455
- // result, or jumping to a label if the result cannot be represented by a smi.
456
- template <typename LabelType>
457
- void SmiSubConstant(Register dst,
458
- Register src,
459
- Smi* constant,
460
- LabelType* on_not_smi_result);
461
-
462
- // Negating a smi can give a negative zero or too large positive value.
463
- // NOTICE: This operation jumps on success, not failure!
464
- template <typename LabelType>
465
- void SmiNeg(Register dst,
466
- Register src,
467
- LabelType* on_smi_result);
468
-
469
- // Adds smi values and return the result as a smi.
470
- // If dst is src1, then src1 will be destroyed, even if
471
- // the operation is unsuccessful.
472
- template <typename LabelType>
473
- void SmiAdd(Register dst,
474
- Register src1,
475
- Register src2,
476
- LabelType* on_not_smi_result);
477
- template <typename LabelType>
478
- void SmiAdd(Register dst,
479
- Register src1,
480
- const Operand& src2,
481
- LabelType* on_not_smi_result);
482
-
483
- void SmiAdd(Register dst,
484
- Register src1,
485
- Register src2);
486
-
487
- // Subtracts smi values and return the result as a smi.
488
- // If dst is src1, then src1 will be destroyed, even if
489
- // the operation is unsuccessful.
490
- template <typename LabelType>
491
- void SmiSub(Register dst,
492
- Register src1,
493
- Register src2,
494
- LabelType* on_not_smi_result);
495
-
496
- void SmiSub(Register dst,
497
- Register src1,
498
- Register src2);
499
-
500
- template <typename LabelType>
501
- void SmiSub(Register dst,
502
- Register src1,
503
- const Operand& src2,
504
- LabelType* on_not_smi_result);
505
-
506
- void SmiSub(Register dst,
507
- Register src1,
508
- const Operand& src2);
509
-
510
- // Multiplies smi values and return the result as a smi,
511
- // if possible.
512
- // If dst is src1, then src1 will be destroyed, even if
513
- // the operation is unsuccessful.
514
- template <typename LabelType>
515
- void SmiMul(Register dst,
516
- Register src1,
517
- Register src2,
518
- LabelType* on_not_smi_result);
519
-
520
- // Divides one smi by another and returns the quotient.
521
- // Clobbers rax and rdx registers.
522
- template <typename LabelType>
523
- void SmiDiv(Register dst,
524
- Register src1,
525
- Register src2,
526
- LabelType* on_not_smi_result);
527
-
528
- // Divides one smi by another and returns the remainder.
529
- // Clobbers rax and rdx registers.
530
- template <typename LabelType>
531
- void SmiMod(Register dst,
532
- Register src1,
533
- Register src2,
534
- LabelType* on_not_smi_result);
535
-
536
- // Bitwise operations.
537
- void SmiNot(Register dst, Register src);
538
- void SmiAnd(Register dst, Register src1, Register src2);
539
- void SmiOr(Register dst, Register src1, Register src2);
540
- void SmiXor(Register dst, Register src1, Register src2);
541
- void SmiAndConstant(Register dst, Register src1, Smi* constant);
542
- void SmiOrConstant(Register dst, Register src1, Smi* constant);
543
- void SmiXorConstant(Register dst, Register src1, Smi* constant);
544
-
545
- void SmiShiftLeftConstant(Register dst,
546
- Register src,
547
- int shift_value);
548
- template <typename LabelType>
549
- void SmiShiftLogicalRightConstant(Register dst,
550
- Register src,
551
- int shift_value,
552
- LabelType* on_not_smi_result);
553
- void SmiShiftArithmeticRightConstant(Register dst,
554
- Register src,
555
- int shift_value);
556
-
557
- // Shifts a smi value to the left, and returns the result if that is a smi.
558
- // Uses and clobbers rcx, so dst may not be rcx.
559
- void SmiShiftLeft(Register dst,
560
- Register src1,
561
- Register src2);
562
- // Shifts a smi value to the right, shifting in zero bits at the top, and
563
- // returns the unsigned intepretation of the result if that is a smi.
564
- // Uses and clobbers rcx, so dst may not be rcx.
565
- template <typename LabelType>
566
- void SmiShiftLogicalRight(Register dst,
567
- Register src1,
568
- Register src2,
569
- LabelType* on_not_smi_result);
570
- // Shifts a smi value to the right, sign extending the top, and
571
- // returns the signed intepretation of the result. That will always
572
- // be a valid smi value, since it's numerically smaller than the
573
- // original.
574
- // Uses and clobbers rcx, so dst may not be rcx.
575
- void SmiShiftArithmeticRight(Register dst,
576
- Register src1,
577
- Register src2);
578
-
579
- // Specialized operations
580
-
581
- // Select the non-smi register of two registers where exactly one is a
582
- // smi. If neither are smis, jump to the failure label.
583
- template <typename LabelType>
584
- void SelectNonSmi(Register dst,
585
- Register src1,
586
- Register src2,
587
- LabelType* on_not_smis);
588
-
589
- // Converts, if necessary, a smi to a combination of number and
590
- // multiplier to be used as a scaled index.
591
- // The src register contains a *positive* smi value. The shift is the
592
- // power of two to multiply the index value by (e.g.
593
- // to index by smi-value * kPointerSize, pass the smi and kPointerSizeLog2).
594
- // The returned index register may be either src or dst, depending
595
- // on what is most efficient. If src and dst are different registers,
596
- // src is always unchanged.
597
- SmiIndex SmiToIndex(Register dst, Register src, int shift);
598
-
599
- // Converts a positive smi to a negative index.
600
- SmiIndex SmiToNegativeIndex(Register dst, Register src, int shift);
601
-
602
- // Add the value of a smi in memory to an int32 register.
603
- // Sets flags as a normal add.
604
- void AddSmiField(Register dst, const Operand& src);
605
-
606
- // Basic Smi operations.
607
- void Move(Register dst, Smi* source) {
608
- LoadSmiConstant(dst, source);
609
- }
610
-
611
- void Move(const Operand& dst, Smi* source) {
612
- Register constant = GetSmiConstant(source);
613
- movq(dst, constant);
614
- }
615
-
616
- void Push(Smi* smi);
617
- void Test(const Operand& dst, Smi* source);
618
-
619
- // ---------------------------------------------------------------------------
620
- // String macros.
621
-
622
- // If object is a string, its map is loaded into object_map.
623
- template <typename LabelType>
624
- void JumpIfNotString(Register object,
625
- Register object_map,
626
- LabelType* not_string);
627
-
628
-
629
- template <typename LabelType>
630
- void JumpIfNotBothSequentialAsciiStrings(Register first_object,
631
- Register second_object,
632
- Register scratch1,
633
- Register scratch2,
634
- LabelType* on_not_both_flat_ascii);
635
-
636
- // Check whether the instance type represents a flat ascii string. Jump to the
637
- // label if not. If the instance type can be scratched specify same register
638
- // for both instance type and scratch.
639
- template <typename LabelType>
640
- void JumpIfInstanceTypeIsNotSequentialAscii(
641
- Register instance_type,
642
- Register scratch,
643
- LabelType *on_not_flat_ascii_string);
644
-
645
- template <typename LabelType>
646
- void JumpIfBothInstanceTypesAreNotSequentialAscii(
647
- Register first_object_instance_type,
648
- Register second_object_instance_type,
649
- Register scratch1,
650
- Register scratch2,
651
- LabelType* on_fail);
652
-
653
- // ---------------------------------------------------------------------------
654
- // Macro instructions.
655
-
656
- // Load a register with a long value as efficiently as possible.
657
- void Set(Register dst, int64_t x);
658
- void Set(const Operand& dst, int64_t x);
659
-
660
- // Move if the registers are not identical.
661
- void Move(Register target, Register source);
662
-
663
- // Handle support
664
- void Move(Register dst, Handle<Object> source);
665
- void Move(const Operand& dst, Handle<Object> source);
666
- void Cmp(Register dst, Handle<Object> source);
667
- void Cmp(const Operand& dst, Handle<Object> source);
668
- void Cmp(Register dst, Smi* src);
669
- void Cmp(const Operand& dst, Smi* src);
670
- void Push(Handle<Object> source);
671
-
672
- // Emit code to discard a non-negative number of pointer-sized elements
673
- // from the stack, clobbering only the rsp register.
674
- void Drop(int stack_elements);
675
-
676
- void Call(Label* target) { call(target); }
677
-
678
- // Control Flow
679
- void Jump(Address destination, RelocInfo::Mode rmode);
680
- void Jump(ExternalReference ext);
681
- void Jump(Handle<Code> code_object, RelocInfo::Mode rmode);
682
-
683
- void Call(Address destination, RelocInfo::Mode rmode);
684
- void Call(ExternalReference ext);
685
- void Call(Handle<Code> code_object, RelocInfo::Mode rmode);
686
-
687
- // The size of the code generated for different call instructions.
688
- int CallSize(Address destination, RelocInfo::Mode rmode) {
689
- return kCallInstructionLength;
690
- }
691
- int CallSize(ExternalReference ext);
692
- int CallSize(Handle<Code> code_object) {
693
- // Code calls use 32-bit relative addressing.
694
- return kShortCallInstructionLength;
695
- }
696
- int CallSize(Register target) {
697
- // Opcode: REX_opt FF /2 m64
698
- return (target.high_bit() != 0) ? 3 : 2;
699
- }
700
- int CallSize(const Operand& target) {
701
- // Opcode: REX_opt FF /2 m64
702
- return (target.requires_rex() ? 2 : 1) + target.operand_size();
703
- }
704
-
705
- // Emit call to the code we are currently generating.
706
- void CallSelf() {
707
- Handle<Code> self(reinterpret_cast<Code**>(CodeObject().location()));
708
- Call(self, RelocInfo::CODE_TARGET);
709
- }
710
-
711
- // Non-x64 instructions.
712
- // Push/pop all general purpose registers.
713
- // Does not push rsp/rbp nor any of the assembler's special purpose registers
714
- // (kScratchRegister, kSmiConstantRegister, kRootRegister).
715
- void Pushad();
716
- void Popad();
717
- // Sets the stack as after performing Popad, without actually loading the
718
- // registers.
719
- void Dropad();
720
-
721
- // Compare object type for heap object.
722
- // Always use unsigned comparisons: above and below, not less and greater.
723
- // Incoming register is heap_object and outgoing register is map.
724
- // They may be the same register, and may be kScratchRegister.
725
- void CmpObjectType(Register heap_object, InstanceType type, Register map);
726
-
727
- // Compare instance type for map.
728
- // Always use unsigned comparisons: above and below, not less and greater.
729
- void CmpInstanceType(Register map, InstanceType type);
730
-
731
- // Check if the map of an object is equal to a specified map and
732
- // branch to label if not. Skip the smi check if not required
733
- // (object is known to be a heap object)
734
- void CheckMap(Register obj,
735
- Handle<Map> map,
736
- Label* fail,
737
- bool is_heap_object);
738
-
739
- // Check if the object in register heap_object is a string. Afterwards the
740
- // register map contains the object map and the register instance_type
741
- // contains the instance_type. The registers map and instance_type can be the
742
- // same in which case it contains the instance type afterwards. Either of the
743
- // registers map and instance_type can be the same as heap_object.
744
- Condition IsObjectStringType(Register heap_object,
745
- Register map,
746
- Register instance_type);
747
-
748
- // FCmp compares and pops the two values on top of the FPU stack.
749
- // The flag results are similar to integer cmp, but requires unsigned
750
- // jcc instructions (je, ja, jae, jb, jbe, je, and jz).
751
- void FCmp();
752
-
753
- // Abort execution if argument is not a number. Used in debug code.
754
- void AbortIfNotNumber(Register object);
755
-
756
- // Abort execution if argument is a smi. Used in debug code.
757
- void AbortIfSmi(Register object);
758
-
759
- // Abort execution if argument is not a smi. Used in debug code.
760
- void AbortIfNotSmi(Register object);
761
- void AbortIfNotSmi(const Operand& object);
762
-
763
- // Abort execution if argument is a string. Used in debug code.
764
- void AbortIfNotString(Register object);
765
-
766
- // Abort execution if argument is not the root value with the given index.
767
- void AbortIfNotRootValue(Register src,
768
- Heap::RootListIndex root_value_index,
769
- const char* message);
770
-
771
- // ---------------------------------------------------------------------------
772
- // Exception handling
773
-
774
- // Push a new try handler and link into try handler chain. The return
775
- // address must be pushed before calling this helper.
776
- void PushTryHandler(CodeLocation try_location, HandlerType type);
777
-
778
- // Unlink the stack handler on top of the stack from the try handler chain.
779
- void PopTryHandler();
780
-
781
- // Activate the top handler in the try hander chain and pass the
782
- // thrown value.
783
- void Throw(Register value);
784
-
785
- // Propagate an uncatchable exception out of the current JS stack.
786
- void ThrowUncatchable(UncatchableExceptionType type, Register value);
787
-
788
- // ---------------------------------------------------------------------------
789
- // Inline caching support
790
-
791
- // Generate code for checking access rights - used for security checks
792
- // on access to global objects across environments. The holder register
793
- // is left untouched, but the scratch register and kScratchRegister,
794
- // which must be different, are clobbered.
795
- void CheckAccessGlobalProxy(Register holder_reg,
796
- Register scratch,
797
- Label* miss);
798
-
799
-
800
- // ---------------------------------------------------------------------------
801
- // Allocation support
802
-
803
- // Allocate an object in new space. If the new space is exhausted control
804
- // continues at the gc_required label. The allocated object is returned in
805
- // result and end of the new object is returned in result_end. The register
806
- // scratch can be passed as no_reg in which case an additional object
807
- // reference will be added to the reloc info. The returned pointers in result
808
- // and result_end have not yet been tagged as heap objects. If
809
- // result_contains_top_on_entry is true the content of result is known to be
810
- // the allocation top on entry (could be result_end from a previous call to
811
- // AllocateInNewSpace). If result_contains_top_on_entry is true scratch
812
- // should be no_reg as it is never used.
813
- void AllocateInNewSpace(int object_size,
814
- Register result,
815
- Register result_end,
816
- Register scratch,
817
- Label* gc_required,
818
- AllocationFlags flags);
819
-
820
- void AllocateInNewSpace(int header_size,
821
- ScaleFactor element_size,
822
- Register element_count,
823
- Register result,
824
- Register result_end,
825
- Register scratch,
826
- Label* gc_required,
827
- AllocationFlags flags);
828
-
829
- void AllocateInNewSpace(Register object_size,
830
- Register result,
831
- Register result_end,
832
- Register scratch,
833
- Label* gc_required,
834
- AllocationFlags flags);
835
-
836
- // Undo allocation in new space. The object passed and objects allocated after
837
- // it will no longer be allocated. Make sure that no pointers are left to the
838
- // object(s) no longer allocated as they would be invalid when allocation is
839
- // un-done.
840
- void UndoAllocationInNewSpace(Register object);
841
-
842
- // Allocate a heap number in new space with undefined value. Returns
843
- // tagged pointer in result register, or jumps to gc_required if new
844
- // space is full.
845
- void AllocateHeapNumber(Register result,
846
- Register scratch,
847
- Label* gc_required);
848
-
849
- // Allocate a sequential string. All the header fields of the string object
850
- // are initialized.
851
- void AllocateTwoByteString(Register result,
852
- Register length,
853
- Register scratch1,
854
- Register scratch2,
855
- Register scratch3,
856
- Label* gc_required);
857
- void AllocateAsciiString(Register result,
858
- Register length,
859
- Register scratch1,
860
- Register scratch2,
861
- Register scratch3,
862
- Label* gc_required);
863
-
864
- // Allocate a raw cons string object. Only the map field of the result is
865
- // initialized.
866
- void AllocateConsString(Register result,
867
- Register scratch1,
868
- Register scratch2,
869
- Label* gc_required);
870
- void AllocateAsciiConsString(Register result,
871
- Register scratch1,
872
- Register scratch2,
873
- Label* gc_required);
874
-
875
- // ---------------------------------------------------------------------------
876
- // Support functions.
877
-
878
- // Check if result is zero and op is negative.
879
- void NegativeZeroTest(Register result, Register op, Label* then_label);
880
-
881
- // Check if result is zero and op is negative in code using jump targets.
882
- void NegativeZeroTest(CodeGenerator* cgen,
883
- Register result,
884
- Register op,
885
- JumpTarget* then_target);
886
-
887
- // Check if result is zero and any of op1 and op2 are negative.
888
- // Register scratch is destroyed, and it must be different from op2.
889
- void NegativeZeroTest(Register result, Register op1, Register op2,
890
- Register scratch, Label* then_label);
891
-
892
- // Try to get function prototype of a function and puts the value in
893
- // the result register. Checks that the function really is a
894
- // function and jumps to the miss label if the fast checks fail. The
895
- // function register will be untouched; the other register may be
896
- // clobbered.
897
- void TryGetFunctionPrototype(Register function,
898
- Register result,
899
- Label* miss);
900
-
901
- // Generates code for reporting that an illegal operation has
902
- // occurred.
903
- void IllegalOperation(int num_arguments);
904
-
905
- // Picks out an array index from the hash field.
906
- // Register use:
907
- // hash - holds the index's hash. Clobbered.
908
- // index - holds the overwritten index on exit.
909
- void IndexFromHash(Register hash, Register index);
910
-
911
- // Find the function context up the context chain.
912
- void LoadContext(Register dst, int context_chain_length);
913
-
914
- // Load the global function with the given index.
915
- void LoadGlobalFunction(int index, Register function);
916
-
917
- // Load the initial map from the global function. The registers
918
- // function and map can be the same.
919
- void LoadGlobalFunctionInitialMap(Register function, Register map);
920
-
921
- // ---------------------------------------------------------------------------
922
- // Runtime calls
923
-
924
- // Call a code stub.
925
- void CallStub(CodeStub* stub);
926
-
927
- // Call a code stub and return the code object called. Try to generate
928
- // the code if necessary. Do not perform a GC but instead return a retry
929
- // after GC failure.
930
- MUST_USE_RESULT MaybeObject* TryCallStub(CodeStub* stub);
931
-
932
- // Tail call a code stub (jump).
933
- void TailCallStub(CodeStub* stub);
934
-
935
- // Tail call a code stub (jump) and return the code object called. Try to
936
- // generate the code if necessary. Do not perform a GC but instead return
937
- // a retry after GC failure.
938
- MUST_USE_RESULT MaybeObject* TryTailCallStub(CodeStub* stub);
939
-
940
- // Return from a code stub after popping its arguments.
941
- void StubReturn(int argc);
942
-
943
- // Call a runtime routine.
944
- void CallRuntime(const Runtime::Function* f, int num_arguments);
945
-
946
- // Call a runtime function and save the value of XMM registers.
947
- void CallRuntimeSaveDoubles(Runtime::FunctionId id);
948
-
949
- // Call a runtime function, returning the CodeStub object called.
950
- // Try to generate the stub code if necessary. Do not perform a GC
951
- // but instead return a retry after GC failure.
952
- MUST_USE_RESULT MaybeObject* TryCallRuntime(const Runtime::Function* f,
953
- int num_arguments);
954
-
955
- // Convenience function: Same as above, but takes the fid instead.
956
- void CallRuntime(Runtime::FunctionId id, int num_arguments);
957
-
958
- // Convenience function: Same as above, but takes the fid instead.
959
- MUST_USE_RESULT MaybeObject* TryCallRuntime(Runtime::FunctionId id,
960
- int num_arguments);
961
-
962
- // Convenience function: call an external reference.
963
- void CallExternalReference(const ExternalReference& ext,
964
- int num_arguments);
965
-
966
- // Tail call of a runtime routine (jump).
967
- // Like JumpToExternalReference, but also takes care of passing the number
968
- // of parameters.
969
- void TailCallExternalReference(const ExternalReference& ext,
970
- int num_arguments,
971
- int result_size);
972
-
973
- MUST_USE_RESULT MaybeObject* TryTailCallExternalReference(
974
- const ExternalReference& ext, int num_arguments, int result_size);
975
-
976
- // Convenience function: tail call a runtime routine (jump).
977
- void TailCallRuntime(Runtime::FunctionId fid,
978
- int num_arguments,
979
- int result_size);
980
-
981
- MUST_USE_RESULT MaybeObject* TryTailCallRuntime(Runtime::FunctionId fid,
982
- int num_arguments,
983
- int result_size);
984
-
985
- // Jump to a runtime routine.
986
- void JumpToExternalReference(const ExternalReference& ext, int result_size);
987
-
988
- // Jump to a runtime routine.
989
- MaybeObject* TryJumpToExternalReference(const ExternalReference& ext,
990
- int result_size);
991
-
992
- // Prepares stack to put arguments (aligns and so on).
993
- // WIN64 calling convention requires to put the pointer to the return value
994
- // slot into rcx (rcx must be preserverd until TryCallApiFunctionAndReturn).
995
- // Saves context (rsi). Clobbers rax. Allocates arg_stack_space * kPointerSize
996
- // inside the exit frame (not GCed) accessible via StackSpaceOperand.
997
- void PrepareCallApiFunction(int arg_stack_space);
998
-
999
- // Calls an API function. Allocates HandleScope, extracts
1000
- // returned value from handle and propagates exceptions.
1001
- // Clobbers r14, r15, rbx and caller-save registers. Restores context.
1002
- // On return removes stack_space * kPointerSize (GCed).
1003
- MUST_USE_RESULT MaybeObject* TryCallApiFunctionAndReturn(
1004
- ApiFunction* function, int stack_space);
1005
-
1006
- // Before calling a C-function from generated code, align arguments on stack.
1007
- // After aligning the frame, arguments must be stored in esp[0], esp[4],
1008
- // etc., not pushed. The argument count assumes all arguments are word sized.
1009
- // The number of slots reserved for arguments depends on platform. On Windows
1010
- // stack slots are reserved for the arguments passed in registers. On other
1011
- // platforms stack slots are only reserved for the arguments actually passed
1012
- // on the stack.
1013
- void PrepareCallCFunction(int num_arguments);
1014
-
1015
- // Calls a C function and cleans up the space for arguments allocated
1016
- // by PrepareCallCFunction. The called function is not allowed to trigger a
1017
- // garbage collection, since that might move the code and invalidate the
1018
- // return address (unless this is somehow accounted for by the called
1019
- // function).
1020
- void CallCFunction(ExternalReference function, int num_arguments);
1021
- void CallCFunction(Register function, int num_arguments);
1022
-
1023
- // Calculate the number of stack slots to reserve for arguments when calling a
1024
- // C function.
1025
- int ArgumentStackSlotsForCFunctionCall(int num_arguments);
1026
-
1027
- // ---------------------------------------------------------------------------
1028
- // Utilities
1029
-
1030
- void Ret();
1031
-
1032
- // Return and drop arguments from stack, where the number of arguments
1033
- // may be bigger than 2^16 - 1. Requires a scratch register.
1034
- void Ret(int bytes_dropped, Register scratch);
1035
-
1036
- Handle<Object> CodeObject() {
1037
- ASSERT(!code_object_.is_null());
1038
- return code_object_;
1039
- }
1040
-
1041
- // Copy length bytes from source to destination.
1042
- // Uses scratch register internally (if you have a low-eight register
1043
- // free, do use it, otherwise kScratchRegister will be used).
1044
- // The min_length is a minimum limit on the value that length will have.
1045
- // The algorithm has some special cases that might be omitted if the string
1046
- // is known to always be long.
1047
- void CopyBytes(Register destination,
1048
- Register source,
1049
- Register length,
1050
- int min_length = 0,
1051
- Register scratch = kScratchRegister);
1052
-
1053
-
1054
- // ---------------------------------------------------------------------------
1055
- // StatsCounter support
1056
-
1057
- void SetCounter(StatsCounter* counter, int value);
1058
- void IncrementCounter(StatsCounter* counter, int value);
1059
- void DecrementCounter(StatsCounter* counter, int value);
1060
-
1061
-
1062
- // ---------------------------------------------------------------------------
1063
- // Debugging
1064
-
1065
- // Calls Abort(msg) if the condition cc is not satisfied.
1066
- // Use --debug_code to enable.
1067
- void Assert(Condition cc, const char* msg);
1068
-
1069
- void AssertFastElements(Register elements);
1070
-
1071
- // Like Assert(), but always enabled.
1072
- void Check(Condition cc, const char* msg);
1073
-
1074
- // Print a message to stdout and abort execution.
1075
- void Abort(const char* msg);
1076
-
1077
- // Check that the stack is aligned.
1078
- void CheckStackAlignment();
1079
-
1080
- // Verify restrictions about code generated in stubs.
1081
- void set_generating_stub(bool value) { generating_stub_ = value; }
1082
- bool generating_stub() { return generating_stub_; }
1083
- void set_allow_stub_calls(bool value) { allow_stub_calls_ = value; }
1084
- bool allow_stub_calls() { return allow_stub_calls_; }
1085
-
1086
- private:
1087
- // Order general registers are pushed by Pushad.
1088
- // rax, rcx, rdx, rbx, rsi, rdi, r8, r9, r11, r14, r15.
1089
- static int kSafepointPushRegisterIndices[Register::kNumRegisters];
1090
- static const int kNumSafepointSavedRegisters = 11;
1091
-
1092
- bool generating_stub_;
1093
- bool allow_stub_calls_;
1094
- bool root_array_available_;
1095
-
1096
- // Returns a register holding the smi value. The register MUST NOT be
1097
- // modified. It may be the "smi 1 constant" register.
1098
- Register GetSmiConstant(Smi* value);
1099
-
1100
- // Moves the smi value to the destination register.
1101
- void LoadSmiConstant(Register dst, Smi* value);
1102
-
1103
- // This handle will be patched with the code object on installation.
1104
- Handle<Object> code_object_;
1105
-
1106
- // Helper functions for generating invokes.
1107
- template <typename LabelType>
1108
- void InvokePrologue(const ParameterCount& expected,
1109
- const ParameterCount& actual,
1110
- Handle<Code> code_constant,
1111
- Register code_register,
1112
- LabelType* done,
1113
- InvokeFlag flag,
1114
- CallWrapper* call_wrapper);
1115
-
1116
- // Activation support.
1117
- void EnterFrame(StackFrame::Type type);
1118
- void LeaveFrame(StackFrame::Type type);
1119
-
1120
- void EnterExitFramePrologue(bool save_rax);
1121
-
1122
- // Allocates arg_stack_space * kPointerSize memory (not GCed) on the stack
1123
- // accessible via StackSpaceOperand.
1124
- void EnterExitFrameEpilogue(int arg_stack_space, bool save_doubles);
1125
-
1126
- void LeaveExitFrameEpilogue();
1127
-
1128
- // Allocation support helpers.
1129
- // Loads the top of new-space into the result register.
1130
- // Otherwise the address of the new-space top is loaded into scratch (if
1131
- // scratch is valid), and the new-space top is loaded into result.
1132
- void LoadAllocationTopHelper(Register result,
1133
- Register scratch,
1134
- AllocationFlags flags);
1135
- // Update allocation top with value in result_end register.
1136
- // If scratch is valid, it contains the address of the allocation top.
1137
- void UpdateAllocationTopHelper(Register result_end, Register scratch);
1138
-
1139
- // Helper for PopHandleScope. Allowed to perform a GC and returns
1140
- // NULL if gc_allowed. Does not perform a GC if !gc_allowed, and
1141
- // possibly returns a failure object indicating an allocation failure.
1142
- Object* PopHandleScopeHelper(Register saved,
1143
- Register scratch,
1144
- bool gc_allowed);
1145
-
1146
-
1147
- // Compute memory operands for safepoint stack slots.
1148
- Operand SafepointRegisterSlot(Register reg);
1149
- static int SafepointRegisterStackIndex(int reg_code) {
1150
- return kNumSafepointRegisters - kSafepointPushRegisterIndices[reg_code] - 1;
1151
- }
1152
-
1153
- // Needs access to SafepointRegisterStackIndex for optimized frame
1154
- // traversal.
1155
- friend class OptimizedFrame;
1156
- };
1157
-
1158
-
1159
- // The code patcher is used to patch (typically) small parts of code e.g. for
1160
- // debugging and other types of instrumentation. When using the code patcher
1161
- // the exact number of bytes specified must be emitted. Is not legal to emit
1162
- // relocation information. If any of these constraints are violated it causes
1163
- // an assertion.
1164
- class CodePatcher {
1165
- public:
1166
- CodePatcher(byte* address, int size);
1167
- virtual ~CodePatcher();
1168
-
1169
- // Macro assembler to emit code.
1170
- MacroAssembler* masm() { return &masm_; }
1171
-
1172
- private:
1173
- byte* address_; // The address of the code being patched.
1174
- int size_; // Number of bytes of the expected patch size.
1175
- MacroAssembler masm_; // Macro assembler used to generate the code.
1176
- };
1177
-
1178
-
1179
- // Helper class for generating code or data associated with the code
1180
- // right before or after a call instruction. As an example this can be used to
1181
- // generate safepoint data after calls for crankshaft.
1182
- class CallWrapper {
1183
- public:
1184
- CallWrapper() { }
1185
- virtual ~CallWrapper() { }
1186
- // Called just before emitting a call. Argument is the size of the generated
1187
- // call code.
1188
- virtual void BeforeCall(int call_size) = 0;
1189
- // Called just after emitting a call, i.e., at the return site for the call.
1190
- virtual void AfterCall() = 0;
1191
- };
1192
-
1193
-
1194
- // -----------------------------------------------------------------------------
1195
- // Static helper functions.
1196
-
1197
- // Generate an Operand for loading a field from an object.
1198
- static inline Operand FieldOperand(Register object, int offset) {
1199
- return Operand(object, offset - kHeapObjectTag);
1200
- }
1201
-
1202
-
1203
- // Generate an Operand for loading an indexed field from an object.
1204
- static inline Operand FieldOperand(Register object,
1205
- Register index,
1206
- ScaleFactor scale,
1207
- int offset) {
1208
- return Operand(object, index, scale, offset - kHeapObjectTag);
1209
- }
1210
-
1211
-
1212
- static inline Operand ContextOperand(Register context, int index) {
1213
- return Operand(context, Context::SlotOffset(index));
1214
- }
1215
-
1216
-
1217
- static inline Operand GlobalObjectOperand() {
1218
- return ContextOperand(rsi, Context::GLOBAL_INDEX);
1219
- }
1220
-
1221
-
1222
- // Provides access to exit frame stack space (not GCed).
1223
- static inline Operand StackSpaceOperand(int index) {
1224
- #ifdef _WIN64
1225
- const int kShaddowSpace = 4;
1226
- return Operand(rsp, (index + kShaddowSpace) * kPointerSize);
1227
- #else
1228
- return Operand(rsp, index * kPointerSize);
1229
- #endif
1230
- }
1231
-
1232
-
1233
-
1234
- #ifdef GENERATED_CODE_COVERAGE
1235
- extern void LogGeneratedCodeCoverage(const char* file_line);
1236
- #define CODE_COVERAGE_STRINGIFY(x) #x
1237
- #define CODE_COVERAGE_TOSTRING(x) CODE_COVERAGE_STRINGIFY(x)
1238
- #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__)
1239
- #define ACCESS_MASM(masm) { \
1240
- byte* x64_coverage_function = \
1241
- reinterpret_cast<byte*>(FUNCTION_ADDR(LogGeneratedCodeCoverage)); \
1242
- masm->pushfd(); \
1243
- masm->pushad(); \
1244
- masm->push(Immediate(reinterpret_cast<int>(&__FILE_LINE__))); \
1245
- masm->call(x64_coverage_function, RelocInfo::RUNTIME_ENTRY); \
1246
- masm->pop(rax); \
1247
- masm->popad(); \
1248
- masm->popfd(); \
1249
- } \
1250
- masm->
1251
- #else
1252
- #define ACCESS_MASM(masm) masm->
1253
- #endif
1254
-
1255
- // -----------------------------------------------------------------------------
1256
- // Template implementations.
1257
-
1258
- static int kSmiShift = kSmiTagSize + kSmiShiftSize;
1259
-
1260
-
1261
- template <typename LabelType>
1262
- void MacroAssembler::SmiNeg(Register dst,
1263
- Register src,
1264
- LabelType* on_smi_result) {
1265
- if (dst.is(src)) {
1266
- ASSERT(!dst.is(kScratchRegister));
1267
- movq(kScratchRegister, src);
1268
- neg(dst); // Low 32 bits are retained as zero by negation.
1269
- // Test if result is zero or Smi::kMinValue.
1270
- cmpq(dst, kScratchRegister);
1271
- j(not_equal, on_smi_result);
1272
- movq(src, kScratchRegister);
1273
- } else {
1274
- movq(dst, src);
1275
- neg(dst);
1276
- cmpq(dst, src);
1277
- // If the result is zero or Smi::kMinValue, negation failed to create a smi.
1278
- j(not_equal, on_smi_result);
1279
- }
1280
- }
1281
-
1282
-
1283
- template <typename LabelType>
1284
- void MacroAssembler::SmiAdd(Register dst,
1285
- Register src1,
1286
- Register src2,
1287
- LabelType* on_not_smi_result) {
1288
- ASSERT_NOT_NULL(on_not_smi_result);
1289
- ASSERT(!dst.is(src2));
1290
- if (dst.is(src1)) {
1291
- movq(kScratchRegister, src1);
1292
- addq(kScratchRegister, src2);
1293
- j(overflow, on_not_smi_result);
1294
- movq(dst, kScratchRegister);
1295
- } else {
1296
- movq(dst, src1);
1297
- addq(dst, src2);
1298
- j(overflow, on_not_smi_result);
1299
- }
1300
- }
1301
-
1302
-
1303
- template <typename LabelType>
1304
- void MacroAssembler::SmiAdd(Register dst,
1305
- Register src1,
1306
- const Operand& src2,
1307
- LabelType* on_not_smi_result) {
1308
- ASSERT_NOT_NULL(on_not_smi_result);
1309
- if (dst.is(src1)) {
1310
- movq(kScratchRegister, src1);
1311
- addq(kScratchRegister, src2);
1312
- j(overflow, on_not_smi_result);
1313
- movq(dst, kScratchRegister);
1314
- } else {
1315
- ASSERT(!src2.AddressUsesRegister(dst));
1316
- movq(dst, src1);
1317
- addq(dst, src2);
1318
- j(overflow, on_not_smi_result);
1319
- }
1320
- }
1321
-
1322
-
1323
- template <typename LabelType>
1324
- void MacroAssembler::SmiSub(Register dst,
1325
- Register src1,
1326
- Register src2,
1327
- LabelType* on_not_smi_result) {
1328
- ASSERT_NOT_NULL(on_not_smi_result);
1329
- ASSERT(!dst.is(src2));
1330
- if (dst.is(src1)) {
1331
- cmpq(dst, src2);
1332
- j(overflow, on_not_smi_result);
1333
- subq(dst, src2);
1334
- } else {
1335
- movq(dst, src1);
1336
- subq(dst, src2);
1337
- j(overflow, on_not_smi_result);
1338
- }
1339
- }
1340
-
1341
-
1342
- template <typename LabelType>
1343
- void MacroAssembler::SmiSub(Register dst,
1344
- Register src1,
1345
- const Operand& src2,
1346
- LabelType* on_not_smi_result) {
1347
- ASSERT_NOT_NULL(on_not_smi_result);
1348
- if (dst.is(src1)) {
1349
- movq(kScratchRegister, src2);
1350
- cmpq(src1, kScratchRegister);
1351
- j(overflow, on_not_smi_result);
1352
- subq(src1, kScratchRegister);
1353
- } else {
1354
- movq(dst, src1);
1355
- subq(dst, src2);
1356
- j(overflow, on_not_smi_result);
1357
- }
1358
- }
1359
-
1360
-
1361
- template <typename LabelType>
1362
- void MacroAssembler::SmiMul(Register dst,
1363
- Register src1,
1364
- Register src2,
1365
- LabelType* on_not_smi_result) {
1366
- ASSERT(!dst.is(src2));
1367
- ASSERT(!dst.is(kScratchRegister));
1368
- ASSERT(!src1.is(kScratchRegister));
1369
- ASSERT(!src2.is(kScratchRegister));
1370
-
1371
- if (dst.is(src1)) {
1372
- NearLabel failure, zero_correct_result;
1373
- movq(kScratchRegister, src1); // Create backup for later testing.
1374
- SmiToInteger64(dst, src1);
1375
- imul(dst, src2);
1376
- j(overflow, &failure);
1377
-
1378
- // Check for negative zero result. If product is zero, and one
1379
- // argument is negative, go to slow case.
1380
- NearLabel correct_result;
1381
- testq(dst, dst);
1382
- j(not_zero, &correct_result);
1383
-
1384
- movq(dst, kScratchRegister);
1385
- xor_(dst, src2);
1386
- j(positive, &zero_correct_result); // Result was positive zero.
1387
-
1388
- bind(&failure); // Reused failure exit, restores src1.
1389
- movq(src1, kScratchRegister);
1390
- jmp(on_not_smi_result);
1391
-
1392
- bind(&zero_correct_result);
1393
- Set(dst, 0);
1394
-
1395
- bind(&correct_result);
1396
- } else {
1397
- SmiToInteger64(dst, src1);
1398
- imul(dst, src2);
1399
- j(overflow, on_not_smi_result);
1400
- // Check for negative zero result. If product is zero, and one
1401
- // argument is negative, go to slow case.
1402
- NearLabel correct_result;
1403
- testq(dst, dst);
1404
- j(not_zero, &correct_result);
1405
- // One of src1 and src2 is zero, the check whether the other is
1406
- // negative.
1407
- movq(kScratchRegister, src1);
1408
- xor_(kScratchRegister, src2);
1409
- j(negative, on_not_smi_result);
1410
- bind(&correct_result);
1411
- }
1412
- }
1413
-
1414
-
1415
- template <typename LabelType>
1416
- void MacroAssembler::SmiTryAddConstant(Register dst,
1417
- Register src,
1418
- Smi* constant,
1419
- LabelType* on_not_smi_result) {
1420
- // Does not assume that src is a smi.
1421
- ASSERT_EQ(static_cast<int>(1), static_cast<int>(kSmiTagMask));
1422
- ASSERT_EQ(0, kSmiTag);
1423
- ASSERT(!dst.is(kScratchRegister));
1424
- ASSERT(!src.is(kScratchRegister));
1425
-
1426
- JumpIfNotSmi(src, on_not_smi_result);
1427
- Register tmp = (dst.is(src) ? kScratchRegister : dst);
1428
- LoadSmiConstant(tmp, constant);
1429
- addq(tmp, src);
1430
- j(overflow, on_not_smi_result);
1431
- if (dst.is(src)) {
1432
- movq(dst, tmp);
1433
- }
1434
- }
1435
-
1436
-
1437
- template <typename LabelType>
1438
- void MacroAssembler::SmiAddConstant(Register dst,
1439
- Register src,
1440
- Smi* constant,
1441
- LabelType* on_not_smi_result) {
1442
- if (constant->value() == 0) {
1443
- if (!dst.is(src)) {
1444
- movq(dst, src);
1445
- }
1446
- } else if (dst.is(src)) {
1447
- ASSERT(!dst.is(kScratchRegister));
1448
-
1449
- LoadSmiConstant(kScratchRegister, constant);
1450
- addq(kScratchRegister, src);
1451
- j(overflow, on_not_smi_result);
1452
- movq(dst, kScratchRegister);
1453
- } else {
1454
- LoadSmiConstant(dst, constant);
1455
- addq(dst, src);
1456
- j(overflow, on_not_smi_result);
1457
- }
1458
- }
1459
-
1460
-
1461
- template <typename LabelType>
1462
- void MacroAssembler::SmiSubConstant(Register dst,
1463
- Register src,
1464
- Smi* constant,
1465
- LabelType* on_not_smi_result) {
1466
- if (constant->value() == 0) {
1467
- if (!dst.is(src)) {
1468
- movq(dst, src);
1469
- }
1470
- } else if (dst.is(src)) {
1471
- ASSERT(!dst.is(kScratchRegister));
1472
- if (constant->value() == Smi::kMinValue) {
1473
- // Subtracting min-value from any non-negative value will overflow.
1474
- // We test the non-negativeness before doing the subtraction.
1475
- testq(src, src);
1476
- j(not_sign, on_not_smi_result);
1477
- LoadSmiConstant(kScratchRegister, constant);
1478
- subq(dst, kScratchRegister);
1479
- } else {
1480
- // Subtract by adding the negation.
1481
- LoadSmiConstant(kScratchRegister, Smi::FromInt(-constant->value()));
1482
- addq(kScratchRegister, dst);
1483
- j(overflow, on_not_smi_result);
1484
- movq(dst, kScratchRegister);
1485
- }
1486
- } else {
1487
- if (constant->value() == Smi::kMinValue) {
1488
- // Subtracting min-value from any non-negative value will overflow.
1489
- // We test the non-negativeness before doing the subtraction.
1490
- testq(src, src);
1491
- j(not_sign, on_not_smi_result);
1492
- LoadSmiConstant(dst, constant);
1493
- // Adding and subtracting the min-value gives the same result, it only
1494
- // differs on the overflow bit, which we don't check here.
1495
- addq(dst, src);
1496
- } else {
1497
- // Subtract by adding the negation.
1498
- LoadSmiConstant(dst, Smi::FromInt(-(constant->value())));
1499
- addq(dst, src);
1500
- j(overflow, on_not_smi_result);
1501
- }
1502
- }
1503
- }
1504
-
1505
-
1506
- template <typename LabelType>
1507
- void MacroAssembler::SmiDiv(Register dst,
1508
- Register src1,
1509
- Register src2,
1510
- LabelType* on_not_smi_result) {
1511
- ASSERT(!src1.is(kScratchRegister));
1512
- ASSERT(!src2.is(kScratchRegister));
1513
- ASSERT(!dst.is(kScratchRegister));
1514
- ASSERT(!src2.is(rax));
1515
- ASSERT(!src2.is(rdx));
1516
- ASSERT(!src1.is(rdx));
1517
-
1518
- // Check for 0 divisor (result is +/-Infinity).
1519
- NearLabel positive_divisor;
1520
- testq(src2, src2);
1521
- j(zero, on_not_smi_result);
1522
-
1523
- if (src1.is(rax)) {
1524
- movq(kScratchRegister, src1);
1525
- }
1526
- SmiToInteger32(rax, src1);
1527
- // We need to rule out dividing Smi::kMinValue by -1, since that would
1528
- // overflow in idiv and raise an exception.
1529
- // We combine this with negative zero test (negative zero only happens
1530
- // when dividing zero by a negative number).
1531
-
1532
- // We overshoot a little and go to slow case if we divide min-value
1533
- // by any negative value, not just -1.
1534
- NearLabel safe_div;
1535
- testl(rax, Immediate(0x7fffffff));
1536
- j(not_zero, &safe_div);
1537
- testq(src2, src2);
1538
- if (src1.is(rax)) {
1539
- j(positive, &safe_div);
1540
- movq(src1, kScratchRegister);
1541
- jmp(on_not_smi_result);
1542
- } else {
1543
- j(negative, on_not_smi_result);
1544
- }
1545
- bind(&safe_div);
1546
-
1547
- SmiToInteger32(src2, src2);
1548
- // Sign extend src1 into edx:eax.
1549
- cdq();
1550
- idivl(src2);
1551
- Integer32ToSmi(src2, src2);
1552
- // Check that the remainder is zero.
1553
- testl(rdx, rdx);
1554
- if (src1.is(rax)) {
1555
- NearLabel smi_result;
1556
- j(zero, &smi_result);
1557
- movq(src1, kScratchRegister);
1558
- jmp(on_not_smi_result);
1559
- bind(&smi_result);
1560
- } else {
1561
- j(not_zero, on_not_smi_result);
1562
- }
1563
- if (!dst.is(src1) && src1.is(rax)) {
1564
- movq(src1, kScratchRegister);
1565
- }
1566
- Integer32ToSmi(dst, rax);
1567
- }
1568
-
1569
-
1570
- template <typename LabelType>
1571
- void MacroAssembler::SmiMod(Register dst,
1572
- Register src1,
1573
- Register src2,
1574
- LabelType* on_not_smi_result) {
1575
- ASSERT(!dst.is(kScratchRegister));
1576
- ASSERT(!src1.is(kScratchRegister));
1577
- ASSERT(!src2.is(kScratchRegister));
1578
- ASSERT(!src2.is(rax));
1579
- ASSERT(!src2.is(rdx));
1580
- ASSERT(!src1.is(rdx));
1581
- ASSERT(!src1.is(src2));
1582
-
1583
- testq(src2, src2);
1584
- j(zero, on_not_smi_result);
1585
-
1586
- if (src1.is(rax)) {
1587
- movq(kScratchRegister, src1);
1588
- }
1589
- SmiToInteger32(rax, src1);
1590
- SmiToInteger32(src2, src2);
1591
-
1592
- // Test for the edge case of dividing Smi::kMinValue by -1 (will overflow).
1593
- NearLabel safe_div;
1594
- cmpl(rax, Immediate(Smi::kMinValue));
1595
- j(not_equal, &safe_div);
1596
- cmpl(src2, Immediate(-1));
1597
- j(not_equal, &safe_div);
1598
- // Retag inputs and go slow case.
1599
- Integer32ToSmi(src2, src2);
1600
- if (src1.is(rax)) {
1601
- movq(src1, kScratchRegister);
1602
- }
1603
- jmp(on_not_smi_result);
1604
- bind(&safe_div);
1605
-
1606
- // Sign extend eax into edx:eax.
1607
- cdq();
1608
- idivl(src2);
1609
- // Restore smi tags on inputs.
1610
- Integer32ToSmi(src2, src2);
1611
- if (src1.is(rax)) {
1612
- movq(src1, kScratchRegister);
1613
- }
1614
- // Check for a negative zero result. If the result is zero, and the
1615
- // dividend is negative, go slow to return a floating point negative zero.
1616
- NearLabel smi_result;
1617
- testl(rdx, rdx);
1618
- j(not_zero, &smi_result);
1619
- testq(src1, src1);
1620
- j(negative, on_not_smi_result);
1621
- bind(&smi_result);
1622
- Integer32ToSmi(dst, rdx);
1623
- }
1624
-
1625
-
1626
- template <typename LabelType>
1627
- void MacroAssembler::SmiShiftLogicalRightConstant(
1628
- Register dst, Register src, int shift_value, LabelType* on_not_smi_result) {
1629
- // Logic right shift interprets its result as an *unsigned* number.
1630
- if (dst.is(src)) {
1631
- UNIMPLEMENTED(); // Not used.
1632
- } else {
1633
- movq(dst, src);
1634
- if (shift_value == 0) {
1635
- testq(dst, dst);
1636
- j(negative, on_not_smi_result);
1637
- }
1638
- shr(dst, Immediate(shift_value + kSmiShift));
1639
- shl(dst, Immediate(kSmiShift));
1640
- }
1641
- }
1642
-
1643
-
1644
- template <typename LabelType>
1645
- void MacroAssembler::SmiShiftLogicalRight(Register dst,
1646
- Register src1,
1647
- Register src2,
1648
- LabelType* on_not_smi_result) {
1649
- ASSERT(!dst.is(kScratchRegister));
1650
- ASSERT(!src1.is(kScratchRegister));
1651
- ASSERT(!src2.is(kScratchRegister));
1652
- ASSERT(!dst.is(rcx));
1653
- // dst and src1 can be the same, because the one case that bails out
1654
- // is a shift by 0, which leaves dst, and therefore src1, unchanged.
1655
- NearLabel result_ok;
1656
- if (src1.is(rcx) || src2.is(rcx)) {
1657
- movq(kScratchRegister, rcx);
1658
- }
1659
- if (!dst.is(src1)) {
1660
- movq(dst, src1);
1661
- }
1662
- SmiToInteger32(rcx, src2);
1663
- orl(rcx, Immediate(kSmiShift));
1664
- shr_cl(dst); // Shift is rcx modulo 0x1f + 32.
1665
- shl(dst, Immediate(kSmiShift));
1666
- testq(dst, dst);
1667
- if (src1.is(rcx) || src2.is(rcx)) {
1668
- NearLabel positive_result;
1669
- j(positive, &positive_result);
1670
- if (src1.is(rcx)) {
1671
- movq(src1, kScratchRegister);
1672
- } else {
1673
- movq(src2, kScratchRegister);
1674
- }
1675
- jmp(on_not_smi_result);
1676
- bind(&positive_result);
1677
- } else {
1678
- j(negative, on_not_smi_result); // src2 was zero and src1 negative.
1679
- }
1680
- }
1681
-
1682
-
1683
- template <typename LabelType>
1684
- void MacroAssembler::SelectNonSmi(Register dst,
1685
- Register src1,
1686
- Register src2,
1687
- LabelType* on_not_smis) {
1688
- ASSERT(!dst.is(kScratchRegister));
1689
- ASSERT(!src1.is(kScratchRegister));
1690
- ASSERT(!src2.is(kScratchRegister));
1691
- ASSERT(!dst.is(src1));
1692
- ASSERT(!dst.is(src2));
1693
- // Both operands must not be smis.
1694
- #ifdef DEBUG
1695
- if (allow_stub_calls()) { // Check contains a stub call.
1696
- Condition not_both_smis = NegateCondition(CheckBothSmi(src1, src2));
1697
- Check(not_both_smis, "Both registers were smis in SelectNonSmi.");
1698
- }
1699
- #endif
1700
- ASSERT_EQ(0, kSmiTag);
1701
- ASSERT_EQ(0, Smi::FromInt(0));
1702
- movl(kScratchRegister, Immediate(kSmiTagMask));
1703
- and_(kScratchRegister, src1);
1704
- testl(kScratchRegister, src2);
1705
- // If non-zero then both are smis.
1706
- j(not_zero, on_not_smis);
1707
-
1708
- // Exactly one operand is a smi.
1709
- ASSERT_EQ(1, static_cast<int>(kSmiTagMask));
1710
- // kScratchRegister still holds src1 & kSmiTag, which is either zero or one.
1711
- subq(kScratchRegister, Immediate(1));
1712
- // If src1 is a smi, then scratch register all 1s, else it is all 0s.
1713
- movq(dst, src1);
1714
- xor_(dst, src2);
1715
- and_(dst, kScratchRegister);
1716
- // If src1 is a smi, dst holds src1 ^ src2, else it is zero.
1717
- xor_(dst, src1);
1718
- // If src1 is a smi, dst is src2, else it is src1, i.e., the non-smi.
1719
- }
1720
-
1721
-
1722
- template <typename LabelType>
1723
- void MacroAssembler::JumpIfSmi(Register src, LabelType* on_smi) {
1724
- ASSERT_EQ(0, kSmiTag);
1725
- Condition smi = CheckSmi(src);
1726
- j(smi, on_smi);
1727
- }
1728
-
1729
-
1730
- template <typename LabelType>
1731
- void MacroAssembler::JumpIfNotSmi(Register src, LabelType* on_not_smi) {
1732
- Condition smi = CheckSmi(src);
1733
- j(NegateCondition(smi), on_not_smi);
1734
- }
1735
-
1736
-
1737
- template <typename LabelType>
1738
- void MacroAssembler::JumpUnlessNonNegativeSmi(
1739
- Register src, LabelType* on_not_smi_or_negative) {
1740
- Condition non_negative_smi = CheckNonNegativeSmi(src);
1741
- j(NegateCondition(non_negative_smi), on_not_smi_or_negative);
1742
- }
1743
-
1744
-
1745
- template <typename LabelType>
1746
- void MacroAssembler::JumpIfSmiEqualsConstant(Register src,
1747
- Smi* constant,
1748
- LabelType* on_equals) {
1749
- SmiCompare(src, constant);
1750
- j(equal, on_equals);
1751
- }
1752
-
1753
-
1754
- template <typename LabelType>
1755
- void MacroAssembler::JumpIfNotValidSmiValue(Register src,
1756
- LabelType* on_invalid) {
1757
- Condition is_valid = CheckInteger32ValidSmiValue(src);
1758
- j(NegateCondition(is_valid), on_invalid);
1759
- }
1760
-
1761
-
1762
- template <typename LabelType>
1763
- void MacroAssembler::JumpIfUIntNotValidSmiValue(Register src,
1764
- LabelType* on_invalid) {
1765
- Condition is_valid = CheckUInteger32ValidSmiValue(src);
1766
- j(NegateCondition(is_valid), on_invalid);
1767
- }
1768
-
1769
-
1770
- template <typename LabelType>
1771
- void MacroAssembler::JumpIfNotBothSmi(Register src1,
1772
- Register src2,
1773
- LabelType* on_not_both_smi) {
1774
- Condition both_smi = CheckBothSmi(src1, src2);
1775
- j(NegateCondition(both_smi), on_not_both_smi);
1776
- }
1777
-
1778
-
1779
- template <typename LabelType>
1780
- void MacroAssembler::JumpUnlessBothNonNegativeSmi(Register src1,
1781
- Register src2,
1782
- LabelType* on_not_both_smi) {
1783
- Condition both_smi = CheckBothNonNegativeSmi(src1, src2);
1784
- j(NegateCondition(both_smi), on_not_both_smi);
1785
- }
1786
-
1787
-
1788
- template <typename LabelType>
1789
- void MacroAssembler::JumpIfNotString(Register object,
1790
- Register object_map,
1791
- LabelType* not_string) {
1792
- Condition is_smi = CheckSmi(object);
1793
- j(is_smi, not_string);
1794
- CmpObjectType(object, FIRST_NONSTRING_TYPE, object_map);
1795
- j(above_equal, not_string);
1796
- }
1797
-
1798
-
1799
- template <typename LabelType>
1800
- void MacroAssembler::JumpIfNotBothSequentialAsciiStrings(Register first_object,
1801
- Register second_object,
1802
- Register scratch1,
1803
- Register scratch2,
1804
- LabelType* on_fail) {
1805
- // Check that both objects are not smis.
1806
- Condition either_smi = CheckEitherSmi(first_object, second_object);
1807
- j(either_smi, on_fail);
1808
-
1809
- // Load instance type for both strings.
1810
- movq(scratch1, FieldOperand(first_object, HeapObject::kMapOffset));
1811
- movq(scratch2, FieldOperand(second_object, HeapObject::kMapOffset));
1812
- movzxbl(scratch1, FieldOperand(scratch1, Map::kInstanceTypeOffset));
1813
- movzxbl(scratch2, FieldOperand(scratch2, Map::kInstanceTypeOffset));
1814
-
1815
- // Check that both are flat ascii strings.
1816
- ASSERT(kNotStringTag != 0);
1817
- const int kFlatAsciiStringMask =
1818
- kIsNotStringMask | kStringRepresentationMask | kStringEncodingMask;
1819
- const int kFlatAsciiStringTag = ASCII_STRING_TYPE;
1820
-
1821
- andl(scratch1, Immediate(kFlatAsciiStringMask));
1822
- andl(scratch2, Immediate(kFlatAsciiStringMask));
1823
- // Interleave the bits to check both scratch1 and scratch2 in one test.
1824
- ASSERT_EQ(0, kFlatAsciiStringMask & (kFlatAsciiStringMask << 3));
1825
- lea(scratch1, Operand(scratch1, scratch2, times_8, 0));
1826
- cmpl(scratch1,
1827
- Immediate(kFlatAsciiStringTag + (kFlatAsciiStringTag << 3)));
1828
- j(not_equal, on_fail);
1829
- }
1830
-
1831
-
1832
- template <typename LabelType>
1833
- void MacroAssembler::JumpIfInstanceTypeIsNotSequentialAscii(
1834
- Register instance_type,
1835
- Register scratch,
1836
- LabelType *failure) {
1837
- if (!scratch.is(instance_type)) {
1838
- movl(scratch, instance_type);
1839
- }
1840
-
1841
- const int kFlatAsciiStringMask =
1842
- kIsNotStringMask | kStringRepresentationMask | kStringEncodingMask;
1843
-
1844
- andl(scratch, Immediate(kFlatAsciiStringMask));
1845
- cmpl(scratch, Immediate(kStringTag | kSeqStringTag | kAsciiStringTag));
1846
- j(not_equal, failure);
1847
- }
1848
-
1849
-
1850
- template <typename LabelType>
1851
- void MacroAssembler::JumpIfBothInstanceTypesAreNotSequentialAscii(
1852
- Register first_object_instance_type,
1853
- Register second_object_instance_type,
1854
- Register scratch1,
1855
- Register scratch2,
1856
- LabelType* on_fail) {
1857
- // Load instance type for both strings.
1858
- movq(scratch1, first_object_instance_type);
1859
- movq(scratch2, second_object_instance_type);
1860
-
1861
- // Check that both are flat ascii strings.
1862
- ASSERT(kNotStringTag != 0);
1863
- const int kFlatAsciiStringMask =
1864
- kIsNotStringMask | kStringRepresentationMask | kStringEncodingMask;
1865
- const int kFlatAsciiStringTag = ASCII_STRING_TYPE;
1866
-
1867
- andl(scratch1, Immediate(kFlatAsciiStringMask));
1868
- andl(scratch2, Immediate(kFlatAsciiStringMask));
1869
- // Interleave the bits to check both scratch1 and scratch2 in one test.
1870
- ASSERT_EQ(0, kFlatAsciiStringMask & (kFlatAsciiStringMask << 3));
1871
- lea(scratch1, Operand(scratch1, scratch2, times_8, 0));
1872
- cmpl(scratch1,
1873
- Immediate(kFlatAsciiStringTag + (kFlatAsciiStringTag << 3)));
1874
- j(not_equal, on_fail);
1875
- }
1876
-
1877
-
1878
- template <typename LabelType>
1879
- void MacroAssembler::InNewSpace(Register object,
1880
- Register scratch,
1881
- Condition cc,
1882
- LabelType* branch) {
1883
- if (Serializer::enabled()) {
1884
- // Can't do arithmetic on external references if it might get serialized.
1885
- // The mask isn't really an address. We load it as an external reference in
1886
- // case the size of the new space is different between the snapshot maker
1887
- // and the running system.
1888
- if (scratch.is(object)) {
1889
- movq(kScratchRegister, ExternalReference::new_space_mask(isolate()));
1890
- and_(scratch, kScratchRegister);
1891
- } else {
1892
- movq(scratch, ExternalReference::new_space_mask(isolate()));
1893
- and_(scratch, object);
1894
- }
1895
- movq(kScratchRegister, ExternalReference::new_space_start(isolate()));
1896
- cmpq(scratch, kScratchRegister);
1897
- j(cc, branch);
1898
- } else {
1899
- ASSERT(is_int32(static_cast<int64_t>(HEAP->NewSpaceMask())));
1900
- intptr_t new_space_start =
1901
- reinterpret_cast<intptr_t>(HEAP->NewSpaceStart());
1902
- movq(kScratchRegister, -new_space_start, RelocInfo::NONE);
1903
- if (scratch.is(object)) {
1904
- addq(scratch, kScratchRegister);
1905
- } else {
1906
- lea(scratch, Operand(object, kScratchRegister, times_1, 0));
1907
- }
1908
- and_(scratch, Immediate(static_cast<int32_t>(HEAP->NewSpaceMask())));
1909
- j(cc, branch);
1910
- }
1911
- }
1912
-
1913
-
1914
- template <typename LabelType>
1915
- void MacroAssembler::InvokePrologue(const ParameterCount& expected,
1916
- const ParameterCount& actual,
1917
- Handle<Code> code_constant,
1918
- Register code_register,
1919
- LabelType* done,
1920
- InvokeFlag flag,
1921
- CallWrapper* call_wrapper) {
1922
- bool definitely_matches = false;
1923
- NearLabel invoke;
1924
- if (expected.is_immediate()) {
1925
- ASSERT(actual.is_immediate());
1926
- if (expected.immediate() == actual.immediate()) {
1927
- definitely_matches = true;
1928
- } else {
1929
- Set(rax, actual.immediate());
1930
- if (expected.immediate() ==
1931
- SharedFunctionInfo::kDontAdaptArgumentsSentinel) {
1932
- // Don't worry about adapting arguments for built-ins that
1933
- // don't want that done. Skip adaption code by making it look
1934
- // like we have a match between expected and actual number of
1935
- // arguments.
1936
- definitely_matches = true;
1937
- } else {
1938
- Set(rbx, expected.immediate());
1939
- }
1940
- }
1941
- } else {
1942
- if (actual.is_immediate()) {
1943
- // Expected is in register, actual is immediate. This is the
1944
- // case when we invoke function values without going through the
1945
- // IC mechanism.
1946
- cmpq(expected.reg(), Immediate(actual.immediate()));
1947
- j(equal, &invoke);
1948
- ASSERT(expected.reg().is(rbx));
1949
- Set(rax, actual.immediate());
1950
- } else if (!expected.reg().is(actual.reg())) {
1951
- // Both expected and actual are in (different) registers. This
1952
- // is the case when we invoke functions using call and apply.
1953
- cmpq(expected.reg(), actual.reg());
1954
- j(equal, &invoke);
1955
- ASSERT(actual.reg().is(rax));
1956
- ASSERT(expected.reg().is(rbx));
1957
- }
1958
- }
1959
-
1960
- if (!definitely_matches) {
1961
- Handle<Code> adaptor = isolate()->builtins()->ArgumentsAdaptorTrampoline();
1962
- if (!code_constant.is_null()) {
1963
- movq(rdx, code_constant, RelocInfo::EMBEDDED_OBJECT);
1964
- addq(rdx, Immediate(Code::kHeaderSize - kHeapObjectTag));
1965
- } else if (!code_register.is(rdx)) {
1966
- movq(rdx, code_register);
1967
- }
1968
-
1969
- if (flag == CALL_FUNCTION) {
1970
- if (call_wrapper != NULL) call_wrapper->BeforeCall(CallSize(adaptor));
1971
- Call(adaptor, RelocInfo::CODE_TARGET);
1972
- if (call_wrapper != NULL) call_wrapper->AfterCall();
1973
- jmp(done);
1974
- } else {
1975
- Jump(adaptor, RelocInfo::CODE_TARGET);
1976
- }
1977
- bind(&invoke);
1978
- }
1979
- }
1980
-
1981
-
1982
- } } // namespace v8::internal
1983
-
1984
- #endif // V8_X64_MACRO_ASSEMBLER_X64_H_