{
genConsumeReg(source);
emit->emitIns_S_R(storeIns, storeAttr, source->gtRegNum, varNumOut, argOffsetOut);
+ if (compiler->opts.compUseSoftFP && targetType == TYP_LONG)
+ {
+ // This case currently only occurs for double types that are passed as TYP_LONG;
+ // actual long types would have been decomposed by now.
+ assert(source->IsCopyOrReload());
+ regNumber otherReg = (regNumber)source->AsCopyOrReload()->GetRegNumByIdx(1);
+ assert(otherReg != REG_NA);
+ argOffsetOut += EA_4BYTE;
+ emit->emitIns_S_R(storeIns, storeAttr, otherReg, varNumOut, argOffsetOut);
+ }
}
argOffsetOut += EA_SIZE_IN_BYTES(storeAttr);
assert(argOffsetOut <= argOffsetMax); // We can't write beyound the outgoing area area
else
{
#ifdef _TARGET_ARM_
+
+#ifndef ARM_SOFTFP
// We must not have a multi-reg struct; double uses 2 slots and isn't a multi-reg struct
assert((info->numSlots == 1) || ((info->numSlots == 2) && (putArgChild->TypeGet() == TYP_DOUBLE)));
+#else // ARM_SOFTFP
+ // The `double` types have been transformed to `long` on armel.
+ if ((info->numSlots == 2) && (putArgChild->TypeGet() == TYP_LONG))
+ {
+ argNode->gtLsraInfo.srcCount = 2;
+ }
+ else
+ {
+ assert(info->numSlots == 1);
+ }
+#endif // ARM_SOFTFP
+
#else // !_TARGET_ARM_
// We must not have a multi-reg struct
assert(info->numSlots == 1);