Changeset 34528 in webkit
- Timestamp:
- Jun 13, 2008 9:40:45 PM (16 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r34527 r34528 1 2008-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 1 30 2008-06-13 Maciej Stachowiak <mjs@apple.com> 2 31 -
trunk/JavaScriptCore/VM/CodeGenerator.h
r34510 r34528 172 172 } 173 173 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)) { 182 182 PassRefPtr<RegisterID> dst = newTemporary(); 183 183 emitNode(dst.get(), n); -
trunk/JavaScriptCore/kjs/nodes.cpp
r34500 r34528 410 410 RegisterID* BracketAccessorNode::emitCode(CodeGenerator& generator, RegisterID* dst) 411 411 { 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()); 413 413 RegisterID* property = generator.emitNode(m_subscript.get()); 414 414 … … 1056 1056 } 1057 1057 1058 if (generator.leftHandSideNeedsCopy(m_rightHasAssignments ) && !m_right.get()->isNumber()) {1058 if (generator.leftHandSideNeedsCopy(m_rightHasAssignments, m_right.get()->isConstant())) { 1059 1059 RefPtr<RegisterID> result = generator.newTemporary(); 1060 1060 generator.emitMove(result.get(), local); … … 1116 1116 RegisterID* AssignDotNode::emitCode(CodeGenerator& generator, RegisterID* dst) 1117 1117 { 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()); 1119 1119 RefPtr<RegisterID> value = generator.destinationForAssignResult(dst); 1120 1120 RegisterID* result = generator.emitNode(value.get(), m_right.get()); … … 1127 1127 RegisterID* ReadModifyDotNode::emitCode(CodeGenerator& generator, RegisterID* dst) 1128 1128 { 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()); 1130 1130 RefPtr<RegisterID> value = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident); 1131 1131 RegisterID* change = generator.emitNode(m_right.get()); … … 1145 1145 RegisterID* AssignBracketNode::emitCode(CodeGenerator& generator, RegisterID* dst) 1146 1146 { 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()); 1149 1149 RefPtr<RegisterID> value = generator.destinationForAssignResult(dst); 1150 1150 RegisterID* result = generator.emitNode(value.get(), m_right.get()); … … 1155 1155 RegisterID* ReadModifyBracketNode::emitCode(CodeGenerator& generator, RegisterID* dst) 1156 1156 { 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()); 1159 1159 1160 1160 RefPtr<RegisterID> value = generator.emitGetByVal(generator.tempDestination(dst), base.get(), property.get()); -
trunk/JavaScriptCore/kjs/nodes.h
r34373 r34528 209 209 210 210 virtual bool isNumber() const KJS_FAST_CALL { return false; } 211 virtual bool isConstant() const KJS_FAST_CALL { return false; } 211 212 virtual bool isLocation() const KJS_FAST_CALL { return false; } 212 213 virtual bool isResolveNode() const KJS_FAST_CALL { return false; } … … 260 261 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL; 261 262 263 virtual bool isConstant() const KJS_FAST_CALL { return true; } 262 264 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 263 265 virtual Precedence precedence() const { return PrecPrimary; } … … 273 275 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL; 274 276 277 virtual bool isConstant() const KJS_FAST_CALL { return true; } 275 278 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 276 279 virtual Precedence precedence() const { return PrecPrimary; } … … 302 305 303 306 virtual bool isNumber() const KJS_FAST_CALL { return true; } 307 virtual bool isConstant() const KJS_FAST_CALL { return true; } 304 308 double value() const KJS_FAST_CALL { return m_double; } 305 309 virtual void setValue(double d) KJS_FAST_CALL { m_double = d; } … … 334 338 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL; 335 339 340 virtual bool isConstant() const KJS_FAST_CALL { return true; } 336 341 virtual void streamTo(SourceStream&) const KJS_FAST_CALL; 337 342 virtual Precedence precedence() const { return PrecPrimary; }
Note: See TracChangeset
for help on using the changeset viewer.