Changeset 35593 in webkit for trunk/JavaScriptCore/kjs/nodes.cpp


Ignore:
Timestamp:
Aug 6, 2008, 3:37:34 AM (17 years ago)
Author:
[email protected]
Message:

2008-08-06 Cameron Zwarich <[email protected]>

Reviewed by Maciej.

Bug 20286: Load constants all at once instead of using op_load
<https://bugs.webkit.org/show_bug.cgi?id=20286>

Load constants all at once into temporary registers instead of using
individual instances of op_load.

This is a 2.6% speedup on SunSpider.

JavaScriptCore:

  • JavaScriptCore.exp:
  • VM/CodeBlock.cpp: (KJS::CodeBlock::dump): (KJS::CodeBlock::mark):
  • VM/CodeBlock.h:
  • VM/CodeGenerator.cpp: (KJS::CodeGenerator::CodeGenerator): (KJS::CodeGenerator::newTemporary): (KJS::CodeGenerator::addConstant): (KJS::CodeGenerator::addUnexpectedConstant): (KJS::CodeGenerator::emitLoad): (KJS::CodeGenerator::emitUnexpectedLoad): (KJS::CodeGenerator::emitNewError):
  • VM/CodeGenerator.h:
  • VM/Machine.cpp: (KJS::slideRegisterWindowForCall): (KJS::Machine::unwindCallFrame): (KJS::Machine::throwException): (KJS::Machine::execute): (KJS::Machine::privateExecute):
  • VM/Machine.h:
  • VM/Opcode.h:
  • VM/RegisterID.h: (KJS::RegisterID::RegisterID): (KJS::RegisterID::makeConstant): (KJS::RegisterID::isTemporary):
  • kjs/NodeInfo.h:
  • kjs/Parser.cpp: (KJS::Parser::didFinishParsing):
  • kjs/Parser.h: (KJS::Parser::parse):
  • kjs/grammar.y:
  • kjs/nodes.cpp: (KJS::NullNode::emitCode): (KJS::BooleanNode::emitCode): (KJS::NumberNode::emitCode): (KJS::StringNode::emitCode): (KJS::ArrayNode::emitCode): (KJS::DeleteResolveNode::emitCode): (KJS::DeleteValueNode::emitCode): (KJS::VoidNode::emitCode): (KJS::ConstDeclNode::emitCodeSingle): (KJS::ReturnNode::emitCode): (KJS::ScopeNode::ScopeNode): (KJS::ProgramNode::ProgramNode): (KJS::ProgramNode::create): (KJS::EvalNode::EvalNode): (KJS::EvalNode::create): (KJS::FunctionBodyNode::FunctionBodyNode): (KJS::FunctionBodyNode::create): (KJS::FunctionBodyNode::emitCode):
  • kjs/nodes.h: (KJS::ScopeNode::neededConstants):

