cpu-o3: Restrict constraint on number of physical registers
Having the number of physical registers matching exactly the number of architectural ones does not guarantee a proper execution as it means the freeList would have 0 registers available for renaming. In this case the worst would happen: renaming would silently stall execution indefinitely. With this change we report the issue to the user and fail execution Change-Id: I1eb968802f1a1a5115012f44b541542a682f887d Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2011-2012, 2014, 2016, 2017, 2019-2020 ARM Limited
|
||||
* Copyright (c) 2011-2012, 2014, 2016, 2017, 2019-2020, 2024 Arm Limited
|
||||
* Copyright (c) 2013 Advanced Micro Devices, Inc.
|
||||
* All rights reserved
|
||||
*
|
||||
@@ -193,18 +193,36 @@ CPU::CPU(const BaseO3CPUParams ¶ms)
|
||||
assert(numThreads);
|
||||
const auto ®Classes = params.isa[0]->regClasses();
|
||||
|
||||
assert(params.numPhysIntRegs >=
|
||||
numThreads * regClasses.at(IntRegClass)->numRegs());
|
||||
assert(params.numPhysFloatRegs >=
|
||||
numThreads * regClasses.at(FloatRegClass)->numRegs());
|
||||
assert(params.numPhysVecRegs >=
|
||||
numThreads * regClasses.at(VecRegClass)->numRegs());
|
||||
assert(params.numPhysVecPredRegs >=
|
||||
numThreads * regClasses.at(VecPredRegClass)->numRegs());
|
||||
assert(params.numPhysMatRegs >=
|
||||
numThreads * regClasses.at(MatRegClass)->numRegs());
|
||||
assert(params.numPhysCCRegs >=
|
||||
numThreads * regClasses.at(CCRegClass)->numRegs());
|
||||
panic_if(params.numPhysIntRegs <=
|
||||
numThreads * regClasses.at(IntRegClass)->numRegs() &&
|
||||
regClasses.at(IntRegClass)->numRegs() != 0,
|
||||
"Not enough physical registers, consider increasing "
|
||||
"numPhysIntRegs\n");
|
||||
panic_if(params.numPhysFloatRegs <=
|
||||
numThreads * regClasses.at(FloatRegClass)->numRegs() &&
|
||||
regClasses.at(FloatRegClass)->numRegs() != 0,
|
||||
"Not enough physical registers, consider increasing "
|
||||
"numPhysFloatRegs\n");
|
||||
panic_if(params.numPhysVecRegs <=
|
||||
numThreads * regClasses.at(VecRegClass)->numRegs() &&
|
||||
regClasses.at(VecRegClass)->numRegs() != 0,
|
||||
"Not enough physical registers, consider increasing "
|
||||
"numPhysVecRegs\n");
|
||||
panic_if(params.numPhysVecPredRegs <=
|
||||
numThreads * regClasses.at(VecPredRegClass)->numRegs() &&
|
||||
regClasses.at(VecPredRegClass)->numRegs() != 0,
|
||||
"Not enough physical registers, consider increasing "
|
||||
"numPhysVecPredRegs\n");
|
||||
panic_if(params.numPhysMatRegs <=
|
||||
numThreads * regClasses.at(MatRegClass)->numRegs() &&
|
||||
regClasses.at(MatRegClass)->numRegs() != 0,
|
||||
"Not enough physical registers, consider increasing "
|
||||
"numPhysMatRegs\n");
|
||||
panic_if(params.numPhysCCRegs <=
|
||||
numThreads * regClasses.at(CCRegClass)->numRegs() &&
|
||||
regClasses.at(CCRegClass)->numRegs() != 0,
|
||||
"Not enough physical registers, consider increasing "
|
||||
"numPhysCCRegs\n");
|
||||
|
||||
// Just make this a warning and go ahead anyway, to keep from having to
|
||||
// add checks everywhere.
|
||||
|
||||
Reference in New Issue
Block a user