Index: src/x64/builtins-x64.cc |
diff --git a/src/x64/builtins-x64.cc b/src/x64/builtins-x64.cc |
index ed0ec684fc138fa63569d8519b1736a0810cb5c4..e156dfd2eb76d4999ca11c7ce50556a5739b9526 100644 |
--- a/src/x64/builtins-x64.cc |
+++ b/src/x64/builtins-x64.cc |
@@ -646,6 +646,25 @@ CODE_AGE_LIST(DEFINE_CODE_AGE_BUILTIN_GENERATOR) |
#undef DEFINE_CODE_AGE_BUILTIN_GENERATOR |
+void Builtins::Generate_NotifyICMiss(MacroAssembler* masm) { |
+ // Enter an internal frame. |
+ { |
+ FrameScope scope(masm, StackFrame::INTERNAL); |
+ |
+ // Preserve registers across notification, this is important for compiled |
+ // stubs that tail call the runtime on deopts passing their parameters in |
+ // registers. |
+ __ Pushad(); |
+ __ CallRuntime(Runtime::kNotifyICMiss, 0); |
+ __ Popad(); |
+ // Tear down internal frame. |
+ } |
+ |
+ __ pop(MemOperand(rsp, 0)); // Ignore state offset |
+ __ ret(0); // Return to IC Miss stub, continuation still on stack. |
+} |
+ |
+ |
static void Generate_NotifyDeoptimizedHelper(MacroAssembler* masm, |
Deoptimizer::BailoutType type) { |
// Enter an internal frame. |
@@ -660,17 +679,17 @@ static void Generate_NotifyDeoptimizedHelper(MacroAssembler* masm, |
} |
// Get the full codegen state from the stack and untag it. |
- __ SmiToInteger32(rcx, Operand(rsp, 1 * kPointerSize)); |
+ __ SmiToInteger32(r10, Operand(rsp, 1 * kPointerSize)); |
// Switch on the state. |
Label not_no_registers, not_tos_rax; |
- __ cmpq(rcx, Immediate(FullCodeGenerator::NO_REGISTERS)); |
+ __ cmpq(r10, Immediate(FullCodeGenerator::NO_REGISTERS)); |
__ j(not_equal, ¬_no_registers, Label::kNear); |
__ ret(1 * kPointerSize); // Remove state. |
__ bind(¬_no_registers); |
__ movq(rax, Operand(rsp, 2 * kPointerSize)); |
- __ cmpq(rcx, Immediate(FullCodeGenerator::TOS_REG)); |
+ __ cmpq(r10, Immediate(FullCodeGenerator::TOS_REG)); |
__ j(not_equal, ¬_tos_rax, Label::kNear); |
__ ret(2 * kPointerSize); // Remove state, rax. |