summaryrefslogtreecommitdiff
path: root/compiler/optimizing
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/optimizing')
-rw-r--r--compiler/optimizing/code_generator_arm64.cc42
-rw-r--r--compiler/optimizing/code_generator_arm64.h3
-rw-r--r--compiler/optimizing/code_generator_arm_vixl.cc58
-rw-r--r--compiler/optimizing/code_generator_arm_vixl.h7
-rw-r--r--compiler/optimizing/code_generator_mips.cc45
-rw-r--r--compiler/optimizing/code_generator_mips.h3
-rw-r--r--compiler/optimizing/code_generator_mips64.cc38
-rw-r--r--compiler/optimizing/code_generator_mips64.h3
-rw-r--r--compiler/optimizing/code_generator_x86.cc42
-rw-r--r--compiler/optimizing/code_generator_x86.h3
-rw-r--r--compiler/optimizing/code_generator_x86_64.cc42
-rw-r--r--compiler/optimizing/code_generator_x86_64.h3
12 files changed, 127 insertions, 162 deletions
diff --git a/compiler/optimizing/code_generator_arm64.cc b/compiler/optimizing/code_generator_arm64.cc
index b0ddd8e8c6..04da898859 100644
--- a/compiler/optimizing/code_generator_arm64.cc
+++ b/compiler/optimizing/code_generator_arm64.cc
@@ -5484,9 +5484,9 @@ static void CreateMinMaxLocations(ArenaAllocator* allocator, HBinaryOperation* m
}
}
-void InstructionCodeGeneratorARM64::GenerateMinMax(LocationSummary* locations,
- bool is_min,
- DataType::Type type) {
+void InstructionCodeGeneratorARM64::GenerateMinMaxInt(LocationSummary* locations,
+ bool is_min,
+ DataType::Type type) {
Location op1 = locations->InAt(0);
Location op2 = locations->InAt(1);
Location out = locations->Out();
@@ -5537,43 +5537,37 @@ void InstructionCodeGeneratorARM64::GenerateMinMaxFP(LocationSummary* locations,
}
}
-void LocationsBuilderARM64::VisitMin(HMin* min) {
- CreateMinMaxLocations(GetGraph()->GetAllocator(), min);
-}
-
// TODO: integrate with HandleBinaryOp?
-void InstructionCodeGeneratorARM64::VisitMin(HMin* min) {
- switch (min->GetResultType()) {
+void InstructionCodeGeneratorARM64::GenerateMinMax(HBinaryOperation* minmax, bool is_min) {
+ DataType::Type type = minmax->GetResultType();
+ switch (type) {
case DataType::Type::kInt32:
case DataType::Type::kInt64:
- GenerateMinMax(min->GetLocations(), /*is_min*/ true, min->GetResultType());
+ GenerateMinMaxInt(minmax->GetLocations(), is_min, type);
break;
case DataType::Type::kFloat32:
case DataType::Type::kFloat64:
- GenerateMinMaxFP(min->GetLocations(), /*is_min*/ true, min->GetResultType());
+ GenerateMinMaxFP(minmax->GetLocations(), is_min, type);
break;
default:
- LOG(FATAL) << "Unexpected type for HMin " << min->GetResultType();
+ LOG(FATAL) << "Unexpected type for HMinMax " << type;
}
}
+void LocationsBuilderARM64::VisitMin(HMin* min) {
+ CreateMinMaxLocations(GetGraph()->GetAllocator(), min);
+}
+
+void InstructionCodeGeneratorARM64::VisitMin(HMin* min) {
+ GenerateMinMax(min, /*is_min*/ true);
+}
+
void LocationsBuilderARM64::VisitMax(HMax* max) {
CreateMinMaxLocations(GetGraph()->GetAllocator(), max);
}
void InstructionCodeGeneratorARM64::VisitMax(HMax* max) {
- switch (max->GetResultType()) {
- case DataType::Type::kInt32:
- case DataType::Type::kInt64:
- GenerateMinMax(max->GetLocations(), /*is_min*/ false, max->GetResultType());
- break;
- case DataType::Type::kFloat32:
- case DataType::Type::kFloat64:
- GenerateMinMaxFP(max->GetLocations(), /*is_min*/ false, max->GetResultType());
- break;
- default:
- LOG(FATAL) << "Unexpected type for HMax " << max->GetResultType();
- }
+ GenerateMinMax(max, /*is_min*/ false);
}
void LocationsBuilderARM64::VisitAbs(HAbs* abs) {
diff --git a/compiler/optimizing/code_generator_arm64.h b/compiler/optimizing/code_generator_arm64.h
index 70f5500016..06cd540d0a 100644
--- a/compiler/optimizing/code_generator_arm64.h
+++ b/compiler/optimizing/code_generator_arm64.h
@@ -273,8 +273,9 @@ class InstructionCodeGeneratorARM64 : public InstructionCodeGenerator {
void HandleFieldGet(HInstruction* instruction, const FieldInfo& field_info);
void HandleCondition(HCondition* instruction);
- void GenerateMinMax(LocationSummary* locations, bool is_min, DataType::Type type);
+ void GenerateMinMaxInt(LocationSummary* locations, bool is_min, DataType::Type type);
void GenerateMinMaxFP(LocationSummary* locations, bool is_min, DataType::Type type);
+ void GenerateMinMax(HBinaryOperation* minmax, bool is_min);
// Generate a heap reference load using one register `out`:
//
diff --git a/compiler/optimizing/code_generator_arm_vixl.cc b/compiler/optimizing/code_generator_arm_vixl.cc
index 4fef027e6d..8222fc0a28 100644
--- a/compiler/optimizing/code_generator_arm_vixl.cc
+++ b/compiler/optimizing/code_generator_arm_vixl.cc
@@ -4719,7 +4719,7 @@ static void CreateMinMaxLocations(ArenaAllocator* allocator, HBinaryOperation* m
}
}
-void InstructionCodeGeneratorARMVIXL::GenerateMinMax(LocationSummary* locations, bool is_min) {
+void InstructionCodeGeneratorARMVIXL::GenerateMinMaxInt(LocationSummary* locations, bool is_min) {
Location op1_loc = locations->InAt(0);
Location op2_loc = locations->InAt(1);
Location out_loc = locations->Out();
@@ -4780,8 +4780,8 @@ void InstructionCodeGeneratorARMVIXL::GenerateMinMaxLong(LocationSummary* locati
}
}
-void InstructionCodeGeneratorARMVIXL::GenerateMinMaxFloat(HInstruction* min_max, bool is_min) {
- LocationSummary* locations = min_max->GetLocations();
+void InstructionCodeGeneratorARMVIXL::GenerateMinMaxFloat(HInstruction* minmax, bool is_min) {
+ LocationSummary* locations = minmax->GetLocations();
Location op1_loc = locations->InAt(0);
Location op2_loc = locations->InAt(1);
Location out_loc = locations->Out();
@@ -4800,7 +4800,7 @@ void InstructionCodeGeneratorARMVIXL::GenerateMinMaxFloat(HInstruction* min_max,
const vixl32::Register temp1 = temps.Acquire();
vixl32::Register temp2 = RegisterFrom(locations->GetTemp(0));
vixl32::Label nan, done;
- vixl32::Label* final_label = codegen_->GetFinalLabel(min_max, &done);
+ vixl32::Label* final_label = codegen_->GetFinalLabel(minmax, &done);
DCHECK(op1.Is(out));
@@ -4841,8 +4841,8 @@ void InstructionCodeGeneratorARMVIXL::GenerateMinMaxFloat(HInstruction* min_max,
}
}
-void InstructionCodeGeneratorARMVIXL::GenerateMinMaxDouble(HInstruction* min_max, bool is_min) {
- LocationSummary* locations = min_max->GetLocations();
+void InstructionCodeGeneratorARMVIXL::GenerateMinMaxDouble(HInstruction* minmax, bool is_min) {
+ LocationSummary* locations = minmax->GetLocations();
Location op1_loc = locations->InAt(0);
Location op2_loc = locations->InAt(1);
Location out_loc = locations->Out();
@@ -4857,7 +4857,7 @@ void InstructionCodeGeneratorARMVIXL::GenerateMinMaxDouble(HInstruction* min_max
vixl32::DRegister op2 = DRegisterFrom(op2_loc);
vixl32::DRegister out = DRegisterFrom(out_loc);
vixl32::Label handle_nan_eq, done;
- vixl32::Label* final_label = codegen_->GetFinalLabel(min_max, &done);
+ vixl32::Label* final_label = codegen_->GetFinalLabel(minmax, &done);
DCHECK(op1.Is(out));
@@ -4892,50 +4892,40 @@ void InstructionCodeGeneratorARMVIXL::GenerateMinMaxDouble(HInstruction* min_max
}
}
-void LocationsBuilderARMVIXL::VisitMin(HMin* min) {
- CreateMinMaxLocations(GetGraph()->GetAllocator(), min);
-}
-
-void InstructionCodeGeneratorARMVIXL::VisitMin(HMin* min) {
- switch (min->GetResultType()) {
+void InstructionCodeGeneratorARMVIXL::GenerateMinMax(HBinaryOperation* minmax, bool is_min) {
+ DataType::Type type = minmax->GetResultType();
+ switch (type) {
case DataType::Type::kInt32:
- GenerateMinMax(min->GetLocations(), /*is_min*/ true);
+ GenerateMinMaxInt(minmax->GetLocations(), is_min);
break;
case DataType::Type::kInt64:
- GenerateMinMaxLong(min->GetLocations(), /*is_min*/ true);
+ GenerateMinMaxLong(minmax->GetLocations(), is_min);
break;
case DataType::Type::kFloat32:
- GenerateMinMaxFloat(min, /*is_min*/ true);
+ GenerateMinMaxFloat(minmax, is_min);
break;
case DataType::Type::kFloat64:
- GenerateMinMaxDouble(min, /*is_min*/ true);
+ GenerateMinMaxDouble(minmax, is_min);
break;
default:
- LOG(FATAL) << "Unexpected type for HMin " << min->GetResultType();
+ LOG(FATAL) << "Unexpected type for HMinMax " << type;
}
}
+void LocationsBuilderARMVIXL::VisitMin(HMin* min) {
+ CreateMinMaxLocations(GetGraph()->GetAllocator(), min);
+}
+
+void InstructionCodeGeneratorARMVIXL::VisitMin(HMin* min) {
+ GenerateMinMax(min, /*is_min*/ true);
+}
+
void LocationsBuilderARMVIXL::VisitMax(HMax* max) {
CreateMinMaxLocations(GetGraph()->GetAllocator(), max);
}
void InstructionCodeGeneratorARMVIXL::VisitMax(HMax* max) {
- switch (max->GetResultType()) {
- case DataType::Type::kInt32:
- GenerateMinMax(max->GetLocations(), /*is_min*/ false);
- break;
- case DataType::Type::kInt64:
- GenerateMinMaxLong(max->GetLocations(), /*is_min*/ false);
- break;
- case DataType::Type::kFloat32:
- GenerateMinMaxFloat(max, /*is_min*/ false);
- break;
- case DataType::Type::kFloat64:
- GenerateMinMaxDouble(max, /*is_min*/ false);
- break;
- default:
- LOG(FATAL) << "Unexpected type for HMax " << max->GetResultType();
- }
+ GenerateMinMax(max, /*is_min*/ false);
}
void LocationsBuilderARMVIXL::VisitAbs(HAbs* abs) {
diff --git a/compiler/optimizing/code_generator_arm_vixl.h b/compiler/optimizing/code_generator_arm_vixl.h
index 726a2f9030..8e6bc0627a 100644
--- a/compiler/optimizing/code_generator_arm_vixl.h
+++ b/compiler/optimizing/code_generator_arm_vixl.h
@@ -349,10 +349,11 @@ class InstructionCodeGeneratorARMVIXL : public InstructionCodeGenerator {
bool value_can_be_null);
void HandleFieldGet(HInstruction* instruction, const FieldInfo& field_info);
- void GenerateMinMax(LocationSummary* locations, bool is_min);
+ void GenerateMinMaxInt(LocationSummary* locations, bool is_min);
void GenerateMinMaxLong(LocationSummary* locations, bool is_min);
- void GenerateMinMaxFloat(HInstruction* min_max, bool is_min);
- void GenerateMinMaxDouble(HInstruction* min_max, bool is_min);
+ void GenerateMinMaxFloat(HInstruction* minmax, bool is_min);
+ void GenerateMinMaxDouble(HInstruction* minmax, bool is_min);
+ void GenerateMinMax(HBinaryOperation* minmax, bool is_min);
// Generate a heap reference load using one register `out`:
//
diff --git a/compiler/optimizing/code_generator_mips.cc b/compiler/optimizing/code_generator_mips.cc
index ae42bbcc70..825b2377c8 100644
--- a/compiler/optimizing/code_generator_mips.cc
+++ b/compiler/optimizing/code_generator_mips.cc
@@ -8799,10 +8799,10 @@ static void CreateMinMaxLocations(ArenaAllocator* allocator, HBinaryOperation* m
}
}
-void InstructionCodeGeneratorMIPS::GenerateMinMax(LocationSummary* locations,
- bool is_min,
- bool isR6,
- DataType::Type type) {
+void InstructionCodeGeneratorMIPS::GenerateMinMaxInt(LocationSummary* locations,
+ bool is_min,
+ bool isR6,
+ DataType::Type type) {
if (isR6) {
// Some architectures, such as ARM and MIPS (prior to r6), have a
// conditional move instruction which only changes the target
@@ -9130,44 +9130,37 @@ void InstructionCodeGeneratorMIPS::GenerateMinMaxFP(LocationSummary* locations,
}
}
-void LocationsBuilderMIPS::VisitMin(HMin* min) {
- CreateMinMaxLocations(GetGraph()->GetAllocator(), min);
-}
-
-void InstructionCodeGeneratorMIPS::VisitMin(HMin* min) {
+void InstructionCodeGeneratorMIPS::GenerateMinMax(HBinaryOperation* minmax, bool is_min) {
bool isR6 = codegen_->GetInstructionSetFeatures().IsR6();
- switch (min->GetResultType()) {
+ DataType::Type type = minmax->GetResultType();
+ switch (type) {
case DataType::Type::kInt32:
case DataType::Type::kInt64:
- GenerateMinMax(min->GetLocations(), /*is_min*/ true, isR6, min->GetResultType());
+ GenerateMinMaxInt(minmax->GetLocations(), is_min, isR6, type);
break;
case DataType::Type::kFloat32:
case DataType::Type::kFloat64:
- GenerateMinMaxFP(min->GetLocations(), /*is_min*/ true, isR6, min->GetResultType());
+ GenerateMinMaxFP(minmax->GetLocations(), is_min, isR6, type);
break;
default:
- LOG(FATAL) << "Unexpected type for HMin " << min->GetResultType();
+ LOG(FATAL) << "Unexpected type for HMinMax " << type;
}
}
+void LocationsBuilderMIPS::VisitMin(HMin* min) {
+ CreateMinMaxLocations(GetGraph()->GetAllocator(), min);
+}
+
+void InstructionCodeGeneratorMIPS::VisitMin(HMin* min) {
+ GenerateMinMax(min, /*is_min*/ true);
+}
+
void LocationsBuilderMIPS::VisitMax(HMax* max) {
CreateMinMaxLocations(GetGraph()->GetAllocator(), max);
}
void InstructionCodeGeneratorMIPS::VisitMax(HMax* max) {
- bool isR6 = codegen_->GetInstructionSetFeatures().IsR6();
- switch (max->GetResultType()) {
- case DataType::Type::kInt32:
- case DataType::Type::kInt64:
- GenerateMinMax(max->GetLocations(), /*is_min*/ false, isR6, max->GetResultType());
- break;
- case DataType::Type::kFloat32:
- case DataType::Type::kFloat64:
- GenerateMinMaxFP(max->GetLocations(), /*is_min*/ false, isR6, max->GetResultType());
- break;
- default:
- LOG(FATAL) << "Unexpected type for HMax " << max->GetResultType();
- }
+ GenerateMinMax(max, /*is_min*/ false);
}
void LocationsBuilderMIPS::VisitAbs(HAbs* abs) {
diff --git a/compiler/optimizing/code_generator_mips.h b/compiler/optimizing/code_generator_mips.h
index ae5fe5be19..b02a216aaf 100644
--- a/compiler/optimizing/code_generator_mips.h
+++ b/compiler/optimizing/code_generator_mips.h
@@ -246,8 +246,9 @@ class InstructionCodeGeneratorMIPS : public InstructionCodeGenerator {
bool value_can_be_null);
void HandleFieldGet(HInstruction* instruction, const FieldInfo& field_info, uint32_t dex_pc);
- void GenerateMinMax(LocationSummary* locations, bool is_min, bool isR6, DataType::Type type);
+ void GenerateMinMaxInt(LocationSummary* locations, bool is_min, bool isR6, DataType::Type type);
void GenerateMinMaxFP(LocationSummary* locations, bool is_min, bool isR6, DataType::Type type);
+ void GenerateMinMax(HBinaryOperation*, bool is_min);
void GenerateAbsFP(LocationSummary* locations, DataType::Type type, bool isR2OrNewer, bool isR6);
// Generate a heap reference load using one register `out`:
diff --git a/compiler/optimizing/code_generator_mips64.cc b/compiler/optimizing/code_generator_mips64.cc
index 8031cca7cb..9bb1bfb596 100644
--- a/compiler/optimizing/code_generator_mips64.cc
+++ b/compiler/optimizing/code_generator_mips64.cc
@@ -6685,7 +6685,7 @@ static void CreateMinMaxLocations(ArenaAllocator* allocator, HBinaryOperation* m
}
}
-void InstructionCodeGeneratorMIPS64::GenerateMinMax(LocationSummary* locations, bool is_min) {
+void InstructionCodeGeneratorMIPS64::GenerateMinMaxInt(LocationSummary* locations, bool is_min) {
GpuRegister lhs = locations->InAt(0).AsRegister<GpuRegister>();
GpuRegister rhs = locations->InAt(1).AsRegister<GpuRegister>();
GpuRegister out = locations->Out().AsRegister<GpuRegister>();
@@ -6809,42 +6809,36 @@ void InstructionCodeGeneratorMIPS64::GenerateMinMaxFP(LocationSummary* locations
__ Bind(&done);
}
-void LocationsBuilderMIPS64::VisitMin(HMin* min) {
- CreateMinMaxLocations(GetGraph()->GetAllocator(), min);
-}
-
-void InstructionCodeGeneratorMIPS64::VisitMin(HMin* min) {
- switch (min->GetResultType()) {
+void InstructionCodeGeneratorMIPS64::GenerateMinMax(HBinaryOperation* minmax, bool is_min) {
+ DataType::Type type = minmax->GetResultType();
+ switch (type) {
case DataType::Type::kInt32:
case DataType::Type::kInt64:
- GenerateMinMax(min->GetLocations(), /*is_min*/ true);
+ GenerateMinMaxInt(minmax->GetLocations(), is_min);
break;
case DataType::Type::kFloat32:
case DataType::Type::kFloat64:
- GenerateMinMaxFP(min->GetLocations(), /*is_min*/ true, min->GetResultType());
+ GenerateMinMaxFP(minmax->GetLocations(), is_min, type);
break;
default:
- LOG(FATAL) << "Unexpected type for HMin " << min->GetResultType();
+ LOG(FATAL) << "Unexpected type for HMinMax " << type;
}
}
+void LocationsBuilderMIPS64::VisitMin(HMin* min) {
+ CreateMinMaxLocations(GetGraph()->GetAllocator(), min);
+}
+
+void InstructionCodeGeneratorMIPS64::VisitMin(HMin* min) {
+ GenerateMinMax(min, /*is_min*/ true);
+}
+
void LocationsBuilderMIPS64::VisitMax(HMax* max) {
CreateMinMaxLocations(GetGraph()->GetAllocator(), max);
}
void InstructionCodeGeneratorMIPS64::VisitMax(HMax* max) {
- switch (max->GetResultType()) {
- case DataType::Type::kInt32:
- case DataType::Type::kInt64:
- GenerateMinMax(max->GetLocations(), /*is_min*/ false);
- break;
- case DataType::Type::kFloat32:
- case DataType::Type::kFloat64:
- GenerateMinMaxFP(max->GetLocations(), /*is_min*/ false, max->GetResultType());
- break;
- default:
- LOG(FATAL) << "Unexpected type for HMax " << max->GetResultType();
- }
+ GenerateMinMax(max, /*is_min*/ false);
}
void LocationsBuilderMIPS64::VisitAbs(HAbs* abs) {
diff --git a/compiler/optimizing/code_generator_mips64.h b/compiler/optimizing/code_generator_mips64.h
index 5d925d5d5a..ef4386bf4d 100644
--- a/compiler/optimizing/code_generator_mips64.h
+++ b/compiler/optimizing/code_generator_mips64.h
@@ -242,8 +242,9 @@ class InstructionCodeGeneratorMIPS64 : public InstructionCodeGenerator {
bool value_can_be_null);
void HandleFieldGet(HInstruction* instruction, const FieldInfo& field_info);
- void GenerateMinMax(LocationSummary* locations, bool is_min);
+ void GenerateMinMaxInt(LocationSummary* locations, bool is_min);
void GenerateMinMaxFP(LocationSummary* locations, bool is_min, DataType::Type type);
+ void GenerateMinMax(HBinaryOperation* minmax, bool is_min);
// Generate a heap reference load using one register `out`:
//
diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc
index 536909aa1f..c887d9ecc8 100644
--- a/compiler/optimizing/code_generator_x86.cc
+++ b/compiler/optimizing/code_generator_x86.cc
@@ -3836,9 +3836,9 @@ static void CreateMinMaxLocations(ArenaAllocator* allocator, HBinaryOperation* m
}
}
-void InstructionCodeGeneratorX86::GenerateMinMax(LocationSummary* locations,
- bool is_min,
- DataType::Type type) {
+void InstructionCodeGeneratorX86::GenerateMinMaxInt(LocationSummary* locations,
+ bool is_min,
+ DataType::Type type) {
Location op1_loc = locations->InAt(0);
Location op2_loc = locations->InAt(1);
@@ -3978,42 +3978,36 @@ void InstructionCodeGeneratorX86::GenerateMinMaxFP(LocationSummary* locations,
__ Bind(&done);
}
-void LocationsBuilderX86::VisitMin(HMin* min) {
- CreateMinMaxLocations(GetGraph()->GetAllocator(), min);
-}
-
-void InstructionCodeGeneratorX86::VisitMin(HMin* min) {
- switch (min->GetResultType()) {
+void InstructionCodeGeneratorX86::GenerateMinMax(HBinaryOperation* minmax, bool is_min) {
+ DataType::Type type = minmax->GetResultType();
+ switch (type) {
case DataType::Type::kInt32:
case DataType::Type::kInt64:
- GenerateMinMax(min->GetLocations(), /*is_min*/ true, min->GetResultType());
+ GenerateMinMaxInt(minmax->GetLocations(), is_min, type);
break;
case DataType::Type::kFloat32:
case DataType::Type::kFloat64:
- GenerateMinMaxFP(min->GetLocations(), /*is_min*/ true, min->GetResultType());
+ GenerateMinMaxFP(minmax->GetLocations(), is_min, type);
break;
default:
- LOG(FATAL) << "Unexpected type for HMin " << min->GetResultType();
+ LOG(FATAL) << "Unexpected type for HMinMax " << type;
}
}
+void LocationsBuilderX86::VisitMin(HMin* min) {
+ CreateMinMaxLocations(GetGraph()->GetAllocator(), min);
+}
+
+void InstructionCodeGeneratorX86::VisitMin(HMin* min) {
+ GenerateMinMax(min, /*is_min*/ true);
+}
+
void LocationsBuilderX86::VisitMax(HMax* max) {
CreateMinMaxLocations(GetGraph()->GetAllocator(), max);
}
void InstructionCodeGeneratorX86::VisitMax(HMax* max) {
- switch (max->GetResultType()) {
- case DataType::Type::kInt32:
- case DataType::Type::kInt64:
- GenerateMinMax(max->GetLocations(), /*is_min*/ false, max->GetResultType());
- break;
- case DataType::Type::kFloat32:
- case DataType::Type::kFloat64:
- GenerateMinMaxFP(max->GetLocations(), /*is_min*/ false, max->GetResultType());
- break;
- default:
- LOG(FATAL) << "Unexpected type for HMax " << max->GetResultType();
- }
+ GenerateMinMax(max, /*is_min*/ false);
}
void LocationsBuilderX86::VisitAbs(HAbs* abs) {
diff --git a/compiler/optimizing/code_generator_x86.h b/compiler/optimizing/code_generator_x86.h
index 82496d12e5..d5abf2a5fa 100644
--- a/compiler/optimizing/code_generator_x86.h
+++ b/compiler/optimizing/code_generator_x86.h
@@ -225,8 +225,9 @@ class InstructionCodeGeneratorX86 : public InstructionCodeGenerator {
void GenerateShlLong(const Location& loc, int shift);
void GenerateShrLong(const Location& loc, int shift);
void GenerateUShrLong(const Location& loc, int shift);
- void GenerateMinMax(LocationSummary* locations, bool is_min, DataType::Type type);
+ void GenerateMinMaxInt(LocationSummary* locations, bool is_min, DataType::Type type);
void GenerateMinMaxFP(LocationSummary* locations, bool is_min, DataType::Type type);
+ void GenerateMinMax(HBinaryOperation* minmax, bool is_min);
void HandleFieldSet(HInstruction* instruction,
const FieldInfo& field_info,
diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc
index bb1fbc5290..d42990d51f 100644
--- a/compiler/optimizing/code_generator_x86_64.cc
+++ b/compiler/optimizing/code_generator_x86_64.cc
@@ -3843,9 +3843,9 @@ static void CreateMinMaxLocations(ArenaAllocator* allocator, HBinaryOperation* m
}
}
-void InstructionCodeGeneratorX86_64::GenerateMinMax(LocationSummary* locations,
- bool is_min,
- DataType::Type type) {
+void InstructionCodeGeneratorX86_64::GenerateMinMaxInt(LocationSummary* locations,
+ bool is_min,
+ DataType::Type type) {
Location op1_loc = locations->InAt(0);
Location op2_loc = locations->InAt(1);
@@ -3960,42 +3960,36 @@ void InstructionCodeGeneratorX86_64::GenerateMinMaxFP(LocationSummary* locations
__ Bind(&done);
}
-void LocationsBuilderX86_64::VisitMin(HMin* min) {
- CreateMinMaxLocations(GetGraph()->GetAllocator(), min);
-}
-
-void InstructionCodeGeneratorX86_64::VisitMin(HMin* min) {
- switch (min->GetResultType()) {
+void InstructionCodeGeneratorX86_64::GenerateMinMax(HBinaryOperation* minmax, bool is_min) {
+ DataType::Type type = minmax->GetResultType();
+ switch (type) {
case DataType::Type::kInt32:
case DataType::Type::kInt64:
- GenerateMinMax(min->GetLocations(), /*is_min*/ true, min->GetResultType());
+ GenerateMinMaxInt(minmax->GetLocations(), is_min, type);
break;
case DataType::Type::kFloat32:
case DataType::Type::kFloat64:
- GenerateMinMaxFP(min->GetLocations(), /*is_min*/ true, min->GetResultType());
+ GenerateMinMaxFP(minmax->GetLocations(), is_min, type);
break;
default:
- LOG(FATAL) << "Unexpected type for HMin " << min->GetResultType();
+ LOG(FATAL) << "Unexpected type for HMinMax " << type;
}
}
+void LocationsBuilderX86_64::VisitMin(HMin* min) {
+ CreateMinMaxLocations(GetGraph()->GetAllocator(), min);
+}
+
+void InstructionCodeGeneratorX86_64::VisitMin(HMin* min) {
+ GenerateMinMax(min, /*is_min*/ true);
+}
+
void LocationsBuilderX86_64::VisitMax(HMax* max) {
CreateMinMaxLocations(GetGraph()->GetAllocator(), max);
}
void InstructionCodeGeneratorX86_64::VisitMax(HMax* max) {
- switch (max->GetResultType()) {
- case DataType::Type::kInt32:
- case DataType::Type::kInt64:
- GenerateMinMax(max->GetLocations(), /*is_min*/ false, max->GetResultType());
- break;
- case DataType::Type::kFloat32:
- case DataType::Type::kFloat64:
- GenerateMinMaxFP(max->GetLocations(), /*is_min*/ false, max->GetResultType());
- break;
- default:
- LOG(FATAL) << "Unexpected type for HMax " << max->GetResultType();
- }
+ GenerateMinMax(max, /*is_min*/ false);
}
void LocationsBuilderX86_64::VisitAbs(HAbs* abs) {
diff --git a/compiler/optimizing/code_generator_x86_64.h b/compiler/optimizing/code_generator_x86_64.h
index 933afdab26..7fc36a9d66 100644
--- a/compiler/optimizing/code_generator_x86_64.h
+++ b/compiler/optimizing/code_generator_x86_64.h
@@ -222,8 +222,9 @@ class InstructionCodeGeneratorX86_64 : public InstructionCodeGenerator {
bool value_can_be_null);
void HandleFieldGet(HInstruction* instruction, const FieldInfo& field_info);
- void GenerateMinMax(LocationSummary* locations, bool is_min, DataType::Type type);
+ void GenerateMinMaxInt(LocationSummary* locations, bool is_min, DataType::Type type);
void GenerateMinMaxFP(LocationSummary* locations, bool is_min, DataType::Type type);
+ void GenerateMinMax(HBinaryOperation* minmax, bool is_min);
// Generate a heap reference load using one register `out`:
//