From ce8202c5d896aee9ab3bf9bd3e6ca4090b713f22 Mon Sep 17 00:00:00 2001 From: Brian Sullivan Date: Wed, 1 Jun 2016 13:50:55 -0700 Subject: [PATCH] Proposed fix for HFA args on ARM32 Commit migrated from https://github.com/dotnet/coreclr/commit/c34a2c85e7d82663eb1cbea774872851e4f8be9d --- src/coreclr/src/jit/codegencommon.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/coreclr/src/jit/codegencommon.cpp b/src/coreclr/src/jit/codegencommon.cpp index 2919d71..6ea79b3 100755 --- a/src/coreclr/src/jit/codegencommon.cpp +++ b/src/coreclr/src/jit/codegencommon.cpp @@ -4019,6 +4019,9 @@ void CodeGen::genFnPrologCalleeRegArgs(regNumber xtraReg, } else { + // Currently the only non-HFA multireg struct is on ARM64 + // and is two registers in size (i.e. two slots) + assert(varDsc->lvSize() == (2 * TARGET_POINTER_SIZE)); // We have a non-HFA multireg argument, set slots to two slots = 2; } @@ -4361,7 +4364,7 @@ void CodeGen::genFnPrologCalleeRegArgs(regNumber xtraReg, { storeType = TYP_I_IMPL; // Default store type for a struct type is a pointer sized integer #if FEATURE_MULTIREG_ARGS - // Must be <= 32 bytes or else it wouldn't be passed in registers + // Must be <= MAX_PASS_MULTIREG_BYTES or else it wouldn't be passed in registers noway_assert(varDsc->lvSize() <= MAX_PASS_MULTIREG_BYTES); #endif // FEATURE_MULTIREG_ARGS #ifdef FEATURE_UNIX_AMD64_STRUCT_PASSING @@ -4369,8 +4372,14 @@ void CodeGen::genFnPrologCalleeRegArgs(regNumber xtraReg, #endif // !FEATURE_UNIX_AMD64_STRUCT_PASSING if (varDsc->lvIsHfaRegArg()) { +#ifdef _TARGET_ARM_ + // On ARM32 the storeType for HFA args is always TYP_FLOAT + storeType = TYP_FLOAT; + slotSize = (unsigned)emitActualTypeSize(storeType); +#else // _TARGET_ARM64_ storeType = genActualType(varDsc->GetHfaType()); - slotSize = (unsigned) emitActualTypeSize(storeType); + slotSize = (unsigned)emitActualTypeSize(storeType); +#endif // _TARGET_ARM64_ } } else // Not a struct type -- 2.7.4