diff options
Diffstat (limited to 'lib/Target/AMDGPU/SIInstrFormats.td')
-rw-r--r-- | lib/Target/AMDGPU/SIInstrFormats.td | 68 |
1 files changed, 47 insertions, 21 deletions
diff --git a/lib/Target/AMDGPU/SIInstrFormats.td b/lib/Target/AMDGPU/SIInstrFormats.td index 65ffc27b8b60..561a16c3e351 100644 --- a/lib/Target/AMDGPU/SIInstrFormats.td +++ b/lib/Target/AMDGPU/SIInstrFormats.td @@ -1,9 +1,8 @@ //===-- SIInstrFormats.td - SI Instruction Encodings ----------------------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -11,19 +10,9 @@ // //===----------------------------------------------------------------------===// -def isGCN : Predicate<"Subtarget->getGeneration() " - ">= AMDGPUSubtarget::SOUTHERN_ISLANDS">, - AssemblerPredicate<"FeatureGCN">; -def isSI : Predicate<"Subtarget->getGeneration() " - "== AMDGPUSubtarget::SOUTHERN_ISLANDS">, - AssemblerPredicate<"FeatureSouthernIslands">; - - class InstSI <dag outs, dag ins, string asm = "", list<dag> pattern = []> : AMDGPUInst<outs, ins, asm, pattern>, GCNPredicateControl { - let SubtargetPredicate = isGCN; - // Low bits - basic encoding information. field bit SALU = 0; field bit VALU = 0; @@ -121,10 +110,20 @@ class InstSI <dag outs, dag ins, string asm = "", // This bit indicates that this is a D16 buffer instruction. field bit D16Buf = 0; + // This field indicates that FLAT instruction accesses FLAT_GLBL or + // FLAT_SCRATCH segment. Must be 0 for non-FLAT instructions. + field bit IsNonFlatSeg = 0; + // This bit indicates that this uses the floating point double precision // rounding mode flags field bit FPDPRounding = 0; + // Instruction is FP atomic. + field bit FPAtomic = 0; + + // This bit indicates that this is one of MFMA instructions. + field bit IsMAI = 0; + // These need to be kept in sync with the enum in SIInstrFlags. let TSFlags{0} = SALU; let TSFlags{1} = VALU; @@ -182,7 +181,13 @@ class InstSI <dag outs, dag ins, string asm = "", let TSFlags{50} = D16Buf; - let TSFlags{51} = FPDPRounding; + let TSFlags{51} = IsNonFlatSeg; + + let TSFlags{52} = FPDPRounding; + + let TSFlags{53} = FPAtomic; + + let TSFlags{54} = IsMAI; let SchedRW = [Write32Bit]; @@ -251,38 +256,59 @@ class VINTRPe <bits<2> op> : Enc32 { let Inst{31-26} = 0x32; // encoding } -class MIMGe <bits<7> op> : Enc64 { +class MIMGe : Enc64 { bits<8> vdata; bits<4> dmask; bits<1> unorm; bits<1> glc; - bits<1> da; bits<1> r128; bits<1> tfe; bits<1> lwe; bits<1> slc; bit d16; - bits<8> vaddr; bits<7> srsrc; bits<7> ssamp; let Inst{11-8} = dmask; let Inst{12} = unorm; let Inst{13} = glc; - let Inst{14} = da; let Inst{15} = r128; let Inst{16} = tfe; let Inst{17} = lwe; - let Inst{24-18} = op; let Inst{25} = slc; let Inst{31-26} = 0x3c; - let Inst{39-32} = vaddr; let Inst{47-40} = vdata; let Inst{52-48} = srsrc{6-2}; let Inst{57-53} = ssamp{6-2}; let Inst{63} = d16; } +class MIMGe_gfx6789 <bits<8> op> : MIMGe { + bits<8> vaddr; + bits<1> da; + + let Inst{0} = op{7}; + let Inst{14} = da; + let Inst{24-18} = op{6-0}; + let Inst{39-32} = vaddr; +} + +class MIMGe_gfx10 <bits<8> op> : MIMGe { + bits<8> vaddr0; + bits<3> dim; + bits<2> nsa; + bits<1> dlc; + bits<1> a16 = 0; // TODO: this should be an operand + + let Inst{0} = op{7}; + let Inst{2-1} = nsa; + let Inst{5-3} = dim; + let Inst{7} = dlc; + let Inst{24-18} = op{6-0}; + let Inst{39-32} = vaddr0; + let Inst{62} = a16; +} + class EXPe : Enc64 { bits<4> en; bits<6> tgt; |