}
}
-static struct bifrost_reg_ctrl DecodeRegCtrl(FILE *fp, struct bifrost_regs regs)
+static struct bifrost_reg_ctrl DecodeRegCtrl(FILE *fp, struct bifrost_regs regs, bool first)
{
struct bifrost_reg_ctrl decoded = {};
unsigned ctrl;
}
}
-static void dump_regs(FILE *fp, struct bifrost_regs srcs)
+static void dump_regs(FILE *fp, struct bifrost_regs srcs, bool first)
{
- struct bifrost_reg_ctrl ctrl = DecodeRegCtrl(fp, srcs);
+ struct bifrost_reg_ctrl ctrl = DecodeRegCtrl(fp, srcs, first);
fprintf(fp, "# ");
if (ctrl.read_reg0)
fprintf(fp, "port 0: r%d ", get_reg0(srcs));
}
void
-bi_disasm_dest_fma(FILE *fp, struct bifrost_regs *next_regs)
+bi_disasm_dest_fma(FILE *fp, struct bifrost_regs *next_regs, bool first)
{
- struct bifrost_reg_ctrl next_ctrl = DecodeRegCtrl(fp, *next_regs);
+ struct bifrost_reg_ctrl next_ctrl = DecodeRegCtrl(fp, *next_regs, first);
if (next_ctrl.fma_write_unit != REG_WRITE_NONE)
fprintf(fp, "r%u:t0", GetRegToWrite(next_ctrl.fma_write_unit, *next_regs));
else
}
void
-bi_disasm_dest_add(FILE *fp, struct bifrost_regs *next_regs)
+bi_disasm_dest_add(FILE *fp, struct bifrost_regs *next_regs, bool first)
{
- struct bifrost_reg_ctrl next_ctrl = DecodeRegCtrl(fp, *next_regs);
+ struct bifrost_reg_ctrl next_ctrl = DecodeRegCtrl(fp, *next_regs, first);
if (next_ctrl.add_write_unit != REG_WRITE_NONE)
fprintf(fp, "r%u:t1", GetRegToWrite(next_ctrl.add_write_unit, *next_regs));
else
if (verbose) {
fprintf(fp, "# regs: %016" PRIx64 "\n", instrs->reg_bits);
- dump_regs(fp, regs);
+ dump_regs(fp, regs, i == 0);
}
- bi_disasm_fma(fp, instrs[i].fma_bits, ®s, &next_regs, header.datareg, offset, &consts);
- bi_disasm_add(fp, instrs[i].add_bits, ®s, &next_regs, header.datareg, offset, &consts);
+ bi_disasm_fma(fp, instrs[i].fma_bits, ®s, &next_regs, header.datareg, offset, &consts, i == 0);
+ bi_disasm_add(fp, instrs[i].add_bits, ®s, &next_regs, header.datareg, offset, &consts, i == 0);
}
fprintf(fp, "}\n");
};
void
-bi_disasm_fma(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts);
+bi_disasm_fma(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool first);
-void bi_disasm_add(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts);
+void bi_disasm_add(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool first);
-void bi_disasm_dest_fma(FILE *fp, struct bifrost_regs *next_regs);
-void bi_disasm_dest_add(FILE *fp, struct bifrost_regs *next_regs);
+void bi_disasm_dest_fma(FILE *fp, struct bifrost_regs *next_regs, bool first);
+void bi_disasm_dest_add(FILE *fp, struct bifrost_regs *next_regs, bool first);
void dump_src(FILE *fp, unsigned src, struct bifrost_regs srcs, struct bi_constants *consts, bool isFMA);
# Generate checks in order
template = """void
-bi_disasm_${unit}(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts)
+bi_disasm_${unit}(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool first)
{
% for (i, (name, (emask, ebits), derived)) in enumerate(options):
% if len(derived) > 0:
% else:
${"else " if i > 0 else ""}if (unlikely(((bits & ${hex(emask)}) == ${hex(ebits)})))
% endif
- bi_disasm_${name}(fp, bits, srcs, next_regs, staging_register, branch_offset, consts);
+ bi_disasm_${name}(fp, bits, srcs, next_regs, staging_register, branch_offset, consts, first);
% endfor
else
fprintf(fp, "INSTR_INVALID_ENC ${unit} %X\\n", bits);
# state. Sync prototypes to avoid moves when calling.
disasm_op_template = Template("""static void
-bi_disasm_${c_name}(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts)
+bi_disasm_${c_name}(FILE *fp, unsigned bits, struct bifrost_regs *srcs, struct bifrost_regs *next_regs, unsigned staging_register, unsigned branch_offset, struct bi_constants *consts, bool first)
{
${body.strip()}
}
body += disasm_mod(mod, skip_mods)
body += ' fputs(" ", fp);\n'
- body += ' bi_disasm_dest_{}(fp, next_regs);\n'.format('fma' if is_fma else 'add')
+ body += ' bi_disasm_dest_{}(fp, next_regs, first);\n'.format('fma' if is_fma else 'add')
# Next up, each source. Source modifiers are inserterd here