core: Implement a simple branch predictor
authorPaul Mackerras <paulus@ozlabs.org>
Mon, 15 Jun 2020 05:43:05 +0000 (15:43 +1000)
committerPaul Mackerras <paulus@ozlabs.org>
Mon, 15 Jun 2020 07:46:33 +0000 (17:46 +1000)
commit6687aae4d659e79c429c60ebbc07bfac7686365a
treeb5d9636990912293601775b4f397d2d3d9d6083a
parent09ae2ce58d71f0901e22f8f1f82607b77f38443f
core: Implement a simple branch predictor

This implements a simple branch predictor in the decode1 stage.  If it
sees that the instruction is b or bc and the branch is predicted to be
taken, it sends a flush and redirect upstream (to icache and fetch1)
to redirect fetching to the branch target.  The prediction is sent
downstream with the branch instruction, and execute1 now only sends
a flush/redirect upstream if the prediction was wrong.  Unconditional
branches are always predicted to be taken, and conditional branches
are predicted to be taken if and only if the offset is negative.
Branches that take the branch address from a register (bclr, bcctr)
are predicted not taken, as we don't have any way to predict the
branch address.

Since we can now have a mflr being executed immediately after a bl
or bcl, we now track the update to LR in the hazard tracker, using
the second write register field that is used to track RA updates for
update-form loads and stores.

For those branches that update LR but don't write any other result
(i.e. that don't decrementer CTR), we now write back LR in the same
cycle as the instruction rather than taking a second cycle for the
LR writeback.

Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
common.vhdl
core.vhdl
decode1.vhdl
decode2.vhdl
execute1.vhdl
fetch1.vhdl
ppc_fx_insns.vhdl