agx: Add stack adjust opcode

Signed-off-by: Mary Guillemard <mary@mary.zone>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26056>
This commit is contained in:
Mary Guillemard
2023-11-04 02:32:20 +01:00
committed by Marge Bot
parent 588fd6dfd6
commit a5cdc86da0
3 changed files with 26 additions and 0 deletions
+1
View File
@@ -290,6 +290,7 @@ typedef struct {
uint32_t bfi_mask;
uint16_t pixel_offset;
uint16_t zs;
int16_t stack_size;
enum agx_sr sr;
enum agx_round round;
enum agx_atomic_opc atomic_opc;
+6
View File
@@ -80,6 +80,7 @@ MASK = immediate("mask")
BFI_MASK = immediate("bfi_mask")
LOD_MODE = immediate("lod_mode", "enum agx_lod_mode")
PIXEL_OFFSET = immediate("pixel_offset")
STACK_SIZE = immediate("stack_size", 'int16_t')
DIM = enum("dim", {
0: '1d',
@@ -427,6 +428,11 @@ op("doorbell", (0x60020 | 0x28 << 32, (1 << 48) - 1, 6, _), dests = 0,
op("stack_unmap", (0x00075, (1 << 24) - 1, 8, _), dests = 1, srcs = 0, can_eliminate = False, can_reorder = False, imms = [IMM])
op("stack_map", (0x10075, (1 << 24) - 1, 8, _), dests = 0, srcs = 1, can_eliminate = False, can_reorder = False, imms = [IMM])
op("stack_adjust",
encoding_32 = (0x10100b5, (1 << 26) - 1, 8, _),
dests = 0, srcs = 0, can_eliminate = False, can_reorder = False,
imms = [STACK_SIZE], schedule_class = "store")
# source is offset
op("stack_load",
encoding_32 = (0x35, (1 << 20) - 1, 6, 8),
+19
View File
@@ -1039,6 +1039,25 @@ agx_pack_instr(struct util_dynarray *emission, struct util_dynarray *fixups,
memcpy(util_dynarray_grow_bytes(emission, 1, size), &raw, size);
break;
}
case AGX_OPCODE_STACK_ADJUST: {
struct agx_opcode_info info = agx_opcodes_info[I->op];
unsigned i0 = 0; // XXX
unsigned i1 = 1; // XXX
unsigned i2 = 2; // XXX
unsigned i3 = 0; // XXX
unsigned i4 = 0; // XXX
uint64_t raw =
info.encoding.exact | ((uint64_t)i0 << 8) | ((uint64_t)i1 << 26) |
((uint64_t)i2 << 36) | ((uint64_t)i3 << 44) | ((uint64_t)i4 << 50) |
((I->stack_size & 0xF) << 20) |
((uint64_t)((I->stack_size >> 4) & 0xF) << 32) | (1UL << 47) | // XXX
((uint64_t)(I->stack_size >> 8) << 56);
memcpy(util_dynarray_grow_bytes(emission, 1, 8), &raw, 8);
break;
}
default:
agx_pack_alu(emission, I);