brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.3 KiB · 807b69d Raw
184 lines · plain
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-exception6//7//===----------------------------------------------------------------------===//8 9//===----------------------------------------------------------------------===//10// EXP classes11//===----------------------------------------------------------------------===//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  bit row = _row;30  bit done = _done;31}32 33class EXP_Pseudo<bit row, bit done>34  : EXPCommon<row, done>, SIMCInstr<NAME, SIEncodingFamily.NONE> {35  let isPseudo = 1;36  let isCodeGenOnly = 1;37}38 39// Real instruction with optional asm operands "compr" and "vm".40class EXP_Real_ComprVM<EXP_Pseudo ps, int subtarget>41  : EXPCommon<0, ps.done, "exp$tgt $src0, $src1, $src2, $src3"42                       #!if(ps.done, " done", "")#"$compr$vm">,43    SIMCInstr<ps.PseudoInstr, subtarget> {44  let AsmMatchConverter = "cvtExp";45}46 47// Real instruction with optional asm operand "row_en".48class EXP_Real_Row<EXP_Pseudo ps, int subtarget, string name = "exp">49  : EXPCommon<ps.row, ps.done, name#"$tgt $src0, $src1, $src2, $src3"50                         #!if(ps.done, " done", "")#!if(ps.row, " row_en", "")>,51    SIMCInstr<ps.PseudoInstr, subtarget> {52  let AsmMatchConverter = "cvtExp";53}54 55//===----------------------------------------------------------------------===//56// EXP Instructions57//===----------------------------------------------------------------------===//58 59// DONE variants have mayLoad = 1.60// ROW variants have an implicit use of M0.61let SubtargetPredicate = HasExportInsts in {62def EXP          : EXP_Pseudo<0, 0>;63def EXP_DONE     : EXP_Pseudo<0, 1>;64def EXP_ROW      : EXP_Pseudo<1, 0>;65def EXP_ROW_DONE : EXP_Pseudo<1, 1>;66} // let SubtargetPredicate = HasExportInsts67 68//===----------------------------------------------------------------------===//69// SI, VI, GFX10.70//===----------------------------------------------------------------------===//71 72multiclass EXP_Real_si {73  defvar ps = !cast<EXP_Pseudo>(NAME);74  def _si : EXP_Real_ComprVM<ps, SIEncodingFamily.SI>, EXPe_ComprVM {75    let AssemblerPredicate = isGFX6GFX7;76    let DecoderNamespace = "GFX6GFX7";77    let done = ps.done;78  }79}80 81multiclass EXP_Real_vi {82  defvar ps = !cast<EXP_Pseudo>(NAME);83  def _vi : EXP_Real_ComprVM<ps, SIEncodingFamily.VI>, EXPe_vi {84    let AssemblerPredicate = isGFX8GFX9;85    let SubtargetPredicate = isNotGFX90APlus;86    let DecoderNamespace = "GFX8";87    let done = ps.done;88  }89}90 91multiclass EXP_Real_gfx10 {92  defvar ps = !cast<EXP_Pseudo>(NAME);93  def _gfx10 : EXP_Real_ComprVM<ps, SIEncodingFamily.GFX10>, EXPe_ComprVM {94    let AssemblerPredicate = isGFX10Only;95    let DecoderNamespace = "GFX10";96    let done = ps.done;97  }98}99 100defm EXP      : EXP_Real_si, EXP_Real_vi, EXP_Real_gfx10;101defm EXP_DONE : EXP_Real_si, EXP_Real_vi, EXP_Real_gfx10;102 103//===----------------------------------------------------------------------===//104// GFX11, GFX12.105//===----------------------------------------------------------------------===//106 107multiclass EXP_Real_gfx11 {108  defvar ps = !cast<EXP_Pseudo>(NAME);109  def _gfx11 : EXP_Real_Row<ps, SIEncodingFamily.GFX11>, EXPe_Row {110    let AssemblerPredicate = isGFX11Only;111    let DecoderNamespace = "GFX11";112    let row = ps.row;113    let done = ps.done;114  }115}116 117multiclass VEXPORT_Real_gfx12 {118  defvar ps = !cast<EXP_Pseudo>(NAME);119  def _gfx12 : EXP_Real_Row<ps, SIEncodingFamily.GFX12, "export">,120    EXPe_Row {121    let AssemblerPredicate = isGFX12Only;122    let OtherPredicates = [HasExportInsts];123    let DecoderNamespace = "GFX12";124    let row = ps.row;125    let done = ps.done;126  }127  def : AMDGPUMnemonicAlias<"exp", "export"> {128    let AssemblerPredicate = isGFX12Plus;129  }130}131 132defm EXP          : EXP_Real_gfx11, VEXPORT_Real_gfx12;133defm EXP_DONE     : EXP_Real_gfx11, VEXPORT_Real_gfx12;134defm EXP_ROW      : EXP_Real_gfx11, VEXPORT_Real_gfx12;135defm EXP_ROW_DONE : EXP_Real_gfx11, VEXPORT_Real_gfx12;136 137//===----------------------------------------------------------------------===//138// EXP Patterns139//===----------------------------------------------------------------------===//140 141class ExpPattern<ValueType vt, Instruction Inst, int done_val> : GCNPat<142  (int_amdgcn_exp timm:$tgt, timm:$en,143                  (vt ExpSrc0:$src0), (vt ExpSrc1:$src1),144                  (vt ExpSrc2:$src2), (vt ExpSrc3:$src3),145                  done_val, timm:$vm),146  (Inst timm:$tgt, ExpSrc0:$src0, ExpSrc1:$src1,147        ExpSrc2:$src2, ExpSrc3:$src3, timm:$vm, 0, timm:$en)148>;149 150class ExpRowPattern<ValueType vt, Instruction Inst, int done_val> : GCNPat<151  (int_amdgcn_exp_row timm:$tgt, timm:$en,152                      (vt ExpSrc0:$src0), (vt ExpSrc1:$src1),153                      (vt ExpSrc2:$src2), (vt ExpSrc3:$src3),154                      done_val, M0),155  (Inst timm:$tgt, ExpSrc0:$src0, ExpSrc1:$src1,156        ExpSrc2:$src2, ExpSrc3:$src3, 0, 0, timm:$en)157>;158 159class ExpComprPattern<ValueType vt, Instruction Inst, int done_val> : GCNPat<160  (int_amdgcn_exp_compr timm:$tgt, timm:$en,161                        (vt ExpSrc0:$src0), (vt ExpSrc1:$src1),162                        done_val, timm:$vm),163  (Inst timm:$tgt, ExpSrc0:$src0, ExpSrc1:$src1,164        (IMPLICIT_DEF), (IMPLICIT_DEF), timm:$vm, 1, timm:$en)165>;166 167// FIXME: The generated DAG matcher seems to have strange behavior168// with a 1-bit literal to match, so use a -1 for checking a true169// 1-bit value.170def : ExpPattern<i32, EXP, 0>;171def : ExpPattern<i32, EXP_DONE, -1>;172def : ExpPattern<f32, EXP, 0>;173def : ExpPattern<f32, EXP_DONE, -1>;174 175def : ExpRowPattern<i32, EXP_ROW, 0>;176def : ExpRowPattern<i32, EXP_ROW_DONE, -1>;177def : ExpRowPattern<f32, EXP_ROW, 0>;178def : ExpRowPattern<f32, EXP_ROW_DONE, -1>;179 180def : ExpComprPattern<v2i16, EXP, 0>;181def : ExpComprPattern<v2i16, EXP_DONE, -1>;182def : ExpComprPattern<v2f16, EXP, 0>;183def : ExpComprPattern<v2f16, EXP_DONE, -1>;184