aco/gfx10: Update constant addresses in fix_branches_gfx10.

Due to a bug in GFX10 hardware, s_nop instructions must be added
if a branch is at 0x3f. We already do this, but forgot to also update
the constant addresses that come after this instruction.

Signed-off-by: Timur Kristóf <timur.kristof@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
This commit is contained in:
Timur Kristóf 2019-10-16 15:05:56 +02:00 committed by Rhys Perry
parent f380398f8f
commit 7e5f87b533

View file

@ -624,7 +624,8 @@ static void fix_branches_gfx10(asm_context& ctx, std::vector<uint32_t>& out)
if (gfx10_3f_bug) {
/* Insert an s_nop after the branch */
constexpr uint32_t s_nop_0 = 0xbf800000u;
auto out_pos = std::next(out.begin(), buggy_branch_it->first + 1);
int s_nop_pos = buggy_branch_it->first + 1;
auto out_pos = std::next(out.begin(), s_nop_pos);
out.insert(out_pos, s_nop_0);
/* Update the offset of each affected block */
@ -636,6 +637,16 @@ static void fix_branches_gfx10(asm_context& ctx, std::vector<uint32_t>& out)
/* Update the branches following the current one */
for (auto branch_it = std::next(buggy_branch_it); branch_it != ctx.branches.end(); ++branch_it)
branch_it->first++;
/* Find first constant address after the inserted instruction */
auto caddr_it = std::find_if(ctx.constaddrs.begin(), ctx.constaddrs.end(), [s_nop_pos](const int &caddr_pos) -> bool {
return caddr_pos >= s_nop_pos;
});
/* Update the locations of constant addresses */
for (; caddr_it != ctx.constaddrs.end(); ++caddr_it)
(*caddr_it)++;
}
} while (gfx10_3f_bug);
}