Changeset 34528 in webkit


Ignore:
Timestamp:
Jun 13, 2008 9:40:45 PM (16 years ago)
Author:
cwzwarich@webkit.org
Message:

2008-06-13 Cameron Zwarich <cwzwarich@uwaterloo.ca>

Reviewed by Maciej.

Eliminate the use of temporaries to store the left hand side of an
expression when the right hand side is a constant. This slightly
improves the generated bytecode for a few SunSpider tests, but it is
mostly in preparation for fixing

Bug 19484: More instructions needs to use temporary registers
<https://bugs.webkit.org/show_bug.cgi?id=19484>

  • VM/CodeGenerator.h: (KJS::CodeGenerator::leftHandSideNeedsCopy): (KJS::CodeGenerator::emitNodeForLeftHandSide):
  • kjs/nodes.cpp: (KJS::BracketAccessorNode::emitCode): (KJS::ReadModifyResolveNode::emitCode): (KJS::AssignDotNode::emitCode): (KJS::ReadModifyDotNode::emitCode): (KJS::AssignBracketNode::emitCode): (KJS::ReadModifyBracketNode::emitCode):
  • kjs/nodes.h: (KJS::ExpressionNode::): (KJS::FalseNode::): (KJS::TrueNode::): (KJS::NumberNode::): (KJS::StringNode::):
