diff --git a/llvm/lib/Target/AMDGPU/EXPInstructions.td b/llvm/lib/Target/AMDGPU/EXPInstructions.td --- a/llvm/lib/Target/AMDGPU/EXPInstructions.td +++ b/llvm/lib/Target/AMDGPU/EXPInstructions.td @@ -10,66 +10,85 @@ // EXP classes //===----------------------------------------------------------------------===// -class EXPCommon pattern> : - InstSI { +class EXPCommon : InstSI< + (outs), + (ins exp_tgt:$tgt, + ExpSrc0:$src0, ExpSrc1:$src1, ExpSrc2:$src2, ExpSrc3:$src3, + exp_vm:$vm, exp_compr:$compr, i32imm:$en), + asm> { let EXP = 1; let EXP_CNT = 1; - let mayLoad = 0; // Set to 1 if done bit is set. + let mayLoad = done; let mayStore = 1; let UseNamedOperandTable = 1; let Uses = [EXEC]; let SchedRW = [WriteExport]; + let DisableWQM = 1; } -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", []> { +class EXP_Pseudo : EXPCommon, + SIMCInstr { + let isPseudo = 1; + let isCodeGenOnly = 1; +} + +class EXP_Real + : EXPCommon, + SIMCInstr { let AsmMatchConverter = "cvtExp"; } +//===----------------------------------------------------------------------===// +// EXP Instructions +//===----------------------------------------------------------------------===// + // 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"; - } - } - } +def EXP : EXP_Pseudo<0>; +def EXP_DONE : EXP_Pseudo<1>; + +//===----------------------------------------------------------------------===// +// SI +//===----------------------------------------------------------------------===// + +class EXP_Real_si + : EXP_Real<_done, pseudo, SIEncodingFamily.SI>, EXPe { + let AssemblerPredicate = isGFX6GFX7; + let DecoderNamespace = "GFX6GFX7"; + let done = _done; } +def EXP_si : EXP_Real_si<0, "EXP">; +def EXP_DONE_si : EXP_Real_si<1, "EXP_DONE">; + //===----------------------------------------------------------------------===// -// EXP Instructions +// VI +//===----------------------------------------------------------------------===// + +class EXP_Real_vi + : EXP_Real<_done, pseudo, SIEncodingFamily.VI>, EXPe_vi { + let AssemblerPredicate = isGFX8GFX9; + let DecoderNamespace = "GFX8"; + let done = _done; +} + +def EXP_vi : EXP_Real_vi<0, "EXP">; +def EXP_DONE_vi : EXP_Real_vi<1, "EXP_DONE">; + //===----------------------------------------------------------------------===// +// GFX10+ +//===----------------------------------------------------------------------===// + +class EXP_Real_gfx10 + : EXP_Real<_done, pseudo, SIEncodingFamily.GFX10>, EXPe { + let AssemblerPredicate = isGFX10Plus; + let DecoderNamespace = "GFX10"; + let done = _done; +} -defm EXP : EXP_m<0>; -defm EXP_DONE : EXP_m<1>; +def EXP_gfx10 : EXP_Real_gfx10<0, "EXP">; +def EXP_DONE_gfx10 : EXP_Real_gfx10<1, "EXP_DONE">; //===----------------------------------------------------------------------===// // EXP Patterns