From 23319add93bb22744ba48e9026dcc40ecd30628c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Sch=C3=BCrmann?= Date: Wed, 4 Dec 2019 10:43:14 +0100 Subject: [PATCH] aco: fix disassembly of writelane instructions. ACO writes an unused 3rd operand for internal usage which makes LLVM recoginize it as illegal instruction. Reviewed-by: Rhys Perry --- src/amd/compiler/aco_print_asm.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/amd/compiler/aco_print_asm.cpp b/src/amd/compiler/aco_print_asm.cpp index deb15a8b256..743824888d6 100644 --- a/src/amd/compiler/aco_print_asm.cpp +++ b/src/amd/compiler/aco_print_asm.cpp @@ -51,13 +51,19 @@ void print_asm(Program *program, std::vector& binary, next_block++; } + /* mask out src2 on v_writelane_b32 */ + if (((program->chip_class == GFX8 || program->chip_class == GFX9) && (binary[pos] & 0xffff8000) == 0xd28a0000) || + (program->chip_class == GFX10 && (binary[pos] & 0xffff8000) == 0xd7610000)) { + binary[pos+1] = binary[pos+1] & 0xF803FFFF; + } + size_t l = LLVMDisasmInstruction(disasm, (uint8_t *) &binary[pos], (exec_size - pos) * sizeof(uint32_t), pos * 4, outline, sizeof(outline)); size_t new_pos; const int align_width = 60; - if (program->chip_class == GFX9 && !l && ((binary[pos] & 0xffff8000) == 0xd1348000)) { /* not actually an invalid instruction */ + if (!l && program->chip_class == GFX9 && ((binary[pos] & 0xffff8000) == 0xd1348000)) { /* not actually an invalid instruction */ out << std::left << std::setw(align_width) << std::setfill(' ') << "\tv_add_u32_e64 + clamp"; new_pos = pos + 2; } else if (!l) { -- 2.30.2