From 4b463141337c5a6df47dfbf8ce38594f1393e563 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Fri, 27 Sep 2024 07:40:11 -0400 Subject: [PATCH] agx: add reg to agx_index for validation Signed-off-by: Alyssa Rosenzweig Part-of: --- src/asahi/compiler/agx_compiler.h | 15 +++++++++-- src/asahi/compiler/agx_print.c | 42 +++++++++++++++++++++---------- 2 files changed, 42 insertions(+), 15 deletions(-) diff --git a/src/asahi/compiler/agx_compiler.h b/src/asahi/compiler/agx_compiler.h index 2de2575d983..66635af2a7b 100644 --- a/src/asahi/compiler/agx_compiler.h +++ b/src/asahi/compiler/agx_compiler.h @@ -26,7 +26,8 @@ extern "C" { #define AGX_NUM_UNIFORMS (512) /* Semi-arbitrary limit for spill slot allocation */ -#define AGX_NUM_MODELED_REGS (2048) +#define AGX_NUM_MODELED_REGS_LOG2 (11) +#define AGX_NUM_MODELED_REGS (1 << AGX_NUM_MODELED_REGS_LOG2) /* Limit on number of sources for non-phi instructions */ #define AGX_MAX_NORMAL_SOURCES (16) @@ -82,8 +83,18 @@ typedef struct { unsigned channels_m1 : 3; enum agx_size size : 2; enum agx_index_type type : 3; - unsigned padding : 18; + + /* If has_reg is set (during register allocation), the register assigned to + * this SSA value This is used with NORMAL. Contrast REGISTER which uses + * value instead. + * + * TODO: Unify. + */ + unsigned reg : AGX_NUM_MODELED_REGS_LOG2; + bool has_reg : 1; + unsigned padding : 6; } agx_index; +static_assert(sizeof(agx_index) == 8, "packed"); static inline unsigned agx_channels(agx_index idx) diff --git a/src/asahi/compiler/agx_print.c b/src/asahi/compiler/agx_print.c index 4e46e5d087f..56db05fc221 100644 --- a/src/asahi/compiler/agx_print.c +++ b/src/asahi/compiler/agx_print.c @@ -27,6 +27,23 @@ agx_print_sized(char prefix, unsigned value, enum agx_size size, FILE *fp) unreachable("Invalid size"); } +static void +agx_print_reg(agx_index index, unsigned value, FILE *fp) +{ + agx_print_sized('r', value, index.size, fp); + + if (agx_channels(index) > 1) { + unsigned last = + value + agx_size_align_16(index.size) * (agx_channels(index) - 1); + + fprintf(fp, "..."); + + if (index.memory) + fprintf(fp, "m"); + agx_print_sized('r', last, index.size, fp); + } +} + void agx_print_index(agx_index index, bool is_float, FILE *fp) { @@ -70,30 +87,29 @@ agx_print_index(agx_index index, bool is_float, FILE *fp) break; case AGX_INDEX_REGISTER: - agx_print_sized('r', index.value, index.size, fp); - - if (agx_channels(index) > 1) { - unsigned last = index.value + agx_size_align_16(index.size) * - (agx_channels(index) - 1); - - fprintf(fp, "..."); - - if (index.memory) - fprintf(fp, "m"); - agx_print_sized('r', last, index.size, fp); - } + agx_print_reg(index, index.value, fp); break; default: unreachable("Invalid index type"); } - /* Print length suffixes if not implied */ if (index.type == AGX_INDEX_NORMAL) { + /* Print length suffixes if not implied */ if (index.size == AGX_SIZE_16) fprintf(fp, "h"); else if (index.size == AGX_SIZE_64) fprintf(fp, "d"); + + /* Print assigned register if we have one */ + if (index.has_reg) { + fprintf(fp, "("); + if (index.memory) + fprintf(fp, "m"); + + agx_print_reg(index, index.reg, fp); + fprintf(fp, ")"); + } } if (index.abs)