Skip to content

Commit 4250bf4

Browse files
committed
Update hardcoded flags for float and double in ArgIteratorTemplate::ComputeReturnFlags()
This fixes JIT/HardwareIntrinsics/General/Vector* tests.
1 parent 5481693 commit 4250bf4

File tree

2 files changed

+15
-6
lines changed

2 files changed

+15
-6
lines changed

src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/TransitionBlock.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -314,14 +314,22 @@ public void ComputeReturnValueTreatment(CorElementType type, TypeHandle thRetTyp
314314
throw new NotSupportedException();
315315

316316
case CorElementType.ELEMENT_TYPE_R4:
317-
if (!IsArmelABI)
317+
if (IsRiscV64 || IsLoongArch64)
318+
{
319+
fpReturnSize = (uint)FpStruct.OnlyOne | (2 << (int)FpStruct.PosSizeShift1st);
320+
}
321+
else if (!IsArmelABI)
318322
{
319323
fpReturnSize = sizeof(float);
320324
}
321325
break;
322326

323327
case CorElementType.ELEMENT_TYPE_R8:
324-
if (!IsArmelABI)
328+
if (IsRiscV64 || IsLoongArch64)
329+
{
330+
fpReturnSize = (uint)FpStruct.OnlyOne | (3 << (int)FpStruct.PosSizeShift1st);
331+
}
332+
else if (!IsArmelABI)
325333
{
326334
fpReturnSize = sizeof(double);
327335
}
@@ -391,7 +399,7 @@ public void ComputeReturnValueTreatment(CorElementType type, TypeHandle thRetTyp
391399
if (IsLoongArch64)
392400
fpReturnSize = LoongArch64PassStructInRegister.GetLoongArch64PassStructInRegisterFlags(thRetType.GetRuntimeTypeHandle()) & 0xff;
393401
else if (IsRiscV64)
394-
fpReturnSize = (uint)RiscV64PassFpStructInRegisters.GetRiscV64PassFpStructInRegistersInfo(thRetType.GetRuntimeTypeHandle()).flags & 0xff;
402+
fpReturnSize = (uint)RiscV64PassFpStructInRegisters.GetRiscV64PassFpStructInRegistersInfo(thRetType.GetRuntimeTypeHandle()).flags;
395403
break;
396404

397405
}

src/coreclr/vm/callingconvention.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1939,7 +1939,7 @@ void ArgIteratorTemplate<ARGITERATOR_BASE>::ComputeReturnFlags()
19391939

19401940
case ELEMENT_TYPE_R4:
19411941
#if defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)
1942-
flags |= STRUCT_FLOAT_FIELD_ONLY_ONE << RETURN_FP_SIZE_SHIFT;
1942+
flags |= (FpStruct::OnlyOne | (2 << FpStruct::PosSizeShift1st)) << RETURN_FP_SIZE_SHIFT;
19431943
#else
19441944
#ifndef ARM_SOFTFP
19451945
flags |= sizeof(float) << RETURN_FP_SIZE_SHIFT;
@@ -1949,7 +1949,7 @@ void ArgIteratorTemplate<ARGITERATOR_BASE>::ComputeReturnFlags()
19491949

19501950
case ELEMENT_TYPE_R8:
19511951
#if defined(TARGET_LOONGARCH64) || defined(TARGET_RISCV64)
1952-
flags |= (STRUCT_FLOAT_FIELD_ONLY_ONE | STRUCT_FIRST_FIELD_SIZE_IS8) << RETURN_FP_SIZE_SHIFT;
1952+
flags |= (FpStruct::OnlyOne | (3 << FpStruct::PosSizeShift1st)) << RETURN_FP_SIZE_SHIFT;
19531953
#else
19541954
#ifndef ARM_SOFTFP
19551955
flags |= sizeof(double) << RETURN_FP_SIZE_SHIFT;
@@ -2029,7 +2029,8 @@ void ArgIteratorTemplate<ARGITERATOR_BASE>::ComputeReturnFlags()
20292029
if (size <= ENREGISTERED_RETURNTYPE_INTEGER_MAXSIZE)
20302030
{
20312031
assert(!thValueType.IsTypeDesc());
2032-
flags = (MethodTable::GetRiscV64PassFpStructInRegistersInfo(thValueType).flags & 0xff) << RETURN_FP_SIZE_SHIFT;
2032+
FpStructInRegistersInfo info = MethodTable::GetRiscV64PassFpStructInRegistersInfo(thValueType);
2033+
flags |= info.flags << RETURN_FP_SIZE_SHIFT;
20332034
break;
20342035
}
20352036
#else

0 commit comments

Comments
 (0)