diff options
Diffstat (limited to 'deps/v8/src/compiler/x87/code-generator-x87.cc')
-rw-r--r-- | deps/v8/src/compiler/x87/code-generator-x87.cc | 64 |
1 files changed, 42 insertions, 22 deletions
diff --git a/deps/v8/src/compiler/x87/code-generator-x87.cc b/deps/v8/src/compiler/x87/code-generator-x87.cc index f5e6634561..d2f64e8cf1 100644 --- a/deps/v8/src/compiler/x87/code-generator-x87.cc +++ b/deps/v8/src/compiler/x87/code-generator-x87.cc @@ -637,8 +637,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( frame_access_state()->ClearSPDelta(); break; } - case kArchTailCallJSFunctionFromJSFunction: - case kArchTailCallJSFunction: { + case kArchTailCallJSFunctionFromJSFunction: { Register func = i.InputRegister(0); if (FLAG_debug_code) { // Check the function's context matches the context argument. @@ -649,10 +648,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( __ VerifyX87StackDepth(1); } __ fstp(0); - if (arch_opcode == kArchTailCallJSFunctionFromJSFunction) { - AssemblePopArgumentsAdaptorFrame(kJavaScriptCallArgCountRegister, - no_reg, no_reg, no_reg); - } + AssemblePopArgumentsAdaptorFrame(kJavaScriptCallArgCountRegister, no_reg, + no_reg, no_reg); __ jmp(FieldOperand(func, JSFunction::kCodeEntryOffset)); frame_access_state()->ClearSPDelta(); frame_access_state()->SetFrameAccessToDefault(); @@ -749,7 +746,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( break; } case kArchRet: - AssembleReturn(); + AssembleReturn(instr->InputAt(0)); break; case kArchFramePointer: __ mov(i.OutputRegister(), ebp); @@ -1870,7 +1867,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( if (i.InputRegister(1).is(i.OutputRegister())) { __ shl(i.OutputRegister(), 1); } else { - __ lea(i.OutputRegister(), i.MemoryOperand()); + __ add(i.OutputRegister(), i.InputRegister(1)); } } else if (mode == kMode_M2) { __ shl(i.OutputRegister(), 1); @@ -1881,6 +1878,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( } else { __ lea(i.OutputRegister(), i.MemoryOperand()); } + } else if (mode == kMode_MR1 && + i.InputRegister(1).is(i.OutputRegister())) { + __ add(i.OutputRegister(), i.InputRegister(0)); } else { __ lea(i.OutputRegister(), i.MemoryOperand()); } @@ -2245,7 +2245,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleDeoptimizerCall( if (deopt_entry == nullptr) return kTooManyDeoptimizationBailouts; DeoptimizeReason deoptimization_reason = GetDeoptimizationReason(deoptimization_id); - __ RecordDeoptReason(deoptimization_reason, pos.raw(), deoptimization_id); + __ RecordDeoptReason(deoptimization_reason, pos, deoptimization_id); __ call(deopt_entry, RelocInfo::RUNTIME_ENTRY); return kSuccess; } @@ -2404,12 +2404,16 @@ void CodeGenerator::AssembleConstructFrame() { __ mov(ebp, esp); } else if (descriptor->IsJSFunctionCall()) { __ Prologue(this->info()->GeneratePreagedPrologue()); + if (descriptor->PushArgumentCount()) { + __ push(kJavaScriptCallArgCountRegister); + } } else { __ StubPrologue(info()->GetOutputStackFrameType()); } } - int shrink_slots = frame()->GetSpillSlotCount(); + int shrink_slots = + frame()->GetTotalFrameSlotCount() - descriptor->CalculateFixedFrameSize(); if (info()->is_osr()) { // TurboFan OSR-compiled functions cannot be entered directly. @@ -2444,8 +2448,7 @@ void CodeGenerator::AssembleConstructFrame() { } } - -void CodeGenerator::AssembleReturn() { +void CodeGenerator::AssembleReturn(InstructionOperand* pop) { CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); // Clear the FPU stack only if there is no return value in the stack. @@ -2453,7 +2456,7 @@ void CodeGenerator::AssembleReturn() { __ VerifyX87StackDepth(1); } bool clear_stack = true; - for (int i = 0; i < descriptor->ReturnCount(); i++) { + for (size_t i = 0; i < descriptor->ReturnCount(); i++) { MachineRepresentation rep = descriptor->GetReturnType(i).representation(); LinkageLocation loc = descriptor->GetReturnLocation(i); if (IsFloatingPoint(rep) && loc == LinkageLocation::ForRegister(0)) { @@ -2463,7 +2466,6 @@ void CodeGenerator::AssembleReturn() { } if (clear_stack) __ fstp(0); - int pop_count = static_cast<int>(descriptor->StackParameterCount()); const RegList saves = descriptor->CalleeSavedRegisters(); // Restore registers. if (saves != 0) { @@ -2473,22 +2475,40 @@ void CodeGenerator::AssembleReturn() { } } + // Might need ecx for scratch if pop_size is too big or if there is a variable + // pop count. + DCHECK_EQ(0u, descriptor->CalleeSavedRegisters() & ecx.bit()); + size_t pop_size = descriptor->StackParameterCount() * kPointerSize; + X87OperandConverter g(this, nullptr); if (descriptor->IsCFunctionCall()) { AssembleDeconstructFrame(); } else if (frame_access_state()->has_frame()) { - // Canonicalize JSFunction return sites for now. - if (return_label_.is_bound()) { - __ jmp(&return_label_); - return; + // Canonicalize JSFunction return sites for now if they always have the same + // number of return args. + if (pop->IsImmediate() && g.ToConstant(pop).ToInt32() == 0) { + if (return_label_.is_bound()) { + __ jmp(&return_label_); + return; + } else { + __ bind(&return_label_); + AssembleDeconstructFrame(); + } } else { - __ bind(&return_label_); AssembleDeconstructFrame(); } } - if (pop_count == 0) { - __ ret(0); + DCHECK_EQ(0u, descriptor->CalleeSavedRegisters() & edx.bit()); + DCHECK_EQ(0u, descriptor->CalleeSavedRegisters() & ecx.bit()); + if (pop->IsImmediate()) { + DCHECK_EQ(Constant::kInt32, g.ToConstant(pop).type()); + pop_size += g.ToConstant(pop).ToInt32() * kPointerSize; + __ Ret(static_cast<int>(pop_size), ecx); } else { - __ Ret(pop_count * kPointerSize, ebx); + Register pop_reg = g.ToRegister(pop); + Register scratch_reg = pop_reg.is(ecx) ? edx : ecx; + __ pop(scratch_reg); + __ lea(esp, Operand(esp, pop_reg, times_4, static_cast<int>(pop_size))); + __ jmp(scratch_reg); } } |