Title: [95060] trunk/Source/_javascript_Core
Revision
95060
Author
fpi...@apple.com
Date
2011-09-13 17:37:01 -0700 (Tue, 13 Sep 2011)

Log Message

SpeculativeJIT::shouldSpeculateInteger(NodeIndex, NodeIndex) should
return false if either node can be double
https://bugs.webkit.org/show_bug.cgi?id=67985

Reviewed by Geoffrey Garen.
        
This is a 17% speed-up on 3d-cube.
        
This required allowing us to check if a constant is double but not
integer, and making the shouldSpeculateInteger() check test for
any hints of doubly-ness in its operands. This also required
changing some terminology: previously "isDouble" often meant
"isDouble or isInt32".  Now "isDouble" means exactly what the name
suggests, and "isNumber" means "isDouble or isInt32".

* dfg/DFGByteCodeParser.cpp:
(JSC::DFG::ByteCodeParser::toNumber):
(JSC::DFG::ByteCodeParser::parseBlock):
* dfg/DFGGenerationInfo.h:
(JSC::DFG::isJSFormat):
(JSC::DFG::isJSInteger):
(JSC::DFG::isJSDouble):
(JSC::DFG::isJSCell):
(JSC::DFG::isJSBoolean):
(JSC::DFG::GenerationInfo::isJSFormat):
(JSC::DFG::GenerationInfo::isJSInteger):
(JSC::DFG::GenerationInfo::isJSDouble):
(JSC::DFG::GenerationInfo::isJSCell):
(JSC::DFG::GenerationInfo::isJSBoolean):
* dfg/DFGGraph.h:
(JSC::DFG::Graph::isNumberConstant):
(JSC::DFG::Graph::valueOfNumberConstant):
* dfg/DFGJITCodeGenerator.cpp:
(JSC::DFG::JITCodeGenerator::fillInteger):
(JSC::DFG::JITCodeGenerator::fillDouble):
(JSC::DFG::JITCodeGenerator::fillJSValue):
(JSC::DFG::JITCodeGenerator::isKnownInteger):
(JSC::DFG::JITCodeGenerator::isKnownNumeric):
(JSC::DFG::JITCodeGenerator::isKnownCell):
(JSC::DFG::JITCodeGenerator::isKnownNotInteger):
(JSC::DFG::JITCodeGenerator::isKnownBoolean):
* dfg/DFGJITCodeGenerator.h:
(JSC::DFG::JITCodeGenerator::silentFillFPR):
(JSC::DFG::JITCodeGenerator::isNumberConstant):
(JSC::DFG::JITCodeGenerator::valueOfNumberConstant):
(JSC::DFG::JITCodeGenerator::initConstantInfo):
* dfg/DFGJITCompiler.cpp:
(JSC::DFG::JITCompiler::fillNumericToDouble):
(JSC::DFG::JITCompiler::fillToJS):
* dfg/DFGJITCompiler.h:
(JSC::DFG::JITCompiler::isNumberConstant):
(JSC::DFG::JITCompiler::valueOfNumberConstant):
* dfg/DFGNode.h:
(JSC::DFG::Node::isDoubleConstant):
(JSC::DFG::Node::isNumberConstant):
(JSC::DFG::Node::valueOfNumberConstant):
(JSC::DFG::Node::hasNumberResult):
* dfg/DFGNonSpeculativeJIT.cpp:
(JSC::DFG::NonSpeculativeJIT::knownConstantArithOp):
(JSC::DFG::NonSpeculativeJIT::compile):
* dfg/DFGSpeculativeJIT.cpp:
(JSC::DFG::SpeculativeJIT::fillSpeculateDouble):
* dfg/DFGSpeculativeJIT.h:
(JSC::DFG::SpeculativeJIT::isInteger):
(JSC::DFG::SpeculativeJIT::shouldSpeculateDouble):
(JSC::DFG::SpeculativeJIT::shouldNotSpeculateInteger):
(JSC::DFG::SpeculativeJIT::shouldSpeculateInteger):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (95059 => 95060)


