diff options
author | Rob Clark <[email protected]> | 2020-03-21 11:25:36 -0700 |
---|---|---|
committer | Marge Bot <[email protected]> | 2020-03-27 22:41:36 +0000 |
commit | 0e7d24b532e1a52cb5b3da36d1ed5b2204fb0acb (patch) | |
tree | e8a5535b2b41747e94642f87908f7431f0692265 /src/freedreno | |
parent | d99d358389ca95ce23cfccf67150cccc66ff6407 (diff) |
freedreno/ir3/ra: add helper to map name to array
For vreg names that refer to arrays rather than SSA values, this is the
counterpart to name_to_instr().
Signed-off-by: Rob Clark <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4272>
Diffstat (limited to 'src/freedreno')
-rw-r--r-- | src/freedreno/ir3/ir3_ra.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/src/freedreno/ir3/ir3_ra.c b/src/freedreno/ir3/ir3_ra.c index df5f115c0b3..ccba90be552 100644 --- a/src/freedreno/ir3/ir3_ra.c +++ b/src/freedreno/ir3/ir3_ra.c @@ -105,6 +105,9 @@ static struct ir3_instruction * name_to_instr(struct ir3_ra_ctx *ctx, unsigned name); +static bool name_is_array(struct ir3_ra_ctx *ctx, unsigned name); +static struct ir3_array * name_to_array(struct ir3_ra_ctx *ctx, unsigned name); + /* does it conflict? */ static inline bool intersects(unsigned a_start, unsigned a_end, unsigned b_start, unsigned b_end) @@ -500,10 +503,30 @@ ra_init(struct ir3_ra_ctx *ctx) static struct ir3_instruction * name_to_instr(struct ir3_ra_ctx *ctx, unsigned name) { + assert(!name_is_array(ctx, name)); struct hash_entry *entry = _mesa_hash_table_search(ctx->name_to_instr, &name); if (entry) return entry->data; - unreachable("invalid name"); + unreachable("invalid instr name"); + return NULL; +} + +static bool +name_is_array(struct ir3_ra_ctx *ctx, unsigned name) +{ + return name >= ctx->class_base[total_class_count]; +} + +static struct ir3_array * +name_to_array(struct ir3_ra_ctx *ctx, unsigned name) +{ + assert(name_is_array(ctx, name)); + foreach_array (arr, &ctx->ir->array_list) { + unsigned sz = reg_size_for_array(arr); + if (name < (arr->base + sz)) + return arr; + } + unreachable("invalid array name"); return NULL; } |