assert(arg != nullptr);
GenTreePtr node = nullptr;
-#if !defined(LEGACY_BACKEND) && defined(_TARGET_ARM_)
+#if !defined(LEGACY_BACKEND) && defined(ARM_SOFTFP)
// A PUTARG_REG could be a MultiRegOp on armel since we could move a double register to two int registers.
- if (opts.compUseSoftFP)
- {
- node = new (this, GT_PUTARG_REG) GenTreeMultiRegOp(GT_PUTARG_REG, type, arg, nullptr);
- }
- else
+ node = new (this, GT_PUTARG_REG) GenTreeMultiRegOp(GT_PUTARG_REG, type, arg, nullptr);
+#else
+ node = gtNewOperNode(GT_PUTARG_REG, type, arg);
#endif
- {
- node = gtNewOperNode(GT_PUTARG_REG, type, arg);
- }
node->gtRegNum = argReg;
return node;
#endif
#if !defined(LEGACY_BACKEND) && defined(_TARGET_ARM_)
- if (tree->IsMultiReg() && tree->AsMultiRegOp()->gtOtherReg != REG_NA)
+ if (tree->OperIsMultiRegOp() && tree->AsMultiRegOp()->gtOtherReg != REG_NA)
{
printf(",%s", compRegVarName(tree->AsMultiRegOp()->gtOtherReg));
}
bool OperIsMultiRegOp() const
{
#if !defined(LEGACY_BACKEND) && defined(_TARGET_ARM_)
- if (gtOper == GT_MUL_LONG || gtOper == GT_PUTARG_REG || gtOper == GT_COPY)
+ if (gtOper == GT_MUL_LONG ||
+#ifdef ARM_SOFTFP
+ gtOper == GT_PUTARG_REG ||
+#endif
+ gtOper == GT_COPY)
{
return true;
}
// Returns true if it is a GT_COPY or GT_RELOAD of a multi-reg call node
inline bool IsCopyOrReloadOfMultiRegCall() const;
- // Returns true if it is a MultiRegOp
- inline bool IsMultiReg() const;
-
bool OperMayThrow();
unsigned GetScaleIndexMul();
return false;
}
-//-----------------------------------------------------------------------------------
-// IsMultiReg: whether this is a MultiReg node (i.e. GT_MUL_LONG or GT_PUTARG_REG)
-//
-// Arguments:
-// None
-//
-// Return Value:
-// Returns true if this GenTree is a MultiReg node
-inline bool GenTree::IsMultiReg() const
-{
-#if !defined(LEGACY_BACKEND) && defined(_TARGET_ARM_)
-#ifdef ARM_SOFTFP
- return (gtOper == GT_MUL_LONG) || (gtOper == GT_PUTARG_REG);
-#else // !ARM_SOFTFP
- return gtOper == GT_MUL_LONG;
-#endif // !ARM_SOFTFP
-#else // ! _TARGET_ARM_
- return false;
-#endif // ! _TARGET_ARM_
-}
-
inline bool GenTree::IsCnsIntOrI() const
{
return (gtOper == GT_CNS_INT);
// pointers to argument setup stores.
return 0;
}
+#ifdef _TARGET_ARMARCH_
+ else if (operand->OperIsPutArgStk())
+ {
+ // A PUTARG_STK argument is an operand of a call, but is neither contained, nor does it produce
+ // a result.
+ assert(!operand->isContained());
+ return 0;
+ }
+#endif // _TARGET_ARMARCH_
else
{
// If a field list or non-void-typed operand is not an unused value and does not have source registers,
case GT_STORE_BLK:
case GT_STORE_OBJ:
case GT_STORE_DYN_BLK:
- LowerBlockStore(tree->AsBlk());
TreeNodeInfoInitBlockStore(tree->AsBlk());
break;
case GT_STORE_BLK:
case GT_STORE_OBJ:
case GT_STORE_DYN_BLK:
- LowerBlockStore(tree->AsBlk());
TreeNodeInfoInitBlockStore(tree->AsBlk());
break;
// Skip arguments that have been moved to the Late Arg list
if (!(args->gtFlags & GTF_LATE_ARG))
{
+#ifdef DEBUG
+ fgArgTabEntryPtr curArgTabEntry = compiler->gtArgEntryByNode(call, arg);
+ assert(curArgTabEntry);
+#endif
if (arg->gtOper == GT_PUTARG_STK)
{
- fgArgTabEntryPtr curArgTabEntry = compiler->gtArgEntryByNode(call, arg);
- assert(curArgTabEntry);
-
- assert(curArgTabEntry->regNum == REG_STK);
+ INDEBUG(assert(curArgTabEntry->regNum == REG_STK));
}
#ifdef _TARGET_ARM_
else if (arg->OperGet() == GT_PUTARG_SPLIT)
{
-#ifdef DEBUG
- fgArgTabEntryPtr curArgTabEntry = compiler->gtArgEntryByNode(call, arg);
- assert(arg->AsPutArgSplit()->gtNumRegs == curArgTabEntry->numRegs);
-#endif
+ INDEBUG(assert(arg->AsPutArgSplit()->gtNumRegs == curArgTabEntry->numRegs));
info->srcCount += arg->gtLsraInfo.dstCount;
}
#endif