diff --git a/llvm/lib/Target/AMDGPU/BUFInstructions.td b/llvm/lib/Target/AMDGPU/BUFInstructions.td --- a/llvm/lib/Target/AMDGPU/BUFInstructions.td +++ b/llvm/lib/Target/AMDGPU/BUFInstructions.td @@ -40,18 +40,12 @@ string OpName = Name; } + //===----------------------------------------------------------------------===// -// MTBUF classes +// BUF class (base class for MTBUF and MUBUF pseudos) //===----------------------------------------------------------------------===// -class MTBUFGetBaseOpcode { - string ret = !subst("FORMAT_XY", "FORMAT_X", - !subst("FORMAT_XYZ", "FORMAT_X", - !subst("FORMAT_XYZW", "FORMAT_X", Op))); -} - - -class MTBUF_Pseudo pattern=[]> : InstSI, SIMCInstr { @@ -65,21 +59,22 @@ string AsmOperands = asmOps; Instruction Opcode = !cast(NAME); - Instruction BaseOpcode = !cast(MTBUFGetBaseOpcode.ret); + let VM_CNT = 1; let EXP_CNT = 1; - let MTBUF = 1; + let Uses = [EXEC]; let hasSideEffects = 0; let SchedRW = [WriteVMEM]; - let AsmMatchConverter = "cvtMtbuf"; + bits<1> offen = 0; bits<1> idxen = 0; bits<1> addr64 = 0; - bits<1> has_vdata = 1; + bits<1> lds = 0; + bits<1> has_vdata = !not(lds); bits<1> has_vaddr = 1; bits<1> has_glc = 1; bits<1> has_dlc = 1; @@ -93,6 +88,29 @@ bits<4> elements = 0; bits<1> has_sccb = 1; bits<1> sccb_value = 0; + bits<1> IsBufferInv = 0; +} + + + +//===----------------------------------------------------------------------===// +// MTBUF classes +//===----------------------------------------------------------------------===// + +class MTBUFGetBaseOpcode { + string ret = !subst("FORMAT_XY", "FORMAT_X", + !subst("FORMAT_XYZ", "FORMAT_X", + !subst("FORMAT_XYZW", "FORMAT_X", Op))); +} + + +class MTBUF_Pseudo pattern=[]> : + BUF_Pseudo { + + Instruction BaseOpcode = !cast(MTBUFGetBaseOpcode.ret); + let MTBUF = 1; + let AsmMatchConverter = "cvtMtbuf"; } class MTBUF_Real : @@ -139,23 +157,13 @@ RegisterClass vdataClass = !if(!empty(vdataList), ?, !head(vdataList)); RegisterClass vaddrClass = !if(!empty(vaddrList), ?, !head(vaddrList)); RegisterOperand vdata_op = getLdStRegisterOperand.ret; - dag InsNoData = !if(!empty(vaddrList), - (ins SReg_128:$srsrc, SCSrc_b32:$soffset, - offset:$offset, FORMAT:$format, CPol:$cpol, SWZ:$swz), - (ins vaddrClass:$vaddr, SReg_128:$srsrc, SCSrc_b32:$soffset, - offset:$offset, FORMAT:$format, CPol:$cpol, SWZ:$swz) - ); - dag InsData = !if(!empty(vaddrList), - (ins vdata_op:$vdata, SReg_128:$srsrc, - SCSrc_b32:$soffset, offset:$offset, FORMAT:$format, CPol:$cpol, - SWZ:$swz), - (ins vdata_op:$vdata, vaddrClass:$vaddr, SReg_128:$srsrc, - SCSrc_b32:$soffset, offset:$offset, FORMAT:$format, CPol:$cpol, - SWZ:$swz) - ); - dag ret = !if(!empty(vdataList), InsNoData, InsData); + + dag NonVaddrInputs = (ins SReg_128:$srsrc, SCSrc_b32:$soffset, offset:$offset, FORMAT:$format, CPol:$cpol, SWZ:$swz); + dag Inputs = !if(!empty(vaddrList), NonVaddrInputs, !con((ins vaddrClass:$vaddr), NonVaddrInputs)); + dag ret = !if(!empty(vdataList), Inputs, !con((ins vdata_op:$vdata), Inputs)); } + class getMTBUFIns vdataList=[]> { dag ret = !if(!eq(addrKind, BUFAddrKind.Offset), getMTBUFInsDA.ret, @@ -178,7 +186,7 @@ !if(!eq(addrKind, BUFAddrKind.Addr64), "$vaddr, $srsrc,$format $soffset addr64", ""))))); - string ret = Pfx # "$offset"; + string ret = " $vdata, " # Pfx # "$offset$cpol$swz"; } class MTBUF_SetupAddr { @@ -203,7 +211,7 @@ : MTBUF_Pseudo.ret:$vdata), getMTBUFIns.ret, - " $vdata, " # getMTBUFAsmOps.ret # "$cpol$swz", + getMTBUFAsmOps.ret, pattern>, MTBUF_SetupAddr { let PseudoInstr = opName # "_" # getAddrName.ret; @@ -244,7 +252,7 @@ : MTBUF_Pseudo.ret, - " $vdata, " # getMTBUFAsmOps.ret # "$cpol$swz", + getMTBUFAsmOps.ret, pattern>, MTBUF_SetupAddr { let PseudoInstr = opName # "_" # getAddrName.ret; @@ -287,48 +295,11 @@ class MUBUF_Pseudo pattern=[]> : - InstSI, - SIMCInstr { - - let isPseudo = 1; - let isCodeGenOnly = 1; - let Size = 8; - let UseNamedOperandTable = 1; + BUF_Pseudo { - string Mnemonic = opName; - string AsmOperands = asmOps; - - Instruction Opcode = !cast(NAME); Instruction BaseOpcode = !cast(MUBUFGetBaseOpcode.ret); - - let VM_CNT = 1; - let EXP_CNT = 1; let MUBUF = 1; - let Uses = [EXEC]; - let hasSideEffects = 0; - let SchedRW = [WriteVMEM]; - let AsmMatchConverter = "cvtMubuf"; - - bits<1> offen = 0; - bits<1> idxen = 0; - bits<1> addr64 = 0; - bits<1> lds = 0; - bits<1> has_vdata = !not(lds); - bits<1> has_vaddr = 1; - bits<1> has_glc = 1; - bits<1> has_dlc = 1; - bits<1> glc_value = 0; // the value for glc if no such operand - bits<1> dlc_value = 0; // the value for dlc if no such operand - bits<1> has_srsrc = 1; - bits<1> has_soffset = 1; - bits<1> has_offset = 1; - bits<1> has_slc = 1; - bits<1> tfe = ?; - bits<4> elements = 0; - bits<1> has_sccb = 1; - bits<1> sccb_value = 0; - bits<1> IsBufferInv = 0; } class MUBUF_Real : @@ -369,7 +340,6 @@ bits<1> acc = !if(ps.has_vdata, vdata{9}, !if(ps.lds, ?, 0)); } - // For cache invalidation instructions. class MUBUF_Invalidate : MUBUF_Pseudo { @@ -416,19 +386,10 @@ RegisterClass vdataClass = !if(!empty(vdataList), ?, !head(vdataList)); RegisterClass vaddrClass = !if(!empty(vaddrList), ?, !head(vaddrList)); RegisterOperand vdata_op = getLdStVDataRegisterOperand.ret; - dag InsNoData = !if(!empty(vaddrList), - (ins SReg_128:$srsrc, SCSrc_b32:$soffset, - offset:$offset, CPol_0:$cpol), - (ins vaddrClass:$vaddr, SReg_128:$srsrc, SCSrc_b32:$soffset, - offset:$offset, CPol_0:$cpol) - ); - dag InsData = !if(!empty(vaddrList), - (ins vdata_op:$vdata, SReg_128:$srsrc, - SCSrc_b32:$soffset, offset:$offset, CPol_0:$cpol), - (ins vdata_op:$vdata, vaddrClass:$vaddr, SReg_128:$srsrc, - SCSrc_b32:$soffset, offset:$offset, CPol_0:$cpol) - ); - dag ret = !con(!if(!empty(vdataList), InsNoData, InsData), (ins SWZ_0:$swz)); + + dag NonVaddrInputs = (ins SReg_128:$srsrc, SCSrc_b32:$soffset, offset:$offset, CPol_0:$cpol, SWZ_0:$swz); + dag Inputs = !if(!empty(vaddrList), NonVaddrInputs, !con((ins vaddrClass:$vaddr), NonVaddrInputs)); + dag ret = !if(!empty(vdataList), Inputs, !con((ins vdata_op:$vdata), Inputs)); } class getMUBUFElements { @@ -460,15 +421,22 @@ (ins)))))); } -class getMUBUFAsmOps { - string Pfx = +class getMUBUFAsmOps { + string Vdata = !if(noVdata, " ", " $vdata, "); + string Lds = !if(isLds, " lds", ""); + string TFE = !if(isTFE, " tfe", ""); + string MainArgs = !if(!eq(addrKind, BUFAddrKind.Offset), "off, $srsrc, $soffset", !if(!eq(addrKind, BUFAddrKind.OffEn), "$vaddr, $srsrc, $soffset offen", !if(!eq(addrKind, BUFAddrKind.IdxEn), "$vaddr, $srsrc, $soffset idxen", !if(!eq(addrKind, BUFAddrKind.BothEn), "$vaddr, $srsrc, $soffset idxen offen", !if(!eq(addrKind, BUFAddrKind.Addr64), "$vaddr, $srsrc, $soffset addr64", ""))))); - string ret = Pfx # "$offset"; + string Offset = "$offset"; + string OtherArgs = "$cpol"; + string Swz = !if(isSwz, "$swz", ""); + + string ret = Vdata # MainArgs # Offset # OtherArgs # Lds # TFE # Swz; } class MUBUF_SetupAddr { @@ -499,8 +467,7 @@ !if(!or(isLds, isLdsOpc), (outs), (outs vdata_op:$vdata)), !con(getMUBUFIns.ret, !if(HasTiedDest, (ins vdata_op:$vdata_in), (ins))), - !if(!or(isLds, isLdsOpc), " ", " $vdata, ") # getMUBUFAsmOps.ret # "$cpol" # - !if(isLds, " lds", "") # !if(isTFE, " tfe", "") # "$swz", + getMUBUFAsmOps.ret, pattern>, MUBUF_SetupAddr { let PseudoInstr = opName # !if(isLds, "_lds", "") # !if(isTFE, "_tfe", "") # @@ -595,8 +562,7 @@ : MUBUF_Pseudo.ret], isTFE>.ret, - " $vdata, " # getMUBUFAsmOps.ret # "$cpol" # - !if(isTFE, " tfe", "") # "$swz", + getMUBUFAsmOps.ret, pattern>, MUBUF_SetupAddr { let PseudoInstr = opName # "_" # !if(isTFE, "_tfe", "") # @@ -663,19 +629,13 @@ list vaddrList=[]> { RegisterClass vaddrClass = !if(!empty(vaddrList), ?, !head(vaddrList)); RegisterOperand vdata_op = getLdStRegisterOperand.ret; - dag ret = !if(vdata_in, - !if(!empty(vaddrList), - (ins vdata_op:$vdata_in, - SReg_128:$srsrc, SCSrc_b32:$soffset, offset:$offset, CPol_GLC1:$cpol), - (ins vdata_op:$vdata_in, vaddrClass:$vaddr, - SReg_128:$srsrc, SCSrc_b32:$soffset, offset:$offset, CPol_GLC1:$cpol) - ), - !if(!empty(vaddrList), - (ins vdata_op:$vdata, - SReg_128:$srsrc, SCSrc_b32:$soffset, offset:$offset, CPol_0:$cpol), - (ins vdata_op:$vdata, vaddrClass:$vaddr, - SReg_128:$srsrc, SCSrc_b32:$soffset, offset:$offset, CPol_0:$cpol) - )); + + dag VData = !if(vdata_in, (ins vdata_op:$vdata_in), (ins vdata_op:$vdata)); + dag Data = !if(!empty(vaddrList), VData, !con(VData, (ins vaddrClass:$vaddr))); + dag MainInputs = (ins SReg_128:$srsrc, SCSrc_b32:$soffset, offset:$offset); + dag CPol = !if(vdata_in, (ins CPol_GLC1:$cpol), (ins CPol_0:$cpol)); + + dag ret = !con(Data, !con(MainInputs, CPol)); } class getMUBUFAtomicIns.ret, - " $vdata, " # getMUBUFAsmOps.ret # "$cpol", + getMUBUFAsmOps.ret, pattern>, AtomicNoRet.ret, 0> { let PseudoInstr = opName # "_" # getAddrName.ret; @@ -748,7 +708,7 @@ : MUBUF_Atomic_Pseudo.ret, - " $vdata, " # getMUBUFAsmOps.ret # "$cpol", + getMUBUFAsmOps.ret, pattern>, AtomicNoRet.ret, 1> { let PseudoInstr = opName # "_rtn_" # getAddrName.ret;