Skip to content

Commit 19f4cec

Browse files
authored
[AMDGPU] Add GFX12 encoding for VINTERP instructions (#74616)
1 parent 44ff904 commit 19f4cec

File tree

5 files changed

+392
-117
lines changed

5 files changed

+392
-117
lines changed

llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -782,9 +782,13 @@ DecodeStatus AMDGPUDisassembler::convertEXPInst(MCInst &MI) const {
782782

783783
DecodeStatus AMDGPUDisassembler::convertVINTERPInst(MCInst &MI) const {
784784
if (MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_gfx11 ||
785+
MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_gfx12 ||
785786
MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_gfx11 ||
787+
MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_gfx12 ||
786788
MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_gfx11 ||
787-
MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_gfx11) {
789+
MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_gfx12 ||
790+
MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_gfx11 ||
791+
MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_gfx12) {
788792
// The MCInst has this field that is not directly encoded in the
789793
// instruction.
790794
insertNamedMCOperand(MI, MCOperand::createImm(0), AMDGPU::OpName::op_sel);

llvm/lib/Target/AMDGPU/VINTERPInstructions.td

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
// VINTERP encoding
1111
//===----------------------------------------------------------------------===//
1212

13-
class VINTERPe_gfx11 <bits<7> op, VOPProfile P> : Enc64 {
13+
class VINTERPe <VOPProfile P> : Enc64 {
1414
bits<8> vdst;
1515
bits<4> src0_modifiers;
1616
bits<9> src0;
@@ -31,7 +31,6 @@ class VINTERPe_gfx11 <bits<7> op, VOPProfile P> : Enc64 {
3131
let Inst{13} = !if(P.HasOpSel, src2_modifiers{2}, 0); // op_sel(2)
3232
let Inst{14} = !if(P.HasOpSel, src0_modifiers{3}, 0); // op_sel(3)
3333
let Inst{15} = clamp;
34-
let Inst{22-16} = op;
3534
let Inst{40-32} = src0;
3635
let Inst{49-41} = src1;
3736
let Inst{58-50} = src2;
@@ -40,6 +39,14 @@ class VINTERPe_gfx11 <bits<7> op, VOPProfile P> : Enc64 {
4039
let Inst{63} = src2_modifiers{0}; // neg(2)
4140
}
4241

42+
class VINTERPe_gfx11 <bits<7> op, VOPProfile P> : VINTERPe<P> {
43+
let Inst{22-16} = op;
44+
}
45+
46+
class VINTERPe_gfx12 <bits<7> op, VOPProfile P> : VINTERPe<P> {
47+
let Inst{20-16} = op{4-0};
48+
}
49+
4350
//===----------------------------------------------------------------------===//
4451
// VOP3 VINTERP
4552
//===----------------------------------------------------------------------===//
@@ -171,17 +178,28 @@ defm : VInterpF16Pat<int_amdgcn_interp_inreg_p2_f16,
171178
// VINTERP Real Instructions
172179
//===----------------------------------------------------------------------===//
173180

174-
let AssemblerPredicate = isGFX11Plus, DecoderNamespace = "GFX11" in {
175-
multiclass VINTERP_Real_gfx11 <bits<7> op> {
181+
multiclass VINTERP_Real_gfx11 <bits<7> op> {
182+
let AssemblerPredicate = isGFX11Only, DecoderNamespace = "GFX11" in {
176183
def _gfx11 :
177184
VINTERP_Real<!cast<VOP3_Pseudo>(NAME), SIEncodingFamily.GFX11>,
178185
VINTERPe_gfx11<op, !cast<VOP3_Pseudo>(NAME).Pfl>;
179186
}
180187
}
181188

182-
defm V_INTERP_P10_F32_inreg : VINTERP_Real_gfx11<0x000>;
183-
defm V_INTERP_P2_F32_inreg : VINTERP_Real_gfx11<0x001>;
184-
defm V_INTERP_P10_F16_F32_inreg : VINTERP_Real_gfx11<0x002>;
185-
defm V_INTERP_P2_F16_F32_inreg : VINTERP_Real_gfx11<0x003>;
186-
defm V_INTERP_P10_RTZ_F16_F32_inreg : VINTERP_Real_gfx11<0x004>;
187-
defm V_INTERP_P2_RTZ_F16_F32_inreg : VINTERP_Real_gfx11<0x005>;
189+
multiclass VINTERP_Real_gfx12 <bits<7> op> {
190+
let AssemblerPredicate = isGFX12Only, DecoderNamespace = "GFX12" in {
191+
def _gfx12 :
192+
VINTERP_Real<!cast<VOP3_Pseudo>(NAME), SIEncodingFamily.GFX12>,
193+
VINTERPe_gfx12<op, !cast<VOP3_Pseudo>(NAME).Pfl>;
194+
}
195+
}
196+
197+
multiclass VINTERP_Real_gfx11_gfx12 <bits<7> op> :
198+
VINTERP_Real_gfx11<op>, VINTERP_Real_gfx12<op>;
199+
200+
defm V_INTERP_P10_F32_inreg : VINTERP_Real_gfx11_gfx12<0x000>;
201+
defm V_INTERP_P2_F32_inreg : VINTERP_Real_gfx11_gfx12<0x001>;
202+
defm V_INTERP_P10_F16_F32_inreg : VINTERP_Real_gfx11_gfx12<0x002>;
203+
defm V_INTERP_P2_F16_F32_inreg : VINTERP_Real_gfx11_gfx12<0x003>;
204+
defm V_INTERP_P10_RTZ_F16_F32_inreg : VINTERP_Real_gfx11_gfx12<0x004>;
205+
defm V_INTERP_P2_RTZ_F16_F32_inreg : VINTERP_Real_gfx11_gfx12<0x005>;

0 commit comments

Comments
 (0)