agx: Refactor expressions in agx_nir_lower_address

So we can add more instructions without duplication.

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Acked-by: Christian Gmeiner <christian.gmeiner@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23529>
This commit is contained in:
Alyssa Rosenzweig 2023-05-27 21:51:00 -04:00 committed by Marge Bot
parent 5a55ef2fd1
commit 13535d3f9d

View file

@ -293,28 +293,31 @@ pass(struct nir_builder *b, nir_instr *instr, UNUSED void *data)
assert(match.shift >= 0);
nir_ssa_def *new_base = nir_channel(b, match.base.def, match.base.comp);
nir_ssa_def *repl = NULL;
bool has_dest = (intr->intrinsic != nir_intrinsic_store_global);
unsigned num_components = has_dest ? nir_dest_num_components(intr->dest) : 0;
unsigned bit_size = has_dest ? nir_dest_bit_size(intr->dest) : 0;
if (intr->intrinsic == nir_intrinsic_load_global) {
nir_ssa_def *repl =
nir_load_agx(b, nir_dest_num_components(intr->dest),
nir_dest_bit_size(intr->dest), new_base, offset,
repl =
nir_load_agx(b, num_components, bit_size, new_base, offset,
.access = nir_intrinsic_access(intr), .base = match.shift,
.format = format, .sign_extend = match.sign_extend);
nir_ssa_def_rewrite_uses(&intr->dest.ssa, repl);
} else if (intr->intrinsic == nir_intrinsic_load_global_constant) {
nir_ssa_def *repl = nir_load_constant_agx(
b, nir_dest_num_components(intr->dest), nir_dest_bit_size(intr->dest),
new_base, offset, .access = nir_intrinsic_access(intr),
.base = match.shift, .format = format,
.sign_extend = match.sign_extend);
nir_ssa_def_rewrite_uses(&intr->dest.ssa, repl);
repl = nir_load_constant_agx(b, num_components, bit_size, new_base,
offset, .access = nir_intrinsic_access(intr),
.base = match.shift, .format = format,
.sign_extend = match.sign_extend);
} else {
nir_store_agx(b, intr->src[0].ssa, new_base, offset,
.access = nir_intrinsic_access(intr), .base = match.shift,
.format = format, .sign_extend = match.sign_extend);
}
if (repl)
nir_ssa_def_rewrite_uses(&intr->dest.ssa, repl);
nir_instr_remove(instr);
return true;
}