0x0: Trap::illtrap({{fault = new IllegalInstruction;}});
format BranchN
{
- 0x1: decode BPCC
+ 0x1: decode COND2
{
- 0x0: bpcci(19, {{
- if(passesCondition(Ccr<3:0>, COND2))
- NNPC = xc->readPC() + disp;
- else
- handle_annul
- }});
- 0x2: bpccx(19, {{
- if(passesCondition(Ccr<7:4>, COND2))
+ //Branch Always
+ 0x8: decode A
+ {
+ 0x0: b(19, {{
NNPC = xc->readPC() + disp;
- else
- handle_annul
- }});
+ }});
+ 0x1: b(19, {{
+ NPC = xc->readPC() + disp;
+ NNPC = NPC + 4;
+ }}, ',a');
+ }
+ //Branch Never
+ 0x0: decode A
+ {
+ 0x0: bn(19, {{
+ NNPC = NNPC;//Don't do anything
+ }});
+ 0x1: bn(19, {{
+ NPC = xc->readNextPC() + 4;
+ NNPC = NPC + 4;
+ }}, ',a');
+ }
+ default: decode BPCC
+ {
+ 0x0: bpcci(19, {{
+ if(passesCondition(Ccr<3:0>, COND2))
+ NNPC = xc->readPC() + disp;
+ else
+ handle_annul
+ }});
+ 0x2: bpccx(19, {{
+ if(passesCondition(Ccr<7:4>, COND2))
+ NNPC = xc->readPC() + disp;
+ else
+ handle_annul
+ }});
+ }
}
0x2: bicc(22, {{
if(passesCondition(Ccr<3:0>, COND2))
// Primary format for branch instructions:
def format Branch(code, *opt_flags) {{
- code = re.sub(r'handle_annul', handle_annul, code)
(usesImm, code, immCode,
rString, iString) = splitOutImm(code)
iop = InstObjParams(name, Name, 'Branch', code, opt_flags)
def format BranchN(bits, code, *opt_flags) {{
code = re.sub(r'handle_annul', handle_annul, code)
codeBlk = CodeBlock(code)
- iop = InstObjParams(name, Name, "BranchNBits<%d>" % bits, codeBlk, opt_flags)
+ new_opt_flags = []
+ for flag in opt_flags:
+ if flag == ',a':
+ name += ',a'
+ Name += 'Annul'
+ else:
+ new_opt_flags += flag
+ iop = InstObjParams(name, Name, "BranchNBits<%d>" % bits, codeBlk, new_opt_flags)
header_output = BasicDeclare.subst(iop)
decoder_output = BasicConstructor.subst(iop)
exec_output = BranchExecute.subst(iop)