@@ -1488,44 +1488,12 @@ void Lowering::LowerArg(GenTreeCall* call, GenTreePtr* ppArg)
14881488#ifdef _TARGET_ARMARCH_
14891489 if (call->IsVarargs () || comp->opts .compUseSoftFP )
14901490 {
1491-
14921491 // For vararg call or on armel, reg args should be all integer.
1493- // Insert a copy to move float value to integer register.
1494- if (varTypeIsFloating (type))
1492+ // Insert copies as needed to move float value to integer register.
1493+ GenTree* newNode = LowerFloatArg (ppArg, info);
1494+ if (newNode != nullptr )
14951495 {
1496- #ifdef _TARGET_ARM_
1497- #ifdef DEBUG
1498- if (type == TYP_DOUBLE)
1499- {
1500- unsigned numRegs = info->numRegs ;
1501- regNumber regCurr = info->regNum ;
1502- assert (numRegs % 2 == 0 );
1503- for (unsigned i = 0 ; i < numRegs;)
1504- {
1505- regNumber regNext = REG_NEXT (regCurr);
1506- // double type arg regs can only be either r0:r1 or r2:r3.
1507- assert ((regCurr == REG_R0 && regNext == REG_R1) || (regCurr == REG_R2 && regNext == REG_R3));
1508-
1509- i += 2 ;
1510- regCurr = REG_NEXT (regNext);
1511- }
1512- }
1513- #endif // DEBUG
1514- #endif // _TARGET_ARM_
1515-
1516- GenTreePtr intArg = LowerFloatArg (arg, info);
1517- if (intArg != nullptr )
1518- {
1519- if (intArg != arg)
1520- {
1521- ReplaceArgWithPutArgOrBitcast (ppArg, intArg);
1522- arg = intArg;
1523- info->node = intArg;
1524- }
1525-
1526- // update local variables.
1527- type = arg->TypeGet ();
1528- }
1496+ type = newNode->TypeGet ();
15291497 }
15301498 }
15311499#endif // _TARGET_ARMARCH_
@@ -1544,7 +1512,7 @@ void Lowering::LowerArg(GenTreeCall* call, GenTreePtr* ppArg)
15441512
15451513#ifdef _TARGET_ARMARCH_
15461514// ------------------------------------------------------------------------
1547- // LowerFloatArg: Lower the float call argument on the arm platform.
1515+ // LowerFloatArg: Lower float call arguments on the arm platform.
15481516//
15491517// Arguments:
15501518// arg - The arg node
@@ -1555,8 +1523,13 @@ void Lowering::LowerArg(GenTreeCall* call, GenTreePtr* ppArg)
15551523// return arg if there was in place transformation;
15561524// return a new tree if the root was changed.
15571525//
1558- GenTree* Lowering::LowerFloatArg (GenTree* arg, fgArgTabEntry* info)
1526+ // Notes:
1527+ // This must handle scalar float arguments as well as GT_FIELD_LISTs
1528+ // with floating point fields.
1529+ //
1530+ GenTree* Lowering::LowerFloatArg (GenTree** pArg, fgArgTabEntry* info)
15591531{
1532+ GenTree* arg = *pArg;
15601533 if (info->regNum != REG_STK)
15611534 {
15621535 if (arg->OperIsFieldList ())
@@ -1565,32 +1538,44 @@ GenTree* Lowering::LowerFloatArg(GenTree* arg, fgArgTabEntry* info)
15651538 regNumber currRegNumber = info->regNum ;
15661539
15671540 // Transform fields that are passed as registers in place.
1568- for (unsigned i = 0 ; i < info->numRegs ; ++i)
1541+ unsigned fieldRegCount;
1542+ for (unsigned i = 0 ; i < info->numRegs ; i += fieldRegCount)
15691543 {
15701544 assert (currListNode != nullptr );
1571- GenTree* node = currListNode->Current ();
1572- GenTree* intNode = LowerFloatArgReg (node, currRegNumber);
1573- assert (intNode != nullptr );
1545+ GenTree* node = currListNode->Current ();
1546+ if (varTypeIsFloating (node))
1547+ {
1548+ GenTree* intNode = LowerFloatArgReg (node, currRegNumber);
1549+ assert (intNode != nullptr );
15741550
1575- ReplaceArgWithPutArgOrBitcast (currListNode->pCurrent (), intNode);
1576- currListNode->ChangeType (intNode->TypeGet ());
1551+ ReplaceArgWithPutArgOrBitcast (currListNode->pCurrent (), intNode);
1552+ currListNode->ChangeType (intNode->TypeGet ());
1553+ }
15771554
1578- currListNode = currListNode->Rest ();
1579- currRegNumber = REG_NEXT (currRegNumber);
1555+ if (node->TypeGet () == TYP_DOUBLE)
1556+ {
1557+ currRegNumber = REG_NEXT (REG_NEXT (currRegNumber));
1558+ fieldRegCount = 2 ;
1559+ }
1560+ else
1561+ {
1562+ currRegNumber = REG_NEXT (currRegNumber);
1563+ fieldRegCount = 1 ;
1564+ }
1565+ currListNode = currListNode->Rest ();
15801566 }
15811567 // List fields were replaced in place.
15821568 return arg;
15831569 }
1584- else
1570+ else if ( varTypeIsFloating (arg))
15851571 {
1586- return LowerFloatArgReg (arg, info->regNum );
1572+ GenTree* intNode = LowerFloatArgReg (arg, info->regNum );
1573+ assert (intNode != nullptr );
1574+ ReplaceArgWithPutArgOrBitcast (pArg, intNode);
1575+ return *pArg;
15871576 }
15881577 }
1589- else
1590- {
1591- // Do not change stack nodes.
1592- return nullptr ;
1593- }
1578+ return nullptr ;
15941579}
15951580
15961581// ------------------------------------------------------------------------
0 commit comments