diff -r cbd95ce8ce6a -r 0872f196797d src/cpu/base_dyn_inst.hh --- a/src/cpu/base_dyn_inst.hh Tue Feb 10 17:51:03 2015 +0000 +++ b/src/cpu/base_dyn_inst.hh Thu Dec 11 15:33:00 2014 +0000 @@ -594,6 +594,7 @@ // for machines with separate int & FP reg files int8_t numFPDestRegs() const { return staticInst->numFPDestRegs(); } int8_t numIntDestRegs() const { return staticInst->numIntDestRegs(); } + int8_t numCCDestRegs() const { return staticInst->numCCDestRegs(); } /** Returns the logical register index of the i'th destination register. */ RegIndex destRegIdx(int i) const { return staticInst->destRegIdx(i); } diff -r cbd95ce8ce6a -r 0872f196797d src/cpu/o3/rename_impl.hh --- a/src/cpu/o3/rename_impl.hh Tue Feb 10 17:51:03 2015 +0000 +++ b/src/cpu/o3/rename_impl.hh Thu Dec 11 15:33:00 2014 +0000 @@ -633,7 +633,9 @@ // Check here to make sure there are enough destination registers // to rename to. Otherwise block. - if (renameMap[tid]->numFreeEntries() < inst->numDestRegs()) { + if (!renameMap[tid]->canRename(inst->numIntDestRegs(), + inst->numFPDestRegs(), + inst->numCCDestRegs())) { DPRINTF(Rename, "Blocking due to lack of free " "physical registers to rename to.\n"); blockThisCycle = true; diff -r cbd95ce8ce6a -r 0872f196797d src/cpu/o3/rename_map.hh --- a/src/cpu/o3/rename_map.hh Tue Feb 10 17:51:03 2015 +0000 +++ b/src/cpu/o3/rename_map.hh Thu Dec 11 15:33:00 2014 +0000 @@ -346,6 +346,16 @@ { return std::min(intMap.numFreeEntries(), floatMap.numFreeEntries()); } + /** + * Return whether there are enough registers to serve the request. + */ + bool canRename(uint32_t intRegs, uint32_t floatRegs, uint32_t ccRegs) const + { + return intRegs <= intMap.numFreeEntries() && + floatRegs <= floatMap.numFreeEntries() && + ccRegs <= ccMap.numFreeEntries(); + } + }; #endif //__CPU_O3_RENAME_MAP_HH__ diff -r cbd95ce8ce6a -r 0872f196797d src/cpu/static_inst.hh --- a/src/cpu/static_inst.hh Tue Feb 10 17:51:03 2015 +0000 +++ b/src/cpu/static_inst.hh Thu Dec 11 15:33:00 2014 +0000 @@ -117,6 +117,9 @@ /// Number of integer destination regs. int8_t numIntDestRegs() const { return _numIntDestRegs; } //@} + /// Number of coprocesor destination regs. + int8_t numCCDestRegs() const { return _numCCDestRegs; } + //@} /// @name Flag accessors. /// These functions are used to access the values of the various