summaryrefslogtreecommitdiff
path: root/compiler/optimizing
diff options
context:
space:
mode:
author Lifang Xia <lifang_xia@linux.alibaba.com> 2023-06-13 15:19:17 +0800
committer Vladimir Marko <vmarko@google.com> 2023-07-10 16:10:02 +0000
commit039ca46621fba3c20ff4d726b7af9cdccf4fa5ac (patch)
tree882ce705f0faea95696a886e4f5f1673d7b263d4 /compiler/optimizing
parente989ff314dcc7e1f4bc33e00a7ac8607d168ec5b (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.cc23
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