1//===-- VINTERPInstructions.td - VINTERP Instruction Definitions ----------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9//===----------------------------------------------------------------------===//
10// VINTERP encoding
11//===----------------------------------------------------------------------===//
12
13class VINTERPe_gfx11 <bits<7> op, VOPProfile P> : Enc64 {
14  bits<8> vdst;
15  bits<4> src0_modifiers;
16  bits<9> src0;
17  bits<3> src1_modifiers;
18  bits<9> src1;
19  bits<3> src2_modifiers;
20  bits<9> src2;
21  bits<1> clamp;
22  bits<3> waitexp;
23
24  let Inst{31-26} = 0x33; // VOP3P encoding
25  let Inst{25-24} = 0x1; // VINTERP sub-encoding
26  let Inst{23}    = 0; // reserved
27
28  let Inst{7-0}   = vdst;
29  let Inst{10-8}  = waitexp;
30  let Inst{11}    = !if(P.HasOpSel, src0_modifiers{2}, 0); // op_sel(0)
31  let Inst{12}    = !if(P.HasOpSel, src1_modifiers{2}, 0); // op_sel(1)
32  let Inst{13}    = !if(P.HasOpSel, src2_modifiers{2}, 0); // op_sel(2)
33  let Inst{14}    = !if(P.HasOpSel, src0_modifiers{3}, 0); // op_sel(3)
34  let Inst{15}    = clamp;
35  let Inst{22-16} = op;
36  let Inst{40-32} = src0;
37  let Inst{49-41} = src1;
38  let Inst{58-50} = src2;
39  let Inst{61}    = src0_modifiers{0}; // neg(0)
40  let Inst{62}    = src1_modifiers{0}; // neg(1)
41  let Inst{63}    = src2_modifiers{0}; // neg(2)
42}
43
44//===----------------------------------------------------------------------===//
45// VOP3 VINTERP
46//===----------------------------------------------------------------------===//
47
48class VINTERP_Pseudo <string OpName, VOPProfile P, list<dag> pattern = []> :
49  VOP3_Pseudo<OpName, P, pattern, 0, 0> {
50  let AsmMatchConverter = "cvtVINTERP";
51  let mayRaiseFPException = 0;
52
53  let VOP3_OPSEL = 1;
54  let VINTERP = 1;
55}
56
57class VINTERP_Real <VOP_Pseudo ps, int EncodingFamily> :
58  VOP3_Real <ps, EncodingFamily> {
59  let VINTERP = 1;
60}
61
62def VOP3_VINTERP_F32 : VOPProfile<[f32, f32, f32, f32]> {
63  let HasOpSel = 0;
64  let HasModifiers = 1;
65
66  let Outs64 = (outs VGPR_32:$vdst);
67  let Ins64 = (ins Src0Mod:$src0_modifiers, VRegSrc_32:$src0,
68                   Src1Mod:$src1_modifiers, VRegSrc_32:$src1,
69                   Src2Mod:$src2_modifiers, VRegSrc_32:$src2,
70                   clampmod:$clamp,
71                   wait_exp:$waitexp);
72
73  let Asm64 = " $vdst, $src0_modifiers, $src1_modifiers, $src2_modifiers$clamp$waitexp";
74}
75
76class VOP3_VINTERP_F16 <list<ValueType> ArgVT> : VOPProfile<ArgVT> {
77  let HasOpSel = 1;
78  let HasModifiers = 1;
79
80  let Outs64 = (outs VGPR_32:$vdst);
81  let Ins64 = (ins Src0Mod:$src0_modifiers, VRegSrc_32:$src0,
82                   Src1Mod:$src1_modifiers, VRegSrc_32:$src1,
83                   Src2Mod:$src2_modifiers, VRegSrc_32:$src2,
84                   clampmod:$clamp, op_sel0:$op_sel,
85                   wait_exp:$waitexp);
86
87  let Asm64 = " $vdst, $src0_modifiers, $src1_modifiers, $src2_modifiers$clamp$op_sel$waitexp";
88}
89
90//===----------------------------------------------------------------------===//
91// VINTERP Pseudo Instructions
92//===----------------------------------------------------------------------===//
93
94let SubtargetPredicate = isGFX11Plus in {
95
96let Uses = [M0, EXEC, MODE] in {
97def V_INTERP_P10_F32_inreg : VINTERP_Pseudo <"v_interp_p10_f32", VOP3_VINTERP_F32>;
98def V_INTERP_P2_F32_inreg : VINTERP_Pseudo <"v_interp_p2_f32", VOP3_VINTERP_F32>;
99def V_INTERP_P10_F16_F32_inreg :
100  VINTERP_Pseudo <"v_interp_p10_f16_f32", VOP3_VINTERP_F16<[f32, f32, f32, f32]>>;
101def V_INTERP_P2_F16_F32_inreg :
102  VINTERP_Pseudo <"v_interp_p2_f16_f32", VOP3_VINTERP_F16<[f16, f32, f32, f32]>>;
103} // Uses = [M0, EXEC, MODE]
104
105let Uses = [M0, EXEC] in {
106def V_INTERP_P10_RTZ_F16_F32_inreg :
107  VINTERP_Pseudo <"v_interp_p10_rtz_f16_f32", VOP3_VINTERP_F16<[f32, f32, f32, f32]>>;
108def V_INTERP_P2_RTZ_F16_F32_inreg :
109  VINTERP_Pseudo <"v_interp_p2_rtz_f16_f32", VOP3_VINTERP_F16<[f16, f32, f32, f32]>>;
110} // Uses = [M0, EXEC]
111
112} // SubtargetPredicate = isGFX11Plus
113
114def VINTERP_OPSEL {
115  int LOW = 0;
116  int HIGH = 0xa;
117}
118//===----------------------------------------------------------------------===//
119// VINTERP Real Instructions
120//===----------------------------------------------------------------------===//
121
122let AssemblerPredicate = isGFX11Plus, DecoderNamespace = "GFX11" in {
123  multiclass VINTERP_Real_gfx11 <bits<7> op> {
124    def _gfx11 :
125      VINTERP_Real<!cast<VOP3_Pseudo>(NAME), SIEncodingFamily.GFX11>,
126      VINTERPe_gfx11<op, !cast<VOP3_Pseudo>(NAME).Pfl>;
127  }
128}
129
130defm V_INTERP_P10_F32_inreg  : VINTERP_Real_gfx11<0x000>;
131defm V_INTERP_P2_F32_inreg  : VINTERP_Real_gfx11<0x001>;
132defm V_INTERP_P10_F16_F32_inreg  : VINTERP_Real_gfx11<0x002>;
133defm V_INTERP_P2_F16_F32_inreg  : VINTERP_Real_gfx11<0x003>;
134defm V_INTERP_P10_RTZ_F16_F32_inreg  : VINTERP_Real_gfx11<0x004>;
135defm V_INTERP_P2_RTZ_F16_F32_inreg  : VINTERP_Real_gfx11<0x005>;
136