From cc1d942727c9c8874f8fa79a04cf0eb53e38d9d0 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Sun, 19 Oct 2025 21:27:20 -0700 Subject: [PATCH] panvk: use cs_move_reg32 and lower to cs_add32 if needed Trivial but still better than cs_add32 workaround on platforms supporting MOVE_REG32. Reviewed-by: Boris Brezillon Reviewed-by: Christoph Pillmayer Part-of: --- src/panfrost/genxml/cs_builder.h | 22 ++++++++++++--------- src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c | 4 ++-- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/panfrost/genxml/cs_builder.h b/src/panfrost/genxml/cs_builder.h index 3ffdd0bb10f..a324307b985 100644 --- a/src/panfrost/genxml/cs_builder.h +++ b/src/panfrost/genxml/cs_builder.h @@ -1686,6 +1686,19 @@ cs_umin32(struct cs_builder *b, struct cs_index dest, struct cs_index src1, } } +static inline void +cs_move_reg32(struct cs_builder *b, struct cs_index dest, struct cs_index src) +{ +#if PAN_ARCH >= 11 + cs_emit(b, MOVE_REG32, I) { + I.destination = cs_dst32(b, dest); + I.source = cs_src32(b, src); + } +#else + cs_add32(b, dest, src, 0); +#endif +} + #if PAN_ARCH >= 11 static inline void cs_and32(struct cs_builder *b, struct cs_index dest, struct cs_index src1, @@ -1751,15 +1764,6 @@ cs_bit_clear32(struct cs_builder *b, struct cs_index dest, struct cs_index src1, } } -static inline void -cs_move_reg32(struct cs_builder *b, struct cs_index dest, struct cs_index src) -{ - cs_emit(b, MOVE_REG32, I) { - I.destination = cs_dst32(b, dest); - I.source = cs_src32(b, src); - } -} - static inline void cs_set_state(struct cs_builder *b, enum mali_cs_set_state_type state, struct cs_index src) diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index 76d1b48708d..387dd940eeb 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -2630,8 +2630,8 @@ panvk_cmd_draw_indirect(struct panvk_cmd_buffer *cmdbuf, /* Emulated immediate multiply: we walk the bits in * base_instance, and accumulate (stride << bit_pos) if the bit * is present. This is sub-optimal, but it's simple :-). */ - cs_add32(b, multiplicand, - cs_sr_reg32(b, IDVS, INSTANCE_OFFSET), 0); + cs_move_reg32(b, multiplicand, + cs_sr_reg32(b, IDVS, INSTANCE_OFFSET)); /* Flush the loads here so that we don't get automatic flushes * over and over again due to the divergent nature of the if/else