From d63c175897e31e2a78eb346362a7c90a2fec5f13 Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Tue, 8 Oct 2019 14:47:00 +0200 Subject: [PATCH] aco: pad code with s_code_end on GFX10 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Rhys Perry Reviewed-By: Timur Kristóf Reviewed-by: Daniel Schürmann --- src/amd/compiler/aco_assembler.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/amd/compiler/aco_assembler.cpp b/src/amd/compiler/aco_assembler.cpp index 5a82d44d74b..76361241e4b 100644 --- a/src/amd/compiler/aco_assembler.cpp +++ b/src/amd/compiler/aco_assembler.cpp @@ -4,6 +4,7 @@ #include "aco_ir.h" #include "common/sid.h" #include "ac_shader_util.h" +#include "util/u_math.h" namespace aco { @@ -668,16 +669,26 @@ unsigned emit_program(Program* program, } fix_branches(ctx, code); + + unsigned exec_size = code.size() * sizeof(uint32_t); + + if (program->chip_class >= GFX10) { + /* Pad output with s_code_end so instruction prefetching doesn't cause + * page faults */ + unsigned final_size = align(code.size() + 3 * 16, 16); + while (code.size() < final_size) + code.push_back(0xbf9f0000u); + } + fix_constaddrs(ctx, code); - unsigned constant_data_offset = code.size() * sizeof(uint32_t); while (program->constant_data.size() % 4u) program->constant_data.push_back(0); /* Copy constant data */ code.insert(code.end(), (uint32_t*)program->constant_data.data(), (uint32_t*)(program->constant_data.data() + program->constant_data.size())); - return constant_data_offset; + return exec_size; } } -- 2.30.2