diff options
author | 2015-05-19 18:08:00 +0100 | |
---|---|---|
committer | 2015-05-26 15:59:02 +0100 | |
commit | 80afd02024d20e60b197d3adfbb43cc303cf29e0 (patch) | |
tree | ef054c7b4f2a739f7cf063e0bc4c501c2c7e41b5 /compiler/optimizing | |
parent | 559b178e34c5d92e7932f92e5d8a981ac334606f (diff) |
ART: Clean up arm64 kNumberOfXRegisters usage.
Avoid undefined behavior for arm64 stemming from 1u << 32 in
loops with upper bound kNumberOfXRegisters.
Create iterators for enumerating bits in an integer either
from high to low or from low to high and use them for
<arch>Context::FillCalleeSaves() on all architectures.
Refactor runtime/utils.{h,cc} by moving all bit-fiddling
functions to runtime/base/bit_utils.{h,cc} (together with
the new bit iterators) and all time-related functions to
runtime/base/time_utils.{h,cc}. Improve test coverage and
fix some corner cases for the bit-fiddling functions.
Bug: 13925192
Change-Id: I704884dab15b41ecf7a1c47d397ab1c3fc7ee0f7
Diffstat (limited to 'compiler/optimizing')
-rw-r--r-- | compiler/optimizing/code_generator_arm.cc | 7 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_arm64.cc | 2 | ||||
-rw-r--r-- | compiler/optimizing/intrinsics.cc | 1 | ||||
-rw-r--r-- | compiler/optimizing/nodes.cc | 1 | ||||
-rw-r--r-- | compiler/optimizing/parallel_move_resolver.h | 1 | ||||
-rw-r--r-- | compiler/optimizing/register_allocator.h | 1 |
6 files changed, 6 insertions, 7 deletions
diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc index 1c76630efe..5f8023de2a 100644 --- a/compiler/optimizing/code_generator_arm.cc +++ b/compiler/optimizing/code_generator_arm.cc @@ -494,11 +494,6 @@ InstructionCodeGeneratorARM::InstructionCodeGeneratorARM(HGraph* graph, CodeGene assembler_(codegen->GetAssembler()), codegen_(codegen) {} -static uint32_t LeastSignificantBit(uint32_t mask) { - // ffs starts at 1. - return ffs(mask) - 1; -} - void CodeGeneratorARM::ComputeSpillMask() { core_spill_mask_ = allocated_registers_.GetCoreRegisters() & core_callee_save_mask_; // Save one extra register for baseline. Note that on thumb2, there is no easy @@ -2222,7 +2217,7 @@ void InstructionCodeGeneratorARM::DivRemByPowerOfTwo(HBinaryOperation* instructi Register dividend = locations->InAt(0).AsRegister<Register>(); Register temp = locations->GetTemp(0).AsRegister<Register>(); int32_t imm = second.GetConstant()->AsIntConstant()->GetValue(); - int32_t abs_imm = std::abs(imm); + uint32_t abs_imm = static_cast<uint32_t>(std::abs(imm)); DCHECK(IsPowerOfTwo(abs_imm)); int ctz_imm = CTZ(abs_imm); diff --git a/compiler/optimizing/code_generator_arm64.cc b/compiler/optimizing/code_generator_arm64.cc index b6d99abca0..ced60cd33f 100644 --- a/compiler/optimizing/code_generator_arm64.cc +++ b/compiler/optimizing/code_generator_arm64.cc @@ -1738,7 +1738,7 @@ void InstructionCodeGeneratorARM64::DivRemByPowerOfTwo(HBinaryOperation* instruc Register out = OutputRegister(instruction); Register dividend = InputRegisterAt(instruction, 0); int64_t imm = Int64FromConstant(second.GetConstant()); - int64_t abs_imm = std::abs(imm); + uint64_t abs_imm = static_cast<uint64_t>(std::abs(imm)); DCHECK(IsPowerOfTwo(abs_imm)); int ctz_imm = CTZ(abs_imm); diff --git a/compiler/optimizing/intrinsics.cc b/compiler/optimizing/intrinsics.cc index 43fe3746ad..9e18f114ad 100644 --- a/compiler/optimizing/intrinsics.cc +++ b/compiler/optimizing/intrinsics.cc @@ -22,6 +22,7 @@ #include "invoke_type.h" #include "nodes.h" #include "quick/inline_method_analyser.h" +#include "utils.h" namespace art { diff --git a/compiler/optimizing/nodes.cc b/compiler/optimizing/nodes.cc index 47da9cc17c..91daeb7a4c 100644 --- a/compiler/optimizing/nodes.cc +++ b/compiler/optimizing/nodes.cc @@ -19,6 +19,7 @@ #include "code_generator.h" #include "ssa_builder.h" #include "base/bit_vector-inl.h" +#include "base/bit_utils.h" #include "utils/growable_array.h" #include "scoped_thread_state_change.h" diff --git a/compiler/optimizing/parallel_move_resolver.h b/compiler/optimizing/parallel_move_resolver.h index e89417df7d..9ede91013e 100644 --- a/compiler/optimizing/parallel_move_resolver.h +++ b/compiler/optimizing/parallel_move_resolver.h @@ -20,6 +20,7 @@ #include "base/value_object.h" #include "utils/growable_array.h" #include "locations.h" +#include "primitive.h" namespace art { diff --git a/compiler/optimizing/register_allocator.h b/compiler/optimizing/register_allocator.h index 6d5bfc3f0d..c29fe75921 100644 --- a/compiler/optimizing/register_allocator.h +++ b/compiler/optimizing/register_allocator.h @@ -17,6 +17,7 @@ #ifndef ART_COMPILER_OPTIMIZING_REGISTER_ALLOCATOR_H_ #define ART_COMPILER_OPTIMIZING_REGISTER_ALLOCATOR_H_ +#include "arch/instruction_set.h" #include "base/macros.h" #include "primitive.h" #include "utils/growable_array.h" |