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);