Midgard features "compact branches" and "extended branches", i.e.
corresponds to short jumps and far jumps. The form of the extended
branch was previously incorrect in the ISA headers; this patch corrects
it and updates the disassembler (simultaneous to preserve
bisectability).
Additionally, we fix some a corner case in the disassembly of extended
branches, and we now prefix extended branches with "brx", to visually
differentiate from compact branches prefixed with "br".
Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
print_branch_op(int op)
{
switch (op) {
+ case midgard_jmp_writeout_op_branch_uncond:
+ printf("uncond.");
+ break;
+
case midgard_jmp_writeout_op_branch_cond:
printf("cond.");
break;
break;
default:
+ printf("unk%X", cond);
break;
}
}
midgard_branch_extended br;
memcpy((char *) &br, (char *) words, sizeof(br));
- printf("br.");
+ printf("brx.");
print_branch_op(br.op);
print_branch_cond(br.cond);
- /* XXX: This can't be right */
if (br.unknown)
- printf(".unknown%d\n", br.unknown);
-
- if (br.zero)
- printf(".zero%d\n", br.zero);
+ printf(".unknown%d", br.unknown);
printf(" ");
midgard_jmp_writeout_op op : 3; /* == branch_cond */
unsigned dest_tag : 4; /* tag of branch destination */
unsigned unknown : 2;
- signed offset : 7;
- unsigned zero : 16;
+ signed offset : 23;
unsigned cond : 16;
}
midgard_branch_extended;