mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 00:49:04 +02:00
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:
parent
f19e387c2b
commit
4b46314133
2 changed files with 42 additions and 15 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue