From: Arthur Perais Date: Wed, 21 Dec 2016 21:05:24 +0000 (-0600) Subject: cpu: Resolve targets of predicted 'taken' decode for O3 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1664625db89c3c9054434b5dc97a9f1c1bfad244;p=gem5.git 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 --- diff --git a/src/cpu/o3/decode_impl.hh b/src/cpu/o3/decode_impl.hh index ca56ac1e4..15ec76f5a 100644 --- a/src/cpu/o3/decode_impl.hh +++ b/src/cpu/o3/decode_impl.hh @@ -719,7 +719,11 @@ DefaultDecode::decodeInsts(ThreadID tid) } // 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; if (!(inst->branchTarget() == inst->readPredTarg())) {