diff --git a/.pick_status.json b/.pick_status.json index 2359b97516e..b02eb3b8203 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -4072,7 +4072,7 @@ "description": "aco: fix interaction with 3f branch workaround and p_constaddr", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": "93c8ebfa780ebd1495095e794731881aef29e7d3" }, diff --git a/src/amd/compiler/aco_assembler.cpp b/src/amd/compiler/aco_assembler.cpp index ed2e3982976..ae5bd0b3374 100644 --- a/src/amd/compiler/aco_assembler.cpp +++ b/src/amd/compiler/aco_assembler.cpp @@ -42,8 +42,6 @@ static uint32_t get_sdwa_sel(unsigned sel, PhysReg reg) void emit_instruction(asm_context& ctx, std::vector& out, Instruction* instr) { - uint32_t instr_offset = out.size() * 4u; - /* lower remaining pseudo-instructions */ if (instr->opcode == aco_opcode::p_constaddr) { unsigned dest = instr->definitions[0].physReg(); @@ -68,7 +66,7 @@ void emit_instruction(asm_context& ctx, std::vector& out, Instruction* encoding |= 255 << 8; out.push_back(encoding); ctx.constaddrs.push_back(out.size()); - out.push_back(-(instr_offset + 4) + offset); + out.push_back(offset); /* s_addc_u32 dest[1], dest[1], 0 */ encoding = (0b10 << 30); @@ -769,7 +767,7 @@ void fix_branches(asm_context& ctx, std::vector& out) void fix_constaddrs(asm_context& ctx, std::vector& out) { for (unsigned addr : ctx.constaddrs) - out[addr] += out.size() * 4u; + out[addr] += (out.size() - addr + 1u) * 4u; } unsigned emit_program(Program* program,