Chromium Code Reviews| Index: src/x64/builtins-x64.cc |
| =================================================================== |
| --- src/x64/builtins-x64.cc (revision 6418) |
| +++ src/x64/builtins-x64.cc (working copy) |
| @@ -561,7 +561,34 @@ |
| static void Generate_NotifyDeoptimizedHelper(MacroAssembler* masm, |
| Deoptimizer::BailoutType type) { |
| - __ int3(); |
| + // Enter an internal frame. |
| + __ EnterInternalFrame(); |
| + |
| + // Pass the function and deoptimization type to the runtime system. |
|
Kevin Millikin (Chromium)
2011/01/24 13:52:21
This comment isn't correct. We grab the function
Rico
2011/01/25 07:48:16
Done.
|
| + __ 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. |
| + __ movq(rcx, Operand(rsp, 1 * kPointerSize)); |
| + __ SmiToInteger32(rcx, rcx); |
|
Lasse Reichstein
2011/01/24 13:24:21
You can use
SmiToInteger32(rcx, Operand(rsp, 1 *
Rico
2011/01/24 13:40:14
Done.
|
| + |
| + // Switch on the state. |
| + NearLabel not_no_registers, not_tos_eax; |
|
Lasse Reichstein
2011/01/24 13:24:21
eax->rax
Rico
2011/01/24 13:40:14
Done.
|
| + __ 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_eax); |
| + __ ret(2 * kPointerSize); // Remove state, eax. |
| + |
| + __ bind(¬_tos_eax); |
| + __ Abort("no cases left"); |
| } |
| void Builtins::Generate_NotifyDeoptimized(MacroAssembler* masm) { |