--- trunk/Source/_javascript_Core/ChangeLog	2011-09-14 00:29:11 UTC (rev 95059)
+++ trunk/Source/_javascript_Core/ChangeLog	2011-09-14 00:37:01 UTC (rev 95060)
@@ -1,3 +1,73 @@
+2011-09-13  Filip Pizlo  <fpi...@apple.com>
+
+        SpeculativeJIT::shouldSpeculateInteger(NodeIndex, NodeIndex) should
+        return false if either node can be double
+        https://bugs.webkit.org/show_bug.cgi?id=67985
+
+        Reviewed by Geoffrey Garen.
+        
+        This is a 17% speed-up on 3d-cube.
+        
+        This required allowing us to check if a constant is double but not
+        integer, and making the shouldSpeculateInteger() check test for
+        any hints of doubly-ness in its operands. This also required
+        changing some terminology: previously "isDouble" often meant
+        "isDouble or isInt32".  Now "isDouble" means exactly what the name
+        suggests, and "isNumber" means "isDouble or isInt32".
+
+        * dfg/DFGByteCodeParser.cpp:
+        (JSC::DFG::ByteCodeParser::toNumber):
+        (JSC::DFG::ByteCodeParser::parseBlock):
+        * dfg/DFGGenerationInfo.h:
+        (JSC::DFG::isJSFormat):
+        (JSC::DFG::isJSInteger):
+        (JSC::DFG::isJSDouble):
+        (JSC::DFG::isJSCell):
+        (JSC::DFG::isJSBoolean):
+        (JSC::DFG::GenerationInfo::isJSFormat):
+        (JSC::DFG::GenerationInfo::isJSInteger):
+        (JSC::DFG::GenerationInfo::isJSDouble):
+        (JSC::DFG::GenerationInfo::isJSCell):
+        (JSC::DFG::GenerationInfo::isJSBoolean):
+        * dfg/DFGGraph.h:
+        (JSC::DFG::Graph::isNumberConstant):
+        (JSC::DFG::Graph::valueOfNumberConstant):
+        * dfg/DFGJITCodeGenerator.cpp:
+        (JSC::DFG::JITCodeGenerator::fillInteger):
+        (JSC::DFG::JITCodeGenerator::fillDouble):
+        (JSC::DFG::JITCodeGenerator::fillJSValue):
+        (JSC::DFG::JITCodeGenerator::isKnownInteger):
+        (JSC::DFG::JITCodeGenerator::isKnownNumeric):
+        (JSC::DFG::JITCodeGenerator::isKnownCell):
+        (JSC::DFG::JITCodeGenerator::isKnownNotInteger):
+        (JSC::DFG::JITCodeGenerator::isKnownBoolean):
+        * dfg/DFGJITCodeGenerator.h:
+        (JSC::DFG::JITCodeGenerator::silentFillFPR):
+        (JSC::DFG::JITCodeGenerator::isNumberConstant):
+        (JSC::DFG::JITCodeGenerator::valueOfNumberConstant):
+        (JSC::DFG::JITCodeGenerator::initConstantInfo):
+        * dfg/DFGJITCompiler.cpp:
+        (JSC::DFG::JITCompiler::fillNumericToDouble):
+        (JSC::DFG::JITCompiler::fillToJS):
+        * dfg/DFGJITCompiler.h:
+        (JSC::DFG::JITCompiler::isNumberConstant):
+        (JSC::DFG::JITCompiler::valueOfNumberConstant):
+        * dfg/DFGNode.h:
+        (JSC::DFG::Node::isDoubleConstant):
+        (JSC::DFG::Node::isNumberConstant):
+        (JSC::DFG::Node::valueOfNumberConstant):
+        (JSC::DFG::Node::hasNumberResult):
+        * dfg/DFGNonSpeculativeJIT.cpp:
+        (JSC::DFG::NonSpeculativeJIT::knownConstantArithOp):
+        (JSC::DFG::NonSpeculativeJIT::compile):
+        * dfg/DFGSpeculativeJIT.cpp:
+        (JSC::DFG::SpeculativeJIT::fillSpeculateDouble):
+        * dfg/DFGSpeculativeJIT.h:
+        (JSC::DFG::SpeculativeJIT::isInteger):
+        (JSC::DFG::SpeculativeJIT::shouldSpeculateDouble):
+        (JSC::DFG::SpeculativeJIT::shouldNotSpeculateInteger):
+        (JSC::DFG::SpeculativeJIT::shouldSpeculateInteger):
+
 2011-09-13  Anders Carlsson  <ander...@apple.com>
 
         Disable C++ exceptions when building with clang

Modified: trunk/Source/_javascript_Core/dfg/DFGByteCodeParser.cpp (95059 => 95060)


