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)
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

index 954f9f16e2133ed7a92d1f84eb410325467c3a66..8d47b7efb12238c8e0a740768a8d49e4a776baba 100644 (file)
@@ -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