diff options
Diffstat (limited to 'compiler/optimizing')
-rw-r--r-- | compiler/optimizing/code_generator.cc | 14 | ||||
-rw-r--r-- | compiler/optimizing/code_generator.h | 5 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_arm.cc | 17 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_arm.h | 3 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_arm64.cc | 18 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_arm64.h | 5 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_x86.cc | 62 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_x86.h | 2 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_x86_64.cc | 53 | ||||
-rw-r--r-- | compiler/optimizing/code_generator_x86_64.h | 2 |
10 files changed, 91 insertions, 90 deletions
diff --git a/compiler/optimizing/code_generator.cc b/compiler/optimizing/code_generator.cc index 0cd63a679c..65aea680fe 100644 --- a/compiler/optimizing/code_generator.cc +++ b/compiler/optimizing/code_generator.cc @@ -288,6 +288,20 @@ int32_t CodeGenerator::GetStackSlot(HLocal* local) const { } } +void CodeGenerator::CreateCommonInvokeLocationSummary( + HInvoke* invoke, InvokeDexCallingConventionVisitor* visitor){ + ArenaAllocator* allocator = invoke->GetBlock()->GetGraph()->GetArena(); + LocationSummary* locations = new (allocator) LocationSummary(invoke, LocationSummary::kCall); + locations->AddTemp(visitor->GetMethodLocation()); + + for (size_t i = 0; i < invoke->GetNumberOfArguments(); i++) { + HInstruction* input = invoke->InputAt(i); + locations->SetInAt(i, visitor->GetNextLocation(input->GetType())); + } + + locations->SetOut(visitor->GetReturnLocation(invoke->GetType())); +} + void CodeGenerator::BlockIfInRegister(Location location, bool is_out) const { // The DCHECKS below check that a register is not specified twice in // the summary. The out location can overlap with an input, so we need diff --git a/compiler/optimizing/code_generator.h b/compiler/optimizing/code_generator.h index 3012098e73..c6ebf6dbd8 100644 --- a/compiler/optimizing/code_generator.h +++ b/compiler/optimizing/code_generator.h @@ -115,6 +115,8 @@ class SlowPathCode : public ArenaObject<kArenaAllocSlowPaths> { class InvokeDexCallingConventionVisitor { public: virtual Location GetNextLocation(Primitive::Type type) = 0; + virtual Location GetReturnLocation(Primitive::Type type) const = 0; + virtual Location GetMethodLocation() const = 0; protected: InvokeDexCallingConventionVisitor() {} @@ -338,6 +340,9 @@ class CodeGenerator { virtual ParallelMoveResolver* GetMoveResolver() = 0; + static void CreateCommonInvokeLocationSummary( + HInvoke* invoke, InvokeDexCallingConventionVisitor* visitor); + protected: CodeGenerator(HGraph* graph, size_t number_of_core_registers, diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc index 987a6c4ff7..022948e0e7 100644 --- a/compiler/optimizing/code_generator_arm.cc +++ b/compiler/optimizing/code_generator_arm.cc @@ -681,7 +681,7 @@ Location InvokeDexCallingConventionVisitorARM::GetNextLocation(Primitive::Type t return Location(); } -Location InvokeDexCallingConventionVisitorARM::GetReturnLocation(Primitive::Type type) { +Location InvokeDexCallingConventionVisitorARM::GetReturnLocation(Primitive::Type type) const { switch (type) { case Primitive::kPrimBoolean: case Primitive::kPrimByte: @@ -710,6 +710,10 @@ Location InvokeDexCallingConventionVisitorARM::GetReturnLocation(Primitive::Type UNREACHABLE(); } +Location InvokeDexCallingConventionVisitorARM::GetMethodLocation() const { + return Location::RegisterLocation(kMethodRegisterArgument); +} + void CodeGeneratorARM::Move32(Location destination, Location source) { if (source.Equals(destination)) { return; @@ -1285,17 +1289,8 @@ void InstructionCodeGeneratorARM::VisitInvokeStaticOrDirect(HInvokeStaticOrDirec } void LocationsBuilderARM::HandleInvoke(HInvoke* invoke) { - LocationSummary* locations = - new (GetGraph()->GetArena()) LocationSummary(invoke, LocationSummary::kCall); - locations->AddTemp(Location::RegisterLocation(kMethodRegisterArgument)); - InvokeDexCallingConventionVisitorARM calling_convention_visitor; - for (size_t i = 0; i < invoke->GetNumberOfArguments(); i++) { - HInstruction* input = invoke->InputAt(i); - locations->SetInAt(i, calling_convention_visitor.GetNextLocation(input->GetType())); - } - - locations->SetOut(calling_convention_visitor.GetReturnLocation(invoke->GetType())); + CodeGenerator::CreateCommonInvokeLocationSummary(invoke, &calling_convention_visitor); } void LocationsBuilderARM::VisitInvokeVirtual(HInvokeVirtual* invoke) { diff --git a/compiler/optimizing/code_generator_arm.h b/compiler/optimizing/code_generator_arm.h index d649cbffd1..d84f2d3d20 100644 --- a/compiler/optimizing/code_generator_arm.h +++ b/compiler/optimizing/code_generator_arm.h @@ -86,7 +86,8 @@ class InvokeDexCallingConventionVisitorARM : public InvokeDexCallingConventionVi virtual ~InvokeDexCallingConventionVisitorARM() {} Location GetNextLocation(Primitive::Type type) OVERRIDE; - Location GetReturnLocation(Primitive::Type type); + Location GetReturnLocation(Primitive::Type type) const OVERRIDE; + Location GetMethodLocation() const OVERRIDE; private: InvokeDexCallingConvention calling_convention; diff --git a/compiler/optimizing/code_generator_arm64.cc b/compiler/optimizing/code_generator_arm64.cc index 40432e43d3..689a35a166 100644 --- a/compiler/optimizing/code_generator_arm64.cc +++ b/compiler/optimizing/code_generator_arm64.cc @@ -482,6 +482,10 @@ Location InvokeDexCallingConventionVisitorARM64::GetNextLocation(Primitive::Type return next_location; } +Location InvokeDexCallingConventionVisitorARM64::GetMethodLocation() const { + return LocationFrom(x0); +} + CodeGeneratorARM64::CodeGeneratorARM64(HGraph* graph, const Arm64InstructionSetFeatures& isa_features, const CompilerOptions& compiler_options) @@ -2163,20 +2167,8 @@ void InstructionCodeGeneratorARM64::VisitNullConstant(HNullConstant* constant) { } void LocationsBuilderARM64::HandleInvoke(HInvoke* invoke) { - LocationSummary* locations = - new (GetGraph()->GetArena()) LocationSummary(invoke, LocationSummary::kCall); - locations->AddTemp(LocationFrom(x0)); - InvokeDexCallingConventionVisitorARM64 calling_convention_visitor; - for (size_t i = 0; i < invoke->GetNumberOfArguments(); i++) { - HInstruction* input = invoke->InputAt(i); - locations->SetInAt(i, calling_convention_visitor.GetNextLocation(input->GetType())); - } - - Primitive::Type return_type = invoke->GetType(); - if (return_type != Primitive::kPrimVoid) { - locations->SetOut(calling_convention_visitor.GetReturnLocation(return_type)); - } + CodeGenerator::CreateCommonInvokeLocationSummary(invoke, &calling_convention_visitor); } void LocationsBuilderARM64::VisitInvokeInterface(HInvokeInterface* invoke) { diff --git a/compiler/optimizing/code_generator_arm64.h b/compiler/optimizing/code_generator_arm64.h index 7a502e05db..c62ba951cd 100644 --- a/compiler/optimizing/code_generator_arm64.h +++ b/compiler/optimizing/code_generator_arm64.h @@ -115,7 +115,7 @@ class InvokeDexCallingConvention : public CallingConvention<vixl::Register, vixl kParameterFPRegistersLength, kArm64PointerSize) {} - Location GetReturnLocation(Primitive::Type return_type) { + Location GetReturnLocation(Primitive::Type return_type) const { return ARM64ReturnLocation(return_type); } @@ -130,9 +130,10 @@ class InvokeDexCallingConventionVisitorARM64 : public InvokeDexCallingConvention virtual ~InvokeDexCallingConventionVisitorARM64() {} Location GetNextLocation(Primitive::Type type) OVERRIDE; - Location GetReturnLocation(Primitive::Type return_type) { + Location GetReturnLocation(Primitive::Type return_type) const OVERRIDE { return calling_convention.GetReturnLocation(return_type); } + Location GetMethodLocation() const OVERRIDE; private: InvokeDexCallingConvention calling_convention; diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc index f63a5d20c0..4c4fbd9b28 100644 --- a/compiler/optimizing/code_generator_x86.cc +++ b/compiler/optimizing/code_generator_x86.cc @@ -556,6 +556,32 @@ Location CodeGeneratorX86::GetStackLocation(HLoadLocal* load) const { UNREACHABLE(); } +Location InvokeDexCallingConventionVisitorX86::GetReturnLocation(Primitive::Type type) const { + switch (type) { + case Primitive::kPrimBoolean: + case Primitive::kPrimByte: + case Primitive::kPrimChar: + case Primitive::kPrimShort: + case Primitive::kPrimInt: + case Primitive::kPrimNot: + return Location::RegisterLocation(EAX); + + case Primitive::kPrimLong: + return Location::RegisterPairLocation(EAX, EDX); + + case Primitive::kPrimVoid: + return Location::NoLocation(); + + case Primitive::kPrimDouble: + case Primitive::kPrimFloat: + return Location::FpuRegisterLocation(XMM0); + } +} + +Location InvokeDexCallingConventionVisitorX86::GetMethodLocation() const { + return Location::RegisterLocation(kMethodRegisterArgument); +} + Location InvokeDexCallingConventionVisitorX86::GetNextLocation(Primitive::Type type) { switch (type) { case Primitive::kPrimBoolean: @@ -977,7 +1003,6 @@ void LocationsBuilderX86::VisitStoreLocal(HStoreLocal* store) { default: LOG(FATAL) << "Unknown local type " << store->InputAt(1)->GetType(); } - store->SetLocations(locations); } void InstructionCodeGeneratorX86::VisitStoreLocal(HStoreLocal* store) { @@ -1238,40 +1263,8 @@ void LocationsBuilderX86::VisitInvokeVirtual(HInvokeVirtual* invoke) { } void LocationsBuilderX86::HandleInvoke(HInvoke* invoke) { - LocationSummary* locations = - new (GetGraph()->GetArena()) LocationSummary(invoke, LocationSummary::kCall); - locations->AddTemp(Location::RegisterLocation(kMethodRegisterArgument)); - InvokeDexCallingConventionVisitorX86 calling_convention_visitor; - for (size_t i = 0; i < invoke->GetNumberOfArguments(); i++) { - HInstruction* input = invoke->InputAt(i); - locations->SetInAt(i, calling_convention_visitor.GetNextLocation(input->GetType())); - } - - switch (invoke->GetType()) { - case Primitive::kPrimBoolean: - case Primitive::kPrimByte: - case Primitive::kPrimChar: - case Primitive::kPrimShort: - case Primitive::kPrimInt: - case Primitive::kPrimNot: - locations->SetOut(Location::RegisterLocation(EAX)); - break; - - case Primitive::kPrimLong: - locations->SetOut(Location::RegisterPairLocation(EAX, EDX)); - break; - - case Primitive::kPrimVoid: - break; - - case Primitive::kPrimDouble: - case Primitive::kPrimFloat: - locations->SetOut(Location::FpuRegisterLocation(XMM0)); - break; - } - - invoke->SetLocations(locations); + CodeGenerator::CreateCommonInvokeLocationSummary(invoke, &calling_convention_visitor); } void InstructionCodeGeneratorX86::VisitInvokeVirtual(HInvokeVirtual* invoke) { @@ -3922,7 +3915,6 @@ void LocationsBuilderX86::VisitArrayLength(HArrayLength* instruction) { LocationSummary* locations = new (GetGraph()->GetArena()) LocationSummary(instruction); locations->SetInAt(0, Location::RequiresRegister()); locations->SetOut(Location::RequiresRegister(), Location::kNoOutputOverlap); - instruction->SetLocations(locations); } void InstructionCodeGeneratorX86::VisitArrayLength(HArrayLength* instruction) { diff --git a/compiler/optimizing/code_generator_x86.h b/compiler/optimizing/code_generator_x86.h index 6988803360..61827a45ab 100644 --- a/compiler/optimizing/code_generator_x86.h +++ b/compiler/optimizing/code_generator_x86.h @@ -83,6 +83,8 @@ class InvokeDexCallingConventionVisitorX86 : public InvokeDexCallingConventionVi virtual ~InvokeDexCallingConventionVisitorX86() {} Location GetNextLocation(Primitive::Type type) OVERRIDE; + Location GetReturnLocation(Primitive::Type type) const OVERRIDE; + Location GetMethodLocation() const OVERRIDE; private: InvokeDexCallingConvention calling_convention; diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc index ca9a154717..febe2bcd7b 100644 --- a/compiler/optimizing/code_generator_x86_64.cc +++ b/compiler/optimizing/code_generator_x86_64.cc @@ -1245,6 +1245,30 @@ void InstructionCodeGeneratorX86_64::VisitReturn(HReturn* ret) { codegen_->GenerateFrameExit(); } +Location InvokeDexCallingConventionVisitorX86_64::GetReturnLocation(Primitive::Type type) const { + switch (type) { + case Primitive::kPrimBoolean: + case Primitive::kPrimByte: + case Primitive::kPrimChar: + case Primitive::kPrimShort: + case Primitive::kPrimInt: + case Primitive::kPrimNot: + case Primitive::kPrimLong: + return Location::RegisterLocation(RAX); + + case Primitive::kPrimVoid: + return Location::NoLocation(); + + case Primitive::kPrimDouble: + case Primitive::kPrimFloat: + return Location::FpuRegisterLocation(XMM0); + } +} + +Location InvokeDexCallingConventionVisitorX86_64::GetMethodLocation() const { + return Location::RegisterLocation(kMethodRegisterArgument); +} + Location InvokeDexCallingConventionVisitorX86_64::GetNextLocation(Primitive::Type type) { switch (type) { case Primitive::kPrimBoolean: @@ -1339,35 +1363,8 @@ void InstructionCodeGeneratorX86_64::VisitInvokeStaticOrDirect(HInvokeStaticOrDi } void LocationsBuilderX86_64::HandleInvoke(HInvoke* invoke) { - LocationSummary* locations = - new (GetGraph()->GetArena()) LocationSummary(invoke, LocationSummary::kCall); - locations->AddTemp(Location::RegisterLocation(kMethodRegisterArgument)); - InvokeDexCallingConventionVisitorX86_64 calling_convention_visitor; - for (size_t i = 0; i < invoke->GetNumberOfArguments(); i++) { - HInstruction* input = invoke->InputAt(i); - locations->SetInAt(i, calling_convention_visitor.GetNextLocation(input->GetType())); - } - - switch (invoke->GetType()) { - case Primitive::kPrimBoolean: - case Primitive::kPrimByte: - case Primitive::kPrimChar: - case Primitive::kPrimShort: - case Primitive::kPrimInt: - case Primitive::kPrimNot: - case Primitive::kPrimLong: - locations->SetOut(Location::RegisterLocation(RAX)); - break; - - case Primitive::kPrimVoid: - break; - - case Primitive::kPrimDouble: - case Primitive::kPrimFloat: - locations->SetOut(Location::FpuRegisterLocation(XMM0)); - break; - } + CodeGenerator::CreateCommonInvokeLocationSummary(invoke, &calling_convention_visitor); } void LocationsBuilderX86_64::VisitInvokeVirtual(HInvokeVirtual* invoke) { diff --git a/compiler/optimizing/code_generator_x86_64.h b/compiler/optimizing/code_generator_x86_64.h index c74335bffb..c19e686c10 100644 --- a/compiler/optimizing/code_generator_x86_64.h +++ b/compiler/optimizing/code_generator_x86_64.h @@ -76,6 +76,8 @@ class InvokeDexCallingConventionVisitorX86_64 : public InvokeDexCallingConventio virtual ~InvokeDexCallingConventionVisitorX86_64() {} Location GetNextLocation(Primitive::Type type) OVERRIDE; + Location GetReturnLocation(Primitive::Type type) const OVERRIDE; + Location GetMethodLocation() const OVERRIDE; private: InvokeDexCallingConvention calling_convention; |