setVerbose(compiler->verbose);
#endif // DEBUG
- compiler->tmpInit();
+ regSet.tmpInit();
instInit();
genFinalizeFrame();
- unsigned maxTmpSize = compiler->tmpSize; // This is precise after LSRA has pre-allocated the temps.
+ unsigned maxTmpSize = regSet.tmpGetTotalSize(); // This is precise after LSRA has pre-allocated the temps.
getEmitter()->emitBegFN(isFramePointerUsed()
#if defined(DEBUG)
/* Shut down the temp logic */
- compiler->tmpDone();
+ regSet.tmpDone();
#if DISPLAY_SIZES
if (!TRACK_GC_TEMP_LIFETIMES)
{
- assert(compiler->tmpAllFree());
- for (TempDsc* tempThis = compiler->tmpListBeg(); tempThis != nullptr; tempThis = compiler->tmpListNxt(tempThis))
+ assert(regSet.tmpAllFree());
+ for (TempDsc* tempThis = regSet.tmpListBeg(); tempThis != nullptr; tempThis = regSet.tmpListNxt(tempThis))
{
if (varTypeIsGC(tempThis->tdTempType()))
{
if (!TRACK_GC_TEMP_LIFETIMES)
{
- assert(compiler->tmpAllFree());
- for (TempDsc* tempThis = compiler->tmpListBeg(); tempThis != nullptr;
- tempThis = compiler->tmpListNxt(tempThis))
+ assert(regSet.tmpAllFree());
+ for (TempDsc* tempThis = regSet.tmpListBeg(); tempThis != nullptr; tempThis = regSet.tmpListNxt(tempThis))
{
if (!varTypeIsGC(tempThis->tdTempType()))
{
here (where we have committed to the final numbers for the frame offsets)
This will ensure that the prolog size is always correct
*/
- getEmitter()->emitMaxTmpSize = compiler->tmpSize;
+ getEmitter()->emitMaxTmpSize = regSet.tmpGetTotalSize();
#ifdef DEBUG
if (compiler->opts.dspCode || compiler->opts.disAsm || compiler->opts.disAsm2 || verbose)
if (!TRACK_GC_TEMP_LIFETIMES)
{
- assert(compiler->tmpAllFree());
- for (TempDsc* tempThis = compiler->tmpListBeg(); tempThis != nullptr; tempThis = compiler->tmpListNxt(tempThis))
+ assert(regSet.tmpAllFree());
+ for (TempDsc* tempThis = regSet.tmpListBeg(); tempThis != nullptr; tempThis = regSet.tmpListNxt(tempThis))
{
if (!varTypeIsGC(tempThis->tdTempType()))
{
getEmitter()->emitEndProlog();
compiler->unwindEndProlog();
- noway_assert(getEmitter()->emitMaxTmpSize == compiler->tmpSize);
+ noway_assert(getEmitter()->emitMaxTmpSize == regSet.tmpGetTotalSize());
}
#ifdef _PREFAST_
#pragma warning(pop)
/* Finalize the temp tracking logic */
- compiler->tmpEnd();
+ regSet.tmpEnd();
#ifdef DEBUG
if (compiler->verbose)
TempDsc* t = regSet.rsUnspillInPlace(call, unspillTreeReg, i);
getEmitter()->emitIns_R_S(ins_Load(dstType), emitActualTypeSize(dstType), dstReg, t->tdTempNum(),
0);
- compiler->tmpRlsTemp(t);
+ regSet.tmpRlsTemp(t);
gcInfo.gcMarkRegPtrVal(dstReg, dstType);
}
}
TempDsc* t = regSet.rsUnspillInPlace(splitArg, dstReg, i);
getEmitter()->emitIns_R_S(ins_Load(dstType), emitActualTypeSize(dstType), dstReg, t->tdTempNum(),
0);
- compiler->tmpRlsTemp(t);
+ regSet.tmpRlsTemp(t);
gcInfo.gcMarkRegPtrVal(dstReg, dstType);
}
}
TempDsc* t = regSet.rsUnspillInPlace(multiReg, dstReg, i);
getEmitter()->emitIns_R_S(ins_Load(dstType), emitActualTypeSize(dstType), dstReg, t->tdTempNum(),
0);
- compiler->tmpRlsTemp(t);
+ regSet.tmpRlsTemp(t);
gcInfo.gcMarkRegPtrVal(dstReg, dstType);
}
}
TempDsc* t = regSet.rsUnspillInPlace(unspillTree, unspillTree->gtRegNum);
getEmitter()->emitIns_R_S(ins_Load(unspillTree->gtType), emitActualTypeSize(unspillTree->TypeGet()), dstReg,
t->tdTempNum(), 0);
- compiler->tmpRlsTemp(t);
+ regSet.tmpRlsTemp(t);
unspillTree->gtFlags &= ~GTF_SPILLED;
gcInfo.gcMarkRegPtrVal(dstReg, unspillTree->TypeGet());
TempDsc* t = regSet.rsUnspillInPlace(op1, op1->gtRegNum);
inst_FS_ST(INS_fld, emitActualTypeSize(op1->gtType), t, 0);
op1->gtFlags &= ~GTF_SPILLED;
- compiler->tmpRlsTemp(t);
+ regSet.tmpRlsTemp(t);
}
}
#endif // _TARGET_X86_
varNum = tmpDsc->tdTempNum();
offset = 0;
- compiler->tmpRlsTemp(tmpDsc);
+ regSet.tmpRlsTemp(tmpDsc);
}
else if (srcNode->isIndir())
{
assert(fieldNode->IsRegOptional());
TempDsc* tmp = getSpillTempDsc(fieldNode);
getEmitter()->emitIns_S(INS_push, emitActualTypeSize(fieldNode->TypeGet()), tmp->tdTempNum(), 0);
- compiler->tmpRlsTemp(tmp);
+ regSet.tmpRlsTemp(tmp);
}
else
{
/*****************************************************************************/
-#if defined(FEATURE_SIMD)
-#if defined(_TARGET_XARCH_)
-const unsigned TEMP_MAX_SIZE = YMM_REGSIZE_BYTES;
-#elif defined(_TARGET_ARM64_)
-const unsigned TEMP_MAX_SIZE = FP_REGSIZE_BYTES;
-#endif // defined(_TARGET_XARCH_) || defined(_TARGET_ARM64_)
-#else // !FEATURE_SIMD
-const unsigned TEMP_MAX_SIZE = sizeof(double);
-#endif // !FEATURE_SIMD
-const unsigned TEMP_SLOT_COUNT = (TEMP_MAX_SIZE / sizeof(int));
-
const unsigned FLG_CCTOR = (CORINFO_FLG_CONSTRUCTOR | CORINFO_FLG_STATIC);
#ifdef DEBUG
#ifdef _TARGET_ARM_
unsigned int regSize = (hfaType == TYP_DOUBLE) ? 2 : 1;
#else
- unsigned int regSize = 1;
+ unsigned int regSize = 1;
#endif
for (unsigned int regIndex = 1; regIndex < numRegs; regIndex++)
{
/*****************************************************************************/
-public:
- void tmpInit();
-
- enum TEMP_USAGE_TYPE
- {
- TEMP_USAGE_FREE,
- TEMP_USAGE_USED
- };
-
- static var_types tmpNormalizeType(var_types type);
- TempDsc* tmpGetTemp(var_types type); // get temp for the given type
- void tmpRlsTemp(TempDsc* temp);
- TempDsc* tmpFindNum(int temp, TEMP_USAGE_TYPE usageType = TEMP_USAGE_FREE) const;
-
- void tmpEnd();
- TempDsc* tmpListBeg(TEMP_USAGE_TYPE usageType = TEMP_USAGE_FREE) const;
- TempDsc* tmpListNxt(TempDsc* curTemp, TEMP_USAGE_TYPE usageType = TEMP_USAGE_FREE) const;
- void tmpDone();
-
-#ifdef DEBUG
- bool tmpAllFree() const;
-#endif // DEBUG
-
- void tmpPreAllocateTemps(var_types type, unsigned count);
-
-protected:
- unsigned tmpCount; // Number of temps
- unsigned tmpSize; // Size of all the temps
-#ifdef DEBUG
-public:
- // Used by RegSet::rsSpillChk()
- unsigned tmpGetCount; // Temps which haven't been released yet
-#endif
-private:
- static unsigned tmpSlot(unsigned size); // which slot in tmpFree[] or tmpUsed[] to use
-
- TempDsc* tmpFree[TEMP_MAX_SIZE / sizeof(int)];
- TempDsc* tmpUsed[TEMP_MAX_SIZE / sizeof(int)];
-
/*
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
FPbased = isFramePointerUsed();
if (lvaDoneFrameLayout == Compiler::FINAL_FRAME_LAYOUT)
{
- TempDsc* tmpDsc = tmpFindNum(varNum);
+ TempDsc* tmpDsc = codeGen->regSet.tmpFindNum(varNum);
// The temp might be in use, since this might be during code generation.
if (tmpDsc == nullptr)
{
- tmpDsc = tmpFindNum(varNum, Compiler::TEMP_USAGE_USED);
+ tmpDsc = codeGen->regSet.tmpFindNum(varNum, RegSet::TEMP_USAGE_USED);
}
assert(tmpDsc != nullptr);
offset = tmpDsc->tdTempOffs();
/*****************************************************************************/
-/* static */ inline unsigned Compiler::tmpSlot(unsigned size)
+/* static */ inline unsigned RegSet::tmpSlot(unsigned size)
{
noway_assert(size >= sizeof(int));
noway_assert(size <= TEMP_MAX_SIZE);
* over a function body.
*/
-inline void Compiler::tmpEnd()
+inline void RegSet::tmpEnd()
{
#ifdef DEBUG
- if (verbose && (tmpCount > 0))
+ if (m_rsCompiler->verbose && (tmpCount > 0))
{
printf("%d tmps used\n", tmpCount);
}
* compiled.
*/
-inline void Compiler::tmpDone()
+inline void RegSet::tmpDone()
{
#ifdef DEBUG
unsigned count;
}
else
{
- TempDsc* tmpDsc = emitComp->tmpFindNum(varNum);
+ TempDsc* tmpDsc = codeGen->regSet.tmpFindNum(varNum);
vt = tmpDsc->tdTempType();
}
if (vt == TYP_REF || vt == TYP_BYREF)
}
else
{
- TempDsc* tmpDsc = emitComp->tmpFindNum(varNum);
+ TempDsc* tmpDsc = codeGen->regSet.tmpFindNum(varNum);
vt = tmpDsc->tdTempType();
}
if (vt == TYP_REF || vt == TYP_BYREF)
}
else
{
- TempDsc* tmpDsc = emitComp->tmpFindNum(varNum);
+ TempDsc* tmpDsc = codeGen->regSet.tmpFindNum(varNum);
vt = tmpDsc->tdTempType();
}
if (vt == TYP_REF || vt == TYP_BYREF)
}
// The offset is already assigned. Find the temp.
- TempDsc* tmp = emitComp->tmpFindNum(var, Compiler::TEMP_USAGE_USED);
+ TempDsc* tmp = codeGen->regSet.tmpFindNum(var, RegSet::TEMP_USAGE_USED);
if (tmp == nullptr)
{
// It might be in the free lists, if we're working on zero initializing the temps.
- tmp = emitComp->tmpFindNum(var, Compiler::TEMP_USAGE_FREE);
+ tmp = codeGen->regSet.tmpFindNum(var, RegSet::TEMP_USAGE_FREE);
}
assert(tmp != nullptr);
offs = tmp->tdTempOffs();
varNum = tmpDsc->tdTempNum();
offset = 0;
- emitComp->tmpRlsTemp(tmpDsc);
+ codeGen->regSet.tmpRlsTemp(tmpDsc);
}
else if (memOp->isIndir())
{
/* Count&Write spill temps that hold pointers */
- assert(compiler->tmpAllFree());
- for (TempDsc* tempItem = compiler->tmpListBeg(); tempItem != nullptr; tempItem = compiler->tmpListNxt(tempItem))
+ assert(compiler->codeGen->regSet.tmpAllFree());
+ for (TempDsc* tempItem = compiler->codeGen->regSet.tmpListBeg(); tempItem != nullptr;
+ tempItem = compiler->codeGen->regSet.tmpListNxt(tempItem))
{
if (varTypeIsGC(tempItem->tdTempType()))
{
{
// Count&Write spill temps that hold pointers.
- assert(compiler->tmpAllFree());
- for (TempDsc* tempItem = compiler->tmpListBeg(); tempItem != nullptr; tempItem = compiler->tmpListNxt(tempItem))
+ assert(compiler->codeGen->regSet.tmpAllFree());
+ for (TempDsc* tempItem = compiler->codeGen->regSet.tmpListBeg(); tempItem != nullptr;
+ tempItem = compiler->codeGen->regSet.tmpListNxt(tempItem))
{
if (varTypeIsGC(tempItem->tdTempType()))
{
/* Also count spill temps that hold pointers */
- assert(compiler->tmpAllFree());
- for (TempDsc* tempThis = compiler->tmpListBeg(); tempThis != nullptr; tempThis = compiler->tmpListNxt(tempThis))
+ assert(regSet->tmpAllFree());
+ for (TempDsc* tempThis = regSet->tmpListBeg(); tempThis != nullptr; tempThis = regSet->tmpListNxt(tempThis))
{
if (varTypeIsGC(tempThis->tdTempType()) == false)
{
varNum = tmpDsc->tdTempNum();
offset = 0;
- compiler->tmpRlsTemp(tmpDsc);
+ regSet.tmpRlsTemp(tmpDsc);
}
else if (op1->OperIsHWIntrinsic())
{
varNum = tmpDsc->tdTempNum();
offset = 0;
- compiler->tmpRlsTemp(tmpDsc);
+ regSet.tmpRlsTemp(tmpDsc);
}
else if (op1->OperIsHWIntrinsic())
{
varNum = tmpDsc->tdTempNum();
offset = 0;
- compiler->tmpRlsTemp(tmpDsc);
+ regSet.tmpRlsTemp(tmpDsc);
}
else if (op2->OperIsHWIntrinsic())
{
varNum = tmpDsc->tdTempNum();
offset = 0;
- compiler->tmpRlsTemp(tmpDsc);
+ regSet.tmpRlsTemp(tmpDsc);
}
else if (op2->OperIsHWIntrinsic())
{
varNum = tmpDsc->tdTempNum();
offset = 0;
- compiler->tmpRlsTemp(tmpDsc);
+ regSet.tmpRlsTemp(tmpDsc);
}
else if (op2->OperIsHWIntrinsic())
{
varNum = tmpDsc->tdTempNum();
offset = 0;
- compiler->tmpRlsTemp(tmpDsc);
+ regSet.tmpRlsTemp(tmpDsc);
}
else if (op3->OperIsHWIntrinsic())
{
if (lvaDoneFrameLayout >= REGALLOC_FRAME_LAYOUT)
{
- result = tmpSize;
+ result = codeGen->regSet.tmpGetTotalSize();
}
else
{
}
}
- assert(tmpAllFree());
- for (TempDsc* temp = tmpListBeg(); temp != nullptr; temp = tmpListNxt(temp))
+ assert(codeGen->regSet.tmpAllFree());
+ for (TempDsc* temp = codeGen->regSet.tmpListBeg(); temp != nullptr; temp = codeGen->regSet.tmpListNxt(temp))
{
temp->tdAdjustTempOffs(delta);
}
assignDone = true;
}
- assert(tmpAllFree());
+ assert(codeGen->regSet.tmpAllFree());
AGAIN2:
- for (TempDsc* temp = tmpListBeg(); temp != nullptr; temp = tmpListNxt(temp))
+ for (TempDsc* temp = codeGen->regSet.tmpListBeg(); temp != nullptr; temp = codeGen->regSet.tmpListNxt(temp))
{
var_types tempType = temp->tdTempType();
unsigned size;
//-------------------------------------------------------------------------
// Display the code-gen temps
- assert(tmpAllFree());
- for (TempDsc* temp = tmpListBeg(); temp != nullptr; temp = tmpListNxt(temp))
+ assert(codeGen->regSet.tmpAllFree());
+ for (TempDsc* temp = codeGen->regSet.tmpListBeg(); temp != nullptr; temp = codeGen->regSet.tmpListNxt(temp))
{
printf("; TEMP_%02u %26s%*s%7s -> ", -temp->tdTempNum(), " ", refCntWtdWidth, " ",
varTypeName(temp->tdTempType()));
// only a few types should actually be seen here.
JITDUMP("Recording the maximum number of concurrent spills:\n");
#ifdef _TARGET_X86_
- var_types returnType = compiler->tmpNormalizeType(compiler->info.compRetType);
+ var_types returnType = RegSet::tmpNormalizeType(compiler->info.compRetType);
if (needDoubleTmpForFPCall || (returnType == TYP_DOUBLE))
{
JITDUMP("Adding a spill temp for moving a double call/return value between xmm reg and x87 stack.\n");
#endif // _TARGET_X86_
for (int i = 0; i < TYP_COUNT; i++)
{
- if (var_types(i) != compiler->tmpNormalizeType(var_types(i)))
+ if (var_types(i) != RegSet::tmpNormalizeType(var_types(i)))
{
// Only normalized types should have anything in the maxSpill array.
// We assume here that if type 'i' does not normalize to itself, then
if (maxSpill[i] != 0)
{
JITDUMP(" %s: %d\n", varTypeName(var_types(i)), maxSpill[i]);
- compiler->tmpPreAllocateTemps(var_types(i), maxSpill[i]);
+ compiler->codeGen->regSet.tmpPreAllocateTemps(var_types(i), maxSpill[i]);
}
}
JITDUMP("\n");
{
typ = treeNode->TypeGet();
}
- typ = compiler->tmpNormalizeType(typ);
+ typ = RegSet::tmpNormalizeType(typ);
}
if (refPosition->spillAfter && !refPosition->reload)
treeType = tree->TypeGet();
}
- var_types tempType = Compiler::tmpNormalizeType(treeType);
+ var_types tempType = RegSet::tmpNormalizeType(treeType);
regMaskTP mask;
bool floatSpill = false;
SpillDsc* spill = SpillDsc::alloc(m_rsCompiler, this, tempType);
// Grab a temp to store the spilled value
- TempDsc* temp = m_rsCompiler->tmpGetTemp(tempType);
+ TempDsc* temp = tmpGetTemp(tempType);
spill->spillTemp = temp;
tempType = temp->tdTempType();
/* Grab a temp to store the spilled value */
- spill->spillTemp = temp = m_rsCompiler->tmpGetTemp(treeType);
+ spill->spillTemp = temp = tmpGetTemp(treeType);
/* Remember what it is we have spilled */
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
*/
-void Compiler::tmpInit()
+void RegSet::tmpInit()
{
tmpCount = 0;
tmpSize = 0;
}
/* static */
-var_types Compiler::tmpNormalizeType(var_types type)
+var_types RegSet::tmpNormalizeType(var_types type)
{
type = genActualType(type);
* the garbage collector).
*/
-TempDsc* Compiler::tmpGetTemp(var_types type)
+TempDsc* RegSet::tmpGetTemp(var_types type)
{
type = tmpNormalizeType(type);
unsigned size = genTypeSize(type);
noway_assert(temp != nullptr);
#ifdef DEBUG
- if (verbose)
+ if (m_rsCompiler->verbose)
{
printf("%s temp #%u, slot %u, size = %u\n", isNewTemp ? "created" : "reused", -temp->tdTempNum(), slot,
temp->tdTempSize());
* has been preallocated, it is a fatal error.
*/
-void Compiler::tmpPreAllocateTemps(var_types type, unsigned count)
+void RegSet::tmpPreAllocateTemps(var_types type, unsigned count)
{
assert(type == tmpNormalizeType(type));
unsigned size = genTypeSize(type);
}
#endif // _TARGET_ARM_
- TempDsc* temp = new (this, CMK_Unknown) TempDsc(-((int)tmpCount), size, type);
+ TempDsc* temp = new (m_rsCompiler, CMK_Unknown) TempDsc(-((int)tmpCount), size, type);
#ifdef DEBUG
- if (verbose)
+ if (m_rsCompiler->verbose)
{
printf("pre-allocated temp #%u, slot %u, size = %u\n", -temp->tdTempNum(), slot, temp->tdTempSize());
}
* Release the given temp.
*/
-void Compiler::tmpRlsTemp(TempDsc* temp)
+void RegSet::tmpRlsTemp(TempDsc* temp)
{
assert(temp != nullptr);
slot = tmpSlot(temp->tdTempSize());
#ifdef DEBUG
- if (verbose)
+ if (m_rsCompiler->verbose)
{
printf("release temp #%u, slot %u, size = %u\n", -temp->tdTempNum(), slot, temp->tdTempSize());
}
*
* When looking for temps on the "used" list, this can be used any time.
*/
-TempDsc* Compiler::tmpFindNum(int tnum, TEMP_USAGE_TYPE usageType /* = TEMP_USAGE_FREE */) const
+TempDsc* RegSet::tmpFindNum(int tnum, TEMP_USAGE_TYPE usageType /* = TEMP_USAGE_FREE */) const
{
assert(tnum < 0); // temp numbers are negative
* A helper function is used to iterate over all the temps.
*/
-TempDsc* Compiler::tmpListBeg(TEMP_USAGE_TYPE usageType /* = TEMP_USAGE_FREE */) const
+TempDsc* RegSet::tmpListBeg(TEMP_USAGE_TYPE usageType /* = TEMP_USAGE_FREE */) const
{
TempDsc* const* tmpLists;
if (usageType == TEMP_USAGE_FREE)
* Used with tmpListBeg() to iterate over the list of temps.
*/
-TempDsc* Compiler::tmpListNxt(TempDsc* curTemp, TEMP_USAGE_TYPE usageType /* = TEMP_USAGE_FREE */) const
+TempDsc* RegSet::tmpListNxt(TempDsc* curTemp, TEMP_USAGE_TYPE usageType /* = TEMP_USAGE_FREE */) const
{
assert(curTemp != nullptr);
/*****************************************************************************
* Return 'true' if all allocated temps are free (not in use).
*/
-bool Compiler::tmpAllFree() const
+bool RegSet::tmpAllFree() const
{
// The 'tmpGetCount' should equal the number of things in the 'tmpUsed' lists. This is a convenient place
// to assert that.
void RegSet::rsSpillChk()
{
// All grabbed temps should have been released
- assert(m_rsCompiler->tmpGetCount == 0);
+ assert(tmpGetCount == 0);
for (regNumber reg = REG_FIRST; reg < REG_COUNT; reg = REG_NEXT(reg))
{
TempDsc* rsUnspillInPlace(GenTree* tree, regNumber oldReg, unsigned regIdx = 0);
void rsMarkSpill(GenTree* tree, regNumber reg);
+
+public:
+ void tmpInit();
+
+ enum TEMP_USAGE_TYPE
+ {
+ TEMP_USAGE_FREE,
+ TEMP_USAGE_USED
+ };
+
+ static var_types tmpNormalizeType(var_types type);
+ TempDsc* tmpGetTemp(var_types type); // get temp for the given type
+ void tmpRlsTemp(TempDsc* temp);
+ TempDsc* tmpFindNum(int temp, TEMP_USAGE_TYPE usageType = TEMP_USAGE_FREE) const;
+
+ void tmpEnd();
+ TempDsc* tmpListBeg(TEMP_USAGE_TYPE usageType = TEMP_USAGE_FREE) const;
+ TempDsc* tmpListNxt(TempDsc* curTemp, TEMP_USAGE_TYPE usageType = TEMP_USAGE_FREE) const;
+ void tmpDone();
+
+#ifdef DEBUG
+ bool tmpAllFree() const;
+#endif // DEBUG
+
+ void tmpPreAllocateTemps(var_types type, unsigned count);
+
+ unsigned tmpGetTotalSize()
+ {
+ return tmpSize;
+ }
+
+private:
+ unsigned tmpCount; // Number of temps
+ unsigned tmpSize; // Size of all the temps
+#ifdef DEBUG
+ // Used by RegSet::rsSpillChk()
+ unsigned tmpGetCount; // Temps which haven't been released yet
+#endif
+ static unsigned tmpSlot(unsigned size); // which slot in tmpFree[] or tmpUsed[] to use
+
+ enum TEMP_CONSTANTS : unsigned
+ {
+#if defined(FEATURE_SIMD)
+#if defined(_TARGET_XARCH_)
+ TEMP_MAX_SIZE = YMM_REGSIZE_BYTES,
+#elif defined(_TARGET_ARM64_)
+ TEMP_MAX_SIZE = FP_REGSIZE_BYTES,
+#endif // defined(_TARGET_XARCH_) || defined(_TARGET_ARM64_)
+#else // !FEATURE_SIMD
+ TEMP_MAX_SIZE = sizeof(double),
+#endif // !FEATURE_SIMD
+ TEMP_SLOT_COUNT = (TEMP_MAX_SIZE / sizeof(int))
+ };
+
+ TempDsc* tmpFree[TEMP_MAX_SIZE / sizeof(int)];
+ TempDsc* tmpUsed[TEMP_MAX_SIZE / sizeof(int)];
};
#endif // _REGSET_H