xref: /freebsd/contrib/llvm-project/llvm/lib/Target/AMDGPU/DSDIRInstructions.td (revision 7ab1a32cd43cbae61ad4dd435d6a482bbf61cb52)
1//===-- DSDIRInstructions.td - LDS/VDS Direct 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// LDSDIR/VDSDIR encoding (LDSDIR is gfx11, VDSDIR is gfx12+)
11//===----------------------------------------------------------------------===//
12
13class LDSDIRe<bits<2> op, bit is_direct> : Enc32 {
14  // encoding fields
15  bits<2> attrchan;
16  bits<6> attr;
17  bits<4> waitvdst;
18  bits<8> vdst;
19
20  // encoding
21  let Inst{31-24} = 0xce; // encoding
22  let Inst{23-22} = 0x0; // reserved
23  let Inst{21-20} = op;
24  let Inst{19-16} = waitvdst;
25  let Inst{15-10} = !if(is_direct, ?, attr);
26  let Inst{9-8} = !if(is_direct, ?, attrchan);
27  let Inst{7-0} = vdst;
28}
29
30class VDSDIRe<bits<2> op, bit is_direct> : Enc32 {
31  // encoding fields
32  bits<2> attrchan;
33  bits<6> attr;
34  bits<4> waitvdst;
35  bits<8> vdst;
36  bits<1> waitvsrc;
37
38  // encoding
39  let Inst{31-24} = 0xce; // encoding
40  let Inst{23} = waitvsrc;
41  let Inst{22} = 0x0; // reserved
42  let Inst{21-20} = op;
43  let Inst{19-16} = waitvdst;
44  let Inst{15-10} = !if(is_direct, ?, attr);
45  let Inst{9-8} = !if(is_direct, ?, attrchan);
46  let Inst{7-0} = vdst;
47}
48
49//===----------------------------------------------------------------------===//
50// LDSDIR/VDSDIR Classes
51//===----------------------------------------------------------------------===//
52
53class LDSDIR_getIns<bit direct> {
54  dag ret = !if(direct,
55    (ins WaitVDST:$waitvdst),
56    (ins InterpAttr:$attr, InterpAttrChan:$attrchan, WaitVDST:$waitvdst)
57  );
58}
59
60class VDSDIR_getIns<bit direct> {
61  dag ret = !if(direct,
62    (ins WaitVAVDst:$waitvdst, WaitVMVSrc:$waitvsrc),
63    (ins InterpAttr:$attr, InterpAttrChan:$attrchan, WaitVAVDst:$waitvdst,
64         WaitVMVSrc:$waitvsrc)
65  );
66}
67
68class DSDIR_Common<string opName, string asm = "", dag ins, bit direct> :
69  InstSI<(outs VGPR_32:$vdst), ins, asm> {
70  let LDSDIR = 1;
71  let EXP_CNT = 1;
72
73  let hasSideEffects = 0;
74  let mayLoad = 1;
75  let mayStore = 0;
76  let maybeAtomic = 0;
77
78  string Mnemonic = opName;
79  let UseNamedOperandTable = 1;
80
81  let Uses = [M0, EXEC];
82  let DisableWQM = 0;
83  let SchedRW = [WriteLDS];
84
85  bit is_direct;
86  let is_direct = direct;
87}
88
89class DSDIR_Pseudo<string opName, dag ins, bit direct> :
90  DSDIR_Common<opName, "", ins, direct>,
91  SIMCInstr<opName, SIEncodingFamily.NONE> {
92  let isPseudo = 1;
93  let isCodeGenOnly = 1;
94}
95
96class LDSDIR_getAsm<bit direct> {
97  string ret = !if(direct,
98    " $vdst$waitvdst",
99    " $vdst, $attr$attrchan$waitvdst"
100  );
101}
102
103class VDSDIR_getAsm<bit direct> {
104  string ret = !if(direct,
105    " $vdst$waitvdst$waitvsrc",
106    " $vdst, $attr$attrchan$waitvdst$waitvsrc"
107  );
108}
109
110class DSDIR_Real<DSDIR_Pseudo lds, dag ins, string asm, int subtarget> :
111  DSDIR_Common<lds.Mnemonic,
112               lds.Mnemonic # asm,
113               ins,
114               lds.is_direct>,
115  SIMCInstr <lds.PseudoInstr, subtarget> {
116  let isPseudo = 0;
117  let isCodeGenOnly = 0;
118
119  // copy SubtargetPredicate from pseudo.
120  let SubtargetPredicate = lds.SubtargetPredicate;
121}
122
123//===----------------------------------------------------------------------===//
124// LDS/VDS Direct Instructions
125//===----------------------------------------------------------------------===//
126
127let SubtargetPredicate = isGFX11Only in {
128
129def LDS_DIRECT_LOAD : DSDIR_Pseudo<"lds_direct_load", LDSDIR_getIns<1>.ret, 1>;
130def LDS_PARAM_LOAD : DSDIR_Pseudo<"lds_param_load", LDSDIR_getIns<0>.ret, 0>;
131
132def : GCNPat <
133  (f32 (int_amdgcn_lds_direct_load M0)),
134  (LDS_DIRECT_LOAD 0)
135>;
136
137def : GCNPat <
138  (f32 (int_amdgcn_lds_param_load timm:$attrchan, timm:$attr, M0)),
139  (LDS_PARAM_LOAD timm:$attr, timm:$attrchan, 0)
140>;
141
142} // End SubtargetPredicate = isGFX11Only
143
144let SubtargetPredicate = isGFX12Plus in {
145
146def DS_DIRECT_LOAD : DSDIR_Pseudo<"ds_direct_load", VDSDIR_getIns<1>.ret, 1>;
147def DS_PARAM_LOAD : DSDIR_Pseudo<"ds_param_load", VDSDIR_getIns<0>.ret, 0>;
148
149def : GCNPat <
150  (f32 (int_amdgcn_lds_direct_load M0)),
151  (DS_DIRECT_LOAD 0, 1)
152>;
153
154def : GCNPat <
155  (f32 (int_amdgcn_lds_param_load timm:$attrchan, timm:$attr, M0)),
156  (DS_PARAM_LOAD timm:$attr, timm:$attrchan, 0, 1)
157>;
158
159} // End SubtargetPredicate = isGFX12Only
160
161//===----------------------------------------------------------------------===//
162// GFX11
163//===----------------------------------------------------------------------===//
164
165multiclass DSDIR_Real_gfx11<bits<2> op> {
166  defvar lds = !cast<DSDIR_Pseudo>(NAME);
167  def _gfx11 : DSDIR_Real<lds, lds.InOperandList,
168                          LDSDIR_getAsm<lds.is_direct>.ret,
169                          SIEncodingFamily.GFX11>,
170               LDSDIRe<op, lds.is_direct> {
171    let AssemblerPredicate = isGFX11Only;
172    let DecoderNamespace = "GFX11";
173  }
174}
175
176defm LDS_PARAM_LOAD : DSDIR_Real_gfx11<0x0>;
177defm LDS_DIRECT_LOAD : DSDIR_Real_gfx11<0x1>;
178
179//===----------------------------------------------------------------------===//
180// GFX12+
181//===----------------------------------------------------------------------===//
182
183multiclass DSDIR_Real_gfx12<bits<2> op> {
184  defvar lds = !cast<DSDIR_Pseudo>(NAME);
185  def _gfx12 : DSDIR_Real<lds, lds.InOperandList,
186                          VDSDIR_getAsm<lds.is_direct>.ret,
187                          SIEncodingFamily.GFX12>,
188               VDSDIRe<op, lds.is_direct> {
189    let AssemblerPredicate = isGFX12Plus;
190    let DecoderNamespace = "GFX12";
191  }
192}
193
194defm DS_PARAM_LOAD : DSDIR_Real_gfx12<0x0>;
195defm DS_DIRECT_LOAD : DSDIR_Real_gfx12<0x1>;
196