diff options
author | Michaƫl Zasso <mic.besace@gmail.com> | 2015-10-06 08:42:38 +0200 |
---|---|---|
committer | Ali Ijaz Sheikh <ofrobots@google.com> | 2015-10-14 11:20:34 -0700 |
commit | d8011d1683fe0d977de2bea1147f5213d4490c5a (patch) | |
tree | 54967df8dc1732e59eef39e5c5b39fe99ad88977 /deps/v8/src/compiler/arm | |
parent | d1a2e5357ef0357cec9b516fa9ac78cc38a984aa (diff) | |
download | node-new-d8011d1683fe0d977de2bea1147f5213d4490c5a.tar.gz |
deps: upgrade V8 to 4.6.85.23
PR-URL: https://github.com/nodejs/node/pull/3351
Reviewed-By: indutny - Fedor Indutny <fedor.indutny@gmail.com>
Reviewed-By: bnoordhuis - Ben Noordhuis <info@bnoordhuis.nl>
Diffstat (limited to 'deps/v8/src/compiler/arm')
-rw-r--r-- | deps/v8/src/compiler/arm/code-generator-arm.cc | 136 | ||||
-rw-r--r-- | deps/v8/src/compiler/arm/instruction-selector-arm.cc | 18 | ||||
-rw-r--r-- | deps/v8/src/compiler/arm/linkage-arm.cc | 74 |
3 files changed, 72 insertions, 156 deletions
diff --git a/deps/v8/src/compiler/arm/code-generator-arm.cc b/deps/v8/src/compiler/arm/code-generator-arm.cc index 0c97f846f0..dca6d4e3ec 100644 --- a/deps/v8/src/compiler/arm/code-generator-arm.cc +++ b/deps/v8/src/compiler/arm/code-generator-arm.cc @@ -8,6 +8,7 @@ #include "src/compiler/code-generator-impl.h" #include "src/compiler/gap-resolver.h" #include "src/compiler/node-matchers.h" +#include "src/compiler/osr.h" #include "src/scopes.h" namespace v8 { @@ -147,12 +148,9 @@ class ArmOperandConverter final : public InstructionOperandConverter { MemOperand ToMemOperand(InstructionOperand* op) const { DCHECK(op != NULL); - DCHECK(!op->IsRegister()); - DCHECK(!op->IsDoubleRegister()); DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot()); - // The linkage computes where all spill slots are located. - FrameOffset offset = linkage()->GetFrameOffset( - AllocatedOperand::cast(op)->index(), frame(), 0); + FrameOffset offset = + linkage()->GetFrameOffset(AllocatedOperand::cast(op)->index(), frame()); return MemOperand(offset.from_stack_pointer() ? sp : fp, offset.offset()); } }; @@ -817,7 +815,12 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) { break; } case kArmPush: - __ Push(i.InputRegister(0)); + if (instr->InputAt(0)->IsDoubleRegister()) { + __ vstr(i.InputDoubleRegister(0), MemOperand(sp, -kDoubleSize)); + __ sub(sp, sp, Operand(kDoubleSize)); + } else { + __ Push(i.InputRegister(0)); + } DCHECK_EQ(LeaveCC, i.OutputSBit()); break; case kArmPoke: { @@ -947,53 +950,25 @@ void CodeGenerator::AssembleDeoptimizerCall( void CodeGenerator::AssemblePrologue() { CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); - int stack_slots = frame()->GetSpillSlotCount(); if (descriptor->kind() == CallDescriptor::kCallAddress) { - bool saved_pp; if (FLAG_enable_embedded_constant_pool) { __ Push(lr, fp, pp); // Adjust FP to point to saved FP. __ sub(fp, sp, Operand(StandardFrameConstants::kConstantPoolOffset)); - saved_pp = true; } else { __ Push(lr, fp); __ mov(fp, sp); - saved_pp = false; - } - int register_save_area_size = saved_pp ? kPointerSize : 0; - const RegList saves = descriptor->CalleeSavedRegisters(); - if (saves != 0 || saved_pp) { - // Save callee-saved registers. - __ stm(db_w, sp, saves); - register_save_area_size += - kPointerSize * base::bits::CountPopulation32(saves); - } - const RegList saves_fp = descriptor->CalleeSavedFPRegisters(); - if (saves_fp != 0) { - // Save callee-saved FP registers. - STATIC_ASSERT(DwVfpRegister::kMaxNumRegisters == 32); - uint32_t last = base::bits::CountLeadingZeros32(saves_fp) - 1; - uint32_t first = base::bits::CountTrailingZeros32(saves_fp); - DCHECK_EQ((last - first + 1), base::bits::CountPopulation32(saves_fp)); - - __ vstm(db_w, sp, DwVfpRegister::from_code(first), - DwVfpRegister::from_code(last)); - register_save_area_size += 2 * kPointerSize * (last - first + 1); - } - if (register_save_area_size > 0) { - frame()->SetRegisterSaveAreaSize(register_save_area_size); } } else if (descriptor->IsJSFunctionCall()) { CompilationInfo* info = this->info(); __ Prologue(info->IsCodePreAgingActive()); - frame()->SetRegisterSaveAreaSize( - StandardFrameConstants::kFixedFrameSizeFromFp); } else if (needs_frame_) { __ StubPrologue(); - frame()->SetRegisterSaveAreaSize( - StandardFrameConstants::kFixedFrameSizeFromFp); + } else { + frame()->SetElidedFrameSizeInSlots(0); } + int stack_shrink_slots = frame()->GetSpillSlotCount(); if (info()->is_osr()) { // TurboFan OSR-compiled functions cannot be entered directly. __ Abort(kShouldNotDirectlyEnterOsrFunction); @@ -1006,62 +981,75 @@ void CodeGenerator::AssemblePrologue() { osr_pc_offset_ = __ pc_offset(); // TODO(titzer): cannot address target function == local #-1 __ ldr(r1, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); - DCHECK(stack_slots >= frame()->GetOsrStackSlotCount()); - stack_slots -= frame()->GetOsrStackSlotCount(); + stack_shrink_slots -= OsrHelper(info()).UnoptimizedFrameSlots(); } - if (stack_slots > 0) { - __ sub(sp, sp, Operand(stack_slots * kPointerSize)); + const RegList saves_fp = descriptor->CalleeSavedFPRegisters(); + if (saves_fp != 0) { + stack_shrink_slots += frame()->AlignSavedCalleeRegisterSlots(); + } + if (stack_shrink_slots > 0) { + __ sub(sp, sp, Operand(stack_shrink_slots * kPointerSize)); + } + + if (saves_fp != 0) { + // Save callee-saved FP registers. + STATIC_ASSERT(DwVfpRegister::kMaxNumRegisters == 32); + uint32_t last = base::bits::CountLeadingZeros32(saves_fp) - 1; + uint32_t first = base::bits::CountTrailingZeros32(saves_fp); + DCHECK_EQ((last - first + 1), base::bits::CountPopulation32(saves_fp)); + __ vstm(db_w, sp, DwVfpRegister::from_code(first), + DwVfpRegister::from_code(last)); + frame()->AllocateSavedCalleeRegisterSlots((last - first + 1) * + (kDoubleSize / kPointerSize)); + } + const RegList saves = FLAG_enable_embedded_constant_pool + ? (descriptor->CalleeSavedRegisters() & ~pp.bit()) + : descriptor->CalleeSavedRegisters(); + if (saves != 0) { + // Save callee-saved registers. + __ stm(db_w, sp, saves); + frame()->AllocateSavedCalleeRegisterSlots( + base::bits::CountPopulation32(saves)); } } void CodeGenerator::AssembleReturn() { CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); - int stack_slots = frame()->GetSpillSlotCount(); + int pop_count = static_cast<int>(descriptor->StackParameterCount()); + + // Restore registers. + const RegList saves = FLAG_enable_embedded_constant_pool + ? (descriptor->CalleeSavedRegisters() & ~pp.bit()) + : descriptor->CalleeSavedRegisters(); + if (saves != 0) { + __ ldm(ia_w, sp, saves); + } + + // Restore FP registers. + const RegList saves_fp = descriptor->CalleeSavedFPRegisters(); + if (saves_fp != 0) { + STATIC_ASSERT(DwVfpRegister::kMaxNumRegisters == 32); + uint32_t last = base::bits::CountLeadingZeros32(saves_fp) - 1; + uint32_t first = base::bits::CountTrailingZeros32(saves_fp); + __ vldm(ia_w, sp, DwVfpRegister::from_code(first), + DwVfpRegister::from_code(last)); + } + if (descriptor->kind() == CallDescriptor::kCallAddress) { - if (frame()->GetRegisterSaveAreaSize() > 0) { - // Remove this frame's spill slots first. - if (stack_slots > 0) { - __ add(sp, sp, Operand(stack_slots * kPointerSize)); - } - // Restore FP registers. - const RegList saves_fp = descriptor->CalleeSavedFPRegisters(); - if (saves_fp != 0) { - STATIC_ASSERT(DwVfpRegister::kMaxNumRegisters == 32); - uint32_t last = base::bits::CountLeadingZeros32(saves_fp) - 1; - uint32_t first = base::bits::CountTrailingZeros32(saves_fp); - __ vldm(ia_w, sp, DwVfpRegister::from_code(first), - DwVfpRegister::from_code(last)); - } - // Restore registers. - const RegList saves = descriptor->CalleeSavedRegisters(); - if (saves != 0) { - __ ldm(ia_w, sp, saves); - } - } __ LeaveFrame(StackFrame::MANUAL); - __ Ret(); } else if (descriptor->IsJSFunctionCall() || needs_frame_) { // Canonicalize JSFunction return sites for now. if (return_label_.is_bound()) { __ b(&return_label_); + return; } else { __ bind(&return_label_); __ LeaveFrame(StackFrame::MANUAL); - int pop_count = descriptor->IsJSFunctionCall() - ? static_cast<int>(descriptor->JSParameterCount()) - : (info()->IsStub() - ? info()->code_stub()->GetStackParameterCount() - : 0); - if (pop_count != 0) { - __ Drop(pop_count); - } - __ Ret(); } - } else { - __ Ret(); } + __ Ret(pop_count); } diff --git a/deps/v8/src/compiler/arm/instruction-selector-arm.cc b/deps/v8/src/compiler/arm/instruction-selector-arm.cc index 8855388048..aa59f2cbb7 100644 --- a/deps/v8/src/compiler/arm/instruction-selector-arm.cc +++ b/deps/v8/src/compiler/arm/instruction-selector-arm.cc @@ -1117,16 +1117,18 @@ void InstructionSelector::VisitCall(Node* node, BasicBlock* handler) { // Poke any stack arguments. for (size_t n = 0; n < buffer.pushed_nodes.size(); ++n) { - if (Node* node = buffer.pushed_nodes[n]) { - int const slot = static_cast<int>(n); - InstructionOperand value = g.UseRegister(node); - Emit(kArmPoke | MiscField::encode(slot), g.NoOutput(), value); + if (Node* input = buffer.pushed_nodes[n]) { + int slot = static_cast<int>(n); + Emit(kArmPoke | MiscField::encode(slot), g.NoOutput(), + g.UseRegister(input)); } } } else { // Push any stack arguments. - for (Node* node : base::Reversed(buffer.pushed_nodes)) { - Emit(kArmPush, g.NoOutput(), g.UseRegister(node)); + for (Node* input : base::Reversed(buffer.pushed_nodes)) { + // Skip any alignment holes in pushed nodes. + if (input == nullptr) continue; + Emit(kArmPush, g.NoOutput(), g.UseRegister(input)); } } @@ -1220,8 +1222,8 @@ void InstructionSelector::VisitTailCall(Node* node) { InitializeCallBuffer(node, &buffer, true, false); // Push any stack arguments. - for (Node* node : base::Reversed(buffer.pushed_nodes)) { - Emit(kArmPush, g.NoOutput(), g.UseRegister(node)); + for (Node* input : base::Reversed(buffer.pushed_nodes)) { + Emit(kArmPush, g.NoOutput(), g.UseRegister(input)); } // Select the appropriate opcode based on the call type. diff --git a/deps/v8/src/compiler/arm/linkage-arm.cc b/deps/v8/src/compiler/arm/linkage-arm.cc deleted file mode 100644 index a923f1bf8d..0000000000 --- a/deps/v8/src/compiler/arm/linkage-arm.cc +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2014 the V8 project authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "src/assembler.h" -#include "src/code-stubs.h" -#include "src/compiler/linkage.h" -#include "src/compiler/linkage-impl.h" -#include "src/zone.h" - -namespace v8 { -namespace internal { -namespace compiler { - -struct ArmLinkageHelperTraits { - static Register ReturnValueReg() { return r0; } - static Register ReturnValue2Reg() { return r1; } - static Register JSCallFunctionReg() { return r1; } - static Register ContextReg() { return cp; } - static Register RuntimeCallFunctionReg() { return r1; } - static Register RuntimeCallArgCountReg() { return r0; } - static RegList CCalleeSaveRegisters() { - return r4.bit() | r5.bit() | r6.bit() | r7.bit() | r8.bit() | r9.bit() | - r10.bit(); - } - static RegList CCalleeSaveFPRegisters() { - return (1 << d8.code()) | (1 << d9.code()) | (1 << d10.code()) | - (1 << d11.code()) | (1 << d12.code()) | (1 << d13.code()) | - (1 << d14.code()) | (1 << d15.code()); - } - static Register CRegisterParameter(int i) { - static Register register_parameters[] = {r0, r1, r2, r3}; - return register_parameters[i]; - } - static int CRegisterParametersLength() { return 4; } - static int CStackBackingStoreLength() { return 0; } -}; - - -typedef LinkageHelper<ArmLinkageHelperTraits> LH; - -CallDescriptor* Linkage::GetJSCallDescriptor(Zone* zone, bool is_osr, - int parameter_count, - CallDescriptor::Flags flags) { - return LH::GetJSCallDescriptor(zone, is_osr, parameter_count, flags); -} - - -CallDescriptor* Linkage::GetRuntimeCallDescriptor( - Zone* zone, Runtime::FunctionId function, int parameter_count, - Operator::Properties properties) { - return LH::GetRuntimeCallDescriptor(zone, function, parameter_count, - properties); -} - - -CallDescriptor* Linkage::GetStubCallDescriptor( - Isolate* isolate, Zone* zone, const CallInterfaceDescriptor& descriptor, - int stack_parameter_count, CallDescriptor::Flags flags, - Operator::Properties properties, MachineType return_type) { - return LH::GetStubCallDescriptor(isolate, zone, descriptor, - stack_parameter_count, flags, properties, - return_type); -} - - -CallDescriptor* Linkage::GetSimplifiedCDescriptor(Zone* zone, - const MachineSignature* sig) { - return LH::GetSimplifiedCDescriptor(zone, sig); -} - -} // namespace compiler -} // namespace internal -} // namespace v8 |