cpu: Resolve targets of predicted 'taken' decode for O3

The target of taken conditional direct branches does not
need to be resolved in IEW: the target can be computed at
decode, usually using the decoded instruction word and the PC.

The higher-than-necessary penalty is taken only on conditional
branches that are predicted taken but miss in the BTB. Thus,
this is mostly inconsequential on IPC if the BTB is big/associative
enough (fewer capacity/conflict misses). Nonetheless, what gem5
simulates is not representative of how conditional branch targets
can be handled.

Signed-off-by: Jason Lowe-Power <jason@lowepower.com>
This commit is contained in:
Arthur Perais 2016-12-21 15:05:24 -06:00
parent e5fb6752d6
commit 1664625db8

View file

@ -719,7 +719,11 @@ DefaultDecode<Impl>::decodeInsts(ThreadID tid)
} }
// Go ahead and compute any PC-relative branches. // Go ahead and compute any PC-relative branches.
if (inst->isDirectCtrl() && inst->isUncondCtrl()) { // This includes direct unconditional control and
// direct conditional control that is predicted taken.
if (inst->isDirectCtrl() &&
(inst->isUncondCtrl() || inst->readPredTaken()))
{
++decodeBranchResolved; ++decodeBranchResolved;
if (!(inst->branchTarget() == inst->readPredTarg())) { if (!(inst->branchTarget() == inst->readPredTarg())) {