LayoutTests:

  • fast/js/constant-count-expected.txt: Added.
  • fast/js/constant-count.html: Added.
  • fast/js/deep-recursion-test.html:
  • fast/js/resources/constant-count.js: Added.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kjs/nodes.cpp

    r35584 r35593  
    227227    if (dst == ignoredResult())
    228228        return 0;
    229     return generator.emitLoad(generator.finalDestination(dst), jsNull());
     229    return generator.emitLoad(dst, jsNull());
    230230}
    231231
     
    236236    if (dst == ignoredResult())
    237237        return 0;
    238     return generator.emitLoad(generator.finalDestination(dst), m_value);
     238    return generator.emitLoad(dst, m_value);
    239239}
    240240
     
    245245    if (dst == ignoredResult())
    246246        return 0;
    247     return generator.emitLoad(generator.finalDestination(dst), m_double);
     247    return generator.emitLoad(dst, m_double);
    248248}
    249249
     
    256256
    257257    // We atomize constant strings, in case they're later used in property lookup.
    258     return generator.emitLoad(generator.finalDestination(dst), jsOwnedString(generator.globalExec(), Identifier(generator.globalExec(), m_value).ustring()));
     258    return generator.emitLoad(dst, jsOwnedString(generator.globalExec(), Identifier(generator.globalExec(), m_value).ustring()));
    259259}
    260260
     
    324324
    325325    if (m_elision) {
    326         RegisterID* value = generator.emitLoad(generator.newTemporary(), jsNumber(generator.globalExec(), m_elision + length));
     326        RegisterID* value = generator.emitLoad(0, jsNumber(generator.globalExec(), m_elision + length));
    327327        generator.emitPutById(array.get(), generator.propertyNames().length, value);
    328328    }
     
    576576{
    577577    if (generator.registerForLocal(m_ident))
    578         return generator.emitLoad(generator.finalDestination(dst), false);
     578        return generator.emitUnexpectedLoad(generator.finalDestination(dst), false);
    579579
    580580    generator.emitExpressionInfo(m_divot, m_startOffset, m_endOffset);
     
    611611
    612612    // delete on a non-location expression ignores the value and returns true
    613     return generator.emitLoad(generator.finalDestination(dst), true);
     613    return generator.emitUnexpectedLoad(generator.finalDestination(dst), true);
    614614}
    615615
     
    623623    }
    624624    RefPtr<RegisterID> r0 = generator.emitNode(m_expr.get());
    625     return generator.emitLoad(generator.finalDestination(dst, r0.get()), jsUndefined());
     625    return generator.emitLoad(dst, jsUndefined());
    626626}
    627627
     
    10161016    // assign to the wrong base if m_ident exists in an intervening dynamic scope.
    10171017    RefPtr<RegisterID> base = generator.emitResolveBase(generator.newTemporary(), m_ident);
    1018     RegisterID* value = m_init ? generator.emitNode(m_init.get()) : generator.emitLoad(generator.newTemporary(), jsUndefined());
     1018    RegisterID* value = m_init ? generator.emitNode(m_init.get()) : generator.emitLoad(0, jsUndefined());
    10191019    return generator.emitPutById(base.get(), m_ident, value);
    10201020}
     
    13741374        return emitThrowError(generator, SyntaxError, "Invalid return statement.");
    13751375       
    1376     RegisterID* r0 = m_value ? generator.emitNode(dst, m_value.get()) : generator.emitLoad(generator.finalDestination(dst), jsUndefined());
     1376    RegisterID* r0 = m_value ? generator.emitNode(dst, m_value.get()) : generator.emitLoad(dst, jsUndefined());
    13771377    if (generator.scopeDepth()) {
    13781378        RefPtr<LabelID> l0 = generator.newLabel();
     
    16411641// ------------------------------ ScopeNode -----------------------------
    16421642
    1643 ScopeNode::ScopeNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure)
     1643ScopeNode::ScopeNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure, int numConstants)
    16441644    : BlockNode(globalData, children)
    16451645    , m_sourceURL(globalData->parser->sourceURL())
     
    16471647    , m_usesEval(usesEval)
    16481648    , m_needsClosure(needsClosure)
     1649    , m_numConstants(numConstants)
    16491650{
    16501651    if (varStack)
     
    16581659// ------------------------------ ProgramNode -----------------------------
    16591660
    1660 ProgramNode::ProgramNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider* sourceProvider, bool usesEval, bool needsClosure)
    1661     : ScopeNode(globalData, children, varStack, funcStack, usesEval, needsClosure)
     1661ProgramNode::ProgramNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider* sourceProvider, bool usesEval, bool needsClosure, int numConstants)
     1662    : ScopeNode(globalData, children, varStack, funcStack, usesEval, needsClosure, numConstants)
    16621663    , m_sourceProvider(sourceProvider)
    16631664{
    16641665}
    16651666
    1666 ProgramNode* ProgramNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider* sourceProvider, bool usesEval, bool needsClosure)
    1667 {
    1668     return new ProgramNode(globalData, children, varStack, funcStack, sourceProvider, usesEval, needsClosure);
     1667ProgramNode* ProgramNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider* sourceProvider, bool usesEval, bool needsClosure, int numConstants)
     1668{
     1669    return new ProgramNode(globalData, children, varStack, funcStack, sourceProvider, usesEval, needsClosure, numConstants);
    16691670}
    16701671
    16711672// ------------------------------ EvalNode -----------------------------
    16721673
    1673 EvalNode::EvalNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider* sourceProvider, bool usesEval, bool needsClosure)
    1674     : ScopeNode(globalData, children, varStack, funcStack, usesEval, needsClosure)
     1674EvalNode::EvalNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider* sourceProvider, bool usesEval, bool needsClosure, int numConstants)
     1675    : ScopeNode(globalData, children, varStack, funcStack, usesEval, needsClosure, numConstants)
    16751676    , m_sourceProvider(sourceProvider)
    16761677{
     
    17031704}
    17041705
    1705 EvalNode* EvalNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider* sourceProvider, bool usesEval, bool needsClosure)
    1706 {
    1707     return new EvalNode(globalData, children, varStack, funcStack, sourceProvider, usesEval, needsClosure);
     1706EvalNode* EvalNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider* sourceProvider, bool usesEval, bool needsClosure, int numConstants)
     1707{
     1708    return new EvalNode(globalData, children, varStack, funcStack, sourceProvider, usesEval, needsClosure, numConstants);
    17081709}
    17091710
    17101711// ------------------------------ FunctionBodyNode -----------------------------
    17111712
    1712 FunctionBodyNode::FunctionBodyNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure)
    1713     : ScopeNode(globalData, children, varStack, funcStack, usesEval, needsClosure)
     1713FunctionBodyNode::FunctionBodyNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure, int numConstants)
     1714    : ScopeNode(globalData, children, varStack, funcStack, usesEval, needsClosure, numConstants)
    17141715{
    17151716}
     
    17211722}
    17221723
    1723 FunctionBodyNode* FunctionBodyNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure)
    1724 {
    1725     return new FunctionBodyNode(globalData, children, varStack, funcStack, usesEval, needsClosure);
    1726 }
    1727 
    1728 FunctionBodyNode* FunctionBodyNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider*, bool usesEval, bool needsClosure)
    1729 {
    1730     return new FunctionBodyNode(globalData, children, varStack, funcStack, usesEval, needsClosure);
     1724FunctionBodyNode* FunctionBodyNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, bool usesEval, bool needsClosure, int numConstants)
     1725{
     1726    return new FunctionBodyNode(globalData, children, varStack, funcStack, usesEval, needsClosure, numConstants);
     1727}
     1728
     1729FunctionBodyNode* FunctionBodyNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, SourceProvider*, bool usesEval, bool needsClosure, int numConstants)
     1730{
     1731    return new FunctionBodyNode(globalData, children, varStack, funcStack, usesEval, needsClosure, numConstants);
    17311732}
    17321733
     
    17481749    statementListEmitCode(m_children, generator);
    17491750    if (!m_children.size() || !m_children.last()->isReturnNode()) {
    1750         RegisterID* r0 = generator.emitLoad(generator.newTemporary(), jsUndefined());
     1751        RegisterID* r0 = generator.emitLoad(0, jsUndefined());
    17511752        generator.emitDebugHook(WillLeaveCallFrame, firstLine(), lastLine());
    17521753        generator.emitReturn(r0);
Note: See TracChangeset for help on using the changeset viewer.