aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/panfrost/midgard/disassemble.c49
1 files changed, 34 insertions, 15 deletions
diff --git a/src/gallium/drivers/panfrost/midgard/disassemble.c b/src/gallium/drivers/panfrost/midgard/disassemble.c
index 7b71a9937ff..0938486c883 100644
--- a/src/gallium/drivers/panfrost/midgard/disassemble.c
+++ b/src/gallium/drivers/panfrost/midgard/disassemble.c
@@ -67,20 +67,39 @@ print_ld_st_opcode(midgard_load_store_op op)
static bool is_embedded_constant_half = false;
static bool is_embedded_constant_int = false;
+static char
+prefix_for_bits(unsigned bits)
+{
+ switch (bits) {
+ case 8:
+ return 'q';
+ case 16:
+ return 'h';
+ default:
+ return 0;
+ }
+}
+
static void
-print_reg(unsigned reg, bool half)
+print_reg(unsigned reg, unsigned bits)
{
/* Perform basic static analysis for expanding constants correctly */
- if (half && (reg >> 1) == 26) {
+ if ((bits == 16) && (reg >> 1) == 26) {
is_embedded_constant_half = true;
is_embedded_constant_int = is_instruction_int;
- } else if (!half && reg == 26) {
+ } else if ((bits == 32) && reg == 26) {
is_embedded_constant_int = is_instruction_int;
+ } else if (bits == 8) {
+ /* TODO */
+ } else if (bits == 64) {
+ /* TODO */
}
- if (half)
- printf("h");
+ char prefix = prefix_for_bits(bits);
+
+ if (prefix)
+ putchar(prefix);
printf("r%u", reg);
}
@@ -169,18 +188,18 @@ print_vector_src(unsigned src_binary, bool out_high,
printf(" /* rep_low */ ");
}
- print_reg(half_reg, true);
+ print_reg(half_reg, 16);
} else {
if (src->rep_high)
printf(" /* rep_high */ ");
if (src->half)
- print_reg(reg * 2 + src->rep_low, true);
+ print_reg(reg * 2 + src->rep_low, 16);
else {
if (src->rep_low)
printf(" /* rep_low */ ");
- print_reg(reg, false);
+ print_reg(reg, 32);
}
}
@@ -295,11 +314,11 @@ print_vector_field(const char *name, uint16_t *words, uint16_t reg_word,
if (out_half) {
if (out_high)
- print_reg(2 * reg_info->out_reg + 1, true);
+ print_reg(2 * reg_info->out_reg + 1, 16);
else
- print_reg(2 * reg_info->out_reg, true);
+ print_reg(2 * reg_info->out_reg, 16);
} else
- print_reg(reg_info->out_reg, false);
+ print_reg(reg_info->out_reg, 32);
if (mask != 0xF) {
unsigned i;
@@ -342,9 +361,9 @@ print_scalar_src(unsigned src_binary, unsigned reg)
printf("abs(");
if (src->full)
- print_reg(reg, false);
+ print_reg(reg, 32);
else
- print_reg(reg * 2 + (src->component >> 2), true);
+ print_reg(reg * 2 + (src->component >> 2), 16);
static const char c[4] = "xyzw";
\
@@ -383,10 +402,10 @@ print_scalar_field(const char *name, uint16_t *words, uint16_t reg_word,
printf(" ");
if (alu_field->output_full)
- print_reg(reg_info->out_reg, false);
+ print_reg(reg_info->out_reg, 32);
else
print_reg(reg_info->out_reg * 2 + (alu_field->output_component >> 2),
- true);
+ 16);
static const char c[4] = "xyzw";
printf(".%c, ",