From cd9d54165b0de56d3974f9969d3e70412c871c4b Mon Sep 17 00:00:00 2001 From: Dong-Heon Jung Date: Thu, 6 Jul 2023 13:13:54 +0900 Subject: [PATCH] [RISC-V] Fix floating point (#88311) * [RISC-V] Fix: passing struct in regs * Fix a typo in CallDescrWorkerInternal * [RISC-V] Update floating points --- src/coreclr/vm/argdestination.h | 6 +++--- src/coreclr/vm/callhelpers.cpp | 6 +++--- src/coreclr/vm/object.cpp | 4 ++-- src/coreclr/vm/riscv64/calldescrworkerriscv64.S | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/coreclr/vm/argdestination.h b/src/coreclr/vm/argdestination.h index 3890a0f5098..6de52019097 100644 --- a/src/coreclr/vm/argdestination.h +++ b/src/coreclr/vm/argdestination.h @@ -29,7 +29,7 @@ public: 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 @@ public: #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 @@ public: 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/callhelpers.cpp b/src/coreclr/vm/callhelpers.cpp index b525f3378dd..19ef683c8c8 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]; diff --git a/src/coreclr/vm/object.cpp b/src/coreclr/vm/object.cpp index 3cf25a06d3a..055f2c96c9d 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; diff --git a/src/coreclr/vm/riscv64/calldescrworkerriscv64.S b/src/coreclr/vm/riscv64/calldescrworkerriscv64.S index 888610f2423..b244fa46a2f 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):