--- trunk/Source/_javascript_Core/dfg/DFGByteCodeParser.cpp	2011-09-14 00:29:11 UTC (rev 95059)
+++ trunk/Source/_javascript_Core/dfg/DFGByteCodeParser.cpp	2011-09-14 00:37:01 UTC (rev 95060)
@@ -216,7 +216,7 @@
     {
         Node& node = m_graph[index];
 
-        if (node.hasDoubleResult() || node.hasInt32Result())
+        if (node.hasNumberResult())
             return index;
 
         if (node.op == JSConstant) {
@@ -759,7 +759,7 @@
                 weaklyPredictInt32(op1);
                 weaklyPredictInt32(op2);
             }
-            if (m_graph[op1].hasNumericResult() && m_graph[op2].hasNumericResult())
+            if (m_graph[op1].hasNumberResult() && m_graph[op2].hasNumberResult())
                 set(currentInstruction[1].u.operand, addToGraph(ArithAdd, toNumber(op1), toNumber(op2)));
             else
                 set(currentInstruction[1].u.operand, addToGraph(ValueAdd, op1, op2));

Modified: trunk/Source/_javascript_Core/dfg/DFGGenerationInfo.h (95059 => 95060)


--- trunk/Source/_javascript_Core/dfg/DFGGenerationInfo.h	2011-09-14 00:29:11 UTC (rev 95059)
+++ trunk/Source/_javascript_Core/dfg/DFGGenerationInfo.h	2011-09-14 00:37:01 UTC (rev 95060)
@@ -117,6 +117,32 @@
     return true;
 }
 
+inline bool isJSFormat(DataFormat format, DataFormat expectedFormat)
+{
+    ASSERT(expectedFormat & DataFormatJS);
+    return (format | DataFormatJS) == expectedFormat;
+}
+
+inline bool isJSInteger(DataFormat format)
+{
+    return isJSFormat(format, DataFormatJSInteger);
+}
+
+inline bool isJSDouble(DataFormat format)
+{
+    return isJSFormat(format, DataFormatJSDouble);
+}
+
+inline bool isJSCell(DataFormat format)
+{
+    return isJSFormat(format, DataFormatJSCell);
+}
+
+inline bool isJSBoolean(DataFormat format)
+{
+    return isJSFormat(format, DataFormatJSBoolean);
+}
+
 // === GenerationInfo ===
 //
 // This class is used to track the current status of a live values during code generation.
@@ -208,6 +234,31 @@
     DataFormat registerFormat() { return m_registerFormat; }
     // Get the format of the value as it is spilled in the RegisterFile (or 'none').
     DataFormat spillFormat() { return m_spillFormat; }
+    
+    bool isJSFormat(DataFormat expectedFormat)
+    {
+        return DFG::isJSFormat(registerFormat(), expectedFormat) || DFG::isJSFormat(spillFormat(), expectedFormat);
+    }
+    
+    bool isJSInteger()
+    {
+        return isJSFormat(DataFormatJSInteger);
+    }
+    
+    bool isJSDouble()
+    {
+        return isJSFormat(DataFormatJSDouble);
+    }
+    
+    bool isJSCell()
+    {
+        return isJSFormat(DataFormatJSCell);
+    }
+    
+    bool isJSBoolean()
+    {
+        return isJSFormat(DataFormatJSBoolean);
+    }
 
     // Get the machine resister currently holding the value.
     GPRReg gpr() { ASSERT(m_registerFormat && m_registerFormat != DataFormatDouble); return u.gpr; }

Modified: trunk/Source/_javascript_Core/dfg/DFGGraph.h (95059 => 95060)


--- trunk/Source/_javascript_Core/dfg/DFGGraph.h	2011-09-14 00:29:11 UTC (rev 95059)
+++ trunk/Source/_javascript_Core/dfg/DFGGraph.h	2011-09-14 00:37:01 UTC (rev 95060)
@@ -214,6 +214,10 @@
     {
         return at(nodeIndex).isDoubleConstant(codeBlock);
     }
