2008-07-17 Geoffrey Garen <ggaren@apple.com>
authorggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 18 Jul 2008 04:00:28 +0000 (04:00 +0000)
committerggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 18 Jul 2008 04:00:28 +0000 (04:00 +0000)
        Reviewed by Oliver Hunt.

        Next step toward putting doubles in registers: Store constant pool
        entries as registers, not JSValue*s.

        SunSpider reports no change.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@35231 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/VM/CodeBlock.cpp
JavaScriptCore/VM/CodeBlock.h
JavaScriptCore/VM/CodeGenerator.cpp
JavaScriptCore/VM/Machine.cpp
JavaScriptCore/VM/Machine.h
JavaScriptCore/VM/Register.h

index a6aa4d3..9625a73 100644 (file)
@@ -1,5 +1,14 @@
 2008-07-17  Geoffrey Garen  <ggaren@apple.com>
 
+        Reviewed by Oliver Hunt.
+        
+        Next step toward putting doubles in registers: Store constant pool
+        entries as registers, not JSValue*s.
+        
+        SunSpider reports no change.
+
+2008-07-17  Geoffrey Garen  <ggaren@apple.com>
+
         Reviewed by John Sullivan and Oliver Hunt.
         
         A tiny bit of tidying in function call register allocation.
         (KJS::Register::):
         (KJS::Register::Register):
 
-2008-07-16  Geoffrey Garen  <ggaren@apple.com>
+2008-07-17  Geoffrey Garen  <ggaren@apple.com>
 
         Reviewed by Oliver Hunt.
         
index 76894eb..0d702d1 100644 (file)
@@ -48,15 +48,15 @@ static UString escapeQuotes(const UString& str)
     return result;
 }
 
-static UString valueToSourceString(ExecState* exec, JSValue* val) 
+static UString valueToSourceString(ExecState* exec, const Register& val)
 {
-    if (val->isString()) {
+    if (val.isString()) {
         UString result("\"");
-        result += escapeQuotes(val->toString(exec)) + "\"";
+        result += escapeQuotes(val.toString(exec)) + "\"";
         return result;
     } 
 
-    return val->toString(exec);
+    return val.toString(exec);
 }
 
 static CString registerName(int r)
@@ -67,7 +67,7 @@ static CString registerName(int r)
     return (UString("tr") + UString::from(r)).UTF8String();
 }
 
-static CString constantName(ExecState* exec, int k, JSValue* value)
+static CString constantName(ExecState* exec, int k, const Register& value)
 {
     return (valueToSourceString(exec, value) + "(@k" + UString::from(k) + ")").UTF8String();
 }
@@ -171,13 +171,13 @@ void CodeBlock::dump(ExecState* exec) const
         } while (i != identifiers.size());
     }
 
