Skip to content

Commit

Permalink
[RISC-V] Fix floating point (dotnet#88311)
Browse files Browse the repository at this point in the history
* [RISC-V] Fix: passing struct in regs

* Fix a typo in CallDescrWorkerInternal

* [RISC-V] Update floating points
  • Loading branch information
clamp03 committed Jul 6, 2023
1 parent 9ea317f commit cd9d541
Show file tree
Hide file tree
Showing 4 changed files with 9 additions and 9 deletions.
6 changes: 3 additions & 3 deletions src/coreclr/vm/argdestination.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -174,7 +174,7 @@ class ArgDestination
int argOfs = TransitionBlock::GetOffsetOfArgumentRegisters() + m_argLocDescForStructInRegs->m_idxGenReg * 8;
return dac_cast<PTR_VOID>(dac_cast<TADDR>(m_base) + argOfs);
}
#endif // defined(TARGET_LOONGARCH64)
#endif // defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)

#if defined(UNIX_AMD64_ABI)

Expand Down
6 changes: 3 additions & 3 deletions src/coreclr/vm/callhelpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/vm/object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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())
{
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/vm/riscv64/calldescrworkerriscv64.S
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down

0 comments on commit cd9d541

Please sign in to comment.