diff --git a/src/amd/compiler/aco_assembler.cpp b/src/amd/compiler/aco_assembler.cpp index ef80b1e9708..e7d91d3cbca 100644 --- a/src/amd/compiler/aco_assembler.cpp +++ b/src/amd/compiler/aco_assembler.cpp @@ -502,12 +502,11 @@ emit_ds_instruction(asm_context& ctx, std::vector& out, Instruction* i encoding = 0; if (!instr->definitions.empty()) encoding |= reg(ctx, instr->definitions[0], 8) << 24; - if (instr->operands.size() >= 3 && instr->operands[2].physReg() != m0) - encoding |= reg(ctx, instr->operands[2], 8) << 16; - if (instr->operands.size() >= 2 && instr->operands[1].physReg() != m0) - encoding |= reg(ctx, instr->operands[1], 8) << 8; - if (!instr->operands[0].isUndefined()) - encoding |= reg(ctx, instr->operands[0], 8); + for (unsigned i = 0; i < MIN2(instr->operands.size(), 3); i++) { + Operand& op = instr->operands[i]; + if (op.physReg() != m0 && !op.isUndefined()) + encoding |= reg(ctx, op, 8) << (8 * i); + } out.push_back(encoding); }