From: oliver@apple.com Date: Thu, 22 May 2008 19:36:52 +0000 (+0000) Subject: Bug 19116: SquirrelFish shouldn't regress on variable lookups X-Git-Url: http://git.webkit.org/?p=WebKit-https.git;a=commitdiff_plain;h=960bd0b4dd84934502eec60ff25898db79d4b3b1 Bug 19116: SquirrelFish shouldn't regress on variable lookups Reviewed by Darin. Last of the multiscope look up optimisations. This is a wash overall on SunSpider but is a factor of 5-10 improvement in multiscope read/write/modify (eg. ++, --, +=, ... applied to any non-local var). git-svn-id: https://svn.webkit.org/repository/webkit/trunk@34030 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- diff --git a/JavaScriptCore/ChangeLog b/JavaScriptCore/ChangeLog index 0bf09e4..45916da 100644 --- a/JavaScriptCore/ChangeLog +++ b/JavaScriptCore/ChangeLog @@ -1,3 +1,21 @@ +2008-05-22 Oliver Hunt + + Reviewed by Darin. + + Bug 19116: SquirrelFish shouldn't regress on variable lookups + + + Last of the multiscope look up optimisations. This is a wash overall on SunSpider + but is a factor of 5-10 improvement in multiscope read/write/modify (eg. ++, --, +=, + ... applied to any non-local var). + + * kjs/nodes.cpp: + (KJS::PostIncResolveNode::emitCode): + (KJS::PostDecResolveNode::emitCode): + (KJS::PreIncResolveNode::emitCode): + (KJS::PreDecResolveNode::emitCode): + (KJS::ReadModifyResolveNode::emitCode): + 2008-05-22 David Kilzer Add method to release free memory from FastMalloc diff --git a/JavaScriptCore/kjs/nodes.cpp b/JavaScriptCore/kjs/nodes.cpp index d4eb401..5a6e9d9 100644 --- a/JavaScriptCore/kjs/nodes.cpp +++ b/JavaScriptCore/kjs/nodes.cpp @@ -1742,6 +1742,15 @@ RegisterID* PostIncResolveNode::emitCode(CodeGenerator& generator, RegisterID* d return generator.emitPostInc(generator.finalDestination(dst), local); } + int index = 0; + size_t depth = 0; + if (generator.findScopedProperty(m_ident, index, depth) && index != missingSymbolMarker()) { + RefPtr value = generator.emitGetScopedVar(generator.newTemporary(), depth, index); + RegisterID* oldValue = generator.emitPostInc(generator.finalDestination(dst), value.get()); + generator.emitPutScopedVar(depth, index, value.get()); + return oldValue; + } + RefPtr value = generator.newTemporary(); RefPtr base = generator.emitResolveWithBase(generator.newTemporary(), value.get(), m_ident); RegisterID* oldValue = generator.emitPostInc(generator.finalDestination(dst), value.get()); @@ -1826,6 +1835,15 @@ RegisterID* PostDecResolveNode::emitCode(CodeGenerator& generator, RegisterID* d return generator.emitPostDec(generator.finalDestination(dst), local); } + int index = 0; + size_t depth = 0; + if (generator.findScopedProperty(m_ident, index, depth) && index != missingSymbolMarker()) { + RefPtr value = generator.emitGetScopedVar(generator.newTemporary(), depth, index); + RegisterID* oldValue = generator.emitPostDec(generator.finalDestination(dst), value.get()); + generator.emitPutScopedVar(depth, index, value.get()); + return oldValue; + } + RefPtr value = generator.newTemporary(); RefPtr base = generator.emitResolveWithBase(generator.newTemporary(), value.get(), m_ident); RegisterID* oldValue = generator.emitPostDec(generator.finalDestination(dst), value.get()); @@ -2349,7 +2367,16 @@ RegisterID* PreIncResolveNode::emitCode(CodeGenerator& generator, RegisterID* ds generator.emitPreInc(local); return generator.moveToDestinationIfNeeded(dst, local); } - + + int index = 0; + size_t depth = 0; + if (generator.findScopedProperty(m_ident, index, depth) && index != missingSymbolMarker()) { + RefPtr propDst = generator.emitGetScopedVar(generator.tempDestination(dst), depth, index); + generator.emitPreInc(propDst.get()); + generator.emitPutScopedVar(depth, index, propDst.get()); + return generator.moveToDestinationIfNeeded(dst, propDst.get());; + } + RefPtr propDst = generator.tempDestination(dst); RefPtr base = generator.emitResolveWithBase(generator.newTemporary(), propDst.get(), m_ident); generator.emitPreInc(propDst.get()); @@ -2421,6 +2448,15 @@ RegisterID* PreDecResolveNode::emitCode(CodeGenerator& generator, RegisterID* ds return generator.moveToDestinationIfNeeded(dst, local); } + int index = 0; + size_t depth = 0; + if (generator.findScopedProperty(m_ident, index, depth) && index != missingSymbolMarker()) { + RefPtr propDst = generator.emitGetScopedVar(generator.tempDestination(dst), depth, index); + generator.emitPreDec(propDst.get()); + generator.emitPutScopedVar(depth, index, propDst.get()); + return generator.moveToDestinationIfNeeded(dst, propDst.get());; + } + RefPtr propDst = generator.tempDestination(dst); RefPtr base = generator.emitResolveWithBase(generator.newTemporary(), propDst.get(), m_ident); generator.emitPreDec(propDst.get()); @@ -4183,6 +4219,16 @@ RegisterID* ReadModifyResolveNode::emitCode(CodeGenerator& generator, RegisterID return generator.moveToDestinationIfNeeded(dst, result); } + int index = 0; + size_t depth = 0; + if (generator.findScopedProperty(m_ident, index, depth) && index != missingSymbolMarker()) { + RefPtr src1 = generator.emitGetScopedVar(generator.tempDestination(dst), depth, index); + RegisterID* src2 = generator.emitNode(m_right.get()); + RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst, src1.get()), src1.get(), src2, m_operator); + generator.emitPutScopedVar(depth, index, result); + return result; + } + RefPtr src1 = generator.tempDestination(dst); RefPtr base = generator.emitResolveWithBase(generator.newTemporary(), src1.get(), m_ident); RegisterID* src2 = generator.emitNode(m_right.get());