diff options
Diffstat (limited to 'chromium/v8/src/lithium-allocator.cc')
-rw-r--r-- | chromium/v8/src/lithium-allocator.cc | 68 |
1 files changed, 29 insertions, 39 deletions
diff --git a/chromium/v8/src/lithium-allocator.cc b/chromium/v8/src/lithium-allocator.cc index 29c31942e44..a36f7de5c8e 100644 --- a/chromium/v8/src/lithium-allocator.cc +++ b/chromium/v8/src/lithium-allocator.cc @@ -1,44 +1,25 @@ // Copyright 2012 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include "v8.h" -#include "lithium-allocator-inl.h" - -#include "hydrogen.h" -#include "string-stream.h" +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/v8.h" +#include "src/lithium-allocator-inl.h" + +#include "src/hydrogen.h" +#include "src/string-stream.h" #if V8_TARGET_ARCH_IA32 -#include "ia32/lithium-ia32.h" +#include "src/ia32/lithium-ia32.h" #elif V8_TARGET_ARCH_X64 -#include "x64/lithium-x64.h" +#include "src/x64/lithium-x64.h" +#elif V8_TARGET_ARCH_ARM64 +#include "src/arm64/lithium-arm64.h" #elif V8_TARGET_ARCH_ARM -#include "arm/lithium-arm.h" +#include "src/arm/lithium-arm.h" #elif V8_TARGET_ARCH_MIPS -#include "mips/lithium-mips.h" +#include "src/mips/lithium-mips.h" +#elif V8_TARGET_ARCH_X87 +#include "src/x87/lithium-x87.h" #else #error "Unknown architecture." #endif @@ -67,7 +48,8 @@ UsePosition::UsePosition(LifetimePosition pos, register_beneficial_(true) { if (operand_ != NULL && operand_->IsUnallocated()) { LUnallocated* unalloc = LUnallocated::cast(operand_); - requires_reg_ = unalloc->HasRegisterPolicy(); + requires_reg_ = unalloc->HasRegisterPolicy() || + unalloc->HasDoubleRegisterPolicy(); register_beneficial_ = !unalloc->HasAnyPolicy(); } ASSERT(pos_.IsValid()); @@ -984,7 +966,7 @@ void LAllocator::ProcessInstructions(HBasicBlock* block, BitVector* live) { } } - if (instr->ClobbersDoubleRegisters()) { + if (instr->ClobbersDoubleRegisters(isolate())) { for (int i = 0; i < DoubleRegister::NumAllocatableRegisters(); ++i) { if (output == NULL || !output->IsDoubleRegister() || output->index() != i) { @@ -1026,6 +1008,15 @@ void LAllocator::ProcessInstructions(HBasicBlock* block, BitVector* live) { } Use(block_start_position, curr_position.InstructionEnd(), temp, NULL); Define(curr_position, temp, NULL); + + if (temp->IsUnallocated()) { + LUnallocated* temp_unalloc = LUnallocated::cast(temp); + if (temp_unalloc->HasDoubleRegisterPolicy()) { + double_artificial_registers_.Add( + temp_unalloc->virtual_register() - first_artificial_register_, + zone()); + } + } } } } @@ -1116,7 +1107,6 @@ bool LAllocator::Allocate(LChunk* chunk) { void LAllocator::MeetRegisterConstraints() { LAllocatorPhase phase("L_Register constraints", this); - first_artificial_register_ = next_virtual_register_; const ZoneList<HBasicBlock*>* blocks = graph_->blocks(); for (int i = 0; i < blocks->length(); ++i) { HBasicBlock* block = blocks->at(i); @@ -1369,7 +1359,7 @@ void LAllocator::BuildLiveRanges() { ASSERT(chunk_->info()->IsOptimizing()); AllowHandleDereference allow_deref; PrintF("Function: %s\n", - *chunk_->info()->function()->debug_name()->ToCString()); + chunk_->info()->function()->debug_name()->ToCString().get()); } PrintF("Value %d used before first definition!\n", operand_index); LiveRange* range = LiveRangeFor(operand_index); |