From f3e6946670b2277a35ba5485e58e4aa3ea6ab638 Mon Sep 17 00:00:00 2001 From: Dong-Heon Jung Date: Wed, 28 Jun 2023 14:50:56 +0900 Subject: [PATCH 1/3] [RISC-V] Fix: passing struct in regs --- src/coreclr/vm/argdestination.h | 6 +++--- src/coreclr/vm/object.cpp | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/coreclr/vm/argdestination.h b/src/coreclr/vm/argdestination.h index 3890a0f5098de4..6de52019097f14 100644 --- a/src/coreclr/vm/argdestination.h +++ b/src/coreclr/vm/argdestination.h @@ -29,7 +29,7 @@ class ArgDestination LIMITED_METHOD_CONTRACT; #if defined(UNIX_AMD64_ABI) _ASSERTE((argLocDescForStructInRegs != NULL) || (offset != TransitionBlock::StructInRegsOffset)); -#elif defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) +#elif defined(TARGET_ARM64) || defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64) // This assert is not interesting on arm64/loongarch64. argLocDescForStructInRegs could be // initialized if the args are being enregistered. #else @@ -83,7 +83,7 @@ class ArgDestination #endif // !DACCESS_COMPILE #endif // defined(TARGET_ARM64) -#if defined(TARGET_LOONGARCH64) +#if defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64) bool IsStructPassedInRegs() { return m_argLocDescForStructInRegs != NULL; @@ -174,7 +174,7 @@ class ArgDestination int argOfs = TransitionBlock::GetOffsetOfArgumentRegisters() + m_argLocDescForStructInRegs->m_idxGenReg * 8; return dac_cast(dac_cast(m_base) + argOfs); } -#endif // defined(TARGET_LOONGARCH64) +#endif // defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64) #if defined(UNIX_AMD64_ABI) diff --git a/src/coreclr/vm/object.cpp b/src/coreclr/vm/object.cpp index 3cf25a06d3a525..055f2c96c9d0b9 100644 --- a/src/coreclr/vm/object.cpp +++ b/src/coreclr/vm/object.cpp @@ -392,7 +392,7 @@ void STDCALL CopyValueClassArgUnchecked(ArgDestination *argDest, void* src, Meth return; } -#elif defined(TARGET_LOONGARCH64) +#elif defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64) if (argDest->IsStructPassedInRegs()) { @@ -425,7 +425,7 @@ void InitValueClassArg(ArgDestination *argDest, MethodTable *pMT) #endif -#if defined(TARGET_LOONGARCH64) +#if defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64) if (argDest->IsStructPassedInRegs()) { *(UINT64*)(argDest->GetStructGenRegDestinationAddress()) = 0; From e18b88cca3854ffedd8d25b8d1188507495440c8 Mon Sep 17 00:00:00 2001 From: Dong-Heon Jung Date: Thu, 29 Jun 2023 16:34:33 +0900 Subject: [PATCH 2/3] Fix a typo in CallDescrWorkerInternal --- src/coreclr/vm/riscv64/calldescrworkerriscv64.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreclr/vm/riscv64/calldescrworkerriscv64.S b/src/coreclr/vm/riscv64/calldescrworkerriscv64.S index 888610f24235fe..b244fa46a2fc03 100644 --- a/src/coreclr/vm/riscv64/calldescrworkerriscv64.S +++ b/src/coreclr/vm/riscv64/calldescrworkerriscv64.S @@ -124,7 +124,7 @@ LOCAL_LABEL(NotCorrectReturn): EMIT_BREAKPOINT // Unreachable LOCAL_LABEL(FloatReturn): - fsw f0, CallDescrData__returnValue(s1) + fsw fa0, CallDescrData__returnValue(s1) j LOCAL_LABEL(ReturnDone) LOCAL_LABEL(DoubleReturn): From 738417c5845685be0c4c046b5a3736d4d103a5e5 Mon Sep 17 00:00:00 2001 From: Dong-Heon Jung Date: Fri, 30 Jun 2023 17:20:16 +0900 Subject: [PATCH 3/3] [RISC-V] Update floating points --- src/coreclr/vm/callhelpers.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/coreclr/vm/callhelpers.cpp b/src/coreclr/vm/callhelpers.cpp index b525f3378ddaed..19ef683c8c888b 100644 --- a/src/coreclr/vm/callhelpers.cpp +++ b/src/coreclr/vm/callhelpers.cpp @@ -459,19 +459,19 @@ void MethodDescCallSite::CallTargetWorker(const ARG_SLOT *pArguments, ARG_SLOT * argDest.CopyStructToRegisters(pSrc, th.AsMethodTable()->GetNumInstanceFieldBytes(), 0); } else -#elif defined(TARGET_LOONGARCH64) +#elif defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64) if (argDest.IsStructPassedInRegs()) { argDest.CopyStructToRegisters(pSrc, stackSize, 0); } else -#endif // TARGET_LOONGARCH64 +#endif // TARGET_LOONGARCH64 || TARGET_RISCV64 { PVOID pDest = argDest.GetDestinationAddress(); switch (stackSize) { -#if defined(TARGET_LOONGARCH64) +#if defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64) case 1: if (m_argIt.GetArgType() == ELEMENT_TYPE_U1 || m_argIt.GetArgType() == ELEMENT_TYPE_BOOLEAN) *((INT64*)pDest) = (UINT8)pArguments[arg];