LLVM 20.0.0git
AMDGPUBaseInfo.h
Go to the documentation of this file.
1//===- AMDGPUBaseInfo.h - Top level definitions for AMDGPU ------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_LIB_TARGET_AMDGPU_UTILS_AMDGPUBASEINFO_H
10#define LLVM_LIB_TARGET_AMDGPU_UTILS_AMDGPUBASEINFO_H
11
12#include "AMDGPUSubtarget.h"
13#include "SIDefines.h"
14#include "llvm/IR/CallingConv.h"
15#include "llvm/IR/InstrTypes.h"
16#include "llvm/IR/Module.h"
18#include <array>
19#include <functional>
20#include <utility>
21
23
24namespace llvm {
25
26struct Align;
27class Argument;
28class Function;
29class GlobalValue;
30class MCInstrInfo;
31class MCRegisterClass;
32class MCRegisterInfo;
33class MCSubtargetInfo;
34class StringRef;
35class Triple;
36class raw_ostream;
37
38namespace AMDGPU {
39
40struct AMDGPUMCKernelCodeT;
41struct IsaVersion;
42
43/// Generic target versions emitted by this version of LLVM.
44///
45/// These numbers are incremented every time a codegen breaking change occurs
46/// within a generic family.
47namespace GenericVersion {
48static constexpr unsigned GFX9 = 1;
49static constexpr unsigned GFX9_4 = 1;
50static constexpr unsigned GFX10_1 = 1;
51static constexpr unsigned GFX10_3 = 1;
52static constexpr unsigned GFX11 = 1;
53static constexpr unsigned GFX12 = 1;
54} // namespace GenericVersion
55
56enum { AMDHSA_COV4 = 4, AMDHSA_COV5 = 5, AMDHSA_COV6 = 6 };
57
58enum class FPType { None, FP4, FP8 };
59
60/// \returns True if \p STI is AMDHSA.
61bool isHsaAbi(const MCSubtargetInfo &STI);
62
63/// \returns Code object version from the IR module flag.
64unsigned getAMDHSACodeObjectVersion(const Module &M);
65
66/// \returns Code object version from ELF's e_ident[EI_ABIVERSION].
67unsigned getAMDHSACodeObjectVersion(unsigned ABIVersion);
68
69/// \returns The default HSA code object version. This should only be used when
70/// we lack a more accurate CodeObjectVersion value (e.g. from the IR module
71/// flag or a .amdhsa_code_object_version directive)
73
74/// \returns ABIVersion suitable for use in ELF's e_ident[EI_ABIVERSION]. \param
75/// CodeObjectVersion is a value returned by getAMDHSACodeObjectVersion().
76uint8_t getELFABIVersion(const Triple &OS, unsigned CodeObjectVersion);
77
78/// \returns The offset of the multigrid_sync_arg argument from implicitarg_ptr
79unsigned getMultigridSyncArgImplicitArgPosition(unsigned COV);
80
81/// \returns The offset of the hostcall pointer argument from implicitarg_ptr
82unsigned getHostcallImplicitArgPosition(unsigned COV);
83
84unsigned getDefaultQueueImplicitArgPosition(unsigned COV);
85unsigned getCompletionActionImplicitArgPosition(unsigned COV);
86
88 unsigned Format;
89 unsigned BitsPerComp;
90 unsigned NumComponents;
91 unsigned NumFormat;
92 unsigned DataFormat;
93};
94
99};
100
102 unsigned Opcode;
103 unsigned F8F8Opcode;
106};
107
109 unsigned Opcode;
110};
111
112#define GET_MIMGBaseOpcode_DECL
113#define GET_MIMGDim_DECL
114#define GET_MIMGEncoding_DECL
115#define GET_MIMGLZMapping_DECL
116#define GET_MIMGMIPMapping_DECL
117#define GET_MIMGBiASMapping_DECL
118#define GET_MAIInstInfoTable_DECL
119#define GET_MAIInstInfoTable_DECL
120#define GET_isMFMA_F8F6F4Table_DECL
121#define GET_isCvtScaleF32_F32F16ToF8F4Table_DECL
122#include "AMDGPUGenSearchableTables.inc"
123
124namespace IsaInfo {
125
126enum {
127 // The closed Vulkan driver sets 96, which limits the wave count to 8 but
128 // doesn't spill SGPRs as much as when 80 is set.
130 TRAP_NUM_SGPRS = 16
132
133enum class TargetIDSetting {
135 Any,
136 Off,
137 On
138};
139
141private:
142 const MCSubtargetInfo &STI;
143 TargetIDSetting XnackSetting;
144 TargetIDSetting SramEccSetting;
145
146public:
147 explicit AMDGPUTargetID(const MCSubtargetInfo &STI);
148 ~AMDGPUTargetID() = default;
149
150 /// \return True if the current xnack setting is not "Unsupported".
151 bool isXnackSupported() const {
152 return XnackSetting != TargetIDSetting::Unsupported;
153 }
154
155 /// \returns True if the current xnack setting is "On" or "Any".
156 bool isXnackOnOrAny() const {
157 return XnackSetting == TargetIDSetting::On ||
158 XnackSetting == TargetIDSetting::Any;
159 }
160
161 /// \returns True if current xnack setting is "On" or "Off",
162 /// false otherwise.
163 bool isXnackOnOrOff() const {
166 }
167
168 /// \returns The current xnack TargetIDSetting, possible options are
169 /// "Unsupported", "Any", "Off", and "On".
171 return XnackSetting;
172 }
173
174 /// Sets xnack setting to \p NewXnackSetting.
175 void setXnackSetting(TargetIDSetting NewXnackSetting) {
176 XnackSetting = NewXnackSetting;
177 }
178
179 /// \return True if the current sramecc setting is not "Unsupported".
180 bool isSramEccSupported() const {
181 return SramEccSetting != TargetIDSetting::Unsupported;
182 }
183
184 /// \returns True if the current sramecc setting is "On" or "Any".
185 bool isSramEccOnOrAny() const {
186 return SramEccSetting == TargetIDSetting::On ||
187 SramEccSetting == TargetIDSetting::Any;
188 }
189
190 /// \returns True if current sramecc setting is "On" or "Off",
191 /// false otherwise.
192 bool isSramEccOnOrOff() const {
195 }
196
197 /// \returns The current sramecc TargetIDSetting, possible options are
198 /// "Unsupported", "Any", "Off", and "On".
200 return SramEccSetting;
201 }
202
203 /// Sets sramecc setting to \p NewSramEccSetting.
204 void setSramEccSetting(TargetIDSetting NewSramEccSetting) {
205 SramEccSetting = NewSramEccSetting;
206 }
207
210
211 /// \returns String representation of an object.
212 std::string toString() const;
213};
214
215/// \returns Wavefront size for given subtarget \p STI.
216unsigned getWavefrontSize(const MCSubtargetInfo *STI);
217
218/// \returns Local memory size in bytes for given subtarget \p STI.
219unsigned getLocalMemorySize(const MCSubtargetInfo *STI);
220
221/// \returns Maximum addressable local memory size in bytes for given subtarget
222/// \p STI.
224
225/// \returns Number of execution units per compute unit for given subtarget \p
226/// STI.
227unsigned getEUsPerCU(const MCSubtargetInfo *STI);
228
229/// \returns Maximum number of work groups per compute unit for given subtarget
230/// \p STI and limited by given \p FlatWorkGroupSize.
231unsigned getMaxWorkGroupsPerCU(const MCSubtargetInfo *STI,
232 unsigned FlatWorkGroupSize);
233
234/// \returns Minimum number of waves per execution unit for given subtarget \p
235/// STI.
236unsigned getMinWavesPerEU(const MCSubtargetInfo *STI);
237
238/// \returns Maximum number of waves per execution unit for given subtarget \p
239/// STI without any kind of limitation.
240unsigned getMaxWavesPerEU(const MCSubtargetInfo *STI);
241
242/// \returns Number of waves per execution unit required to support the given \p
243/// FlatWorkGroupSize.
245 unsigned FlatWorkGroupSize);
246
247/// \returns Minimum flat work group size for given subtarget \p STI.
248unsigned getMinFlatWorkGroupSize(const MCSubtargetInfo *STI);
249
250/// \returns Maximum flat work group size for given subtarget \p STI.
251unsigned getMaxFlatWorkGroupSize(const MCSubtargetInfo *STI);
252
253/// \returns Number of waves per work group for given subtarget \p STI and
254/// \p FlatWorkGroupSize.
255unsigned getWavesPerWorkGroup(const MCSubtargetInfo *STI,
256 unsigned FlatWorkGroupSize);
257
258/// \returns SGPR allocation granularity for given subtarget \p STI.
259unsigned getSGPRAllocGranule(const MCSubtargetInfo *STI);
260
261/// \returns SGPR encoding granularity for given subtarget \p STI.
262unsigned getSGPREncodingGranule(const MCSubtargetInfo *STI);
263
264/// \returns Total number of SGPRs for given subtarget \p STI.
265unsigned getTotalNumSGPRs(const MCSubtargetInfo *STI);
266
267/// \returns Addressable number of SGPRs for given subtarget \p STI.
268unsigned getAddressableNumSGPRs(const MCSubtargetInfo *STI);
269
270/// \returns Minimum number of SGPRs that meets the given number of waves per
271/// execution unit requirement for given subtarget \p STI.
272unsigned getMinNumSGPRs(const MCSubtargetInfo *STI, unsigned WavesPerEU);
273
274/// \returns Maximum number of SGPRs that meets the given number of waves per
275/// execution unit requirement for given subtarget \p STI.
276unsigned getMaxNumSGPRs(const MCSubtargetInfo *STI, unsigned WavesPerEU,
277 bool Addressable);
278
279/// \returns Number of extra SGPRs implicitly required by given subtarget \p
280/// STI when the given special registers are used.
281unsigned getNumExtraSGPRs(const MCSubtargetInfo *STI, bool VCCUsed,
282 bool FlatScrUsed, bool XNACKUsed);
283
284/// \returns Number of extra SGPRs implicitly required by given subtarget \p
285/// STI when the given special registers are used. XNACK is inferred from
286/// \p STI.
287unsigned getNumExtraSGPRs(const MCSubtargetInfo *STI, bool VCCUsed,
288 bool FlatScrUsed);
289
290/// \returns Number of SGPR blocks needed for given subtarget \p STI when
291/// \p NumSGPRs are used. \p NumSGPRs should already include any special
292/// register counts.
293unsigned getNumSGPRBlocks(const MCSubtargetInfo *STI, unsigned NumSGPRs);
294
295/// \returns VGPR allocation granularity for given subtarget \p STI.
296///
297/// For subtargets which support it, \p EnableWavefrontSize32 should match
298/// the ENABLE_WAVEFRONT_SIZE32 kernel descriptor field.
299unsigned
301 std::optional<bool> EnableWavefrontSize32 = std::nullopt);
302
303/// \returns VGPR encoding granularity for given subtarget \p STI.
304///
305/// For subtargets which support it, \p EnableWavefrontSize32 should match
306/// the ENABLE_WAVEFRONT_SIZE32 kernel descriptor field.
308 const MCSubtargetInfo *STI,
309 std::optional<bool> EnableWavefrontSize32 = std::nullopt);
310
311/// \returns Total number of VGPRs for given subtarget \p STI.
312unsigned getTotalNumVGPRs(const MCSubtargetInfo *STI);
313
314/// \returns Addressable number of architectural VGPRs for a given subtarget \p
315/// STI.
317
318/// \returns Addressable number of VGPRs for given subtarget \p STI.
319unsigned getAddressableNumVGPRs(const MCSubtargetInfo *STI);
320
321/// \returns Minimum number of VGPRs that meets given number of waves per
322/// execution unit requirement for given subtarget \p STI.
323unsigned getMinNumVGPRs(const MCSubtargetInfo *STI, unsigned WavesPerEU);
324
325/// \returns Maximum number of VGPRs that meets given number of waves per
326/// execution unit requirement for given subtarget \p STI.
327unsigned getMaxNumVGPRs(const MCSubtargetInfo *STI, unsigned WavesPerEU);
328
329/// \returns Number of waves reachable for a given \p NumVGPRs usage for given
330/// subtarget \p STI.
332 unsigned NumVGPRs);
333
334/// \returns Number of waves reachable for a given \p NumVGPRs usage, \p Granule
335/// size, \p MaxWaves possible, and \p TotalNumVGPRs available.
336unsigned getNumWavesPerEUWithNumVGPRs(unsigned NumVGPRs, unsigned Granule,
337 unsigned MaxWaves,
338 unsigned TotalNumVGPRs);
339
340/// \returns Occupancy for a given \p SGPRs usage, \p MaxWaves possible, and \p
341/// Gen.
342unsigned getOccupancyWithNumSGPRs(unsigned SGPRs, unsigned MaxWaves,
344
345/// \returns Number of VGPR blocks needed for given subtarget \p STI when
346/// \p NumVGPRs are used. We actually return the number of blocks -1, since
347/// that's what we encode.
348///
349/// For subtargets which support it, \p EnableWavefrontSize32 should match the
350/// ENABLE_WAVEFRONT_SIZE32 kernel descriptor field.
352 const MCSubtargetInfo *STI, unsigned NumVGPRs,
353 std::optional<bool> EnableWavefrontSize32 = std::nullopt);
354
355/// \returns Number of VGPR blocks that need to be allocated for the given
356/// subtarget \p STI when \p NumVGPRs are used.
358 const MCSubtargetInfo *STI, unsigned NumVGPRs,
359 std::optional<bool> EnableWavefrontSize32 = std::nullopt);
360
361} // end namespace IsaInfo
362
363// Represents a field in an encoded value.
364template <unsigned HighBit, unsigned LowBit, unsigned D = 0>
366 static_assert(HighBit >= LowBit, "Invalid bit range!");
367 static constexpr unsigned Offset = LowBit;
368 static constexpr unsigned Width = HighBit - LowBit + 1;
369
371 static constexpr ValueType Default = D;
372
375
376 constexpr uint64_t encode() const { return Value; }
377 static ValueType decode(uint64_t Encoded) { return Encoded; }
378};
379
380// Represents a single bit in an encoded value.
381template <unsigned Bit, unsigned D = 0>
383
384// A helper for encoding and decoding multiple fields.
385template <typename... Fields> struct EncodingFields {
386 static constexpr uint64_t encode(Fields... Values) {
387 return ((Values.encode() << Values.Offset) | ...);
388 }
389
390 static std::tuple<typename Fields::ValueType...> decode(uint64_t Encoded) {
391 return {Fields::decode((Encoded >> Fields::Offset) &
392 maxUIntN(Fields::Width))...};
393 }
394};
395
397int16_t getNamedOperandIdx(uint16_t Opcode, uint16_t NamedIdx);
398
400inline bool hasNamedOperand(uint64_t Opcode, uint64_t NamedIdx) {
401 return getNamedOperandIdx(Opcode, NamedIdx) != -1;
402}
403
406
408 MIMGBaseOpcode BaseOpcode;
409 bool Store;
410 bool Atomic;
414
417 bool G16;
420 bool HasD16;
421 bool MSAA;
422 bool BVH;
423 bool A16;
425};
426
428const MIMGBaseOpcodeInfo *getMIMGBaseOpcode(unsigned Opc);
429
431const MIMGBaseOpcodeInfo *getMIMGBaseOpcodeInfo(unsigned BaseOpcode);
432
434 MIMGDim Dim;
437 bool MSAA;
438 bool DA;
440 const char *AsmSuffix;
441};
442
444const MIMGDimInfo *getMIMGDimInfo(unsigned DimEnum);
445
448
451
453 MIMGBaseOpcode L;
454 MIMGBaseOpcode LZ;
455};
456
458 MIMGBaseOpcode MIP;
459 MIMGBaseOpcode NONMIP;
460};
461
463 MIMGBaseOpcode Bias;
464 MIMGBaseOpcode NoBias;
465};
466
468 MIMGBaseOpcode Offset;
469 MIMGBaseOpcode NoOffset;
470};
471
473 MIMGBaseOpcode G;
474 MIMGBaseOpcode G16;
475};
476
479
481 unsigned Opcode2Addr;
482 unsigned Opcode3Addr;
483};
484
487
490
493
496
498int getMIMGOpcode(unsigned BaseOpcode, unsigned MIMGEncoding,
499 unsigned VDataDwords, unsigned VAddrDwords);
500
502int getMaskedMIMGOp(unsigned Opc, unsigned NewChannels);
503
505unsigned getAddrSizeMIMGOp(const MIMGBaseOpcodeInfo *BaseOpcode,
506 const MIMGDimInfo *Dim, bool IsA16,
507 bool IsG16Supported);
508
509struct MIMGInfo {
516};
517
519const MIMGInfo *getMIMGInfo(unsigned Opc);
520
522int getMTBUFBaseOpcode(unsigned Opc);
523
525int getMTBUFOpcode(unsigned BaseOpc, unsigned Elements);
526
528int getMTBUFElements(unsigned Opc);
529
531bool getMTBUFHasVAddr(unsigned Opc);
532
534bool getMTBUFHasSrsrc(unsigned Opc);
535
537bool getMTBUFHasSoffset(unsigned Opc);
538
540int getMUBUFBaseOpcode(unsigned Opc);
541
543int getMUBUFOpcode(unsigned BaseOpc, unsigned Elements);
544
546int getMUBUFElements(unsigned Opc);
547
549bool getMUBUFHasVAddr(unsigned Opc);
550
552bool getMUBUFHasSrsrc(unsigned Opc);
553
555bool getMUBUFHasSoffset(unsigned Opc);
556
558bool getMUBUFIsBufferInv(unsigned Opc);
559
561bool getMUBUFTfe(unsigned Opc);
562
564bool getSMEMIsBuffer(unsigned Opc);
565
567bool getVOP1IsSingle(unsigned Opc);
568
570bool getVOP2IsSingle(unsigned Opc);
571
573bool getVOP3IsSingle(unsigned Opc);
574
576bool isVOPC64DPP(unsigned Opc);
577
579bool isVOPCAsmOnly(unsigned Opc);
580
581/// Returns true if MAI operation is a double precision GEMM.
583bool getMAIIsDGEMM(unsigned Opc);
584
586bool getMAIIsGFX940XDL(unsigned Opc);
587
588struct CanBeVOPD {
589 bool X;
590 bool Y;
591};
592
593/// \returns SIEncodingFamily used for VOPD encoding on a \p ST.
595unsigned getVOPDEncodingFamily(const MCSubtargetInfo &ST);
596
598CanBeVOPD getCanBeVOPD(unsigned Opc);
599
601uint8_t mfmaScaleF8F6F4FormatToNumRegs(unsigned EncodingVal);
602
605 unsigned BLGP,
606 unsigned F8F8Opcode);
607
610 uint8_t NumComponents,
611 uint8_t NumFormat,
612 const MCSubtargetInfo &STI);
615 const MCSubtargetInfo &STI);
616
618int getMCOpcode(uint16_t Opcode, unsigned Gen);
619
621unsigned getVOPDOpcode(unsigned Opc);
622
624int getVOPDFull(unsigned OpX, unsigned OpY, unsigned EncodingFamily);
625
627bool isVOPD(unsigned Opc);
628
630bool isMAC(unsigned Opc);
631
633bool isPermlane16(unsigned Opc);
634
636bool isGenericAtomic(unsigned Opc);
637
639bool isCvt_F32_Fp8_Bf8_e64(unsigned Opc);
640
641namespace VOPD {
642
643enum Component : unsigned {
644 DST = 0,
648
653
654// LSB mask for VGPR banks per VOPD component operand.
655// 4 banks result in a mask 3, setting 2 lower bits.
656constexpr unsigned VOPD_VGPR_BANK_MASKS[] = {1, 3, 3, 1};
657
658enum ComponentIndex : unsigned { X = 0, Y = 1 };
660constexpr unsigned COMPONENTS_NUM = 2;
661
662// Properties of VOPD components.
664private:
665 unsigned SrcOperandsNum = 0;
666 unsigned MandatoryLiteralIdx = ~0u;
667 bool HasSrc2Acc = false;
668
669public:
670 ComponentProps() = default;
671 ComponentProps(const MCInstrDesc &OpDesc);
672
673 // Return the total number of src operands this component has.
674 unsigned getCompSrcOperandsNum() const { return SrcOperandsNum; }
675
676 // Return the number of src operands of this component visible to the parser.
678 return SrcOperandsNum - HasSrc2Acc;
679 }
680
681 // Return true iif this component has a mandatory literal.
682 bool hasMandatoryLiteral() const { return MandatoryLiteralIdx != ~0u; }
683
684 // If this component has a mandatory literal, return component operand
685 // index of this literal (i.e. either Component::SRC1 or Component::SRC2).
688 return MandatoryLiteralIdx;
689 }
690
691 // Return true iif this component has operand
692 // with component index CompSrcIdx and this operand may be a register.
693 bool hasRegSrcOperand(unsigned CompSrcIdx) const {
694 assert(CompSrcIdx < Component::MAX_SRC_NUM);
695 return SrcOperandsNum > CompSrcIdx && !hasMandatoryLiteralAt(CompSrcIdx);
696 }
697
698 // Return true iif this component has tied src2.
699 bool hasSrc2Acc() const { return HasSrc2Acc; }
700
701private:
702 bool hasMandatoryLiteralAt(unsigned CompSrcIdx) const {
703 assert(CompSrcIdx < Component::MAX_SRC_NUM);
704 return MandatoryLiteralIdx == Component::DST_NUM + CompSrcIdx;
705 }
706};
707
708enum ComponentKind : unsigned {
709 SINGLE = 0, // A single VOP1 or VOP2 instruction which may be used in VOPD.
710 COMPONENT_X, // A VOPD instruction, X component.
711 COMPONENT_Y, // A VOPD instruction, Y component.
714
715// Interface functions of this class map VOPD component operand indices
716// to indices of operands in MachineInstr/MCInst or parsed operands array.
717//
718// Note that this class operates with 3 kinds of indices:
719// - VOPD component operand indices (Component::DST, Component::SRC0, etc.);
720// - MC operand indices (they refer operands in a MachineInstr/MCInst);
721// - parsed operand indices (they refer operands in parsed operands array).
722//
723// For SINGLE components mapping between these indices is trivial.
724// But things get more complicated for COMPONENT_X and
725// COMPONENT_Y because these components share the same
726// MachineInstr/MCInst and the same parsed operands array.
727// Below is an example of component operand to parsed operand
728// mapping for the following instruction:
729//
730// v_dual_add_f32 v255, v4, v5 :: v_dual_mov_b32 v6, v1
731//
732// PARSED COMPONENT PARSED
733// COMPONENT OPERANDS OPERAND INDEX OPERAND INDEX
734// -------------------------------------------------------------------
735// "v_dual_add_f32" 0
736// v_dual_add_f32 v255 0 (DST) --> 1
737// v4 1 (SRC0) --> 2
738// v5 2 (SRC1) --> 3
739// "::" 4
740// "v_dual_mov_b32" 5
741// v_dual_mov_b32 v6 0 (DST) --> 6
742// v1 1 (SRC0) --> 7
743// -------------------------------------------------------------------
744//
746private:
747 // Regular MachineInstr/MCInst operands are ordered as follows:
748 // dst, src0 [, other src operands]
749 // VOPD MachineInstr/MCInst operands are ordered as follows:
750 // dstX, dstY, src0X [, other OpX operands], src0Y [, other OpY operands]
751 // Each ComponentKind has operand indices defined below.
752 static constexpr unsigned MC_DST_IDX[] = {0, 0, 1};
753 static constexpr unsigned FIRST_MC_SRC_IDX[] = {1, 2, 2 /* + OpX.MCSrcNum */};
754
755 // Parsed operands of regular instructions are ordered as follows:
756 // Mnemo dst src0 [vsrc1 ...]
757 // Parsed VOPD operands are ordered as follows:
758 // OpXMnemo dstX src0X [vsrc1X|imm vsrc1X|vsrc1X imm] '::'
759 // OpYMnemo dstY src0Y [vsrc1Y|imm vsrc1Y|vsrc1Y imm]
760 // Each ComponentKind has operand indices defined below.
761 static constexpr unsigned PARSED_DST_IDX[] = {1, 1,
762 4 /* + OpX.ParsedSrcNum */};
763 static constexpr unsigned FIRST_PARSED_SRC_IDX[] = {
764 2, 2, 5 /* + OpX.ParsedSrcNum */};
765
766private:
767 const ComponentKind Kind;
768 const ComponentProps PrevComp;
769
770public:
771 // Create layout for COMPONENT_X or SINGLE component.
772 ComponentLayout(ComponentKind Kind) : Kind(Kind) {
774 }
775
776 // Create layout for COMPONENT_Y which depends on COMPONENT_X layout.
778 : Kind(ComponentKind::COMPONENT_Y), PrevComp(OpXProps) {}
779
780public:
781 // Return the index of dst operand in MCInst operands.
782 unsigned getIndexOfDstInMCOperands() const { return MC_DST_IDX[Kind]; }
783
784 // Return the index of the specified src operand in MCInst operands.
785 unsigned getIndexOfSrcInMCOperands(unsigned CompSrcIdx) const {
786 assert(CompSrcIdx < Component::MAX_SRC_NUM);
787 return FIRST_MC_SRC_IDX[Kind] + getPrevCompSrcNum() + CompSrcIdx;
788 }
789
790 // Return the index of dst operand in the parsed operands array.
792 return PARSED_DST_IDX[Kind] + getPrevCompParsedSrcNum();
793 }
794
795 // Return the index of the specified src operand in the parsed operands array.
796 unsigned getIndexOfSrcInParsedOperands(unsigned CompSrcIdx) const {
797 assert(CompSrcIdx < Component::MAX_SRC_NUM);
798 return FIRST_PARSED_SRC_IDX[Kind] + getPrevCompParsedSrcNum() + CompSrcIdx;
799 }
800
801private:
802 unsigned getPrevCompSrcNum() const {
803 return PrevComp.getCompSrcOperandsNum();
804 }
805 unsigned getPrevCompParsedSrcNum() const {
806 return PrevComp.getCompParsedSrcOperandsNum();
807 }
808};
809
810// Layout and properties of VOPD components.
812public:
813 // Create ComponentInfo for COMPONENT_X or SINGLE component.
816 : ComponentLayout(Kind), ComponentProps(OpDesc) {}
817
818 // Create ComponentInfo for COMPONENT_Y which depends on COMPONENT_X layout.
819 ComponentInfo(const MCInstrDesc &OpDesc, const ComponentProps &OpXProps)
820 : ComponentLayout(OpXProps), ComponentProps(OpDesc) {}
821
822 // Map component operand index to parsed operand index.
823 // Return 0 if the specified operand does not exist.
824 unsigned getIndexInParsedOperands(unsigned CompOprIdx) const;
825};
826
827// Properties of VOPD instructions.
828class InstInfo {
829private:
830 const ComponentInfo CompInfo[COMPONENTS_NUM];
831
832public:
833 using RegIndices = std::array<unsigned, Component::MAX_OPR_NUM>;
834
835 InstInfo(const MCInstrDesc &OpX, const MCInstrDesc &OpY)
836 : CompInfo{OpX, OpY} {}
837
838 InstInfo(const ComponentInfo &OprInfoX, const ComponentInfo &OprInfoY)
839 : CompInfo{OprInfoX, OprInfoY} {}
840
841 const ComponentInfo &operator[](size_t ComponentIdx) const {
842 assert(ComponentIdx < COMPONENTS_NUM);
843 return CompInfo[ComponentIdx];
844 }
845
846 // Check VOPD operands constraints.
847 // GetRegIdx(Component, MCOperandIdx) must return a VGPR register index
848 // for the specified component and MC operand. The callback must return 0
849 // if the operand is not a register or not a VGPR.
850 // If \p SkipSrc is set to true then constraints for source operands are not
851 // checked.
852 bool hasInvalidOperand(std::function<unsigned(unsigned, unsigned)> GetRegIdx,
853 bool SkipSrc = false) const {
854 return getInvalidCompOperandIndex(GetRegIdx, SkipSrc).has_value();
855 }
856
857 // Check VOPD operands constraints.
858 // Return the index of an invalid component operand, if any.
859 // If \p SkipSrc is set to true then constraints for source operands are not
860 // checked.
861 std::optional<unsigned> getInvalidCompOperandIndex(
862 std::function<unsigned(unsigned, unsigned)> GetRegIdx,
863 bool SkipSrc = false) const;
864
865private:
867 getRegIndices(unsigned ComponentIdx,
868 std::function<unsigned(unsigned, unsigned)> GetRegIdx) const;
869};
870
871} // namespace VOPD
872
874std::pair<unsigned, unsigned> getVOPDComponents(unsigned VOPDOpcode);
875
877// Get properties of 2 single VOP1/VOP2 instructions
878// used as components to create a VOPD instruction.
879VOPD::InstInfo getVOPDInstInfo(const MCInstrDesc &OpX, const MCInstrDesc &OpY);
880
882// Get properties of VOPD X and Y components.
883VOPD::InstInfo
884getVOPDInstInfo(unsigned VOPDOpcode, const MCInstrInfo *InstrInfo);
885
887bool isTrue16Inst(unsigned Opc);
888
890FPType getFPDstSelType(unsigned Opc);
891
894
897
898bool isDPMACCInstruction(unsigned Opc);
899
901unsigned mapWMMA2AddrTo3AddrOpcode(unsigned Opc);
902
904unsigned mapWMMA3AddrTo2AddrOpcode(unsigned Opc);
905
907 const MCSubtargetInfo *STI);
908
909bool isGroupSegment(const GlobalValue *GV);
910bool isGlobalSegment(const GlobalValue *GV);
911bool isReadOnlySegment(const GlobalValue *GV);
912
913/// \returns True if constants should be emitted to .text section for given
914/// target triple \p TT, false otherwise.
916
917/// \returns Integer value requested using \p F's \p Name attribute.
918///
919/// \returns \p Default if attribute is not present.
920///
921/// \returns \p Default and emits error if requested value cannot be converted
922/// to integer.
924
925/// \returns A pair of integer values requested using \p F's \p Name attribute
926/// in "first[,second]" format ("second" is optional unless \p OnlyFirstRequired
927/// is false).
928///
929/// \returns \p Default if attribute is not present.
930///
931/// \returns \p Default and emits error if one of the requested values cannot be
932/// converted to integer, or \p OnlyFirstRequired is false and "second" value is
933/// not present.
934std::pair<unsigned, unsigned>
936 std::pair<unsigned, unsigned> Default,
937 bool OnlyFirstRequired = false);
938
939/// \returns A pair of integer values requested using \p F's \p Name attribute
940/// in "first[,second]" format ("second" is optional unless \p OnlyFirstRequired
941/// is false).
942///
943/// \returns \p std::nullopt if attribute is not present.
944///
945/// \returns \p std::nullopt and emits error if one of the requested values
946/// cannot be converted to integer, or \p OnlyFirstRequired is false and
947/// "second" value is not present.
948std::optional<std::pair<unsigned, std::optional<unsigned>>>
950 bool OnlyFirstRequired = false);
951
952/// \returns Generate a vector of integer values requested using \p F's \p Name
953/// attribute.
954///
955/// \returns true if exactly Size (>2) number of integers are found in the
956/// attribute.
957///
958/// \returns false if any error occurs.
960 unsigned Size,
961 unsigned DefaultVal = 0);
962
963/// Represents the counter values to wait for in an s_waitcnt instruction.
964///
965/// Large values (including the maximum possible integer) can be used to
966/// represent "don't care" waits.
967struct Waitcnt {
968 unsigned LoadCnt = ~0u; // Corresponds to Vmcnt prior to gfx12.
969 unsigned ExpCnt = ~0u;
970 unsigned DsCnt = ~0u; // Corresponds to LGKMcnt prior to gfx12.
971 unsigned StoreCnt = ~0u; // Corresponds to VScnt on gfx10/gfx11.
972 unsigned SampleCnt = ~0u; // gfx12+ only.
973 unsigned BvhCnt = ~0u; // gfx12+ only.
974 unsigned KmCnt = ~0u; // gfx12+ only.
975
976 Waitcnt() = default;
977 // Pre-gfx12 constructor.
978 Waitcnt(unsigned VmCnt, unsigned ExpCnt, unsigned LgkmCnt, unsigned VsCnt)
979 : LoadCnt(VmCnt), ExpCnt(ExpCnt), DsCnt(LgkmCnt), StoreCnt(VsCnt),
980 SampleCnt(~0u), BvhCnt(~0u), KmCnt(~0u) {}
981
982 // gfx12+ constructor.
983 Waitcnt(unsigned LoadCnt, unsigned ExpCnt, unsigned DsCnt, unsigned StoreCnt,
984 unsigned SampleCnt, unsigned BvhCnt, unsigned KmCnt)
987
988 bool hasWait() const { return StoreCnt != ~0u || hasWaitExceptStoreCnt(); }
989
991 return LoadCnt != ~0u || ExpCnt != ~0u || DsCnt != ~0u ||
992 SampleCnt != ~0u || BvhCnt != ~0u || KmCnt != ~0u;
993 }
994
995 bool hasWaitStoreCnt() const { return StoreCnt != ~0u; }
996
998 // Does the right thing provided self and Other are either both pre-gfx12
999 // or both gfx12+.
1000 return Waitcnt(
1001 std::min(LoadCnt, Other.LoadCnt), std::min(ExpCnt, Other.ExpCnt),
1002 std::min(DsCnt, Other.DsCnt), std::min(StoreCnt, Other.StoreCnt),
1003 std::min(SampleCnt, Other.SampleCnt), std::min(BvhCnt, Other.BvhCnt),
1004 std::min(KmCnt, Other.KmCnt));
1005 }
1006};
1007
1008// The following methods are only meaningful on targets that support
1009// S_WAITCNT.
1010
1011/// \returns Vmcnt bit mask for given isa \p Version.
1012unsigned getVmcntBitMask(const IsaVersion &Version);
1013
1014/// \returns Expcnt bit mask for given isa \p Version.
1015unsigned getExpcntBitMask(const IsaVersion &Version);
1016
1017/// \returns Lgkmcnt bit mask for given isa \p Version.
1018unsigned getLgkmcntBitMask(const IsaVersion &Version);
1019
1020/// \returns Waitcnt bit mask for given isa \p Version.
1021unsigned getWaitcntBitMask(const IsaVersion &Version);
1022
1023/// \returns Decoded Vmcnt from given \p Waitcnt for given isa \p Version.
1024unsigned decodeVmcnt(const IsaVersion &Version, unsigned Waitcnt);
1025
1026/// \returns Decoded Expcnt from given \p Waitcnt for given isa \p Version.
1027unsigned decodeExpcnt(const IsaVersion &Version, unsigned Waitcnt);
1028
1029/// \returns Decoded Lgkmcnt from given \p Waitcnt for given isa \p Version.
1030unsigned decodeLgkmcnt(const IsaVersion &Version, unsigned Waitcnt);
1031
1032/// Decodes Vmcnt, Expcnt and Lgkmcnt from given \p Waitcnt for given isa
1033/// \p Version, and writes decoded values into \p Vmcnt, \p Expcnt and
1034/// \p Lgkmcnt respectively. Should not be used on gfx12+, the instruction
1035/// which needs it is deprecated
1036///
1037/// \details \p Vmcnt, \p Expcnt and \p Lgkmcnt are decoded as follows:
1038/// \p Vmcnt = \p Waitcnt[3:0] (pre-gfx9)
1039/// \p Vmcnt = \p Waitcnt[15:14,3:0] (gfx9,10)
1040/// \p Vmcnt = \p Waitcnt[15:10] (gfx11)
1041/// \p Expcnt = \p Waitcnt[6:4] (pre-gfx11)
1042/// \p Expcnt = \p Waitcnt[2:0] (gfx11)
1043/// \p Lgkmcnt = \p Waitcnt[11:8] (pre-gfx10)
1044/// \p Lgkmcnt = \p Waitcnt[13:8] (gfx10)
1045/// \p Lgkmcnt = \p Waitcnt[9:4] (gfx11)
1046///
1047void decodeWaitcnt(const IsaVersion &Version, unsigned Waitcnt,
1048 unsigned &Vmcnt, unsigned &Expcnt, unsigned &Lgkmcnt);
1049
1050Waitcnt decodeWaitcnt(const IsaVersion &Version, unsigned Encoded);
1051
1052/// \returns \p Waitcnt with encoded \p Vmcnt for given isa \p Version.
1053unsigned encodeVmcnt(const IsaVersion &Version, unsigned Waitcnt,
1054 unsigned Vmcnt);
1055
1056/// \returns \p Waitcnt with encoded \p Expcnt for given isa \p Version.
1057unsigned encodeExpcnt(const IsaVersion &Version, unsigned Waitcnt,
1058 unsigned Expcnt);
1059
1060/// \returns \p Waitcnt with encoded \p Lgkmcnt for given isa \p Version.
1061unsigned encodeLgkmcnt(const IsaVersion &Version, unsigned Waitcnt,
1062 unsigned Lgkmcnt);
1063
1064/// Encodes \p Vmcnt, \p Expcnt and \p Lgkmcnt into Waitcnt for given isa
1065/// \p Version. Should not be used on gfx12+, the instruction which needs
1066/// it is deprecated
1067///
1068/// \details \p Vmcnt, \p Expcnt and \p Lgkmcnt are encoded as follows:
1069/// Waitcnt[2:0] = \p Expcnt (gfx11+)
1070/// Waitcnt[3:0] = \p Vmcnt (pre-gfx9)
1071/// Waitcnt[3:0] = \p Vmcnt[3:0] (gfx9,10)
1072/// Waitcnt[6:4] = \p Expcnt (pre-gfx11)
1073/// Waitcnt[9:4] = \p Lgkmcnt (gfx11)
1074/// Waitcnt[11:8] = \p Lgkmcnt (pre-gfx10)
1075/// Waitcnt[13:8] = \p Lgkmcnt (gfx10)
1076/// Waitcnt[15:10] = \p Vmcnt (gfx11)
1077/// Waitcnt[15:14] = \p Vmcnt[5:4] (gfx9,10)
1078///
1079/// \returns Waitcnt with encoded \p Vmcnt, \p Expcnt and \p Lgkmcnt for given
1080/// isa \p Version.
1081///
1082unsigned encodeWaitcnt(const IsaVersion &Version,
1083 unsigned Vmcnt, unsigned Expcnt, unsigned Lgkmcnt);
1084
1085unsigned encodeWaitcnt(const IsaVersion &Version, const Waitcnt &Decoded);
1086
1087// The following methods are only meaningful on targets that support
1088// S_WAIT_*CNT, introduced with gfx12.
1089
1090/// \returns Loadcnt bit mask for given isa \p Version.
1091/// Returns 0 for versions that do not support LOADcnt
1092unsigned getLoadcntBitMask(const IsaVersion &Version);
1093
1094/// \returns Samplecnt bit mask for given isa \p Version.
1095/// Returns 0 for versions that do not support SAMPLEcnt
1096unsigned getSamplecntBitMask(const IsaVersion &Version);
1097
1098/// \returns Bvhcnt bit mask for given isa \p Version.
1099/// Returns 0 for versions that do not support BVHcnt
1100unsigned getBvhcntBitMask(const IsaVersion &Version);
1101
1102/// \returns Dscnt bit mask for given isa \p Version.
1103/// Returns 0 for versions that do not support DScnt
1104unsigned getDscntBitMask(const IsaVersion &Version);
1105
1106/// \returns Dscnt bit mask for given isa \p Version.
1107/// Returns 0 for versions that do not support KMcnt
1108unsigned getKmcntBitMask(const IsaVersion &Version);
1109
1110/// \return STOREcnt or VScnt bit mask for given isa \p Version.
1111/// returns 0 for versions that do not support STOREcnt or VScnt.
1112/// STOREcnt and VScnt are the same counter, the name used
1113/// depends on the ISA version.
1114unsigned getStorecntBitMask(const IsaVersion &Version);
1115
1116// The following are only meaningful on targets that support
1117// S_WAIT_LOADCNT_DSCNT and S_WAIT_STORECNT_DSCNT.
1118
1119/// \returns Decoded Waitcnt structure from given \p LoadcntDscnt for given
1120/// isa \p Version.
1121Waitcnt decodeLoadcntDscnt(const IsaVersion &Version, unsigned LoadcntDscnt);
1122
1123/// \returns Decoded Waitcnt structure from given \p StorecntDscnt for given
1124/// isa \p Version.
1125Waitcnt decodeStorecntDscnt(const IsaVersion &Version, unsigned StorecntDscnt);
1126
1127/// \returns \p Loadcnt and \p Dscnt components of \p Decoded encoded as an
1128/// immediate that can be used with S_WAIT_LOADCNT_DSCNT for given isa
1129/// \p Version.
1130unsigned encodeLoadcntDscnt(const IsaVersion &Version, const Waitcnt &Decoded);
1131
1132/// \returns \p Storecnt and \p Dscnt components of \p Decoded encoded as an
1133/// immediate that can be used with S_WAIT_STORECNT_DSCNT for given isa
1134/// \p Version.
1135unsigned encodeStorecntDscnt(const IsaVersion &Version, const Waitcnt &Decoded);
1136
1137namespace Hwreg {
1138
1141
1142struct HwregSize : EncodingField<15, 11, 32> {
1144 constexpr uint64_t encode() const { return Value - 1; }
1145 static ValueType decode(uint64_t Encoded) { return Encoded + 1; }
1146};
1147
1149
1150} // namespace Hwreg
1151
1152namespace DepCtr {
1153
1155int encodeDepCtr(const StringRef Name, int64_t Val, unsigned &UsedOprMask,
1156 const MCSubtargetInfo &STI);
1157bool isSymbolicDepCtrEncoding(unsigned Code, bool &HasNonDefaultVal,
1158 const MCSubtargetInfo &STI);
1159bool decodeDepCtr(unsigned Code, int &Id, StringRef &Name, unsigned &Val,
1160 bool &IsDefault, const MCSubtargetInfo &STI);
1161
1162/// \returns Decoded VaVdst from given immediate \p Encoded.
1163unsigned decodeFieldVaVdst(unsigned Encoded);
1164
1165/// \returns Decoded VmVsrc from given immediate \p Encoded.
1166unsigned decodeFieldVmVsrc(unsigned Encoded);
1167
1168/// \returns Decoded SaSdst from given immediate \p Encoded.
1169unsigned decodeFieldSaSdst(unsigned Encoded);
1170
1171/// \returns \p VmVsrc as an encoded Depctr immediate.
1172unsigned encodeFieldVmVsrc(unsigned VmVsrc);
1173
1174/// \returns \p Encoded combined with encoded \p VmVsrc.
1175unsigned encodeFieldVmVsrc(unsigned Encoded, unsigned VmVsrc);
1176
1177/// \returns \p VaVdst as an encoded Depctr immediate.
1178unsigned encodeFieldVaVdst(unsigned VaVdst);
1179
1180/// \returns \p Encoded combined with encoded \p VaVdst.
1181unsigned encodeFieldVaVdst(unsigned Encoded, unsigned VaVdst);
1182
1183/// \returns \p SaSdst as an encoded Depctr immediate.
1184unsigned encodeFieldSaSdst(unsigned SaSdst);
1185
1186/// \returns \p Encoded combined with encoded \p SaSdst.
1187unsigned encodeFieldSaSdst(unsigned Encoded, unsigned SaSdst);
1188
1189} // namespace DepCtr
1190
1191namespace Exp {
1192
1193bool getTgtName(unsigned Id, StringRef &Name, int &Index);
1194
1196unsigned getTgtId(const StringRef Name);
1197
1199bool isSupportedTgtId(unsigned Id, const MCSubtargetInfo &STI);
1200
1201} // namespace Exp
1202
1203namespace MTBUFFormat {
1204
1206int64_t encodeDfmtNfmt(unsigned Dfmt, unsigned Nfmt);
1207
1208void decodeDfmtNfmt(unsigned Format, unsigned &Dfmt, unsigned &Nfmt);
1209
1210int64_t getDfmt(const StringRef Name);
1211
1212StringRef getDfmtName(unsigned Id);
1213
1214int64_t getNfmt(const StringRef Name, const MCSubtargetInfo &STI);
1215
1216StringRef getNfmtName(unsigned Id, const MCSubtargetInfo &STI);
1217
1218bool isValidDfmtNfmt(unsigned Val, const MCSubtargetInfo &STI);
1219
1220bool isValidNfmt(unsigned Val, const MCSubtargetInfo &STI);
1221
1222int64_t getUnifiedFormat(const StringRef Name, const MCSubtargetInfo &STI);
1223
1224StringRef getUnifiedFormatName(unsigned Id, const MCSubtargetInfo &STI);
1225
1226bool isValidUnifiedFormat(unsigned Val, const MCSubtargetInfo &STI);
1227
1228int64_t convertDfmtNfmt2Ufmt(unsigned Dfmt, unsigned Nfmt,
1229 const MCSubtargetInfo &STI);
1230
1231bool isValidFormatEncoding(unsigned Val, const MCSubtargetInfo &STI);
1232
1233unsigned getDefaultFormatEncoding(const MCSubtargetInfo &STI);
1234
1235} // namespace MTBUFFormat
1236
1237namespace SendMsg {
1238
1240bool isValidMsgId(int64_t MsgId, const MCSubtargetInfo &STI);
1241
1243bool isValidMsgOp(int64_t MsgId, int64_t OpId, const MCSubtargetInfo &STI,
1244 bool Strict = true);
1245
1247bool isValidMsgStream(int64_t MsgId, int64_t OpId, int64_t StreamId,
1248 const MCSubtargetInfo &STI, bool Strict = true);
1249
1251bool msgRequiresOp(int64_t MsgId, const MCSubtargetInfo &STI);
1252
1254bool msgSupportsStream(int64_t MsgId, int64_t OpId, const MCSubtargetInfo &STI);
1255
1256void decodeMsg(unsigned Val, uint16_t &MsgId, uint16_t &OpId,
1257 uint16_t &StreamId, const MCSubtargetInfo &STI);
1258
1261 uint64_t OpId,
1263
1264} // namespace SendMsg
1265
1266
1267unsigned getInitialPSInputAddr(const Function &F);
1268
1269bool getHasColorExport(const Function &F);
1270
1271bool getHasDepthExport(const Function &F);
1272
1275
1278
1281
1284
1285// These functions are considered entrypoints into the current module, i.e. they
1286// are allowed to be called from outside the current module. This is different
1287// from isEntryFunctionCC, which is only true for functions that are entered by
1288// the hardware. Module entry points include all entry functions but also
1289// include functions that can be called from other functions inside or outside
1290// the current module. Module entry functions are allowed to allocate LDS.
1293
1296
1297bool isKernelCC(const Function *Func);
1298
1299// FIXME: Remove this when calling conventions cleaned up
1302 switch (CC) {
1305 return true;
1306 default:
1307 return false;
1308 }
1309}
1310
1311bool hasXNACK(const MCSubtargetInfo &STI);
1312bool hasSRAMECC(const MCSubtargetInfo &STI);
1313bool hasMIMG_R128(const MCSubtargetInfo &STI);
1314bool hasA16(const MCSubtargetInfo &STI);
1315bool hasG16(const MCSubtargetInfo &STI);
1316bool hasPackedD16(const MCSubtargetInfo &STI);
1317bool hasGDS(const MCSubtargetInfo &STI);
1318unsigned getNSAMaxSize(const MCSubtargetInfo &STI, bool HasSampler = false);
1319unsigned getMaxNumUserSGPRs(const MCSubtargetInfo &STI);
1320
1321bool isSI(const MCSubtargetInfo &STI);
1322bool isCI(const MCSubtargetInfo &STI);
1323bool isVI(const MCSubtargetInfo &STI);
1324bool isGFX9(const MCSubtargetInfo &STI);
1325bool isGFX9_GFX10(const MCSubtargetInfo &STI);
1326bool isGFX9_GFX10_GFX11(const MCSubtargetInfo &STI);
1327bool isGFX8_GFX9_GFX10(const MCSubtargetInfo &STI);
1328bool isGFX8Plus(const MCSubtargetInfo &STI);
1329bool isGFX9Plus(const MCSubtargetInfo &STI);
1330bool isNotGFX9Plus(const MCSubtargetInfo &STI);
1331bool isGFX10(const MCSubtargetInfo &STI);
1332bool isGFX10_GFX11(const MCSubtargetInfo &STI);
1333bool isGFX10Plus(const MCSubtargetInfo &STI);
1334bool isNotGFX10Plus(const MCSubtargetInfo &STI);
1335bool isGFX10Before1030(const MCSubtargetInfo &STI);
1336bool isGFX11(const MCSubtargetInfo &STI);
1337bool isGFX11Plus(const MCSubtargetInfo &STI);
1338bool isGFX12(const MCSubtargetInfo &STI);
1339bool isGFX12Plus(const MCSubtargetInfo &STI);
1340bool isNotGFX12Plus(const MCSubtargetInfo &STI);
1341bool isNotGFX11Plus(const MCSubtargetInfo &STI);
1342bool isGCN3Encoding(const MCSubtargetInfo &STI);
1343bool isGFX10_AEncoding(const MCSubtargetInfo &STI);
1344bool isGFX10_BEncoding(const MCSubtargetInfo &STI);
1345bool hasGFX10_3Insts(const MCSubtargetInfo &STI);
1346bool isGFX10_3_GFX11(const MCSubtargetInfo &STI);
1347bool isGFX90A(const MCSubtargetInfo &STI);
1348bool isGFX940(const MCSubtargetInfo &STI);
1350bool hasMAIInsts(const MCSubtargetInfo &STI);
1351bool hasVOPD(const MCSubtargetInfo &STI);
1352bool hasDPPSrc1SGPR(const MCSubtargetInfo &STI);
1353int getTotalNumVGPRs(bool has90AInsts, int32_t ArgNumAGPR, int32_t ArgNumVGPR);
1354unsigned hasKernargPreload(const MCSubtargetInfo &STI);
1356
1357/// Is Reg - scalar register
1358bool isSGPR(MCRegister Reg, const MCRegisterInfo *TRI);
1359
1360/// \returns if \p Reg occupies the high 16-bits of a 32-bit register.
1362
1363/// If \p Reg is a pseudo reg, return the correct hardware register given
1364/// \p STI otherwise return \p Reg.
1366
1367/// Convert hardware register \p Reg to a pseudo register
1370
1372bool isInlineValue(unsigned Reg);
1373
1374/// Is this an AMDGPU specific source operand? These include registers,
1375/// inline constants, literals and mandatory literals (KImm).
1376bool isSISrcOperand(const MCInstrDesc &Desc, unsigned OpNo);
1377
1378/// Is this a KImm operand?
1379bool isKImmOperand(const MCInstrDesc &Desc, unsigned OpNo);
1380
1381/// Is this floating-point operand?
1382bool isSISrcFPOperand(const MCInstrDesc &Desc, unsigned OpNo);
1383
1384/// Does this operand support only inlinable literals?
1385bool isSISrcInlinableOperand(const MCInstrDesc &Desc, unsigned OpNo);
1386
1387/// Get the size in bits of a register from the register class \p RC.
1388unsigned getRegBitWidth(unsigned RCID);
1389
1390/// Get the size in bits of a register from the register class \p RC.
1391unsigned getRegBitWidth(const MCRegisterClass &RC);
1392
1393/// Get size of register operand
1394unsigned getRegOperandSize(const MCRegisterInfo *MRI, const MCInstrDesc &Desc,
1395 unsigned OpNo);
1396
1398inline unsigned getOperandSize(const MCOperandInfo &OpInfo) {
1399 switch (OpInfo.OperandType) {
1412 case AMDGPU::OPERAND_KIMM16: // mandatory literal is always size 4
1414 return 4;
1415
1421 return 8;
1422
1443 return 2;
1444
1445 default:
1446 llvm_unreachable("unhandled operand type");
1447 }
1448}
1449
1451inline unsigned getOperandSize(const MCInstrDesc &Desc, unsigned OpNo) {
1452 return getOperandSize(Desc.operands()[OpNo]);
1453}
1454
1455/// Is this literal inlinable, and not one of the values intended for floating
1456/// point values.
1458inline bool isInlinableIntLiteral(int64_t Literal) {
1459 return Literal >= -16 && Literal <= 64;
1460}
1461
1462/// Is this literal inlinable
1464bool isInlinableLiteral64(int64_t Literal, bool HasInv2Pi);
1465
1467bool isInlinableLiteral32(int32_t Literal, bool HasInv2Pi);
1468
1470bool isInlinableLiteralBF16(int16_t Literal, bool HasInv2Pi);
1471
1473bool isInlinableLiteralFP16(int16_t Literal, bool HasInv2Pi);
1474
1476bool isInlinableLiteralBF16(int16_t Literal, bool HasInv2Pi);
1477
1479bool isInlinableLiteralI16(int32_t Literal, bool HasInv2Pi);
1480
1482std::optional<unsigned> getInlineEncodingV2I16(uint32_t Literal);
1483
1485std::optional<unsigned> getInlineEncodingV2BF16(uint32_t Literal);
1486
1488std::optional<unsigned> getInlineEncodingV2F16(uint32_t Literal);
1489
1492
1495
1498
1501
1503bool isValid32BitLiteral(uint64_t Val, bool IsFP64);
1504
1505bool isArgPassedInSGPR(const Argument *Arg);
1506
1507bool isArgPassedInSGPR(const CallBase *CB, unsigned ArgNo);
1508
1511 int64_t EncodedOffset);
1512
1515 int64_t EncodedOffset,
1516 bool IsBuffer);
1517
1518/// Convert \p ByteOffset to dwords if the subtarget uses dword SMRD immediate
1519/// offsets.
1521
1522/// \returns The encoding that will be used for \p ByteOffset in the
1523/// SMRD offset field, or std::nullopt if it won't fit. On GFX9 and GFX10
1524/// S_LOAD instructions have a signed offset, on other subtargets it is
1525/// unsigned. S_BUFFER has an unsigned offset for all subtargets.
1526std::optional<int64_t> getSMRDEncodedOffset(const MCSubtargetInfo &ST,
1527 int64_t ByteOffset, bool IsBuffer,
1528 bool HasSOffset = false);
1529
1530/// \return The encoding that can be used for a 32-bit literal offset in an SMRD
1531/// instruction. This is only useful on CI.s
1532std::optional<int64_t> getSMRDEncodedLiteralOffset32(const MCSubtargetInfo &ST,
1533 int64_t ByteOffset);
1534
1535/// For pre-GFX12 FLAT instructions the offset must be positive;
1536/// MSB is ignored and forced to zero.
1537///
1538/// \return The number of bits available for the signed offset field in flat
1539/// instructions. Note that some forms of the instruction disallow negative
1540/// offsets.
1541unsigned getNumFlatOffsetBits(const MCSubtargetInfo &ST);
1542
1543/// \returns true if this offset is small enough to fit in the SMRD
1544/// offset field. \p ByteOffset should be the offset in bytes and
1545/// not the encoded offset.
1546bool isLegalSMRDImmOffset(const MCSubtargetInfo &ST, int64_t ByteOffset);
1547
1549inline bool isLegalDPALU_DPPControl(unsigned DC) {
1550 return DC >= DPP::ROW_NEWBCAST_FIRST && DC <= DPP::ROW_NEWBCAST_LAST;
1551}
1552
1553/// \returns true if an instruction may have a 64-bit VGPR operand.
1554bool hasAny64BitVGPROperands(const MCInstrDesc &OpDesc);
1555
1556/// \returns true if an instruction is a DP ALU DPP.
1557bool isDPALU_DPP(const MCInstrDesc &OpDesc);
1558
1559/// \returns true if the intrinsic is divergent
1560bool isIntrinsicSourceOfDivergence(unsigned IntrID);
1561
1562/// \returns true if the intrinsic is uniform
1563bool isIntrinsicAlwaysUniform(unsigned IntrID);
1564
1565/// \returns lds block size in terms of dwords. \p
1566/// This is used to calculate the lds size encoded for PAL metadata 3.0+ which
1567/// must be defined in terms of bytes.
1568unsigned getLdsDwGranularity(const MCSubtargetInfo &ST);
1569
1570} // end namespace AMDGPU
1571
1572raw_ostream &operator<<(raw_ostream &OS,
1574
1575} // end namespace llvm
1576
1577#endif // LLVM_LIB_TARGET_AMDGPU_UTILS_AMDGPUBASEINFO_H
unsigned const MachineRegisterInfo * MRI
Base class for AMDGPU specific classes of TargetSubtarget.
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
#define LLVM_READNONE
Definition: Compiler.h:299
#define LLVM_READONLY
Definition: Compiler.h:306
uint64_t Align
std::string Name
uint32_t Index
uint64_t Size
Module.h This file contains the declarations for the Module class.
#define F(x, y, z)
Definition: MD5.cpp:55
#define G(x, y, z)
Definition: MD5.cpp:56
unsigned const TargetRegisterInfo * TRI
unsigned Reg
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
unsigned unsigned DefaultVal
raw_pwrite_stream & OS
void setTargetIDFromFeaturesString(StringRef FS)
void setXnackSetting(TargetIDSetting NewXnackSetting)
Sets xnack setting to NewXnackSetting.
TargetIDSetting getXnackSetting() const
void setTargetIDFromTargetIDStream(StringRef TargetID)
void setSramEccSetting(TargetIDSetting NewSramEccSetting)
Sets sramecc setting to NewSramEccSetting.
TargetIDSetting getSramEccSetting() const
unsigned getIndexInParsedOperands(unsigned CompOprIdx) const
ComponentInfo(const MCInstrDesc &OpDesc, ComponentKind Kind=ComponentKind::SINGLE)
ComponentInfo(const MCInstrDesc &OpDesc, const ComponentProps &OpXProps)
unsigned getIndexOfSrcInMCOperands(unsigned CompSrcIdx) const
unsigned getIndexOfDstInParsedOperands() const
ComponentLayout(const ComponentProps &OpXProps)
unsigned getIndexOfSrcInParsedOperands(unsigned CompSrcIdx) const
bool hasRegSrcOperand(unsigned CompSrcIdx) const
unsigned getMandatoryLiteralCompOperandIndex() const
unsigned getCompParsedSrcOperandsNum() const
InstInfo(const ComponentInfo &OprInfoX, const ComponentInfo &OprInfoY)
bool hasInvalidOperand(std::function< unsigned(unsigned, unsigned)> GetRegIdx, bool SkipSrc=false) const
const ComponentInfo & operator[](size_t ComponentIdx) const
InstInfo(const MCInstrDesc &OpX, const MCInstrDesc &OpY)
std::optional< unsigned > getInvalidCompOperandIndex(std::function< unsigned(unsigned, unsigned)> GetRegIdx, bool SkipSrc=false) const
std::array< unsigned, Component::MAX_OPR_NUM > RegIndices
This class represents an incoming formal argument to a Function.
Definition: Argument.h:31
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Definition: InstrTypes.h:1120
Describe properties that are true of each instruction in the target description file.
Definition: MCInstrDesc.h:198
Interface to description of machine instruction set.
Definition: MCInstrInfo.h:26
This holds information about one operand of a machine instruction, indicating the register class for ...
Definition: MCInstrDesc.h:85
uint8_t OperandType
Information about the type of the operand.
Definition: MCInstrDesc.h:97
MCRegisterClass - Base class of TargetRegisterClass.
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
Wrapper class representing physical registers. Should be passed by value.
Definition: MCRegister.h:33
Generic base class for all target subtargets.
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1196
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
LLVM Value Representation.
Definition: Value.h:74
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
bool decodeDepCtr(unsigned Code, int &Id, StringRef &Name, unsigned &Val, bool &IsDefault, const MCSubtargetInfo &STI)
unsigned encodeFieldVaVdst(unsigned Encoded, unsigned VaVdst)
unsigned decodeFieldSaSdst(unsigned Encoded)
unsigned encodeFieldVmVsrc(unsigned Encoded, unsigned VmVsrc)
int encodeDepCtr(const StringRef Name, int64_t Val, unsigned &UsedOprMask, const MCSubtargetInfo &STI)
unsigned encodeFieldSaSdst(unsigned Encoded, unsigned SaSdst)
bool isSymbolicDepCtrEncoding(unsigned Code, bool &HasNonDefaultVal, const MCSubtargetInfo &STI)
unsigned decodeFieldVaVdst(unsigned Encoded)
int getDefaultDepCtrEncoding(const MCSubtargetInfo &STI)
unsigned decodeFieldVmVsrc(unsigned Encoded)
bool isSupportedTgtId(unsigned Id, const MCSubtargetInfo &STI)
bool getTgtName(unsigned Id, StringRef &Name, int &Index)
unsigned getTgtId(const StringRef Name)
static constexpr unsigned GFX9_4
static constexpr unsigned GFX10_1
static constexpr unsigned GFX10_3
static constexpr unsigned GFX11
static constexpr unsigned GFX9
static constexpr unsigned GFX12
unsigned getVGPREncodingGranule(const MCSubtargetInfo *STI, std::optional< bool > EnableWavefrontSize32)
unsigned getTotalNumVGPRs(const MCSubtargetInfo *STI)
unsigned getWavesPerEUForWorkGroup(const MCSubtargetInfo *STI, unsigned FlatWorkGroupSize)
unsigned getWavefrontSize(const MCSubtargetInfo *STI)
unsigned getMaxWorkGroupsPerCU(const MCSubtargetInfo *STI, unsigned FlatWorkGroupSize)
unsigned getMaxFlatWorkGroupSize(const MCSubtargetInfo *STI)
unsigned getMaxWavesPerEU(const MCSubtargetInfo *STI)
unsigned getWavesPerWorkGroup(const MCSubtargetInfo *STI, unsigned FlatWorkGroupSize)
unsigned getNumExtraSGPRs(const MCSubtargetInfo *STI, bool VCCUsed, bool FlatScrUsed, bool XNACKUsed)
unsigned getSGPREncodingGranule(const MCSubtargetInfo *STI)
unsigned getLocalMemorySize(const MCSubtargetInfo *STI)
unsigned getAddressableLocalMemorySize(const MCSubtargetInfo *STI)
unsigned getMinNumVGPRs(const MCSubtargetInfo *STI, unsigned WavesPerEU)
unsigned getEUsPerCU(const MCSubtargetInfo *STI)
unsigned getAddressableNumSGPRs(const MCSubtargetInfo *STI)
unsigned getAddressableNumVGPRs(const MCSubtargetInfo *STI)
unsigned getMinNumSGPRs(const MCSubtargetInfo *STI, unsigned WavesPerEU)
unsigned getMinFlatWorkGroupSize(const MCSubtargetInfo *STI)
unsigned getMaxNumSGPRs(const MCSubtargetInfo *STI, unsigned WavesPerEU, bool Addressable)
unsigned getNumSGPRBlocks(const MCSubtargetInfo *STI, unsigned NumSGPRs)
unsigned getMinWavesPerEU(const MCSubtargetInfo *STI)
unsigned getSGPRAllocGranule(const MCSubtargetInfo *STI)
unsigned getNumWavesPerEUWithNumVGPRs(const MCSubtargetInfo *STI, unsigned NumVGPRs)
unsigned getMaxNumVGPRs(const MCSubtargetInfo *STI, unsigned WavesPerEU)
unsigned getEncodedNumVGPRBlocks(const MCSubtargetInfo *STI, unsigned NumVGPRs, std::optional< bool > EnableWavefrontSize32)
unsigned getOccupancyWithNumSGPRs(unsigned SGPRs, unsigned MaxWaves, AMDGPUSubtarget::Generation Gen)
unsigned getVGPRAllocGranule(const MCSubtargetInfo *STI, std::optional< bool > EnableWavefrontSize32)
unsigned getAddressableNumArchVGPRs(const MCSubtargetInfo *STI)
unsigned getAllocatedNumVGPRBlocks(const MCSubtargetInfo *STI, unsigned NumVGPRs, std::optional< bool > EnableWavefrontSize32)
unsigned getTotalNumSGPRs(const MCSubtargetInfo *STI)
bool isValidUnifiedFormat(unsigned Id, const MCSubtargetInfo &STI)
unsigned getDefaultFormatEncoding(const MCSubtargetInfo &STI)
StringRef getUnifiedFormatName(unsigned Id, const MCSubtargetInfo &STI)
bool isValidNfmt(unsigned Id, const MCSubtargetInfo &STI)
bool isValidDfmtNfmt(unsigned Id, const MCSubtargetInfo &STI)
int64_t convertDfmtNfmt2Ufmt(unsigned Dfmt, unsigned Nfmt, const MCSubtargetInfo &STI)
StringRef getDfmtName(unsigned Id)
int64_t encodeDfmtNfmt(unsigned Dfmt, unsigned Nfmt)
int64_t getUnifiedFormat(const StringRef Name, const MCSubtargetInfo &STI)
bool isValidFormatEncoding(unsigned Val, const MCSubtargetInfo &STI)
StringRef getNfmtName(unsigned Id, const MCSubtargetInfo &STI)
int64_t getNfmt(const StringRef Name, const MCSubtargetInfo &STI)
int64_t getDfmt(const StringRef Name)
void decodeDfmtNfmt(unsigned Format, unsigned &Dfmt, unsigned &Nfmt)
uint64_t encodeMsg(uint64_t MsgId, uint64_t OpId, uint64_t StreamId)
bool msgSupportsStream(int64_t MsgId, int64_t OpId, const MCSubtargetInfo &STI)
void decodeMsg(unsigned Val, uint16_t &MsgId, uint16_t &OpId, uint16_t &StreamId, const MCSubtargetInfo &STI)
bool isValidMsgId(int64_t MsgId, const MCSubtargetInfo &STI)
bool isValidMsgStream(int64_t MsgId, int64_t OpId, int64_t StreamId, const MCSubtargetInfo &STI, bool Strict)
bool msgRequiresOp(int64_t MsgId, const MCSubtargetInfo &STI)
bool isValidMsgOp(int64_t MsgId, int64_t OpId, const MCSubtargetInfo &STI, bool Strict)
constexpr unsigned VOPD_VGPR_BANK_MASKS[]
constexpr unsigned COMPONENTS_NUM
constexpr unsigned COMPONENTS[]
bool isGCN3Encoding(const MCSubtargetInfo &STI)
bool isInlinableLiteralBF16(int16_t Literal, bool HasInv2Pi)
bool isGFX10_BEncoding(const MCSubtargetInfo &STI)
LLVM_READONLY const MIMGG16MappingInfo * getMIMGG16MappingInfo(unsigned G)
bool isGFX10_GFX11(const MCSubtargetInfo &STI)
bool isInlinableLiteralV216(uint32_t Literal, uint8_t OpType)
LLVM_READONLY const MIMGInfo * getMIMGInfo(unsigned Opc)
unsigned getRegOperandSize(const MCRegisterInfo *MRI, const MCInstrDesc &Desc, unsigned OpNo)
Get size of register operand.
void decodeWaitcnt(const IsaVersion &Version, unsigned Waitcnt, unsigned &Vmcnt, unsigned &Expcnt, unsigned &Lgkmcnt)
Decodes Vmcnt, Expcnt and Lgkmcnt from given Waitcnt for given isa Version, and writes decoded values...
bool isInlinableLiteralFP16(int16_t Literal, bool HasInv2Pi)
bool isSGPR(MCRegister Reg, const MCRegisterInfo *TRI)
Is Reg - scalar register.
uint64_t convertSMRDOffsetUnits(const MCSubtargetInfo &ST, uint64_t ByteOffset)
Convert ByteOffset to dwords if the subtarget uses dword SMRD immediate offsets.
MCRegister getMCReg(MCRegister Reg, const MCSubtargetInfo &STI)
If Reg is a pseudo reg, return the correct hardware register given STI otherwise return Reg.
LLVM_READONLY const MIMGOffsetMappingInfo * getMIMGOffsetMappingInfo(unsigned Offset)
bool isVOPCAsmOnly(unsigned Opc)
int getMIMGOpcode(unsigned BaseOpcode, unsigned MIMGEncoding, unsigned VDataDwords, unsigned VAddrDwords)
bool getMTBUFHasSrsrc(unsigned Opc)
std::optional< int64_t > getSMRDEncodedLiteralOffset32(const MCSubtargetInfo &ST, int64_t ByteOffset)
LLVM_READNONE bool isLegalDPALU_DPPControl(unsigned DC)
bool isGFX10Before1030(const MCSubtargetInfo &STI)
bool isSISrcInlinableOperand(const MCInstrDesc &Desc, unsigned OpNo)
Does this operand support only inlinable literals?
unsigned mapWMMA2AddrTo3AddrOpcode(unsigned Opc)
bool shouldEmitConstantsToTextSection(const Triple &TT)
bool isInlinableLiteralV2I16(uint32_t Literal)
bool isDPMACCInstruction(unsigned Opc)
int getMTBUFElements(unsigned Opc)
bool isHi16Reg(MCRegister Reg, const MCRegisterInfo &MRI)
int32_t getTotalNumVGPRs(bool has90AInsts, int32_t ArgNumAGPR, int32_t ArgNumVGPR)
bool isGFX10(const MCSubtargetInfo &STI)
LLVM_READONLY int16_t getNamedOperandIdx(uint16_t Opcode, uint16_t NamedIdx)
bool isInlinableLiteralV2BF16(uint32_t Literal)
unsigned getMaxNumUserSGPRs(const MCSubtargetInfo &STI)
FPType getFPDstSelType(unsigned Opc)
unsigned getNumFlatOffsetBits(const MCSubtargetInfo &ST)
For pre-GFX12 FLAT instructions the offset must be positive; MSB is ignored and forced to zero.
bool hasA16(const MCSubtargetInfo &STI)
bool isLegalSMRDEncodedSignedOffset(const MCSubtargetInfo &ST, int64_t EncodedOffset, bool IsBuffer)
bool isGFX12Plus(const MCSubtargetInfo &STI)
unsigned getNSAMaxSize(const MCSubtargetInfo &STI, bool HasSampler)
CanBeVOPD getCanBeVOPD(unsigned Opc)
int getIntegerAttribute(const Function &F, StringRef Name, int Default)
bool hasPackedD16(const MCSubtargetInfo &STI)
unsigned getStorecntBitMask(const IsaVersion &Version)
unsigned getLdsDwGranularity(const MCSubtargetInfo &ST)
bool isGFX940(const MCSubtargetInfo &STI)
bool isEntryFunctionCC(CallingConv::ID CC)
LLVM_READNONE bool isKernel(CallingConv::ID CC)
bool isInlinableLiteralV2F16(uint32_t Literal)
bool isHsaAbi(const MCSubtargetInfo &STI)
bool isGFX11(const MCSubtargetInfo &STI)
bool getSMEMIsBuffer(unsigned Opc)
bool isGFX10_3_GFX11(const MCSubtargetInfo &STI)
LLVM_READONLY bool isInvalidSingleUseProducerInst(unsigned Opc)
uint8_t mfmaScaleF8F6F4FormatToNumRegs(unsigned EncodingVal)
LLVM_READONLY bool isInvalidSingleUseConsumerInst(unsigned Opc)
bool isGroupSegment(const GlobalValue *GV)
LLVM_READONLY const MIMGMIPMappingInfo * getMIMGMIPMappingInfo(unsigned MIP)
bool getMTBUFHasSoffset(unsigned Opc)
bool hasXNACK(const MCSubtargetInfo &STI)
bool isValid32BitLiteral(uint64_t Val, bool IsFP64)
unsigned getVOPDOpcode(unsigned Opc)
bool isDPALU_DPP(const MCInstrDesc &OpDesc)
unsigned encodeWaitcnt(const IsaVersion &Version, unsigned Vmcnt, unsigned Expcnt, unsigned Lgkmcnt)
Encodes Vmcnt, Expcnt and Lgkmcnt into Waitcnt for given isa Version.
bool isVOPC64DPP(unsigned Opc)
int getMUBUFOpcode(unsigned BaseOpc, unsigned Elements)
bool isCompute(CallingConv::ID cc)
bool getMAIIsGFX940XDL(unsigned Opc)
bool isSI(const MCSubtargetInfo &STI)
unsigned getDefaultAMDHSACodeObjectVersion()
bool isReadOnlySegment(const GlobalValue *GV)
bool isArgPassedInSGPR(const Argument *A)
bool isIntrinsicAlwaysUniform(unsigned IntrID)
int getMUBUFBaseOpcode(unsigned Opc)
unsigned getAMDHSACodeObjectVersion(const Module &M)
unsigned decodeLgkmcnt(const IsaVersion &Version, unsigned Waitcnt)
unsigned getWaitcntBitMask(const IsaVersion &Version)
bool getVOP3IsSingle(unsigned Opc)
bool isGFX9(const MCSubtargetInfo &STI)
bool getVOP1IsSingle(unsigned Opc)
unsigned getVOPDEncodingFamily(const MCSubtargetInfo &ST)
bool isGFX10_AEncoding(const MCSubtargetInfo &STI)
bool isKImmOperand(const MCInstrDesc &Desc, unsigned OpNo)
Is this a KImm operand?
bool getHasColorExport(const Function &F)
int getMTBUFBaseOpcode(unsigned Opc)
bool isChainCC(CallingConv::ID CC)
bool isGFX90A(const MCSubtargetInfo &STI)
unsigned getSamplecntBitMask(const IsaVersion &Version)
unsigned getDefaultQueueImplicitArgPosition(unsigned CodeObjectVersion)
bool hasSRAMECC(const MCSubtargetInfo &STI)
bool getHasDepthExport(const Function &F)
bool isGFX8_GFX9_GFX10(const MCSubtargetInfo &STI)
bool getMUBUFHasVAddr(unsigned Opc)
int getVOPDFull(unsigned OpX, unsigned OpY, unsigned EncodingFamily)
bool isTrue16Inst(unsigned Opc)
bool hasAny64BitVGPROperands(const MCInstrDesc &OpDesc)
std::pair< unsigned, unsigned > getVOPDComponents(unsigned VOPDOpcode)
LLVM_READONLY const MIMGDimInfo * getMIMGDimInfoByEncoding(uint8_t DimEnc)
bool isInlinableLiteral32(int32_t Literal, bool HasInv2Pi)
bool isGFX12(const MCSubtargetInfo &STI)
unsigned getInitialPSInputAddr(const Function &F)
unsigned encodeExpcnt(const IsaVersion &Version, unsigned Waitcnt, unsigned Expcnt)
bool isSISrcOperand(const MCInstrDesc &Desc, unsigned OpNo)
Is this an AMDGPU specific source operand? These include registers, inline constants,...
bool isLegalSMRDImmOffset(const MCSubtargetInfo &ST, int64_t ByteOffset)
unsigned getKmcntBitMask(const IsaVersion &Version)
unsigned getVmcntBitMask(const IsaVersion &Version)
bool isNotGFX10Plus(const MCSubtargetInfo &STI)
bool hasMAIInsts(const MCSubtargetInfo &STI)
bool isIntrinsicSourceOfDivergence(unsigned IntrID)
bool isKernelCC(const Function *Func)
bool isGenericAtomic(unsigned Opc)
Waitcnt decodeStorecntDscnt(const IsaVersion &Version, unsigned StorecntDscnt)
bool isGFX8Plus(const MCSubtargetInfo &STI)
LLVM_READONLY bool hasNamedOperand(uint64_t Opcode, uint64_t NamedIdx)
LLVM_READNONE bool isInlinableIntLiteral(int64_t Literal)
Is this literal inlinable, and not one of the values intended for floating point values.
unsigned getLgkmcntBitMask(const IsaVersion &Version)
bool getMUBUFTfe(unsigned Opc)
LLVM_READONLY const MIMGBiasMappingInfo * getMIMGBiasMappingInfo(unsigned Bias)
unsigned getBvhcntBitMask(const IsaVersion &Version)
bool hasSMRDSignedImmOffset(const MCSubtargetInfo &ST)
LLVM_READONLY const MIMGDimInfo * getMIMGDimInfoByAsmSuffix(StringRef AsmSuffix)
bool hasMIMG_R128(const MCSubtargetInfo &STI)
bool hasGFX10_3Insts(const MCSubtargetInfo &STI)
bool hasG16(const MCSubtargetInfo &STI)
unsigned getAddrSizeMIMGOp(const MIMGBaseOpcodeInfo *BaseOpcode, const MIMGDimInfo *Dim, bool IsA16, bool IsG16Supported)
int getMTBUFOpcode(unsigned BaseOpc, unsigned Elements)
unsigned getExpcntBitMask(const IsaVersion &Version)
bool hasArchitectedFlatScratch(const MCSubtargetInfo &STI)
bool getMUBUFHasSoffset(unsigned Opc)
bool isNotGFX11Plus(const MCSubtargetInfo &STI)
bool isGFX11Plus(const MCSubtargetInfo &STI)
std::optional< unsigned > getInlineEncodingV2F16(uint32_t Literal)
bool isInlineValue(unsigned Reg)
bool isSISrcFPOperand(const MCInstrDesc &Desc, unsigned OpNo)
Is this floating-point operand?
bool isShader(CallingConv::ID cc)
unsigned getHostcallImplicitArgPosition(unsigned CodeObjectVersion)
bool isGFX10Plus(const MCSubtargetInfo &STI)
std::optional< int64_t > getSMRDEncodedOffset(const MCSubtargetInfo &ST, int64_t ByteOffset, bool IsBuffer, bool HasSOffset)
bool isGlobalSegment(const GlobalValue *GV)
@ OPERAND_KIMM32
Operand with 32-bit immediate that uses the constant bus.
Definition: SIDefines.h:234
@ OPERAND_REG_IMM_INT64
Definition: SIDefines.h:201
@ OPERAND_REG_IMM_V2FP16
Definition: SIDefines.h:211
@ OPERAND_REG_INLINE_C_V2INT32
Definition: SIDefines.h:227
@ OPERAND_REG_INLINE_C_FP64
Definition: SIDefines.h:223
@ OPERAND_REG_INLINE_C_BF16
Definition: SIDefines.h:220
@ OPERAND_REG_INLINE_C_V2BF16
Definition: SIDefines.h:225
@ OPERAND_REG_IMM_V2INT16
Definition: SIDefines.h:212
@ OPERAND_REG_IMM_BF16
Definition: SIDefines.h:205
@ OPERAND_REG_INLINE_AC_V2FP16
Definition: SIDefines.h:246
@ OPERAND_REG_IMM_INT32
Operands with register or 32-bit immediate.
Definition: SIDefines.h:200
@ OPERAND_REG_IMM_V2BF16
Definition: SIDefines.h:210
@ OPERAND_REG_IMM_BF16_DEFERRED
Definition: SIDefines.h:207
@ OPERAND_REG_IMM_FP16
Definition: SIDefines.h:206
@ OPERAND_REG_INLINE_C_INT64
Definition: SIDefines.h:219
@ OPERAND_REG_INLINE_AC_BF16
Definition: SIDefines.h:240
@ OPERAND_REG_INLINE_C_INT16
Operands with register or inline constant.
Definition: SIDefines.h:217
@ OPERAND_REG_INLINE_AC_INT16
Operands with an AccVGPR register or inline constant.
Definition: SIDefines.h:238
@ OPERAND_REG_IMM_FP64
Definition: SIDefines.h:204
@ OPERAND_REG_INLINE_C_V2FP16
Definition: SIDefines.h:226
@ OPERAND_REG_INLINE_AC_V2INT16
Definition: SIDefines.h:244
@ OPERAND_REG_INLINE_AC_FP16
Definition: SIDefines.h:241
@ OPERAND_REG_INLINE_AC_INT32
Definition: SIDefines.h:239
@ OPERAND_REG_INLINE_AC_FP32
Definition: SIDefines.h:242
@ OPERAND_REG_INLINE_AC_V2BF16
Definition: SIDefines.h:245
@ OPERAND_REG_IMM_V2INT32
Definition: SIDefines.h:213
@ OPERAND_REG_IMM_FP32
Definition: SIDefines.h:203
@ OPERAND_REG_INLINE_C_FP32
Definition: SIDefines.h:222
@ OPERAND_REG_INLINE_C_INT32
Definition: SIDefines.h:218
@ OPERAND_REG_INLINE_C_V2INT16
Definition: SIDefines.h:224
@ OPERAND_REG_IMM_V2FP32
Definition: SIDefines.h:214
@ OPERAND_REG_INLINE_AC_FP64
Definition: SIDefines.h:243
@ OPERAND_REG_INLINE_C_FP16
Definition: SIDefines.h:221
@ OPERAND_REG_IMM_INT16
Definition: SIDefines.h:202
@ OPERAND_REG_INLINE_C_V2FP32
Definition: SIDefines.h:228
@ OPERAND_INLINE_SPLIT_BARRIER_INT32
Definition: SIDefines.h:231
@ OPERAND_REG_IMM_FP32_DEFERRED
Definition: SIDefines.h:209
@ OPERAND_REG_IMM_FP16_DEFERRED
Definition: SIDefines.h:208
void initDefaultAMDKernelCodeT(AMDGPUMCKernelCodeT &KernelCode, const MCSubtargetInfo *STI)
bool isNotGFX9Plus(const MCSubtargetInfo &STI)
LLVM_READONLY const MIMGLZMappingInfo * getMIMGLZMappingInfo(unsigned L)
bool hasGDS(const MCSubtargetInfo &STI)
bool isLegalSMRDEncodedUnsignedOffset(const MCSubtargetInfo &ST, int64_t EncodedOffset)
bool isGFX9Plus(const MCSubtargetInfo &STI)
bool hasDPPSrc1SGPR(const MCSubtargetInfo &STI)
bool isVOPD(unsigned Opc)
VOPD::InstInfo getVOPDInstInfo(const MCInstrDesc &OpX, const MCInstrDesc &OpY)
unsigned encodeVmcnt(const IsaVersion &Version, unsigned Waitcnt, unsigned Vmcnt)
unsigned decodeExpcnt(const IsaVersion &Version, unsigned Waitcnt)
bool isCvt_F32_Fp8_Bf8_e64(unsigned Opc)
Waitcnt decodeLoadcntDscnt(const IsaVersion &Version, unsigned LoadcntDscnt)
std::optional< unsigned > getInlineEncodingV2I16(uint32_t Literal)
unsigned getRegBitWidth(const TargetRegisterClass &RC)
Get the size in bits of a register from the register class RC.
static unsigned encodeStorecntDscnt(const IsaVersion &Version, unsigned Storecnt, unsigned Dscnt)
int getMCOpcode(uint16_t Opcode, unsigned Gen)
const MIMGBaseOpcodeInfo * getMIMGBaseOpcode(unsigned Opc)
bool isVI(const MCSubtargetInfo &STI)
LLVM_READONLY const MIMGDimInfo * getMIMGDimInfo(unsigned DimEnum)
bool getMUBUFIsBufferInv(unsigned Opc)
MCRegister mc2PseudoReg(MCRegister Reg)
Convert hardware register Reg to a pseudo register.
std::optional< unsigned > getInlineEncodingV2BF16(uint32_t Literal)
unsigned hasKernargPreload(const MCSubtargetInfo &STI)
bool isMAC(unsigned Opc)
LLVM_READNONE unsigned getOperandSize(const MCOperandInfo &OpInfo)
bool isCI(const MCSubtargetInfo &STI)
unsigned encodeLgkmcnt(const IsaVersion &Version, unsigned Waitcnt, unsigned Lgkmcnt)
bool getVOP2IsSingle(unsigned Opc)
bool getMAIIsDGEMM(unsigned Opc)
Returns true if MAI operation is a double precision GEMM.
LLVM_READONLY const MIMGBaseOpcodeInfo * getMIMGBaseOpcodeInfo(unsigned BaseOpcode)
unsigned getCompletionActionImplicitArgPosition(unsigned CodeObjectVersion)
SmallVector< unsigned > getIntegerVecAttribute(const Function &F, StringRef Name, unsigned Size, unsigned DefaultVal)
int getMaskedMIMGOp(unsigned Opc, unsigned NewChannels)
bool isModuleEntryFunctionCC(CallingConv::ID CC)
bool isNotGFX12Plus(const MCSubtargetInfo &STI)
bool getMTBUFHasVAddr(unsigned Opc)
unsigned decodeVmcnt(const IsaVersion &Version, unsigned Waitcnt)
uint8_t getELFABIVersion(const Triple &T, unsigned CodeObjectVersion)
std::pair< unsigned, unsigned > getIntegerPairAttribute(const Function &F, StringRef Name, std::pair< unsigned, unsigned > Default, bool OnlyFirstRequired)
unsigned getLoadcntBitMask(const IsaVersion &Version)
bool isInlinableLiteralI16(int32_t Literal, bool HasInv2Pi)
bool hasVOPD(const MCSubtargetInfo &STI)
bool isInlinableLiteral64(int64_t Literal, bool HasInv2Pi)
Is this literal inlinable.
const MFMA_F8F6F4_Info * getMFMA_F8F6F4_WithFormatArgs(unsigned CBSZ, unsigned BLGP, unsigned F8F8Opcode)
unsigned getMultigridSyncArgImplicitArgPosition(unsigned CodeObjectVersion)
bool isGFX9_GFX10_GFX11(const MCSubtargetInfo &STI)
bool isGFX9_GFX10(const MCSubtargetInfo &STI)
int getMUBUFElements(unsigned Opc)
static unsigned encodeLoadcntDscnt(const IsaVersion &Version, unsigned Loadcnt, unsigned Dscnt)
const GcnBufferFormatInfo * getGcnBufferFormatInfo(uint8_t BitsPerComp, uint8_t NumComponents, uint8_t NumFormat, const MCSubtargetInfo &STI)
bool isGraphics(CallingConv::ID cc)
unsigned mapWMMA3AddrTo2AddrOpcode(unsigned Opc)
bool isPermlane16(unsigned Opc)
LLVM_READONLY int getSOPPWithRelaxation(uint16_t Opcode)
bool getMUBUFHasSrsrc(unsigned Opc)
unsigned getDscntBitMask(const IsaVersion &Version)
@ AMDGPU_KERNEL
Used for AMDGPU code object kernels.
Definition: CallingConv.h:200
@ SPIR_KERNEL
Used for SPIR kernel functions.
Definition: CallingConv.h:144
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition: CallingConv.h:24
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:480
@ Other
Any other memory.
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
Definition: APFixedPoint.h:303
@ Default
The result values are uniform if and only if all operands are uniform.
uint64_t maxUIntN(uint64_t N)
Gets the maximum value for a N-bit unsigned integer.
Definition: MathExtras.h:219
AMD Kernel Code Object (amd_kernel_code_t).
static constexpr unsigned Width
constexpr EncodingField(ValueType Value)
static constexpr unsigned Offset
static constexpr ValueType Default
static ValueType decode(uint64_t Encoded)
constexpr uint64_t encode() const
static constexpr uint64_t encode(Fields... Values)
static std::tuple< typename Fields::ValueType... > decode(uint64_t Encoded)
constexpr uint64_t encode() const
static ValueType decode(uint64_t Encoded)
Represents the counter values to wait for in an s_waitcnt instruction.
Waitcnt(unsigned LoadCnt, unsigned ExpCnt, unsigned DsCnt, unsigned StoreCnt, unsigned SampleCnt, unsigned BvhCnt, unsigned KmCnt)
bool hasWaitExceptStoreCnt() const
bool hasWaitStoreCnt() const
Waitcnt(unsigned VmCnt, unsigned ExpCnt, unsigned LgkmCnt, unsigned VsCnt)
Waitcnt combined(const Waitcnt &Other) const
Description of the encoding of one expression Op.