diff options
Diffstat (limited to 'compiler/dex/quick/arm64')
-rw-r--r-- | compiler/dex/quick/arm64/arm64_lir.h | 4 | ||||
-rw-r--r-- | compiler/dex/quick/arm64/call_arm64.cc | 25 | ||||
-rw-r--r-- | compiler/dex/quick/arm64/codegen_arm64.h | 3 | ||||
-rw-r--r-- | compiler/dex/quick/arm64/int_arm64.cc | 9 | ||||
-rw-r--r-- | compiler/dex/quick/arm64/target_arm64.cc | 9 |
5 files changed, 25 insertions, 25 deletions
diff --git a/compiler/dex/quick/arm64/arm64_lir.h b/compiler/dex/quick/arm64/arm64_lir.h index 303ea3e306..2253d1006c 100644 --- a/compiler/dex/quick/arm64/arm64_lir.h +++ b/compiler/dex/quick/arm64/arm64_lir.h @@ -72,7 +72,7 @@ namespace art { * | IN[ins-1] | {Note: resides in caller's frame} * | . | * | IN[0] | - * | caller's method (StackReference<ArtMethod>)| {This is a compressed (4-bytes) reference} + * | caller's method ArtMethod* | {Pointer sized reference} * +============================================+ {Note: start of callee's frame} * | spill region | {variable sized - will include lr if non-leaf} * +--------------------------------------------+ @@ -91,7 +91,7 @@ namespace art { * | OUT[outs-2] | * | . | * | OUT[0] | - * | current method (StackReference<ArtMethod>) | <<== sp w/ 16-byte alignment + * | current method ArtMethod* | <<== sp w/ 16-byte alignment * +============================================+ */ diff --git a/compiler/dex/quick/arm64/call_arm64.cc b/compiler/dex/quick/arm64/call_arm64.cc index e49e40d868..83a6affe81 100644 --- a/compiler/dex/quick/arm64/call_arm64.cc +++ b/compiler/dex/quick/arm64/call_arm64.cc @@ -19,6 +19,7 @@ #include "codegen_arm64.h" #include "arm64_lir.h" +#include "art_method.h" #include "base/logging.h" #include "dex/mir_graph.h" #include "dex/quick/dex_file_to_method_inliner_map.h" @@ -27,7 +28,6 @@ #include "driver/compiler_options.h" #include "gc/accounting/card_table.h" #include "entrypoints/quick/quick_entrypoints.h" -#include "mirror/art_method.h" #include "mirror/object_array-inl.h" #include "utils/dex_cache_arrays_layout-inl.h" @@ -456,23 +456,22 @@ static bool Arm64UseRelativeCall(CompilationUnit* cu, const MethodReference& tar */ int Arm64Mir2Lir::Arm64NextSDCallInsn(CompilationUnit* cu, CallInfo* info, int state, const MethodReference& target_method, - uint32_t unused_idx, + uint32_t unused_idx ATTRIBUTE_UNUSED, uintptr_t direct_code, uintptr_t direct_method, InvokeType type) { - UNUSED(info, unused_idx); Arm64Mir2Lir* cg = static_cast<Arm64Mir2Lir*>(cu->cg.get()); if (info->string_init_offset != 0) { RegStorage arg0_ref = cg->TargetReg(kArg0, kRef); switch (state) { case 0: { // Grab target method* from thread pointer - cg->LoadRefDisp(rs_xSELF, info->string_init_offset, arg0_ref, kNotVolatile); + cg->LoadWordDisp(rs_xSELF, info->string_init_offset, arg0_ref); break; } case 1: // Grab the code from the method* if (direct_code == 0) { // kInvokeTgt := arg0_ref->entrypoint cg->LoadWordDisp(arg0_ref, - mirror::ArtMethod::EntryPointFromQuickCompiledCodeOffset( + ArtMethod::EntryPointFromQuickCompiledCodeOffset( kArm64PointerSize).Int32Value(), cg->TargetPtrReg(kInvokeTgt)); } break; @@ -500,7 +499,7 @@ int Arm64Mir2Lir::Arm64NextSDCallInsn(CompilationUnit* cu, CallInfo* info, } } else { bool use_pc_rel = cg->CanUseOpPcRelDexCacheArrayLoad(); - RegStorage arg0_ref = cg->TargetReg(kArg0, kRef); + RegStorage arg0_ref = cg->TargetPtrReg(kArg0); switch (state) { case 0: // Get the current Method* [sets kArg0] // TUNING: we can save a reg copy if Method* has been promoted. @@ -513,7 +512,7 @@ int Arm64Mir2Lir::Arm64NextSDCallInsn(CompilationUnit* cu, CallInfo* info, case 1: // Get method->dex_cache_resolved_methods_ if (!use_pc_rel) { cg->LoadRefDisp(arg0_ref, - mirror::ArtMethod::DexCacheResolvedMethodsOffset().Int32Value(), + ArtMethod::DexCacheResolvedMethodsOffset().Int32Value(), arg0_ref, kNotVolatile); } @@ -536,21 +535,19 @@ int Arm64Mir2Lir::Arm64NextSDCallInsn(CompilationUnit* cu, CallInfo* info, case 2: // Grab target method* CHECK_EQ(cu->dex_file, target_method.dex_file); if (!use_pc_rel) { - cg->LoadRefDisp(arg0_ref, - mirror::ObjectArray<mirror::Object>::OffsetOfElement( - target_method.dex_method_index).Int32Value(), - arg0_ref, - kNotVolatile); + cg->LoadWordDisp(arg0_ref, + mirror::Array::DataOffset(kArm64PointerSize).Uint32Value() + + target_method.dex_method_index * kArm64PointerSize, arg0_ref); } else { size_t offset = cg->dex_cache_arrays_layout_.MethodOffset(target_method.dex_method_index); - cg->OpPcRelDexCacheArrayLoad(cu->dex_file, offset, arg0_ref); + cg->OpPcRelDexCacheArrayLoad(cu->dex_file, offset, arg0_ref, true); } break; case 3: // Grab the code from the method* if (direct_code == 0) { // kInvokeTgt := arg0_ref->entrypoint cg->LoadWordDisp(arg0_ref, - mirror::ArtMethod::EntryPointFromQuickCompiledCodeOffset( + ArtMethod::EntryPointFromQuickCompiledCodeOffset( kArm64PointerSize).Int32Value(), cg->TargetPtrReg(kInvokeTgt)); } break; diff --git a/compiler/dex/quick/arm64/codegen_arm64.h b/compiler/dex/quick/arm64/codegen_arm64.h index 8184f02287..ca2e012950 100644 --- a/compiler/dex/quick/arm64/codegen_arm64.h +++ b/compiler/dex/quick/arm64/codegen_arm64.h @@ -79,7 +79,8 @@ class Arm64Mir2Lir FINAL : public Mir2Lir { void UnconditionallyMarkGCCard(RegStorage tgt_addr_reg) OVERRIDE; bool CanUseOpPcRelDexCacheArrayLoad() const OVERRIDE; - void OpPcRelDexCacheArrayLoad(const DexFile* dex_file, int offset, RegStorage r_dest) OVERRIDE; + void OpPcRelDexCacheArrayLoad(const DexFile* dex_file, int offset, RegStorage r_dest, bool wide) + OVERRIDE; LIR* OpCmpMemImmBranch(ConditionCode cond, RegStorage temp_reg, RegStorage base_reg, int offset, int check_value, LIR* target, LIR** compare) OVERRIDE; diff --git a/compiler/dex/quick/arm64/int_arm64.cc b/compiler/dex/quick/arm64/int_arm64.cc index 08aa5d20d0..31cf6675af 100644 --- a/compiler/dex/quick/arm64/int_arm64.cc +++ b/compiler/dex/quick/arm64/int_arm64.cc @@ -947,14 +947,17 @@ bool Arm64Mir2Lir::CanUseOpPcRelDexCacheArrayLoad() const { return dex_cache_arrays_layout_.Valid(); } -void Arm64Mir2Lir::OpPcRelDexCacheArrayLoad(const DexFile* dex_file, int offset, - RegStorage r_dest) { +void Arm64Mir2Lir::OpPcRelDexCacheArrayLoad(const DexFile* dex_file, int offset, RegStorage r_dest, + bool wide) { LIR* adrp = NewLIR2(kA64Adrp2xd, r_dest.GetReg(), 0); adrp->operands[2] = WrapPointer(dex_file); adrp->operands[3] = offset; adrp->operands[4] = WrapPointer(adrp); dex_cache_access_insns_.push_back(adrp); - LIR* ldr = LoadBaseDisp(r_dest, 0, r_dest, kReference, kNotVolatile); + if (wide) { + DCHECK(r_dest.Is64Bit()); + } + LIR* ldr = LoadBaseDisp(r_dest, 0, r_dest, wide ? k64 : kReference, kNotVolatile); ldr->operands[4] = adrp->operands[4]; ldr->flags.fixup = kFixupLabel; dex_cache_access_insns_.push_back(ldr); diff --git a/compiler/dex/quick/arm64/target_arm64.cc b/compiler/dex/quick/arm64/target_arm64.cc index fe15391e2c..6efa11e1fd 100644 --- a/compiler/dex/quick/arm64/target_arm64.cc +++ b/compiler/dex/quick/arm64/target_arm64.cc @@ -858,7 +858,8 @@ void Arm64Mir2Lir::InstallLiteralPools() { // PC-relative references to dex cache arrays. for (LIR* p : dex_cache_access_insns_) { - DCHECK(p->opcode == kA64Adrp2xd || p->opcode == kA64Ldr3rXD); + auto non_wide = UNWIDE(p->opcode); // May be a wide load for ArtMethod*. + DCHECK(non_wide == kA64Adrp2xd || non_wide == kA64Ldr3rXD) << p->opcode << " " << non_wide; const LIR* adrp = UnwrapPointer<LIR>(p->operands[4]); DCHECK_EQ(adrp->opcode, kA64Adrp2xd); const DexFile* dex_file = UnwrapPointer<DexFile>(adrp->operands[2]); @@ -894,8 +895,7 @@ void Arm64Mir2Lir::GenMachineSpecificExtendedMethodMIR(BasicBlock* bb, MIR* mir) rl_src[0] = mir_graph_->GetSrc(mir, 0); rl_src[1] = mir_graph_->GetSrc(mir, 1); rl_src[2]= mir_graph_->GetSrc(mir, 2); - GenMaddMsubInt(rl_dest, rl_src[0], rl_src[1], rl_src[2], - (opcode == kMirOpMsubInt) ? true : false); + GenMaddMsubInt(rl_dest, rl_src[0], rl_src[1], rl_src[2], opcode == kMirOpMsubInt); break; case kMirOpMaddLong: case kMirOpMsubLong: @@ -903,8 +903,7 @@ void Arm64Mir2Lir::GenMachineSpecificExtendedMethodMIR(BasicBlock* bb, MIR* mir) rl_src[0] = mir_graph_->GetSrcWide(mir, 0); rl_src[1] = mir_graph_->GetSrcWide(mir, 2); rl_src[2] = mir_graph_->GetSrcWide(mir, 4); - GenMaddMsubLong(rl_dest, rl_src[0], rl_src[1], rl_src[2], - (opcode == kMirOpMsubLong) ? true : false); + GenMaddMsubLong(rl_dest, rl_src[0], rl_src[1], rl_src[2], opcode == kMirOpMsubLong); break; default: LOG(FATAL) << "Unexpected opcode: " << static_cast<int>(opcode); |