diff options
author | Aart Bik <ajcbik@google.com> | 2016-02-01 18:57:58 -0800 |
---|---|---|
committer | Aart Bik <ajcbik@google.com> | 2016-02-05 09:26:21 -0800 |
commit | a19616e3363276e7f2c471eb2839fb16f1d43f27 (patch) | |
tree | ad3e7fd0f53229e95fb0443586fc30eedabe6967 /compiler/optimizing/code_generator_arm.cc | |
parent | 9fba3f67a0792ad5eeb495e489d11a87211c318f (diff) |
Implemented compare/signum intrinsics as HCompare
(with all code generation for all)
Rationale:
At HIR level, many more optimizations are possible, while ultimately
generated code can take advantage of full semantics.
Change-Id: I6e2ee0311784e5e336847346f7f3c4faef4fd17e
Diffstat (limited to 'compiler/optimizing/code_generator_arm.cc')
-rw-r--r-- | compiler/optimizing/code_generator_arm.cc | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc index c2d9edd43e..e43493280a 100644 --- a/compiler/optimizing/code_generator_arm.cc +++ b/compiler/optimizing/code_generator_arm.cc @@ -3750,6 +3750,7 @@ void LocationsBuilderARM::VisitCompare(HCompare* compare) { LocationSummary* locations = new (GetGraph()->GetArena()) LocationSummary(compare, LocationSummary::kNoCall); switch (compare->InputAt(0)->GetType()) { + case Primitive::kPrimInt: case Primitive::kPrimLong: { locations->SetInAt(0, Location::RequiresRegister()); locations->SetInAt(1, Location::RequiresRegister()); @@ -3779,6 +3780,13 @@ void InstructionCodeGeneratorARM::VisitCompare(HCompare* compare) { Primitive::Type type = compare->InputAt(0)->GetType(); Condition less_cond; switch (type) { + case Primitive::kPrimInt: { + __ LoadImmediate(out, 0); + __ cmp(left.AsRegister<Register>(), + ShifterOperand(right.AsRegister<Register>())); // Signed compare. + less_cond = LT; + break; + } case Primitive::kPrimLong: { __ cmp(left.AsRegisterPairHigh<Register>(), ShifterOperand(right.AsRegisterPairHigh<Register>())); // Signed compare. @@ -3808,6 +3816,7 @@ void InstructionCodeGeneratorARM::VisitCompare(HCompare* compare) { LOG(FATAL) << "Unexpected compare type " << type; UNREACHABLE(); } + __ b(&done, EQ); __ b(&less, less_cond); |