execute1: Fix forwarding of result when doing delayed LR update
authorPaul Mackerras <paulus@ozlabs.org>
Tue, 24 Nov 2020 00:53:17 +0000 (11:53 +1100)
committerPaul Mackerras <paulus@ozlabs.org>
Tue, 24 Nov 2020 00:53:17 +0000 (11:53 +1100)
commite49192cb5bbaf259aa66268a46fb1c6da9a54b59
tree7705b8367e5a28c21532cd423c08195eafaf0738
parent27ac74a3415d894437d5a3b146d270615c637f6f
execute1: Fix forwarding of result when doing delayed LR update

Random execution testcases showed that a bdnzl which doesn't branch,
followed immediately by a bdnz, uses the wrong value for CTR for the
bdnz.  Decode2 detects the read-after-write hazard on CTR and tells
execute1 to use the bypass path.  However, the bdnzl takes two cycles
because it has to write back both CTR and LR, meaning that by the time
the bdnz starts to execute, r.e.write_data no longer contains the CTR
value, but instead contains zero.

To fix this, we make execute1 maintain the written-back value of CTR
in r.e.write_data across the cycle where LR is written back (this is
possible because the LR writeback uses the exc_write_data path).

Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
execute1.vhdl