From f2b8ebdc11b764dba9b755d9efeceabd69707b45 Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Thu, 30 Apr 2026 17:56:59 +0200 Subject: [PATCH] r600/sfn: return LDS opcode properties as tuple Assisted-by: Copilot (auto mode) Part-of: --- .../drivers/r600/sfn/sfn_assembler.cpp | 66 ++++++++++++------- 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/src/gallium/drivers/r600/sfn/sfn_assembler.cpp b/src/gallium/drivers/r600/sfn/sfn_assembler.cpp index 18c9b88f3a1..a3623a46477 100644 --- a/src/gallium/drivers/r600/sfn/sfn_assembler.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_assembler.cpp @@ -20,6 +20,8 @@ #include "sfn_instr_mem.h" #include "sfn_instr_tex.h" +#include + namespace r600 { Assembler::Assembler(r600_shader *sh, const r600_shader_key& key): m_sh(sh), @@ -75,6 +77,8 @@ public: void emit_alu_op(const AluInstr& ai); void emit_lds_op(const AluInstr& lds); + auto get_lds_opcode_properties(const AluInstr& lds) const + -> std::tuple; void update_alu_state_after_emit(const AluInstr& ai, int dst_sel, int dst_chan); @@ -193,19 +197,49 @@ AssemblerVisitor::emit_lds_op(const AluInstr& lds) memset(&alu, 0, sizeof(alu)); alu.is_lds_idx_op = true; - alu.op = lds.lds_opcode(); + auto [opcode, lds_idx, has_lds_fetch] = get_lds_opcode_properties(lds); + alu.op = opcode; + alu.lds_idx = lds_idx; + copy_src(alu.src[0], lds.src(0)); + + if (lds.n_sources() > 1) + copy_src(alu.src[1], lds.src(1)); + else + alu.src[1].sel = V_SQ_ALU_SRC_0; + + if (lds.n_sources() > 2) + copy_src(alu.src[2], lds.src(2)); + else + alu.src[2].sel = V_SQ_ALU_SRC_0; + + alu.last = lds.has_alu_flag(alu_last_instr); + int r = r600_bytecode_add_alu(&m_bc, &alu); + if (has_lds_fetch) + m_bc.cf_last->nlds_read++; + + if (r) + m_result = false; +} + +auto +AssemblerVisitor::get_lds_opcode_properties(const AluInstr& lds) const + -> std::tuple +{ + unsigned int opcode = lds.lds_opcode(); + unsigned int lds_idx = 0; bool has_lds_fetch = false; - switch (alu.op) { + + switch (opcode) { case LDS_WRITE: - alu.op = LDS_OP2_LDS_WRITE; + opcode = LDS_OP2_LDS_WRITE; break; case LDS_WRITE_REL: - alu.op = LDS_OP3_LDS_WRITE_REL; - alu.lds_idx = 1; + opcode = LDS_OP3_LDS_WRITE_REL; + lds_idx = 1; break; case DS_OP_READ_RET: - alu.op = LDS_OP1_LDS_READ_RET; + opcode = LDS_OP1_LDS_READ_RET; FALLTHROUGH; case LDS_ADD_RET: case LDS_AND_RET: @@ -233,25 +267,7 @@ AssemblerVisitor::emit_lds_op(const AluInstr& lds) UNREACHABLE("Unhandled LDS op"); } - copy_src(alu.src[0], lds.src(0)); - - if (lds.n_sources() > 1) - copy_src(alu.src[1], lds.src(1)); - else - alu.src[1].sel = V_SQ_ALU_SRC_0; - - if (lds.n_sources() > 2) - copy_src(alu.src[2], lds.src(2)); - else - alu.src[2].sel = V_SQ_ALU_SRC_0; - - alu.last = lds.has_alu_flag(alu_last_instr); - int r = r600_bytecode_add_alu(&m_bc, &alu); - if (has_lds_fetch) - m_bc.cf_last->nlds_read++; - - if (r) - m_result = false; + return std::make_tuple(opcode, lds_idx, has_lds_fetch); } auto AssemblerVisitor::translate_for_mathrules(EAluOp op) -> EAluOp