Index: src/arm/lithium-arm.cc |
diff --git a/src/arm/lithium-arm.cc b/src/arm/lithium-arm.cc |
index 1d5f0ec4f7095256eee63ba2e1b8dbf379e26b5a..45eef31257275334344daf53d1b8eca41b354475 100644 |
--- a/src/arm/lithium-arm.cc |
+++ b/src/arm/lithium-arm.cc |
@@ -42,10 +42,10 @@ LITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE) |
#undef DEFINE_COMPILE |
LOsrEntry::LOsrEntry() { |
- for (int i = 0; i < Register::kNumAllocatableRegisters; ++i) { |
+ for (int i = 0; i < Register::NumAllocatableRegisters(); ++i) { |
register_spills_[i] = NULL; |
} |
- for (int i = 0; i < DoubleRegister::kNumAllocatableRegisters; ++i) { |
+ for (int i = 0; i < DoubleRegister::NumAllocatableRegisters(); ++i) { |
double_register_spills_[i] = NULL; |
} |
} |
@@ -591,6 +591,7 @@ LInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { |
LInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr, |
HInstruction* hinstr, |
CanDeoptimize can_deoptimize) { |
+ info()->MarkAsNonDeferredCalling(); |
#ifdef DEBUG |
instr->VerifyCall(); |
#endif |
@@ -1629,6 +1630,7 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) { |
Representation to = instr->to(); |
if (from.IsTagged()) { |
if (to.IsDouble()) { |
+ info()->MarkAsDeferredCalling(); |
LOperand* value = UseRegister(instr->value()); |
LNumberUntagD* res = new(zone()) LNumberUntagD(value); |
return AssignEnvironment(DefineAsRegister(res)); |
@@ -1653,6 +1655,7 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) { |
} |
} else if (from.IsDouble()) { |
if (to.IsTagged()) { |
+ info()->MarkAsDeferredCalling(); |
LOperand* value = UseRegister(instr->value()); |
LOperand* temp1 = TempRegister(); |
LOperand* temp2 = TempRegister(); |
@@ -1672,6 +1675,7 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) { |
return AssignEnvironment(DefineAsRegister(res)); |
} |
} else if (from.IsInteger32()) { |
+ info()->MarkAsDeferredCalling(); |
if (to.IsTagged()) { |
HValue* val = instr->value(); |
LOperand* value = UseRegisterAtStart(val); |
@@ -2127,8 +2131,27 @@ LInstruction* LChunkBuilder::DoOsrEntry(HOsrEntry* instr) { |
LInstruction* LChunkBuilder::DoParameter(HParameter* instr) { |
- int spill_index = chunk()->GetParameterStackSlot(instr->index()); |
- return DefineAsSpilled(new(zone()) LParameter, spill_index); |
+ LParameter* result = new(zone()) LParameter; |
+ switch (instr->kind()) { |
+ case FUNCTION_PARAMETER: { |
+ int spill_index = chunk()->GetParameterStackSlot(instr->index()); |
+ return DefineAsSpilled(new(zone()) LParameter, spill_index); |
+ } |
+ case KEYED_LOAD_IC_PARAMETER: { |
+ if (instr->index() == 0) return DefineFixed(result, r1); |
+ if (instr->index() == 1) return DefineFixed(result, r0); |
+ UNREACHABLE(); |
+ break; |
+ } |
+ case KEYED_STORE_IC_PARAMETER: |
Jakob Kummerow
2012/11/19 12:36:00
remove for now
danno
2012/11/26 17:16:18
Done.
|
+ if (instr->index() == 0) return DefineFixed(result, r2); |
+ if (instr->index() == 1) return DefineFixed(result, r1); |
+ if (instr->index() == 2) return DefineFixed(result, r0); |
+ break; |
+ default: |
+ UNREACHABLE(); |
+ } |
+ return NULL; |
} |