-    if (jsValues.size()) {
+    if (registers.size()) {
         printf("\nConstants:\n");
         size_t i = 0;
         do {
-            printf("  k%u = %s\n", static_cast<unsigned>(i), valueToSourceString(exec, jsValues[i]).ascii());
+            printf("  k%u = %s\n", static_cast<unsigned>(i), valueToSourceString(exec, registers[i]).ascii());
             ++i;
-        } while (i < jsValues.size());
+        } while (i < registers.size());
     }
     
     if (regexps.size()) {
@@ -208,7 +208,7 @@ void CodeBlock::dump(ExecState* exec, const Vector<Instruction>::const_iterator&
         case op_load: {
             int r0 = (++it)->u.operand;
             int k0 = (++it)->u.operand;
-            printf("[%4d] load\t\t %s, %s\t\t\n", location, registerName(r0).c_str(), constantName(exec, k0, jsValues[k0]).c_str());
+            printf("[%4d] load\t\t %s, %s\t\t\n", location, registerName(r0).c_str(), constantName(exec, k0, registers[k0]).c_str());
             break;
         }
         case op_new_object: {
@@ -587,7 +587,7 @@ void CodeBlock::dump(ExecState* exec, const Vector<Instruction>::const_iterator&
             int r0 = (++it)->u.operand;
             int errorType = (++it)->u.operand;
             int k0 = (++it)->u.operand;
-            printf("[%4d] new_error\t %s, %d, %s\n", location, registerName(r0).c_str(), errorType, constantName(exec, k0, jsValues[k0]).c_str());
+            printf("[%4d] new_error\t %s, %d, %s\n", location, registerName(r0).c_str(), errorType, constantName(exec, k0, registers[k0]).c_str());
             break;
         }
         case op_jsr: {
@@ -622,9 +622,9 @@ void CodeBlock::dump(ExecState* exec, const Vector<Instruction>::const_iterator&
 
 void CodeBlock::mark()
 {
-    for (size_t i = 0; i < jsValues.size(); ++i)
-        if (!jsValues[i]->marked())
-            jsValues[i]->mark();
+    for (size_t i = 0; i < registers.size(); ++i)
+        if (!registers[i].marked())
+            registers[i].mark();
 
     for (size_t i = 0; i < functions.size(); ++i)
         functions[i]->body()->mark();
index 39df1df..80adb9a 100644 (file)
@@ -90,7 +90,7 @@ namespace KJS {
         Vector<Identifier> identifiers;
         Vector<RefPtr<FuncDeclNode> > functions;
         Vector<RefPtr<FuncExprNode> > functionExpressions;
-        Vector<JSValue*> jsValues;
+        Vector<Register> registers;
         Vector<RefPtr<RegExp> > regexps;
         Vector<HandlerInfo> exceptionHandlers;
         Vector<LineInfo> lineInfo;
index 0ad29aa..768ec47 100644 (file)
@@ -521,9 +521,9 @@ unsigned CodeGenerator::addConstant(const Identifier& ident)
 
 unsigned CodeGenerator::addConstant(JSValue* v)
 {
-    pair<JSValueMap::iterator, bool> result = m_jsValueMap.add(v, m_codeBlock->jsValues.size());
+    pair<JSValueMap::iterator, bool> result = m_jsValueMap.add(v, m_codeBlock->registers.size());
     if (result.second) // new entry
-        m_codeBlock->jsValues.append(v);
+        m_codeBlock->registers.append(v);
 
     return result.first->second;
 }
index bd1d896..eae758f 100644 (file)
@@ -574,7 +574,7 @@ bool Machine::isOpcode(Opcode opcode)
 #endif
 }
 
-NEVER_INLINE bool Machine::unwindCallFrame(ExecState* exec, JSValue* exceptionValue, const Instruction*& vPC, CodeBlock*& codeBlock, JSValue**& k, ScopeChainNode*& scopeChain, Register*& r)
+NEVER_INLINE bool Machine::unwindCallFrame(ExecState* exec, JSValue* exceptionValue, const Instruction*& vPC, CodeBlock*& codeBlock, Register*& k, ScopeChainNode*& scopeChain, Register*& r)
 {
     CodeBlock* oldCodeBlock = codeBlock;
     Register* callFrame = r - oldCodeBlock->numLocals - RegisterFile::CallFrameHeaderSize;
@@ -607,7 +607,7 @@ NEVER_INLINE bool Machine::unwindCallFrame(ExecState* exec, JSValue* exceptionVa
     if (!codeBlock)
         return false;
 
-    k = codeBlock->jsValues.data();
+    k = codeBlock->registers.data();
     scopeChain = callFrame[RegisterFile::CallerScopeChain].scopeChain();
     r = callFrame[RegisterFile::CallerRegisters].r();
     exec->m_callFrame = r - oldCodeBlock->numLocals - RegisterFile::CallFrameHeaderSize;
@@ -616,7 +616,7 @@ NEVER_INLINE bool Machine::unwindCallFrame(ExecState* exec, JSValue* exceptionVa
     return true;
 }
 
-NEVER_INLINE Instruction* Machine::throwException(ExecState* exec, JSValue* exceptionValue, const Instruction* vPC, CodeBlock*& codeBlock, JSValue**& k, ScopeChainNode*& scopeChain, Register*& r)
+NEVER_INLINE Instruction* Machine::throwException(ExecState* exec, JSValue* exceptionValue, const Instruction* vPC, CodeBlock*& codeBlock, Register*& k, ScopeChainNode*& scopeChain, Register*& r)
 {
     // Set up the exception object
 
@@ -977,7 +977,7 @@ JSValue* Machine::privateExecute(ExecutionFlag flag, ExecState* exec, RegisterFi
 
     Register* registerBase = registerFile->base();
     Instruction* vPC = codeBlock->instructions.begin();
-    JSValue** k = codeBlock->jsValues.data();
+    Register* k = codeBlock->registers.data();
     Profiler** enabledProfilerReference = Profiler::enabledProfilerReference();
     unsigned tickCount = m_ticksUntilNextTimeoutCheck + 1;
 
@@ -2247,7 +2247,7 @@ JSValue* Machine::privateExecute(ExecutionFlag flag, ExecState* exec, RegisterFi
 
             codeBlock = newCodeBlock;
             setScopeChain(exec, scopeChain, scopeChainForCall(exec, functionBodyNode, codeBlock, callDataScopeChain, r));
-            k = codeBlock->jsValues.data();
+            k = codeBlock->registers.data();
             vPC = codeBlock->instructions.begin();
 
 #if DUMP_OPCODE_STATS
@@ -2316,7 +2316,7 @@ JSValue* Machine::privateExecute(ExecutionFlag flag, ExecState* exec, RegisterFi
         if (!codeBlock)
             return returnValue;
 
-        k = codeBlock->jsValues.data();
+        k = codeBlock->registers.data();
         vPC = callFrame[RegisterFile::ReturnVPC].vPC();
         setScopeChain(exec, scopeChain, callFrame[RegisterFile::CallerScopeChain].scopeChain());
         r = callFrame[RegisterFile::CallerRegisters].r();
@@ -2378,7 +2378,7 @@ JSValue* Machine::privateExecute(ExecutionFlag flag, ExecState* exec, RegisterFi
 
             codeBlock = newCodeBlock;
             setScopeChain(exec, scopeChain, scopeChainForCall(exec, functionBodyNode, codeBlock, callDataScopeChain, r));
-            k = codeBlock->jsValues.data();
+            k = codeBlock->registers.data();
             vPC = codeBlock->instructions.begin();
 
             NEXT_OPCODE;
@@ -2549,7 +2549,7 @@ JSValue* Machine::privateExecute(ExecutionFlag flag, ExecState* exec, RegisterFi
         int type = (++vPC)->u.operand;
         int message = (++vPC)->u.operand;
 
-        r[dst] = Error::create(exec, (ErrorType)type, k[message]->toString(exec), codeBlock->lineNumberForVPC(vPC), codeBlock->ownerNode->sourceId(), codeBlock->ownerNode->sourceURL());
+        r[dst] = Error::create(exec, (ErrorType)type, k[message].toString(exec), codeBlock->lineNumberForVPC(vPC), codeBlock->ownerNode->sourceId(), codeBlock->ownerNode->sourceURL());
 
         ++vPC;
         NEXT_OPCODE;
index 021d91a..b33732d 100644 (file)
@@ -131,8 +131,8 @@ namespace KJS {
         ALWAYS_INLINE void setScopeChain(ExecState* exec, ScopeChainNode*&, ScopeChainNode*);
         NEVER_INLINE void debug(ExecState*, const Instruction*, const CodeBlock*, ScopeChainNode*, Register*);
 
-        NEVER_INLINE bool unwindCallFrame(ExecState*, JSValue*, const Instruction*&, CodeBlock*&, JSValue**&, ScopeChainNode*&, Register*&);
-        NEVER_INLINE Instruction* throwException(ExecState*, JSValue*, const Instruction*, CodeBlock*&, JSValue**&, ScopeChainNode*&, Register*&);
+        NEVER_INLINE bool unwindCallFrame(ExecState*, JSValue*, const Instruction*&, CodeBlock*&, Register*&, ScopeChainNode*&, Register*&);
+        NEVER_INLINE Instruction* throwException(ExecState*, JSValue*, const Instruction*, CodeBlock*&, Register*&, ScopeChainNode*&, Register*&);
 
         Register* callFrame(ExecState*, JSFunction*) const;
 
index 76ed78d..caac673 100644 (file)
@@ -52,8 +52,11 @@ namespace KJS {
         bool marked() const;
         void mark();
         
+        bool isString() const;
+        
         uint32_t toUInt32(ExecState*) const;
         UString toString(ExecState*) const;
+        
 
     private:
         friend class Machine;
@@ -215,6 +218,11 @@ namespace KJS {
         jsValue()->mark();
     }
     
+    ALWAYS_INLINE bool Register::isString() const
+    {
+        return jsValue()->isString();
+    }
+
     ALWAYS_INLINE uint32_t Register::toUInt32(ExecState* exec) const
     {
         return jsValue()->toUInt32(exec);