diff --git a/src/amd/compiler/aco_assembler.cpp b/src/amd/compiler/aco_assembler.cpp index e12fbe26028..c4f95ec97d8 100644 --- a/src/amd/compiler/aco_assembler.cpp +++ b/src/amd/compiler/aco_assembler.cpp @@ -385,6 +385,7 @@ emit_vintrp_instruction(asm_context& ctx, std::vector& out, Instructio encoding = 0; encoding |= interp.attribute; encoding |= interp.component << 6; + encoding |= interp.high_16bits << 8; encoding |= reg(ctx, instr->operands[0]) << 9; if (instr->opcode == aco_opcode::v_interp_p2_f16 || instr->opcode == aco_opcode::v_interp_p2_legacy_f16 || diff --git a/src/amd/compiler/aco_ir.h b/src/amd/compiler/aco_ir.h index 8b6b4458bd0..10f7c0e42e4 100644 --- a/src/amd/compiler/aco_ir.h +++ b/src/amd/compiler/aco_ir.h @@ -1403,7 +1403,8 @@ static_assert(sizeof(SDWA_instruction) == sizeof(VALU_instruction) + 4, "Unexpec struct VINTRP_instruction : public Instruction { uint8_t attribute; uint8_t component; - uint16_t padding; + bool high_16bits; + uint8_t padding; }; static_assert(sizeof(VINTRP_instruction) == sizeof(Instruction) + 4, "Unexpected padding"); diff --git a/src/amd/compiler/aco_opt_value_numbering.cpp b/src/amd/compiler/aco_opt_value_numbering.cpp index 281e1119a8a..4e3e3548429 100644 --- a/src/amd/compiler/aco_opt_value_numbering.cpp +++ b/src/amd/compiler/aco_opt_value_numbering.cpp @@ -170,11 +170,8 @@ struct InstrPred { case Format::VINTRP: { VINTRP_instruction& aI = a->vintrp(); VINTRP_instruction& bI = b->vintrp(); - if (aI.attribute != bI.attribute) - return false; - if (aI.component != bI.component) - return false; - return true; + return aI.attribute == bI.attribute && aI.component == bI.component && + aI.high_16bits == bI.high_16bits; } case Format::VINTERP_INREG: { VINTERP_inreg_instruction& aI = a->vinterp_inreg(); diff --git a/src/amd/compiler/aco_print_ir.cpp b/src/amd/compiler/aco_print_ir.cpp index ca3ac60d4a7..66bb079b2cf 100644 --- a/src/amd/compiler/aco_print_ir.cpp +++ b/src/amd/compiler/aco_print_ir.cpp @@ -427,6 +427,8 @@ print_instr_format_specific(enum amd_gfx_level gfx_level, const Instruction* ins case Format::VINTRP: { const VINTRP_instruction& vintrp = instr->vintrp(); fprintf(output, " attr%d.%c", vintrp.attribute, "xyzw"[vintrp.component]); + if (vintrp.high_16bits) + fprintf(output, " high"); break; } case Format::DS: {