x86: fixed branching() computation for branch uops
authorSanti Galan <santi.galan@metempsy.com>
Tue, 18 Apr 2017 16:08:46 +0000 (11:08 -0500)
committerJason Lowe-Power <jason@lowepower.com>
Tue, 18 Apr 2017 16:12:35 +0000 (11:12 -0500)
commit3cc6df46a3cd0aa97cd960f7f284d21c36a05181
tree268f087ae4a55dad26c711bede3b9e1d9c381093
parentefe3bfcd0c6e1161bea621a6e512378fe228fed4
x86: fixed branching() computation for branch uops

When a branch micro-op belongs to a flow and the micro-op does not change
the nPC and just updates the nuPC (like a 'rep movs' flow), branching()
function always returns not-taken no matter  actual micro-branch outcome.
Provided fix adds to the equation  nuPC attribute checking since these kind
of branch micro-op only updates that pointer.

This issue has been found while debugging the performance of a copy-loop
implemented with memcopy function. Without the fix, 'rep movss' internal
micro-branch was always predicted as not-taken causing an squash event
after every branch micro-branch execution.

Using the provided test, branch mispredition went from 1922 without the fix
to 7.

Change-Id: I1bcbefae26aef47e3135817ef99b53d0ea0a98fa
src/arch/x86/types.hh