@@ -4019,6 +4019,8 @@ void CodeGen::genFnPrologCalleeRegArgs(regNumber xtraReg,
4019
4019
}
4020
4020
else
4021
4021
{
4022
+ // Currently all non-HFA multireg structs are two registers in size (i.e. two slots)
4023
+ assert (varDsc->lvSize () == (2 * TARGET_POINTER_SIZE));
4022
4024
// We have a non-HFA multireg argument, set slots to two
4023
4025
slots = 2 ;
4024
4026
}
@@ -4361,16 +4363,22 @@ void CodeGen::genFnPrologCalleeRegArgs(regNumber xtraReg,
4361
4363
{
4362
4364
storeType = TYP_I_IMPL; // Default store type for a struct type is a pointer sized integer
4363
4365
#if FEATURE_MULTIREG_ARGS
4364
- // Must be <= 32 bytes or else it wouldn't be passed in registers
4366
+ // Must be <= MAX_PASS_MULTIREG_BYTES or else it wouldn't be passed in registers
4365
4367
noway_assert (varDsc->lvSize () <= MAX_PASS_MULTIREG_BYTES);
4366
4368
#endif // FEATURE_MULTIREG_ARGS
4367
4369
#ifdef FEATURE_UNIX_AMD64_STRUCT_PASSING
4368
4370
storeType = regArgTab[argNum].type ;
4369
4371
#endif // !FEATURE_UNIX_AMD64_STRUCT_PASSING
4370
4372
if (varDsc->lvIsHfaRegArg ())
4371
4373
{
4374
+ #ifdef _TARGET_ARM_
4375
+ // On ARM32 the storeType for HFA args is always TYP_FLOAT
4376
+ storeType = TYP_FLOAT;
4377
+ slotSize = (unsigned )emitActualTypeSize (storeType);
4378
+ #else // _TARGET_ARM64_
4372
4379
storeType = genActualType (varDsc->GetHfaType ());
4373
- slotSize = (unsigned ) emitActualTypeSize (storeType);
4380
+ slotSize = (unsigned )emitActualTypeSize (storeType);
4381
+ #endif // _TARGET_ARM64_
4374
4382
}
4375
4383
}
4376
4384
else // Not a struct type
0 commit comments