diff options
| author | 2023-06-13 15:19:17 +0800 | |
|---|---|---|
| committer | 2023-07-10 16:10:02 +0000 | |
| commit | 039ca46621fba3c20ff4d726b7af9cdccf4fa5ac (patch) | |
| tree | 882ce705f0faea95696a886e4f5f1673d7b263d4 | |
| parent | e989ff314dcc7e1f4bc33e00a7ac8607d168ec5b (diff) | |
RISCV: [Codegen] Add MoveFromReturnRegister
Test: m test-art-host-gtest
Bug: 283082089
Change-Id: I363e32456873410342906cd6f81985c468152a2d
| -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  |