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