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:
Giacomo Travaglini
2024-01-17 13:04:16 +00:00
parent 1fb7c1ad7e
commit 4eb0cd44fc

View File

@@ -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 &params)
assert(numThreads);
const auto &regClasses = 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.