Index: src/x87/lithium-codegen-x87.cc |
diff --git a/src/x87/lithium-codegen-x87.cc b/src/x87/lithium-codegen-x87.cc |
index 07c9fb0260392ef1daa3b327b2b450c339fdb817..df222498540093e87fbe2a442ab5edf15e03adbd 100644 |
--- a/src/x87/lithium-codegen-x87.cc |
+++ b/src/x87/lithium-codegen-x87.cc |
@@ -11,6 +11,7 @@ |
#include "src/codegen.h" |
#include "src/deoptimizer.h" |
#include "src/hydrogen-osr.h" |
+#include "src/ic/stub-cache.h" |
#include "src/x87/lithium-codegen-x87.h" |
namespace v8 { |
@@ -3277,11 +3278,9 @@ void LCodeGen::DoLoadKeyedFixedArray(LLoadKeyed* instr) { |
// Load the result. |
__ mov(result, |
- BuildFastArrayOperand(instr->elements(), |
- instr->key(), |
+ BuildFastArrayOperand(instr->elements(), instr->key(), |
instr->hydrogen()->key()->representation(), |
- FAST_ELEMENTS, |
- instr->base_offset())); |
+ FAST_ELEMENTS, instr->base_offset())); |
// Check for the hole value. |
if (instr->hydrogen()->RequiresHoleCheck()) { |
@@ -3577,6 +3576,32 @@ void LCodeGen::CallKnownFunction(Handle<JSFunction> function, |
} |
+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())); |
+ |
+ Register scratch = ebx; |
+ Register extra = eax; |
+ DCHECK(!scratch.is(receiver) && !scratch.is(name)); |
+ DCHECK(!extra.is(receiver) && !extra.is(name)); |
+ |
+ // 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); |
+ |
+ // Tail call to miss if we ended up here. |
+ if (must_teardown_frame) __ leave(); |
+ LoadIC::GenerateMiss(masm()); |
+} |
+ |
+ |
void LCodeGen::DoCallWithDescriptor(LCallWithDescriptor* instr) { |
DCHECK(ToRegister(instr->result()).is(eax)); |