diff --git a/src/compiler/x87/code-generator-x87.cc b/src/compiler/x87/code-generator-x87.cc index c3ff08e604..f5649766c4 100644 --- a/src/compiler/x87/code-generator-x87.cc +++ b/src/compiler/x87/code-generator-x87.cc @@ -331,18 +331,23 @@ class OutOfLineRecordWrite final : public OutOfLineCode { void CodeGenerator::AssembleDeconstructActivationRecord(int stack_param_delta) { + int sp_slot_delta = TailCallFrameStackSlotDelta(stack_param_delta); + if (sp_slot_delta > 0) { + __ add(esp, Immediate(sp_slot_delta * kPointerSize)); + } CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); - int stack_slots = frame()->GetSpillSlotCount(); - if (descriptor->IsJSFunctionCall() || stack_slots > 0) { - __ mov(esp, ebp); + int spill_slots = frame()->GetSpillSlotCount(); + bool has_frame = descriptor->IsJSFunctionCall() || spill_slots > 0; + if (has_frame) { __ pop(ebp); } - if (stack_param_delta < 0) { - int offset = -(stack_param_delta + 1) * kPointerSize; - __ pop(Operand(esp, offset)); - if (offset != 0) { - __ add(esp, Immediate(offset)); - } +} + + +void CodeGenerator::AssemblePrepareTailCall(int stack_param_delta) { + int sp_slot_delta = TailCallFrameStackSlotDelta(stack_param_delta); + if (sp_slot_delta < 0) { + __ sub(esp, Immediate(-sp_slot_delta * kPointerSize)); } } @@ -438,6 +443,9 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) { __ PrepareCallCFunction(num_parameters, i.TempRegister(0)); break; } + case kArchPrepareTailCall: + AssemblePrepareTailCall(i.InputInt32(instr->InputCount() - 1)); + break; case kArchCallCFunction: { int const num_parameters = MiscField::decode(instr->opcode()); if (HasImmediateInput(instr, 0)) {