static bool test_compact_instruction(struct brw_codegen *p, brw_inst src) { brw_compact_inst dst; memset(&dst, 0xd0, sizeof(dst)); if (brw_try_compact_instruction(p->devinfo, &dst, &src)) { brw_inst uncompacted; brw_uncompact_instruction(p->devinfo, &uncompacted, &dst); if (memcmp(&uncompacted, &src, sizeof(src))) { brw_debug_compact_uncompact(p->devinfo, &src, &uncompacted); return false; } } else { brw_compact_inst unchanged; memset(&unchanged, 0xd0, sizeof(unchanged)); /* It's not supposed to change dst unless it compacted. */ if (memcmp(&unchanged, &dst, sizeof(dst))) { fprintf(stderr, "Failed to compact, but dst changed\n"); fprintf(stderr, " Instruction: "); brw_disassemble_inst(stderr, p->devinfo, &src, false); return false; } } return true; }
static bool test_compact_instruction(struct brw_compile *p, struct brw_instruction src) { struct brw_context *brw = p->brw; struct brw_compact_instruction dst; memset(&dst, 0xd0, sizeof(dst)); if (brw_try_compact_instruction(p, &dst, &src)) { struct brw_instruction uncompacted; brw_uncompact_instruction(brw, &uncompacted, &dst); if (memcmp(&uncompacted, &src, sizeof(src))) { brw_debug_compact_uncompact(brw, &src, &uncompacted); return false; } } else { struct brw_compact_instruction unchanged; memset(&unchanged, 0xd0, sizeof(unchanged)); /* It's not supposed to change dst unless it compacted. */ if (memcmp(&unchanged, &dst, sizeof(dst))) { fprintf(stderr, "Failed to compact, but dst changed\n"); fprintf(stderr, " Instruction: "); brw_disassemble_inst(stderr, &src, brw->gen, false); return false; } } return true; }
void brw_disassemble(struct brw_context *brw, void *assembly, int start, int end, FILE *out) { bool dump_hex = false; for (int offset = start; offset < end;) { brw_inst *insn = assembly + offset; brw_inst uncompacted; bool compacted = brw_inst_cmpt_control(brw, insn); if (0) fprintf(out, "0x%08x: ", offset); if (compacted) { brw_compact_inst *compacted = (void *)insn; if (dump_hex) { fprintf(out, "0x%08x 0x%08x ", ((uint32_t *)insn)[1], ((uint32_t *)insn)[0]); } brw_uncompact_instruction(brw, &uncompacted, compacted); insn = &uncompacted; offset += 8; } else { if (dump_hex) { fprintf(out, "0x%08x 0x%08x 0x%08x 0x%08x ", ((uint32_t *)insn)[3], ((uint32_t *)insn)[2], ((uint32_t *)insn)[1], ((uint32_t *)insn)[0]); } offset += 16; } brw_disassemble_inst(out, brw, insn, compacted); } }
void brw_disassemble(const struct brw_device_info *devinfo, void *assembly, int start, int end, FILE *out) { bool dump_hex = (INTEL_DEBUG & DEBUG_HEX) != 0; for (int offset = start; offset < end;) { brw_inst *insn = assembly + offset; brw_inst uncompacted; bool compacted = brw_inst_cmpt_control(devinfo, insn); if (0) fprintf(out, "0x%08x: ", offset); if (compacted) { brw_compact_inst *compacted = (void *)insn; if (dump_hex) { fprintf(out, "0x%08x 0x%08x ", ((uint32_t *)insn)[1], ((uint32_t *)insn)[0]); } brw_uncompact_instruction(devinfo, &uncompacted, compacted); insn = &uncompacted; offset += 8; } else { if (dump_hex) { fprintf(out, "0x%08x 0x%08x 0x%08x 0x%08x ", ((uint32_t *)insn)[3], ((uint32_t *)insn)[2], ((uint32_t *)insn)[1], ((uint32_t *)insn)[0]); } offset += 16; } brw_disassemble_inst(out, devinfo, insn, compacted); } }