Skip to content
  • ggaren@apple.com's avatar
    Refactored op_tear_off* to support activations that don't allocate space for 'arguments' · 63a291eb
    ggaren@apple.com authored
    https://bugs.webkit.org/show_bug.cgi?id=96231
    
    Reviewed by Gavin Barraclough.
    
    This is a step toward smaller activations.
    
    As a side-effect, this patch eliminates a load and branch from the hot path
    of activation tear-off by moving it to the cold path of arguments tear-off. Our
    optimizing assumptions are that activations are common and that reifying the
    arguments object is less common.
    
    * bytecode/CodeBlock.cpp:
    (JSC::CodeBlock::dump):
    * bytecode/Opcode.h:
    (JSC::padOpcodeName): Updated for new opcode lengths.
    
    * bytecompiler/BytecodeGenerator.cpp:
    (JSC::BytecodeGenerator::BytecodeGenerator):
    (JSC::BytecodeGenerator::addConstantValue): Added support for JSValue()
    in the bytecode, which we use when we have 'arguments' but no activation.
    
    (JSC::BytecodeGenerator::emitReturn): Always emit tear_off_arguments
    if we've allocated the arguments registers. This allows tear_off_activation
    not to worry about the arguments object anymore.
    
    Also, pass the activation and arguments values directly to these opcodes
    instead of requiring the opcodes to infer the values through special
    registers. This gives us more flexibility to move or eliminate registers.
    
    * dfg/DFGArgumentsSimplificationPhase.cpp:
    (JSC::DFG::ArgumentsSimplificationPhase::run):
    * dfg/DFGByteCodeParser.cpp:
    (JSC::DFG::ByteCodeParser::parseBlock):
    * dfg/DFGNode.h:
    (Node): Updated for new opcode lengths.
    
    * dfg/DFGOperations.cpp: Activation tear-off doesn't worry about the
    arguments object anymore. If 'arguments' is in use and reified, it's
    responsible for aliasing back to the activation object in tear_off_arguments.
    
    * dfg/DFGOperations.h:
    * dfg/DFGSpeculativeJIT.h:
    (JSC::DFG::SpeculativeJIT::callOperation):
    (SpeculativeJIT):
    * dfg/DFGSpeculativeJIT32_64.cpp:
    (JSC::DFG::SpeculativeJIT::compile):
    * dfg/DFGSpeculativeJIT64.cpp:
    (JSC::DFG::SpeculativeJIT::compile): Don't pass the arguments object to
    activation tear-off; do pass the activation object to arguments tear-off.
    
    * interpreter/Interpreter.cpp:
    (JSC::Interpreter::privateExecute): Ditto.
    
    * jit/JITOpcodes.cpp:
    (JSC::JIT::emit_op_tear_off_activation):
    (JSC::JIT::emit_op_tear_off_arguments):
    * jit/JITOpcodes32_64.cpp:
    (JSC::JIT::emit_op_tear_off_activation):
    (JSC::JIT::emit_op_tear_off_arguments):
    * jit/JITStubs.cpp:
    (JSC::DEFINE_STUB_FUNCTION):
    * llint/LLIntSlowPaths.cpp:
    (JSC::LLInt::LLINT_SLOW_PATH_DECL):
    * llint/LowLevelInterpreter32_64.asm:
    * llint/LowLevelInterpreter64.asm: Same change in a few more execution engines.
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@128096 268f45cc-cd09-0410-ab3c-d52691b4dbfc
    63a291eb