Index: src/mips64/lithium-codegen-mips64.cc |
diff --git a/src/mips64/lithium-codegen-mips64.cc b/src/mips64/lithium-codegen-mips64.cc |
index cc9b85cc3be7c0b26af4358483e9a92663adf223..8a58d4b339194bb4e096f3f0b8499c53f9b469ff 100644 |
--- a/src/mips64/lithium-codegen-mips64.cc |
+++ b/src/mips64/lithium-codegen-mips64.cc |
@@ -6,6 +6,7 @@ |
#include "src/code-stubs.h" |
#include "src/hydrogen-osr.h" |
+#include "src/ic/stub-cache.h" |
#include "src/mips64/lithium-codegen-mips64.h" |
#include "src/mips64/lithium-gap-resolver-mips64.h" |
@@ -3973,6 +3974,34 @@ void LCodeGen::DoInvokeFunction(LInvokeFunction* instr) { |
} |
+void LCodeGen::DoTailCallThroughMegamorphicCache( |
+ LTailCallThroughMegamorphicCache* instr) { |
+ Register receiver = ToRegister(instr->receiver()); |
+ Register name = ToRegister(instr->name()); |
+ DCHECK(receiver.is(LoadDescriptor::ReceiverRegister())); |
+ DCHECK(name.is(LoadDescriptor::NameRegister())); |
+ DCHECK(receiver.is(a1)); |
+ DCHECK(name.is(a2)); |
+ |
+ Register scratch = a3; |
+ Register extra = a4; |
+ Register extra2 = a5; |
+ Register extra3 = a6; |
+ |
+ // 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); |
+ |
+ // Tail call to miss if we ended up here. |
+ if (must_teardown_frame) __ LeaveFrame(StackFrame::INTERNAL); |
+ LoadIC::GenerateMiss(masm()); |
+} |
+ |
+ |
void LCodeGen::DoCallWithDescriptor(LCallWithDescriptor* instr) { |
DCHECK(ToRegister(instr->result()).is(v0)); |