diff --git a/.pick_status.json b/.pick_status.json index 023513a1899..2bafbdf97ba 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -60,7 +60,7 @@ "description": "aco: fix p_constaddr with a non-zero offset", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "because_sha": "0af7ff49fdecd05531b4c4f5fb841e11f9f451c1" }, { diff --git a/src/amd/compiler/aco_assembler.cpp b/src/amd/compiler/aco_assembler.cpp index 3095f0bda89..14aa390545a 100644 --- a/src/amd/compiler/aco_assembler.cpp +++ b/src/amd/compiler/aco_assembler.cpp @@ -82,10 +82,12 @@ emit_instruction(asm_context& ctx, std::vector& out, Instruction* inst instr->opcode = aco_opcode::s_getpc_b64; instr->operands.pop_back(); } else if (instr->opcode == aco_opcode::p_constaddr_addlo) { - ctx.constaddrs[instr->operands[1].constantValue()].add_literal = out.size() + 1; + ctx.constaddrs[instr->operands[2].constantValue()].add_literal = out.size() + 1; instr->opcode = aco_opcode::s_add_u32; - instr->operands[1] = Operand::zero(); + instr->operands.pop_back(); + assert(instr->operands[1].isConstant()); + /* in case it's an inline constant, make it a literal */ instr->operands[1].setFixed(PhysReg(255)); } diff --git a/src/amd/compiler/aco_lower_to_hw_instr.cpp b/src/amd/compiler/aco_lower_to_hw_instr.cpp index df94f21db85..6ab8dbadac2 100644 --- a/src/amd/compiler/aco_lower_to_hw_instr.cpp +++ b/src/amd/compiler/aco_lower_to_hw_instr.cpp @@ -2100,7 +2100,7 @@ lower_to_hw_instr(Program* program) PhysReg reg = instr->definitions[0].physReg(); bld.sop1(aco_opcode::p_constaddr_getpc, instr->definitions[0], Operand::c32(id)); bld.sop2(aco_opcode::p_constaddr_addlo, Definition(reg, s1), bld.def(s1, scc), - Operand(reg, s1), Operand::c32(id)); + Operand(reg, s1), instr->operands[0], Operand::c32(id)); bld.sop2(aco_opcode::s_addc_u32, Definition(reg.advance(4), s1), bld.def(s1, scc), Operand(reg.advance(4), s1), Operand::zero(), Operand(scc, s1)); break; diff --git a/src/amd/compiler/tests/test_assembler.cpp b/src/amd/compiler/tests/test_assembler.cpp index e970eba2ee5..2f822f90a6c 100644 --- a/src/amd/compiler/tests/test_assembler.cpp +++ b/src/amd/compiler/tests/test_assembler.cpp @@ -222,7 +222,7 @@ BEGIN_TEST(assembler.long_jump.constaddr) //! s_add_u32 s0, s0, 0xe0 ; 8000ff00 000000e0 bld.sop1(aco_opcode::p_constaddr_getpc, Definition(PhysReg(0), s2), Operand::zero()); bld.sop2(aco_opcode::p_constaddr_addlo, Definition(PhysReg(0), s1), bld.def(s1, scc), - Operand(PhysReg(0), s1), Operand::zero()); + Operand(PhysReg(0), s1), Operand::zero(), Operand::zero()); program->blocks[2].linear_preds.push_back(0u); program->blocks[2].linear_preds.push_back(1u);