From ea3115027e3d148fc1741388acb1272b29aad22d Mon Sep 17 00:00:00 2001 From: Italo Nicola Date: Tue, 2 Mar 2021 10:53:35 +0000 Subject: [PATCH] pan/mdg: improve outmod printing Signed-off-by: Italo Nicola Reviewed-by: Alyssa Rosenzweig Part-of: --- src/panfrost/midgard/compiler.h | 2 +- src/panfrost/midgard/disassemble.c | 53 ++++++++++++++++--------- src/panfrost/midgard/midgard.h | 18 +++++---- src/panfrost/midgard/midgard_compile.c | 44 ++++++++++---------- src/panfrost/midgard/midgard_schedule.c | 2 +- src/panfrost/midgard/mir.c | 2 +- 6 files changed, 70 insertions(+), 51 deletions(-) diff --git a/src/panfrost/midgard/compiler.h b/src/panfrost/midgard/compiler.h index a3841609fa4..ab699b5f019 100644 --- a/src/panfrost/midgard/compiler.h +++ b/src/panfrost/midgard/compiler.h @@ -537,7 +537,7 @@ v_mov(unsigned src, unsigned dest) .dest = dest, .dest_type = nir_type_uint32, .op = midgard_alu_op_imov, - .outmod = midgard_outmod_int_wrap + .outmod = midgard_outmod_keeplo }; return ins; diff --git a/src/panfrost/midgard/disassemble.c b/src/panfrost/midgard/disassemble.c index 79544ba7fcf..e33b2d4373f 100644 --- a/src/panfrost/midgard/disassemble.c +++ b/src/panfrost/midgard/disassemble.c @@ -157,16 +157,16 @@ print_reg(FILE *fp, unsigned reg, unsigned bits) static char *outmod_names_float[4] = { "", - ".pos", - ".sat_signed", - ".sat" + ".clamp_0_inf", + ".clamp_m1_1", + ".clamp_0_1" }; static char *outmod_names_int[4] = { - ".isat", + ".ssat", ".usat", - "", - ".hi" + ".keeplo", + ".keephi" }; static char *srcmod_names_int[4] = { @@ -180,7 +180,21 @@ static void print_outmod(FILE *fp, unsigned outmod, bool is_int) { fprintf(fp, "%s", is_int ? outmod_names_int[outmod] : - outmod_names_float[outmod]); + outmod_names_float[outmod]); +} + +static void +print_alu_outmod(FILE *fp, unsigned outmod, bool is_int, bool half) +{ + if (is_int && !half) { + assert(outmod == midgard_outmod_keeplo); + return; + } + + if (!is_int && half) + fprintf(fp, ".shrink"); + + print_outmod(fp, outmod, is_int); } static void @@ -636,10 +650,6 @@ print_vector_field(FILE *fp, const char *name, uint16_t *words, uint16_t reg_wor if (size_ambiguous) fprintf(fp, "%c", postfix ? postfix : 'r'); - /* Print the outmod, if there is one */ - print_outmod(fp, alu_field->outmod, - midgard_is_integer_out_op(alu_field->op)); - fprintf(fp, " "); /* Mask denoting status of 8-lanes */ @@ -669,9 +679,12 @@ print_vector_field(FILE *fp, const char *name, uint16_t *words, uint16_t reg_wor } print_mask(fp, mask, bits_for_mode(mode), shrink_mode); - fprintf(fp, ", "); + /* Print output modifiers */ bool is_int = midgard_is_integer_op(alu_field->op); + print_alu_outmod(fp, alu_field->outmod, is_int, shrink_mode != midgard_shrink_mode_none); + + fprintf(fp, ", "); if (reg_info->src1_reg == 26) print_vector_constants(fp, alu_field->src1, consts, alu_field); @@ -738,8 +751,6 @@ print_scalar_field(FILE *fp, const char *name, uint16_t *words, uint16_t reg_wor fprintf(fp, "%s.", name); print_alu_opcode(fp, alu_field->op); - print_outmod(fp, alu_field->outmod, - midgard_is_integer_out_op(alu_field->op)); fprintf(fp, " "); bool full = alu_field->output_full; @@ -753,7 +764,11 @@ print_scalar_field(FILE *fp, const char *name, uint16_t *words, uint16_t reg_wor c >>= 1; } - fprintf(fp, ".%c, ", components[c]); + fprintf(fp, ".%c", components[c]); + + print_alu_outmod(fp, alu_field->outmod, is_int, !full); + + fprintf(fp, ", "); if (reg_info->src1_reg == 26) print_scalar_constant(fp, alu_field->src1, consts, alu_field); @@ -1430,13 +1445,15 @@ print_texture_word(FILE *fp, uint32_t *word, unsigned tabs, unsigned in_reg_base if (texture->out_of_order) fprintf(fp, ".ooo%u", texture->out_of_order); - /* Output modifiers are always interpreted floatly */ - print_outmod(fp, texture->outmod, false); - fprintf(fp, " %sr%u", texture->out_full ? "" : "h", out_reg_base + texture->out_reg_select); print_mask_4(fp, texture->mask, texture->out_upper); assert(!(texture->out_full && texture->out_upper)); + + /* Output modifiers are only valid for float texture operations */ + if (texture->sampler_type == MALI_SAMPLER_FLOAT) + print_outmod(fp, texture->outmod, false); + fprintf(fp, ", "); /* Depending on whether we read from textures directly or indirectly, diff --git a/src/panfrost/midgard/midgard.h b/src/panfrost/midgard/midgard.h index eb514658c3e..cd07bb9cb6f 100644 --- a/src/panfrost/midgard/midgard.h +++ b/src/panfrost/midgard/midgard.h @@ -207,17 +207,19 @@ typedef enum { } midgard_alu_op; typedef enum { - midgard_outmod_none = 0, - midgard_outmod_pos = 1, /* max(x, 0.0) */ - midgard_outmod_sat_signed = 2, /* clamp(x, -1.0, 1.0) */ - midgard_outmod_sat = 3 /* clamp(x, 0.0, 1.0) */ + midgard_outmod_none = 0, + midgard_outmod_clamp_0_inf = 1, /* max(x, 0.0), NaNs become +0.0 */ + midgard_outmod_clamp_m1_1 = 2, /* clamp(x, -1.0, 1.0), NaNs become -1.0 */ + midgard_outmod_clamp_0_1 = 3 /* clamp(x, 0.0, 1.0), NaNs become +0.0 */ } midgard_outmod_float; +/* These are applied to the resulting value that's going to be stored in the dest reg. + * This should be set to midgard_outmod_keeplo when shrink_mode is midgard_shrink_mode_none. */ typedef enum { - midgard_outmod_int_saturate = 0, - midgard_outmod_uint_saturate = 1, - midgard_outmod_int_wrap = 2, - midgard_outmod_int_high = 3, /* Overflowed portion */ + midgard_outmod_ssat = 0, + midgard_outmod_usat = 1, + midgard_outmod_keeplo = 2, /* Keep low half */ + midgard_outmod_keephi = 3, /* Keep high half */ } midgard_outmod_int; typedef enum { diff --git a/src/panfrost/midgard/midgard_compile.c b/src/panfrost/midgard/midgard_compile.c index e1f0afaa8b2..ed365058ae7 100644 --- a/src/panfrost/midgard/midgard_compile.c +++ b/src/panfrost/midgard/midgard_compile.c @@ -566,31 +566,31 @@ mir_accept_dest_mod(compiler_context *ctx, nir_dest **dest, nir_op op) return false; } -/* Look for floating point mods. We have the mods fsat, fsat_signed, - * and fpos. We also have the relations (note 3 * 2 = 6 cases): +/* Look for floating point mods. We have the mods clamp_m1_1, clamp_0_1, + * and clamp_0_inf. We also have the relations (note 3 * 2 = 6 cases): * - * fsat_signed(fpos(x)) = fsat(x) - * fsat_signed(fsat(x)) = fsat(x) - * fpos(fsat_signed(x)) = fsat(x) - * fpos(fsat(x)) = fsat(x) - * fsat(fsat_signed(x)) = fsat(x) - * fsat(fpos(x)) = fsat(x) + * clamp_0_1(clamp_0_inf(x)) = clamp_m1_1(x) + * clamp_0_1(clamp_m1_1(x)) = clamp_m1_1(x) + * clamp_0_inf(clamp_0_1(x)) = clamp_m1_1(x) + * clamp_0_inf(clamp_m1_1(x)) = clamp_m1_1(x) + * clamp_m1_1(clamp_0_1(x)) = clamp_m1_1(x) + * clamp_m1_1(clamp_0_inf(x)) = clamp_m1_1(x) * * So by cases any composition of output modifiers is equivalent to - * fsat alone. + * clamp_m1_1 alone. */ static unsigned mir_determine_float_outmod(compiler_context *ctx, nir_dest **dest, unsigned prior_outmod) { - bool fpos = mir_accept_dest_mod(ctx, dest, nir_op_fclamp_pos); - bool fsat = mir_accept_dest_mod(ctx, dest, nir_op_fsat); - bool ssat = mir_accept_dest_mod(ctx, dest, nir_op_fsat_signed); + bool clamp_0_inf = mir_accept_dest_mod(ctx, dest, nir_op_fclamp_pos); + bool clamp_0_1 = mir_accept_dest_mod(ctx, dest, nir_op_fsat); + bool clamp_m1_1 = mir_accept_dest_mod(ctx, dest, nir_op_fsat_signed); bool prior = (prior_outmod != midgard_outmod_none); - int count = (int) prior + (int) fpos + (int) ssat + (int) fsat; + int count = (int) prior + (int) clamp_0_inf + (int) clamp_0_1 + (int) clamp_m1_1; - return ((count > 1) || fsat) ? midgard_outmod_sat : - fpos ? midgard_outmod_pos : - ssat ? midgard_outmod_sat_signed : + return ((count > 1) || clamp_0_1) ? midgard_outmod_clamp_0_1 : + clamp_0_inf ? midgard_outmod_clamp_0_inf : + clamp_m1_1 ? midgard_outmod_clamp_m1_1 : prior_outmod; } @@ -927,15 +927,15 @@ emit_alu(compiler_context *ctx, nir_alu_instr *instr) bool is_int = midgard_is_integer_op(op); if (instr->op == nir_op_umul_high || instr->op == nir_op_imul_high) { - outmod = midgard_outmod_int_high; + outmod = midgard_outmod_keephi; } else if (midgard_is_integer_out_op(op)) { - outmod = midgard_outmod_int_wrap; + outmod = midgard_outmod_keeplo; } else if (instr->op == nir_op_fsat) { - outmod = midgard_outmod_sat; + outmod = midgard_outmod_clamp_0_1; } else if (instr->op == nir_op_fsat_signed) { - outmod = midgard_outmod_sat_signed; + outmod = midgard_outmod_clamp_m1_1; } else if (instr->op == nir_op_fclamp_pos) { - outmod = midgard_outmod_pos; + outmod = midgard_outmod_clamp_0_inf; } /* Fetch unit, quirks, etc information */ @@ -2558,7 +2558,7 @@ max_bitsize_for_alu(midgard_instruction *ins) /* High implies computing at a higher bitsize, e.g umul_high of 32-bit * requires computing at 64-bit */ - if (midgard_is_integer_out_op(ins->op) && ins->outmod == midgard_outmod_int_high) { + if (midgard_is_integer_out_op(ins->op) && ins->outmod == midgard_outmod_keephi) { max_bitsize *= 2; assert(max_bitsize <= 64); } diff --git a/src/panfrost/midgard/midgard_schedule.c b/src/panfrost/midgard/midgard_schedule.c index 615bc45d76a..fb7c4283637 100644 --- a/src/panfrost/midgard/midgard_schedule.c +++ b/src/panfrost/midgard/midgard_schedule.c @@ -243,7 +243,7 @@ mir_is_scalar(midgard_instruction *ains) if (ains->src[1] != ~0) could_scalar &= (sz1 == 16) || (sz1 == 32); - if (midgard_is_integer_out_op(ains->op) && ains->outmod != midgard_outmod_int_wrap) + if (midgard_is_integer_out_op(ains->op) && ains->outmod != midgard_outmod_keeplo) return false; return could_scalar; diff --git a/src/panfrost/midgard/mir.c b/src/panfrost/midgard/mir.c index 942eeb475f4..1ad223a554f 100644 --- a/src/panfrost/midgard/mir.c +++ b/src/panfrost/midgard/mir.c @@ -148,7 +148,7 @@ mir_nontrivial_outmod(midgard_instruction *ins) return true; if (is_int) - return mod != midgard_outmod_int_wrap; + return mod != midgard_outmod_keeplo; else return mod != midgard_outmod_none; }