intel/gen12: Take into account opcode when decoding SWSB

The interpretation of the fields is different depending whether the
instruction is a SEND/MATH or not.

This fixes the disassembly output for non-SEND/MATH instructions that
have both in-order and out-of-order dependencies.  Their dependencies
were wrongly represented as `@A $B` when the correct would be `@A
$B.dst`.

Fixes: 6154cdf924 ("intel/eu/gen12: Add auxiliary type to represent SWSB information during codegen.")
Fixes: 83612c0127 ("intel/disasm/gen12: Disassemble software scoreboard information.")
Acked-by: Francisco Jerez <currojerez@riseup.net>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3660>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3660>
This commit is contained in:
Caio Marcelo de Oliveira Filho
2020-01-31 10:20:25 -08:00
parent bee5c9b0dc
commit 79788b8f7f
2 changed files with 7 additions and 3 deletions

View File

@@ -1632,7 +1632,8 @@ qtr_ctrl(FILE *file, const struct gen_device_info *devinfo, const brw_inst *inst
static int static int
swsb(FILE *file, const struct gen_device_info *devinfo, const brw_inst *inst) swsb(FILE *file, const struct gen_device_info *devinfo, const brw_inst *inst)
{ {
const struct tgl_swsb swsb = tgl_swsb_decode(brw_inst_swsb(devinfo, inst)); const struct tgl_swsb swsb = tgl_swsb_decode(brw_inst_opcode(devinfo, inst),
brw_inst_swsb(devinfo, inst));
if (swsb.regdist) if (swsb.regdist)
format(file, " @%d", swsb.regdist); format(file, " @%d", swsb.regdist);
if (swsb.mode) if (swsb.mode)

View File

@@ -1154,11 +1154,14 @@ tgl_swsb_encode(struct tgl_swsb swsb)
* tgl_swsb. * tgl_swsb.
*/ */
static inline struct tgl_swsb static inline struct tgl_swsb
tgl_swsb_decode(uint8_t x) tgl_swsb_decode(enum opcode opcode, uint8_t x)
{ {
if (x & 0x80) { if (x & 0x80) {
const struct tgl_swsb swsb = { (x & 0x70u) >> 4, x & 0xfu, const struct tgl_swsb swsb = { (x & 0x70u) >> 4, x & 0xfu,
TGL_SBID_DST | TGL_SBID_SET }; (opcode == BRW_OPCODE_SEND ||
opcode == BRW_OPCODE_SENDC ||
opcode == BRW_OPCODE_MATH) ?
TGL_SBID_SET : TGL_SBID_DST };
return swsb; return swsb;
} else if ((x & 0x70) == 0x20) { } else if ((x & 0x70) == 0x20) {
return tgl_swsb_sbid(TGL_SBID_DST, x & 0xfu); return tgl_swsb_sbid(TGL_SBID_DST, x & 0xfu);