Changeset 63946 in webkit


Ignore:
Timestamp:
Jul 22, 2010 8:24:53 PM (14 years ago)
Author:
oliver@apple.com
Message:

2010-07-22 Oliver Hunt <oliver@apple.com>

Reviewed by Gavin Barraclough.

Do more constant folding
https://bugs.webkit.org/show_bug.cgi?id=42867

Constant fold a few more operations. SunSpider says this is
a win but I suspect that's just code motion at play.

  • parser/ASTBuilder.h: (JSC::ASTBuilder::makeModNode): (JSC::ASTBuilder::makeURightShiftNode): (JSC::ASTBuilder::makeBitOrNode): (JSC::ASTBuilder::makeBitAndNode): (JSC::ASTBuilder::makeBitXOrNode): (JSC::ASTBuilder::makeBinaryNode):
Location:
trunk/JavaScriptCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r63882 r63946  
     12010-07-22  Oliver Hunt  <oliver@apple.com>
     2
     3        Reviewed by Gavin Barraclough.
     4
     5        Do more constant folding
     6        https://bugs.webkit.org/show_bug.cgi?id=42867
     7
     8        Constant fold a few more operations.  SunSpider says this is
     9        a win but I suspect that's just code motion at play.
     10
     11        * parser/ASTBuilder.h:
     12        (JSC::ASTBuilder::makeModNode):
     13        (JSC::ASTBuilder::makeURightShiftNode):
     14        (JSC::ASTBuilder::makeBitOrNode):
     15        (JSC::ASTBuilder::makeBitAndNode):
     16        (JSC::ASTBuilder::makeBitXOrNode):
     17        (JSC::ASTBuilder::makeBinaryNode):
     18
    1192010-07-22  Kent Hansen  <kent.hansen@nokia.com>
    220
  • trunk/JavaScriptCore/parser/ASTBuilder.h

    r63024 r63946  
    125125    ExpressionNode* makeMultNode(ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
    126126    ExpressionNode* makeDivNode(ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
     127    ExpressionNode* makeModNode(ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
    127128    ExpressionNode* makeAddNode(ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
    128129    ExpressionNode* makeSubNode(ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
     130    ExpressionNode* makeBitXOrNode(ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
     131    ExpressionNode* makeBitAndNode(ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
     132    ExpressionNode* makeBitOrNode(ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
    129133    ExpressionNode* makeLeftShiftNode(ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
    130134    ExpressionNode* makeRightShiftNode(ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
     135    ExpressionNode* makeURightShiftNode(ExpressionNode* left, ExpressionNode* right, bool rightHasAssignments);
    131136
    132137    ExpressionNode* createLogicalNot(ExpressionNode* expr) { return new (m_globalData) LogicalNotNode(m_globalData, expr); }
     
    691696}
    692697
     698ExpressionNode* ASTBuilder::makeModNode(ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
     699{
     700    expr1 = expr1->stripUnaryPlus();
     701    expr2 = expr2->stripUnaryPlus();
     702   
     703    if (expr1->isNumber() && expr2->isNumber())
     704        return createNumber(fmod(static_cast<NumberNode*>(expr1)->value(), static_cast<NumberNode*>(expr2)->value()));
     705    return new (m_globalData) ModNode(m_globalData, expr1, expr2, rightHasAssignments);
     706}
     707
    693708ExpressionNode* ASTBuilder::makeAddNode(ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
    694709{
     
    720735        return createNumber(toInt32(static_cast<NumberNode*>(expr1)->value()) >> (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f));
    721736    return new (m_globalData) RightShiftNode(m_globalData, expr1, expr2, rightHasAssignments);
     737}
     738
     739ExpressionNode* ASTBuilder::makeURightShiftNode(ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
     740{
     741    if (expr1->isNumber() && expr2->isNumber())
     742        return createNumber(toUInt32(static_cast<NumberNode*>(expr1)->value()) >> (toUInt32(static_cast<NumberNode*>(expr2)->value()) & 0x1f));
     743    return new (m_globalData) UnsignedRightShiftNode(m_globalData, expr1, expr2, rightHasAssignments);
     744}
     745
     746ExpressionNode* ASTBuilder::makeBitOrNode(ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
     747{
     748    if (expr1->isNumber() && expr2->isNumber())
     749        return createNumber(toInt32(static_cast<NumberNode*>(expr1)->value()) | toInt32(static_cast<NumberNode*>(expr2)->value()));
     750    return new (m_globalData) BitOrNode(m_globalData, expr1, expr2, rightHasAssignments);
     751}
     752
     753ExpressionNode* ASTBuilder::makeBitAndNode(ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
     754{
     755    if (expr1->isNumber() && expr2->isNumber())
     756        return createNumber(toInt32(static_cast<NumberNode*>(expr1)->value()) & toInt32(static_cast<NumberNode*>(expr2)->value()));
     757    return new (m_globalData) BitAndNode(m_globalData, expr1, expr2, rightHasAssignments);
     758}
     759
     760ExpressionNode* ASTBuilder::makeBitXOrNode(ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments)
     761{
     762    if (expr1->isNumber() && expr2->isNumber())
     763        return createNumber(toInt32(static_cast<NumberNode*>(expr1)->value()) ^ toInt32(static_cast<NumberNode*>(expr2)->value()));
     764    return new (m_globalData) BitXOrNode(m_globalData, expr1, expr2, rightHasAssignments);
    722765}
    723766
     
    764807
    765808    case BITOR:
    766         return new (m_globalData) BitOrNode(m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment);
     809        return makeBitOrNode(lhs.first, rhs.first, rhs.second.hasAssignment);
    767810
    768811    case BITXOR:
    769         return new (m_globalData) BitXOrNode(m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment);
     812        return makeBitXOrNode(lhs.first, rhs.first, rhs.second.hasAssignment);
    770813
    771814    case BITAND:
    772         return new (m_globalData) BitAndNode(m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment);
     815        return makeBitAndNode(lhs.first, rhs.first, rhs.second.hasAssignment);
    773816
    774817    case EQEQ:
     
    815858
    816859    case URSHIFT:
    817         return new (m_globalData) UnsignedRightShiftNode(m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment);
     860        return makeURightShiftNode(lhs.first, rhs.first, rhs.second.hasAssignment);
    818861
    819862    case PLUS:
     
    830873
    831874    case MOD:
    832         return new (m_globalData) ModNode(m_globalData, lhs.first, rhs.first, rhs.second.hasAssignment);
     875        return makeModNode(lhs.first, rhs.first, rhs.second.hasAssignment);
    833876    }
    834877    CRASH();
Note: See TracChangeset for help on using the changeset viewer.