diff options
| author | 2023-06-13 15:19:17 +0800 | |
|---|---|---|
| committer | 2023-07-10 16:10:02 +0000 | |
| commit | 039ca46621fba3c20ff4d726b7af9cdccf4fa5ac (patch) | |
| tree | 882ce705f0faea95696a886e4f5f1673d7b263d4 /compiler/optimizing | |
| parent | e989ff314dcc7e1f4bc33e00a7ac8607d168ec5b (diff) | |
RISCV: [Codegen] Add MoveFromReturnRegister
Test: m test-art-host-gtest
Bug: 283082089
Change-Id: I363e32456873410342906cd6f81985c468152a2d
Diffstat (limited to 'compiler/optimizing')
| -rw-r--r-- | compiler/optimizing/code_generator_riscv64.cc | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/compiler/optimizing/code_generator_riscv64.cc b/compiler/optimizing/code_generator_riscv64.cc index 405e3bb528..b2ce0988e0 100644 --- a/compiler/optimizing/code_generator_riscv64.cc +++ b/compiler/optimizing/code_generator_riscv64.cc @@ -2516,9 +2516,26 @@ void CodeGeneratorRISCV64::GenerateVirtualCall(HInvokeVirtual* invoke, } void CodeGeneratorRISCV64::MoveFromReturnRegister(Location trg, DataType::Type type) { - UNUSED(trg); - UNUSED(type); - LOG(FATAL) << "Unimplemented"; + if (!trg.IsValid()) { + DCHECK_EQ(type, DataType::Type::kVoid); + return; + } + + DCHECK_NE(type, DataType::Type::kVoid); + + if (DataType::IsIntegralType(type) || type == DataType::Type::kReference) { + XRegister trg_reg = trg.AsRegister<XRegister>(); + XRegister res_reg = Riscv64ReturnLocation(type).AsRegister<XRegister>(); + if (trg_reg != res_reg) { + __ Mv(trg_reg, res_reg); + } + } else { + FRegister trg_reg = trg.AsFpuRegister<FRegister>(); + FRegister res_reg = Riscv64ReturnLocation(type).AsFpuRegister<FRegister>(); + if (trg_reg != res_reg) { + __ FMvD(trg_reg, res_reg); // 64-bit move is OK also for `float`. + } + } } } // namespace riscv64 |