diff --git a/src/gallium/drivers/r600/sfn/sfn_assembler.cpp b/src/gallium/drivers/r600/sfn/sfn_assembler.cpp index 0f7654c0d1f..6ce84b1881b 100644 --- a/src/gallium/drivers/r600/sfn/sfn_assembler.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_assembler.cpp @@ -296,6 +296,17 @@ AssemblerVisitor::emit_alu_op(const AluInstr& ai) m_last_addr = nullptr; } + if (ai.has_alu_flag(alu_write) && + dst && + dst->sel() > g_clause_local_end && + dst->sel() != g_registers_unused) { + R600_ASM_ERR("shader_from_nir: Don't support more then 123 GPRs + 4 clause " + "local, but try using %d\n", + dst->sel()); + m_result = false; + return; + } + if (m_legacy_math_rules) opcode = translate_for_mathrules(opcode); @@ -324,10 +335,7 @@ AssemblerVisitor::emit_alu_op(const AluInstr& ai) if (ai.bank_swizzle() != alu_vec_unknown) alu.bank_swizzle_force = ai.bank_swizzle(); - if (!fill_alu_dst(alu, ai, m_bc)) { - m_result = false; - return; - } + fill_alu_dst(alu, ai, m_bc); fill_alu_src_operands(alu, ai, m_bc); diff --git a/src/gallium/drivers/r600/sfn/sfn_fill_bytecode.cpp b/src/gallium/drivers/r600/sfn/sfn_fill_bytecode.cpp index 74e48b202a4..5aadaa3cd7d 100644 --- a/src/gallium/drivers/r600/sfn/sfn_fill_bytecode.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_fill_bytecode.cpp @@ -548,25 +548,17 @@ fill_alu_src_operands(r600_bytecode_alu& alu, const AluInstr& ai, r600_bytecode& } } -bool +void fill_alu_dst(r600_bytecode_alu& alu, const AluInstr& ai, r600_bytecode& bc) { auto dst = ai.dest(); if (dst) { sfn_log << SfnLog::assembly << " Current dst register is " << *dst << "\n"; if (ai.opcode() != op1_mova_int) { - bool write = ai.has_alu_flag(alu_write); - if (write && dst->sel() > g_clause_local_end && - dst->sel() != g_registers_unused) { - R600_ASM_ERR("shader_from_nir: Don't support more then 123 GPRs + 4 clause " - "local, but try using %d\n", - dst->sel()); - return false; - } alu.dst.sel = dst->sel() != g_registers_unused ? dst->sel() : g_registers_end; alu.dst.chan = dst->chan(); - alu.dst.write = write; + alu.dst.write = ai.has_alu_flag(alu_write); alu.dst.rel = dst->addr() ? 1 : 0; } else if (bc.gfx_level == CAYMAN && dst->sel() > 0) { alu.dst.sel = dst->sel() + 1; @@ -576,7 +568,6 @@ fill_alu_dst(r600_bytecode_alu& alu, const AluInstr& ai, r600_bytecode& bc) } alu.dst.clamp = ai.has_alu_flag(alu_dst_clamp); - return true; } } // namespace r600 \ No newline at end of file diff --git a/src/gallium/drivers/r600/sfn/sfn_fill_bytecode.h b/src/gallium/drivers/r600/sfn/sfn_fill_bytecode.h index c0d08d34f98..cb2e429549d 100644 --- a/src/gallium/drivers/r600/sfn/sfn_fill_bytecode.h +++ b/src/gallium/drivers/r600/sfn/sfn_fill_bytecode.h @@ -55,7 +55,7 @@ void fill_alu_src_operands(r600_bytecode_alu& alu, const AluInstr& ai, r600_bytecode& bc); -bool fill_alu_dst(r600_bytecode_alu& alu, +void fill_alu_dst(r600_bytecode_alu& alu, const AluInstr& ai, r600_bytecode& bc);