From 82000b0cf9bb32fc55cdb125bf37c884d44a8671 Mon Sep 17 00:00:00 2001 From: Alexandre Rames Date: Tue, 7 Jul 2015 11:34:16 +0100 Subject: Improve code generation for ARM64 VisitArrayGet/Set. We prefer the code sequence add temp, obj, #offset ldr out, [temp, index LSL #shift_amount] to add temp, obj, index LSL #shift_amount ldr out, [temp, #offset] Change-Id: I98f51a1b5a5ecd84c677d6dbd4c4bfc0f157f5e2 --- compiler/optimizing/code_generator_arm64.cc | 13 +++++++------ compiler/optimizing/common_arm64.h | 9 +++++++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/compiler/optimizing/code_generator_arm64.cc b/compiler/optimizing/code_generator_arm64.cc index a9a95d3649..f64e801285 100644 --- a/compiler/optimizing/code_generator_arm64.cc +++ b/compiler/optimizing/code_generator_arm64.cc @@ -1477,9 +1477,8 @@ void InstructionCodeGeneratorARM64::VisitArrayGet(HArrayGet* instruction) { source = HeapOperand(obj, offset); } else { Register temp = temps.AcquireSameSizeAs(obj); - Register index_reg = RegisterFrom(index, Primitive::kPrimInt); - __ Add(temp, obj, Operand(index_reg, LSL, Primitive::ComponentSizeShift(type))); - source = HeapOperand(temp, offset); + __ Add(temp, obj, offset); + source = HeapOperand(temp, XRegisterFrom(index), LSL, Primitive::ComponentSizeShift(type)); } codegen_->Load(type, OutputCPURegister(instruction), source); @@ -1562,9 +1561,11 @@ void InstructionCodeGeneratorARM64::VisitArraySet(HArraySet* instruction) { destination = HeapOperand(obj, offset); } else { Register temp = temps.AcquireSameSizeAs(obj); - Register index_reg = InputRegisterAt(instruction, 1); - __ Add(temp, obj, Operand(index_reg, LSL, Primitive::ComponentSizeShift(value_type))); - destination = HeapOperand(temp, offset); + __ Add(temp, obj, offset); + destination = HeapOperand(temp, + XRegisterFrom(index), + LSL, + Primitive::ComponentSizeShift(value_type)); } codegen_->Store(value_type, source, destination); diff --git a/compiler/optimizing/common_arm64.h b/compiler/optimizing/common_arm64.h index 246fff99ac..f54547534f 100644 --- a/compiler/optimizing/common_arm64.h +++ b/compiler/optimizing/common_arm64.h @@ -151,6 +151,15 @@ static inline vixl::MemOperand HeapOperand(const vixl::Register& base, size_t of return vixl::MemOperand(base.X(), offset); } +static inline vixl::MemOperand HeapOperand(const vixl::Register& base, + const vixl::Register& regoffset, + vixl::Shift shift = vixl::LSL, + unsigned shift_amount = 0) { + // A heap reference must be 32bit, so fit in a W register. + DCHECK(base.IsW()); + return vixl::MemOperand(base.X(), regoffset, shift, shift_amount); +} + static inline vixl::MemOperand HeapOperand(const vixl::Register& base, Offset offset) { return HeapOperand(base, offset.SizeValue()); } -- cgit v1.2.3-59-g8ed1b