From: Luke Kenneth Casson Leighton Date: Fri, 15 May 2020 19:19:03 +0000 (+0100) Subject: use small br_ext function to morph branch address X-Git-Tag: div_pipeline~1174 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=49c7839a784f6b74fdf213bd70fb2769f138bcfd;p=soc.git use small br_ext function to morph branch address --- diff --git a/src/soc/branch/main_stage.py b/src/soc/branch/main_stage.py index 9a327906..ae7f33c0 100644 --- a/src/soc/branch/main_stage.py +++ b/src/soc/branch/main_stage.py @@ -13,6 +13,10 @@ from soc.decoder.power_enums import InternalOp from soc.decoder.power_fields import DecodeFields from soc.decoder.power_fieldsn import SignalBitRange +def br_ext(bd): + bd_sgn = bd[-1] + return Cat(Const(0, 2), bd, Repl(bd_sgn, 64-(bd.width + 2))) + class BranchMainStage(PipeModBase): def __init__(self, pspec): @@ -73,19 +77,12 @@ class BranchMainStage(PipeModBase): with m.Case(InternalOp.OP_B): li = Signal(i_fields['LI'][0:-1].shape()) comb += li.eq(i_fields['LI'][0:-1]) - li_sgn = li[-1] - comb += br_imm_addr.eq( - Cat(Const(0, 2), li, - Repl(li_sgn, 64-(li.width + 2)))) + comb += br_imm_addr.eq(br_ext(li)) comb += br_taken.eq(1) with m.Case(InternalOp.OP_BC): bd = Signal(b_fields['BD'][0:-1].shape()) comb += bd.eq(b_fields['BD'][0:-1]) - bd_sgn = bd[-1] - - comb += br_imm_addr.eq( - Cat(Const(0, 2), bd, - Repl(bd_sgn, 64-(bd.width + 2)))) + comb += br_imm_addr.eq(br_ext(bd)) comb += br_taken.eq(bc_taken) comb += self.o.nia_out.data.eq(br_addr)