pan/mdg: Identify scalar integer mods
Symmetric with vector mods, except for normal which is packed as sign-extend. (flag 2 never seen in the wild) Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5151>
This commit is contained in:
parent
d4a42a78d8
commit
3cfe2fc1b1
|
@ -341,24 +341,13 @@ print_scalar_constant(FILE *fp, unsigned src_binary,
|
||||||
midgard_scalar_alu *alu)
|
midgard_scalar_alu *alu)
|
||||||
{
|
{
|
||||||
midgard_scalar_alu_src *src = (midgard_scalar_alu_src *)&src_binary;
|
midgard_scalar_alu_src *src = (midgard_scalar_alu_src *)&src_binary;
|
||||||
unsigned mod = 0;
|
|
||||||
|
|
||||||
assert(consts != NULL);
|
assert(consts != NULL);
|
||||||
|
|
||||||
if (!midgard_is_integer_op(alu->op)) {
|
|
||||||
if (src->abs)
|
|
||||||
mod |= MIDGARD_FLOAT_MOD_ABS;
|
|
||||||
if (src->negate)
|
|
||||||
mod |= MIDGARD_FLOAT_MOD_NEG;
|
|
||||||
} else {
|
|
||||||
mod = midgard_int_normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(fp, "#");
|
fprintf(fp, "#");
|
||||||
mir_print_constant_component(fp, consts, src->component,
|
mir_print_constant_component(fp, consts, src->component,
|
||||||
src->full ?
|
src->full ?
|
||||||
midgard_reg_mode_32 : midgard_reg_mode_16,
|
midgard_reg_mode_32 : midgard_reg_mode_16,
|
||||||
false, mod, alu->op);
|
false, src->mod, alu->op);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -400,26 +389,47 @@ print_vector_constants(FILE *fp, unsigned src_binary,
|
||||||
fprintf(fp, ")");
|
fprintf(fp, ")");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_srcmod(FILE *fp, bool is_int, unsigned mod, bool scalar)
|
||||||
|
{
|
||||||
|
/* Modifiers change meaning depending on the op's context */
|
||||||
|
|
||||||
|
midgard_int_mod int_mod = mod;
|
||||||
|
|
||||||
|
if (is_int) {
|
||||||
|
if (scalar && mod == 2) {
|
||||||
|
fprintf(fp, "unk2");
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(fp, "%s", srcmod_names_int[int_mod]);
|
||||||
|
} else {
|
||||||
|
if (mod & MIDGARD_FLOAT_MOD_NEG)
|
||||||
|
fprintf(fp, "-");
|
||||||
|
|
||||||
|
if (mod & MIDGARD_FLOAT_MOD_ABS)
|
||||||
|
fprintf(fp, "abs(");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_srcmod_end(FILE *fp, bool is_int, unsigned mod, unsigned bits)
|
||||||
|
{
|
||||||
|
/* Since we wrapped with a function-looking thing */
|
||||||
|
|
||||||
|
if (is_int && mod == midgard_int_shift)
|
||||||
|
fprintf(fp, ") << %u", bits);
|
||||||
|
else if ((is_int && (mod != midgard_int_normal))
|
||||||
|
|| (!is_int && mod & MIDGARD_FLOAT_MOD_ABS))
|
||||||
|
fprintf(fp, ")");
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_vector_src(FILE *fp, unsigned src_binary,
|
print_vector_src(FILE *fp, unsigned src_binary,
|
||||||
midgard_reg_mode mode, unsigned reg,
|
midgard_reg_mode mode, unsigned reg,
|
||||||
midgard_dest_override override, bool is_int)
|
midgard_dest_override override, bool is_int)
|
||||||
{
|
{
|
||||||
midgard_vector_alu_src *src = (midgard_vector_alu_src *)&src_binary;
|
midgard_vector_alu_src *src = (midgard_vector_alu_src *)&src_binary;
|
||||||
|
print_srcmod(fp, is_int, src->mod, false);
|
||||||
/* Modifiers change meaning depending on the op's context */
|
|
||||||
|
|
||||||
midgard_int_mod int_mod = src->mod;
|
|
||||||
|
|
||||||
if (is_int) {
|
|
||||||
fprintf(fp, "%s", srcmod_names_int[int_mod]);
|
|
||||||
} else {
|
|
||||||
if (src->mod & MIDGARD_FLOAT_MOD_NEG)
|
|
||||||
fprintf(fp, "-");
|
|
||||||
|
|
||||||
if (src->mod & MIDGARD_FLOAT_MOD_ABS)
|
|
||||||
fprintf(fp, "abs(");
|
|
||||||
}
|
|
||||||
|
|
||||||
//register
|
//register
|
||||||
unsigned bits = bits_for_mode_halved(mode, src->half);
|
unsigned bits = bits_for_mode_halved(mode, src->half);
|
||||||
|
@ -440,13 +450,7 @@ print_vector_src(FILE *fp, unsigned src_binary,
|
||||||
print_swizzle_vec2(fp, src->swizzle, src->rep_high, src->rep_low, src->half);
|
print_swizzle_vec2(fp, src->swizzle, src->rep_high, src->rep_low, src->half);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Since we wrapped with a function-looking thing */
|
print_srcmod_end(fp, is_int, src->mod, bits);
|
||||||
|
|
||||||
if (is_int && int_mod == midgard_int_shift)
|
|
||||||
fprintf(fp, ") << %u", bits);
|
|
||||||
else if ((is_int && (int_mod != midgard_int_normal))
|
|
||||||
|| (!is_int && src->mod & MIDGARD_FLOAT_MOD_ABS))
|
|
||||||
fprintf(fp, ")");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t
|
static uint16_t
|
||||||
|
@ -670,16 +674,11 @@ print_vector_field(FILE *fp, const char *name, uint16_t *words, uint16_t reg_wor
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_scalar_src(FILE *fp, unsigned src_binary, unsigned reg)
|
print_scalar_src(FILE *fp, bool is_int, unsigned src_binary, unsigned reg)
|
||||||
{
|
{
|
||||||
midgard_scalar_alu_src *src = (midgard_scalar_alu_src *)&src_binary;
|
midgard_scalar_alu_src *src = (midgard_scalar_alu_src *)&src_binary;
|
||||||
|
|
||||||
if (src->negate)
|
print_srcmod(fp, is_int, src->mod, true);
|
||||||
fprintf(fp, "-");
|
|
||||||
|
|
||||||
if (src->abs)
|
|
||||||
fprintf(fp, "abs(");
|
|
||||||
|
|
||||||
print_reg(fp, reg, src->full ? 32 : 16);
|
print_reg(fp, reg, src->full ? 32 : 16);
|
||||||
|
|
||||||
unsigned c = src->component;
|
unsigned c = src->component;
|
||||||
|
@ -691,9 +690,7 @@ print_scalar_src(FILE *fp, unsigned src_binary, unsigned reg)
|
||||||
|
|
||||||
fprintf(fp, ".%c", components[c]);
|
fprintf(fp, ".%c", components[c]);
|
||||||
|
|
||||||
if (src->abs)
|
print_srcmod_end(fp, is_int, src->mod, src->full ? 32 : 16);
|
||||||
fprintf(fp, ")");
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t
|
static uint16_t
|
||||||
|
@ -728,6 +725,7 @@ print_scalar_field(FILE *fp, const char *name, uint16_t *words, uint16_t reg_wor
|
||||||
update_dest(reg_info->out_reg);
|
update_dest(reg_info->out_reg);
|
||||||
print_reg(fp, reg_info->out_reg, full ? 32 : 16);
|
print_reg(fp, reg_info->out_reg, full ? 32 : 16);
|
||||||
unsigned c = alu_field->output_component;
|
unsigned c = alu_field->output_component;
|
||||||
|
bool is_int = midgard_is_integer_op(alu_field->op);
|
||||||
|
|
||||||
if (full) {
|
if (full) {
|
||||||
assert((c & 1) == 0);
|
assert((c & 1) == 0);
|
||||||
|
@ -739,7 +737,7 @@ print_scalar_field(FILE *fp, const char *name, uint16_t *words, uint16_t reg_wor
|
||||||
if (reg_info->src1_reg == 26)
|
if (reg_info->src1_reg == 26)
|
||||||
print_scalar_constant(fp, alu_field->src1, consts, alu_field);
|
print_scalar_constant(fp, alu_field->src1, consts, alu_field);
|
||||||
else
|
else
|
||||||
print_scalar_src(fp, alu_field->src1, reg_info->src1_reg);
|
print_scalar_src(fp, is_int, alu_field->src1, reg_info->src1_reg);
|
||||||
|
|
||||||
fprintf(fp, ", ");
|
fprintf(fp, ", ");
|
||||||
|
|
||||||
|
@ -750,7 +748,7 @@ print_scalar_field(FILE *fp, const char *name, uint16_t *words, uint16_t reg_wor
|
||||||
} else if (reg_info->src2_reg == 26) {
|
} else if (reg_info->src2_reg == 26) {
|
||||||
print_scalar_constant(fp, alu_field->src2, consts, alu_field);
|
print_scalar_constant(fp, alu_field->src2, consts, alu_field);
|
||||||
} else
|
} else
|
||||||
print_scalar_src(fp, alu_field->src2, reg_info->src2_reg);
|
print_scalar_src(fp, is_int, alu_field->src2, reg_info->src2_reg);
|
||||||
|
|
||||||
midg_stats.instruction_count++;
|
midg_stats.instruction_count++;
|
||||||
fprintf(fp, "\n");
|
fprintf(fp, "\n");
|
||||||
|
|
|
@ -275,8 +275,7 @@ midgard_vector_alu;
|
||||||
typedef struct
|
typedef struct
|
||||||
__attribute__((__packed__))
|
__attribute__((__packed__))
|
||||||
{
|
{
|
||||||
bool abs : 1;
|
unsigned mod : 2;
|
||||||
bool negate : 1;
|
|
||||||
bool full : 1; /* 0 = half, 1 = full */
|
bool full : 1; /* 0 = half, 1 = full */
|
||||||
unsigned component : 3;
|
unsigned component : 3;
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,8 +72,7 @@ vector_to_scalar_source(unsigned u, bool is_int, bool is_full,
|
||||||
if (is_int) {
|
if (is_int) {
|
||||||
/* TODO */
|
/* TODO */
|
||||||
} else {
|
} else {
|
||||||
s.abs = v.mod & MIDGARD_FLOAT_MOD_ABS;
|
s.mod = v.mod;
|
||||||
s.negate = v.mod & MIDGARD_FLOAT_MOD_NEG;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned o;
|
unsigned o;
|
||||||
|
|
Loading…
Reference in New Issue