agx: add reg to agx_index

for validation

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31532>
This commit is contained in:
Alyssa Rosenzweig 2024-09-27 07:40:11 -04:00 committed by Marge Bot
parent f19e387c2b
commit 4b46314133
2 changed files with 42 additions and 15 deletions

View file

@ -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)

View file

@ -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)