Suppose I have the following MIPS code on a CPU with forwarding enabled:
L1: LW R2 0(R1)
ADDI R2 R2 2
SW R2 0(R1)
ADDI R1 R1 8
SUB R4 R1 R3
BNEZ R4 L1
The last two lines are of importance for me.
My intuition is that the output to R4
is calculated during the EX
stage of the pipeline, and should be ready in time for the BNEZ
instruction to EX
in the next cycle. However, I'm getting this output from WinMIPS64:
Why is there a hazard during the ID
stage? Forwarding is enabled, so it ought to know R4
will be available at the next stage of the pipeline, when it needs to evaluate if R4 == 0
, but it still adds a bubble.
What am I missing here?