We are not using regpairs for longs on x86 ryujit, so we need to turn off
CPU_LONG_USES_REGPAIR. This is the first step to getting var = call for
GT_CALLs with long return types on x86.
Commit migrated from https://github.com/dotnet/coreclr/commit/
f11e4f4f49162e33e46614c4d3a3c36584eca2f4
{
// All long enregistered nodes will have been decomposed into their
// constituent lo and hi nodes.
- regPairNo targetPair = treeNode->gtRegPair;
- noway_assert(targetPair == REG_PAIR_NONE);
targetReg = REG_NA;
}
else
void
GenTree::gtClearReg(Compiler* compiler)
{
-#if !defined(LEGACY_BACKEND) && !defined(_TARGET_64BIT_)
+#if CPU_LONG_USES_REGPAIR
if (isRegPairType(TypeGet()) ||
// (IsLocal() && isRegPairType(compiler->lvaTable[gtLclVarCommon.gtLclNum].TypeGet())) ||
(OperGet() == GT_MUL && (gtFlags & GTF_MUL_64RSLT)))
gtRegPair = REG_PAIR_NONE;
}
else
-#endif // !defined(LEGACY_BACKEND) && !defined(_TARGET_64BIT_)
+#endif // CPU_LONG_USES_REGPAIR
{
gtRegNum = REG_NA;
}
assert(!instIsFP(ins));
-#ifndef _TARGET_64BIT_
+#if CPU_LONG_USES_REGPAIR
if (tree->gtType == TYP_LONG)
{
if (offs)
}
}
else
-#endif // !_TARGET_64BIT_
+#endif // CPU_LONG_USES_REGPAIR
{
reg = tree->gtRegNum;
}
#ifdef _TARGET_XARCH_
assert(!instIsFP(ins));
#endif
+
+#if CPU_LONG_USES_REGPAIR
if (tree->gtType == TYP_LONG)
{
if (offs)
}
}
else
+#endif // CPU_LONG_USES_REGPAIR
{
rg2 = tree->gtRegNum;
}
assert(instIsFP(ins) == 0);
-#ifndef _TARGET_64BIT_
+#if CPU_LONG_USES_REGPAIR
if (tree->gtType == TYP_LONG)
{
if (offs == 0)
#endif
}
else
-#endif // !_TARGET_64BIT_
+#endif // CPU_LONG_USES_REGPAIR
{
reg = tree->gtRegNum;
}
regNumber rg2;
+#if CPU_LONG_USES_REGPAIR
if (tree->gtType == TYP_LONG)
{
if (offs)
}
}
else
+#endif // LEGACY_BACKEND
{
rg2 = tree->gtRegNum;
}
#if defined(_TARGET_X86_)
#define CPU_LOAD_STORE_ARCH 0
+
+#ifdef LEGACY_BACKEND
#define CPU_LONG_USES_REGPAIR 1
+#else
+ #define CPU_LONG_USES_REGPAIR 0 // RyuJIT x86 doesn't use the regPairNo field to record register pairs for long
+ // type tree nodes, and instead either decomposes them (for non-atomic operations)
+ // or stores multiple regNumber values for operations such as calls where the
+ // register definitions are effectively "atomic".
+#endif // LEGACY_BACKEND
+
#define CPU_HAS_FP_SUPPORT 1
#define ROUND_FLOAT 1 // round intermed float expression results
#define CPU_HAS_BYTE_REGS 1