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_mips.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_mips.cc')
-rw-r--r-- | compiler/optimizing/code_generator_mips.cc | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/compiler/optimizing/code_generator_mips.cc b/compiler/optimizing/code_generator_mips.cc index 961fe62932..e9c0b6ae79 100644 --- a/compiler/optimizing/code_generator_mips.cc +++ b/compiler/optimizing/code_generator_mips.cc @@ -2123,6 +2123,7 @@ void LocationsBuilderMIPS::VisitCompare(HCompare* compare) { new (GetGraph()->GetArena()) LocationSummary(compare, LocationSummary::kNoCall); switch (in_type) { + case Primitive::kPrimInt: case Primitive::kPrimLong: locations->SetInAt(0, Location::RequiresRegister()); locations->SetInAt(1, Location::RequiresRegister()); @@ -2153,6 +2154,14 @@ void InstructionCodeGeneratorMIPS::VisitCompare(HCompare* instruction) { // 1 if: left > right // -1 if: left < right switch (in_type) { + case Primitive::kPrimInt: { + Register lhs = locations->InAt(0).AsRegister<Register>(); + Register rhs = locations->InAt(1).AsRegister<Register>(); + __ Slt(TMP, lhs, rhs); + __ Slt(res, rhs, lhs); + __ Subu(res, res, TMP); + break; + } case Primitive::kPrimLong: { MipsLabel done; Register lhs_high = locations->InAt(0).AsRegisterPairHigh<Register>(); |