# BC or BCREG: potential implicit register (CTR) NOTE: same in DecodeOut
with m.If((op.internal_op == InternalOp.OP_BC) |
(op.internal_op == InternalOp.OP_BCREG)):
+ xo9 = self.dec.FormXL.XO[9] # 3.0B p38 top bit of XO
+ xo5 = self.dec.FormXL.XO[5] # 3.0B p38
with m.If(~self.dec.BO[2] | # 3.0B p38 BO2=0, use CTR reg
- self.dec.FormXL.XO[9]): # 3.0B p38 top bit of XO
+ (xo9 & ~xo5)):
comb += self.fast_out.data.eq(FastRegs.CTR) # constant: CTR
comb += self.fast_out.ok.eq(1)
# decode SPR2 based on instruction type
op = self.dec.op
- # BCREG implicitly uses LR or TAR for 2nd reg (TODO: TAR)
+ # BCREG implicitly uses LR or TAR for 2nd reg
# CTR however is already in fast_spr1 *not* 2.
with m.If((op.internal_op == InternalOp.OP_BC) |
(op.internal_op == InternalOp.OP_BCREG)):
- with m.If(~self.dec.FormXL.XO[9]): # 3.0B p38 top bit of XO
+ xo9 = self.dec.FormXL.XO[9] # 3.0B p38 top bit of XO
+ xo5 = self.dec.FormXL.XO[5] # 3.0B p38
+ with m.If(~xo9):
comb += self.fast_out.data.eq(FastRegs.LR)
comb += self.fast_out.ok.eq(1)
+ with m.Elif(xo5):
+ comb += self.fast_out.data.eq(FastRegs.TAR)
+ comb += self.fast_out.ok.eq(1)
return m
from soc.fu.branch.pipe_data import BranchPipeSpec
import random
-from soc.compunits.test.test_branch_compunit import fast_reg_to_spr # HACK!
+from soc.regfile.util import fast_reg_to_spr # HACK!
class TestCase:
def __init__(self, program, regs, sprs, cr, name):
from soc.fu.compunits.compunits import BranchFunctionUnit
from soc.fu.compunits.test.test_compunit import TestRunner
-from soc.regfile.regfiles import FastRegs
+from soc.regfile.util import fast_reg_to_spr # HACK!
"""
def assert_outputs(self, branch, dec2, sim, prev_nia, code):
"""
-def fast_reg_to_spr(spr_num):
- if spr_num == FastRegs.CTR:
- return SPR.CTR.value
- elif spr_num == FastRegs.LR:
- return SPR.LR.value
- elif spr_num == FastRegs.TAR:
- return SPR.TAR.value
-
class BranchTestRunner(TestRunner):
def __init__(self, test_data):
--- /dev/null
+from soc.regfile.regfiles import FastRegs
+from soc.decoder.power_enums import SPR
+
+def fast_reg_to_spr(spr_num):
+ if spr_num == FastRegs.CTR:
+ return SPR.CTR.value
+ elif spr_num == FastRegs.LR:
+ return SPR.LR.value
+ elif spr_num == FastRegs.TAR:
+ return SPR.TAR.value