Location:
trunk/JavaScriptCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r34527 r34528  
     12008-06-13  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
     2
     3        Reviewed by Maciej.
     4
     5        Eliminate the use of temporaries to store the left hand side of an
     6        expression when the right hand side is a constant. This slightly
     7        improves the generated bytecode for a few SunSpider tests, but it is
     8        mostly in preparation for fixing
     9
     10        Bug 19484: More instructions needs to use temporary registers
     11        <https://bugs.webkit.org/show_bug.cgi?id=19484>
     12
     13        * VM/CodeGenerator.h:
     14        (KJS::CodeGenerator::leftHandSideNeedsCopy):
     15        (KJS::CodeGenerator::emitNodeForLeftHandSide):
     16        * kjs/nodes.cpp:
     17        (KJS::BracketAccessorNode::emitCode):
     18        (KJS::ReadModifyResolveNode::emitCode):
     19        (KJS::AssignDotNode::emitCode):
     20        (KJS::ReadModifyDotNode::emitCode):
     21        (KJS::AssignBracketNode::emitCode):
     22        (KJS::ReadModifyBracketNode::emitCode):
     23        * kjs/nodes.h:
     24        (KJS::ExpressionNode::):
     25        (KJS::FalseNode::):
     26        (KJS::TrueNode::):
     27        (KJS::NumberNode::):
     28        (KJS::StringNode::):
     29
    1302008-06-13  Maciej Stachowiak  <mjs@apple.com>
    231
  • trunk/JavaScriptCore/VM/CodeGenerator.h

    r34510 r34528  
    172172        }
    173173
    174         ALWAYS_INLINE bool leftHandSideNeedsCopy(bool rightHasAssignments)
    175         {
    176             return m_codeType != FunctionCode || m_codeBlock->needsFullScopeChain || rightHasAssignments;
    177         }
    178 
    179         ALWAYS_INLINE PassRefPtr<RegisterID> emitNodeForLeftHandSide(ExpressionNode* n, bool rightHasAssignments)
    180         {
    181             if (leftHandSideNeedsCopy(rightHasAssignments)) {
     174        ALWAYS_INLINE bool leftHandSideNeedsCopy(bool rightHasAssignments, bool rightIsConstant)
     175        {
     176            return (m_codeType != FunctionCode || m_codeBlock->needsFullScopeChain || rightHasAssignments) && !rightIsConstant;
     177        }
     178
     179        ALWAYS_INLINE PassRefPtr<RegisterID> emitNodeForLeftHandSide(ExpressionNode* n, bool rightHasAssignments, bool rightIsConstant)
     180        {
     181            if (leftHandSideNeedsCopy(rightHasAssignments, rightIsConstant)) {
    182182                PassRefPtr<RegisterID> dst = newTemporary();
    183183                emitNode(dst.get(), n);
  • trunk/JavaScriptCore/kjs/nodes.cpp

    r34500 r34528  
    410410RegisterID* BracketAccessorNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    411411{
    412     RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_subscriptHasAssignments);
     412    RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_subscriptHasAssignments, m_subscript.get()->isConstant());
    413413    RegisterID* property = generator.emitNode(m_subscript.get());
    414414
     
    10561056        }
    10571057       
    1058         if (generator.leftHandSideNeedsCopy(m_rightHasAssignments) && !m_right.get()->isNumber()) {
     1058        if (generator.leftHandSideNeedsCopy(m_rightHasAssignments, m_right.get()->isConstant())) {
    10591059            RefPtr<RegisterID> result = generator.newTemporary();
    10601060            generator.emitMove(result.get(), local);
     
    11161116RegisterID* AssignDotNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    11171117{
    1118     RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_rightHasAssignments);
     1118    RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_rightHasAssignments, m_right.get()->isConstant());
    11191119    RefPtr<RegisterID> value = generator.destinationForAssignResult(dst);
    11201120    RegisterID* result = generator.emitNode(value.get(), m_right.get());
     
    11271127RegisterID* ReadModifyDotNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    11281128{
    1129     RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_rightHasAssignments);
     1129    RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_rightHasAssignments, m_right.get()->isConstant());
    11301130    RefPtr<RegisterID> value = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident);
    11311131    RegisterID* change = generator.emitNode(m_right.get());
     
    11451145RegisterID* AssignBracketNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    11461146{
    1147     RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_subscriptHasAssignments || m_rightHasAssignments);
    1148     RefPtr<RegisterID> property = generator.emitNodeForLeftHandSide(m_subscript.get(), m_rightHasAssignments);
     1147    RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_subscriptHasAssignments || m_rightHasAssignments, m_subscript.get()->isConstant() && m_right.get()->isConstant());
     1148    RefPtr<RegisterID> property = generator.emitNodeForLeftHandSide(m_subscript.get(), m_rightHasAssignments, m_right.get()->isConstant());
    11491149    RefPtr<RegisterID> value = generator.destinationForAssignResult(dst);
    11501150    RegisterID* result = generator.emitNode(value.get(), m_right.get());
     
    11551155RegisterID* ReadModifyBracketNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    11561156{
    1157     RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_subscriptHasAssignments || m_rightHasAssignments);
    1158     RefPtr<RegisterID> property = generator.emitNodeForLeftHandSide(m_subscript.get(), m_rightHasAssignments);
     1157    RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_subscriptHasAssignments || m_rightHasAssignments, m_subscript.get()->isConstant() && m_right.get()->isConstant());
     1158    RefPtr<RegisterID> property = generator.emitNodeForLeftHandSide(m_subscript.get(), m_rightHasAssignments, m_right.get()->isConstant());
    11591159
    11601160    RefPtr<RegisterID> value = generator.emitGetByVal(generator.tempDestination(dst), base.get(), property.get());
  • trunk/JavaScriptCore/kjs/nodes.h

    r34373 r34528  
    209209
    210210        virtual bool isNumber() const KJS_FAST_CALL { return false; }
     211        virtual bool isConstant() const KJS_FAST_CALL { return false; }       
    211212        virtual bool isLocation() const KJS_FAST_CALL { return false; }
    212213        virtual bool isResolveNode() const KJS_FAST_CALL { return false; }
     
    260261        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
    261262
     263        virtual bool isConstant() const KJS_FAST_CALL { return true; }
    262264        virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    263265        virtual Precedence precedence() const { return PrecPrimary; }
     
    273275        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
    274276
     277        virtual bool isConstant() const KJS_FAST_CALL { return true; }
    275278        virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    276279        virtual Precedence precedence() const { return PrecPrimary; }
     
    302305
    303306        virtual bool isNumber() const KJS_FAST_CALL { return true; }
     307        virtual bool isConstant() const KJS_FAST_CALL { return true; }
    304308        double value() const KJS_FAST_CALL { return m_double; }
    305309        virtual void setValue(double d) KJS_FAST_CALL { m_double = d; }
     
    334338        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
    335339
     340        virtual bool isConstant() const KJS_FAST_CALL { return true; }
    336341        virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
    337342        virtual Precedence precedence() const { return PrecPrimary; }
Note: See TracChangeset for help on using the changeset viewer.