diff options
author | Vladimir Marko <vmarko@google.com> | 2015-06-16 09:06:59 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2015-06-16 09:07:00 +0000 |
commit | e4394f7de28ae0b517daa033749979e46ff676ab (patch) | |
tree | 320596587f320a0becda91cfe4fa72c8052fb90a /compiler/optimizing/code_generator_arm.cc | |
parent | f6c77d7632bdfe564c2ba61690fecc65f10ea9f6 (diff) | |
parent | f38caa68cce551fb153dff37d01db518e58ed00f (diff) |
Merge "ART: Implement literal pool for arm, fix branch fixup."
Diffstat (limited to 'compiler/optimizing/code_generator_arm.cc')
-rw-r--r-- | compiler/optimizing/code_generator_arm.cc | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc index 3d3e35d0fc..d14594562e 100644 --- a/compiler/optimizing/code_generator_arm.cc +++ b/compiler/optimizing/code_generator_arm.cc @@ -392,12 +392,26 @@ CodeGeneratorARM::CodeGeneratorARM(HGraph* graph, location_builder_(graph, this), instruction_visitor_(graph, this), move_resolver_(graph->GetArena(), this), - assembler_(false /* can_relocate_branches */), + assembler_(), isa_features_(isa_features) { // Save the PC register to mimic Quick. AddAllocatedRegister(Location::RegisterLocation(PC)); } +void CodeGeneratorARM::Finalize(CodeAllocator* allocator) { + // Ensure that we fix up branches and literal loads and emit the literal pool. + __ FinalizeCode(); + + // Adjust native pc offsets in stack maps. + for (size_t i = 0, num = stack_map_stream_.GetNumberOfStackMaps(); i != num; ++i) { + uint32_t old_position = stack_map_stream_.GetStackMap(i).native_pc_offset; + uint32_t new_position = __ GetAdjustedPosition(old_position); + stack_map_stream_.SetStackMapNativePcOffset(i, new_position); + } + + CodeGenerator::Finalize(allocator); +} + Location CodeGeneratorARM::AllocateFreeRegister(Primitive::Type type) const { switch (type) { case Primitive::kPrimLong: { @@ -2831,7 +2845,7 @@ void InstructionCodeGeneratorARM::VisitCompare(HCompare* compare) { Location left = locations->InAt(0); Location right = locations->InAt(1); - NearLabel less, greater, done; + Label less, greater, done; Primitive::Type type = compare->InputAt(0)->GetType(); switch (type) { case Primitive::kPrimLong: { @@ -2927,7 +2941,7 @@ void InstructionCodeGeneratorARM::GenerateWideAtomicStore(Register addr, Register temp1, Register temp2, HInstruction* instruction) { - NearLabel fail; + Label fail; if (offset != 0) { __ LoadImmediate(temp1, offset); __ add(IP, addr, ShifterOperand(temp1)); @@ -3607,7 +3621,7 @@ void CodeGeneratorARM::MarkGCCard(Register temp, Register object, Register value, bool can_be_null) { - NearLabel is_null; + Label is_null; if (can_be_null) { __ CompareAndBranchIfZero(value, &is_null); } @@ -4036,7 +4050,7 @@ void InstructionCodeGeneratorARM::VisitInstanceOf(HInstanceOf* instruction) { Register cls = locations->InAt(1).AsRegister<Register>(); Register out = locations->Out().AsRegister<Register>(); uint32_t class_offset = mirror::Object::ClassOffset().Int32Value(); - NearLabel done, zero; + Label done, zero; SlowPathCodeARM* slow_path = nullptr; // Return 0 if `obj` is null. @@ -4093,19 +4107,15 @@ void InstructionCodeGeneratorARM::VisitCheckCast(HCheckCast* instruction) { instruction, locations->InAt(1), locations->GetTemp(0), instruction->GetDexPc()); codegen_->AddSlowPath(slow_path); - NearLabel done; // avoid null check if we know obj is not null. if (instruction->MustDoNullCheck()) { - __ CompareAndBranchIfZero(obj, &done); + __ CompareAndBranchIfZero(obj, slow_path->GetExitLabel()); } // Compare the class of `obj` with `cls`. __ LoadFromOffset(kLoadWord, temp, obj, class_offset); __ cmp(temp, ShifterOperand(cls)); __ b(slow_path->GetEntryLabel(), NE); __ Bind(slow_path->GetExitLabel()); - if (instruction->MustDoNullCheck()) { - __ Bind(&done); - } } void LocationsBuilderARM::VisitMonitorOperation(HMonitorOperation* instruction) { |