libv8 3.3.10.4 → 3.5.10.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/libv8/scons/CHANGES.txt +24 -231
- data/lib/libv8/scons/LICENSE.txt +1 -1
- data/lib/libv8/scons/MANIFEST +0 -1
- data/lib/libv8/scons/PKG-INFO +1 -1
- data/lib/libv8/scons/README.txt +9 -9
- data/lib/libv8/scons/RELEASE.txt +75 -77
- data/lib/libv8/scons/engine/SCons/Action.py +6 -22
- data/lib/libv8/scons/engine/SCons/Builder.py +2 -2
- data/lib/libv8/scons/engine/SCons/CacheDir.py +2 -2
- data/lib/libv8/scons/engine/SCons/Debug.py +2 -2
- data/lib/libv8/scons/engine/SCons/Defaults.py +10 -24
- data/lib/libv8/scons/engine/SCons/Environment.py +19 -118
- data/lib/libv8/scons/engine/SCons/Errors.py +2 -2
- data/lib/libv8/scons/engine/SCons/Executor.py +2 -2
- data/lib/libv8/scons/engine/SCons/Job.py +2 -2
- data/lib/libv8/scons/engine/SCons/Memoize.py +2 -2
- data/lib/libv8/scons/engine/SCons/Node/Alias.py +2 -2
- data/lib/libv8/scons/engine/SCons/Node/FS.py +121 -281
- data/lib/libv8/scons/engine/SCons/Node/Python.py +2 -2
- data/lib/libv8/scons/engine/SCons/Node/__init__.py +5 -6
- data/lib/libv8/scons/engine/SCons/Options/BoolOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/EnumOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/ListOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/PackageOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/PathOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/PathList.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/aix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/cygwin.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/darwin.py +3 -27
- data/lib/libv8/scons/engine/SCons/Platform/hpux.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/irix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/os2.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/posix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/sunos.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/win32.py +2 -2
- data/lib/libv8/scons/engine/SCons/SConf.py +2 -2
- data/lib/libv8/scons/engine/SCons/SConsign.py +3 -9
- data/lib/libv8/scons/engine/SCons/Scanner/C.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/D.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/Dir.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/Fortran.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/IDL.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/LaTeX.py +2 -5
- data/lib/libv8/scons/engine/SCons/Scanner/Prog.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/RC.py +3 -3
- data/lib/libv8/scons/engine/SCons/Scanner/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Script/Interactive.py +2 -2
- data/lib/libv8/scons/engine/SCons/Script/Main.py +11 -82
- data/lib/libv8/scons/engine/SCons/Script/SConsOptions.py +5 -5
- data/lib/libv8/scons/engine/SCons/Script/SConscript.py +2 -2
- data/lib/libv8/scons/engine/SCons/Script/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Sig.py +2 -2
- data/lib/libv8/scons/engine/SCons/Subst.py +2 -2
- data/lib/libv8/scons/engine/SCons/Taskmaster.py +2 -10
- data/lib/libv8/scons/engine/SCons/Tool/386asm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/BitKeeper.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/CVS.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/FortranCommon.py +2 -19
- data/lib/libv8/scons/engine/SCons/Tool/JavaCommon.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/arch.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/common.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/netframework.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/sdk.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vc.py +6 -9
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vs.py +2 -29
- data/lib/libv8/scons/engine/SCons/Tool/Perforce.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/PharLapCommon.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/RCS.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/SCCS.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/Subversion.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/__init__.py +3 -3
- data/lib/libv8/scons/engine/SCons/Tool/aixc++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/aixcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/aixf77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/aixlink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/applelink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/as.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/bcc32.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/c++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/cc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/cvf.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/default.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/dmd.py +7 -24
- data/lib/libv8/scons/engine/SCons/Tool/dvi.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/dvipdf.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/dvips.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/f77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/f90.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/f95.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/filesystem.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/fortran.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/g++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/g77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/gas.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/gcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/gfortran.py +3 -3
- data/lib/libv8/scons/engine/SCons/Tool/gnulink.py +3 -2
- data/lib/libv8/scons/engine/SCons/Tool/gs.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/hpc++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/hpcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/hplink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/icc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/icl.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ifl.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ifort.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ilink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ilink32.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/install.py +3 -57
- data/lib/libv8/scons/engine/SCons/Tool/intelc.py +25 -65
- data/lib/libv8/scons/engine/SCons/Tool/ipkg.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/jar.py +3 -9
- data/lib/libv8/scons/engine/SCons/Tool/javac.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/javah.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/latex.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/lex.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/link.py +5 -6
- data/lib/libv8/scons/engine/SCons/Tool/linkloc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/m4.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/masm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/midl.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/mingw.py +10 -31
- data/lib/libv8/scons/engine/SCons/Tool/mslib.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/mslink.py +9 -61
- data/lib/libv8/scons/engine/SCons/Tool/mssdk.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/msvc.py +11 -21
- data/lib/libv8/scons/engine/SCons/Tool/msvs.py +59 -477
- data/lib/libv8/scons/engine/SCons/Tool/mwcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/mwld.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/nasm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/ipk.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/msi.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/rpm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/src_tarbz2.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/src_targz.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/src_zip.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/tarbz2.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/targz.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/zip.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/pdf.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/pdflatex.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/pdftex.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/qt.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/rmic.py +3 -9
- data/lib/libv8/scons/engine/SCons/Tool/rpcgen.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/rpm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgiar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgic++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgicc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgilink.py +3 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunc++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/suncc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunf77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunf90.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunf95.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunlink.py +3 -2
- data/lib/libv8/scons/engine/SCons/Tool/swig.py +5 -6
- data/lib/libv8/scons/engine/SCons/Tool/tar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/tex.py +43 -96
- data/lib/libv8/scons/engine/SCons/Tool/textfile.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/tlib.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/wix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/yacc.py +2 -12
- data/lib/libv8/scons/engine/SCons/Tool/zip.py +2 -2
- data/lib/libv8/scons/engine/SCons/Util.py +3 -3
- data/lib/libv8/scons/engine/SCons/Variables/BoolVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/EnumVariable.py +3 -3
- data/lib/libv8/scons/engine/SCons/Variables/ListVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/PackageVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/PathVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Warnings.py +2 -2
- data/lib/libv8/scons/engine/SCons/__init__.py +6 -6
- data/lib/libv8/scons/engine/SCons/compat/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_builtins.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_collections.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_dbm.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_hashlib.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_io.py +2 -2
- data/lib/libv8/scons/engine/SCons/cpp.py +2 -2
- data/lib/libv8/scons/engine/SCons/dblite.py +1 -4
- data/lib/libv8/scons/engine/SCons/exitfuncs.py +2 -2
- data/lib/libv8/scons/scons-time.1 +3 -3
- data/lib/libv8/scons/scons.1 +1164 -1170
- data/lib/libv8/scons/sconsign.1 +3 -3
- data/lib/libv8/scons/script/scons +22 -22
- data/lib/libv8/scons/script/scons-time +2 -2
- data/lib/libv8/scons/script/scons.bat +4 -7
- data/lib/libv8/scons/script/sconsign +20 -21
- data/lib/libv8/scons/setup.cfg +1 -0
- data/lib/libv8/scons/setup.py +40 -38
- data/lib/libv8/v8/.gitignore +1 -1
- data/lib/libv8/v8/AUTHORS +2 -0
- data/lib/libv8/v8/ChangeLog +387 -0
- data/lib/libv8/v8/Makefile +171 -0
- data/lib/libv8/v8/SConstruct +124 -51
- data/lib/libv8/v8/build/README.txt +31 -14
- data/lib/libv8/v8/build/all.gyp +11 -4
- data/lib/libv8/v8/build/armu.gypi +6 -2
- data/lib/libv8/v8/build/common.gypi +240 -94
- data/lib/libv8/v8/build/gyp_v8 +32 -4
- data/lib/libv8/v8/build/standalone.gypi +200 -0
- data/lib/libv8/v8/include/v8-debug.h +0 -0
- data/lib/libv8/v8/include/v8-profiler.h +8 -11
- data/lib/libv8/v8/include/v8.h +191 -108
- data/lib/libv8/v8/preparser/SConscript +2 -2
- data/lib/libv8/v8/preparser/preparser-process.cc +3 -3
- data/lib/libv8/v8/preparser/preparser.gyp +42 -0
- data/lib/libv8/v8/src/SConscript +33 -8
- data/lib/libv8/v8/src/accessors.cc +77 -43
- data/lib/libv8/v8/src/api.cc +393 -191
- data/lib/libv8/v8/src/api.h +4 -8
- data/lib/libv8/v8/src/apinatives.js +15 -3
- data/lib/libv8/v8/src/arguments.h +8 -0
- data/lib/libv8/v8/src/arm/assembler-arm.cc +120 -120
- data/lib/libv8/v8/src/arm/assembler-arm.h +92 -43
- data/lib/libv8/v8/src/arm/builtins-arm.cc +32 -39
- data/lib/libv8/v8/src/arm/code-stubs-arm.cc +572 -351
- data/lib/libv8/v8/src/arm/code-stubs-arm.h +8 -77
- data/lib/libv8/v8/src/arm/codegen-arm.h +0 -2
- data/lib/libv8/v8/src/arm/deoptimizer-arm.cc +50 -30
- data/lib/libv8/v8/src/arm/disasm-arm.cc +1 -1
- data/lib/libv8/v8/src/arm/frames-arm.h +9 -5
- data/lib/libv8/v8/src/arm/full-codegen-arm.cc +331 -432
- data/lib/libv8/v8/src/arm/ic-arm.cc +192 -124
- data/lib/libv8/v8/src/arm/lithium-arm.cc +216 -232
- data/lib/libv8/v8/src/arm/lithium-arm.h +106 -259
- data/lib/libv8/v8/src/arm/lithium-codegen-arm.cc +633 -642
- data/lib/libv8/v8/src/arm/lithium-codegen-arm.h +4 -4
- data/lib/libv8/v8/src/arm/lithium-gap-resolver-arm.cc +1 -3
- data/lib/libv8/v8/src/arm/macro-assembler-arm.cc +260 -185
- data/lib/libv8/v8/src/arm/macro-assembler-arm.h +45 -25
- data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.cc +25 -13
- data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.h +3 -0
- data/lib/libv8/v8/src/arm/stub-cache-arm.cc +413 -226
- data/lib/libv8/v8/src/array.js +38 -18
- data/lib/libv8/v8/src/assembler.cc +12 -5
- data/lib/libv8/v8/src/assembler.h +15 -9
- data/lib/libv8/v8/src/ast-inl.h +34 -25
- data/lib/libv8/v8/src/ast.cc +141 -72
- data/lib/libv8/v8/src/ast.h +255 -181
- data/lib/libv8/v8/src/bignum.cc +3 -4
- data/lib/libv8/v8/src/bootstrapper.cc +55 -11
- data/lib/libv8/v8/src/bootstrapper.h +3 -2
- data/lib/libv8/v8/src/builtins.cc +8 -2
- data/lib/libv8/v8/src/builtins.h +4 -0
- data/lib/libv8/v8/src/cached-powers.cc +8 -4
- data/lib/libv8/v8/src/checks.h +3 -3
- data/lib/libv8/v8/src/code-stubs.cc +173 -28
- data/lib/libv8/v8/src/code-stubs.h +104 -148
- data/lib/libv8/v8/src/codegen.cc +8 -8
- data/lib/libv8/v8/src/compilation-cache.cc +2 -47
- data/lib/libv8/v8/src/compilation-cache.h +0 -10
- data/lib/libv8/v8/src/compiler.cc +27 -16
- data/lib/libv8/v8/src/compiler.h +13 -18
- data/lib/libv8/v8/src/contexts.cc +107 -72
- data/lib/libv8/v8/src/contexts.h +70 -34
- data/lib/libv8/v8/src/conversions-inl.h +572 -14
- data/lib/libv8/v8/src/conversions.cc +9 -707
- data/lib/libv8/v8/src/conversions.h +23 -12
- data/lib/libv8/v8/src/cpu-profiler-inl.h +2 -19
- data/lib/libv8/v8/src/cpu-profiler.cc +4 -21
- data/lib/libv8/v8/src/cpu-profiler.h +8 -17
- data/lib/libv8/v8/src/d8-debug.cc +5 -3
- data/lib/libv8/v8/src/d8-debug.h +6 -7
- data/lib/libv8/v8/src/d8-posix.cc +1 -10
- data/lib/libv8/v8/src/d8.cc +721 -219
- data/lib/libv8/v8/src/d8.gyp +37 -12
- data/lib/libv8/v8/src/d8.h +141 -19
- data/lib/libv8/v8/src/d8.js +17 -8
- data/lib/libv8/v8/src/date.js +16 -5
- data/lib/libv8/v8/src/dateparser-inl.h +242 -39
- data/lib/libv8/v8/src/dateparser.cc +38 -4
- data/lib/libv8/v8/src/dateparser.h +170 -28
- data/lib/libv8/v8/src/debug-agent.cc +5 -3
- data/lib/libv8/v8/src/debug-agent.h +11 -7
- data/lib/libv8/v8/src/debug-debugger.js +65 -34
- data/lib/libv8/v8/src/debug.cc +30 -60
- data/lib/libv8/v8/src/debug.h +5 -3
- data/lib/libv8/v8/src/deoptimizer.cc +227 -10
- data/lib/libv8/v8/src/deoptimizer.h +133 -9
- data/lib/libv8/v8/src/disassembler.cc +22 -14
- data/lib/libv8/v8/src/diy-fp.cc +4 -3
- data/lib/libv8/v8/src/diy-fp.h +3 -3
- data/lib/libv8/v8/src/elements.cc +634 -0
- data/lib/libv8/v8/src/elements.h +95 -0
- data/lib/libv8/v8/src/execution.cc +5 -21
- data/lib/libv8/v8/src/extensions/experimental/break-iterator.cc +3 -1
- data/lib/libv8/v8/src/extensions/experimental/break-iterator.h +1 -1
- data/lib/libv8/v8/src/extensions/experimental/collator.cc +6 -2
- data/lib/libv8/v8/src/extensions/experimental/collator.h +1 -2
- data/lib/libv8/v8/src/extensions/experimental/datetime-format.cc +384 -0
- data/lib/libv8/v8/src/extensions/experimental/datetime-format.h +83 -0
- data/lib/libv8/v8/src/extensions/experimental/experimental.gyp +18 -7
- data/lib/libv8/v8/src/extensions/experimental/i18n-extension.cc +12 -16
- data/lib/libv8/v8/src/extensions/experimental/i18n-extension.h +1 -1
- data/lib/libv8/v8/src/extensions/experimental/i18n-js2c.py +126 -0
- data/lib/libv8/v8/src/extensions/experimental/i18n-locale.cc +3 -4
- data/lib/libv8/v8/src/extensions/experimental/i18n-locale.h +1 -1
- data/lib/libv8/v8/src/{shell.h → extensions/experimental/i18n-natives.h} +8 -20
- data/lib/libv8/v8/src/extensions/experimental/i18n-utils.cc +45 -1
- data/lib/libv8/v8/src/extensions/experimental/i18n-utils.h +21 -1
- data/lib/libv8/v8/src/extensions/experimental/i18n.js +211 -11
- data/lib/libv8/v8/src/extensions/experimental/language-matcher.cc +4 -3
- data/lib/libv8/v8/src/extensions/experimental/language-matcher.h +1 -1
- data/lib/libv8/v8/src/extensions/experimental/number-format.cc +374 -0
- data/lib/libv8/v8/src/extensions/experimental/number-format.h +71 -0
- data/lib/libv8/v8/src/factory.cc +89 -18
- data/lib/libv8/v8/src/factory.h +36 -8
- data/lib/libv8/v8/src/flag-definitions.h +11 -44
- data/lib/libv8/v8/src/frames-inl.h +8 -1
- data/lib/libv8/v8/src/frames.cc +39 -3
- data/lib/libv8/v8/src/frames.h +10 -3
- data/lib/libv8/v8/src/full-codegen.cc +311 -293
- data/lib/libv8/v8/src/full-codegen.h +183 -143
- data/lib/libv8/v8/src/func-name-inferrer.cc +29 -15
- data/lib/libv8/v8/src/func-name-inferrer.h +19 -9
- data/lib/libv8/v8/src/gdb-jit.cc +658 -55
- data/lib/libv8/v8/src/gdb-jit.h +6 -2
- data/lib/libv8/v8/src/global-handles.cc +368 -312
- data/lib/libv8/v8/src/global-handles.h +29 -36
- data/lib/libv8/v8/src/globals.h +3 -1
- data/lib/libv8/v8/src/handles.cc +43 -69
- data/lib/libv8/v8/src/handles.h +21 -16
- data/lib/libv8/v8/src/heap-inl.h +11 -13
- data/lib/libv8/v8/src/heap-profiler.cc +0 -999
- data/lib/libv8/v8/src/heap-profiler.h +0 -303
- data/lib/libv8/v8/src/heap.cc +366 -141
- data/lib/libv8/v8/src/heap.h +87 -26
- data/lib/libv8/v8/src/hydrogen-instructions.cc +192 -81
- data/lib/libv8/v8/src/hydrogen-instructions.h +711 -482
- data/lib/libv8/v8/src/hydrogen.cc +1146 -629
- data/lib/libv8/v8/src/hydrogen.h +100 -64
- data/lib/libv8/v8/src/ia32/assembler-ia32.cc +19 -0
- data/lib/libv8/v8/src/ia32/assembler-ia32.h +15 -2
- data/lib/libv8/v8/src/ia32/builtins-ia32.cc +34 -39
- data/lib/libv8/v8/src/ia32/code-stubs-ia32.cc +675 -377
- data/lib/libv8/v8/src/ia32/code-stubs-ia32.h +8 -69
- data/lib/libv8/v8/src/ia32/codegen-ia32.cc +1 -0
- data/lib/libv8/v8/src/ia32/codegen-ia32.h +0 -2
- data/lib/libv8/v8/src/ia32/cpu-ia32.cc +3 -2
- data/lib/libv8/v8/src/ia32/deoptimizer-ia32.cc +28 -3
- data/lib/libv8/v8/src/ia32/disasm-ia32.cc +21 -10
- data/lib/libv8/v8/src/ia32/frames-ia32.h +6 -5
- data/lib/libv8/v8/src/ia32/full-codegen-ia32.cc +459 -465
- data/lib/libv8/v8/src/ia32/ic-ia32.cc +196 -147
- data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.cc +575 -650
- data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.h +19 -21
- data/lib/libv8/v8/src/ia32/lithium-gap-resolver-ia32.cc +7 -2
- data/lib/libv8/v8/src/ia32/lithium-ia32.cc +261 -256
- data/lib/libv8/v8/src/ia32/lithium-ia32.h +234 -335
- data/lib/libv8/v8/src/ia32/macro-assembler-ia32.cc +224 -67
- data/lib/libv8/v8/src/ia32/macro-assembler-ia32.h +63 -19
- data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.cc +22 -8
- data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.h +3 -0
- data/lib/libv8/v8/src/ia32/stub-cache-ia32.cc +380 -239
- data/lib/libv8/v8/src/ic.cc +198 -234
- data/lib/libv8/v8/src/ic.h +32 -30
- data/lib/libv8/v8/src/interpreter-irregexp.cc +6 -4
- data/lib/libv8/v8/src/isolate.cc +112 -95
- data/lib/libv8/v8/src/isolate.h +55 -71
- data/lib/libv8/v8/src/json-parser.h +486 -48
- data/lib/libv8/v8/src/json.js +28 -23
- data/lib/libv8/v8/src/jsregexp.cc +163 -208
- data/lib/libv8/v8/src/jsregexp.h +0 -1
- data/lib/libv8/v8/src/lithium-allocator-inl.h +29 -27
- data/lib/libv8/v8/src/lithium-allocator.cc +22 -17
- data/lib/libv8/v8/src/lithium-allocator.h +8 -8
- data/lib/libv8/v8/src/lithium.cc +16 -11
- data/lib/libv8/v8/src/lithium.h +31 -34
- data/lib/libv8/v8/src/liveedit.cc +111 -15
- data/lib/libv8/v8/src/liveedit.h +3 -4
- data/lib/libv8/v8/src/liveobjectlist.cc +116 -80
- data/lib/libv8/v8/src/liveobjectlist.h +2 -2
- data/lib/libv8/v8/src/log-inl.h +0 -4
- data/lib/libv8/v8/src/log-utils.cc +25 -143
- data/lib/libv8/v8/src/log-utils.h +13 -92
- data/lib/libv8/v8/src/log.cc +26 -249
- data/lib/libv8/v8/src/log.h +6 -17
- data/lib/libv8/v8/src/macros.py +9 -6
- data/lib/libv8/v8/src/mark-compact.cc +276 -56
- data/lib/libv8/v8/src/mark-compact.h +20 -0
- data/lib/libv8/v8/src/messages.js +93 -39
- data/lib/libv8/v8/src/mips/assembler-mips-inl.h +9 -3
- data/lib/libv8/v8/src/mips/assembler-mips.cc +297 -189
- data/lib/libv8/v8/src/mips/assembler-mips.h +121 -54
- data/lib/libv8/v8/src/mips/builtins-mips.cc +23 -24
- data/lib/libv8/v8/src/mips/code-stubs-mips.cc +484 -263
- data/lib/libv8/v8/src/mips/code-stubs-mips.h +8 -83
- data/lib/libv8/v8/src/mips/codegen-mips.h +0 -2
- data/lib/libv8/v8/src/mips/constants-mips.h +37 -11
- data/lib/libv8/v8/src/mips/deoptimizer-mips.cc +6 -1
- data/lib/libv8/v8/src/mips/frames-mips.h +8 -7
- data/lib/libv8/v8/src/mips/full-codegen-mips.cc +258 -419
- data/lib/libv8/v8/src/mips/ic-mips.cc +181 -121
- data/lib/libv8/v8/src/mips/macro-assembler-mips.cc +640 -382
- data/lib/libv8/v8/src/mips/macro-assembler-mips.h +94 -89
- data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.cc +23 -10
- data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.h +6 -1
- data/lib/libv8/v8/src/mips/simulator-mips.cc +249 -49
- data/lib/libv8/v8/src/mips/simulator-mips.h +25 -1
- data/lib/libv8/v8/src/mips/stub-cache-mips.cc +373 -161
- data/lib/libv8/v8/src/mirror-debugger.js +55 -8
- data/lib/libv8/v8/src/misc-intrinsics.h +89 -0
- data/lib/libv8/v8/src/mksnapshot.cc +36 -4
- data/lib/libv8/v8/src/natives.h +5 -2
- data/lib/libv8/v8/src/objects-debug.cc +73 -6
- data/lib/libv8/v8/src/objects-inl.h +529 -164
- data/lib/libv8/v8/src/objects-printer.cc +67 -12
- data/lib/libv8/v8/src/objects-visiting.cc +13 -2
- data/lib/libv8/v8/src/objects-visiting.h +41 -1
- data/lib/libv8/v8/src/objects.cc +2200 -1177
- data/lib/libv8/v8/src/objects.h +912 -283
- data/lib/libv8/v8/src/parser.cc +566 -371
- data/lib/libv8/v8/src/parser.h +35 -33
- data/lib/libv8/v8/src/platform-cygwin.cc +10 -25
- data/lib/libv8/v8/src/platform-freebsd.cc +4 -29
- data/lib/libv8/v8/src/platform-linux.cc +60 -57
- data/lib/libv8/v8/src/platform-macos.cc +4 -27
- data/lib/libv8/v8/src/platform-nullos.cc +3 -16
- data/lib/libv8/v8/src/platform-openbsd.cc +247 -85
- data/lib/libv8/v8/src/platform-posix.cc +43 -1
- data/lib/libv8/v8/src/platform-solaris.cc +151 -112
- data/lib/libv8/v8/src/platform-tls.h +1 -1
- data/lib/libv8/v8/src/platform-win32.cc +65 -39
- data/lib/libv8/v8/src/platform.h +17 -14
- data/lib/libv8/v8/src/preparse-data-format.h +2 -2
- data/lib/libv8/v8/src/preparse-data.h +8 -2
- data/lib/libv8/v8/src/preparser-api.cc +2 -18
- data/lib/libv8/v8/src/preparser.cc +106 -65
- data/lib/libv8/v8/src/preparser.h +26 -5
- data/lib/libv8/v8/src/prettyprinter.cc +25 -43
- data/lib/libv8/v8/src/profile-generator-inl.h +0 -4
- data/lib/libv8/v8/src/profile-generator.cc +213 -34
- data/lib/libv8/v8/src/profile-generator.h +9 -9
- data/lib/libv8/v8/src/property.h +1 -0
- data/lib/libv8/v8/src/proxy.js +74 -4
- data/lib/libv8/v8/src/regexp-macro-assembler.cc +10 -6
- data/lib/libv8/v8/src/regexp.js +16 -11
- data/lib/libv8/v8/src/rewriter.cc +24 -133
- data/lib/libv8/v8/src/runtime-profiler.cc +27 -151
- data/lib/libv8/v8/src/runtime-profiler.h +5 -31
- data/lib/libv8/v8/src/runtime.cc +1450 -681
- data/lib/libv8/v8/src/runtime.h +47 -31
- data/lib/libv8/v8/src/runtime.js +2 -1
- data/lib/libv8/v8/src/scanner-base.cc +358 -220
- data/lib/libv8/v8/src/scanner-base.h +30 -138
- data/lib/libv8/v8/src/scanner.cc +0 -18
- data/lib/libv8/v8/src/scanner.h +0 -15
- data/lib/libv8/v8/src/scopeinfo.cc +3 -1
- data/lib/libv8/v8/src/scopeinfo.h +1 -6
- data/lib/libv8/v8/src/scopes.cc +243 -253
- data/lib/libv8/v8/src/scopes.h +58 -109
- data/lib/libv8/v8/src/serialize.cc +12 -54
- data/lib/libv8/v8/src/serialize.h +47 -0
- data/lib/libv8/v8/src/small-pointer-list.h +25 -0
- data/lib/libv8/v8/src/spaces-inl.h +4 -50
- data/lib/libv8/v8/src/spaces.cc +64 -131
- data/lib/libv8/v8/src/spaces.h +19 -70
- data/lib/libv8/v8/src/string-stream.cc +3 -1
- data/lib/libv8/v8/src/string.js +10 -6
- data/lib/libv8/v8/src/strtod.cc +7 -3
- data/lib/libv8/v8/src/stub-cache.cc +59 -129
- data/lib/libv8/v8/src/stub-cache.h +42 -54
- data/lib/libv8/v8/src/third_party/valgrind/valgrind.h +1447 -1339
- data/lib/libv8/v8/src/token.cc +4 -4
- data/lib/libv8/v8/src/token.h +6 -5
- data/lib/libv8/v8/src/type-info.cc +173 -129
- data/lib/libv8/v8/src/type-info.h +40 -22
- data/lib/libv8/v8/src/utils.cc +25 -304
- data/lib/libv8/v8/src/utils.h +118 -3
- data/lib/libv8/v8/src/v8-counters.h +3 -6
- data/lib/libv8/v8/src/v8.cc +34 -27
- data/lib/libv8/v8/src/v8.h +7 -7
- data/lib/libv8/v8/src/v8conversions.cc +129 -0
- data/lib/libv8/v8/src/v8conversions.h +60 -0
- data/lib/libv8/v8/src/v8globals.h +15 -6
- data/lib/libv8/v8/src/v8natives.js +300 -78
- data/lib/libv8/v8/src/v8threads.cc +14 -6
- data/lib/libv8/v8/src/v8threads.h +4 -1
- data/lib/libv8/v8/src/v8utils.cc +360 -0
- data/lib/libv8/v8/src/v8utils.h +17 -66
- data/lib/libv8/v8/src/variables.cc +7 -12
- data/lib/libv8/v8/src/variables.h +12 -10
- data/lib/libv8/v8/src/version.cc +2 -2
- data/lib/libv8/v8/src/vm-state-inl.h +0 -41
- data/lib/libv8/v8/src/vm-state.h +0 -11
- data/lib/libv8/v8/src/weakmap.js +103 -0
- data/lib/libv8/v8/src/x64/assembler-x64.h +6 -3
- data/lib/libv8/v8/src/x64/builtins-x64.cc +25 -22
- data/lib/libv8/v8/src/x64/code-stubs-x64.cc +523 -250
- data/lib/libv8/v8/src/x64/code-stubs-x64.h +8 -71
- data/lib/libv8/v8/src/x64/codegen-x64.cc +1 -0
- data/lib/libv8/v8/src/x64/codegen-x64.h +0 -2
- data/lib/libv8/v8/src/x64/cpu-x64.cc +2 -1
- data/lib/libv8/v8/src/x64/deoptimizer-x64.cc +40 -8
- data/lib/libv8/v8/src/x64/disasm-x64.cc +12 -10
- data/lib/libv8/v8/src/x64/frames-x64.h +7 -6
- data/lib/libv8/v8/src/x64/full-codegen-x64.cc +310 -415
- data/lib/libv8/v8/src/x64/ic-x64.cc +180 -117
- data/lib/libv8/v8/src/x64/lithium-codegen-x64.cc +411 -523
- data/lib/libv8/v8/src/x64/lithium-codegen-x64.h +11 -6
- data/lib/libv8/v8/src/x64/lithium-x64.cc +191 -216
- data/lib/libv8/v8/src/x64/lithium-x64.h +112 -263
- data/lib/libv8/v8/src/x64/macro-assembler-x64.cc +177 -61
- data/lib/libv8/v8/src/x64/macro-assembler-x64.h +23 -7
- data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.cc +21 -9
- data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.h +6 -0
- data/lib/libv8/v8/src/x64/stub-cache-x64.cc +273 -107
- data/lib/libv8/v8/src/zone.cc +31 -22
- data/lib/libv8/v8/src/zone.h +12 -6
- data/lib/libv8/v8/tools/codemap.js +8 -0
- data/lib/libv8/v8/tools/gcmole/Makefile +43 -0
- data/lib/libv8/v8/tools/gcmole/gcmole.lua +0 -2
- data/lib/libv8/v8/tools/gdb-v8-support.py +154 -0
- data/lib/libv8/v8/tools/grokdump.py +44 -35
- data/lib/libv8/v8/tools/gyp/v8.gyp +94 -248
- data/lib/libv8/v8/tools/js2c.py +83 -52
- data/lib/libv8/v8/tools/linux-tick-processor +4 -6
- data/lib/libv8/v8/tools/ll_prof.py +3 -3
- data/lib/libv8/v8/tools/oom_dump/README +3 -1
- data/lib/libv8/v8/tools/presubmit.py +11 -4
- data/lib/libv8/v8/tools/profile.js +46 -2
- data/lib/libv8/v8/tools/splaytree.js +11 -0
- data/lib/libv8/v8/tools/stats-viewer.py +15 -11
- data/lib/libv8/v8/tools/test-wrapper-gypbuild.py +227 -0
- data/lib/libv8/v8/tools/test.py +28 -8
- data/lib/libv8/v8/tools/tickprocessor.js +0 -16
- data/lib/libv8/version.rb +1 -1
- data/libv8.gemspec +2 -2
- metadata +31 -19
- data/lib/libv8/scons/engine/SCons/Tool/f03.py +0 -63
- data/lib/libv8/v8/src/json-parser.cc +0 -504
|
@@ -289,6 +289,18 @@ class Simulator {
|
|
|
289
289
|
// Used for breakpoints and traps.
|
|
290
290
|
void SoftwareInterrupt(Instruction* instr);
|
|
291
291
|
|
|
292
|
+
// Stop helper functions.
|
|
293
|
+
bool IsWatchpoint(uint32_t code);
|
|
294
|
+
void PrintWatchpoint(uint32_t code);
|
|
295
|
+
void HandleStop(uint32_t code, Instruction* instr);
|
|
296
|
+
bool IsStopInstruction(Instruction* instr);
|
|
297
|
+
bool IsEnabledStop(uint32_t code);
|
|
298
|
+
void EnableStop(uint32_t code);
|
|
299
|
+
void DisableStop(uint32_t code);
|
|
300
|
+
void IncreaseStopCounter(uint32_t code);
|
|
301
|
+
void PrintStopInfo(uint32_t code);
|
|
302
|
+
|
|
303
|
+
|
|
292
304
|
// Executes one instruction.
|
|
293
305
|
void InstructionDecode(Instruction* instr);
|
|
294
306
|
// Execute one instruction placed in a branch delay slot.
|
|
@@ -354,6 +366,19 @@ class Simulator {
|
|
|
354
366
|
// Registered breakpoints.
|
|
355
367
|
Instruction* break_pc_;
|
|
356
368
|
Instr break_instr_;
|
|
369
|
+
|
|
370
|
+
// Stop is disabled if bit 31 is set.
|
|
371
|
+
static const uint32_t kStopDisabledBit = 1 << 31;
|
|
372
|
+
|
|
373
|
+
// A stop is enabled, meaning the simulator will stop when meeting the
|
|
374
|
+
// instruction, if bit 31 of watched_stops[code].count is unset.
|
|
375
|
+
// The value watched_stops[code].count & ~(1 << 31) indicates how many times
|
|
376
|
+
// the breakpoint was hit or gone through.
|
|
377
|
+
struct StopCountAndDesc {
|
|
378
|
+
uint32_t count;
|
|
379
|
+
char* desc;
|
|
380
|
+
};
|
|
381
|
+
StopCountAndDesc watched_stops[kMaxStopCode + 1];
|
|
357
382
|
};
|
|
358
383
|
|
|
359
384
|
|
|
@@ -398,4 +423,3 @@ class SimulatorStack : public v8::internal::AllStatic {
|
|
|
398
423
|
|
|
399
424
|
#endif // !defined(USE_SIMULATOR)
|
|
400
425
|
#endif // V8_MIPS_SIMULATOR_MIPS_H_
|
|
401
|
-
|
|
@@ -126,7 +126,7 @@ MUST_USE_RESULT static MaybeObject* GenerateDictionaryNegativeLookup(
|
|
|
126
126
|
|
|
127
127
|
// Check that receiver is a JSObject.
|
|
128
128
|
__ lbu(scratch0, FieldMemOperand(map, Map::kInstanceTypeOffset));
|
|
129
|
-
__ Branch(miss_label, lt, scratch0, Operand(
|
|
129
|
+
__ Branch(miss_label, lt, scratch0, Operand(FIRST_SPEC_OBJECT_TYPE));
|
|
130
130
|
|
|
131
131
|
// Load properties array.
|
|
132
132
|
Register properties = scratch0;
|
|
@@ -472,7 +472,8 @@ void StubCompiler::GenerateLoadMiss(MacroAssembler* masm, Code::Kind kind) {
|
|
|
472
472
|
static void GenerateCallFunction(MacroAssembler* masm,
|
|
473
473
|
Object* object,
|
|
474
474
|
const ParameterCount& arguments,
|
|
475
|
-
Label* miss
|
|
475
|
+
Label* miss,
|
|
476
|
+
Code::ExtraICState extra_ic_state) {
|
|
476
477
|
// ----------- S t a t e -------------
|
|
477
478
|
// -- a0: receiver
|
|
478
479
|
// -- a1: function to call
|
|
@@ -490,7 +491,10 @@ static void GenerateCallFunction(MacroAssembler* masm,
|
|
|
490
491
|
}
|
|
491
492
|
|
|
492
493
|
// Invoke the function.
|
|
493
|
-
|
|
494
|
+
CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state)
|
|
495
|
+
? CALL_AS_FUNCTION
|
|
496
|
+
: CALL_AS_METHOD;
|
|
497
|
+
__ InvokeFunction(a1, arguments, JUMP_FUNCTION, NullCallWrapper(), call_kind);
|
|
494
498
|
}
|
|
495
499
|
|
|
496
500
|
|
|
@@ -629,10 +633,12 @@ class CallInterceptorCompiler BASE_EMBEDDED {
|
|
|
629
633
|
public:
|
|
630
634
|
CallInterceptorCompiler(StubCompiler* stub_compiler,
|
|
631
635
|
const ParameterCount& arguments,
|
|
632
|
-
Register name
|
|
636
|
+
Register name,
|
|
637
|
+
Code::ExtraICState extra_ic_state)
|
|
633
638
|
: stub_compiler_(stub_compiler),
|
|
634
639
|
arguments_(arguments),
|
|
635
|
-
name_(name)
|
|
640
|
+
name_(name),
|
|
641
|
+
extra_ic_state_(extra_ic_state) {}
|
|
636
642
|
|
|
637
643
|
MaybeObject* Compile(MacroAssembler* masm,
|
|
638
644
|
JSObject* object,
|
|
@@ -760,8 +766,11 @@ class CallInterceptorCompiler BASE_EMBEDDED {
|
|
|
760
766
|
arguments_.immediate());
|
|
761
767
|
if (result->IsFailure()) return result;
|
|
762
768
|
} else {
|
|
769
|
+
CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_)
|
|
770
|
+
? CALL_AS_FUNCTION
|
|
771
|
+
: CALL_AS_METHOD;
|
|
763
772
|
__ InvokeFunction(optimization.constant_function(), arguments_,
|
|
764
|
-
JUMP_FUNCTION);
|
|
773
|
+
JUMP_FUNCTION, call_kind);
|
|
765
774
|
}
|
|
766
775
|
|
|
767
776
|
// Deferred code for fast API call case---clean preallocated space.
|
|
@@ -844,6 +853,7 @@ class CallInterceptorCompiler BASE_EMBEDDED {
|
|
|
844
853
|
StubCompiler* stub_compiler_;
|
|
845
854
|
const ParameterCount& arguments_;
|
|
846
855
|
Register name_;
|
|
856
|
+
Code::ExtraICState extra_ic_state_;
|
|
847
857
|
};
|
|
848
858
|
|
|
849
859
|
|
|
@@ -1503,7 +1513,7 @@ MaybeObject* CallStubCompiler::CompileCallField(JSObject* object,
|
|
|
1503
1513
|
Register reg = CheckPrototypes(object, a0, holder, a1, a3, t0, name, &miss);
|
|
1504
1514
|
GenerateFastPropertyLoad(masm(), a1, reg, holder, index);
|
|
1505
1515
|
|
|
1506
|
-
GenerateCallFunction(masm(), object, arguments(), &miss);
|
|
1516
|
+
GenerateCallFunction(masm(), object, arguments(), &miss, extra_ic_state_);
|
|
1507
1517
|
|
|
1508
1518
|
// Handle call cache miss.
|
|
1509
1519
|
__ bind(&miss);
|
|
@@ -2001,7 +2011,7 @@ MaybeObject* CallStubCompiler::CompileStringFromCharCodeCall(
|
|
|
2001
2011
|
// Tail call the full function. We do not have to patch the receiver
|
|
2002
2012
|
// because the function makes no use of it.
|
|
2003
2013
|
__ bind(&slow);
|
|
2004
|
-
__ InvokeFunction(function, arguments(), JUMP_FUNCTION);
|
|
2014
|
+
__ InvokeFunction(function, arguments(), JUMP_FUNCTION, CALL_AS_METHOD);
|
|
2005
2015
|
|
|
2006
2016
|
__ bind(&miss);
|
|
2007
2017
|
// a2: function name.
|
|
@@ -2086,9 +2096,7 @@ MaybeObject* CallStubCompiler::CompileMathFloorCall(Object* object,
|
|
|
2086
2096
|
|
|
2087
2097
|
// Retrieve FCSR and check for fpu errors.
|
|
2088
2098
|
__ cfc1(t5, FCSR);
|
|
2089
|
-
__
|
|
2090
|
-
// Flag 1 marks an inaccurate but still good result so we ignore it.
|
|
2091
|
-
__ And(t5, t5, Operand(kFCSRFlagMask ^ 1));
|
|
2099
|
+
__ And(t5, t5, Operand(kFCSRExceptionFlagMask));
|
|
2092
2100
|
__ Branch(&no_fpu_error, eq, t5, Operand(zero_reg));
|
|
2093
2101
|
|
|
2094
2102
|
// Check for NaN, Infinity, and -Infinity.
|
|
@@ -2137,7 +2145,7 @@ MaybeObject* CallStubCompiler::CompileMathFloorCall(Object* object,
|
|
|
2137
2145
|
__ bind(&slow);
|
|
2138
2146
|
// Tail call the full function. We do not have to patch the receiver
|
|
2139
2147
|
// because the function makes no use of it.
|
|
2140
|
-
__ InvokeFunction(function, arguments(), JUMP_FUNCTION);
|
|
2148
|
+
__ InvokeFunction(function, arguments(), JUMP_FUNCTION, CALL_AS_METHOD);
|
|
2141
2149
|
|
|
2142
2150
|
__ bind(&miss);
|
|
2143
2151
|
// a2: function name.
|
|
@@ -2239,7 +2247,7 @@ MaybeObject* CallStubCompiler::CompileMathAbsCall(Object* object,
|
|
|
2239
2247
|
// Tail call the full function. We do not have to patch the receiver
|
|
2240
2248
|
// because the function makes no use of it.
|
|
2241
2249
|
__ bind(&slow);
|
|
2242
|
-
__ InvokeFunction(function, arguments(), JUMP_FUNCTION);
|
|
2250
|
+
__ InvokeFunction(function, arguments(), JUMP_FUNCTION, CALL_AS_METHOD);
|
|
2243
2251
|
|
|
2244
2252
|
__ bind(&miss);
|
|
2245
2253
|
// a2: function name.
|
|
@@ -2425,7 +2433,10 @@ MaybeObject* CallStubCompiler::CompileCallConstant(Object* object,
|
|
|
2425
2433
|
UNREACHABLE();
|
|
2426
2434
|
}
|
|
2427
2435
|
|
|
2428
|
-
|
|
2436
|
+
CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_)
|
|
2437
|
+
? CALL_AS_FUNCTION
|
|
2438
|
+
: CALL_AS_METHOD;
|
|
2439
|
+
__ InvokeFunction(function, arguments(), JUMP_FUNCTION, call_kind);
|
|
2429
2440
|
|
|
2430
2441
|
// Handle call cache miss.
|
|
2431
2442
|
__ bind(&miss);
|
|
@@ -2459,7 +2470,7 @@ MaybeObject* CallStubCompiler::CompileCallInterceptor(JSObject* object,
|
|
|
2459
2470
|
// Get the receiver from the stack.
|
|
2460
2471
|
__ lw(a1, MemOperand(sp, argc * kPointerSize));
|
|
2461
2472
|
|
|
2462
|
-
CallInterceptorCompiler compiler(this, arguments(), a2);
|
|
2473
|
+
CallInterceptorCompiler compiler(this, arguments(), a2, extra_ic_state_);
|
|
2463
2474
|
MaybeObject* result = compiler.Compile(masm(),
|
|
2464
2475
|
object,
|
|
2465
2476
|
holder,
|
|
@@ -2479,7 +2490,7 @@ MaybeObject* CallStubCompiler::CompileCallInterceptor(JSObject* object,
|
|
|
2479
2490
|
// Restore receiver.
|
|
2480
2491
|
__ lw(a0, MemOperand(sp, argc * kPointerSize));
|
|
2481
2492
|
|
|
2482
|
-
GenerateCallFunction(masm(), object, arguments(), &miss);
|
|
2493
|
+
GenerateCallFunction(masm(), object, arguments(), &miss, extra_ic_state_);
|
|
2483
2494
|
|
|
2484
2495
|
// Handle call cache miss.
|
|
2485
2496
|
__ bind(&miss);
|
|
@@ -2491,13 +2502,11 @@ MaybeObject* CallStubCompiler::CompileCallInterceptor(JSObject* object,
|
|
|
2491
2502
|
}
|
|
2492
2503
|
|
|
2493
2504
|
|
|
2494
|
-
MaybeObject* CallStubCompiler::CompileCallGlobal(
|
|
2495
|
-
|
|
2496
|
-
|
|
2497
|
-
|
|
2498
|
-
|
|
2499
|
-
String* name,
|
|
2500
|
-
Code::ExtraICState extra_ic_state) {
|
|
2505
|
+
MaybeObject* CallStubCompiler::CompileCallGlobal(JSObject* object,
|
|
2506
|
+
GlobalObject* holder,
|
|
2507
|
+
JSGlobalPropertyCell* cell,
|
|
2508
|
+
JSFunction* function,
|
|
2509
|
+
String* name) {
|
|
2501
2510
|
// ----------- S t a t e -------------
|
|
2502
2511
|
// -- a2 : name
|
|
2503
2512
|
// -- ra : return address
|
|
@@ -2538,7 +2547,7 @@ MaybeObject* CallStubCompiler::CompileCallGlobal(
|
|
|
2538
2547
|
ASSERT(function->is_compiled());
|
|
2539
2548
|
Handle<Code> code(function->code());
|
|
2540
2549
|
ParameterCount expected(function->shared()->formal_parameter_count());
|
|
2541
|
-
CallKind call_kind = CallICBase::Contextual::decode(
|
|
2550
|
+
CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_)
|
|
2542
2551
|
? CALL_AS_FUNCTION
|
|
2543
2552
|
: CALL_AS_METHOD;
|
|
2544
2553
|
if (V8::UseCrankshaft()) {
|
|
@@ -3083,14 +3092,15 @@ MaybeObject* KeyedLoadStubCompiler::CompileLoadFunctionPrototype(String* name) {
|
|
|
3083
3092
|
}
|
|
3084
3093
|
|
|
3085
3094
|
|
|
3086
|
-
MaybeObject* KeyedLoadStubCompiler::
|
|
3095
|
+
MaybeObject* KeyedLoadStubCompiler::CompileLoadElement(Map* receiver_map) {
|
|
3087
3096
|
// ----------- S t a t e -------------
|
|
3088
3097
|
// -- ra : return address
|
|
3089
3098
|
// -- a0 : key
|
|
3090
3099
|
// -- a1 : receiver
|
|
3091
3100
|
// -----------------------------------
|
|
3092
|
-
MaybeObject* maybe_stub = KeyedLoadFastElementStub().TryGetCode();
|
|
3093
3101
|
Code* stub;
|
|
3102
|
+
JSObject::ElementsKind elements_kind = receiver_map->elements_kind();
|
|
3103
|
+
MaybeObject* maybe_stub = KeyedLoadElementStub(elements_kind).TryGetCode();
|
|
3094
3104
|
if (!maybe_stub->To(&stub)) return maybe_stub;
|
|
3095
3105
|
__ DispatchMap(a1,
|
|
3096
3106
|
a2,
|
|
@@ -3172,8 +3182,7 @@ MaybeObject* KeyedStoreStubCompiler::CompileStoreField(JSObject* object,
|
|
|
3172
3182
|
}
|
|
3173
3183
|
|
|
3174
3184
|
|
|
3175
|
-
MaybeObject* KeyedStoreStubCompiler::
|
|
3176
|
-
Map* receiver_map) {
|
|
3185
|
+
MaybeObject* KeyedStoreStubCompiler::CompileStoreElement(Map* receiver_map) {
|
|
3177
3186
|
// ----------- S t a t e -------------
|
|
3178
3187
|
// -- a0 : value
|
|
3179
3188
|
// -- a1 : key
|
|
@@ -3181,10 +3190,11 @@ MaybeObject* KeyedStoreStubCompiler::CompileStoreFastElement(
|
|
|
3181
3190
|
// -- ra : return address
|
|
3182
3191
|
// -- a3 : scratch
|
|
3183
3192
|
// -----------------------------------
|
|
3193
|
+
Code* stub;
|
|
3194
|
+
JSObject::ElementsKind elements_kind = receiver_map->elements_kind();
|
|
3184
3195
|
bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE;
|
|
3185
3196
|
MaybeObject* maybe_stub =
|
|
3186
|
-
|
|
3187
|
-
Code* stub;
|
|
3197
|
+
KeyedStoreElementStub(is_js_array, elements_kind).TryGetCode();
|
|
3188
3198
|
if (!maybe_stub->To(&stub)) return maybe_stub;
|
|
3189
3199
|
__ DispatchMap(a2,
|
|
3190
3200
|
a3,
|
|
@@ -3380,82 +3390,87 @@ MaybeObject* ConstructStubCompiler::CompileConstructStub(JSFunction* function) {
|
|
|
3380
3390
|
}
|
|
3381
3391
|
|
|
3382
3392
|
|
|
3383
|
-
|
|
3384
|
-
|
|
3385
|
-
// ----------- S t a t e -------------
|
|
3386
|
-
// -- ra : return address
|
|
3387
|
-
// -- a0 : key
|
|
3388
|
-
// -- a1 : receiver
|
|
3389
|
-
// -----------------------------------
|
|
3390
|
-
MaybeObject* maybe_stub =
|
|
3391
|
-
KeyedLoadExternalArrayStub(array_type).TryGetCode();
|
|
3392
|
-
Code* stub;
|
|
3393
|
-
if (!maybe_stub->To(&stub)) return maybe_stub;
|
|
3394
|
-
__ DispatchMap(a1,
|
|
3395
|
-
a2,
|
|
3396
|
-
Handle<Map>(receiver->map()),
|
|
3397
|
-
Handle<Code>(stub),
|
|
3398
|
-
DO_SMI_CHECK);
|
|
3393
|
+
#undef __
|
|
3394
|
+
#define __ ACCESS_MASM(masm)
|
|
3399
3395
|
|
|
3400
|
-
Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Miss();
|
|
3401
|
-
__ Jump(ic, RelocInfo::CODE_TARGET);
|
|
3402
3396
|
|
|
3403
|
-
|
|
3404
|
-
|
|
3405
|
-
|
|
3397
|
+
void KeyedLoadStubCompiler::GenerateLoadDictionaryElement(
|
|
3398
|
+
MacroAssembler* masm) {
|
|
3399
|
+
// ---------- S t a t e --------------
|
|
3400
|
+
// -- ra : return address
|
|
3401
|
+
// -- a0 : key
|
|
3402
|
+
// -- a1 : receiver
|
|
3403
|
+
// -----------------------------------
|
|
3404
|
+
Label slow, miss_force_generic;
|
|
3406
3405
|
|
|
3406
|
+
Register key = a0;
|
|
3407
|
+
Register receiver = a1;
|
|
3407
3408
|
|
|
3408
|
-
|
|
3409
|
-
|
|
3410
|
-
|
|
3411
|
-
|
|
3412
|
-
|
|
3413
|
-
// -- a2 : receiver
|
|
3414
|
-
// -- ra : return address
|
|
3415
|
-
// -----------------------------------
|
|
3416
|
-
MaybeObject* maybe_stub =
|
|
3417
|
-
KeyedStoreExternalArrayStub(array_type).TryGetCode();
|
|
3418
|
-
Code* stub;
|
|
3419
|
-
if (!maybe_stub->To(&stub)) return maybe_stub;
|
|
3420
|
-
__ DispatchMap(a2,
|
|
3421
|
-
a3,
|
|
3422
|
-
Handle<Map>(receiver->map()),
|
|
3423
|
-
Handle<Code>(stub),
|
|
3424
|
-
DO_SMI_CHECK);
|
|
3409
|
+
__ JumpIfNotSmi(key, &miss_force_generic);
|
|
3410
|
+
__ lw(t0, FieldMemOperand(receiver, JSObject::kElementsOffset));
|
|
3411
|
+
__ sra(a2, a0, kSmiTagSize);
|
|
3412
|
+
__ LoadFromNumberDictionary(&slow, t0, a0, v0, a2, a3, t1);
|
|
3413
|
+
__ Ret();
|
|
3425
3414
|
|
|
3426
|
-
|
|
3427
|
-
__
|
|
3415
|
+
// Slow case, key and receiver still in a0 and a1.
|
|
3416
|
+
__ bind(&slow);
|
|
3417
|
+
__ IncrementCounter(
|
|
3418
|
+
masm->isolate()->counters()->keyed_load_external_array_slow(),
|
|
3419
|
+
1, a2, a3);
|
|
3420
|
+
// Entry registers are intact.
|
|
3421
|
+
// ---------- S t a t e --------------
|
|
3422
|
+
// -- ra : return address
|
|
3423
|
+
// -- a0 : key
|
|
3424
|
+
// -- a1 : receiver
|
|
3425
|
+
// -----------------------------------
|
|
3426
|
+
Handle<Code> slow_ic =
|
|
3427
|
+
masm->isolate()->builtins()->KeyedLoadIC_Slow();
|
|
3428
|
+
__ Jump(slow_ic, RelocInfo::CODE_TARGET);
|
|
3428
3429
|
|
|
3429
|
-
|
|
3430
|
-
|
|
3430
|
+
// Miss case, call the runtime.
|
|
3431
|
+
__ bind(&miss_force_generic);
|
|
3431
3432
|
|
|
3433
|
+
// ---------- S t a t e --------------
|
|
3434
|
+
// -- ra : return address
|
|
3435
|
+
// -- a0 : key
|
|
3436
|
+
// -- a1 : receiver
|
|
3437
|
+
// -----------------------------------
|
|
3432
3438
|
|
|
3433
|
-
|
|
3434
|
-
|
|
3439
|
+
Handle<Code> miss_ic =
|
|
3440
|
+
masm->isolate()->builtins()->KeyedLoadIC_MissForceGeneric();
|
|
3441
|
+
__ Jump(miss_ic, RelocInfo::CODE_TARGET);
|
|
3442
|
+
}
|
|
3435
3443
|
|
|
3436
3444
|
|
|
3437
|
-
static bool IsElementTypeSigned(
|
|
3438
|
-
switch (
|
|
3439
|
-
case
|
|
3440
|
-
case
|
|
3441
|
-
case
|
|
3445
|
+
static bool IsElementTypeSigned(JSObject::ElementsKind elements_kind) {
|
|
3446
|
+
switch (elements_kind) {
|
|
3447
|
+
case JSObject::EXTERNAL_BYTE_ELEMENTS:
|
|
3448
|
+
case JSObject::EXTERNAL_SHORT_ELEMENTS:
|
|
3449
|
+
case JSObject::EXTERNAL_INT_ELEMENTS:
|
|
3442
3450
|
return true;
|
|
3443
3451
|
|
|
3444
|
-
case
|
|
3445
|
-
case
|
|
3446
|
-
case
|
|
3452
|
+
case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
|
|
3453
|
+
case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
|
|
3454
|
+
case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS:
|
|
3455
|
+
case JSObject::EXTERNAL_PIXEL_ELEMENTS:
|
|
3447
3456
|
return false;
|
|
3448
3457
|
|
|
3449
|
-
|
|
3458
|
+
case JSObject::EXTERNAL_FLOAT_ELEMENTS:
|
|
3459
|
+
case JSObject::EXTERNAL_DOUBLE_ELEMENTS:
|
|
3460
|
+
case JSObject::FAST_ELEMENTS:
|
|
3461
|
+
case JSObject::FAST_DOUBLE_ELEMENTS:
|
|
3462
|
+
case JSObject::DICTIONARY_ELEMENTS:
|
|
3463
|
+
case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS:
|
|
3450
3464
|
UNREACHABLE();
|
|
3451
3465
|
return false;
|
|
3452
3466
|
}
|
|
3467
|
+
return false;
|
|
3453
3468
|
}
|
|
3454
3469
|
|
|
3455
3470
|
|
|
3456
3471
|
void KeyedLoadStubCompiler::GenerateLoadExternalArray(
|
|
3457
3472
|
MacroAssembler* masm,
|
|
3458
|
-
|
|
3473
|
+
JSObject::ElementsKind elements_kind) {
|
|
3459
3474
|
// ---------- S t a t e --------------
|
|
3460
3475
|
// -- ra : return address
|
|
3461
3476
|
// -- a0 : key
|
|
@@ -3479,7 +3494,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray(
|
|
|
3479
3494
|
__ lw(t1, FieldMemOperand(a3, ExternalArray::kLengthOffset));
|
|
3480
3495
|
__ sra(t2, key, kSmiTagSize);
|
|
3481
3496
|
// Unsigned comparison catches both negative and too-large values.
|
|
3482
|
-
__ Branch(&miss_force_generic,
|
|
3497
|
+
__ Branch(&miss_force_generic, Ugreater_equal, key, Operand(t1));
|
|
3483
3498
|
|
|
3484
3499
|
__ lw(a3, FieldMemOperand(a3, ExternalArray::kExternalPointerOffset));
|
|
3485
3500
|
// a3: base pointer of external storage
|
|
@@ -3489,33 +3504,33 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray(
|
|
|
3489
3504
|
ASSERT((kSmiTag == 0) && (kSmiTagSize == 1));
|
|
3490
3505
|
|
|
3491
3506
|
Register value = a2;
|
|
3492
|
-
switch (
|
|
3493
|
-
case
|
|
3507
|
+
switch (elements_kind) {
|
|
3508
|
+
case JSObject::EXTERNAL_BYTE_ELEMENTS:
|
|
3494
3509
|
__ srl(t2, key, 1);
|
|
3495
3510
|
__ addu(t3, a3, t2);
|
|
3496
3511
|
__ lb(value, MemOperand(t3, 0));
|
|
3497
3512
|
break;
|
|
3498
|
-
case
|
|
3499
|
-
case
|
|
3513
|
+
case JSObject::EXTERNAL_PIXEL_ELEMENTS:
|
|
3514
|
+
case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
|
|
3500
3515
|
__ srl(t2, key, 1);
|
|
3501
3516
|
__ addu(t3, a3, t2);
|
|
3502
3517
|
__ lbu(value, MemOperand(t3, 0));
|
|
3503
3518
|
break;
|
|
3504
|
-
case
|
|
3519
|
+
case JSObject::EXTERNAL_SHORT_ELEMENTS:
|
|
3505
3520
|
__ addu(t3, a3, key);
|
|
3506
3521
|
__ lh(value, MemOperand(t3, 0));
|
|
3507
3522
|
break;
|
|
3508
|
-
case
|
|
3523
|
+
case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
|
|
3509
3524
|
__ addu(t3, a3, key);
|
|
3510
3525
|
__ lhu(value, MemOperand(t3, 0));
|
|
3511
3526
|
break;
|
|
3512
|
-
case
|
|
3513
|
-
case
|
|
3527
|
+
case JSObject::EXTERNAL_INT_ELEMENTS:
|
|
3528
|
+
case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS:
|
|
3514
3529
|
__ sll(t2, key, 1);
|
|
3515
3530
|
__ addu(t3, a3, t2);
|
|
3516
3531
|
__ lw(value, MemOperand(t3, 0));
|
|
3517
3532
|
break;
|
|
3518
|
-
case
|
|
3533
|
+
case JSObject::EXTERNAL_FLOAT_ELEMENTS:
|
|
3519
3534
|
__ sll(t3, t2, 2);
|
|
3520
3535
|
__ addu(t3, a3, t3);
|
|
3521
3536
|
if (CpuFeatures::IsSupported(FPU)) {
|
|
@@ -3525,7 +3540,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray(
|
|
|
3525
3540
|
__ lw(value, MemOperand(t3, 0));
|
|
3526
3541
|
}
|
|
3527
3542
|
break;
|
|
3528
|
-
case
|
|
3543
|
+
case JSObject::EXTERNAL_DOUBLE_ELEMENTS:
|
|
3529
3544
|
__ sll(t2, key, 2);
|
|
3530
3545
|
__ addu(t3, a3, t2);
|
|
3531
3546
|
if (CpuFeatures::IsSupported(FPU)) {
|
|
@@ -3537,7 +3552,10 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray(
|
|
|
3537
3552
|
__ lw(a3, MemOperand(t3, Register::kSizeInBytes));
|
|
3538
3553
|
}
|
|
3539
3554
|
break;
|
|
3540
|
-
|
|
3555
|
+
case JSObject::FAST_ELEMENTS:
|
|
3556
|
+
case JSObject::FAST_DOUBLE_ELEMENTS:
|
|
3557
|
+
case JSObject::DICTIONARY_ELEMENTS:
|
|
3558
|
+
case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS:
|
|
3541
3559
|
UNREACHABLE();
|
|
3542
3560
|
break;
|
|
3543
3561
|
}
|
|
@@ -3551,7 +3569,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray(
|
|
|
3551
3569
|
// f0: value (if FPU is supported)
|
|
3552
3570
|
// a2/a3: value (if FPU is not supported)
|
|
3553
3571
|
|
|
3554
|
-
if (
|
|
3572
|
+
if (elements_kind == JSObject::EXTERNAL_INT_ELEMENTS) {
|
|
3555
3573
|
// For the Int and UnsignedInt array types, we need to see whether
|
|
3556
3574
|
// the value can be represented in a Smi. If not, we need to convert
|
|
3557
3575
|
// it to a HeapNumber.
|
|
@@ -3593,7 +3611,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray(
|
|
|
3593
3611
|
__ sw(dst2, FieldMemOperand(v0, HeapNumber::kExponentOffset));
|
|
3594
3612
|
__ Ret();
|
|
3595
3613
|
}
|
|
3596
|
-
} else if (
|
|
3614
|
+
} else if (elements_kind == JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS) {
|
|
3597
3615
|
// The test is different for unsigned int values. Since we need
|
|
3598
3616
|
// the value to be in the range of a positive smi, we can't
|
|
3599
3617
|
// handle either of the top two bits being set in the value.
|
|
@@ -3620,7 +3638,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray(
|
|
|
3620
3638
|
// __ mtc1(zero_reg, f1); // MS 32-bits are all zero.
|
|
3621
3639
|
// __ cvt_d_l(f0, f0); // Use 64 bit conv to get correct unsigned 32-bit.
|
|
3622
3640
|
|
|
3623
|
-
__ Cvt_d_uw(f0, value);
|
|
3641
|
+
__ Cvt_d_uw(f0, value, f22);
|
|
3624
3642
|
|
|
3625
3643
|
__ sdc1(f0, MemOperand(v0, HeapNumber::kValueOffset - kHeapObjectTag));
|
|
3626
3644
|
|
|
@@ -3664,7 +3682,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray(
|
|
|
3664
3682
|
__ mov(v0, t2);
|
|
3665
3683
|
__ Ret();
|
|
3666
3684
|
}
|
|
3667
|
-
} else if (
|
|
3685
|
+
} else if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) {
|
|
3668
3686
|
// For the floating-point array type, we need to always allocate a
|
|
3669
3687
|
// HeapNumber.
|
|
3670
3688
|
if (CpuFeatures::IsSupported(FPU)) {
|
|
@@ -3731,7 +3749,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray(
|
|
|
3731
3749
|
__ Ret();
|
|
3732
3750
|
}
|
|
3733
3751
|
|
|
3734
|
-
} else if (
|
|
3752
|
+
} else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) {
|
|
3735
3753
|
if (CpuFeatures::IsSupported(FPU)) {
|
|
3736
3754
|
CpuFeatures::Scope scope(FPU);
|
|
3737
3755
|
// Allocate a HeapNumber for the result. Don't use a0 and a1 as
|
|
@@ -3785,7 +3803,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray(
|
|
|
3785
3803
|
|
|
3786
3804
|
void KeyedStoreStubCompiler::GenerateStoreExternalArray(
|
|
3787
3805
|
MacroAssembler* masm,
|
|
3788
|
-
|
|
3806
|
+
JSObject::ElementsKind elements_kind) {
|
|
3789
3807
|
// ---------- S t a t e --------------
|
|
3790
3808
|
// -- a0 : value
|
|
3791
3809
|
// -- a1 : key
|
|
@@ -3804,23 +3822,23 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
|
|
|
3804
3822
|
// This stub is meant to be tail-jumped to, the receiver must already
|
|
3805
3823
|
// have been verified by the caller to not be a smi.
|
|
3806
3824
|
|
|
3807
|
-
|
|
3808
|
-
|
|
3809
|
-
// Check that the key is a smi.
|
|
3825
|
+
// Check that the key is a smi.
|
|
3810
3826
|
__ JumpIfNotSmi(key, &miss_force_generic);
|
|
3811
3827
|
|
|
3828
|
+
__ lw(a3, FieldMemOperand(receiver, JSObject::kElementsOffset));
|
|
3829
|
+
|
|
3812
3830
|
// Check that the index is in range.
|
|
3813
3831
|
__ SmiUntag(t0, key);
|
|
3814
3832
|
__ lw(t1, FieldMemOperand(a3, ExternalArray::kLengthOffset));
|
|
3815
3833
|
// Unsigned comparison catches both negative and too-large values.
|
|
3816
|
-
__ Branch(&miss_force_generic, Ugreater_equal,
|
|
3834
|
+
__ Branch(&miss_force_generic, Ugreater_equal, key, Operand(t1));
|
|
3817
3835
|
|
|
3818
3836
|
// Handle both smis and HeapNumbers in the fast path. Go to the
|
|
3819
3837
|
// runtime for all other kinds of values.
|
|
3820
3838
|
// a3: external array.
|
|
3821
3839
|
// t0: key (integer).
|
|
3822
3840
|
|
|
3823
|
-
if (
|
|
3841
|
+
if (elements_kind == JSObject::EXTERNAL_PIXEL_ELEMENTS) {
|
|
3824
3842
|
// Double to pixel conversion is only implemented in the runtime for now.
|
|
3825
3843
|
__ JumpIfNotSmi(value, &slow);
|
|
3826
3844
|
} else {
|
|
@@ -3833,8 +3851,8 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
|
|
|
3833
3851
|
// t0: key (integer).
|
|
3834
3852
|
// t1: value (integer).
|
|
3835
3853
|
|
|
3836
|
-
switch (
|
|
3837
|
-
case
|
|
3854
|
+
switch (elements_kind) {
|
|
3855
|
+
case JSObject::EXTERNAL_PIXEL_ELEMENTS: {
|
|
3838
3856
|
// Clamp the value to [0..255].
|
|
3839
3857
|
// v0 is used as a scratch register here.
|
|
3840
3858
|
Label done;
|
|
@@ -3851,28 +3869,28 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
|
|
|
3851
3869
|
__ sb(t1, MemOperand(t8, 0));
|
|
3852
3870
|
}
|
|
3853
3871
|
break;
|
|
3854
|
-
case
|
|
3855
|
-
case
|
|
3872
|
+
case JSObject::EXTERNAL_BYTE_ELEMENTS:
|
|
3873
|
+
case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
|
|
3856
3874
|
__ addu(t8, a3, t0);
|
|
3857
3875
|
__ sb(t1, MemOperand(t8, 0));
|
|
3858
3876
|
break;
|
|
3859
|
-
case
|
|
3860
|
-
case
|
|
3877
|
+
case JSObject::EXTERNAL_SHORT_ELEMENTS:
|
|
3878
|
+
case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
|
|
3861
3879
|
__ sll(t8, t0, 1);
|
|
3862
3880
|
__ addu(t8, a3, t8);
|
|
3863
3881
|
__ sh(t1, MemOperand(t8, 0));
|
|
3864
3882
|
break;
|
|
3865
|
-
case
|
|
3866
|
-
case
|
|
3883
|
+
case JSObject::EXTERNAL_INT_ELEMENTS:
|
|
3884
|
+
case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS:
|
|
3867
3885
|
__ sll(t8, t0, 2);
|
|
3868
3886
|
__ addu(t8, a3, t8);
|
|
3869
3887
|
__ sw(t1, MemOperand(t8, 0));
|
|
3870
3888
|
break;
|
|
3871
|
-
case
|
|
3889
|
+
case JSObject::EXTERNAL_FLOAT_ELEMENTS:
|
|
3872
3890
|
// Perform int-to-float conversion and store to memory.
|
|
3873
3891
|
StoreIntAsFloat(masm, a3, t0, t1, t2, t3, t4);
|
|
3874
3892
|
break;
|
|
3875
|
-
case
|
|
3893
|
+
case JSObject::EXTERNAL_DOUBLE_ELEMENTS:
|
|
3876
3894
|
__ sll(t8, t0, 3);
|
|
3877
3895
|
__ addu(a3, a3, t8);
|
|
3878
3896
|
// a3: effective address of the double element
|
|
@@ -3894,7 +3912,10 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
|
|
|
3894
3912
|
__ sw(t3, MemOperand(a3, Register::kSizeInBytes));
|
|
3895
3913
|
}
|
|
3896
3914
|
break;
|
|
3897
|
-
|
|
3915
|
+
case JSObject::FAST_ELEMENTS:
|
|
3916
|
+
case JSObject::FAST_DOUBLE_ELEMENTS:
|
|
3917
|
+
case JSObject::DICTIONARY_ELEMENTS:
|
|
3918
|
+
case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS:
|
|
3898
3919
|
UNREACHABLE();
|
|
3899
3920
|
break;
|
|
3900
3921
|
}
|
|
@@ -3903,7 +3924,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
|
|
|
3903
3924
|
__ mov(v0, value);
|
|
3904
3925
|
__ Ret();
|
|
3905
3926
|
|
|
3906
|
-
if (
|
|
3927
|
+
if (elements_kind != JSObject::EXTERNAL_PIXEL_ELEMENTS) {
|
|
3907
3928
|
// a3: external array.
|
|
3908
3929
|
// t0: index (integer).
|
|
3909
3930
|
__ bind(&check_heap_number);
|
|
@@ -3924,56 +3945,43 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
|
|
|
3924
3945
|
|
|
3925
3946
|
__ ldc1(f0, FieldMemOperand(a0, HeapNumber::kValueOffset));
|
|
3926
3947
|
|
|
3927
|
-
if (
|
|
3948
|
+
if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) {
|
|
3928
3949
|
__ cvt_s_d(f0, f0);
|
|
3929
3950
|
__ sll(t8, t0, 2);
|
|
3930
3951
|
__ addu(t8, a3, t8);
|
|
3931
3952
|
__ swc1(f0, MemOperand(t8, 0));
|
|
3932
|
-
} else if (
|
|
3953
|
+
} else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) {
|
|
3933
3954
|
__ sll(t8, t0, 3);
|
|
3934
3955
|
__ addu(t8, a3, t8);
|
|
3935
3956
|
__ sdc1(f0, MemOperand(t8, 0));
|
|
3936
3957
|
} else {
|
|
3937
|
-
|
|
3938
|
-
|
|
3939
|
-
// Need to perform float-to-int conversion.
|
|
3940
|
-
// Test whether exponent equal to 0x7FF (infinity or NaN).
|
|
3941
|
-
|
|
3942
|
-
__ mfc1(t3, f1); // Move exponent word of double to t3 (as raw bits).
|
|
3943
|
-
__ li(t1, Operand(0x7FF00000));
|
|
3944
|
-
__ And(t3, t3, Operand(t1));
|
|
3945
|
-
__ Branch(USE_DELAY_SLOT, &done, eq, t3, Operand(t1));
|
|
3946
|
-
__ mov(t3, zero_reg); // In delay slot.
|
|
3947
|
-
|
|
3948
|
-
// Not infinity or NaN simply convert to int.
|
|
3949
|
-
if (IsElementTypeSigned(array_type)) {
|
|
3950
|
-
__ trunc_w_d(f0, f0);
|
|
3951
|
-
__ mfc1(t3, f0);
|
|
3952
|
-
} else {
|
|
3953
|
-
__ Trunc_uw_d(f0, t3);
|
|
3954
|
-
}
|
|
3958
|
+
__ EmitECMATruncate(t3, f0, f2, t2, t1, t5);
|
|
3955
3959
|
|
|
3956
|
-
|
|
3957
|
-
|
|
3958
|
-
|
|
3959
|
-
case kExternalByteArray:
|
|
3960
|
-
case kExternalUnsignedByteArray:
|
|
3960
|
+
switch (elements_kind) {
|
|
3961
|
+
case JSObject::EXTERNAL_BYTE_ELEMENTS:
|
|
3962
|
+
case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
|
|
3961
3963
|
__ addu(t8, a3, t0);
|
|
3962
3964
|
__ sb(t3, MemOperand(t8, 0));
|
|
3963
3965
|
break;
|
|
3964
|
-
case
|
|
3965
|
-
case
|
|
3966
|
+
case JSObject::EXTERNAL_SHORT_ELEMENTS:
|
|
3967
|
+
case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
|
|
3966
3968
|
__ sll(t8, t0, 1);
|
|
3967
3969
|
__ addu(t8, a3, t8);
|
|
3968
3970
|
__ sh(t3, MemOperand(t8, 0));
|
|
3969
3971
|
break;
|
|
3970
|
-
case
|
|
3971
|
-
case
|
|
3972
|
+
case JSObject::EXTERNAL_INT_ELEMENTS:
|
|
3973
|
+
case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS:
|
|
3972
3974
|
__ sll(t8, t0, 2);
|
|
3973
3975
|
__ addu(t8, a3, t8);
|
|
3974
3976
|
__ sw(t3, MemOperand(t8, 0));
|
|
3975
3977
|
break;
|
|
3976
|
-
|
|
3978
|
+
case JSObject::EXTERNAL_PIXEL_ELEMENTS:
|
|
3979
|
+
case JSObject::EXTERNAL_FLOAT_ELEMENTS:
|
|
3980
|
+
case JSObject::EXTERNAL_DOUBLE_ELEMENTS:
|
|
3981
|
+
case JSObject::FAST_ELEMENTS:
|
|
3982
|
+
case JSObject::FAST_DOUBLE_ELEMENTS:
|
|
3983
|
+
case JSObject::DICTIONARY_ELEMENTS:
|
|
3984
|
+
case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS:
|
|
3977
3985
|
UNREACHABLE();
|
|
3978
3986
|
break;
|
|
3979
3987
|
}
|
|
@@ -3989,7 +3997,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
|
|
|
3989
3997
|
__ lw(t3, FieldMemOperand(value, HeapNumber::kExponentOffset));
|
|
3990
3998
|
__ lw(t4, FieldMemOperand(value, HeapNumber::kMantissaOffset));
|
|
3991
3999
|
|
|
3992
|
-
if (
|
|
4000
|
+
if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) {
|
|
3993
4001
|
Label done, nan_or_infinity_or_zero;
|
|
3994
4002
|
static const int kMantissaInHiWordShift =
|
|
3995
4003
|
kBinary32MantissaBits - HeapNumber::kMantissaBitsInTopWord;
|
|
@@ -4054,7 +4062,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
|
|
|
4054
4062
|
__ srl(t4, t4, kMantissaInLoWordShift);
|
|
4055
4063
|
__ or_(t3, t6, t4);
|
|
4056
4064
|
__ Branch(&done);
|
|
4057
|
-
} else if (
|
|
4065
|
+
} else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) {
|
|
4058
4066
|
__ sll(t8, t0, 3);
|
|
4059
4067
|
__ addu(t8, a3, t8);
|
|
4060
4068
|
// t8: effective address of destination element.
|
|
@@ -4062,7 +4070,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
|
|
|
4062
4070
|
__ sw(t3, MemOperand(t8, Register::kSizeInBytes));
|
|
4063
4071
|
__ Ret();
|
|
4064
4072
|
} else {
|
|
4065
|
-
bool is_signed_type
|
|
4073
|
+
bool is_signed_type = IsElementTypeSigned(elements_kind);
|
|
4066
4074
|
int meaningfull_bits = is_signed_type ? (kBitsPerInt - 1) : kBitsPerInt;
|
|
4067
4075
|
int32_t min_value = is_signed_type ? 0x80000000 : 0x00000000;
|
|
4068
4076
|
|
|
@@ -4119,25 +4127,31 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
|
|
|
4119
4127
|
|
|
4120
4128
|
// Result is in t3.
|
|
4121
4129
|
// This switch block should be exactly the same as above (FPU mode).
|
|
4122
|
-
switch (
|
|
4123
|
-
case
|
|
4124
|
-
case
|
|
4130
|
+
switch (elements_kind) {
|
|
4131
|
+
case JSObject::EXTERNAL_BYTE_ELEMENTS:
|
|
4132
|
+
case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
|
|
4125
4133
|
__ addu(t8, a3, t0);
|
|
4126
4134
|
__ sb(t3, MemOperand(t8, 0));
|
|
4127
4135
|
break;
|
|
4128
|
-
case
|
|
4129
|
-
case
|
|
4136
|
+
case JSObject::EXTERNAL_SHORT_ELEMENTS:
|
|
4137
|
+
case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
|
|
4130
4138
|
__ sll(t8, t0, 1);
|
|
4131
4139
|
__ addu(t8, a3, t8);
|
|
4132
4140
|
__ sh(t3, MemOperand(t8, 0));
|
|
4133
4141
|
break;
|
|
4134
|
-
case
|
|
4135
|
-
case
|
|
4142
|
+
case JSObject::EXTERNAL_INT_ELEMENTS:
|
|
4143
|
+
case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS:
|
|
4136
4144
|
__ sll(t8, t0, 2);
|
|
4137
4145
|
__ addu(t8, a3, t8);
|
|
4138
4146
|
__ sw(t3, MemOperand(t8, 0));
|
|
4139
4147
|
break;
|
|
4140
|
-
|
|
4148
|
+
case JSObject::EXTERNAL_PIXEL_ELEMENTS:
|
|
4149
|
+
case JSObject::EXTERNAL_FLOAT_ELEMENTS:
|
|
4150
|
+
case JSObject::EXTERNAL_DOUBLE_ELEMENTS:
|
|
4151
|
+
case JSObject::FAST_ELEMENTS:
|
|
4152
|
+
case JSObject::FAST_DOUBLE_ELEMENTS:
|
|
4153
|
+
case JSObject::DICTIONARY_ELEMENTS:
|
|
4154
|
+
case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS:
|
|
4141
4155
|
UNREACHABLE();
|
|
4142
4156
|
break;
|
|
4143
4157
|
}
|
|
@@ -4215,6 +4229,75 @@ void KeyedLoadStubCompiler::GenerateLoadFastElement(MacroAssembler* masm) {
|
|
|
4215
4229
|
}
|
|
4216
4230
|
|
|
4217
4231
|
|
|
4232
|
+
void KeyedLoadStubCompiler::GenerateLoadFastDoubleElement(
|
|
4233
|
+
MacroAssembler* masm) {
|
|
4234
|
+
// ----------- S t a t e -------------
|
|
4235
|
+
// -- ra : return address
|
|
4236
|
+
// -- a0 : key
|
|
4237
|
+
// -- a1 : receiver
|
|
4238
|
+
// -----------------------------------
|
|
4239
|
+
Label miss_force_generic, slow_allocate_heapnumber;
|
|
4240
|
+
|
|
4241
|
+
Register key_reg = a0;
|
|
4242
|
+
Register receiver_reg = a1;
|
|
4243
|
+
Register elements_reg = a2;
|
|
4244
|
+
Register heap_number_reg = a2;
|
|
4245
|
+
Register indexed_double_offset = a3;
|
|
4246
|
+
Register scratch = t0;
|
|
4247
|
+
Register scratch2 = t1;
|
|
4248
|
+
Register scratch3 = t2;
|
|
4249
|
+
Register heap_number_map = t3;
|
|
4250
|
+
|
|
4251
|
+
// This stub is meant to be tail-jumped to, the receiver must already
|
|
4252
|
+
// have been verified by the caller to not be a smi.
|
|
4253
|
+
|
|
4254
|
+
// Check that the key is a smi.
|
|
4255
|
+
__ JumpIfNotSmi(key_reg, &miss_force_generic);
|
|
4256
|
+
|
|
4257
|
+
// Get the elements array.
|
|
4258
|
+
__ lw(elements_reg,
|
|
4259
|
+
FieldMemOperand(receiver_reg, JSObject::kElementsOffset));
|
|
4260
|
+
|
|
4261
|
+
// Check that the key is within bounds.
|
|
4262
|
+
__ lw(scratch, FieldMemOperand(elements_reg, FixedArray::kLengthOffset));
|
|
4263
|
+
__ Branch(&miss_force_generic, hs, key_reg, Operand(scratch));
|
|
4264
|
+
|
|
4265
|
+
// Load the upper word of the double in the fixed array and test for NaN.
|
|
4266
|
+
__ sll(scratch2, key_reg, kDoubleSizeLog2 - kSmiTagSize);
|
|
4267
|
+
__ Addu(indexed_double_offset, elements_reg, Operand(scratch2));
|
|
4268
|
+
uint32_t upper_32_offset = FixedArray::kHeaderSize + sizeof(kHoleNanLower32);
|
|
4269
|
+
__ lw(scratch, FieldMemOperand(indexed_double_offset, upper_32_offset));
|
|
4270
|
+
__ Branch(&miss_force_generic, eq, scratch, Operand(kHoleNanUpper32));
|
|
4271
|
+
|
|
4272
|
+
// Non-NaN. Allocate a new heap number and copy the double value into it.
|
|
4273
|
+
__ LoadRoot(heap_number_map, Heap::kHeapNumberMapRootIndex);
|
|
4274
|
+
__ AllocateHeapNumber(heap_number_reg, scratch2, scratch3,
|
|
4275
|
+
heap_number_map, &slow_allocate_heapnumber);
|
|
4276
|
+
|
|
4277
|
+
// Don't need to reload the upper 32 bits of the double, it's already in
|
|
4278
|
+
// scratch.
|
|
4279
|
+
__ sw(scratch, FieldMemOperand(heap_number_reg,
|
|
4280
|
+
HeapNumber::kExponentOffset));
|
|
4281
|
+
__ lw(scratch, FieldMemOperand(indexed_double_offset,
|
|
4282
|
+
FixedArray::kHeaderSize));
|
|
4283
|
+
__ sw(scratch, FieldMemOperand(heap_number_reg,
|
|
4284
|
+
HeapNumber::kMantissaOffset));
|
|
4285
|
+
|
|
4286
|
+
__ mov(v0, heap_number_reg);
|
|
4287
|
+
__ Ret();
|
|
4288
|
+
|
|
4289
|
+
__ bind(&slow_allocate_heapnumber);
|
|
4290
|
+
Handle<Code> slow_ic =
|
|
4291
|
+
masm->isolate()->builtins()->KeyedLoadIC_Slow();
|
|
4292
|
+
__ Jump(slow_ic, RelocInfo::CODE_TARGET);
|
|
4293
|
+
|
|
4294
|
+
__ bind(&miss_force_generic);
|
|
4295
|
+
Handle<Code> miss_ic =
|
|
4296
|
+
masm->isolate()->builtins()->KeyedLoadIC_MissForceGeneric();
|
|
4297
|
+
__ Jump(miss_ic, RelocInfo::CODE_TARGET);
|
|
4298
|
+
}
|
|
4299
|
+
|
|
4300
|
+
|
|
4218
4301
|
void KeyedStoreStubCompiler::GenerateStoreFastElement(MacroAssembler* masm,
|
|
4219
4302
|
bool is_js_array) {
|
|
4220
4303
|
// ----------- S t a t e -------------
|
|
@@ -4239,7 +4322,7 @@ void KeyedStoreStubCompiler::GenerateStoreFastElement(MacroAssembler* masm,
|
|
|
4239
4322
|
// have been verified by the caller to not be a smi.
|
|
4240
4323
|
|
|
4241
4324
|
// Check that the key is a smi.
|
|
4242
|
-
__ JumpIfNotSmi(
|
|
4325
|
+
__ JumpIfNotSmi(key_reg, &miss_force_generic);
|
|
4243
4326
|
|
|
4244
4327
|
// Get the elements array and make sure it is a fast element array, not 'cow'.
|
|
4245
4328
|
__ lw(elements_reg,
|
|
@@ -4278,6 +4361,135 @@ void KeyedStoreStubCompiler::GenerateStoreFastElement(MacroAssembler* masm,
|
|
|
4278
4361
|
}
|
|
4279
4362
|
|
|
4280
4363
|
|
|
4364
|
+
void KeyedStoreStubCompiler::GenerateStoreFastDoubleElement(
|
|
4365
|
+
MacroAssembler* masm,
|
|
4366
|
+
bool is_js_array) {
|
|
4367
|
+
// ----------- S t a t e -------------
|
|
4368
|
+
// -- a0 : value
|
|
4369
|
+
// -- a1 : key
|
|
4370
|
+
// -- a2 : receiver
|
|
4371
|
+
// -- ra : return address
|
|
4372
|
+
// -- a3 : scratch
|
|
4373
|
+
// -- t0 : scratch (elements_reg)
|
|
4374
|
+
// -- t1 : scratch (mantissa_reg)
|
|
4375
|
+
// -- t2 : scratch (exponent_reg)
|
|
4376
|
+
// -- t3 : scratch4
|
|
4377
|
+
// -----------------------------------
|
|
4378
|
+
Label miss_force_generic, smi_value, is_nan, maybe_nan, have_double_value;
|
|
4379
|
+
|
|
4380
|
+
Register value_reg = a0;
|
|
4381
|
+
Register key_reg = a1;
|
|
4382
|
+
Register receiver_reg = a2;
|
|
4383
|
+
Register scratch = a3;
|
|
4384
|
+
Register elements_reg = t0;
|
|
4385
|
+
Register mantissa_reg = t1;
|
|
4386
|
+
Register exponent_reg = t2;
|
|
4387
|
+
Register scratch4 = t3;
|
|
4388
|
+
|
|
4389
|
+
// This stub is meant to be tail-jumped to, the receiver must already
|
|
4390
|
+
// have been verified by the caller to not be a smi.
|
|
4391
|
+
__ JumpIfNotSmi(key_reg, &miss_force_generic);
|
|
4392
|
+
|
|
4393
|
+
__ lw(elements_reg,
|
|
4394
|
+
FieldMemOperand(receiver_reg, JSObject::kElementsOffset));
|
|
4395
|
+
|
|
4396
|
+
// Check that the key is within bounds.
|
|
4397
|
+
if (is_js_array) {
|
|
4398
|
+
__ lw(scratch, FieldMemOperand(receiver_reg, JSArray::kLengthOffset));
|
|
4399
|
+
} else {
|
|
4400
|
+
__ lw(scratch,
|
|
4401
|
+
FieldMemOperand(elements_reg, FixedArray::kLengthOffset));
|
|
4402
|
+
}
|
|
4403
|
+
// Compare smis, unsigned compare catches both negative and out-of-bound
|
|
4404
|
+
// indexes.
|
|
4405
|
+
__ Branch(&miss_force_generic, hs, key_reg, Operand(scratch));
|
|
4406
|
+
|
|
4407
|
+
// Handle smi values specially.
|
|
4408
|
+
__ JumpIfSmi(value_reg, &smi_value);
|
|
4409
|
+
|
|
4410
|
+
// Ensure that the object is a heap number
|
|
4411
|
+
__ CheckMap(value_reg,
|
|
4412
|
+
scratch,
|
|
4413
|
+
masm->isolate()->factory()->heap_number_map(),
|
|
4414
|
+
&miss_force_generic,
|
|
4415
|
+
DONT_DO_SMI_CHECK);
|
|
4416
|
+
|
|
4417
|
+
// Check for nan: all NaN values have a value greater (signed) than 0x7ff00000
|
|
4418
|
+
// in the exponent.
|
|
4419
|
+
__ li(scratch, Operand(kNaNOrInfinityLowerBoundUpper32));
|
|
4420
|
+
__ lw(exponent_reg, FieldMemOperand(value_reg, HeapNumber::kExponentOffset));
|
|
4421
|
+
__ Branch(&maybe_nan, ge, exponent_reg, Operand(scratch));
|
|
4422
|
+
|
|
4423
|
+
__ lw(mantissa_reg, FieldMemOperand(value_reg, HeapNumber::kMantissaOffset));
|
|
4424
|
+
|
|
4425
|
+
__ bind(&have_double_value);
|
|
4426
|
+
__ sll(scratch4, key_reg, kDoubleSizeLog2 - kSmiTagSize);
|
|
4427
|
+
__ Addu(scratch, elements_reg, Operand(scratch4));
|
|
4428
|
+
__ sw(mantissa_reg, FieldMemOperand(scratch, FixedDoubleArray::kHeaderSize));
|
|
4429
|
+
uint32_t offset = FixedDoubleArray::kHeaderSize + sizeof(kHoleNanLower32);
|
|
4430
|
+
__ sw(exponent_reg, FieldMemOperand(scratch, offset));
|
|
4431
|
+
__ Ret(USE_DELAY_SLOT);
|
|
4432
|
+
__ mov(v0, value_reg); // In delay slot.
|
|
4433
|
+
|
|
4434
|
+
__ bind(&maybe_nan);
|
|
4435
|
+
// Could be NaN or Infinity. If fraction is not zero, it's NaN, otherwise
|
|
4436
|
+
// it's an Infinity, and the non-NaN code path applies.
|
|
4437
|
+
__ li(scratch, Operand(kNaNOrInfinityLowerBoundUpper32));
|
|
4438
|
+
__ Branch(&is_nan, gt, exponent_reg, Operand(scratch));
|
|
4439
|
+
__ lw(mantissa_reg, FieldMemOperand(value_reg, HeapNumber::kMantissaOffset));
|
|
4440
|
+
__ Branch(&have_double_value, eq, mantissa_reg, Operand(zero_reg));
|
|
4441
|
+
|
|
4442
|
+
__ bind(&is_nan);
|
|
4443
|
+
// Load canonical NaN for storing into the double array.
|
|
4444
|
+
uint64_t nan_int64 = BitCast<uint64_t>(
|
|
4445
|
+
FixedDoubleArray::canonical_not_the_hole_nan_as_double());
|
|
4446
|
+
__ li(mantissa_reg, Operand(static_cast<uint32_t>(nan_int64)));
|
|
4447
|
+
__ li(exponent_reg, Operand(static_cast<uint32_t>(nan_int64 >> 32)));
|
|
4448
|
+
__ jmp(&have_double_value);
|
|
4449
|
+
|
|
4450
|
+
__ bind(&smi_value);
|
|
4451
|
+
__ Addu(scratch, elements_reg,
|
|
4452
|
+
Operand(FixedDoubleArray::kHeaderSize - kHeapObjectTag));
|
|
4453
|
+
__ sll(scratch4, key_reg, kDoubleSizeLog2 - kSmiTagSize);
|
|
4454
|
+
__ Addu(scratch, scratch, scratch4);
|
|
4455
|
+
// scratch is now effective address of the double element
|
|
4456
|
+
|
|
4457
|
+
FloatingPointHelper::Destination destination;
|
|
4458
|
+
if (CpuFeatures::IsSupported(FPU)) {
|
|
4459
|
+
destination = FloatingPointHelper::kFPURegisters;
|
|
4460
|
+
} else {
|
|
4461
|
+
destination = FloatingPointHelper::kCoreRegisters;
|
|
4462
|
+
}
|
|
4463
|
+
|
|
4464
|
+
Register untagged_value = receiver_reg;
|
|
4465
|
+
__ SmiUntag(untagged_value, value_reg);
|
|
4466
|
+
FloatingPointHelper::ConvertIntToDouble(
|
|
4467
|
+
masm,
|
|
4468
|
+
untagged_value,
|
|
4469
|
+
destination,
|
|
4470
|
+
f0,
|
|
4471
|
+
mantissa_reg,
|
|
4472
|
+
exponent_reg,
|
|
4473
|
+
scratch4,
|
|
4474
|
+
f2);
|
|
4475
|
+
if (destination == FloatingPointHelper::kFPURegisters) {
|
|
4476
|
+
CpuFeatures::Scope scope(FPU);
|
|
4477
|
+
__ sdc1(f0, MemOperand(scratch, 0));
|
|
4478
|
+
} else {
|
|
4479
|
+
__ sw(mantissa_reg, MemOperand(scratch, 0));
|
|
4480
|
+
__ sw(exponent_reg, MemOperand(scratch, Register::kSizeInBytes));
|
|
4481
|
+
}
|
|
4482
|
+
__ Ret(USE_DELAY_SLOT);
|
|
4483
|
+
__ mov(v0, value_reg); // In delay slot.
|
|
4484
|
+
|
|
4485
|
+
// Handle store cache miss, replacing the ic with the generic stub.
|
|
4486
|
+
__ bind(&miss_force_generic);
|
|
4487
|
+
Handle<Code> ic =
|
|
4488
|
+
masm->isolate()->builtins()->KeyedStoreIC_MissForceGeneric();
|
|
4489
|
+
__ Jump(ic, RelocInfo::CODE_TARGET);
|
|
4490
|
+
}
|
|
4491
|
+
|
|
4492
|
+
|
|
4281
4493
|
#undef __
|
|
4282
4494
|
|
|
4283
4495
|
} } // namespace v8::internal
|