• Paul Mackerras's avatar
    core: Implement a simple branch predictor · 6687aae4
    Paul Mackerras authored
    
    
    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: default avatarPaul Mackerras <paulus@ozlabs.org>
    6687aae4
common.vhdl 17.2 KB