| //===-- LDSDIRInstructions.td - LDS Direct 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 | |
| // | |
| //===----------------------------------------------------------------------===// | |
| //===----------------------------------------------------------------------===// | |
| // LDSDIR encoding | |
| //===----------------------------------------------------------------------===// | |
| class LDSDIRe<bits<2> op, bit is_direct> : Enc32 { | |
| // encoding fields | |
| bits<2> attrchan; | |
| bits<6> attr; | |
| bits<4> waitvdst; | |
| bits<8> vdst; | |
| // encoding | |
| let Inst{31-24} = 0xce; // encoding | |
| let Inst{23-22} = 0x0; // reserved | |
| let Inst{21-20} = op; | |
| let Inst{19-16} = waitvdst; | |
| let Inst{15-10} = !if(is_direct, ?, attr); | |
| let Inst{9-8} = !if(is_direct, ?, attrchan); | |
| let Inst{7-0} = vdst; | |
| } | |
| //===----------------------------------------------------------------------===// | |
| // LDSDIR Classes | |
| //===----------------------------------------------------------------------===// | |
| class LDSDIR_getIns<bit direct> { | |
| dag ret = !if(direct, | |
| (ins wait_vdst:$waitvdst), | |
| (ins Attr:$attr, AttrChan:$attrchan, wait_vdst:$waitvdst) | |
| ); | |
| } | |
| class LDSDIR_Common<string opName, string asm = "", bit direct> : InstSI< | |
| (outs VGPR_32:$vdst), | |
| LDSDIR_getIns<direct>.ret, | |
| asm> { | |
| let LDSDIR = 1; | |
| let EXP_CNT = 1; | |
| let hasSideEffects = 0; | |
| let mayLoad = 1; | |
| let mayStore = 0; | |
| string Mnemonic = opName; | |
| let UseNamedOperandTable = 1; | |
| let Uses = [M0, EXEC]; | |
| let DisableWQM = 0; | |
| let SchedRW = [WriteLDS]; | |
| bit is_direct; | |
| let is_direct = direct; | |
| } | |
| class LDSDIR_Pseudo<string opName, bit direct> : | |
| LDSDIR_Common<opName, "", direct>, | |
| SIMCInstr<opName, SIEncodingFamily.NONE> { | |
| let isPseudo = 1; | |
| let isCodeGenOnly = 1; | |
| } | |
| class LDSDIR_getAsm<bit direct> { | |
| string ret = !if(direct, | |
| " $vdst$waitvdst", | |
| " $vdst, $attr$attrchan$waitvdst" | |
| ); | |
| } | |
| class LDSDIR_Real<bits<2> op, LDSDIR_Pseudo lds, int subtarget> : | |
| LDSDIR_Common<lds.Mnemonic, | |
| lds.Mnemonic # LDSDIR_getAsm<lds.is_direct>.ret, | |
| lds.is_direct>, | |
| SIMCInstr <lds.Mnemonic, subtarget>, | |
| LDSDIRe<op, lds.is_direct> { | |
| let isPseudo = 0; | |
| let isCodeGenOnly = 0; | |
| } | |
| //===----------------------------------------------------------------------===// | |
| // LDS Direct Instructions | |
| //===----------------------------------------------------------------------===// | |
| def LDS_DIRECT_LOAD : LDSDIR_Pseudo<"lds_direct_load", 1>; | |
| def LDS_PARAM_LOAD : LDSDIR_Pseudo<"lds_param_load", 0>; | |
| def : GCNPat < | |
| (f32 (int_amdgcn_lds_direct_load M0)), | |
| (LDS_DIRECT_LOAD 0) | |
| >; | |
| def : GCNPat < | |
| (f32 (int_amdgcn_lds_param_load timm:$attrchan, timm:$attr, M0)), | |
| (LDS_PARAM_LOAD timm:$attr, timm:$attrchan, 0) | |
| >; | |
| //===----------------------------------------------------------------------===// | |
| // GFX11+ | |
| //===----------------------------------------------------------------------===// | |
| multiclass LDSDIR_Real_gfx11<bits<2> op, LDSDIR_Pseudo lds = !cast<LDSDIR_Pseudo>(NAME)> { | |
| def _gfx11 : LDSDIR_Real<op, lds, SIEncodingFamily.GFX11> { | |
| let AssemblerPredicate = isGFX11Plus; | |
| let DecoderNamespace = "GFX11"; | |
| } | |
| } | |
| defm LDS_PARAM_LOAD : LDSDIR_Real_gfx11<0x0>; | |
| defm LDS_DIRECT_LOAD : LDSDIR_Real_gfx11<0x1>; |