aco: fix disassembly of writelane instructions.
authorDaniel Schürmann <daniel@schuermann.dev>
Wed, 4 Dec 2019 09:43:14 +0000 (10:43 +0100)
committerDaniel Schürmann <daniel@schuermann.dev>
Sat, 7 Dec 2019 10:23:11 +0000 (11:23 +0100)
ACO writes an unused 3rd operand for internal usage
which makes LLVM recoginize it as illegal instruction.

Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
src/amd/compiler/aco_print_asm.cpp

index deb15a8b2563848e832dc1295a2815d8b7395e90..743824888d6b9c4faa55f9ddd3903fbc1877e0f4 100644 (file)
@@ -51,13 +51,19 @@ void print_asm(Program *program, std::vector<uint32_t>& 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) {