Browse Source

i965/disasm: Disassemble indirect sends more properly

- Don't try to disassemble send's src1 as a descriptor if it's not an
  immediate.

- In the same case, show src1 as an operand (makes it easier to see
  bogus register regions, etc -- the hardware is very fussy)

Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Matt Turner <mattst88@gmail.com>
tags/10.3-branchpoint
Chris Forbes 11 years ago
parent
commit
f55e9a7c75
1 changed files with 174 additions and 162 deletions
  1. 174
    162
      src/mesa/drivers/dri/i965/brw_disasm.c

+ 174
- 162
src/mesa/drivers/dri/i965/brw_disasm.c View File

@@ -1286,6 +1286,12 @@ brw_disassemble_inst(FILE *file, struct brw_context *brw, brw_inst *inst,
if (opcode == BRW_OPCODE_SEND || opcode == BRW_OPCODE_SENDC) {
enum brw_message_target sfid = brw_inst_sfid(brw, inst);

if (brw_inst_src1_reg_file(brw, inst) != BRW_IMMEDIATE_VALUE) {
/* show the indirect descriptor source */
pad(file, 48);
err |= src1(file, brw, inst);
}

newline(file);
pad(file, 16);
space = 0;
@@ -1294,183 +1300,189 @@ brw_disassemble_inst(FILE *file, struct brw_context *brw, brw_inst *inst,
err |= control(file, "SFID", brw->gen >= 6 ? gen6_sfid : gen4_sfid,
sfid, &space);

switch (sfid) {
case BRW_SFID_MATH:
err |= control(file, "math function", math_function,
brw_inst_math_msg_function(brw, inst), &space);
err |= control(file, "math saturate", math_saturate,
brw_inst_math_msg_saturate(brw, inst), &space);
err |= control(file, "math signed", math_signed,
brw_inst_math_msg_signed_int(brw, inst), &space);
err |= control(file, "math scalar", math_scalar,
brw_inst_math_msg_data_type(brw, inst), &space);
err |= control(file, "math precision", math_precision,
brw_inst_math_msg_precision(brw, inst), &space);
break;
case BRW_SFID_SAMPLER:
if (brw->gen >= 5) {
format(file, " (%d, %d, %d, %d)",
brw_inst_binding_table_index(brw, inst),
brw_inst_sampler(brw, inst),
brw_inst_sampler_msg_type(brw, inst),
brw_inst_sampler_simd_mode(brw, inst));
} else {
format(file, " (%d, %d, %d, ",
brw_inst_binding_table_index(brw, inst),
brw_inst_sampler(brw, inst),
brw_inst_sampler_msg_type(brw, inst));
if (!brw->is_g4x) {
err |= control(file, "sampler target format",
sampler_target_format,
brw_inst_sampler_return_format(brw, inst), NULL);
}
string(file, ")");
}
break;
case GEN6_SFID_DATAPORT_SAMPLER_CACHE:
/* aka BRW_SFID_DATAPORT_READ on Gen4-5 */
if (brw->gen >= 6) {
format(file, " (%d, %d, %d, %d)",
brw_inst_binding_table_index(brw, inst),
brw_inst_dp_msg_control(brw, inst),
brw_inst_dp_msg_type(brw, inst),
brw->gen >= 7 ? 0 : brw_inst_dp_write_commit(brw, inst));
} else {
format(file, " (%d, %d, %d)",
brw_inst_binding_table_index(brw, inst),
brw_inst_dp_read_msg_control(brw, inst),
brw_inst_dp_read_msg_type(brw, inst));
}
break;

case GEN6_SFID_DATAPORT_RENDER_CACHE: {
/* aka BRW_SFID_DATAPORT_WRITE on Gen4-5 */
unsigned msg_type = brw_inst_dp_write_msg_type(brw, inst);

err |= control(file, "DP rc message type",
brw->gen >= 6 ? dp_rc_msg_type_gen6
: dp_write_port_msg_type,
msg_type, &space);

bool is_rt_write = msg_type ==
(brw->gen >= 6 ? GEN6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE
: BRW_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE);

if (is_rt_write) {
err |= control(file, "RT message type", m_rt_write_subtype,
brw_inst_rt_message_type(brw, inst), &space);
if (brw->gen >= 6 && brw_inst_rt_slot_group(brw, inst))
string(file, " Hi");
if (brw_inst_rt_last(brw, inst))
string(file, " LastRT");
if (brw->gen < 7 && brw_inst_dp_write_commit(brw, inst))
string(file, " WriteCommit");
} else {
format(file, " MsgCtrl = 0x%x",
brw_inst_dp_write_msg_control(brw, inst));
}

format(file, " Surface = %d", brw_inst_binding_table_index(brw, inst));
break;
}
if (brw_inst_src1_reg_file(brw, inst) != BRW_IMMEDIATE_VALUE) {
format(file, " indirect");
} else {
switch (sfid) {
case BRW_SFID_MATH:
err |= control(file, "math function", math_function,
brw_inst_math_msg_function(brw, inst), &space);
err |= control(file, "math saturate", math_saturate,
brw_inst_math_msg_saturate(brw, inst), &space);
err |= control(file, "math signed", math_signed,
brw_inst_math_msg_signed_int(brw, inst), &space);
err |= control(file, "math scalar", math_scalar,
brw_inst_math_msg_data_type(brw, inst), &space);
err |= control(file, "math precision", math_precision,
brw_inst_math_msg_precision(brw, inst), &space);
break;
case BRW_SFID_SAMPLER:
if (brw->gen >= 5) {
format(file, " (%d, %d, %d, %d)",
brw_inst_binding_table_index(brw, inst),
brw_inst_sampler(brw, inst),
brw_inst_sampler_msg_type(brw, inst),
brw_inst_sampler_simd_mode(brw, inst));
} else {
format(file, " (%d, %d, %d, ",
brw_inst_binding_table_index(brw, inst),
brw_inst_sampler(brw, inst),
brw_inst_sampler_msg_type(brw, inst));
if (!brw->is_g4x) {
err |= control(file, "sampler target format",
sampler_target_format,
brw_inst_sampler_return_format(brw, inst), NULL);
}
string(file, ")");
}
break;
case GEN6_SFID_DATAPORT_SAMPLER_CACHE:
/* aka BRW_SFID_DATAPORT_READ on Gen4-5 */
if (brw->gen >= 6) {
format(file, " (%d, %d, %d, %d)",
brw_inst_binding_table_index(brw, inst),
brw_inst_dp_msg_control(brw, inst),
brw_inst_dp_msg_type(brw, inst),
brw->gen >= 7 ? 0 : brw_inst_dp_write_commit(brw, inst));
} else {
format(file, " (%d, %d, %d)",
brw_inst_binding_table_index(brw, inst),
brw_inst_dp_read_msg_control(brw, inst),
brw_inst_dp_read_msg_type(brw, inst));
}
break;

case BRW_SFID_URB:
format(file, " %d", brw_inst_urb_global_offset(brw, inst));
case GEN6_SFID_DATAPORT_RENDER_CACHE: {
/* aka BRW_SFID_DATAPORT_WRITE on Gen4-5 */
unsigned msg_type = brw_inst_dp_write_msg_type(brw, inst);

err |= control(file, "DP rc message type",
brw->gen >= 6 ? dp_rc_msg_type_gen6
: dp_write_port_msg_type,
msg_type, &space);

bool is_rt_write = msg_type ==
(brw->gen >= 6 ? GEN6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE
: BRW_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE);

if (is_rt_write) {
err |= control(file, "RT message type", m_rt_write_subtype,
brw_inst_rt_message_type(brw, inst), &space);
if (brw->gen >= 6 && brw_inst_rt_slot_group(brw, inst))
string(file, " Hi");
if (brw_inst_rt_last(brw, inst))
string(file, " LastRT");
if (brw->gen < 7 && brw_inst_dp_write_commit(brw, inst))
string(file, " WriteCommit");
} else {
format(file, " MsgCtrl = 0x%x",
brw_inst_dp_write_msg_control(brw, inst));
}

space = 1;
if (brw->gen >= 7) {
err |= control(file, "urb opcode", gen7_urb_opcode,
brw_inst_urb_opcode(brw, inst), &space);
} else if (brw->gen >= 5) {
err |= control(file, "urb opcode", gen5_urb_opcode,
brw_inst_urb_opcode(brw, inst), &space);
}
err |= control(file, "urb swizzle", urb_swizzle,
brw_inst_urb_swizzle_control(brw, inst), &space);
if (brw->gen < 7) {
err |= control(file, "urb allocate", urb_allocate,
brw_inst_urb_allocate(brw, inst), &space);
err |= control(file, "urb used", urb_used,
brw_inst_urb_used(brw, inst), &space);
format(file, " Surface = %d", brw_inst_binding_table_index(brw, inst));
break;
}
err |= control(file, "urb complete", urb_complete,
brw_inst_urb_complete(brw, inst), &space);
break;
case BRW_SFID_THREAD_SPAWNER:
break;
case GEN7_SFID_DATAPORT_DATA_CACHE:
if (brw->gen >= 7) {
format(file, " (");

err |= control(file, "DP DC0 message type",
dp_dc0_msg_type_gen7,
brw_inst_dp_msg_type(brw, inst), &space);

format(file, ", %d, ", brw_inst_binding_table_index(brw, inst));
case BRW_SFID_URB:
format(file, " %d", brw_inst_urb_global_offset(brw, inst));

switch (brw_inst_dp_msg_type(brw, inst)) {
case GEN7_DATAPORT_DC_UNTYPED_ATOMIC_OP:
control(file, "atomic op", aop,
brw_inst_imm_ud(brw, inst) >> 8 & 0xf, &space);
break;
default:
format(file, "%d", brw_inst_dp_msg_control(brw, inst));
space = 1;
if (brw->gen >= 7) {
err |= control(file, "urb opcode", gen7_urb_opcode,
brw_inst_urb_opcode(brw, inst), &space);
} else if (brw->gen >= 5) {
err |= control(file, "urb opcode", gen5_urb_opcode,
brw_inst_urb_opcode(brw, inst), &space);
}
format(file, ")");
err |= control(file, "urb swizzle", urb_swizzle,
brw_inst_urb_swizzle_control(brw, inst), &space);
if (brw->gen < 7) {
err |= control(file, "urb allocate", urb_allocate,
brw_inst_urb_allocate(brw, inst), &space);
err |= control(file, "urb used", urb_used,
brw_inst_urb_used(brw, inst), &space);
}
err |= control(file, "urb complete", urb_complete,
brw_inst_urb_complete(brw, inst), &space);
break;
}
/* FALLTHROUGH */

case HSW_SFID_DATAPORT_DATA_CACHE_1: {
if (brw->gen >= 7) {
format(file, " (");

unsigned msg_ctrl = brw_inst_dp_msg_control(brw, inst);

err |= control(file, "DP DC1 message type",
dp_dc1_msg_type_hsw,
brw_inst_dp_msg_type(brw, inst), &space);

format(file, ", Surface = %d, ",
brw_inst_binding_table_index(brw, inst));

switch (brw_inst_dp_msg_type(brw, inst)) {
case HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP:
case HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP:
case HSW_DATAPORT_DC_PORT1_ATOMIC_COUNTER_OP:
format(file, "SIMD%d,", (msg_ctrl & (1 << 4)) ? 8 : 16);
/* fallthrough */
case HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP_SIMD4X2:
case HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP_SIMD4X2:
case HSW_DATAPORT_DC_PORT1_ATOMIC_COUNTER_OP_SIMD4X2:
control(file, "atomic op", aop, msg_ctrl & 0xf, &space);
break;
case HSW_DATAPORT_DC_PORT1_UNTYPED_SURFACE_READ:
case HSW_DATAPORT_DC_PORT1_UNTYPED_SURFACE_WRITE:
case HSW_DATAPORT_DC_PORT1_TYPED_SURFACE_READ:
case HSW_DATAPORT_DC_PORT1_TYPED_SURFACE_WRITE: {
static const char *simd_modes[] = { "4x2", "16", "8" };
format(file, "SIMD%s, Mask = 0x%x",
simd_modes[msg_ctrl >> 4], msg_ctrl & 0xf);
case BRW_SFID_THREAD_SPAWNER:
break;
case GEN7_SFID_DATAPORT_DATA_CACHE:
if (brw->gen >= 7) {
format(file, " (");

err |= control(file, "DP DC0 message type",
dp_dc0_msg_type_gen7,
brw_inst_dp_msg_type(brw, inst), &space);

format(file, ", %d, ", brw_inst_binding_table_index(brw, inst));

switch (brw_inst_dp_msg_type(brw, inst)) {
case GEN7_DATAPORT_DC_UNTYPED_ATOMIC_OP:
control(file, "atomic op", aop,
brw_inst_imm_ud(brw, inst) >> 8 & 0xf, &space);
break;
default:
format(file, "%d", brw_inst_dp_msg_control(brw, inst));
}
format(file, ")");
break;
}
default:
format(file, "0x%x", msg_ctrl);
/* FALLTHROUGH */

case HSW_SFID_DATAPORT_DATA_CACHE_1: {
if (brw->gen >= 7) {
format(file, " (");

unsigned msg_ctrl = brw_inst_dp_msg_control(brw, inst);

err |= control(file, "DP DC1 message type",
dp_dc1_msg_type_hsw,
brw_inst_dp_msg_type(brw, inst), &space);

format(file, ", Surface = %d, ",
brw_inst_binding_table_index(brw, inst));

switch (brw_inst_dp_msg_type(brw, inst)) {
case HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP:
case HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP:
case HSW_DATAPORT_DC_PORT1_ATOMIC_COUNTER_OP:
format(file, "SIMD%d,", (msg_ctrl & (1 << 4)) ? 8 : 16);
/* fallthrough */
case HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP_SIMD4X2:
case HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP_SIMD4X2:
case HSW_DATAPORT_DC_PORT1_ATOMIC_COUNTER_OP_SIMD4X2:
control(file, "atomic op", aop, msg_ctrl & 0xf, &space);
break;
case HSW_DATAPORT_DC_PORT1_UNTYPED_SURFACE_READ:
case HSW_DATAPORT_DC_PORT1_UNTYPED_SURFACE_WRITE:
case HSW_DATAPORT_DC_PORT1_TYPED_SURFACE_READ:
case HSW_DATAPORT_DC_PORT1_TYPED_SURFACE_WRITE: {
static const char *simd_modes[] = { "4x2", "16", "8" };
format(file, "SIMD%s, Mask = 0x%x",
simd_modes[msg_ctrl >> 4], msg_ctrl & 0xf);
break;
}
default:
format(file, "0x%x", msg_ctrl);
}
format(file, ")");
break;
}
format(file, ")");
/* FALLTHROUGH */
}

default:
format(file, "unsupported shared function ID %d", sfid);
break;
}
/* FALLTHROUGH */
}

default:
format(file, "unsupported shared function ID %d", sfid);
break;
if (space)
string(file, " ");
format(file, "mlen %d", brw_inst_mlen(brw, inst));
format(file, " rlen %d", brw_inst_rlen(brw, inst));
}
if (space)
string(file, " ");
format(file, "mlen %d", brw_inst_mlen(brw, inst));
format(file, " rlen %d", brw_inst_rlen(brw, inst));
}
pad(file, 64);
if (opcode != BRW_OPCODE_NOP) {

Loading…
Cancel
Save