+    bool isNumberConstant(CodeBlock* codeBlock, NodeIndex nodeIndex)
+    {
+        return at(nodeIndex).isNumberConstant(codeBlock);
+    }
     bool isBooleanConstant(CodeBlock* codeBlock, NodeIndex nodeIndex)
     {
         return at(nodeIndex).isBooleanConstant(codeBlock);
@@ -227,9 +231,9 @@
     {
         return at(nodeIndex).valueOfInt32Constant(codeBlock);
     }
-    double valueOfDoubleConstant(CodeBlock* codeBlock, NodeIndex nodeIndex)
+    double valueOfNumberConstant(CodeBlock* codeBlock, NodeIndex nodeIndex)
     {
-        return at(nodeIndex).valueOfDoubleConstant(codeBlock);
+        return at(nodeIndex).valueOfNumberConstant(codeBlock);
     }
     bool valueOfBooleanConstant(CodeBlock* codeBlock, NodeIndex nodeIndex)
     {

Modified: trunk/Source/_javascript_Core/dfg/DFGJITCodeGenerator.cpp (95059 => 95060)


--- trunk/Source/_javascript_Core/dfg/DFGJITCodeGenerator.cpp	2011-09-14 00:29:11 UTC (rev 95059)
+++ trunk/Source/_javascript_Core/dfg/DFGJITCodeGenerator.cpp	2011-09-14 00:37:01 UTC (rev 95060)
@@ -59,8 +59,8 @@
                 returnFormat = DataFormatInteger;
                 return gpr;
             }
-            if (isDoubleConstant(nodeIndex)) {
-                JSValue jsValue = jsNumber(valueOfDoubleConstant(nodeIndex));
+            if (isNumberConstant(nodeIndex)) {
+                JSValue jsValue = jsNumber(valueOfNumberConstant(nodeIndex));
                 m_jit.move(MacroAssembler::ImmPtr(JSValue::encode(jsValue)), gpr);
             } else {
                 ASSERT(isJSConstant(nodeIndex));
@@ -130,9 +130,9 @@
                 m_gprs.retain(gpr, virtualRegister, SpillOrderConstant);
                 info.fillInteger(gpr);
                 unlock(gpr);
-            } else if (isDoubleConstant(nodeIndex)) {
+            } else if (isNumberConstant(nodeIndex)) {
                 FPRReg fpr = fprAllocate();
-                m_jit.move(MacroAssembler::ImmPtr(reinterpret_cast<void*>(reinterpretDoubleToIntptr(valueOfDoubleConstant(nodeIndex)))), gpr);
+                m_jit.move(MacroAssembler::ImmPtr(reinterpret_cast<void*>(reinterpretDoubleToIntptr(valueOfNumberConstant(nodeIndex)))), gpr);
                 m_jit.movePtrToDouble(gpr, fpr);
                 unlock(gpr);
 
@@ -253,9 +253,9 @@
                 info.fillJSValue(gpr, DataFormatJSInteger);
                 JSValue jsValue = jsNumber(valueOfInt32Constant(nodeIndex));
                 m_jit.move(MacroAssembler::ImmPtr(JSValue::encode(jsValue)), gpr);
-            } else if (isDoubleConstant(nodeIndex)) {
+            } else if (isNumberConstant(nodeIndex)) {
                 info.fillJSValue(gpr, DataFormatJSDouble);
-                JSValue jsValue(JSValue::EncodeAsDouble, valueOfDoubleConstant(nodeIndex));
+                JSValue jsValue(JSValue::EncodeAsDouble, valueOfNumberConstant(nodeIndex));
                 m_jit.move(MacroAssembler::ImmPtr(JSValue::encode(jsValue)), gpr);
             } else {
                 ASSERT(isJSConstant(nodeIndex));
@@ -362,57 +362,27 @@
     
     GenerationInfo& info = m_generationInfo[node.virtualRegister()];
 
-    DataFormat registerFormat = info.registerFormat();
-    if (registerFormat != DataFormatNone)
-        return (registerFormat | DataFormatJS) == DataFormatJSInteger;
-
-    DataFormat spillFormat = info.spillFormat();
-    if (spillFormat != DataFormatNone)
-        return (spillFormat | DataFormatJS) == DataFormatJSInteger;
-
-    ASSERT(isConstant(nodeIndex));
-    return false;
+    return info.isJSInteger();
 }
 
 bool JITCodeGenerator::isKnownNumeric(NodeIndex nodeIndex)
 {
-    if (isInt32Constant(nodeIndex) || isDoubleConstant(nodeIndex))
+    if (isInt32Constant(nodeIndex) || isNumberConstant(nodeIndex))
         return true;
 
     Node& node = m_jit.graph()[nodeIndex];
     
-    if (node.hasNumericResult())
+    if (node.hasNumberResult())
         return true;
     
     GenerationInfo& info = m_generationInfo[node.virtualRegister()];
 
-    DataFormat registerFormat = info.registerFormat();
-    if (registerFormat != DataFormatNone)
-        return (registerFormat | DataFormatJS) == DataFormatJSInteger
-            || (registerFormat | DataFormatJS) == DataFormatJSDouble;
-
-    DataFormat spillFormat = info.spillFormat();
-    if (spillFormat != DataFormatNone)
-        return (spillFormat | DataFormatJS) == DataFormatJSInteger
-            || (spillFormat | DataFormatJS) == DataFormatJSDouble;
-
-    ASSERT(isConstant(nodeIndex));
-    return false;
+    return info.isJSInteger() || info.isJSDouble();
 }
 
 bool JITCodeGenerator::isKnownCell(NodeIndex nodeIndex)
 {
-    GenerationInfo& info = m_generationInfo[m_jit.graph()[nodeIndex].virtualRegister()];
-    
-    DataFormat registerFormat = info.registerFormat();
-    if (registerFormat != DataFormatNone)
-        return (registerFormat | DataFormatJS) == DataFormatJSCell;
-    
-    DataFormat spillFormat = info.spillFormat();
-    if (spillFormat != DataFormatNone)
-        return (spillFormat | DataFormatJS) == DataFormatJSCell;
-    
-    return false;
+    return m_generationInfo[m_jit.graph()[nodeIndex].virtualRegister()].isJSCell();
 }
 
 bool JITCodeGenerator::isKnownNotInteger(NodeIndex nodeIndex)
@@ -421,9 +391,7 @@
     VirtualRegister virtualRegister = node.virtualRegister();
     GenerationInfo& info = m_generationInfo[virtualRegister];
     
-    return (info.registerFormat() | DataFormatJS) == DataFormatJSDouble
-        || (info.registerFormat() | DataFormatJS) == DataFormatJSCell
-        || (info.registerFormat() | DataFormatJS) == DataFormatJSBoolean
+    return info.isJSDouble() || info.isJSCell() || info.isJSBoolean()
         || (node.isConstant() && !valueOfJSConstant(nodeIndex).isInt32());
 }
 
@@ -439,8 +407,7 @@
     VirtualRegister virtualRegister = node.virtualRegister();
     GenerationInfo& info = m_generationInfo[virtualRegister];
     
-    return (info.registerFormat() | DataFormatJS) == DataFormatJSBoolean
-        || (info.spillFormat() | DataFormatJS) == DataFormatJSBoolean;
+    return info.isJSBoolean();
 }
 
 template<typename To, typename From>

