bool isStruct = (targetType == TYP_STRUCT) || (source->OperGet() == GT_FIELD_LIST);
+ if (varTypeIsSIMD(targetType))
+ {
+ assert(!source->isContained());
+
+ regNumber srcReg = genConsumeReg(source);
+
+ emitAttr storeAttr = emitTypeSize(targetType);
+
+ assert((srcReg != REG_NA) && (genIsValidFloatReg(srcReg)));
+ emit->emitIns_S_R(INS_str, storeAttr, srcReg, varNumOut, argOffsetOut);
+
+ argOffsetOut += EA_SIZE_IN_BYTES(storeAttr);
+ assert(argOffsetOut <= argOffsetMax); // We can't write beyound the outgoing area area
+ return;
+ }
+
if (!isStruct) // a normal non-Struct argument
{
instruction storeIns = ins_Store(targetType);
#ifdef _TARGET_ARMARCH_
// Mark contained when we pass struct
// GT_FIELD_LIST is always marked conatained when it is generated
- if (varTypeIsStruct(type))
+ if (type == TYP_STRUCT)
{
arg->SetContained();
if ((arg->OperGet() == GT_OBJ) && (arg->AsObj()->Addr()->OperGet() == GT_LCL_VAR_ADDR))
}
else
{
+ assert(!putArgChild->isContained());
#if defined(_TARGET_ARM_)
// The `double` types have been transformed to `long` on armel,
// while the actual long types have been decomposed.