diff --git a/src/asahi/compiler/agx_compile.c b/src/asahi/compiler/agx_compile.c index d69ca2df941..ea3b69779c4 100644 --- a/src/asahi/compiler/agx_compile.c +++ b/src/asahi/compiler/agx_compile.c @@ -249,6 +249,12 @@ agx_subdivide_to(agx_builder *b, agx_index dst, agx_index s0, unsigned comp) assert((s0.size == (dst.size + 1)) && "only 2x subdivide handled"); assert((comp == 0 || comp == 1) && "too many components"); + /* Handle immediates specially so we don't have to constant fold splits. */ + if (s0.type == AGX_INDEX_IMMEDIATE) { + unsigned bits = 16 * agx_size_align_16(dst.size); + return agx_mov_imm_to(b, dst, (s0.value >> bits) & BITFIELD64_MASK(bits)); + } + agx_instr *split = agx_split(b, 2, s0); split->dest[comp] = dst; split->dest[1 - comp] = agx_temp(b->shader, dst.size); diff --git a/src/asahi/compiler/agx_optimizer.c b/src/asahi/compiler/agx_optimizer.c index f017a53c58a..76f54515fca 100644 --- a/src/asahi/compiler/agx_optimizer.c +++ b/src/asahi/compiler/agx_optimizer.c @@ -163,6 +163,8 @@ agx_optimizer_inline_imm(agx_instr **defs, agx_instr *I, unsigned srcs, if ((I->op == AGX_OPCODE_LOCAL_LOAD || I->op == AGX_OPCODE_DEVICE_LOAD) && s != 1) continue; + if (I->op == AGX_OPCODE_SPLIT) + continue; if (I->op == AGX_OPCODE_IMAGE_WRITE && !image_write_source_can_be_immediate(I, s))