Modified: trunk/Source/_javascript_Core/dfg/DFGJITCodeGenerator.h (95059 => 95060)


--- trunk/Source/_javascript_Core/dfg/DFGJITCodeGenerator.h	2011-09-14 00:29:11 UTC (rev 95059)
+++ trunk/Source/_javascript_Core/dfg/DFGJITCodeGenerator.h	2011-09-14 00:37:01 UTC (rev 95060)
@@ -288,8 +288,8 @@
         ASSERT(info.registerFormat() == DataFormatDouble);
 
         if (node.isConstant()) {
-            ASSERT(isDoubleConstant(nodeIndex));
-            m_jit.move(JITCompiler::ImmPtr(bitwise_cast<void*>(valueOfDoubleConstant(nodeIndex))), canTrample);
+            ASSERT(isNumberConstant(nodeIndex));
+            m_jit.move(JITCompiler::ImmPtr(bitwise_cast<void*>(valueOfNumberConstant(nodeIndex))), canTrample);
             m_jit.movePtrToDouble(canTrample, info.fpr());
             return;
         }
@@ -407,7 +407,7 @@
         m_jit.storePtr(reg, JITCompiler::addressFor(spillMe));
         info.spill((DataFormat)(spillFormat | DataFormatJS));
     }
-
+    
     bool isKnownInteger(NodeIndex);
     bool isKnownNumeric(NodeIndex);
     bool isKnownCell(NodeIndex);
@@ -421,9 +421,10 @@
     bool isJSConstant(NodeIndex nodeIndex) { return m_jit.isJSConstant(nodeIndex); }
     bool isInt32Constant(NodeIndex nodeIndex) { return m_jit.isInt32Constant(nodeIndex); }
     bool isDoubleConstant(NodeIndex nodeIndex) { return m_jit.isDoubleConstant(nodeIndex); }
+    bool isNumberConstant(NodeIndex nodeIndex) { return m_jit.isNumberConstant(nodeIndex); }
     bool isBooleanConstant(NodeIndex nodeIndex) { return m_jit.isBooleanConstant(nodeIndex); }
     int32_t valueOfInt32Constant(NodeIndex nodeIndex) { return m_jit.valueOfInt32Constant(nodeIndex); }
-    double valueOfDoubleConstant(NodeIndex nodeIndex) { return m_jit.valueOfDoubleConstant(nodeIndex); }
+    double valueOfNumberConstant(NodeIndex nodeIndex) { return m_jit.valueOfNumberConstant(nodeIndex); }
     JSValue valueOfJSConstant(NodeIndex nodeIndex) { return m_jit.valueOfJSConstant(nodeIndex); }
     bool valueOfBooleanConstant(NodeIndex nodeIndex) { return m_jit.valueOfBooleanConstant(nodeIndex); }
     bool isNullConstant(NodeIndex nodeIndex)
