173471bf0Spatrick//===-- EXPInstructions.td - Export Instruction Definitions ---------------===//
273471bf0Spatrick//
373471bf0Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
473471bf0Spatrick// See https://llvm.org/LICENSE.txt for license information.
573471bf0Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
673471bf0Spatrick//
773471bf0Spatrick//===----------------------------------------------------------------------===//
873471bf0Spatrick
973471bf0Spatrick//===----------------------------------------------------------------------===//
1073471bf0Spatrick// EXP classes
1173471bf0Spatrick//===----------------------------------------------------------------------===//
1273471bf0Spatrick
13*d415bd75Srobertclass EXPCommon<bit row, bit done, string asm = ""> : InstSI<
1473471bf0Spatrick  (outs),
1573471bf0Spatrick  (ins exp_tgt:$tgt,
1673471bf0Spatrick       ExpSrc0:$src0, ExpSrc1:$src1, ExpSrc2:$src2, ExpSrc3:$src3,
1773471bf0Spatrick       exp_vm:$vm, exp_compr:$compr, i32imm:$en),
1873471bf0Spatrick  asm> {
1973471bf0Spatrick  let EXP = 1;
2073471bf0Spatrick  let EXP_CNT = 1;
2173471bf0Spatrick  let mayLoad = done;
2273471bf0Spatrick  let mayStore = 1;
2373471bf0Spatrick  let UseNamedOperandTable = 1;
24*d415bd75Srobert  let Uses = !if(row, [EXEC, M0], [EXEC]);
2573471bf0Spatrick  let SchedRW = [WriteExport];
2673471bf0Spatrick  let DisableWQM = 1;
2773471bf0Spatrick}
2873471bf0Spatrick
29*d415bd75Srobertclass EXP_Pseudo<bit row, bit done>
30*d415bd75Srobert  : EXPCommon<row, done>, SIMCInstr<NAME, SIEncodingFamily.NONE> {
3173471bf0Spatrick  let isPseudo = 1;
3273471bf0Spatrick  let isCodeGenOnly = 1;
3373471bf0Spatrick}
3473471bf0Spatrick
35*d415bd75Srobert// Real instruction with optional asm operands "compr" and "vm".
36*d415bd75Srobertclass EXP_Real_ComprVM<bit done, string pseudo, int subtarget>
37*d415bd75Srobert  : EXPCommon<0, done, "exp$tgt $src0, $src1, $src2, $src3"
38*d415bd75Srobert                       #!if(done, " done", "")#"$compr$vm">,
39*d415bd75Srobert    SIMCInstr<pseudo, subtarget> {
40*d415bd75Srobert  let AsmMatchConverter = "cvtExp";
41*d415bd75Srobert}
42*d415bd75Srobert
43*d415bd75Srobert// Real instruction with optional asm operand "row_en".
44*d415bd75Srobertclass EXP_Real_Row<bit row, bit done, string pseudo, int subtarget>
45*d415bd75Srobert  : EXPCommon<row, done, "exp$tgt $src0, $src1, $src2, $src3"
46*d415bd75Srobert                         #!if(done, " done", "")#!if(row, " row_en", "")>,
4773471bf0Spatrick    SIMCInstr<pseudo, subtarget> {
4873471bf0Spatrick  let AsmMatchConverter = "cvtExp";
4973471bf0Spatrick}
5073471bf0Spatrick
5173471bf0Spatrick//===----------------------------------------------------------------------===//
5273471bf0Spatrick// EXP Instructions
5373471bf0Spatrick//===----------------------------------------------------------------------===//
5473471bf0Spatrick
55*d415bd75Srobert// DONE variants have mayLoad = 1.
56*d415bd75Srobert// ROW variants have an implicit use of M0.
57*d415bd75Srobertlet SubtargetPredicate = isNotGFX90APlus in {
58*d415bd75Srobertdef EXP          : EXP_Pseudo<0, 0>;
59*d415bd75Srobertdef EXP_DONE     : EXP_Pseudo<0, 1>;
60*d415bd75Srobertdef EXP_ROW      : EXP_Pseudo<1, 0>;
61*d415bd75Srobertdef EXP_ROW_DONE : EXP_Pseudo<1, 1>;
62*d415bd75Srobert} // let SubtargetPredicate = isNotGFX90APlus
6373471bf0Spatrick
6473471bf0Spatrick//===----------------------------------------------------------------------===//
6573471bf0Spatrick// SI
6673471bf0Spatrick//===----------------------------------------------------------------------===//
6773471bf0Spatrick
6873471bf0Spatrickclass EXP_Real_si<bit _done, string pseudo>
69*d415bd75Srobert  : EXP_Real_ComprVM<_done, pseudo, SIEncodingFamily.SI>, EXPe_ComprVM {
7073471bf0Spatrick  let AssemblerPredicate = isGFX6GFX7;
7173471bf0Spatrick  let DecoderNamespace = "GFX6GFX7";
7273471bf0Spatrick  let done = _done;
7373471bf0Spatrick}
7473471bf0Spatrick
7573471bf0Spatrickdef EXP_si      : EXP_Real_si<0, "EXP">;
7673471bf0Spatrickdef EXP_DONE_si : EXP_Real_si<1, "EXP_DONE">;
7773471bf0Spatrick
7873471bf0Spatrick//===----------------------------------------------------------------------===//
7973471bf0Spatrick// VI
8073471bf0Spatrick//===----------------------------------------------------------------------===//
8173471bf0Spatrick
8273471bf0Spatrickclass EXP_Real_vi<bit _done, string pseudo>
83*d415bd75Srobert  : EXP_Real_ComprVM<_done, pseudo, SIEncodingFamily.VI>, EXPe_vi {
8473471bf0Spatrick  let AssemblerPredicate = isGFX8GFX9;
85*d415bd75Srobert  let SubtargetPredicate = isNotGFX90APlus;
8673471bf0Spatrick  let DecoderNamespace = "GFX8";
8773471bf0Spatrick  let done = _done;
8873471bf0Spatrick}
8973471bf0Spatrick
9073471bf0Spatrickdef EXP_vi      : EXP_Real_vi<0, "EXP">;
9173471bf0Spatrickdef EXP_DONE_vi : EXP_Real_vi<1, "EXP_DONE">;
9273471bf0Spatrick
9373471bf0Spatrick//===----------------------------------------------------------------------===//
94*d415bd75Srobert// GFX10
9573471bf0Spatrick//===----------------------------------------------------------------------===//
9673471bf0Spatrick
9773471bf0Spatrickclass EXP_Real_gfx10<bit _done, string pseudo>
98*d415bd75Srobert  : EXP_Real_ComprVM<_done, pseudo, SIEncodingFamily.GFX10>, EXPe_ComprVM {
99*d415bd75Srobert  let AssemblerPredicate = isGFX10Only;
10073471bf0Spatrick  let DecoderNamespace = "GFX10";
10173471bf0Spatrick  let done = _done;
10273471bf0Spatrick}
10373471bf0Spatrick
10473471bf0Spatrickdef EXP_gfx10      : EXP_Real_gfx10<0, "EXP">;
10573471bf0Spatrickdef EXP_DONE_gfx10 : EXP_Real_gfx10<1, "EXP_DONE">;
10673471bf0Spatrick
10773471bf0Spatrick//===----------------------------------------------------------------------===//
108*d415bd75Srobert// GFX11+
109*d415bd75Srobert//===----------------------------------------------------------------------===//
110*d415bd75Srobert
111*d415bd75Srobertclass EXP_Real_gfx11<bit _row, bit _done, string pseudo>
112*d415bd75Srobert  : EXP_Real_Row<_row, _done, pseudo, SIEncodingFamily.GFX11>, EXPe_Row {
113*d415bd75Srobert  let AssemblerPredicate = isGFX11Plus;
114*d415bd75Srobert  let DecoderNamespace = "GFX11";
115*d415bd75Srobert  let row = _row;
116*d415bd75Srobert  let done = _done;
117*d415bd75Srobert}
118*d415bd75Srobert
119*d415bd75Srobertdef EXP_gfx11          : EXP_Real_gfx11<0, 0, "EXP">;
120*d415bd75Srobertdef EXP_DONE_gfx11     : EXP_Real_gfx11<0, 1, "EXP_DONE">;
121*d415bd75Srobertdef EXP_ROW_gfx11      : EXP_Real_gfx11<1, 0, "EXP_ROW">;
122*d415bd75Srobertdef EXP_ROW_DONE_gfx11 : EXP_Real_gfx11<1, 1, "EXP_ROW_DONE">;
123*d415bd75Srobert
124*d415bd75Srobert//===----------------------------------------------------------------------===//
12573471bf0Spatrick// EXP Patterns
12673471bf0Spatrick//===----------------------------------------------------------------------===//
12773471bf0Spatrick
12873471bf0Spatrickclass ExpPattern<ValueType vt, Instruction Inst, int done_val> : GCNPat<
12973471bf0Spatrick  (int_amdgcn_exp timm:$tgt, timm:$en,
13073471bf0Spatrick                  (vt ExpSrc0:$src0), (vt ExpSrc1:$src1),
13173471bf0Spatrick                  (vt ExpSrc2:$src2), (vt ExpSrc3:$src3),
13273471bf0Spatrick                  done_val, timm:$vm),
13373471bf0Spatrick  (Inst timm:$tgt, ExpSrc0:$src0, ExpSrc1:$src1,
13473471bf0Spatrick        ExpSrc2:$src2, ExpSrc3:$src3, timm:$vm, 0, timm:$en)
13573471bf0Spatrick>;
13673471bf0Spatrick
137*d415bd75Srobertclass ExpRowPattern<ValueType vt, Instruction Inst, int done_val> : GCNPat<
138*d415bd75Srobert  (int_amdgcn_exp_row timm:$tgt, timm:$en,
139*d415bd75Srobert                      (vt ExpSrc0:$src0), (vt ExpSrc1:$src1),
140*d415bd75Srobert                      (vt ExpSrc2:$src2), (vt ExpSrc3:$src3),
141*d415bd75Srobert                      done_val, M0),
142*d415bd75Srobert  (Inst timm:$tgt, ExpSrc0:$src0, ExpSrc1:$src1,
143*d415bd75Srobert        ExpSrc2:$src2, ExpSrc3:$src3, 0, 0, timm:$en)
144*d415bd75Srobert>;
145*d415bd75Srobert
14673471bf0Spatrickclass ExpComprPattern<ValueType vt, Instruction Inst, int done_val> : GCNPat<
14773471bf0Spatrick  (int_amdgcn_exp_compr timm:$tgt, timm:$en,
14873471bf0Spatrick                        (vt ExpSrc0:$src0), (vt ExpSrc1:$src1),
14973471bf0Spatrick                        done_val, timm:$vm),
15073471bf0Spatrick  (Inst timm:$tgt, ExpSrc0:$src0, ExpSrc1:$src1,
15173471bf0Spatrick        (IMPLICIT_DEF), (IMPLICIT_DEF), timm:$vm, 1, timm:$en)
15273471bf0Spatrick>;
15373471bf0Spatrick
15473471bf0Spatrick// FIXME: The generated DAG matcher seems to have strange behavior
15573471bf0Spatrick// with a 1-bit literal to match, so use a -1 for checking a true
15673471bf0Spatrick// 1-bit value.
15773471bf0Spatrickdef : ExpPattern<i32, EXP, 0>;
15873471bf0Spatrickdef : ExpPattern<i32, EXP_DONE, -1>;
15973471bf0Spatrickdef : ExpPattern<f32, EXP, 0>;
16073471bf0Spatrickdef : ExpPattern<f32, EXP_DONE, -1>;
16173471bf0Spatrick
162*d415bd75Srobertdef : ExpRowPattern<i32, EXP_ROW, 0>;
163*d415bd75Srobertdef : ExpRowPattern<i32, EXP_ROW_DONE, -1>;
164*d415bd75Srobertdef : ExpRowPattern<f32, EXP_ROW, 0>;
165*d415bd75Srobertdef : ExpRowPattern<f32, EXP_ROW_DONE, -1>;
166*d415bd75Srobert
16773471bf0Spatrickdef : ExpComprPattern<v2i16, EXP, 0>;
16873471bf0Spatrickdef : ExpComprPattern<v2i16, EXP_DONE, -1>;
16973471bf0Spatrickdef : ExpComprPattern<v2f16, EXP, 0>;
17073471bf0Spatrickdef : ExpComprPattern<v2f16, EXP_DONE, -1>;
171