173471bf0Spatrick//===-- EXPInstructions.td - Export Instruction Definitions ---------------===// 273471bf0Spatrick// 373471bf0Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 473471bf0Spatrick// See https://llvm.org/LICENSE.txt for license information. 573471bf0Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 673471bf0Spatrick// 773471bf0Spatrick//===----------------------------------------------------------------------===// 873471bf0Spatrick 973471bf0Spatrick//===----------------------------------------------------------------------===// 1073471bf0Spatrick// EXP classes 1173471bf0Spatrick//===----------------------------------------------------------------------===// 1273471bf0Spatrick 13*d415bd75Srobertclass EXPCommon<bit row, bit done, string asm = ""> : InstSI< 1473471bf0Spatrick (outs), 1573471bf0Spatrick (ins exp_tgt:$tgt, 1673471bf0Spatrick ExpSrc0:$src0, ExpSrc1:$src1, ExpSrc2:$src2, ExpSrc3:$src3, 1773471bf0Spatrick exp_vm:$vm, exp_compr:$compr, i32imm:$en), 1873471bf0Spatrick asm> { 1973471bf0Spatrick let EXP = 1; 2073471bf0Spatrick let EXP_CNT = 1; 2173471bf0Spatrick let mayLoad = done; 2273471bf0Spatrick let mayStore = 1; 2373471bf0Spatrick let UseNamedOperandTable = 1; 24*d415bd75Srobert let Uses = !if(row, [EXEC, M0], [EXEC]); 2573471bf0Spatrick let SchedRW = [WriteExport]; 2673471bf0Spatrick let DisableWQM = 1; 2773471bf0Spatrick} 2873471bf0Spatrick 29*d415bd75Srobertclass EXP_Pseudo<bit row, bit done> 30*d415bd75Srobert : EXPCommon<row, done>, SIMCInstr<NAME, SIEncodingFamily.NONE> { 3173471bf0Spatrick let isPseudo = 1; 3273471bf0Spatrick let isCodeGenOnly = 1; 3373471bf0Spatrick} 3473471bf0Spatrick 35*d415bd75Srobert// Real instruction with optional asm operands "compr" and "vm". 36*d415bd75Srobertclass EXP_Real_ComprVM<bit done, string pseudo, int subtarget> 37*d415bd75Srobert : EXPCommon<0, done, "exp$tgt $src0, $src1, $src2, $src3" 38*d415bd75Srobert #!if(done, " done", "")#"$compr$vm">, 39*d415bd75Srobert SIMCInstr<pseudo, subtarget> { 40*d415bd75Srobert let AsmMatchConverter = "cvtExp"; 41*d415bd75Srobert} 42*d415bd75Srobert 43*d415bd75Srobert// Real instruction with optional asm operand "row_en". 44*d415bd75Srobertclass EXP_Real_Row<bit row, bit done, string pseudo, int subtarget> 45*d415bd75Srobert : EXPCommon<row, done, "exp$tgt $src0, $src1, $src2, $src3" 46*d415bd75Srobert #!if(done, " done", "")#!if(row, " row_en", "")>, 4773471bf0Spatrick SIMCInstr<pseudo, subtarget> { 4873471bf0Spatrick let AsmMatchConverter = "cvtExp"; 4973471bf0Spatrick} 5073471bf0Spatrick 5173471bf0Spatrick//===----------------------------------------------------------------------===// 5273471bf0Spatrick// EXP Instructions 5373471bf0Spatrick//===----------------------------------------------------------------------===// 5473471bf0Spatrick 55*d415bd75Srobert// DONE variants have mayLoad = 1. 56*d415bd75Srobert// ROW variants have an implicit use of M0. 57*d415bd75Srobertlet SubtargetPredicate = isNotGFX90APlus in { 58*d415bd75Srobertdef EXP : EXP_Pseudo<0, 0>; 59*d415bd75Srobertdef EXP_DONE : EXP_Pseudo<0, 1>; 60*d415bd75Srobertdef EXP_ROW : EXP_Pseudo<1, 0>; 61*d415bd75Srobertdef EXP_ROW_DONE : EXP_Pseudo<1, 1>; 62*d415bd75Srobert} // let SubtargetPredicate = isNotGFX90APlus 6373471bf0Spatrick 6473471bf0Spatrick//===----------------------------------------------------------------------===// 6573471bf0Spatrick// SI 6673471bf0Spatrick//===----------------------------------------------------------------------===// 6773471bf0Spatrick 6873471bf0Spatrickclass EXP_Real_si<bit _done, string pseudo> 69*d415bd75Srobert : EXP_Real_ComprVM<_done, pseudo, SIEncodingFamily.SI>, EXPe_ComprVM { 7073471bf0Spatrick let AssemblerPredicate = isGFX6GFX7; 7173471bf0Spatrick let DecoderNamespace = "GFX6GFX7"; 7273471bf0Spatrick let done = _done; 7373471bf0Spatrick} 7473471bf0Spatrick 7573471bf0Spatrickdef EXP_si : EXP_Real_si<0, "EXP">; 7673471bf0Spatrickdef EXP_DONE_si : EXP_Real_si<1, "EXP_DONE">; 7773471bf0Spatrick 7873471bf0Spatrick//===----------------------------------------------------------------------===// 7973471bf0Spatrick// VI 8073471bf0Spatrick//===----------------------------------------------------------------------===// 8173471bf0Spatrick 8273471bf0Spatrickclass EXP_Real_vi<bit _done, string pseudo> 83*d415bd75Srobert : EXP_Real_ComprVM<_done, pseudo, SIEncodingFamily.VI>, EXPe_vi { 8473471bf0Spatrick let AssemblerPredicate = isGFX8GFX9; 85*d415bd75Srobert let SubtargetPredicate = isNotGFX90APlus; 8673471bf0Spatrick let DecoderNamespace = "GFX8"; 8773471bf0Spatrick let done = _done; 8873471bf0Spatrick} 8973471bf0Spatrick 9073471bf0Spatrickdef EXP_vi : EXP_Real_vi<0, "EXP">; 9173471bf0Spatrickdef EXP_DONE_vi : EXP_Real_vi<1, "EXP_DONE">; 9273471bf0Spatrick 9373471bf0Spatrick//===----------------------------------------------------------------------===// 94*d415bd75Srobert// GFX10 9573471bf0Spatrick//===----------------------------------------------------------------------===// 9673471bf0Spatrick 9773471bf0Spatrickclass EXP_Real_gfx10<bit _done, string pseudo> 98*d415bd75Srobert : EXP_Real_ComprVM<_done, pseudo, SIEncodingFamily.GFX10>, EXPe_ComprVM { 99*d415bd75Srobert let AssemblerPredicate = isGFX10Only; 10073471bf0Spatrick let DecoderNamespace = "GFX10"; 10173471bf0Spatrick let done = _done; 10273471bf0Spatrick} 10373471bf0Spatrick 10473471bf0Spatrickdef EXP_gfx10 : EXP_Real_gfx10<0, "EXP">; 10573471bf0Spatrickdef EXP_DONE_gfx10 : EXP_Real_gfx10<1, "EXP_DONE">; 10673471bf0Spatrick 10773471bf0Spatrick//===----------------------------------------------------------------------===// 108*d415bd75Srobert// GFX11+ 109*d415bd75Srobert//===----------------------------------------------------------------------===// 110*d415bd75Srobert 111*d415bd75Srobertclass EXP_Real_gfx11<bit _row, bit _done, string pseudo> 112*d415bd75Srobert : EXP_Real_Row<_row, _done, pseudo, SIEncodingFamily.GFX11>, EXPe_Row { 113*d415bd75Srobert let AssemblerPredicate = isGFX11Plus; 114*d415bd75Srobert let DecoderNamespace = "GFX11"; 115*d415bd75Srobert let row = _row; 116*d415bd75Srobert let done = _done; 117*d415bd75Srobert} 118*d415bd75Srobert 119*d415bd75Srobertdef EXP_gfx11 : EXP_Real_gfx11<0, 0, "EXP">; 120*d415bd75Srobertdef EXP_DONE_gfx11 : EXP_Real_gfx11<0, 1, "EXP_DONE">; 121*d415bd75Srobertdef EXP_ROW_gfx11 : EXP_Real_gfx11<1, 0, "EXP_ROW">; 122*d415bd75Srobertdef EXP_ROW_DONE_gfx11 : EXP_Real_gfx11<1, 1, "EXP_ROW_DONE">; 123*d415bd75Srobert 124*d415bd75Srobert//===----------------------------------------------------------------------===// 12573471bf0Spatrick// EXP Patterns 12673471bf0Spatrick//===----------------------------------------------------------------------===// 12773471bf0Spatrick 12873471bf0Spatrickclass ExpPattern<ValueType vt, Instruction Inst, int done_val> : GCNPat< 12973471bf0Spatrick (int_amdgcn_exp timm:$tgt, timm:$en, 13073471bf0Spatrick (vt ExpSrc0:$src0), (vt ExpSrc1:$src1), 13173471bf0Spatrick (vt ExpSrc2:$src2), (vt ExpSrc3:$src3), 13273471bf0Spatrick done_val, timm:$vm), 13373471bf0Spatrick (Inst timm:$tgt, ExpSrc0:$src0, ExpSrc1:$src1, 13473471bf0Spatrick ExpSrc2:$src2, ExpSrc3:$src3, timm:$vm, 0, timm:$en) 13573471bf0Spatrick>; 13673471bf0Spatrick 137*d415bd75Srobertclass ExpRowPattern<ValueType vt, Instruction Inst, int done_val> : GCNPat< 138*d415bd75Srobert (int_amdgcn_exp_row timm:$tgt, timm:$en, 139*d415bd75Srobert (vt ExpSrc0:$src0), (vt ExpSrc1:$src1), 140*d415bd75Srobert (vt ExpSrc2:$src2), (vt ExpSrc3:$src3), 141*d415bd75Srobert done_val, M0), 142*d415bd75Srobert (Inst timm:$tgt, ExpSrc0:$src0, ExpSrc1:$src1, 143*d415bd75Srobert ExpSrc2:$src2, ExpSrc3:$src3, 0, 0, timm:$en) 144*d415bd75Srobert>; 145*d415bd75Srobert 14673471bf0Spatrickclass ExpComprPattern<ValueType vt, Instruction Inst, int done_val> : GCNPat< 14773471bf0Spatrick (int_amdgcn_exp_compr timm:$tgt, timm:$en, 14873471bf0Spatrick (vt ExpSrc0:$src0), (vt ExpSrc1:$src1), 14973471bf0Spatrick done_val, timm:$vm), 15073471bf0Spatrick (Inst timm:$tgt, ExpSrc0:$src0, ExpSrc1:$src1, 15173471bf0Spatrick (IMPLICIT_DEF), (IMPLICIT_DEF), timm:$vm, 1, timm:$en) 15273471bf0Spatrick>; 15373471bf0Spatrick 15473471bf0Spatrick// FIXME: The generated DAG matcher seems to have strange behavior 15573471bf0Spatrick// with a 1-bit literal to match, so use a -1 for checking a true 15673471bf0Spatrick// 1-bit value. 15773471bf0Spatrickdef : ExpPattern<i32, EXP, 0>; 15873471bf0Spatrickdef : ExpPattern<i32, EXP_DONE, -1>; 15973471bf0Spatrickdef : ExpPattern<f32, EXP, 0>; 16073471bf0Spatrickdef : ExpPattern<f32, EXP_DONE, -1>; 16173471bf0Spatrick 162*d415bd75Srobertdef : ExpRowPattern<i32, EXP_ROW, 0>; 163*d415bd75Srobertdef : ExpRowPattern<i32, EXP_ROW_DONE, -1>; 164*d415bd75Srobertdef : ExpRowPattern<f32, EXP_ROW, 0>; 165*d415bd75Srobertdef : ExpRowPattern<f32, EXP_ROW_DONE, -1>; 166*d415bd75Srobert 16773471bf0Spatrickdef : ExpComprPattern<v2i16, EXP, 0>; 16873471bf0Spatrickdef : ExpComprPattern<v2i16, EXP_DONE, -1>; 16973471bf0Spatrickdef : ExpComprPattern<v2f16, EXP, 0>; 17073471bf0Spatrickdef : ExpComprPattern<v2f16, EXP_DONE, -1>; 171