@@ -667,7 +668,7 @@
     }
     void initConstantInfo(NodeIndex nodeIndex)
     {
-        ASSERT(isInt32Constant(nodeIndex) || isDoubleConstant(nodeIndex) || isJSConstant(nodeIndex));
+        ASSERT(isInt32Constant(nodeIndex) || isNumberConstant(nodeIndex) || isJSConstant(nodeIndex));
         Node& node = m_jit.graph()[nodeIndex];
         m_generationInfo[node.virtualRegister()].initConstant(nodeIndex, node.refCount());
     }

Modified: trunk/Source/_javascript_Core/dfg/DFGJITCompiler.cpp (95059 => 95060)


--- trunk/Source/_javascript_Core/dfg/DFGJITCompiler.cpp	2011-09-14 00:29:11 UTC (rev 95059)
+++ trunk/Source/_javascript_Core/dfg/DFGJITCompiler.cpp	2011-09-14 00:37:01 UTC (rev 95060)
@@ -45,8 +45,8 @@
     Node& node = graph()[nodeIndex];
 
     if (node.isConstant()) {
-        ASSERT(isDoubleConstant(nodeIndex));
-        move(MacroAssembler::ImmPtr(reinterpret_cast<void*>(reinterpretDoubleToIntptr(valueOfDoubleConstant(nodeIndex)))), temporary);
+        ASSERT(isNumberConstant(nodeIndex));
+        move(MacroAssembler::ImmPtr(reinterpret_cast<void*>(reinterpretDoubleToIntptr(valueOfNumberConstant(nodeIndex)))), temporary);
         movePtrToDouble(temporary, fpr);
     } else {
         loadPtr(addressFor(node.virtualRegister()), temporary);
@@ -86,8 +86,8 @@
         if (isInt32Constant(nodeIndex)) {
             JSValue jsValue = jsNumber(valueOfInt32Constant(nodeIndex));
             move(MacroAssembler::ImmPtr(JSValue::encode(jsValue)), gpr);
-        } else if (isDoubleConstant(nodeIndex)) {
-            JSValue jsValue(JSValue::EncodeAsDouble, valueOfDoubleConstant(nodeIndex));
+        } else if (isNumberConstant(nodeIndex)) {
+            JSValue jsValue(JSValue::EncodeAsDouble, valueOfNumberConstant(nodeIndex));
             move(MacroAssembler::ImmPtr(JSValue::encode(jsValue)), gpr);
         } else {
             ASSERT(isJSConstant(nodeIndex));

Modified: trunk/Source/_javascript_Core/dfg/DFGJITCompiler.h (95059 => 95060)


--- trunk/Source/_javascript_Core/dfg/DFGJITCompiler.h	2011-09-14 00:29:11 UTC (rev 95059)
+++ trunk/Source/_javascript_Core/dfg/DFGJITCompiler.h	2011-09-14 00:37:01 UTC (rev 95060)
@@ -251,11 +251,12 @@
     bool isJSConstant(NodeIndex nodeIndex) { return graph().isJSConstant(nodeIndex); }
     bool isInt32Constant(NodeIndex nodeIndex) { return graph().isInt32Constant(codeBlock(), nodeIndex); }
     bool isDoubleConstant(NodeIndex nodeIndex) { return graph().isDoubleConstant(codeBlock(), nodeIndex); }
+    bool isNumberConstant(NodeIndex nodeIndex) { return graph().isNumberConstant(codeBlock(), nodeIndex); }
     bool isBooleanConstant(NodeIndex nodeIndex) { return graph().isBooleanConstant(codeBlock(), nodeIndex); }
     // Helper methods get constant values from nodes.
     JSValue valueOfJSConstant(NodeIndex nodeIndex) { return graph().valueOfJSConstant(codeBlock(), nodeIndex); }
     int32_t valueOfInt32Constant(NodeIndex nodeIndex) { return graph().valueOfInt32Constant(codeBlock(), nodeIndex); }
-    double valueOfDoubleConstant(NodeIndex nodeIndex) { return graph().valueOfDoubleConstant(codeBlock(), nodeIndex); }
+    double valueOfNumberConstant(NodeIndex nodeIndex) { return graph().valueOfNumberConstant(codeBlock(), nodeIndex); }
     bool valueOfBooleanConstant(NodeIndex nodeIndex) { return graph().valueOfBooleanConstant(codeBlock(), nodeIndex); }
 
     // These methods JIT generate dynamic, debug-only checks - akin to ASSERTs.

Modified: trunk/Source/_javascript_Core/dfg/DFGNode.h (95059 => 95060)


--- trunk/Source/_javascript_Core/dfg/DFGNode.h	2011-09-14 00:29:11 UTC (rev 95059)
+++ trunk/Source/_javascript_Core/dfg/DFGNode.h	2011-09-14 00:37:01 UTC (rev 95060)
@@ -122,7 +122,7 @@
 
 // These values record the result type of the node (as checked by NodeResultMask, above), 0 for no result.
 #define NodeResultJS      0x1000
-#define NodeResultDouble  0x2000
+#define NodeResultNumber  0x2000
 #define NodeResultInt32   0x3000
 #define NodeResultBoolean 0x4000
 
@@ -147,16 +147,16 @@
     /* Bitwise operators call ToInt32 on their operands. */\
     macro(ValueToInt32, NodeResultInt32 | NodeMustGenerate) \
     /* Used to box the result of URShift nodes (result has range 0..2^32-1). */\
-    macro(UInt32ToNumber, NodeResultDouble) \
+    macro(UInt32ToNumber, NodeResultNumber) \
     \
     /* Nodes for arithmetic operations. */\
-    macro(ArithAdd, NodeResultDouble) \
-    macro(ArithSub, NodeResultDouble) \
-    macro(ArithMul, NodeResultDouble) \
-    macro(ArithDiv, NodeResultDouble) \
-    macro(ArithMod, NodeResultDouble) \
+    macro(ArithAdd, NodeResultNumber) \
+    macro(ArithSub, NodeResultNumber) \
+    macro(ArithMul, NodeResultNumber) \
+    macro(ArithDiv, NodeResultNumber) \
+    macro(ArithMod, NodeResultNumber) \
     /* Arithmetic operators call ToNumber on their operands. */\
-    macro(ValueToNumber, NodeResultDouble | NodeMustGenerate) \
+    macro(ValueToNumber, NodeResultNumber | NodeMustGenerate) \
     \
     /* Add of values may either be arithmetic, or result in string concatenation. */\
     macro(ValueAdd, NodeResultJS | NodeMustGenerate) \
@@ -317,9 +317,19 @@
     
     bool isDoubleConstant(CodeBlock* codeBlock)
     {
-        return isConstant() && valueOfJSConstant(codeBlock).isNumber();
+        bool result = isConstant() && valueOfJSConstant(codeBlock).isDouble();
+        if (result)
+            ASSERT(!isInt32Constant(codeBlock));
+        return result;
     }
     
+    bool isNumberConstant(CodeBlock* codeBlock)
+    {
+        bool result = isConstant() && valueOfJSConstant(codeBlock).isNumber();
+        ASSERT(result == (isInt32Constant(codeBlock) || isDoubleConstant(codeBlock)));
+        return result;
+    }
+    
     bool isBooleanConstant(CodeBlock* codeBlock)
     {
         return isConstant() && valueOfJSConstant(codeBlock).isBoolean();
@@ -330,10 +340,10 @@
         ASSERT(isInt32Constant(codeBlock));
         return valueOfJSConstant(codeBlock).asInt32();
     }
-
-    double valueOfDoubleConstant(CodeBlock* codeBlock)
+    
+    double valueOfNumberConstant(CodeBlock* codeBlock)
     {
-        ASSERT(isDoubleConstant(codeBlock));
+        ASSERT(isNumberConstant(codeBlock));
         return valueOfJSConstant(codeBlock).uncheckedGetNumber();
     }
     
@@ -390,12 +400,12 @@
     {
         return (op & NodeResultMask) == NodeResultInt32;
     }
-
-    bool hasDoubleResult()
+    
+    bool hasNumberResult()
     {
-        return (op & NodeResultMask) == NodeResultDouble;
+        return (op & NodeResultMask) == NodeResultNumber;
     }
-
+    
     bool hasJSResult()
     {
         return (op & NodeResultMask) == NodeResultJS;
@@ -406,12 +416,6 @@
         return (op & NodeResultMask) == NodeResultBoolean;
     }
 
-    // Check for integers or doubles.
-    bool hasNumericResult()
-    {
-        return hasInt32Result() || hasDoubleResult();
-    }
-
     bool isJump()
     {
         return op & NodeIsJump;

Modified: trunk/Source/_javascript_Core/dfg/DFGNonSpeculativeJIT.cpp (95059 => 95060)


--- trunk/Source/_javascript_Core/dfg/DFGNonSpeculativeJIT.cpp	2011-09-14 00:29:11 UTC (rev 95059)
+++ trunk/Source/_javascript_Core/dfg/DFGNonSpeculativeJIT.cpp	2011-09-14 00:37:01 UTC (rev 95060)
@@ -192,7 +192,7 @@
         haveValue.link(&m_jit);
     }
     
-    m_jit.move(MacroAssembler::ImmPtr(reinterpret_cast<void*>(reinterpretDoubleToIntptr(valueOfDoubleConstant(immChild)))), resultGPR);
+    m_jit.move(MacroAssembler::ImmPtr(reinterpret_cast<void*>(reinterpretDoubleToIntptr(valueOfNumberConstant(immChild)))), resultGPR);
     m_jit.movePtrToDouble(resultGPR, tmp1FPR);
     switch (op) {
     case ValueAdd:
@@ -577,7 +577,7 @@
         }
 
         GenerationInfo& childInfo = m_generationInfo[m_jit.graph()[node.child1()].virtualRegister()];
-        if ((childInfo.registerFormat() | DataFormatJS) == DataFormatJSDouble) {
+        if (isJSDouble(childInfo.registerFormat())) {
             DoubleOperand op1(this, node.child1());
             GPRTemporary result(this);
             FPRReg fpr = op1.fpr();
@@ -597,7 +597,7 @@
 
     case ValueToNumber: {
         ASSERT(!isInt32Constant(node.child1()));
-        ASSERT(!isDoubleConstant(node.child1()));
+        ASSERT(!isNumberConstant(node.child1()));
 
         if (isKnownNumeric(node.child1())) {
             JSValueOperand op1(this, node.child1());

Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp (95059 => 95060)


--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp	2011-09-14 00:29:11 UTC (rev 95059)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp	2011-09-14 00:37:01 UTC (rev 95060)
@@ -272,9 +272,9 @@
                 info.fillDouble(fpr);
                 return fpr;
             }
-            if (isDoubleConstant(nodeIndex)) {
+            if (isNumberConstant(nodeIndex)) {
                 FPRReg fpr = fprAllocate();
-                m_jit.move(MacroAssembler::ImmPtr(reinterpret_cast<void*>(reinterpretDoubleToIntptr(valueOfDoubleConstant(nodeIndex)))), gpr);
+                m_jit.move(MacroAssembler::ImmPtr(reinterpret_cast<void*>(reinterpretDoubleToIntptr(valueOfNumberConstant(nodeIndex)))), gpr);
                 m_jit.movePtrToDouble(gpr, fpr);
                 unlock(gpr);
 

Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.h (95059 => 95060)


--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.h	2011-09-14 00:29:11 UTC (rev 95059)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.h	2011-09-14 00:37:01 UTC (rev 95060)
@@ -351,8 +351,7 @@
         VirtualRegister virtualRegister = node.virtualRegister();
         GenerationInfo& info = m_generationInfo[virtualRegister];
         
-        return (info.registerFormat() | DataFormatJS) == DataFormatJSInteger
-            || (info.spillFormat() | DataFormatJS) == DataFormatJSInteger;
+        return info.isJSInteger();
     }
     
     bool shouldSpeculateInteger(NodeIndex nodeIndex)
@@ -365,15 +364,18 @@
         
         return false;
     }
-
+    
     bool shouldSpeculateDouble(NodeIndex nodeIndex)
     {
+        if (isDoubleConstant(nodeIndex))
+            return true;
+
         Node& node = m_jit.graph()[nodeIndex];
+
         VirtualRegister virtualRegister = node.virtualRegister();
         GenerationInfo& info = m_generationInfo[virtualRegister];
 
-        if ((info.registerFormat() | DataFormatJS) == DataFormatJSDouble
-            || (info.spillFormat() | DataFormatJS) == DataFormatJSDouble)
+        if (info.isJSDouble())
             return true;
         
         if (isDoublePrediction(m_jit.graph().getPrediction(node)))
@@ -382,9 +384,28 @@
         return false;
     }
     
+    bool shouldNotSpeculateInteger(NodeIndex nodeIndex)
+    {
+        if (isDoubleConstant(nodeIndex))
+            return true;
+
+        Node& node = m_jit.graph()[nodeIndex];
+
+        VirtualRegister virtualRegister = node.virtualRegister();
+        GenerationInfo& info = m_generationInfo[virtualRegister];
+
+        if (info.isJSDouble())
+            return true;
+        
+        if (m_jit.graph().getPrediction(node) & PredictDouble)
+            return true;
+        
+        return false;
+    }
+    
     bool shouldSpeculateInteger(NodeIndex op1, NodeIndex op2)
     {
-        return !(shouldSpeculateDouble(op1) || shouldSpeculateDouble(op2)) && (shouldSpeculateInteger(op1) || shouldSpeculateInteger(op2));
+        return !(shouldNotSpeculateInteger(op1) || shouldNotSpeculateInteger(op2)) && (shouldSpeculateInteger(op1) || shouldSpeculateInteger(op2));
     }
 
     bool compare(Node&, MacroAssembler::RelationalCondition, MacroAssembler::DoubleCondition, Z_DFGOperation_EJJ);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to