1//===-- EXPInstructions.td - Export 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// EXP classes
11//===----------------------------------------------------------------------===//
12
13class EXPCommon<bit done, string asm = ""> : InstSI<
14  (outs),
15  (ins exp_tgt:$tgt,
16       ExpSrc0:$src0, ExpSrc1:$src1, ExpSrc2:$src2, ExpSrc3:$src3,
17       exp_vm:$vm, exp_compr:$compr, i32imm:$en),
18  asm> {
19  let EXP = 1;
20  let EXP_CNT = 1;
21  let mayLoad = done;
22  let mayStore = 1;
23  let UseNamedOperandTable = 1;
24  let Uses = [EXEC];
25  let SchedRW = [WriteExport];
26  let DisableWQM = 1;
27}
28
29class EXP_Pseudo<bit done> : EXPCommon<done>,
30                             SIMCInstr <NAME, SIEncodingFamily.NONE> {
31  let isPseudo = 1;
32  let isCodeGenOnly = 1;
33}
34
35class EXP_Real<bit done, string pseudo, int subtarget>
36  : EXPCommon<done, "exp$tgt $src0, $src1, $src2, $src3"#!if(done, " done", "")
37                    #"$compr$vm">,
38    SIMCInstr <pseudo, subtarget> {
39  let AsmMatchConverter = "cvtExp";
40}
41
42//===----------------------------------------------------------------------===//
43// EXP Instructions
44//===----------------------------------------------------------------------===//
45
46// Split EXP instruction into EXP and EXP_DONE so we can set
47// mayLoad for done=1.
48let SubtargetPredicate = isNotGFX90APlus in {
49def EXP : EXP_Pseudo<0>;
50def EXP_DONE : EXP_Pseudo<1>;
51} // let SubtargetPredicate = isNotGFX90APlus
52
53//===----------------------------------------------------------------------===//
54// SI
55//===----------------------------------------------------------------------===//
56
57class EXP_Real_si<bit _done, string pseudo>
58  : EXP_Real<_done, pseudo, SIEncodingFamily.SI>, EXPe {
59  let AssemblerPredicate = isGFX6GFX7;
60  let DecoderNamespace = "GFX6GFX7";
61  let done = _done;
62}
63
64def EXP_si      : EXP_Real_si<0, "EXP">;
65def EXP_DONE_si : EXP_Real_si<1, "EXP_DONE">;
66
67//===----------------------------------------------------------------------===//
68// VI
69//===----------------------------------------------------------------------===//
70
71class EXP_Real_vi<bit _done, string pseudo>
72  : EXP_Real<_done, pseudo, SIEncodingFamily.VI>, EXPe_vi {
73  let AssemblerPredicate = isGFX8GFX9;
74  let SubtargetPredicate = isNotGFX90APlus;
75  let DecoderNamespace = "GFX8";
76  let done = _done;
77}
78
79def EXP_vi      : EXP_Real_vi<0, "EXP">;
80def EXP_DONE_vi : EXP_Real_vi<1, "EXP_DONE">;
81
82//===----------------------------------------------------------------------===//
83// GFX10+
84//===----------------------------------------------------------------------===//
85
86class EXP_Real_gfx10<bit _done, string pseudo>
87  : EXP_Real<_done, pseudo, SIEncodingFamily.GFX10>, EXPe {
88  let AssemblerPredicate = isGFX10Plus;
89  let DecoderNamespace = "GFX10";
90  let done = _done;
91}
92
93def EXP_gfx10      : EXP_Real_gfx10<0, "EXP">;
94def EXP_DONE_gfx10 : EXP_Real_gfx10<1, "EXP_DONE">;
95
96//===----------------------------------------------------------------------===//
97// EXP Patterns
98//===----------------------------------------------------------------------===//
99
100class ExpPattern<ValueType vt, Instruction Inst, int done_val> : GCNPat<
101  (int_amdgcn_exp timm:$tgt, timm:$en,
102                  (vt ExpSrc0:$src0), (vt ExpSrc1:$src1),
103                  (vt ExpSrc2:$src2), (vt ExpSrc3:$src3),
104                  done_val, timm:$vm),
105  (Inst timm:$tgt, ExpSrc0:$src0, ExpSrc1:$src1,
106        ExpSrc2:$src2, ExpSrc3:$src3, timm:$vm, 0, timm:$en)
107>;
108
109class ExpComprPattern<ValueType vt, Instruction Inst, int done_val> : GCNPat<
110  (int_amdgcn_exp_compr timm:$tgt, timm:$en,
111                        (vt ExpSrc0:$src0), (vt ExpSrc1:$src1),
112                        done_val, timm:$vm),
113  (Inst timm:$tgt, ExpSrc0:$src0, ExpSrc1:$src1,
114        (IMPLICIT_DEF), (IMPLICIT_DEF), timm:$vm, 1, timm:$en)
115>;
116
117// FIXME: The generated DAG matcher seems to have strange behavior
118// with a 1-bit literal to match, so use a -1 for checking a true
119// 1-bit value.
120def : ExpPattern<i32, EXP, 0>;
121def : ExpPattern<i32, EXP_DONE, -1>;
122def : ExpPattern<f32, EXP, 0>;
123def : ExpPattern<f32, EXP_DONE, -1>;
124
125def : ExpComprPattern<v2i16, EXP, 0>;
126def : ExpComprPattern<v2i16, EXP_DONE, -1>;
127def : ExpComprPattern<v2f16, EXP, 0>;
128def : ExpComprPattern<v2f16, EXP_DONE, -1>;
129