Index: src/mips64/lithium-codegen-mips64.cc |
diff --git a/src/mips64/lithium-codegen-mips64.cc b/src/mips64/lithium-codegen-mips64.cc |
index 08d1ef42777969428a6e6084275543964d5e7964..a817a285a4ed65408e85dafe30cdb1345d607c8f 100644 |
--- a/src/mips64/lithium-codegen-mips64.cc |
+++ b/src/mips64/lithium-codegen-mips64.cc |
@@ -2859,13 +2859,17 @@ template <class T> |
void LCodeGen::EmitVectorLoadICRegisters(T* instr) { |
DCHECK(FLAG_vector_ics); |
Register vector_register = ToRegister(instr->temp_vector()); |
+ Register slot_register = VectorLoadICDescriptor::SlotRegister(); |
DCHECK(vector_register.is(VectorLoadICDescriptor::VectorRegister())); |
+ DCHECK(slot_register.is(a0)); |
+ |
+ AllowDeferredHandleDereference vector_structure_check; |
Handle<TypeFeedbackVector> vector = instr->hydrogen()->feedback_vector(); |
__ li(vector_register, vector); |
// No need to allocate this register. |
- DCHECK(VectorLoadICDescriptor::SlotRegister().is(a0)); |
- int index = vector->GetIndex(instr->hydrogen()->slot()); |
- __ li(VectorLoadICDescriptor::SlotRegister(), Operand(Smi::FromInt(index))); |
+ FeedbackVectorICSlot slot = instr->hydrogen()->slot(); |
+ int index = vector->GetIndex(slot); |
+ __ li(slot_register, Operand(Smi::FromInt(index))); |
} |
@@ -3979,44 +3983,73 @@ void LCodeGen::DoTailCallThroughMegamorphicCache( |
DCHECK(receiver.is(a1)); |
DCHECK(name.is(a2)); |
- Register scratch = a3; |
- Register extra = a4; |
- Register extra2 = a5; |
- Register extra3 = a6; |
+ Register scratch = a4; |
+ Register extra = a5; |
+ Register extra2 = a6; |
+ Register extra3 = t1; |
+#ifdef DEBUG |
+ Register slot = FLAG_vector_ics ? ToRegister(instr->slot()) : no_reg; |
+ Register vector = FLAG_vector_ics ? ToRegister(instr->vector()) : no_reg; |
+ DCHECK(!FLAG_vector_ics || |
+ !AreAliased(slot, vector, scratch, extra, extra2, extra3)); |
+#endif |
// Important for the tail-call. |
bool must_teardown_frame = NeedsEagerFrame(); |
- // The probe will tail call to a handler if found. |
- isolate()->stub_cache()->GenerateProbe(masm(), instr->hydrogen()->flags(), |
- must_teardown_frame, receiver, name, |
- scratch, extra, extra2, extra3); |
+ if (!instr->hydrogen()->is_just_miss()) { |
+ DCHECK(!instr->hydrogen()->is_keyed_load()); |
+ |
+ // The probe will tail call to a handler if found. |
+ isolate()->stub_cache()->GenerateProbe( |
+ masm(), Code::LOAD_IC, instr->hydrogen()->flags(), must_teardown_frame, |
+ receiver, name, scratch, extra, extra2, extra3); |
+ } |
// Tail call to miss if we ended up here. |
if (must_teardown_frame) __ LeaveFrame(StackFrame::INTERNAL); |
- LoadIC::GenerateMiss(masm()); |
+ if (instr->hydrogen()->is_keyed_load()) { |
+ KeyedLoadIC::GenerateMiss(masm()); |
+ } else { |
+ LoadIC::GenerateMiss(masm()); |
+ } |
} |
void LCodeGen::DoCallWithDescriptor(LCallWithDescriptor* instr) { |
DCHECK(ToRegister(instr->result()).is(v0)); |
- LPointerMap* pointers = instr->pointer_map(); |
- SafepointGenerator generator(this, pointers, Safepoint::kLazyDeopt); |
+ if (instr->hydrogen()->IsTailCall()) { |
+ if (NeedsEagerFrame()) __ LeaveFrame(StackFrame::INTERNAL); |
- if (instr->target()->IsConstantOperand()) { |
- LConstantOperand* target = LConstantOperand::cast(instr->target()); |
- Handle<Code> code = Handle<Code>::cast(ToHandle(target)); |
- generator.BeforeCall(__ CallSize(code, RelocInfo::CODE_TARGET)); |
- __ Call(code, RelocInfo::CODE_TARGET); |
+ if (instr->target()->IsConstantOperand()) { |
+ LConstantOperand* target = LConstantOperand::cast(instr->target()); |
+ Handle<Code> code = Handle<Code>::cast(ToHandle(target)); |
+ __ Jump(code, RelocInfo::CODE_TARGET); |
+ } else { |
+ DCHECK(instr->target()->IsRegister()); |
+ Register target = ToRegister(instr->target()); |
+ __ Daddu(target, target, Operand(Code::kHeaderSize - kHeapObjectTag)); |
+ __ Jump(target); |
+ } |
} else { |
- DCHECK(instr->target()->IsRegister()); |
- Register target = ToRegister(instr->target()); |
- generator.BeforeCall(__ CallSize(target)); |
- __ Daddu(target, target, Operand(Code::kHeaderSize - kHeapObjectTag)); |
- __ Call(target); |
+ LPointerMap* pointers = instr->pointer_map(); |
+ SafepointGenerator generator(this, pointers, Safepoint::kLazyDeopt); |
+ |
+ if (instr->target()->IsConstantOperand()) { |
+ LConstantOperand* target = LConstantOperand::cast(instr->target()); |
+ Handle<Code> code = Handle<Code>::cast(ToHandle(target)); |
+ generator.BeforeCall(__ CallSize(code, RelocInfo::CODE_TARGET)); |
+ __ Call(code, RelocInfo::CODE_TARGET); |
+ } else { |
+ DCHECK(instr->target()->IsRegister()); |
+ Register target = ToRegister(instr->target()); |
+ generator.BeforeCall(__ CallSize(target)); |
+ __ Daddu(target, target, Operand(Code::kHeaderSize - kHeapObjectTag)); |
+ __ Call(target); |
+ } |
+ generator.AfterCall(); |
} |
- generator.AfterCall(); |
} |