execute1: Fix writing LR for bdnzl/bdzl instructions
authorPaul Mackerras <paulus@ozlabs.org>
Sat, 21 Nov 2020 02:54:14 +0000 (13:54 +1100)
committerPaul Mackerras <paulus@ozlabs.org>
Sat, 21 Nov 2020 02:54:14 +0000 (13:54 +1100)
Branch instructions which do a redirect and write both CTR and LR were
not doing the write to LR due to a logic error.  This fixes it.

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

index de6bd251c009dfce6e7dda4a5a341b3fb5a9a719..61df9745abe45350af48657520ea616594f5f18f 100644 (file)
@@ -1131,10 +1131,16 @@ begin
             if e_in.insn_type = OP_FETCH_FAILED then
                 do_trace := '0';
             end if;
+        end if;
+
+        -- The following cases all occur when r.busy = 1 and therefore
+        -- valid_in = 0.  Hence they don't happen in the same cycle as any of
+        -- the cases above which depend on valid_in = 1.
 
-        elsif r.f.redirect = '1' then
+        if r.f.redirect = '1' then
             v.e.valid := '1';
-       elsif r.lr_update = '1' then
+        end if;
+       if r.lr_update = '1' then
             v.e.exc_write_enable := '1';
            v.e.exc_write_data := r.next_lr;
            v.e.exc_write_reg := fast_spr_num(SPR_LR);