diff --git a/llvm/lib/Target/AMDGPU/EXPInstructions.td b/llvm/lib/Target/AMDGPU/EXPInstructions.td new file mode 100644 index 00000000000000..90e3309a8ebaf4 --- /dev/null +++ b/llvm/lib/Target/AMDGPU/EXPInstructions.td @@ -0,0 +1,106 @@ +//===-- EXPInstructions.td - Export Instruction Definitions ---------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +//===----------------------------------------------------------------------===// +// EXP classes +//===----------------------------------------------------------------------===// + +class EXPCommon pattern> : + InstSI { + let EXP = 1; + let EXP_CNT = 1; + let mayLoad = 0; // Set to 1 if done bit is set. + let mayStore = 1; + let UseNamedOperandTable = 1; + let Uses = [EXEC]; + let SchedRW = [WriteExport]; +} + +class EXP_Helper : EXPCommon< + (outs), + (ins exp_tgt:$tgt, + ExpSrc0:$src0, ExpSrc1:$src1, ExpSrc2:$src2, ExpSrc3:$src3, + exp_vm:$vm, exp_compr:$compr, i32imm:$en), + "exp$tgt $src0, $src1, $src2, $src3"#!if(done, " done", "")#"$compr$vm", []> { + let AsmMatchConverter = "cvtExp"; +} + +// Split EXP instruction into EXP and EXP_DONE so we can set +// mayLoad for done=1. +multiclass EXP_m { + let mayLoad = done, DisableWQM = 1 in { + let isPseudo = 1, isCodeGenOnly = 1 in { + def "" : EXP_Helper, + SIMCInstr ; + } + + let done = done in { + def _si : EXP_Helper, + SIMCInstr , + EXPe { + let AssemblerPredicate = isGFX6GFX7; + let DecoderNamespace = "GFX6GFX7"; + } + + def _vi : EXP_Helper, + SIMCInstr , + EXPe_vi { + let AssemblerPredicate = isGFX8GFX9; + let DecoderNamespace = "GFX8"; + } + + def _gfx10 : EXP_Helper, + SIMCInstr , + EXPe { + let AssemblerPredicate = isGFX10Plus; + let DecoderNamespace = "GFX10"; + } + } + } +} + +//===----------------------------------------------------------------------===// +// EXP Instructions +//===----------------------------------------------------------------------===// + +defm EXP : EXP_m<0>; +defm EXP_DONE : EXP_m<1>; + +//===----------------------------------------------------------------------===// +// EXP Patterns +//===----------------------------------------------------------------------===// + +class ExpPattern : GCNPat< + (int_amdgcn_exp timm:$tgt, timm:$en, + (vt ExpSrc0:$src0), (vt ExpSrc1:$src1), + (vt ExpSrc2:$src2), (vt ExpSrc3:$src3), + done_val, timm:$vm), + (Inst timm:$tgt, ExpSrc0:$src0, ExpSrc1:$src1, + ExpSrc2:$src2, ExpSrc3:$src3, timm:$vm, 0, timm:$en) +>; + +class ExpComprPattern : GCNPat< + (int_amdgcn_exp_compr timm:$tgt, timm:$en, + (vt ExpSrc0:$src0), (vt ExpSrc1:$src1), + done_val, timm:$vm), + (Inst timm:$tgt, ExpSrc0:$src0, ExpSrc1:$src1, + (IMPLICIT_DEF), (IMPLICIT_DEF), timm:$vm, 1, timm:$en) +>; + +// FIXME: The generated DAG matcher seems to have strange behavior +// with a 1-bit literal to match, so use a -1 for checking a true +// 1-bit value. +def : ExpPattern; +def : ExpPattern; +def : ExpPattern; +def : ExpPattern; + +def : ExpComprPattern; +def : ExpComprPattern; +def : ExpComprPattern; +def : ExpComprPattern; diff --git a/llvm/lib/Target/AMDGPU/SIInstrFormats.td b/llvm/lib/Target/AMDGPU/SIInstrFormats.td index 8e0dcbb9dc7478..79cd6a5bb84453 100644 --- a/llvm/lib/Target/AMDGPU/SIInstrFormats.td +++ b/llvm/lib/Target/AMDGPU/SIInstrFormats.td @@ -363,15 +363,4 @@ class VINTRPCommon pattern> : let VALU = 1; } -class EXPCommon pattern> : - InstSI { - let EXP = 1; - let EXP_CNT = 1; - let mayLoad = 0; // Set to 1 if done bit is set. - let mayStore = 1; - let UseNamedOperandTable = 1; - let Uses = [EXEC]; - let SchedRW = [WriteExport]; -} - } // End Uses = [EXEC] diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.td b/llvm/lib/Target/AMDGPU/SIInstrInfo.td index b183a5c52b485c..b2bc21975a53e0 100644 --- a/llvm/lib/Target/AMDGPU/SIInstrInfo.td +++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.td @@ -1419,53 +1419,6 @@ class SIMCInstr { int Subtarget = subtarget; } -//===----------------------------------------------------------------------===// -// EXP classes -//===----------------------------------------------------------------------===// - -class EXP_Helper : EXPCommon< - (outs), - (ins exp_tgt:$tgt, - ExpSrc0:$src0, ExpSrc1:$src1, ExpSrc2:$src2, ExpSrc3:$src3, - exp_vm:$vm, exp_compr:$compr, i32imm:$en), - "exp$tgt $src0, $src1, $src2, $src3"#!if(done, " done", "")#"$compr$vm", []> { - let AsmMatchConverter = "cvtExp"; -} - -// Split EXP instruction into EXP and EXP_DONE so we can set -// mayLoad for done=1. -multiclass EXP_m { - let mayLoad = done, DisableWQM = 1 in { - let isPseudo = 1, isCodeGenOnly = 1 in { - def "" : EXP_Helper, - SIMCInstr ; - } - - let done = done in { - def _si : EXP_Helper, - SIMCInstr , - EXPe { - let AssemblerPredicate = isGFX6GFX7; - let DecoderNamespace = "GFX6GFX7"; - } - - def _vi : EXP_Helper, - SIMCInstr , - EXPe_vi { - let AssemblerPredicate = isGFX8GFX9; - let DecoderNamespace = "GFX8"; - } - - def _gfx10 : EXP_Helper, - SIMCInstr , - EXPe { - let AssemblerPredicate = isGFX10Plus; - let DecoderNamespace = "GFX10"; - } - } - } -} - //===----------------------------------------------------------------------===// // Vector ALU classes //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Target/AMDGPU/SIInstructions.td b/llvm/lib/Target/AMDGPU/SIInstructions.td index 1fdb5ed37be4f1..5825d21e333902 100644 --- a/llvm/lib/Target/AMDGPU/SIInstructions.td +++ b/llvm/lib/Target/AMDGPU/SIInstructions.td @@ -19,43 +19,7 @@ include "VOPInstructions.td" include "SMInstructions.td" include "FLATInstructions.td" include "BUFInstructions.td" - -//===----------------------------------------------------------------------===// -// EXP Instructions -//===----------------------------------------------------------------------===// - -defm EXP : EXP_m<0>; -defm EXP_DONE : EXP_m<1>; - -class ExpPattern : GCNPat< - (int_amdgcn_exp timm:$tgt, timm:$en, - (vt ExpSrc0:$src0), (vt ExpSrc1:$src1), - (vt ExpSrc2:$src2), (vt ExpSrc3:$src3), - done_val, timm:$vm), - (Inst timm:$tgt, ExpSrc0:$src0, ExpSrc1:$src1, - ExpSrc2:$src2, ExpSrc3:$src3, timm:$vm, 0, timm:$en) ->; - -class ExpComprPattern : GCNPat< - (int_amdgcn_exp_compr timm:$tgt, timm:$en, - (vt ExpSrc0:$src0), (vt ExpSrc1:$src1), - done_val, timm:$vm), - (Inst timm:$tgt, ExpSrc0:$src0, ExpSrc1:$src1, - (IMPLICIT_DEF), (IMPLICIT_DEF), timm:$vm, 1, timm:$en) ->; - -// FIXME: The generated DAG matcher seems to have strange behavior -// with a 1-bit literal to match, so use a -1 for checking a true -// 1-bit value. -def : ExpPattern; -def : ExpPattern; -def : ExpPattern; -def : ExpPattern; - -def : ExpComprPattern; -def : ExpComprPattern; -def : ExpComprPattern; -def : ExpComprPattern; +include "EXPInstructions.td" //===----------------------------------------------------------------------===// // VINTRP Instructions