summaryrefslogtreecommitdiffstats
path: root/Source/JavaScriptCore/dfg/DFGNonSpeculativeJIT.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGNonSpeculativeJIT.h')
-rw-r--r--Source/JavaScriptCore/dfg/DFGNonSpeculativeJIT.h140
1 files changed, 94 insertions, 46 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGNonSpeculativeJIT.h b/Source/JavaScriptCore/dfg/DFGNonSpeculativeJIT.h
index e140e45..de4c04b 100644
--- a/Source/JavaScriptCore/dfg/DFGNonSpeculativeJIT.h
+++ b/Source/JavaScriptCore/dfg/DFGNonSpeculativeJIT.h
@@ -80,92 +80,140 @@ public:
private:
void compile(SpeculationCheckIndexIterator&, Node&);
+ void compile(SpeculationCheckIndexIterator&, BasicBlock&);
+
+ 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 silentSpill(VirtualRegister spillMe, GPRReg canTrample)
+ void silentSpillGPR(VirtualRegister spillMe, GPRReg exclude = InvalidGPRReg)
{
GenerationInfo& info = m_generationInfo[spillMe];
- ASSERT(info.registerFormat() != DataFormatNone);
- if (info.needsSpill()) {
- DataFormat spillFormat = info.registerFormat();
-
- if (spillFormat == DataFormatDouble) {
- boxDouble(info.fpr(), canTrample);
- m_jit.storePtr(JITCompiler::gprToRegisterID(canTrample), JITCompiler::addressFor(spillMe));
- } else {
- JITCompiler::RegisterID reg = JITCompiler::gprToRegisterID(info.gpr());
-
- if (spillFormat == DataFormatInteger) {
- m_jit.orPtr(JITCompiler::tagTypeNumberRegister, reg);
- m_jit.storePtr(reg, JITCompiler::addressFor(spillMe));
- } else {
- ASSERT(spillFormat & DataFormatJS || spillFormat == DataFormatCell);
- m_jit.storePtr(reg, JITCompiler::addressFor(spillMe));
- }
- }
+ ASSERT(info.registerFormat() != DataFormatNone && info.registerFormat() != DataFormatDouble);
+
+ if (!info.needsSpill() || (info.gpr() == exclude))
+ return;
+
+ DataFormat registerFormat = info.registerFormat();
+ JITCompiler::RegisterID reg = JITCompiler::gprToRegisterID(info.gpr());
+
+ if (registerFormat == DataFormatInteger) {
+ m_jit.orPtr(JITCompiler::tagTypeNumberRegister, reg);
+ m_jit.storePtr(reg, JITCompiler::addressFor(spillMe));
+ } else {
+ ASSERT(registerFormat & DataFormatJS || registerFormat == DataFormatCell);
+ m_jit.storePtr(reg, JITCompiler::addressFor(spillMe));
}
}
- void silentFill(VirtualRegister spillMe, GPRReg canTrample)
+ 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(JITCompiler::gprToRegisterID(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);
- DataFormat spillFormat = info.registerFormat();
+ ASSERT(info.registerFormat() != DataFormatNone && info.registerFormat() != DataFormatDouble);
+ DataFormat registerFormat = info.registerFormat();
+ JITCompiler::RegisterID reg = JITCompiler::gprToRegisterID(info.gpr());
+
+ if (registerFormat == DataFormatInteger) {
+ if (node.isConstant()) {
+ ASSERT(isInt32Constant(nodeIndex));
+ m_jit.move(Imm32(valueOfInt32Constant(nodeIndex)), reg);
+ } else
+ m_jit.load32(JITCompiler::addressFor(spillMe), reg);
+ return;
+ }
+
+ if (node.isConstant())
+ m_jit.move(constantAsJSValueAsImmPtr(nodeIndex), reg);
+ else {
+ ASSERT(registerFormat & DataFormatJS || registerFormat == DataFormatCell);
+ m_jit.loadPtr(JITCompiler::addressFor(spillMe), reg);
+ }
+ }
+ 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()) {
JITCompiler::RegisterID reg = JITCompiler::gprToRegisterID(info.gpr());
m_jit.move(constantAsJSValueAsImmPtr(nodeIndex), reg);
- } else if (node.isArgument()) {
- JITCompiler::RegisterID reg = JITCompiler::gprToRegisterID(info.gpr());
- m_jit.loadPtr(m_jit.addressForArgument(m_jit.graph()[nodeIndex].argumentNumber()), reg);
- } else if (spillFormat == DataFormatDouble) {
+ } else {
m_jit.loadPtr(JITCompiler::addressFor(spillMe), JITCompiler::gprToRegisterID(canTrample));
unboxDouble(canTrample, info.fpr());
- } else if (spillFormat == DataFormatInteger) {
- JITCompiler::RegisterID reg = JITCompiler::gprToRegisterID(info.gpr());
- m_jit.load32(JITCompiler::addressFor(spillMe), reg);
- } else {
- ASSERT(spillFormat & DataFormatJS || spillFormat == DataFormatCell);
- JITCompiler::RegisterID reg = JITCompiler::gprToRegisterID(info.gpr());
- m_jit.loadPtr(JITCompiler::addressFor(spillMe), reg);
}
}
- void silentSpillAllRegisters(GPRReg dontTrample)
+
+ void silentSpillAllRegisters(GPRReg exclude, GPRReg preserve = InvalidGPRReg)
+ {
+ GPRReg canTrample = (preserve == gpr0) ? gpr1 : gpr0;
+
+ for (GPRReg gpr = gpr0; gpr < numberOfGPRs; next(gpr)) {
+ VirtualRegister name = m_gprs.name(gpr);
+ if (name != InvalidVirtualRegister)
+ silentSpillGPR(name, exclude);
+ }
+ for (FPRReg fpr = fpr0; fpr < numberOfFPRs; next(fpr)) {
+ VirtualRegister name = m_fprs.name(fpr);
+ if (name != InvalidVirtualRegister)
+ silentSpillFPR(name, canTrample);
+ }
+ }
+ void silentSpillAllRegisters(FPRReg exclude, GPRReg preserve = InvalidGPRReg)
{
- GPRReg canTrample = (dontTrample == gpr0) ? gpr1 : gpr0;
+ GPRReg canTrample = (preserve == gpr0) ? gpr1 : gpr0;
for (GPRReg gpr = gpr0; gpr < numberOfGPRs; next(gpr)) {
VirtualRegister name = m_gprs.name(gpr);
if (name != InvalidVirtualRegister)
- silentSpill(name, canTrample);
+ silentSpillGPR(name);
}
for (FPRReg fpr = fpr0; fpr < numberOfFPRs; next(fpr)) {
VirtualRegister name = m_fprs.name(fpr);
if (name != InvalidVirtualRegister)
- silentSpill(name, canTrample);
+ silentSpillFPR(name, canTrample, exclude);
}
}
- void silentFillAllRegisters(GPRReg dontTrample)
+ void silentFillAllRegisters(GPRReg exclude)
{
- GPRReg canTrample = (dontTrample == gpr0) ? gpr1 : gpr0;
+ GPRReg canTrample = (exclude == gpr0) ? gpr1 : gpr0;
for (FPRReg fpr = fpr0; fpr < numberOfFPRs; next(fpr)) {
VirtualRegister name = m_fprs.name(fpr);
if (name != InvalidVirtualRegister)
- silentFill(name, canTrample);
+ silentFillFPR(name, canTrample);
}
for (GPRReg gpr = gpr0; gpr < numberOfGPRs; next(gpr)) {
VirtualRegister name = m_gprs.name(gpr);
if (name != InvalidVirtualRegister)
- silentFill(name, canTrample);
+ silentFillGPR(name, exclude);
}
}
- void silentFillAllRegisters(FPRReg dontTrample)
+ void silentFillAllRegisters(FPRReg exclude)
{
GPRReg canTrample = gpr0;
@@ -173,17 +221,17 @@ private:
VirtualRegister name = m_fprs.name(fpr);
if (name != InvalidVirtualRegister) {
#ifndef NDEBUG
- ASSERT(fpr != dontTrample);
+ ASSERT(fpr != exclude);
#else
- UNUSED_PARAM(dontTrample);
+ UNUSED_PARAM(exclude);
#endif
- silentFill(name, canTrample);
+ silentFillFPR(name, canTrample, exclude);
}
}
for (GPRReg gpr = gpr0; gpr < numberOfGPRs; next(gpr)) {
VirtualRegister name = m_gprs.name(gpr);
if (name != InvalidVirtualRegister)
- silentFill(name, canTrample);
+ silentFillGPR(name);
}
}