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
This commit is contained in:
committed by
Jason Lowe-Power
parent
efe3bfcd0c
commit
3cc6df46a3
@@ -318,7 +318,8 @@ namespace X86ISA
|
||||
bool
|
||||
branching() const
|
||||
{
|
||||
return this->npc() != this->pc() + size();
|
||||
return (this->npc() != this->pc() + size()) ||
|
||||
(this->nupc() != this->upc() + 1);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
Reference in New Issue
Block a user