From a5cdc86da0588f22fbf2629ce846b885b60e1c5e Mon Sep 17 00:00:00 2001 From: Mary Guillemard Date: Sat, 4 Nov 2023 02:32:20 +0100 Subject: [PATCH] agx: Add stack adjust opcode Signed-off-by: Mary Guillemard Part-of: --- src/asahi/compiler/agx_compiler.h | 1 + src/asahi/compiler/agx_opcodes.py | 6 ++++++ src/asahi/compiler/agx_pack.c | 19 +++++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/src/asahi/compiler/agx_compiler.h b/src/asahi/compiler/agx_compiler.h index e74cb77094d..235517babb0 100644 --- a/src/asahi/compiler/agx_compiler.h +++ b/src/asahi/compiler/agx_compiler.h @@ -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; diff --git a/src/asahi/compiler/agx_opcodes.py b/src/asahi/compiler/agx_opcodes.py index f0a63ab14eb..49373bce064 100644 --- a/src/asahi/compiler/agx_opcodes.py +++ b/src/asahi/compiler/agx_opcodes.py @@ -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), diff --git a/src/asahi/compiler/agx_pack.c b/src/asahi/compiler/agx_pack.c index 0292e6087ff..ad136dcfb0c 100644 --- a/src/asahi/compiler/agx_pack.c +++ b/src/asahi/compiler/agx_pack.c @@ -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);