diff options
Diffstat (limited to 'compiler/optimizing')
| -rw-r--r-- | compiler/optimizing/intrinsics_arm64.cc | 17 | ||||
| -rw-r--r-- | compiler/optimizing/intrinsics_mips.cc | 5 | ||||
| -rw-r--r-- | compiler/optimizing/intrinsics_x86.cc | 4 | ||||
| -rw-r--r-- | compiler/optimizing/intrinsics_x86_64.cc | 4 |
4 files changed, 14 insertions, 16 deletions
diff --git a/compiler/optimizing/intrinsics_arm64.cc b/compiler/optimizing/intrinsics_arm64.cc index 5de2306506..a589ef07e2 100644 --- a/compiler/optimizing/intrinsics_arm64.cc +++ b/compiler/optimizing/intrinsics_arm64.cc @@ -368,17 +368,16 @@ void IntrinsicCodeGeneratorARM64::VisitLongReverse(HInvoke* invoke) { GenReverse(invoke->GetLocations(), Primitive::kPrimLong, GetVIXLAssembler()); } -static void GenBitCount(HInvoke* instr, bool is_long, vixl::MacroAssembler* masm) { - DCHECK(instr->GetType() == Primitive::kPrimInt); - DCHECK((is_long && instr->InputAt(0)->GetType() == Primitive::kPrimLong) || - (!is_long && instr->InputAt(0)->GetType() == Primitive::kPrimInt)); +static void GenBitCount(HInvoke* instr, Primitive::Type type, vixl::MacroAssembler* masm) { + DCHECK(Primitive::IsIntOrLongType(type)) << type; + DCHECK_EQ(instr->GetType(), Primitive::kPrimInt); + DCHECK_EQ(Primitive::PrimitiveKind(instr->InputAt(0)->GetType()), type); - Location out = instr->GetLocations()->Out(); UseScratchRegisterScope temps(masm); Register src = InputRegisterAt(instr, 0); - Register dst = is_long ? XRegisterFrom(out) : WRegisterFrom(out); - FPRegister fpr = is_long ? temps.AcquireD() : temps.AcquireS(); + Register dst = RegisterFrom(instr->GetLocations()->Out(), type); + FPRegister fpr = (type == Primitive::kPrimLong) ? temps.AcquireD() : temps.AcquireS(); __ Fmov(fpr, src); __ Cnt(fpr.V8B(), fpr.V8B()); @@ -391,7 +390,7 @@ void IntrinsicLocationsBuilderARM64::VisitLongBitCount(HInvoke* invoke) { } void IntrinsicCodeGeneratorARM64::VisitLongBitCount(HInvoke* invoke) { - GenBitCount(invoke, /* is_long */ true, GetVIXLAssembler()); + GenBitCount(invoke, Primitive::kPrimLong, GetVIXLAssembler()); } void IntrinsicLocationsBuilderARM64::VisitIntegerBitCount(HInvoke* invoke) { @@ -399,7 +398,7 @@ void IntrinsicLocationsBuilderARM64::VisitIntegerBitCount(HInvoke* invoke) { } void IntrinsicCodeGeneratorARM64::VisitIntegerBitCount(HInvoke* invoke) { - GenBitCount(invoke, /* is_long */ false, GetVIXLAssembler()); + GenBitCount(invoke, Primitive::kPrimInt, GetVIXLAssembler()); } static void CreateFPToFPLocations(ArenaAllocator* arena, HInvoke* invoke) { diff --git a/compiler/optimizing/intrinsics_mips.cc b/compiler/optimizing/intrinsics_mips.cc index 1280587276..19c6a225ac 100644 --- a/compiler/optimizing/intrinsics_mips.cc +++ b/compiler/optimizing/intrinsics_mips.cc @@ -614,8 +614,6 @@ static void GenBitCount(LocationSummary* locations, Primitive::Type type, bool isR6, MipsAssembler* assembler) { - DCHECK(type == Primitive::kPrimInt || type == Primitive::kPrimLong); - Register out = locations->Out().AsRegister<Register>(); // https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel @@ -663,7 +661,8 @@ static void GenBitCount(LocationSummary* locations, __ MulR2(out, out, TMP); } __ Srl(out, out, 24); - } else if (type == Primitive::kPrimLong) { + } else { + DCHECK_EQ(type, Primitive::kPrimLong); Register in_lo = locations->InAt(0).AsRegisterPairLow<Register>(); Register in_hi = locations->InAt(0).AsRegisterPairHigh<Register>(); Register tmp_hi = locations->GetTemp(0).AsRegister<Register>(); diff --git a/compiler/optimizing/intrinsics_x86.cc b/compiler/optimizing/intrinsics_x86.cc index 95fdb9b3f6..4aab3e2768 100644 --- a/compiler/optimizing/intrinsics_x86.cc +++ b/compiler/optimizing/intrinsics_x86.cc @@ -2387,10 +2387,10 @@ static void GenBitCount(X86Assembler* assembler, if (invoke->InputAt(0)->IsConstant()) { // Evaluate this at compile time. int64_t value = Int64FromConstant(invoke->InputAt(0)->AsConstant()); - value = is_long + int32_t result = is_long ? POPCOUNT(static_cast<uint64_t>(value)) : POPCOUNT(static_cast<uint32_t>(value)); - codegen->Load32BitValue(out, value); + codegen->Load32BitValue(out, result); return; } diff --git a/compiler/optimizing/intrinsics_x86_64.cc b/compiler/optimizing/intrinsics_x86_64.cc index 9e568f7b4f..9ca4ef049a 100644 --- a/compiler/optimizing/intrinsics_x86_64.cc +++ b/compiler/optimizing/intrinsics_x86_64.cc @@ -2402,10 +2402,10 @@ static void GenBitCount(X86_64Assembler* assembler, if (invoke->InputAt(0)->IsConstant()) { // Evaluate this at compile time. int64_t value = Int64FromConstant(invoke->InputAt(0)->AsConstant()); - value = is_long + int32_t result = is_long ? POPCOUNT(static_cast<uint64_t>(value)) : POPCOUNT(static_cast<uint32_t>(value)); - codegen->Load32BitValue(out, value); + codegen->Load32BitValue(out, result); return; } |