Index: src/x64/builtins-x64.cc |
=================================================================== |
--- src/x64/builtins-x64.cc (revision 6418) |
+++ src/x64/builtins-x64.cc (working copy) |
@@ -561,7 +561,33 @@ |
static void Generate_NotifyDeoptimizedHelper(MacroAssembler* masm, |
Deoptimizer::BailoutType type) { |
- __ int3(); |
+ // Enter an internal frame. |
+ __ EnterInternalFrame(); |
+ |
+ // Pass the deoptimization type to the runtime system. |
+ __ Push(Smi::FromInt(static_cast<int>(type))); |
+ |
+ __ CallRuntime(Runtime::kNotifyDeoptimized, 1); |
+ // Tear down temporary frame. |
+ __ LeaveInternalFrame(); |
+ |
+ // Get the full codegen state from the stack and untag it. |
+ __ SmiToInteger32(rcx, Operand(rsp, 1 * kPointerSize)); |
+ |
+ // Switch on the state. |
+ NearLabel not_no_registers, not_tos_rax; |
+ __ cmpq(rcx, Immediate(FullCodeGenerator::NO_REGISTERS)); |
+ __ j(not_equal, ¬_no_registers); |
+ __ ret(1 * kPointerSize); // Remove state. |
+ |
+ __ bind(¬_no_registers); |
+ __ movq(rax, Operand(rsp, 2 * kPointerSize)); |
+ __ cmpq(rcx, Immediate(FullCodeGenerator::TOS_REG)); |
+ __ j(not_equal, ¬_tos_rax); |
+ __ ret(2 * kPointerSize); // Remove state, rax. |
+ |
+ __ bind(¬_tos_rax); |
+ __ Abort("no cases left"); |
} |
void Builtins::Generate_NotifyDeoptimized(MacroAssembler* masm) { |