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 row, 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 maybeAtomic = 0; 24 let UseNamedOperandTable = 1; 25 let Uses = !if(row, [EXEC, M0], [EXEC]); 26 let SchedRW = [WriteExport]; 27 let DisableWQM = 1; 28} 29 30class EXP_Pseudo<bit row, bit done> 31 : EXPCommon<row, done>, SIMCInstr<NAME, SIEncodingFamily.NONE> { 32 let isPseudo = 1; 33 let isCodeGenOnly = 1; 34} 35 36// Real instruction with optional asm operands "compr" and "vm". 37class EXP_Real_ComprVM<bit done, string pseudo, int subtarget> 38 : EXPCommon<0, done, "exp$tgt $src0, $src1, $src2, $src3" 39 #!if(done, " done", "")#"$compr$vm">, 40 SIMCInstr<pseudo, subtarget> { 41 let AsmMatchConverter = "cvtExp"; 42} 43 44// Real instruction with optional asm operand "row_en". 45class EXP_Real_Row<bit row, bit done, string pseudo, int subtarget, string name = "exp"> 46 : EXPCommon<row, done, name#"$tgt $src0, $src1, $src2, $src3" 47 #!if(done, " done", "")#!if(row, " row_en", "")>, 48 SIMCInstr<pseudo, subtarget> { 49 let AsmMatchConverter = "cvtExp"; 50} 51 52//===----------------------------------------------------------------------===// 53// EXP Instructions 54//===----------------------------------------------------------------------===// 55 56// DONE variants have mayLoad = 1. 57// ROW variants have an implicit use of M0. 58let SubtargetPredicate = isNotGFX90APlus in { 59def EXP : EXP_Pseudo<0, 0>; 60def EXP_DONE : EXP_Pseudo<0, 1>; 61def EXP_ROW : EXP_Pseudo<1, 0>; 62def EXP_ROW_DONE : EXP_Pseudo<1, 1>; 63} // let SubtargetPredicate = isNotGFX90APlus 64 65//===----------------------------------------------------------------------===// 66// SI 67//===----------------------------------------------------------------------===// 68 69class EXP_Real_si<bit _done, string pseudo> 70 : EXP_Real_ComprVM<_done, pseudo, SIEncodingFamily.SI>, EXPe_ComprVM { 71 let AssemblerPredicate = isGFX6GFX7; 72 let DecoderNamespace = "GFX6GFX7"; 73 let done = _done; 74} 75 76def EXP_si : EXP_Real_si<0, "EXP">; 77def EXP_DONE_si : EXP_Real_si<1, "EXP_DONE">; 78 79//===----------------------------------------------------------------------===// 80// VI 81//===----------------------------------------------------------------------===// 82 83class EXP_Real_vi<bit _done, string pseudo> 84 : EXP_Real_ComprVM<_done, pseudo, SIEncodingFamily.VI>, EXPe_vi { 85 let AssemblerPredicate = isGFX8GFX9; 86 let SubtargetPredicate = isNotGFX90APlus; 87 let DecoderNamespace = "GFX8"; 88 let done = _done; 89} 90 91def EXP_vi : EXP_Real_vi<0, "EXP">; 92def EXP_DONE_vi : EXP_Real_vi<1, "EXP_DONE">; 93 94//===----------------------------------------------------------------------===// 95// GFX10 96//===----------------------------------------------------------------------===// 97 98class EXP_Real_gfx10<bit _done, string pseudo> 99 : EXP_Real_ComprVM<_done, pseudo, SIEncodingFamily.GFX10>, EXPe_ComprVM { 100 let AssemblerPredicate = isGFX10Only; 101 let DecoderNamespace = "GFX10"; 102 let done = _done; 103} 104 105def EXP_gfx10 : EXP_Real_gfx10<0, "EXP">; 106def EXP_DONE_gfx10 : EXP_Real_gfx10<1, "EXP_DONE">; 107 108//===----------------------------------------------------------------------===// 109// GFX11 110//===----------------------------------------------------------------------===// 111 112class EXP_Real_gfx11<bit _row, bit _done, string pseudo> 113 : EXP_Real_Row<_row, _done, pseudo, SIEncodingFamily.GFX11>, EXPe_Row { 114 let AssemblerPredicate = isGFX11Only; 115 let DecoderNamespace = "GFX11"; 116 let row = _row; 117 let done = _done; 118} 119 120def EXP_gfx11 : EXP_Real_gfx11<0, 0, "EXP">; 121def EXP_DONE_gfx11 : EXP_Real_gfx11<0, 1, "EXP_DONE">; 122def EXP_ROW_gfx11 : EXP_Real_gfx11<1, 0, "EXP_ROW">; 123def EXP_ROW_DONE_gfx11 : EXP_Real_gfx11<1, 1, "EXP_ROW_DONE">; 124 125//===----------------------------------------------------------------------===// 126// GFX12+ 127//===----------------------------------------------------------------------===// 128 129class VEXPORT_Real_gfx12<bit _row, bit _done, string pseudo> 130 : EXP_Real_Row<_row, _done, pseudo, SIEncodingFamily.GFX12, "export">, 131 EXPe_Row, MnemonicAlias<"exp", "export">, Requires<[isGFX12Plus]> { 132 let AssemblerPredicate = isGFX12Plus; 133 let DecoderNamespace = "GFX12"; 134 let row = _row; 135 let done = _done; 136} 137 138def EXPORT_gfx12 : VEXPORT_Real_gfx12<0, 0, "EXP">; 139def EXPORT_DONE_gfx12 : VEXPORT_Real_gfx12<0, 1, "EXP_DONE">; 140def EXPORT_ROW_gfx12 : VEXPORT_Real_gfx12<1, 0, "EXP_ROW">; 141def EXPORT_ROW_DONE_gfx12 : VEXPORT_Real_gfx12<1, 1, "EXP_ROW_DONE">; 142 143//===----------------------------------------------------------------------===// 144// EXP Patterns 145//===----------------------------------------------------------------------===// 146 147class ExpPattern<ValueType vt, Instruction Inst, int done_val> : GCNPat< 148 (int_amdgcn_exp timm:$tgt, timm:$en, 149 (vt ExpSrc0:$src0), (vt ExpSrc1:$src1), 150 (vt ExpSrc2:$src2), (vt ExpSrc3:$src3), 151 done_val, timm:$vm), 152 (Inst timm:$tgt, ExpSrc0:$src0, ExpSrc1:$src1, 153 ExpSrc2:$src2, ExpSrc3:$src3, timm:$vm, 0, timm:$en) 154>; 155 156class ExpRowPattern<ValueType vt, Instruction Inst, int done_val> : GCNPat< 157 (int_amdgcn_exp_row timm:$tgt, timm:$en, 158 (vt ExpSrc0:$src0), (vt ExpSrc1:$src1), 159 (vt ExpSrc2:$src2), (vt ExpSrc3:$src3), 160 done_val, M0), 161 (Inst timm:$tgt, ExpSrc0:$src0, ExpSrc1:$src1, 162 ExpSrc2:$src2, ExpSrc3:$src3, 0, 0, timm:$en) 163>; 164 165class ExpComprPattern<ValueType vt, Instruction Inst, int done_val> : GCNPat< 166 (int_amdgcn_exp_compr timm:$tgt, timm:$en, 167 (vt ExpSrc0:$src0), (vt ExpSrc1:$src1), 168 done_val, timm:$vm), 169 (Inst timm:$tgt, ExpSrc0:$src0, ExpSrc1:$src1, 170 (IMPLICIT_DEF), (IMPLICIT_DEF), timm:$vm, 1, timm:$en) 171>; 172 173// FIXME: The generated DAG matcher seems to have strange behavior 174// with a 1-bit literal to match, so use a -1 for checking a true 175// 1-bit value. 176def : ExpPattern<i32, EXP, 0>; 177def : ExpPattern<i32, EXP_DONE, -1>; 178def : ExpPattern<f32, EXP, 0>; 179def : ExpPattern<f32, EXP_DONE, -1>; 180 181def : ExpRowPattern<i32, EXP_ROW, 0>; 182def : ExpRowPattern<i32, EXP_ROW_DONE, -1>; 183def : ExpRowPattern<f32, EXP_ROW, 0>; 184def : ExpRowPattern<f32, EXP_ROW_DONE, -1>; 185 186def : ExpComprPattern<v2i16, EXP, 0>; 187def : ExpComprPattern<v2i16, EXP_DONE, -1>; 188def : ExpComprPattern<v2f16, EXP, 0>; 189def : ExpComprPattern<v2f16, EXP_DONE, -1>; 190