diff --git a/src/asahi/compiler/agx_compiler.h b/src/asahi/compiler/agx_compiler.h index da1ac2a7c34..dc384221ccc 100644 --- a/src/asahi/compiler/agx_compiler.h +++ b/src/asahi/compiler/agx_compiler.h @@ -808,6 +808,7 @@ agx_validate(UNUSED agx_context *ctx, UNUSED const char *after_str) unsigned agx_read_registers(agx_instr *I, unsigned s); unsigned agx_write_registers(agx_instr *I, unsigned d); +bool agx_allows_16bit_immediate(agx_instr *I); struct agx_copy { /* Base register destination of the copy */ diff --git a/src/asahi/compiler/agx_ir.c b/src/asahi/compiler/agx_ir.c new file mode 100644 index 00000000000..d499a7fc581 --- /dev/null +++ b/src/asahi/compiler/agx_ir.c @@ -0,0 +1,14 @@ +/* + * Copyright 2022 Alyssa Rosenzweig + * SPDX-License-Identifier: MIT + */ + +#include "agx_compiler.h" + +bool +agx_allows_16bit_immediate(agx_instr *I) +{ + return (I->op == AGX_OPCODE_DEVICE_LOAD) || + (I->op == AGX_OPCODE_DEVICE_STORE) || + (I->op == AGX_OPCODE_UNIFORM_STORE) || (I->op == AGX_OPCODE_ATOMIC); +} diff --git a/src/asahi/compiler/agx_validate.c b/src/asahi/compiler/agx_validate.c index d57fb97ce97..08e98555b84 100644 --- a/src/asahi/compiler/agx_validate.c +++ b/src/asahi/compiler/agx_validate.c @@ -103,9 +103,7 @@ agx_validate_sources(agx_instr *I) agx_validate_assert(!src.cache); agx_validate_assert(!src.discard); - bool ldst = (I->op == AGX_OPCODE_DEVICE_LOAD) || - (I->op == AGX_OPCODE_UNIFORM_STORE) || - (I->op == AGX_OPCODE_ATOMIC); + bool ldst = agx_allows_16bit_immediate(I); /* Immediates are encoded as 8-bit (16-bit for memory load/store). For * integers, they extend to 16-bit. For floating point, they are 8-bit diff --git a/src/asahi/compiler/meson.build b/src/asahi/compiler/meson.build index 0404ed3374b..42af74d2d05 100644 --- a/src/asahi/compiler/meson.build +++ b/src/asahi/compiler/meson.build @@ -37,6 +37,7 @@ libasahi_agx_files = files( 'agx_lower_uniform_sources.c', 'agx_pack.c', 'agx_print.c', + 'agx_ir.c', 'agx_opt_cse.c', 'agx_optimizer.c', 'agx_register_allocate.c',