diff --git a/src/amd/compiler/aco_ir.cpp b/src/amd/compiler/aco_ir.cpp index 42b334acbb9..4cd79a8d746 100644 --- a/src/amd/compiler/aco_ir.cpp +++ b/src/amd/compiler/aco_ir.cpp @@ -828,6 +828,12 @@ get_operand_size(aco_ptr& instr, unsigned index) instr->opcode == aco_opcode::v_fma_mixlo_f16 || instr->opcode == aco_opcode::v_fma_mixhi_f16) return instr->valu().opsel_hi[index] ? 16 : 32; + else if (instr->opcode == aco_opcode::v_interp_p10_f16_f32_inreg || + instr->opcode == aco_opcode::v_interp_p10_rtz_f16_f32_inreg) + return index == 1 ? 32 : 16; + else if (instr->opcode == aco_opcode::v_interp_p2_f16_f32_inreg || + instr->opcode == aco_opcode::v_interp_p2_rtz_f16_f32_inreg) + return index == 0 ? 16 : 32; else if (instr->isVALU() || instr->isSALU()) return instr_info.operand_size[(int)instr->opcode]; else diff --git a/src/amd/compiler/aco_opcodes.py b/src/amd/compiler/aco_opcodes.py index 7a9cf4ddfbb..c01b28c7773 100644 --- a/src/amd/compiler/aco_opcodes.py +++ b/src/amd/compiler/aco_opcodes.py @@ -261,7 +261,9 @@ class Instruction(object): self.operand_size = 0 elif 'sad_' in name: self.operand_size = 32 - elif name in ['v_mad_u64_u32', 'v_mad_i64_i32']: + elif name in ['v_mad_u64_u32', 'v_mad_i64_i32', + 'v_interp_p10_f16_f32_inreg', 'v_interp_p10_rtz_f16_f32_inreg', + 'v_interp_p2_f16_f32_inreg', 'v_interp_p2_rtz_f16_f32_inreg']: self.operand_size = 0 elif self.operand_size == 24: self.operand_size = 32 @@ -1244,7 +1246,7 @@ VINTERP = { ("v_interp_p2_rtz_f16_f32_inreg", op(gfx11=0x05)), } for (name, num) in VINTERP: - insn(name, num, Format.VINTERP_INREG, InstrClass.Valu32, False, True, definitions = dst(1), operands = src(1, 1, 1)) + insn(name, num, Format.VINTERP_INREG, InstrClass.Valu32, True, True, definitions = dst(1), operands = src(1, 1, 1)) # VOP3 instructions: 3 inputs, 1 output diff --git a/src/amd/compiler/aco_optimizer.cpp b/src/amd/compiler/aco_optimizer.cpp index 0b8d0077212..35366fd5d4a 100644 --- a/src/amd/compiler/aco_optimizer.cpp +++ b/src/amd/compiler/aco_optimizer.cpp @@ -469,7 +469,7 @@ can_use_VOP3(opt_ctx& ctx, const aco_ptr& instr) if (instr->isVOP3()) return true; - if (instr->isVOP3P()) + if (instr->isVOP3P() || instr->isVINTERP_INREG()) return false; if (instr->operands.size() && instr->operands[0].isLiteral() && ctx.program->gfx_level < GFX10) @@ -1361,6 +1361,8 @@ label_instruction(opt_ctx& ctx, aco_ptr& instr) can_use_mod &= instr->sdwa().sel[i].size() == 4; else if (instr->isVOP3P()) can_use_mod &= !packed_math || !info.is_abs(); + else if (instr->isVINTERP_INREG()) + can_use_mod &= !info.is_abs(); else can_use_mod &= instr->isDPP16() || can_use_VOP3(ctx, instr);