diff options
author | 2024-05-24 17:03:23 +0300 | |
---|---|---|
committer | 2024-06-12 12:16:35 +0000 | |
commit | e159e4eacaff78180be0b11d087009b912e8d01d (patch) | |
tree | f348c8f31deb3dacf456a620310f569722746289 /compiler/optimizing/intrinsics_riscv64.cc | |
parent | b658a268e2e76e429702c2929d24ebbbf909e947 (diff) |
Implement {Integer|Long}.remainderUnsigned intrinsic
Implement intrinsic for RISC-V target
Integer.remainderUnsigned: +13.71%
Long.remainderUnsigned: +1623.19%
Test: testrunner.py --target --64 --ndebug --optimizing
Change-Id: I4c3c47bad8fcbdde723e68d19aad45be0d4ff8bb
Diffstat (limited to 'compiler/optimizing/intrinsics_riscv64.cc')
-rw-r--r-- | compiler/optimizing/intrinsics_riscv64.cc | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/compiler/optimizing/intrinsics_riscv64.cc b/compiler/optimizing/intrinsics_riscv64.cc index 0a9ac872db..b71232b4e4 100644 --- a/compiler/optimizing/intrinsics_riscv64.cc +++ b/compiler/optimizing/intrinsics_riscv64.cc @@ -595,7 +595,7 @@ void IntrinsicCodeGeneratorRISCV64::VisitLongNumberOfTrailingZeros(HInvoke* invo EmitIntegralUnOp(invoke, [&](XRegister rd, XRegister rs1) { __ Ctz(rd, rs1); }); } -static void GenerateDivideUnsigned(HInvoke* invoke, CodeGeneratorRISCV64* codegen) { +static void GenerateDivRemUnsigned(HInvoke* invoke, bool is_div, CodeGeneratorRISCV64* codegen) { LocationSummary* locations = invoke->GetLocations(); Riscv64Assembler* assembler = codegen->GetAssembler(); DataType::Type type = invoke->GetType(); @@ -611,10 +611,18 @@ static void GenerateDivideUnsigned(HInvoke* invoke, CodeGeneratorRISCV64* codege codegen->AddSlowPath(slow_path); __ Beqz(divisor, slow_path->GetEntryLabel()); - if (type == DataType::Type::kInt32) { - __ Divuw(out, dividend, divisor); + if (is_div) { + if (type == DataType::Type::kInt32) { + __ Divuw(out, dividend, divisor); + } else { + __ Divu(out, dividend, divisor); + } } else { - __ Divu(out, dividend, divisor); + if (type == DataType::Type::kInt32) { + __ Remuw(out, dividend, divisor); + } else { + __ Remu(out, dividend, divisor); + } } __ Bind(slow_path->GetExitLabel()); @@ -625,7 +633,7 @@ void IntrinsicLocationsBuilderRISCV64::VisitIntegerDivideUnsigned(HInvoke* invok } void IntrinsicCodeGeneratorRISCV64::VisitIntegerDivideUnsigned(HInvoke* invoke) { - GenerateDivideUnsigned(invoke, codegen_); + GenerateDivRemUnsigned(invoke, /*is_div=*/true, codegen_); } void IntrinsicLocationsBuilderRISCV64::VisitLongDivideUnsigned(HInvoke* invoke) { @@ -633,7 +641,23 @@ void IntrinsicLocationsBuilderRISCV64::VisitLongDivideUnsigned(HInvoke* invoke) } void IntrinsicCodeGeneratorRISCV64::VisitLongDivideUnsigned(HInvoke* invoke) { - GenerateDivideUnsigned(invoke, codegen_); + GenerateDivRemUnsigned(invoke, /*is_div=*/true, codegen_); +} + +void IntrinsicLocationsBuilderRISCV64::VisitIntegerRemainderUnsigned(HInvoke* invoke) { + CreateIntIntToIntSlowPathCallLocations(allocator_, invoke); +} + +void IntrinsicCodeGeneratorRISCV64::VisitIntegerRemainderUnsigned(HInvoke* invoke) { + GenerateDivRemUnsigned(invoke, /*is_div=*/false, codegen_); +} + +void IntrinsicLocationsBuilderRISCV64::VisitLongRemainderUnsigned(HInvoke* invoke) { + CreateIntIntToIntSlowPathCallLocations(allocator_, invoke); +} + +void IntrinsicCodeGeneratorRISCV64::VisitLongRemainderUnsigned(HInvoke* invoke) { + GenerateDivRemUnsigned(invoke, /*is_div=*/false, codegen_); } #define VISIT_INTRINSIC(name, low, high, type, start_index) \ |