- Revision
- 87364
- Author
- [email protected]
- Date
- 2011-05-25 23:58:55 -0700 (Wed, 25 May 2011)
Log Message
https://bugs.webkit.org/show_bug.cgi?id=61506
Reviewed by Sam Weinig.
Move the silent spill/fill methods in the DFG JIT to the JITCodeGenerator
so that they are available to the SpeculativeJIT.
* dfg/DFGJITCodeGenerator.h:
(JSC::DFG::JITCodeGenerator::silentSpillGPR):
(JSC::DFG::JITCodeGenerator::silentSpillFPR):
(JSC::DFG::JITCodeGenerator::silentFillGPR):
(JSC::DFG::JITCodeGenerator::silentFillFPR):
(JSC::DFG::JITCodeGenerator::silentSpillAllRegisters):
(JSC::DFG::JITCodeGenerator::silentFillAllRegisters):
* dfg/DFGNonSpeculativeJIT.h:
Modified Paths
Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (87363 => 87364)
--- trunk/Source/_javascript_Core/ChangeLog 2011-05-26 06:48:12 UTC (rev 87363)
+++ trunk/Source/_javascript_Core/ChangeLog 2011-05-26 06:58:55 UTC (rev 87364)
@@ -1,3 +1,21 @@
+2011-05-25 Gavin Barraclough <[email protected]>
+
+ Reviewed by Sam Weinig.
+
+ https://bugs.webkit.org/show_bug.cgi?id=61506
+
+ Move the silent spill/fill methods in the DFG JIT to the JITCodeGenerator
+ so that they are available to the SpeculativeJIT.
+
+ * dfg/DFGJITCodeGenerator.h:
+ (JSC::DFG::JITCodeGenerator::silentSpillGPR):
+ (JSC::DFG::JITCodeGenerator::silentSpillFPR):
+ (JSC::DFG::JITCodeGenerator::silentFillGPR):
+ (JSC::DFG::JITCodeGenerator::silentFillFPR):
+ (JSC::DFG::JITCodeGenerator::silentSpillAllRegisters):
+ (JSC::DFG::JITCodeGenerator::silentFillAllRegisters):
+ * dfg/DFGNonSpeculativeJIT.h:
+
2011-05-25 Ryosuke Niwa <[email protected]>
An attempt to revive Windows bots.
Modified: trunk/Source/_javascript_Core/dfg/DFGJITCodeGenerator.h (87363 => 87364)
--- trunk/Source/_javascript_Core/dfg/DFGJITCodeGenerator.h 2011-05-26 06:48:12 UTC (rev 87363)
+++ trunk/Source/_javascript_Core/dfg/DFGJITCodeGenerator.h 2011-05-26 06:58:55 UTC (rev 87364)
@@ -153,6 +153,147 @@
{
}
+ // These methods are used when generating 'unexpected'
+ // calls out from JIT code to C++ helper routines -
+ // they spill all live values to the appropriate
+ // slots in the RegisterFile without changing any state
+ // in the GenerationInfo.
+ void silentSpillGPR(VirtualRegister spillMe, GPRReg exclude = InvalidGPRReg)
+ {
+ GenerationInfo& info = m_generationInfo[spillMe];
+ ASSERT(info.registerFormat() != DataFormatNone && info.registerFormat() != DataFormatDouble);
+
+ if (!info.needsSpill() || (info.gpr() == exclude))
+ return;
+
+ DataFormat registerFormat = info.registerFormat();
+
+ if (registerFormat == DataFormatInteger) {
+ m_jit.orPtr(GPRInfo::tagTypeNumberRegister, info.gpr());
+ m_jit.storePtr(info.gpr(), JITCompiler::addressFor(spillMe));
+ } else {
+ ASSERT(registerFormat & DataFormatJS || registerFormat == DataFormatCell);
+ m_jit.storePtr(info.gpr(), JITCompiler::addressFor(spillMe));
+ }
+ }
+ void silentSpillFPR(VirtualRegister spillMe, GPRReg canTrample, FPRReg exclude = InvalidFPRReg)
+ {
+ GenerationInfo& info = m_generationInfo[spillMe];
+ ASSERT(info.registerFormat() == DataFormatDouble);
+
+ if (!info.needsSpill() || (info.fpr() == exclude))
+ return;
+
+ boxDouble(info.fpr(), canTrample);
+ m_jit.storePtr(canTrample, JITCompiler::addressFor(spillMe));
+ }
+
+ void silentFillGPR(VirtualRegister spillMe, GPRReg exclude = InvalidGPRReg)
+ {
+ GenerationInfo& info = m_generationInfo[spillMe];
+ if (info.gpr() == exclude)
+ return;
+
+ NodeIndex nodeIndex = info.nodeIndex();
+ Node& node = m_jit.graph()[nodeIndex];
+ ASSERT(info.registerFormat() != DataFormatNone && info.registerFormat() != DataFormatDouble);
+ DataFormat registerFormat = info.registerFormat();
+
+ if (registerFormat == DataFormatInteger) {
+ if (node.isConstant()) {
+ ASSERT(isInt32Constant(nodeIndex));
+ m_jit.move(Imm32(valueOfInt32Constant(nodeIndex)), info.gpr());
+ } else
+ m_jit.load32(JITCompiler::addressFor(spillMe), info.gpr());
+ return;
+ }
+
+ if (node.isConstant())
+ m_jit.move(constantAsJSValueAsImmPtr(nodeIndex), info.gpr());
+ else {
+ ASSERT(registerFormat & DataFormatJS || registerFormat == DataFormatCell);
+ m_jit.loadPtr(JITCompiler::addressFor(spillMe), info.gpr());
+ }
+ }
+ void silentFillFPR(VirtualRegister spillMe, GPRReg canTrample, FPRReg exclude = InvalidFPRReg)
+ {
+ GenerationInfo& info = m_generationInfo[spillMe];
+ if (info.fpr() == exclude)
+ return;
+
+ NodeIndex nodeIndex = info.nodeIndex();
+ Node& node = m_jit.graph()[nodeIndex];
+ ASSERT(info.registerFormat() == DataFormatDouble);
+
+ if (node.isConstant())
+ m_jit.move(constantAsJSValueAsImmPtr(nodeIndex), info.gpr());
+ else {
+ m_jit.loadPtr(JITCompiler::addressFor(spillMe), canTrample);
+ unboxDouble(canTrample, info.fpr());
+ }
+ }
+
+ void silentSpillAllRegisters(GPRReg exclude, GPRReg preserve = InvalidGPRReg)
+ {
+ GPRReg canTrample = GPRInfo::regT0;
+ if (preserve == GPRInfo::regT0)
+ canTrample = GPRInfo::regT1;
+
+ for (gpr_iterator iter = m_gprs.begin(); iter != m_gprs.end(); ++iter) {
+ if (iter.name() != InvalidVirtualRegister)
+ silentSpillGPR(iter.name(), exclude);
+ }
+ for (fpr_iterator iter = m_fprs.begin(); iter != m_fprs.end(); ++iter) {
+ if (iter.name() != InvalidVirtualRegister)
+ silentSpillFPR(iter.name(), canTrample);
+ }
+ }
+ void silentSpillAllRegisters(FPRReg exclude, GPRReg preserve = InvalidGPRReg)
+ {
+ GPRReg canTrample = GPRInfo::regT0;
+ if (preserve == GPRInfo::regT0)
+ canTrample = GPRInfo::regT1;
+
+ for (gpr_iterator iter = m_gprs.begin(); iter != m_gprs.end(); ++iter) {
+ if (iter.name() != InvalidVirtualRegister)
+ silentSpillGPR(iter.name());
+ }
+ for (fpr_iterator iter = m_fprs.begin(); iter != m_fprs.end(); ++iter) {
+ if (iter.name() != InvalidVirtualRegister)
+ silentSpillFPR(iter.name(), canTrample, exclude);
+ }
+ }
+ void silentFillAllRegisters(GPRReg exclude)
+ {
+ GPRReg canTrample = GPRInfo::regT0;
+ if (exclude == GPRInfo::regT0)
+ canTrample = GPRInfo::regT1;
+
+ for (fpr_iterator iter = m_fprs.begin(); iter != m_fprs.end(); ++iter) {
+ if (iter.name() != InvalidVirtualRegister)
+ silentFillFPR(iter.name(), canTrample);
+ }
+ for (gpr_iterator iter = m_gprs.begin(); iter != m_gprs.end(); ++iter) {
+ if (iter.name() != InvalidVirtualRegister)
+ silentFillGPR(iter.name(), exclude);
+ }
+ }
+ void silentFillAllRegisters(FPRReg exclude)
+ {
+ GPRReg canTrample = GPRInfo::regT0;
+
+ for (fpr_iterator iter = m_fprs.begin(); iter != m_fprs.end(); ++iter) {
+ if (iter.name() != InvalidVirtualRegister) {
+ ASSERT_UNUSED(exclude, iter.regID() != exclude);
+ silentFillFPR(iter.name(), canTrample, exclude);
+ }
+ }
+ for (gpr_iterator iter = m_gprs.begin(); iter != m_gprs.end(); ++iter) {
+ if (iter.name() != InvalidVirtualRegister)
+ silentFillGPR(iter.name());
+ }
+ }
+
// These methods convert between doubles, and doubles boxed and JSValues.
GPRReg boxDouble(FPRReg fpr, GPRReg gpr)
{
Modified: trunk/Source/_javascript_Core/dfg/DFGNonSpeculativeJIT.h (87363 => 87364)
--- trunk/Source/_javascript_Core/dfg/DFGNonSpeculativeJIT.h 2011-05-26 06:48:12 UTC (rev 87363)
+++ trunk/Source/_javascript_Core/dfg/DFGNonSpeculativeJIT.h 2011-05-26 06:58:55 UTC (rev 87364)
@@ -85,147 +85,6 @@
bool isKnownInteger(NodeIndex);
bool isKnownNumeric(NodeIndex);
- // These methods are used when generating 'unexpected'
- // calls out from JIT code to C++ helper routines -
- // they spill all live values to the appropriate
- // slots in the RegisterFile without changing any state
- // in the GenerationInfo.
- void silentSpillGPR(VirtualRegister spillMe, GPRReg exclude = InvalidGPRReg)
- {
- GenerationInfo& info = m_generationInfo[spillMe];
- ASSERT(info.registerFormat() != DataFormatNone && info.registerFormat() != DataFormatDouble);
-
- if (!info.needsSpill() || (info.gpr() == exclude))
- return;
-
- DataFormat registerFormat = info.registerFormat();
-
- if (registerFormat == DataFormatInteger) {
- m_jit.orPtr(GPRInfo::tagTypeNumberRegister, info.gpr());
- m_jit.storePtr(info.gpr(), JITCompiler::addressFor(spillMe));
- } else {
- ASSERT(registerFormat & DataFormatJS || registerFormat == DataFormatCell);
- m_jit.storePtr(info.gpr(), JITCompiler::addressFor(spillMe));
- }
- }
- void silentSpillFPR(VirtualRegister spillMe, GPRReg canTrample, FPRReg exclude = InvalidFPRReg)
- {
- GenerationInfo& info = m_generationInfo[spillMe];
- ASSERT(info.registerFormat() == DataFormatDouble);
-
- if (!info.needsSpill() || (info.fpr() == exclude))
- return;
-
- boxDouble(info.fpr(), canTrample);
- m_jit.storePtr(canTrample, JITCompiler::addressFor(spillMe));
- }
-
- void silentFillGPR(VirtualRegister spillMe, GPRReg exclude = InvalidGPRReg)
- {
- GenerationInfo& info = m_generationInfo[spillMe];
- if (info.gpr() == exclude)
- return;
-
- NodeIndex nodeIndex = info.nodeIndex();
- Node& node = m_jit.graph()[nodeIndex];
- ASSERT(info.registerFormat() != DataFormatNone && info.registerFormat() != DataFormatDouble);
- DataFormat registerFormat = info.registerFormat();
-
- if (registerFormat == DataFormatInteger) {
- if (node.isConstant()) {
- ASSERT(isInt32Constant(nodeIndex));
- m_jit.move(Imm32(valueOfInt32Constant(nodeIndex)), info.gpr());
- } else
- m_jit.load32(JITCompiler::addressFor(spillMe), info.gpr());
- return;
- }
-
- if (node.isConstant())
- m_jit.move(constantAsJSValueAsImmPtr(nodeIndex), info.gpr());
- else {
- ASSERT(registerFormat & DataFormatJS || registerFormat == DataFormatCell);
- m_jit.loadPtr(JITCompiler::addressFor(spillMe), info.gpr());
- }
- }
- void silentFillFPR(VirtualRegister spillMe, GPRReg canTrample, FPRReg exclude = InvalidFPRReg)
- {
- GenerationInfo& info = m_generationInfo[spillMe];
- if (info.fpr() == exclude)
- return;
-
- NodeIndex nodeIndex = info.nodeIndex();
- Node& node = m_jit.graph()[nodeIndex];
- ASSERT(info.registerFormat() == DataFormatDouble);
-
- if (node.isConstant())
- m_jit.move(constantAsJSValueAsImmPtr(nodeIndex), info.gpr());
- else {
- m_jit.loadPtr(JITCompiler::addressFor(spillMe), canTrample);
- unboxDouble(canTrample, info.fpr());
- }
- }
-
- void silentSpillAllRegisters(GPRReg exclude, GPRReg preserve = InvalidGPRReg)
- {
- GPRReg canTrample = GPRInfo::regT0;
- if (preserve == GPRInfo::regT0)
- canTrample = GPRInfo::regT1;
-
- for (gpr_iterator iter = m_gprs.begin(); iter != m_gprs.end(); ++iter) {
- if (iter.name() != InvalidVirtualRegister)
- silentSpillGPR(iter.name(), exclude);
- }
- for (fpr_iterator iter = m_fprs.begin(); iter != m_fprs.end(); ++iter) {
- if (iter.name() != InvalidVirtualRegister)
- silentSpillFPR(iter.name(), canTrample);
- }
- }
- void silentSpillAllRegisters(FPRReg exclude, GPRReg preserve = InvalidGPRReg)
- {
- GPRReg canTrample = GPRInfo::regT0;
- if (preserve == GPRInfo::regT0)
- canTrample = GPRInfo::regT1;
-
- for (gpr_iterator iter = m_gprs.begin(); iter != m_gprs.end(); ++iter) {
- if (iter.name() != InvalidVirtualRegister)
- silentSpillGPR(iter.name());
- }
- for (fpr_iterator iter = m_fprs.begin(); iter != m_fprs.end(); ++iter) {
- if (iter.name() != InvalidVirtualRegister)
- silentSpillFPR(iter.name(), canTrample, exclude);
- }
- }
- void silentFillAllRegisters(GPRReg exclude)
- {
- GPRReg canTrample = GPRInfo::regT0;
- if (exclude == GPRInfo::regT0)
- canTrample = GPRInfo::regT1;
-
- for (fpr_iterator iter = m_fprs.begin(); iter != m_fprs.end(); ++iter) {
- if (iter.name() != InvalidVirtualRegister)
- silentFillFPR(iter.name(), canTrample);
- }
- for (gpr_iterator iter = m_gprs.begin(); iter != m_gprs.end(); ++iter) {
- if (iter.name() != InvalidVirtualRegister)
- silentFillGPR(iter.name(), exclude);
- }
- }
- void silentFillAllRegisters(FPRReg exclude)
- {
- GPRReg canTrample = GPRInfo::regT0;
-
- for (fpr_iterator iter = m_fprs.begin(); iter != m_fprs.end(); ++iter) {
- if (iter.name() != InvalidVirtualRegister) {
- ASSERT_UNUSED(exclude, iter.regID() != exclude);
- silentFillFPR(iter.name(), canTrample, exclude);
- }
- }
- for (gpr_iterator iter = m_gprs.begin(); iter != m_gprs.end(); ++iter) {
- if (iter.name() != InvalidVirtualRegister)
- silentFillGPR(iter.name());
- }
- }
-
// These methods are used to plant calls out to C++
// helper routines to convert between types.
void valueToNumber(JSValueOperand&, FPRReg result);