From e577a18bd8303252872485e85a070c3b9d30ef56 Mon Sep 17 00:00:00 2001 From: "alexandre.rames@arm.com" Date: Mon, 24 Mar 2014 17:41:37 +0000 Subject: [PATCH] ARM64: Fix Register and FPRegister copy constructors. This issue was introduced in r19156. R=ulan@chromium.org Review URL: https://codereview.chromium.org/207743003 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20212 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm64/assembler-arm64.h | 23 +++++++++++++++++++---- src/arm64/macro-assembler-arm64.h | 2 +- src/arm64/stub-cache-arm64.cc | 4 ++-- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/arm64/assembler-arm64.h b/src/arm64/assembler-arm64.h index e3e0277..41eaaad 100644 --- a/src/arm64/assembler-arm64.h +++ b/src/arm64/assembler-arm64.h @@ -115,7 +115,7 @@ struct CPURegister { struct Register : public CPURegister { static Register Create(unsigned code, unsigned size) { - return CPURegister::Create(code, size, CPURegister::kRegister); + return Register(CPURegister::Create(code, size, CPURegister::kRegister)); } Register() { @@ -124,7 +124,14 @@ struct Register : public CPURegister { reg_type = CPURegister::kNoRegister; } - Register(const CPURegister& r) { // NOLINT(runtime/explicit) + explicit Register(const CPURegister& r) { + reg_code = r.reg_code; + reg_size = r.reg_size; + reg_type = r.reg_type; + ASSERT(IsValidOrNone()); + } + + Register(const Register& r) { // NOLINT(runtime/explicit) reg_code = r.reg_code; reg_size = r.reg_size; reg_type = r.reg_type; @@ -236,7 +243,8 @@ struct Register : public CPURegister { struct FPRegister : public CPURegister { static FPRegister Create(unsigned code, unsigned size) { - return CPURegister::Create(code, size, CPURegister::kFPRegister); + return FPRegister( + CPURegister::Create(code, size, CPURegister::kFPRegister)); } FPRegister() { @@ -245,7 +253,14 @@ struct FPRegister : public CPURegister { reg_type = CPURegister::kNoRegister; } - FPRegister(const CPURegister& r) { // NOLINT(runtime/explicit) + explicit FPRegister(const CPURegister& r) { + reg_code = r.reg_code; + reg_size = r.reg_size; + reg_type = r.reg_type; + ASSERT(IsValidOrNone()); + } + + FPRegister(const FPRegister& r) { // NOLINT(runtime/explicit) reg_code = r.reg_code; reg_size = r.reg_size; reg_type = r.reg_type; diff --git a/src/arm64/macro-assembler-arm64.h b/src/arm64/macro-assembler-arm64.h index e676e2f..ad706f6 100644 --- a/src/arm64/macro-assembler-arm64.h +++ b/src/arm64/macro-assembler-arm64.h @@ -2216,7 +2216,7 @@ class UseScratchRegisterScope { FPRegister AcquireD() { return AcquireNextAvailable(availablefp_).D(); } Register UnsafeAcquire(const Register& reg) { - return UnsafeAcquire(available_, reg); + return Register(UnsafeAcquire(available_, reg)); } Register AcquireSameSizeAs(const Register& reg); diff --git a/src/arm64/stub-cache-arm64.cc b/src/arm64/stub-cache-arm64.cc index 0711aca..1b2e959 100644 --- a/src/arm64/stub-cache-arm64.cc +++ b/src/arm64/stub-cache-arm64.cc @@ -395,7 +395,7 @@ void StoreStubCompiler::GenerateStoreTransition(MacroAssembler* masm, __ JumpIfSmi(value_reg, miss_label); } else if (representation.IsDouble()) { UseScratchRegisterScope temps(masm); - Register temp_double = temps.AcquireD(); + DoubleRegister temp_double = temps.AcquireD(); __ SmiUntagToDouble(temp_double, value_reg, kSpeculativeUntag); Label do_store, heap_number; @@ -546,7 +546,7 @@ void StoreStubCompiler::GenerateStoreField(MacroAssembler* masm, __ JumpIfSmi(value_reg, miss_label); } else if (representation.IsDouble()) { UseScratchRegisterScope temps(masm); - Register temp_double = temps.AcquireD(); + DoubleRegister temp_double = temps.AcquireD(); __ SmiUntagToDouble(temp_double, value_reg, kSpeculativeUntag); -- 2.7.4