LLVM 24.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/ADT/APFloat.h"
17#include "llvm/IR/CallingConv.h"
18#include "llvm/IR/InstrTypes.h"
19#include "llvm/IR/Module.h"
22#include <array>
23#include <functional>
24#include <optional>
25#include <utility>
26
27// Pull in OpName enum definition and getNamedOperandIdx() declaration.
28#define GET_INSTRINFO_OPERAND_ENUM
29#include "AMDGPUGenInstrInfo.inc"
30
32
33namespace llvm {
34
35struct Align;
36class Argument;
37class Function;
38class GlobalValue;
39class MachineInstr;
40class MCInstrInfo;
41class MCRegisterClass;
42class MCRegisterInfo;
43class MCSubtargetInfo;
44class MDNode;
45class StringRef;
46class Triple;
47class raw_ostream;
48
49namespace AMDGPU {
50
51struct AMDGPUMCKernelCodeT;
52struct IsaVersion;
53
54/// Generic target versions emitted by this version of LLVM.
55///
56/// These numbers are incremented every time a codegen breaking change occurs
57/// within a generic family.
58namespace GenericVersion {
59static constexpr unsigned GFX9 = 1;
60static constexpr unsigned GFX9_4 = 1;
61static constexpr unsigned GFX10_1 = 1;
62static constexpr unsigned GFX10_3 = 1;
63static constexpr unsigned GFX11 = 1;
64static constexpr unsigned GFX11_7 = 1;
65static constexpr unsigned GFX12 = 1;
66static constexpr unsigned GFX12_5 = 1;
67static constexpr unsigned GFX13 = 1;
68} // namespace GenericVersion
69
70enum { AMDHSA_COV4 = 4, AMDHSA_COV5 = 5, AMDHSA_COV6 = 6 };
71
72enum class FPType { None, FP4, FP8 };
73
74/// \returns True if \p STI is AMDHSA.
75bool isHsaAbi(const MCSubtargetInfo &STI);
76
77/// \returns Code object version from the IR module flag.
78unsigned getAMDHSACodeObjectVersion(const Module &M);
79
80/// \returns Code object version from ELF's e_ident[EI_ABIVERSION].
81unsigned getAMDHSACodeObjectVersion(unsigned ABIVersion);
82
83/// \returns The default HSA code object version. This should only be used when
84/// we lack a more accurate CodeObjectVersion value (e.g. from the IR module
85/// flag or a .amdhsa_code_object_version directive)
87
88/// \returns ABIVersion suitable for use in ELF's e_ident[EI_ABIVERSION]. \param
89/// CodeObjectVersion is a value returned by getAMDHSACodeObjectVersion().
90uint8_t getELFABIVersion(const Triple &OS, unsigned CodeObjectVersion);
91
92/// \returns The offset of the multigrid_sync_arg argument from implicitarg_ptr
93unsigned getMultigridSyncArgImplicitArgPosition(unsigned COV);
94
95/// \returns The offset of the hostcall pointer argument from implicitarg_ptr
96unsigned getHostcallImplicitArgPosition(unsigned COV);
97
98unsigned getDefaultQueueImplicitArgPosition(unsigned COV);
99unsigned getCompletionActionImplicitArgPosition(unsigned COV);
100
102 unsigned Format;
103 unsigned BitsPerComp;
105 unsigned NumFormat;
106 unsigned DataFormat;
107};
108
114
121
122/// Normalized WMMA or SWMMAC family used to select co-execution rules.
133
135 unsigned T16Op;
136 unsigned HiOp;
137 unsigned LoOp;
138};
139
146
147#define GET_MIMGBaseOpcode_DECL
148#define GET_MIMGDim_DECL
149#define GET_MIMGEncoding_DECL
150#define GET_MIMGLZMapping_DECL
151#define GET_MIMGMIPMapping_DECL
152#define GET_MIMGBiASMapping_DECL
153#define GET_MAIInstInfoTable_DECL
154#define GET_isMFMA_F8F6F4Table_DECL
155#define GET_isCvtScaleF32_F32F16ToF8F4Table_DECL
156#define GET_True16D16Table_DECL
157#define GET_WMMAInstInfoTable_DECL
158#include "AMDGPUGenSearchableTables.inc"
159
162
163/// Construct TargetID from MCSubtargetInfo. \p FeatureString is used to
164/// determine explicitly requested xnack/sramecc settings.
166 StringRef FeatureString);
167
168namespace IsaInfo {
169
170enum {
173};
174
175/// Returns true if \p Lhs and \p Rhs are incompatible (both specific but
176/// different).
178 return Lhs != TargetIDSetting::Any && Rhs != TargetIDSetting::Any &&
179 Lhs != Rhs;
180}
181
182/// \returns Instruction cache line size in bytes for given subtarget \p STI.
183unsigned getInstCacheLineSize(const MCSubtargetInfo &STI);
184
185/// \returns Wavefront size for given subtarget \p STI.
186unsigned getWavefrontSize(const MCSubtargetInfo &STI);
187
188/// \returns Local memory size in bytes for given subtarget \p STI.
189unsigned getLocalMemorySize(const MCSubtargetInfo &STI);
190
191/// \returns Maximum addressable local memory size in bytes for given subtarget
192/// \p STI.
194
195/// \returns Maximum number of work groups per compute unit for given subtarget
196/// \p STI and limited by given \p FlatWorkGroupSize.
197unsigned getMaxWorkGroupsPerCU(const MCSubtargetInfo &STI,
198 unsigned FlatWorkGroupSize);
199
200/// \returns Number of waves per execution unit required to support the given \p
201/// FlatWorkGroupSize.
203 unsigned FlatWorkGroupSize);
204
205/// \returns Number of waves per work group for given subtarget \p STI and
206/// \p FlatWorkGroupSize.
207unsigned getWavesPerWorkGroup(const MCSubtargetInfo &STI,
208 unsigned FlatWorkGroupSize);
209
210/// \returns SGPR encoding granularity for given subtarget \p STI.
211unsigned getSGPREncodingGranule(const MCSubtargetInfo &STI);
212
213/// \returns Minimum number of SGPRs that meets the given number of waves per
214/// execution unit requirement for given subtarget \p STI.
215unsigned getMinNumSGPRs(const MCSubtargetInfo &STI, unsigned WavesPerEU);
216
217/// \returns Maximum number of SGPRs that meets the given number of waves per
218/// execution unit requirement for given subtarget \p STI.
219unsigned getMaxNumSGPRs(const MCSubtargetInfo &STI, unsigned WavesPerEU,
220 bool Addressable);
221
222/// \returns Number of extra SGPRs implicitly required by given subtarget \p
223/// STI when the given special registers are used.
224unsigned getNumExtraSGPRs(const MCSubtargetInfo &STI, bool VCCUsed,
225 bool FlatScrUsed, bool XNACKUsed);
226
227/// \returns Number of SGPR blocks needed for given subtarget \p STI when
228/// \p NumSGPRs are used. \p NumSGPRs should already include any special
229/// register counts.
230unsigned getNumSGPRBlocks(const MCSubtargetInfo &STI, unsigned NumSGPRs);
231
232/// \returns VGPR allocation granularity for given subtarget \p STI.
233///
234/// For subtargets which support it, \p EnableWavefrontSize32 should match
235/// the ENABLE_WAVEFRONT_SIZE32 kernel descriptor field.
236unsigned
237getVGPRAllocGranule(const MCSubtargetInfo &STI, unsigned DynamicVGPRBlockSize,
238 std::optional<bool> EnableWavefrontSize32 = std::nullopt);
239
240/// \returns VGPR encoding granularity for given subtarget \p STI.
241///
242/// For subtargets which support it, \p EnableWavefrontSize32 should match
243/// the ENABLE_WAVEFRONT_SIZE32 kernel descriptor field.
245 const MCSubtargetInfo &STI,
246 std::optional<bool> EnableWavefrontSize32 = std::nullopt);
247
248/// For subtargets with a unified VGPR file and mixed ArchVGPR/AGPR usage,
249/// returns the allocation granule for ArchVGPRs.
250unsigned getArchVGPRAllocGranule();
251
252/// Maximum number of VGPR blocks that can be allocated in dynamic VGPR mode.
253static constexpr unsigned MaxDynamicVGPRBlocks = 8;
254
255/// \returns Addressable number of architectural VGPRs for a given subtarget \p
256/// STI.
258
259/// \returns Addressable number of VGPRs for given subtarget \p STI.
260unsigned getAddressableNumVGPRs(const MCSubtargetInfo &STI,
261 unsigned DynamicVGPRBlockSize);
262
263/// \returns Minimum number of VGPRs that meets given number of waves per
264/// execution unit requirement for given subtarget \p STI.
265unsigned getMinNumVGPRs(const MCSubtargetInfo &STI, unsigned WavesPerEU,
266 unsigned DynamicVGPRBlockSize);
267
268/// \returns Maximum number of VGPRs that meets given number of waves per
269/// execution unit requirement for given subtarget \p STI.
270unsigned getMaxNumVGPRs(const MCSubtargetInfo &STI, unsigned WavesPerEU,
271 unsigned DynamicVGPRBlockSize);
272
273/// \returns Number of waves reachable for a given \p NumVGPRs usage for given
274/// subtarget \p STI.
276 unsigned NumVGPRs,
277 unsigned DynamicVGPRBlockSize);
278
279/// \returns Number of waves reachable for a given \p NumVGPRs usage, \p Granule
280/// size, \p MaxWaves possible, and \p TotalNumVGPRs available.
281unsigned getNumWavesPerEUWithNumVGPRs(unsigned NumVGPRs, unsigned Granule,
282 unsigned MaxWaves,
283 unsigned TotalNumVGPRs);
284
285/// \returns Whether allocated SGPRs can reduce occupancy on subtarget \p STI
286/// (true pre-GFX10). One named capability so callers don't test the version.
288
289/// \returns SGPR-limited occupancy (waves per EU) for subtarget \p STI: the
290/// inverse of getMaxNumSGPRs(). Unlike getMaxNumSGPRs() the budget is not
291/// clamped to the addressable count, since the allocated count callers pass in
292/// can exceed it.
293unsigned getOccupancyWithNumSGPRs(const MCSubtargetInfo &STI, unsigned SGPRs);
294
295/// \returns SGPR-limited occupancy computed from explicit budget parameters
296/// (\p MaxWaves, \p TotalNumSGPRs, \p Granule, \p TrapReserve). Subtarget-free
297/// core shared by the overload above and the occupancy MCExpr. Callers must
298/// check isSGPROccupancyLimited() first.
299unsigned getOccupancyWithNumSGPRs(unsigned SGPRs, unsigned MaxWaves,
300 unsigned TotalNumSGPRs, unsigned Granule,
301 unsigned TrapReserve);
302
303/// \returns Number of VGPR blocks that need to be allocated for the given
304/// subtarget \p STI when \p NumVGPRs are used.
306 const MCSubtargetInfo &STI, unsigned NumVGPRs,
307 unsigned DynamicVGPRBlockSize,
308 std::optional<bool> EnableWavefrontSize32 = std::nullopt);
309
310} // end namespace IsaInfo
311
312// Represents a field in an encoded value.
313template <unsigned HighBit, unsigned LowBit, unsigned D = 0>
315 static_assert(HighBit >= LowBit, "Invalid bit range!");
316 static constexpr unsigned Offset = LowBit;
317 static constexpr unsigned Width = HighBit - LowBit + 1;
318
320 static_assert(Width <= sizeof(ValueType) * 8);
321 static constexpr ValueType Default = D;
322
325
326 constexpr uint64_t encode() const { return Value; }
327 static ValueType decode(uint64_t Encoded) {
328 return static_cast<ValueType>(Encoded);
329 }
330};
331
332// Represents a single bit in an encoded value.
333template <unsigned Bit, unsigned D = 0>
335
336// A helper for encoding and decoding multiple fields.
337template <typename... Fields> struct EncodingFields {
338 static constexpr uint64_t encode(Fields... Values) {
339 return ((Values.encode() << Values.Offset) | ...);
340 }
341
342 static std::tuple<typename Fields::ValueType...> decode(uint64_t Encoded) {
343 return {Fields::decode((Encoded >> Fields::Offset) &
344 maxUIntN(Fields::Width))...};
345 }
346};
347
349inline bool hasNamedOperand(uint32_t Opcode, OpName NamedIdx) {
350 return getNamedOperandIdx(Opcode, NamedIdx) != -1;
351}
352
355
376
379
381const MIMGBaseOpcodeInfo *getMIMGBaseOpcodeInfo(unsigned BaseOpcode);
382
393
395const MIMGDimInfo *getMIMGDimInfo(unsigned DimEnum);
396
398
401
404
406 MIMGBaseOpcode L;
407 MIMGBaseOpcode LZ;
408};
409
411 MIMGBaseOpcode MIP;
412 MIMGBaseOpcode NONMIP;
413};
414
416 MIMGBaseOpcode Bias;
417 MIMGBaseOpcode NoBias;
418};
419
421 MIMGBaseOpcode Offset;
422 MIMGBaseOpcode NoOffset;
423};
424
426 MIMGBaseOpcode G;
427 MIMGBaseOpcode G16;
428};
429
432
434 unsigned Opcode2Addr;
435 unsigned Opcode3Addr;
436};
437
440
443
446
449
451int getMIMGOpcode(unsigned BaseOpcode, unsigned MIMGEncoding,
452 unsigned VDataDwords, unsigned VAddrDwords,
453 bool IndexedRsrc = false, bool IndexedSamp = false);
454
456int getMaskedMIMGOp(unsigned Opc, unsigned NewChannels);
457
459unsigned getAddrSizeMIMGOp(const MIMGBaseOpcodeInfo *BaseOpcode,
460 const MIMGDimInfo *Dim, bool IsA16,
461 bool IsG16Supported);
462
473
475const MIMGInfo *getMIMGInfo(unsigned Opc);
476
478int getMTBUFBaseOpcode(unsigned Opc);
479
481int getMTBUFOpcode(unsigned BaseOpc, unsigned Elements);
482
484int getMTBUFElements(unsigned Opc);
485
487bool getMTBUFHasVAddr(unsigned Opc);
488
490bool getMTBUFHasSrsrc(unsigned Opc);
491
493bool getMTBUFHasSoffset(unsigned Opc);
494
496int getMUBUFBaseOpcode(unsigned Opc);
497
499int getMUBUFOpcode(unsigned BaseOpc, unsigned Elements);
500
502int getMUBUFElements(unsigned Opc);
503
505bool getMUBUFHasVAddr(unsigned Opc);
506
508bool getMUBUFHasSrsrc(unsigned Opc);
509
511bool getMUBUFHasSoffset(unsigned Opc);
512
514bool getMUBUFIsBufferInv(unsigned Opc);
515
517bool getMUBUFTfe(unsigned Opc);
518
520bool getSMEMIsBuffer(unsigned Opc);
521
523bool getVOP1IsSingle(unsigned Opc);
524
526bool getVOP2IsSingle(unsigned Opc);
527
529bool getVOP3IsSingle(unsigned Opc);
530
532bool isVOPC64DPP(unsigned Opc);
533
535bool isVOPCAsmOnly(unsigned Opc);
536
537/// Returns true if this VOP3P opcode has no op_sel_hi field, in which case
538/// those bits are encoded as zero instead of defaulting to one.
540bool hasNoOpSelHi(unsigned Opc);
541
542/// Returns true if MAI operation is a double precision GEMM.
544bool getMAIIsDGEMM(unsigned Opc);
545
547bool getMAIIsGFX940XDL(unsigned Opc);
548
550bool getWMMAIsXDL(unsigned Opc);
551
553bool getHasMatrixScale(unsigned Opc);
554
555// Get an equivalent BitOp3 for a binary logical \p Opc.
556// \returns BitOp3 modifier for the logical operation or zero.
557// Used in VOPD3 conversion.
558unsigned getBitOp2(unsigned Opc);
559
560struct CanBeVOPD {
561 bool X;
562 bool Y;
563};
564
565/// \returns SIEncodingFamily used for VOPD encoding on a \p ST.
567unsigned getVOPDEncodingFamily(const MCSubtargetInfo &ST);
568
570CanBeVOPD getCanBeVOPD(unsigned Opc, unsigned EncodingFamily, bool VOPD3);
571
573uint8_t mfmaScaleF8F6F4FormatToNumRegs(unsigned EncodingVal);
574
577 unsigned BLGP,
578 unsigned F8F8Opcode);
579
582
585 unsigned FmtB,
586 unsigned F8F8Opcode);
587
588/// \return true if this combination is listed as valid.
590bool isValidWMMAScaleFmtCombination(unsigned AFmt, unsigned AScale,
591 unsigned BFmt, unsigned BScale);
592
593/// \returns the matrix_a_fmt and matrix_b_fmt operands of an f8f6f4 WMMA.
594/// Works on both MCInst and MachineInstr.
595template <typename InstT>
596std::pair<unsigned, unsigned> getWMMAMatrixFmts(const InstT &MI) {
597 unsigned Opc = MI.getOpcode();
598 int AIdx = getNamedOperandIdx(Opc, OpName::matrix_a_fmt);
599 int BIdx = getNamedOperandIdx(Opc, OpName::matrix_b_fmt);
600 assert(AIdx != -1 && BIdx != -1 && "expected an f8f6f4 WMMA");
601 return {static_cast<unsigned>(MI.getOperand(AIdx).getImm()),
602 static_cast<unsigned>(MI.getOperand(BIdx).getImm())};
603}
604
605/// \returns true if either matrix input of an f8f6f4 WMMA is f8.
606template <typename InstT> bool isWMMAAnyF8(const InstT &MI) {
607 auto [AFmt, BFmt] = getWMMAMatrixFmts(MI);
608 return AFmt <= WMMA::MATRIX_FMT_BF8 || BFmt <= WMMA::MATRIX_FMT_BF8;
609}
610
611/// \returns true if both matrix inputs of an f8f6f4 WMMA are f4.
612template <typename InstT> bool isWMMABothF4(const InstT &MI) {
613 auto [AFmt, BFmt] = getWMMAMatrixFmts(MI);
614 return AFmt == WMMA::MATRIX_FMT_FP4 && BFmt == WMMA::MATRIX_FMT_FP4;
615}
616
618const GcnBufferFormatInfo *getGcnBufferFormatInfo(uint8_t BitsPerComp,
619 uint8_t NumComponents,
620 uint8_t NumFormat,
621 const MCSubtargetInfo &STI);
623const GcnBufferFormatInfo *getGcnBufferFormatInfo(uint8_t Format,
624 const MCSubtargetInfo &STI);
625
627int32_t getMCOpcode(uint32_t Opcode, unsigned Gen);
628
630unsigned getVOPDOpcode(unsigned Opc, bool VOPD3);
631
633int getVOPDFull(unsigned OpX, unsigned OpY, unsigned EncodingFamily,
634 bool VOPD3);
635
637bool isVOPD(unsigned Opc);
638
640bool isMAC(unsigned Opc);
641
643bool isPermlane16(unsigned Opc);
644
646bool isGenericAtomic(unsigned Opc);
647
649bool isCvt_F32_Fp8_Bf8_e64(unsigned Opc);
650
651namespace VOPD {
652
663
664// LSB mask for VGPR banks per VOPD component operand.
665// 4 banks result in a mask 3, setting 2 lower bits.
666constexpr unsigned VOPD_VGPR_BANK_MASKS[] = {1, 3, 3, 1};
667constexpr unsigned VOPD3_VGPR_BANK_MASKS[] = {1, 3, 3, 3};
668// GFX11 VOPD interlock hazard requires SRC0/SRC1 to have
669// different parities, not just on different banks. Else,
670// non-deterministic forwarding error may occur.
671constexpr unsigned VOPD_GFX11_VGPR_BANK_MASKS[] = {1, 1, 1, 1};
672
673enum ComponentIndex : unsigned { X = 0, Y = 1 };
675constexpr unsigned COMPONENTS_NUM = 2;
676
677// Properties of VOPD components.
679private:
680 unsigned SrcOperandsNum = 0;
681 unsigned MandatoryLiteralIdx = ~0u;
682 bool HasSrc2Acc = false;
683 unsigned NumVOPD3Mods = 0;
684 unsigned Opcode = 0;
685 bool IsVOP3 = false;
686
687public:
688 ComponentProps() = default;
689 ComponentProps(const MCInstrDesc &OpDesc, bool VOP3Layout = false);
690
691 // Return the total number of src operands this component has.
692 unsigned getCompSrcOperandsNum() const { return SrcOperandsNum; }
693
694 // Return the number of src operands of this component visible to the parser.
696 return SrcOperandsNum - HasSrc2Acc;
697 }
698
699 // Return true iif this component has a mandatory literal.
700 bool hasMandatoryLiteral() const { return MandatoryLiteralIdx != ~0u; }
701
702 // If this component has a mandatory literal, return component operand
703 // index of this literal (i.e. either Component::SRC1 or Component::SRC2).
706 return MandatoryLiteralIdx;
707 }
708
709 // Return true iif this component has operand
710 // with component index CompSrcIdx and this operand may be a register.
711 bool hasRegSrcOperand(unsigned CompSrcIdx) const {
712 assert(CompSrcIdx < Component::MAX_SRC_NUM);
713 return SrcOperandsNum > CompSrcIdx && !hasMandatoryLiteralAt(CompSrcIdx);
714 }
715
716 // Return true iif this component has tied src2.
717 bool hasSrc2Acc() const { return HasSrc2Acc; }
718
719 // Return a number of source modifiers if instruction is used in VOPD3.
720 unsigned getCompVOPD3ModsNum() const { return NumVOPD3Mods; }
721
722 // Return opcode of the component.
723 unsigned getOpcode() const { return Opcode; }
724
725 // Returns if component opcode is in VOP3 encoding.
726 unsigned isVOP3() const { return IsVOP3; }
727
728 // Return index of BitOp3 operand or -1.
729 int getBitOp3OperandIdx() const;
730
731private:
732 bool hasMandatoryLiteralAt(unsigned CompSrcIdx) const {
733 assert(CompSrcIdx < Component::MAX_SRC_NUM);
734 return MandatoryLiteralIdx == Component::DST_NUM + CompSrcIdx;
735 }
736};
737
738enum ComponentKind : unsigned {
739 SINGLE = 0, // A single VOP1 or VOP2 instruction which may be used in VOPD.
740 COMPONENT_X, // A VOPD instruction, X component.
741 COMPONENT_Y, // A VOPD instruction, Y component.
743};
744
745// Interface functions of this class map VOPD component operand indices
746// to indices of operands in MachineInstr/MCInst or parsed operands array.
747//
748// Note that this class operates with 3 kinds of indices:
749// - VOPD component operand indices (Component::DST, Component::SRC0, etc.);
750// - MC operand indices (they refer operands in a MachineInstr/MCInst);
751// - parsed operand indices (they refer operands in parsed operands array).
752//
753// For SINGLE components mapping between these indices is trivial.
754// But things get more complicated for COMPONENT_X and
755// COMPONENT_Y because these components share the same
756// MachineInstr/MCInst and the same parsed operands array.
757// Below is an example of component operand to parsed operand
758// mapping for the following instruction:
759//
760// v_dual_add_f32 v255, v4, v5 :: v_dual_mov_b32 v6, v1
761//
762// PARSED COMPONENT PARSED
763// COMPONENT OPERANDS OPERAND INDEX OPERAND INDEX
764// -------------------------------------------------------------------
765// "v_dual_add_f32" 0
766// v_dual_add_f32 v255 0 (DST) --> 1
767// v4 1 (SRC0) --> 2
768// v5 2 (SRC1) --> 3
769// "::" 4
770// "v_dual_mov_b32" 5
771// v_dual_mov_b32 v6 0 (DST) --> 6
772// v1 1 (SRC0) --> 7
773// -------------------------------------------------------------------
774//
776private:
777 // Regular MachineInstr/MCInst operands are ordered as follows:
778 // dst, src0 [, other src operands]
779 // VOPD MachineInstr/MCInst operands are ordered as follows:
780 // dstX, dstY, src0X [, other OpX operands], src0Y [, other OpY operands]
781 // Each ComponentKind has operand indices defined below.
782 static constexpr unsigned MC_DST_IDX[] = {0, 0, 1};
783
784 // VOPD3 instructions may have 2 or 3 source modifiers, src2 modifier is not
785 // used if there is tied accumulator. Indexing of this array:
786 // MC_SRC_IDX[VOPD3ModsNum][SrcNo]. This returns an index for a SINGLE
787 // instruction layout, add 1 for COMPONENT_X or COMPONENT_Y. For the second
788 // component add OpX.MCSrcNum + OpX.VOPD3ModsNum.
789 // For VOPD1/VOPD2 use column with zero modifiers.
790 static constexpr unsigned SINGLE_MC_SRC_IDX[4][3] = {
791 {1, 2, 3}, {2, 3, 4}, {2, 4, 5}, {2, 4, 6}};
792
793 // Parsed operands of regular instructions are ordered as follows:
794 // Mnemo dst src0 [vsrc1 ...]
795 // Parsed VOPD operands are ordered as follows:
796 // OpXMnemo dstX src0X [vsrc1X|imm vsrc1X|vsrc1X imm] '::'
797 // OpYMnemo dstY src0Y [vsrc1Y|imm vsrc1Y|vsrc1Y imm]
798 // Each ComponentKind has operand indices defined below.
799 static constexpr unsigned PARSED_DST_IDX[] = {1, 1,
800 4 /* + OpX.ParsedSrcNum */};
801 static constexpr unsigned FIRST_PARSED_SRC_IDX[] = {
802 2, 2, 5 /* + OpX.ParsedSrcNum */};
803
804private:
805 const ComponentKind Kind;
806 const ComponentProps PrevComp;
807 const unsigned VOPD3ModsNum;
808 const int BitOp3Idx; // Index of bitop3 operand or -1
809
810public:
811 // Create layout for COMPONENT_X or SINGLE component.
812 ComponentLayout(ComponentKind Kind, unsigned VOPD3ModsNum, int BitOp3Idx)
813 : Kind(Kind), VOPD3ModsNum(VOPD3ModsNum), BitOp3Idx(BitOp3Idx) {
815 }
816
817 // Create layout for COMPONENT_Y which depends on COMPONENT_X layout.
818 ComponentLayout(const ComponentProps &OpXProps, unsigned VOPD3ModsNum,
819 int BitOp3Idx)
820 : Kind(ComponentKind::COMPONENT_Y), PrevComp(OpXProps),
821 VOPD3ModsNum(VOPD3ModsNum), BitOp3Idx(BitOp3Idx) {}
822
823public:
824 // Return the index of dst operand in MCInst operands.
825 unsigned getIndexOfDstInMCOperands() const { return MC_DST_IDX[Kind]; }
826
827 // Return the index of the specified src operand in MCInst operands.
828 unsigned getIndexOfSrcInMCOperands(unsigned CompSrcIdx, bool VOPD3) const {
829 assert(CompSrcIdx < Component::MAX_SRC_NUM);
830
831 if (Kind == SINGLE && CompSrcIdx == 2 && BitOp3Idx != -1)
832 return BitOp3Idx;
833
834 if (VOPD3) {
835 return SINGLE_MC_SRC_IDX[VOPD3ModsNum][CompSrcIdx] + getPrevCompSrcNum() +
836 getPrevCompVOPD3ModsNum() + (Kind != SINGLE ? 1 : 0);
837 }
838
839 return SINGLE_MC_SRC_IDX[0][CompSrcIdx] + getPrevCompSrcNum() +
840 (Kind != SINGLE ? 1 : 0);
841 }
842
843 // Return the index of dst operand in the parsed operands array.
845 return PARSED_DST_IDX[Kind] + getPrevCompParsedSrcNum();
846 }
847
848 // Return the index of the specified src operand in the parsed operands array.
849 unsigned getIndexOfSrcInParsedOperands(unsigned CompSrcIdx) const {
850 assert(CompSrcIdx < Component::MAX_SRC_NUM);
851 return FIRST_PARSED_SRC_IDX[Kind] + getPrevCompParsedSrcNum() + CompSrcIdx;
852 }
853
854private:
855 unsigned getPrevCompSrcNum() const {
856 return PrevComp.getCompSrcOperandsNum();
857 }
858 unsigned getPrevCompParsedSrcNum() const {
859 return PrevComp.getCompParsedSrcOperandsNum();
860 }
861 unsigned getPrevCompVOPD3ModsNum() const {
862 return PrevComp.getCompVOPD3ModsNum();
863 }
864};
865
866// Layout and properties of VOPD components.
868public:
869 // Create ComponentInfo for COMPONENT_X or SINGLE component.
872 bool VOP3Layout = false)
873 : ComponentProps(OpDesc, VOP3Layout),
875
876 // Create ComponentInfo for COMPONENT_Y which depends on COMPONENT_X layout.
877 ComponentInfo(const MCInstrDesc &OpDesc, const ComponentProps &OpXProps,
878 bool VOP3Layout = false)
879 : ComponentProps(OpDesc, VOP3Layout),
882
883 // Map component operand index to parsed operand index.
884 // Return 0 if the specified operand does not exist.
885 unsigned getIndexInParsedOperands(unsigned CompOprIdx) const;
886};
887
888// Properties of VOPD instructions.
889class InstInfo {
890private:
891 const ComponentInfo CompInfo[COMPONENTS_NUM];
892
893public:
894 using RegIndices = std::array<MCRegister, Component::MAX_OPR_NUM>;
895
896 InstInfo(const MCInstrDesc &OpX, const MCInstrDesc &OpY)
897 : CompInfo{OpX, OpY} {}
898
899 InstInfo(const ComponentInfo &OprInfoX, const ComponentInfo &OprInfoY)
900 : CompInfo{OprInfoX, OprInfoY} {}
901
902 const ComponentInfo &operator[](size_t ComponentIdx) const {
903 assert(ComponentIdx < COMPONENTS_NUM);
904 return CompInfo[ComponentIdx];
905 }
906
907 // Check VOPD operands constraints.
908 // GetRegIdx(Component, MCOperandIdx) must return a VGPR register index
909 // for the specified component and MC operand. The callback must return 0
910 // if the operand is not a register or not a VGPR.
911 // If \p SkipSrc is set to true then constraints for source operands are not
912 // checked.
913 // If \p AllowSameVGPR is set then same VGPRs are allowed for X and Y sources
914 // even though it violates requirement to be from different banks.
915 // If \p VOPD3 is set to true both dst registers allowed to be either odd
916 // or even and instruction may have real src2 as opposed to tied accumulator.
917 // If \p HasGFX11InterlockHazard is set then X/Y SRC0 and SRC1 VGPRs
918 // must have different register-number parity.
919 bool
920 hasInvalidOperand(std::function<MCRegister(unsigned, unsigned)> GetRegIdx,
921 const MCRegisterInfo &MRI, bool SkipSrc = false,
922 bool AllowSameVGPR = false, bool VOPD3 = false,
923 bool HasGFX11InterlockHazard = false) const {
924 return getInvalidCompOperandIndex(GetRegIdx, MRI, SkipSrc, AllowSameVGPR,
925 VOPD3, HasGFX11InterlockHazard)
926 .has_value();
927 }
928
929 // Check VOPD operands constraints.
930 // Return the index of an invalid component operand, if any.
931 // If \p SkipSrc is set to true then constraints for source operands are not
932 // checked except for being from the same halves of VGPR file on gfx1250.
933 // If \p AllowSameVGPR is set then same VGPRs are allowed for X and Y sources
934 // even though it violates requirement to be from different banks.
935 // If \p VOPD3 is set to true both dst registers allowed to be either odd
936 // or even and instruction may have real src2 as opposed to tied accumulator.
937 // If \p HasGFX11InterlockHazard is set then X/Y SRC0 and SRC1 VGPRs
938 // must have different register-number parity.
939 std::optional<unsigned> getInvalidCompOperandIndex(
940 std::function<MCRegister(unsigned, unsigned)> GetRegIdx,
941 const MCRegisterInfo &MRI, bool SkipSrc = false,
942 bool AllowSameVGPR = false, bool VOPD3 = false,
943 bool HasGFX11InterlockHazard = false) const;
944
945private:
947 getRegIndices(unsigned ComponentIdx,
948 std::function<MCRegister(unsigned, unsigned)> GetRegIdx,
949 bool VOPD3) const;
950};
951
952} // namespace VOPD
953
955std::pair<unsigned, unsigned> getVOPDComponents(unsigned VOPDOpcode);
956
958// Get properties of 2 single VOP1/VOP2 instructions
959// used as components to create a VOPD instruction.
960VOPD::InstInfo getVOPDInstInfo(const MCInstrDesc &OpX, const MCInstrDesc &OpY);
961
963// Get properties of VOPD X and Y components.
964VOPD::InstInfo getVOPDInstInfo(unsigned VOPDOpcode,
965 const MCInstrInfo *InstrInfo);
966
968bool isAsyncStore(unsigned Opc);
970bool isTensorStore(unsigned Opc);
972unsigned getTemporalHintType(const MCInstrDesc TID);
973
975bool isTrue16Inst(unsigned Opc);
976
978FPType getFPDstSelType(unsigned Opc);
979
980bool isDPMACCInstruction(unsigned Opc);
981
983unsigned mapWMMA2AddrTo3AddrOpcode(unsigned Opc);
984
985void initDefaultAMDKernelCodeT(AMDGPUMCKernelCodeT &Header,
986 const MCSubtargetInfo &STI);
987
988bool isReadOnlySegment(const GlobalValue *GV);
989
990/// \returns True if constants should be emitted to .text section for given
991/// target triple \p TT, false otherwise.
993
994/// Returns a valid charcode or 0 in the first entry if this is a valid physical
995/// register name. Followed by the start register number, and the register
996/// width. Does not validate the number of registers exists in the class. Unlike
997/// parseAsmConstraintPhysReg, this does not expect the name to be wrapped in
998/// "{}".
999std::tuple<char, unsigned, unsigned> parseAsmPhysRegName(StringRef TupleString);
1000
1001/// Returns a valid charcode or 0 in the first entry if this is a valid physical
1002/// register constraint. Followed by the start register number, and the register
1003/// width. Does not validate the number of registers exists in the class.
1004std::tuple<char, unsigned, unsigned>
1006
1007/// \returns A pair of integer values requested using \p F's \p Name attribute
1008/// in "first[,second]" format ("second" is optional unless \p OnlyFirstRequired
1009/// is false).
1010///
1011/// \returns \p Default if attribute is not present.
1012///
1013/// \returns \p Default and emits error if one of the requested values cannot be
1014/// converted to integer, or \p OnlyFirstRequired is false and "second" value is
1015/// not present.
1016std::pair<unsigned, unsigned>
1018 std::pair<unsigned, unsigned> Default,
1019 bool OnlyFirstRequired = false);
1020
1021/// \returns A pair of integer values requested using \p F's \p Name attribute
1022/// in "first[,second]" format ("second" is optional unless \p OnlyFirstRequired
1023/// is false).
1024///
1025/// \returns \p std::nullopt if attribute is not present.
1026///
1027/// \returns \p std::nullopt and emits error if one of the requested values
1028/// cannot be converted to integer, or \p OnlyFirstRequired is false and
1029/// "second" value is not present.
1030std::optional<std::pair<unsigned, std::optional<unsigned>>>
1032 bool OnlyFirstRequired = false);
1033
1034/// \returns Generate a vector of integer values requested using \p F's \p Name
1035/// attribute.
1036/// \returns A vector of size \p Size, with all elements set to \p DefaultVal,
1037/// if any error occurs. The corresponding error will also be emitted.
1039 unsigned Size,
1040 unsigned DefaultVal);
1041/// Similar to the function above, but returns std::nullopt if any error occurs.
1042std::optional<SmallVector<unsigned>>
1043getIntegerVecAttribute(const Function &F, StringRef Name, unsigned Size);
1044
1045/// \returns The maximum number of workgroups for the function.
1047
1048inline bool isTgSplitEnabled(const Function &F) {
1049 return F.hasFnAttribute("amdgpu-tg-split");
1050}
1051
1052/// Checks if \p Val is inside \p MD, a !range-like metadata.
1053bool hasValueInRangeLikeMetadata(const MDNode &MD, int64_t Val);
1054
1055// The following methods are only meaningful on targets that support
1056// S_WAITCNT.
1057
1058/// \returns Vmcnt bit mask for given isa \p Version.
1059unsigned getVmcntBitMask(const IsaVersion &Version);
1060
1061/// \returns Expcnt bit mask for given isa \p Version.
1062unsigned getExpcntBitMask(const IsaVersion &Version);
1063
1064/// \returns Lgkmcnt bit mask for given isa \p Version.
1065unsigned getLgkmcntBitMask(const IsaVersion &Version);
1066
1067/// \returns Waitcnt bit mask for given isa \p Version.
1068unsigned getWaitcntBitMask(const IsaVersion &Version);
1069
1070/// \returns Decoded Vmcnt from given \p Waitcnt for given isa \p Version.
1071unsigned decodeVmcnt(const IsaVersion &Version, unsigned Waitcnt);
1072
1073/// \returns Decoded Expcnt from given \p Waitcnt for given isa \p Version.
1074unsigned decodeExpcnt(const IsaVersion &Version, unsigned Waitcnt);
1075
1076/// \returns Decoded Lgkmcnt from given \p Waitcnt for given isa \p Version.
1077unsigned decodeLgkmcnt(const IsaVersion &Version, unsigned Waitcnt);
1078
1079/// \returns Decoded Loadcnt from given \p Waitcnt for given isa \p Version.
1080unsigned decodeLoadcnt(const IsaVersion &Version, unsigned Waitcnt);
1081
1082/// \returns Decoded Storecnt from given \p Waitcnt for given isa \p Version.
1083unsigned decodeStorecnt(const IsaVersion &Version, unsigned Waitcnt);
1084
1085/// \returns Decoded Dscnt from given \p Waitcnt for given isa \p Version.
1086unsigned decodeDscnt(const IsaVersion &Version, unsigned Waitcnt);
1087
1088/// Decodes Vmcnt, Expcnt and Lgkmcnt from given \p Waitcnt for given isa
1089/// \p Version, and writes decoded values into \p Vmcnt, \p Expcnt and
1090/// \p Lgkmcnt respectively. Should not be used on gfx12+, the instruction
1091/// which needs it is deprecated
1092///
1093/// \details \p Vmcnt, \p Expcnt and \p Lgkmcnt are decoded as follows:
1094/// \p Vmcnt = \p Waitcnt[3:0] (pre-gfx9)
1095/// \p Vmcnt = \p Waitcnt[15:14,3:0] (gfx9,10)
1096/// \p Vmcnt = \p Waitcnt[15:10] (gfx11)
1097/// \p Expcnt = \p Waitcnt[6:4] (pre-gfx11)
1098/// \p Expcnt = \p Waitcnt[2:0] (gfx11)
1099/// \p Lgkmcnt = \p Waitcnt[11:8] (pre-gfx10)
1100/// \p Lgkmcnt = \p Waitcnt[13:8] (gfx10)
1101/// \p Lgkmcnt = \p Waitcnt[9:4] (gfx11)
1102///
1103void decodeWaitcnt(const IsaVersion &Version, unsigned Waitcnt, unsigned &Vmcnt,
1104 unsigned &Expcnt, unsigned &Lgkmcnt);
1105
1106/// \returns \p Waitcnt with encoded \p Vmcnt for given isa \p Version.
1107unsigned encodeVmcnt(const IsaVersion &Version, unsigned Waitcnt,
1108 unsigned Vmcnt);
1109
1110/// \returns \p Waitcnt with encoded \p Expcnt for given isa \p Version.
1111unsigned encodeExpcnt(const IsaVersion &Version, unsigned Waitcnt,
1112 unsigned Expcnt);
1113
1114/// \returns \p Waitcnt with encoded \p Lgkmcnt for given isa \p Version.
1115unsigned encodeLgkmcnt(const IsaVersion &Version, unsigned Waitcnt,
1116 unsigned Lgkmcnt);
1117
1118/// Encodes \p Vmcnt, \p Expcnt and \p Lgkmcnt into Waitcnt for given isa
1119/// \p Version. Should not be used on gfx12+, the instruction which needs
1120/// it is deprecated
1121///
1122/// \details \p Vmcnt, \p Expcnt and \p Lgkmcnt are encoded as follows:
1123/// Waitcnt[2:0] = \p Expcnt (gfx11+)
1124/// Waitcnt[3:0] = \p Vmcnt (pre-gfx9)
1125/// Waitcnt[3:0] = \p Vmcnt[3:0] (gfx9,10)
1126/// Waitcnt[6:4] = \p Expcnt (pre-gfx11)
1127/// Waitcnt[9:4] = \p Lgkmcnt (gfx11)
1128/// Waitcnt[11:8] = \p Lgkmcnt (pre-gfx10)
1129/// Waitcnt[13:8] = \p Lgkmcnt (gfx10)
1130/// Waitcnt[15:10] = \p Vmcnt (gfx11)
1131/// Waitcnt[15:14] = \p Vmcnt[5:4] (gfx9,10)
1132///
1133/// \returns Waitcnt with encoded \p Vmcnt, \p Expcnt and \p Lgkmcnt for given
1134/// isa \p Version.
1135///
1136unsigned encodeWaitcnt(const IsaVersion &Version, unsigned Vmcnt,
1137 unsigned Expcnt, unsigned Lgkmcnt);
1138
1139/// \returns Waitcnt with encoded \p Loadcnt and \p Dscnt for given isa \p
1140/// Version.
1141unsigned encodeLoadcntDscnt(const IsaVersion &Version, unsigned Loadcnt,
1142 unsigned Dscnt);
1143
1144/// \returns Waitcnt with encoded \p Storecnt and \p Dscnt for given isa \p
1145/// Version.
1146unsigned encodeStorecntDscnt(const IsaVersion &Version, unsigned Storecnt,
1147 unsigned Dscnt);
1148
1149// The following methods are only meaningful on targets that support
1150// S_WAIT_*CNT, introduced with gfx12.
1151
1152/// \returns Loadcnt bit mask for given isa \p Version.
1153/// Returns 0 for versions that do not support LOADcnt
1154unsigned getLoadcntBitMask(const IsaVersion &Version);
1155
1156/// \returns Samplecnt bit mask for given isa \p Version.
1157/// Returns 0 for versions that do not support SAMPLEcnt
1158unsigned getSamplecntBitMask(const IsaVersion &Version);
1159
1160/// \returns Bvhcnt bit mask for given isa \p Version.
1161/// Returns 0 for versions that do not support BVHcnt
1162unsigned getBvhcntBitMask(const IsaVersion &Version);
1163
1164/// \returns Asynccnt bit mask for given isa \p Version.
1165/// Returns 0 for versions that do not support Asynccnt
1166unsigned getAsynccntBitMask(const IsaVersion &Version);
1167
1168/// \returns Dscnt bit mask for given isa \p Version.
1169/// Returns 0 for versions that do not support DScnt
1170unsigned getDscntBitMask(const IsaVersion &Version);
1171
1172/// \returns Dscnt bit mask for given isa \p Version.
1173/// Returns 0 for versions that do not support KMcnt
1174unsigned getKmcntBitMask(const IsaVersion &Version);
1175
1176/// \returns Xcnt bit mask for given isa \p Version.
1177/// Returns 0 for versions that do not support Xcnt.
1178unsigned getXcntBitMask(const IsaVersion &Version);
1179
1180/// \return STOREcnt or VScnt bit mask for given isa \p Version.
1181/// returns 0 for versions that do not support STOREcnt or VScnt.
1182/// STOREcnt and VScnt are the same counter, the name used
1183/// depends on the ISA version.
1184unsigned getStorecntBitMask(const IsaVersion &Version);
1185
1186/// \returns barrier member count bit mask in M0 for given isa \p Version.
1187unsigned getBarrierMemberCountBitMask(const IsaVersion &Version);
1188
1189namespace Hwreg {
1190
1193
1194struct HwregSize : EncodingField<15, 11, 32> {
1196 constexpr uint64_t encode() const { return Value - 1; }
1197 static ValueType decode(uint64_t Encoded) {
1198 return static_cast<ValueType>(Encoded + 1);
1199 }
1200};
1201
1203
1204} // namespace Hwreg
1205
1206namespace DepCtr {
1207
1209int encodeDepCtr(const StringRef Name, int64_t Val, unsigned &UsedOprMask,
1210 const MCSubtargetInfo &STI);
1211bool isSymbolicDepCtrEncoding(unsigned Code, bool &HasNonDefaultVal,
1212 const MCSubtargetInfo &STI);
1213bool decodeDepCtr(unsigned Code, int &Id, StringRef &Name, unsigned &Val,
1214 bool &IsDefault, const MCSubtargetInfo &STI);
1215
1216/// \returns Maximum VaVdst value that can be encoded.
1217unsigned getVaVdstBitMask();
1218
1219/// \returns Maximum VaSdst value that can be encoded.
1220unsigned getVaSdstBitMask();
1221
1222/// \returns Maximum VaSsrc value that can be encoded.
1223unsigned getVaSsrcBitMask();
1224
1225/// \returns Maximum HoldCnt value that can be encoded.
1226unsigned getHoldCntBitMask(const IsaVersion &Version);
1227
1228/// \returns Maximum VmVsrc value that can be encoded.
1229unsigned getVmVsrcBitMask();
1230
1231/// \returns Maximum VaVcc value that can be encoded.
1232unsigned getVaVccBitMask();
1233
1234/// \returns Maximum SaSdst value that can be encoded.
1235unsigned getSaSdstBitMask();
1236
1237/// \returns Decoded VaVdst from given immediate \p Encoded.
1238unsigned decodeFieldVaVdst(unsigned Encoded);
1239
1240/// \returns Decoded VmVsrc from given immediate \p Encoded.
1241unsigned decodeFieldVmVsrc(unsigned Encoded);
1242
1243/// \returns Decoded SaSdst from given immediate \p Encoded.
1244unsigned decodeFieldSaSdst(unsigned Encoded);
1245
1246/// \returns Decoded VaSdst from given immediate \p Encoded.
1247unsigned decodeFieldVaSdst(unsigned Encoded);
1248
1249/// \returns Decoded VaVcc from given immediate \p Encoded.
1250unsigned decodeFieldVaVcc(unsigned Encoded);
1251
1252/// \returns Decoded SaSrc from given immediate \p Encoded.
1253unsigned decodeFieldVaSsrc(unsigned Encoded);
1254
1255/// \returns Decoded HoldCnt from given immediate \p Encoded.
1256unsigned decodeFieldHoldCnt(unsigned Encoded, const IsaVersion &Version);
1257
1258/// \returns \p VmVsrc as an encoded Depctr immediate.
1259unsigned encodeFieldVmVsrc(unsigned VmVsrc, const MCSubtargetInfo &STI);
1260
1261/// \returns \p Encoded combined with encoded \p VmVsrc.
1262unsigned encodeFieldVmVsrc(unsigned Encoded, unsigned VmVsrc);
1263
1264/// \returns \p VaVdst as an encoded Depctr immediate.
1265unsigned encodeFieldVaVdst(unsigned VaVdst, const MCSubtargetInfo &STI);
1266
1267/// \returns \p Encoded combined with encoded \p VaVdst.
1268unsigned encodeFieldVaVdst(unsigned Encoded, unsigned VaVdst);
1269
1270/// \returns \p SaSdst as an encoded Depctr immediate.
1271unsigned encodeFieldSaSdst(unsigned SaSdst, const MCSubtargetInfo &STI);
1272
1273/// \returns \p Encoded combined with encoded \p SaSdst.
1274unsigned encodeFieldSaSdst(unsigned Encoded, unsigned SaSdst);
1275
1276/// \returns \p VaSdst as an encoded Depctr immediate.
1277unsigned encodeFieldVaSdst(unsigned VaSdst, const MCSubtargetInfo &STI);
1278
1279/// \returns \p Encoded combined with encoded \p VaSdst.
1280unsigned encodeFieldVaSdst(unsigned Encoded, unsigned VaSdst);
1281
1282/// \returns \p VaVcc as an encoded Depctr immediate.
1283unsigned encodeFieldVaVcc(unsigned VaVcc, const MCSubtargetInfo &STI);
1284
1285/// \returns \p Encoded combined with encoded \p VaVcc.
1286unsigned encodeFieldVaVcc(unsigned Encoded, unsigned VaVcc);
1287
1288/// \returns \p HoldCnt as an encoded Depctr immediate.
1289unsigned encodeFieldHoldCnt(unsigned HoldCnt, const MCSubtargetInfo &STI);
1290
1291/// \returns \p Encoded combined with encoded \p HoldCnt.
1292unsigned encodeFieldHoldCnt(unsigned Encoded, unsigned HoldCnt,
1293 const IsaVersion &Version);
1294
1295/// \returns \p VaSsrc as an encoded Depctr immediate.
1296unsigned encodeFieldVaSsrc(unsigned VaSsrc, const MCSubtargetInfo &STI);
1297
1298/// \returns \p Encoded combined with encoded \p VaSsrc.
1299unsigned encodeFieldVaSsrc(unsigned Encoded, unsigned VaSsrc);
1300
1301} // namespace DepCtr
1302
1303namespace Exp {
1304
1305bool getTgtName(unsigned Id, StringRef &Name, int &Index);
1306
1308unsigned getTgtId(const StringRef Name);
1309
1311bool isSupportedTgtId(unsigned Id, const MCSubtargetInfo &STI);
1312
1313} // namespace Exp
1314
1315namespace MTBUFFormat {
1316
1318int64_t encodeDfmtNfmt(unsigned Dfmt, unsigned Nfmt);
1319
1320void decodeDfmtNfmt(unsigned Format, unsigned &Dfmt, unsigned &Nfmt);
1321
1322int64_t getDfmt(const StringRef Name);
1323
1324StringRef getDfmtName(unsigned Id);
1325
1326int64_t getNfmt(const StringRef Name, const MCSubtargetInfo &STI);
1327
1328StringRef getNfmtName(unsigned Id, const MCSubtargetInfo &STI);
1329
1330bool isValidDfmtNfmt(unsigned Val, const MCSubtargetInfo &STI);
1331
1332bool isValidNfmt(unsigned Val, const MCSubtargetInfo &STI);
1333
1334int64_t getUnifiedFormat(const StringRef Name, const MCSubtargetInfo &STI);
1335
1336StringRef getUnifiedFormatName(unsigned Id, const MCSubtargetInfo &STI);
1337
1338bool isValidUnifiedFormat(unsigned Val, const MCSubtargetInfo &STI);
1339
1340int64_t convertDfmtNfmt2Ufmt(unsigned Dfmt, unsigned Nfmt,
1341 const MCSubtargetInfo &STI);
1342
1343bool isValidFormatEncoding(unsigned Val, const MCSubtargetInfo &STI);
1344
1345unsigned getDefaultFormatEncoding(const MCSubtargetInfo &STI);
1346
1347} // namespace MTBUFFormat
1348
1349namespace SendMsg {
1350
1352bool isValidMsgId(int64_t MsgId, const MCSubtargetInfo &STI);
1353
1355bool isValidMsgOp(int64_t MsgId, int64_t OpId, const MCSubtargetInfo &STI,
1356 bool Strict = true);
1357
1359bool isValidMsgStream(int64_t MsgId, int64_t OpId, int64_t StreamId,
1360 const MCSubtargetInfo &STI, bool Strict = true);
1361
1363bool msgRequiresOp(int64_t MsgId, const MCSubtargetInfo &STI);
1364
1366bool msgSupportsStream(int64_t MsgId, int64_t OpId, const MCSubtargetInfo &STI);
1367
1368void decodeMsg(unsigned Val, uint16_t &MsgId, uint16_t &OpId,
1369 uint16_t &StreamId, const MCSubtargetInfo &STI);
1370
1373
1374/// Returns true if the message does not use the m0 operand.
1375bool msgDoesNotUseM0(int64_t MsgId, const MCSubtargetInfo &STI);
1376
1377} // namespace SendMsg
1378
1379unsigned getInitialPSInputAddr(const Function &F);
1380
1381bool getHasColorExport(const Function &F);
1382
1383bool getHasDepthExport(const Function &F);
1384
1385// Returns the value of the "amdgpu-dynamic-vgpr-block-size" attribute, or 0 if
1386// the attribute is missing or its value is invalid.
1387unsigned getDynamicVGPRBlockSize(const Function &F);
1388
1390constexpr bool isShader(CallingConv::ID CC) {
1391 switch (CC) {
1401 return true;
1402 default:
1403 return false;
1404 }
1405}
1406
1408constexpr bool isGraphics(CallingConv::ID CC) {
1409 return isShader(CC) || CC == CallingConv::AMDGPU_Gfx ||
1411}
1412
1414constexpr bool isCompute(CallingConv::ID CC) {
1415 return !isGraphics(CC) || CC == CallingConv::AMDGPU_CS;
1416}
1417
1420 switch (CC) {
1430 return true;
1431 default:
1432 return false;
1433 }
1434}
1435
1437constexpr bool isChainCC(CallingConv::ID CC) {
1438 switch (CC) {
1441 return true;
1442 default:
1443 return false;
1444 }
1445}
1446
1447// These functions are considered entrypoints into the current module, i.e. they
1448// are allowed to be called from outside the current module. This is different
1449// from isEntryFunctionCC, which is only true for functions that are entered by
1450// the hardware. Module entry points include all entry functions but also
1451// include functions that can be called from other functions inside or outside
1452// the current module. Module entry functions are allowed to allocate LDS.
1453//
1454// AMDGPU_CS_Chain is intended for externally callable chain functions, so it is
1455// treated as a module entrypoint. AMDGPU_CS_ChainPreserve is used for internal
1456// helper functions (e.g. retry helpers), so it is not a module entrypoint.
1459 switch (CC) {
1462 return true;
1463 default:
1464 return isEntryFunctionCC(CC);
1465 }
1466}
1467
1469constexpr inline bool isKernel(CallingConv::ID CC) {
1470 switch (CC) {
1473 return true;
1474 default:
1475 return false;
1476 }
1477}
1478
1479inline bool isKernel(const Function &F) { return isKernel(F.getCallingConv()); }
1480
1483 return CC == CallingConv::Fast;
1484}
1485
1486/// Return true if we might ever do TCO for calls with this calling convention.
1489 switch (CC) {
1490 case CallingConv::C:
1493 return true;
1494 default:
1495 return canGuaranteeTCO(CC);
1496 }
1497}
1498
1499bool hasMIMG_R128(const MCSubtargetInfo &STI);
1500bool hasA16(const MCSubtargetInfo &STI);
1501bool hasG16(const MCSubtargetInfo &STI);
1502bool hasPackedD16(const MCSubtargetInfo &STI);
1503bool hasGDS(const MCSubtargetInfo &STI);
1504unsigned getNSAMaxSize(const MCSubtargetInfo &STI, bool HasSampler = false);
1505unsigned getMaxNumUserSGPRs(const MCSubtargetInfo &STI);
1506
1507bool isSI(const MCSubtargetInfo &STI);
1508bool isCI(const MCSubtargetInfo &STI);
1509bool isVI(const MCSubtargetInfo &STI);
1510bool isGFX9(const MCSubtargetInfo &STI);
1511bool isGFX9_GFX10(const MCSubtargetInfo &STI);
1512bool isGFX9_GFX10_GFX11(const MCSubtargetInfo &STI);
1513bool isGFX8_GFX9_GFX10(const MCSubtargetInfo &STI);
1514bool isGFX8Plus(const MCSubtargetInfo &STI);
1515bool isGFX9Plus(const MCSubtargetInfo &STI);
1516bool isNotGFX9Plus(const MCSubtargetInfo &STI);
1517bool isGFX10(const MCSubtargetInfo &STI);
1518bool isGFX10_GFX11(const MCSubtargetInfo &STI);
1519bool isGFX10Plus(const MCSubtargetInfo &STI);
1520bool isNotGFX10Plus(const MCSubtargetInfo &STI);
1521bool isGFX10Before1030(const MCSubtargetInfo &STI);
1522bool isGFX11(const MCSubtargetInfo &STI);
1523bool isGFX11Plus(const MCSubtargetInfo &STI);
1524bool isGFX12(const MCSubtargetInfo &STI);
1525bool isGFX12Plus(const MCSubtargetInfo &STI);
1526bool isGFX1250(const MCSubtargetInfo &STI);
1527bool isGFX1250Plus(const MCSubtargetInfo &STI);
1528bool isGFX13(const MCSubtargetInfo &STI);
1529bool isGFX13Plus(const MCSubtargetInfo &STI);
1530
1531/// \returns true if a work-group's waves run on all four SIMD32s (one
1532/// contiguous LDS) and not just on two.
1533bool isFullSIMDMode(const MCSubtargetInfo &STI);
1534
1535bool supportsWGP(const MCSubtargetInfo &STI);
1536bool isNotGFX12Plus(const MCSubtargetInfo &STI);
1537bool isNotGFX11Plus(const MCSubtargetInfo &STI);
1538bool isGCN3Encoding(const MCSubtargetInfo &STI);
1539bool isGFX10_BEncoding(const MCSubtargetInfo &STI);
1540bool hasGFX10_3Insts(const MCSubtargetInfo &STI);
1541bool isGFX10_3_GFX11(const MCSubtargetInfo &STI);
1542bool isGFX90A(const MCSubtargetInfo &STI);
1543bool isGFX940(const MCSubtargetInfo &STI);
1545bool hasMAIInsts(const MCSubtargetInfo &STI);
1546bool hasPopsExitingWaveID(const MCSubtargetInfo &STI);
1547
1548/// \returns true if the src_private_base and src_private_limit aperture
1549/// registers are available on \p STI. Targets with globally addressable
1550/// scratch have no private aperture and expose src_flat_scratch_base instead.
1552
1553bool hasVOPD(const MCSubtargetInfo &STI);
1554bool hasDPPSrc1SGPR(const MCSubtargetInfo &STI);
1555
1556int getTotalNumVGPRs(bool has90AInsts, int32_t ArgNumAGPR, int32_t ArgNumVGPR);
1557unsigned hasKernargPreload(const MCSubtargetInfo &STI);
1559
1560/// Is Reg - scalar register
1561bool isSGPR(MCRegister Reg, const MCRegisterInfo *TRI);
1562
1563/// \returns true if \p Reg is an indexed-resource index register, i.e. either a
1564/// 32-bit SGPR (uniform-indexed form) or a Lo256 VGPR (per-lane indexed form).
1566
1567/// \returns if \p Reg occupies the high 16-bits of a 32-bit register.
1568bool isHi16Reg(MCRegister Reg, const MCRegisterInfo &MRI);
1569
1570/// If \p Reg is a pseudo reg, return the correct hardware register given
1571/// \p STI otherwise return \p Reg.
1573
1574/// Convert hardware register \p Reg to a pseudo register
1577
1580
1581/// Is this an AMDGPU specific source operand? These include registers,
1582/// inline constants, literals and mandatory literals (KImm).
1583constexpr bool isSISrcOperand(const MCOperandInfo &OpInfo) {
1584 return OpInfo.OperandType >= AMDGPU::OPERAND_SRC_FIRST &&
1585 OpInfo.OperandType <= AMDGPU::OPERAND_SRC_LAST;
1586}
1587
1588inline bool isSISrcOperand(const MCInstrDesc &Desc, unsigned OpNo) {
1589 return isSISrcOperand(Desc.operands()[OpNo]);
1590}
1591
1592/// Is this a scalar (i.e. not packed) bf16 source operand?
1593constexpr bool isBF16SrcOperand(const MCOperandInfo &OpInfo) {
1594 return OpInfo.OperandType == AMDGPU::OPERAND_REG_IMM_BF16 ||
1595 OpInfo.OperandType == AMDGPU::OPERAND_REG_INLINE_C_BF16;
1596}
1597
1598/// Is this a KImm operand?
1599bool isKImmOperand(const MCInstrDesc &Desc, unsigned OpNo);
1600
1601/// Is this floating-point operand?
1602bool isSISrcFPOperand(const MCInstrDesc &Desc, unsigned OpNo);
1603
1604/// Get the size in bits of a register from the register class \p RC.
1605unsigned getRegBitWidth(unsigned RCID);
1606
1607/// Get the size in bits of a register from the register class \p RC.
1608unsigned getRegBitWidth(const MCRegisterClass &RC);
1609
1611inline unsigned getOperandSize(const MCOperandInfo &OpInfo) {
1612 switch (OpInfo.OperandType) {
1622 case AMDGPU::OPERAND_KIMM16: // mandatory literal is always size 4
1624 return 4;
1625
1634 return 8;
1635
1651 return 2;
1652
1653 default:
1654 llvm_unreachable("unhandled operand type");
1655 }
1656}
1657
1659inline unsigned getOperandSize(const MCInstrDesc &Desc, unsigned OpNo) {
1660 return getOperandSize(Desc.operands()[OpNo]);
1661}
1662
1663/// Is this literal inlinable, and not one of the values intended for floating
1664/// point values.
1666inline bool isInlinableIntLiteral(int64_t Literal) {
1667 return Literal >= -16 && Literal <= 64;
1668}
1669
1670/// Is this literal inlinable
1672bool isInlinableLiteral64(int64_t Literal, bool HasInv2Pi);
1673
1675bool isInlinableLiteral32(int32_t Literal, bool HasInv2Pi);
1676
1678bool isInlinableLiteralBF16(int16_t Literal, bool HasInv2Pi);
1679
1681bool isInlinableLiteralFP16(int16_t Literal, bool HasInv2Pi);
1682
1684bool isInlinableLiteralI16(int32_t Literal, bool HasInv2Pi);
1685
1687std::optional<unsigned> getInlineEncodingV2I16(uint32_t Literal);
1688
1690std::optional<unsigned> getInlineEncodingV2BF16(uint32_t Literal);
1691
1693std::optional<unsigned> getInlineEncodingV2F16(uint32_t Literal);
1694
1696std::optional<unsigned> getPKFMACF16InlineEncoding(uint32_t Literal,
1697 bool IsGFX11Plus);
1698
1701
1704
1707
1710
1712bool isPKFMACF16InlineConstant(uint32_t Literal, bool IsGFX11Plus);
1713
1715bool isValid32BitLiteral(uint64_t Val, bool IsFP64);
1716
1718int64_t encode32BitLiteral(int64_t Imm, OperandType Type, bool IsLit);
1719
1720bool isArgPassedInSGPR(const Argument *Arg);
1721
1722bool isArgPassedInSGPR(const CallBase *CB, unsigned ArgNo);
1723
1724/// The opcode is a packed fp32 instruction which only reads low 32 bits of
1725/// a scalar operand and propagates it to high channel.
1727
1728/// The opcode is a packed 64-bit instruction which only reads low 64 bits of
1729/// a scalar operand and propagates it to high channel.
1731
1732/// Packed instructions that read a single SGPR for SGPR operands, except for
1733/// 64-bit elements which read two SGPRs.
1735
1738 int64_t EncodedOffset);
1739
1742 int64_t EncodedOffset, bool IsBuffer);
1743
1744/// Convert \p ByteOffset to dwords if the subtarget uses dword SMRD immediate
1745/// offsets.
1747
1748/// \returns The encoding that will be used for \p ByteOffset in the
1749/// SMRD offset field, or std::nullopt if it won't fit. On GFX9 and GFX10
1750/// S_LOAD instructions have a signed offset, on other subtargets it is
1751/// unsigned. S_BUFFER has an unsigned offset for all subtargets.
1752std::optional<int64_t> getSMRDEncodedOffset(const MCSubtargetInfo &ST,
1753 int64_t ByteOffset, bool IsBuffer,
1754 bool HasSOffset = false);
1755
1756/// \return The encoding that can be used for a 32-bit literal offset in an SMRD
1757/// instruction. This is only useful on CI.s
1758std::optional<int64_t> getSMRDEncodedLiteralOffset32(const MCSubtargetInfo &ST,
1759 int64_t ByteOffset);
1760
1761/// For pre-GFX12 FLAT instructions the offset must be positive;
1762/// MSB is ignored and forced to zero.
1763///
1764/// \return The number of bits available for the signed offset field in flat
1765/// instructions. Note that some forms of the instruction disallow negative
1766/// offsets.
1767unsigned getNumFlatOffsetBits(const MCSubtargetInfo &ST);
1768
1770inline bool isLegalDPALU_DPPControl(const MCSubtargetInfo &ST, unsigned DC) {
1771 if (isGFX12(ST))
1772 return DC >= DPP::ROW_SHARE_FIRST && DC <= DPP::ROW_SHARE_LAST;
1773 if (isGFX90A(ST))
1774 return DC >= DPP::ROW_NEWBCAST_FIRST && DC <= DPP::ROW_NEWBCAST_LAST;
1775 return false;
1776}
1777
1778/// \returns true if an instruction is a DP ALU DPP without any 64-bit operands.
1779bool isDPALU_DPP32BitOpc(unsigned Opc);
1780
1781/// \returns true if an instruction is a DP ALU DPP.
1782bool isDPALU_DPP(const MCInstrDesc &OpDesc, const MCInstrInfo &MII,
1783 const MCSubtargetInfo &ST);
1784
1785/// \returns true if the intrinsic is divergent
1786bool isIntrinsicSourceOfDivergence(unsigned IntrID);
1787
1788/// \returns true if the intrinsic is uniform
1789bool isIntrinsicAlwaysUniform(unsigned IntrID);
1790
1791/// \returns true if the intrinsic executes an LDSDMA operation
1792bool isLDSDMAIntrinsic(unsigned IntrID);
1793
1794/// \returns a register class for the physical register \p Reg if it is a VGPR
1795/// or nullptr otherwise.
1797 const MCRegisterInfo &MRI);
1798
1799/// \returns the MODE bits which have to be set by the S_SET_VGPR_MSB for the
1800/// physical register \p Reg.
1801unsigned getVGPREncodingMSBs(MCRegister Reg, const MCRegisterInfo &MRI);
1802
1803/// If \p Reg is a low VGPR return a corresponding high VGPR with \p MSBs set.
1805 const MCRegisterInfo &MRI);
1806
1807/// \returns VGPR MSBs encoded in a S_SETREG_IMM32_B32 \p MI if it sets
1808/// it. If \p HasSetregVGPRMSBFixup is true then size of the ID_MODE mask is
1809/// ignored.
1810std::optional<unsigned> convertSetRegImmToVgprMSBs(const MachineInstr &MI,
1811 bool HasSetregVGPRMSBFixup);
1812
1813/// \returns VGPR MSBs encoded in a S_SETREG_IMM32_B32 \p MI if it sets
1814/// it. If \p HasSetregVGPRMSBFixup is true then size of the ID_MODE mask is
1815/// ignored.
1816std::optional<unsigned> convertSetRegImmToVgprMSBs(const MCInst &MI,
1817 bool HasSetregVGPRMSBFixup);
1818
1819// Returns a table for the opcode with a given \p Desc to map the VGPR MSB
1820// set by the S_SET_VGPR_MSB to one of 4 sources. In case of VOPD returns 2
1821// maps, one for X and one for Y component.
1822std::pair<const AMDGPU::OpName *, const AMDGPU::OpName *>
1824
1825/// \returns true if a memory instruction supports scale_offset modifier.
1826bool supportsScaleOffset(const MCInstrInfo &MII, unsigned Opcode);
1827
1829public:
1831
1832 ClusterDimsAttr() = default;
1833
1834 Kind getKind() const { return AttrKind; }
1835
1836 bool isUnknown() const { return getKind() == Kind::Unknown; }
1837
1838 bool isNoCluster() const { return getKind() == Kind::NoCluster; }
1839
1840 bool isFixedDims() const { return getKind() == Kind::FixedDims; }
1841
1842 bool isVariableDims() const { return getKind() == Kind::VariableDims; }
1843
1845
1847
1848 /// \returns the dims stored. Note that this function can only be called if
1849 /// the kind is \p Fixed.
1850 const std::array<unsigned, 3> &getDims() const;
1851
1852 bool operator==(const ClusterDimsAttr &RHS) const {
1853 return AttrKind == RHS.AttrKind && Dims == RHS.Dims;
1854 }
1855
1856 std::string to_string() const;
1857
1858 static ClusterDimsAttr get(const Function &F);
1859
1860private:
1861 enum Encoding { EncoNoCluster = 0, EncoVariableDims = 1024 };
1862
1863 ClusterDimsAttr(Kind AttrKind) : AttrKind(AttrKind) {}
1864
1865 std::array<unsigned, 3> Dims = {0, 0, 0};
1866
1867 Kind AttrKind = Kind::Unknown;
1868};
1869
1870/// Evaluate the constant-folded result of v_rcp for \p Val, accounting for
1871/// the hardware's denormal flushing on f32/f64 and its approximate rounding.
1872/// Returns std::nullopt if the hardware result is not guaranteed to match the
1873/// exact reciprocal.
1874std::optional<APFloat> evaluateRcp(const APFloat &Val);
1875
1876} // namespace AMDGPU
1877
1879
1880} // end namespace llvm
1881
1882#endif // LLVM_LIB_TARGET_AMDGPU_UTILS_AMDGPUBASEINFO_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
unsigned Imm
unsigned uint64_t
Base class for AMDGPU specific classes of TargetSubtarget.
This file declares a class to represent arbitrary precision floating point values and provide a varie...
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
#define LLVM_READNONE
Definition Compiler.h:331
#define LLVM_READONLY
Definition Compiler.h:338
IRTranslator LLVM IR MI
Module.h This file contains the declarations for the Module class.
#define F(x, y, z)
Definition MD5.cpp:54
#define G(x, y, z)
Definition MD5.cpp:55
Register Reg
Register const TargetRegisterInfo * TRI
This file contains some functions that are useful when dealing with strings.
Value * RHS
static ClusterDimsAttr get(const Function &F)
bool operator==(const ClusterDimsAttr &RHS) const
const std::array< unsigned, 3 > & getDims() const
unsigned getIndexInParsedOperands(unsigned CompOprIdx) const
ComponentInfo(const MCInstrDesc &OpDesc, ComponentKind Kind=ComponentKind::SINGLE, bool VOP3Layout=false)
ComponentInfo(const MCInstrDesc &OpDesc, const ComponentProps &OpXProps, bool VOP3Layout=false)
unsigned getIndexOfSrcInMCOperands(unsigned CompSrcIdx, bool VOPD3) const
ComponentLayout(const ComponentProps &OpXProps, unsigned VOPD3ModsNum, int BitOp3Idx)
unsigned getIndexOfSrcInParsedOperands(unsigned CompSrcIdx) const
ComponentLayout(ComponentKind Kind, unsigned VOPD3ModsNum, int BitOp3Idx)
bool hasRegSrcOperand(unsigned CompSrcIdx) const
unsigned getMandatoryLiteralCompOperandIndex() const
InstInfo(const ComponentInfo &OprInfoX, const ComponentInfo &OprInfoY)
std::optional< unsigned > getInvalidCompOperandIndex(std::function< MCRegister(unsigned, unsigned)> GetRegIdx, const MCRegisterInfo &MRI, bool SkipSrc=false, bool AllowSameVGPR=false, bool VOPD3=false, bool HasGFX11InterlockHazard=false) const
const ComponentInfo & operator[](size_t ComponentIdx) const
bool hasInvalidOperand(std::function< MCRegister(unsigned, unsigned)> GetRegIdx, const MCRegisterInfo &MRI, bool SkipSrc=false, bool AllowSameVGPR=false, bool VOPD3=false, bool HasGFX11InterlockHazard=false) const
InstInfo(const MCInstrDesc &OpX, const MCInstrDesc &OpY)
std::array< MCRegister, Component::MAX_OPR_NUM > RegIndices
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Instances of this class represent a single low-level machine instruction.
Definition MCInst.h:188
Describe properties that are true of each instruction in the target description file.
Interface to description of machine instruction set.
Definition MCInstrInfo.h:27
This holds information about one operand of a machine instruction, indicating the register class for ...
Definition MCInstrDesc.h:88
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:41
Generic base class for all target subtargets.
Metadata node.
Definition Metadata.h:1081
Representation of each machine instruction.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned decodeFieldVaVcc(unsigned Encoded)
unsigned encodeFieldVaVcc(unsigned Encoded, unsigned VaVcc)
unsigned decodeFieldHoldCnt(unsigned Encoded, const IsaVersion &Version)
bool decodeDepCtr(unsigned Code, int &Id, StringRef &Name, unsigned &Val, bool &IsDefault, const MCSubtargetInfo &STI)
unsigned encodeFieldHoldCnt(unsigned Encoded, unsigned HoldCnt, const IsaVersion &Version)
unsigned encodeFieldVaSsrc(unsigned Encoded, unsigned VaSsrc)
unsigned encodeFieldVaVdst(unsigned Encoded, unsigned VaVdst)
unsigned decodeFieldSaSdst(unsigned Encoded)
unsigned getHoldCntBitMask(const IsaVersion &Version)
unsigned decodeFieldVaSdst(unsigned Encoded)
unsigned encodeFieldVmVsrc(unsigned Encoded, unsigned VmVsrc)
unsigned decodeFieldVaSsrc(unsigned Encoded)
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)
unsigned encodeFieldVaSdst(unsigned Encoded, unsigned VaSdst)
bool isSupportedTgtId(unsigned Id, const MCSubtargetInfo &STI)
bool getTgtName(unsigned Id, StringRef &Name, int &Index)
unsigned getTgtId(const StringRef Name)
Generic target versions emitted by this version of LLVM.
static constexpr unsigned GFX12_5
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
static constexpr unsigned GFX13
static constexpr unsigned GFX11_7
EncodingField< 10, 6 > HwregOffset
EncodingField< 5, 0 > HwregId
EncodingFields< HwregId, HwregOffset, HwregSize > HwregEncoding
unsigned getNumWavesPerEUWithNumVGPRs(const MCSubtargetInfo &STI, unsigned NumVGPRs, unsigned DynamicVGPRBlockSize)
unsigned getAddressableNumArchVGPRs(const MCSubtargetInfo &STI)
bool isSGPROccupancyLimited(const MCSubtargetInfo &STI)
unsigned getArchVGPRAllocGranule()
For subtargets with a unified VGPR file and mixed ArchVGPR/AGPR usage, returns the allocation granule...
unsigned getAddressableLocalMemorySize(const MCSubtargetInfo &STI)
unsigned getVGPREncodingGranule(const MCSubtargetInfo &STI, std::optional< bool > EnableWavefrontSize32)
unsigned getMaxWorkGroupsPerCU(const MCSubtargetInfo &STI, unsigned FlatWorkGroupSize)
unsigned getMinNumSGPRs(const MCSubtargetInfo &STI, unsigned WavesPerEU)
unsigned getMaxNumSGPRs(const MCSubtargetInfo &STI, unsigned WavesPerEU, bool Addressable)
unsigned getWavefrontSize(const MCSubtargetInfo &STI)
unsigned getWavesPerEUForWorkGroup(const MCSubtargetInfo &STI, unsigned FlatWorkGroupSize)
unsigned getInstCacheLineSize(const MCSubtargetInfo &STI)
static constexpr unsigned MaxDynamicVGPRBlocks
Maximum number of VGPR blocks that can be allocated in dynamic VGPR mode.
unsigned getSGPREncodingGranule(const MCSubtargetInfo &STI)
unsigned getMinNumVGPRs(const MCSubtargetInfo &STI, unsigned WavesPerEU, unsigned DynamicVGPRBlockSize)
unsigned getAddressableNumVGPRs(const MCSubtargetInfo &STI, unsigned DynamicVGPRBlockSize)
unsigned getWavesPerWorkGroup(const MCSubtargetInfo &STI, unsigned FlatWorkGroupSize)
unsigned getAllocatedNumVGPRBlocks(const MCSubtargetInfo &STI, unsigned NumVGPRs, unsigned DynamicVGPRBlockSize, std::optional< bool > EnableWavefrontSize32)
unsigned getOccupancyWithNumSGPRs(unsigned SGPRs, unsigned MaxWaves, unsigned TotalNumSGPRs, unsigned Granule, unsigned TrapReserve)
unsigned getNumSGPRBlocks(const MCSubtargetInfo &STI, unsigned NumSGPRs)
unsigned getNumExtraSGPRs(const MCSubtargetInfo &STI, bool VCCUsed, bool FlatScrUsed, bool XNACKUsed)
bool targetIDSettingsConflict(TargetIDSetting Lhs, TargetIDSetting Rhs)
Returns true if Lhs and Rhs are incompatible (both specific but different).
unsigned getLocalMemorySize(const MCSubtargetInfo &STI)
unsigned getMaxNumVGPRs(const MCSubtargetInfo &STI, unsigned WavesPerEU, unsigned DynamicVGPRBlockSize)
unsigned getVGPRAllocGranule(const MCSubtargetInfo &STI, unsigned DynamicVGPRBlockSize, std::optional< bool > EnableWavefrontSize32)
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 msgDoesNotUseM0(int64_t MsgId, const MCSubtargetInfo &STI)
Returns true if the message does not use the m0 operand.
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 VOPD3_VGPR_BANK_MASKS[]
constexpr unsigned VOPD_GFX11_VGPR_BANK_MASKS[]
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 isInlineValue(MCRegister Reg)
bool isGFX10_GFX11(const MCSubtargetInfo &STI)
bool isInlinableLiteralV216(uint32_t Literal, uint8_t OpType)
EncodingField< Bit, Bit, D > EncodingBit
bool isPKFMACF16InlineConstant(uint32_t Literal, bool IsGFX11Plus)
LLVM_READONLY const MIMGInfo * getMIMGInfo(unsigned Opc)
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)
bool getMTBUFHasSrsrc(unsigned Opc)
std::optional< int64_t > getSMRDEncodedLiteralOffset32(const MCSubtargetInfo &ST, int64_t ByteOffset)
bool getWMMAIsXDL(unsigned Opc)
uint8_t wmmaScaleF8F6F4FormatToNumRegs(unsigned Fmt)
bool isGFX10Before1030(const MCSubtargetInfo &STI)
LLVM_READNONE constexpr bool isShader(CallingConv::ID CC)
unsigned mapWMMA2AddrTo3AddrOpcode(unsigned Opc)
void initDefaultAMDKernelCodeT(AMDGPUMCKernelCodeT &KernelCode, const MCSubtargetInfo &STI)
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)
unsigned getTemporalHintType(const MCInstrDesc TID)
bool isGFX10(const MCSubtargetInfo &STI)
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)
const MCRegisterClass * getVGPRPhysRegClass(MCRegister Reg, const MCRegisterInfo &MRI)
LLVM_READNONE constexpr bool isModuleEntryFunctionCC(CallingConv::ID CC)
unsigned encodeLoadcntDscnt(const IsaVersion &Version, const Waitcnt &Decoded)
bool getHasMatrixScale(unsigned Opc)
bool hasPackedD16(const MCSubtargetInfo &STI)
unsigned getStorecntBitMask(const IsaVersion &Version)
bool isFullSIMDMode(const MCSubtargetInfo &STI)
bool isGFX940(const MCSubtargetInfo &STI)
bool isInlinableLiteralV2F16(uint32_t Literal)
bool isHsaAbi(const MCSubtargetInfo &STI)
bool isGFX11(const MCSubtargetInfo &STI)
static std::optional< unsigned > convertSetRegImmToVgprMSBs(uint64_t Imm, uint64_t Simm16, bool HasSetregVGPRMSBFixup)
bool getSMEMIsBuffer(unsigned Opc)
bool isPackedSingleSGPRFP32Inst(unsigned Opc)
The opcode is a packed fp32 instruction which only reads low 32 bits of a scalar operand and propagat...
bool isGFX10_3_GFX11(const MCSubtargetInfo &STI)
bool isGFX13(const MCSubtargetInfo &STI)
unsigned getAsynccntBitMask(const IsaVersion &Version)
bool hasValueInRangeLikeMetadata(const MDNode &MD, int64_t Val)
Checks if Val is inside MD, a !range-like metadata.
TargetID createAMDGPUTargetID(const MCSubtargetInfo &STI, StringRef FeatureString)
Construct TargetID from MCSubtargetInfo.
uint8_t mfmaScaleF8F6F4FormatToNumRegs(unsigned EncodingVal)
unsigned getVOPDOpcode(unsigned Opc, bool VOPD3)
LLVM_READONLY const MIMGMIPMappingInfo * getMIMGMIPMappingInfo(unsigned MIP)
bool getMTBUFHasSoffset(unsigned Opc)
unsigned getRegBitWidth(unsigned RCID)
Get the size in bits of a register from the register class RC.
bool isValid32BitLiteral(uint64_t Val, bool IsFP64)
LLVM_ABI unsigned getTotalNumVGPRs(GPUKind AK, bool IsWave32)
CanBeVOPD getCanBeVOPD(unsigned Opc, unsigned EncodingFamily, bool VOPD3)
LLVM_READNONE bool isLegalDPALU_DPPControl(const MCSubtargetInfo &ST, unsigned DC)
bool isVOPC64DPP(unsigned Opc)
int getMUBUFOpcode(unsigned BaseOpc, unsigned Elements)
bool getMAIIsGFX940XDL(unsigned Opc)
bool isSI(const MCSubtargetInfo &STI)
unsigned getDefaultAMDHSACodeObjectVersion()
bool hasPrivateApertureRegs(const MCSubtargetInfo &STI)
bool isReadOnlySegment(const GlobalValue *GV)
Waitcnt decodeWaitcnt(const IsaVersion &Version, unsigned Encoded)
bool isArgPassedInSGPR(const Argument *A)
LLVM_READNONE constexpr bool mayTailCallThisCC(CallingConv::ID CC)
Return true if we might ever do TCO for calls with this calling convention.
bool isIntrinsicAlwaysUniform(unsigned IntrID)
int getMUBUFBaseOpcode(unsigned Opc)
unsigned encodeWaitcnt(const IsaVersion &Version, const Waitcnt &Decoded)
unsigned getAMDHSACodeObjectVersion(const Module &M)
unsigned decodeLgkmcnt(const IsaVersion &Version, unsigned Waitcnt)
unsigned getWaitcntBitMask(const IsaVersion &Version)
bool isTgSplitEnabled(const Function &F)
bool getVOP3IsSingle(unsigned Opc)
bool isPackedSingleSGPR64BitInst(unsigned Opc)
The opcode is a packed 64-bit instruction which only reads low 64 bits of a scalar operand and propag...
bool isGFX9(const MCSubtargetInfo &STI)
bool isDPALU_DPP32BitOpc(unsigned Opc)
bool getVOP1IsSingle(unsigned Opc)
unsigned getVOPDEncodingFamily(const MCSubtargetInfo &ST)
LLVM_READONLY bool hasNamedOperand(uint32_t Opcode, OpName NamedIdx)
bool isKImmOperand(const MCInstrDesc &Desc, unsigned OpNo)
Is this a KImm operand?
bool getHasColorExport(const Function &F)
int getMTBUFBaseOpcode(unsigned Opc)
bool isGFX90A(const MCSubtargetInfo &STI)
unsigned getSamplecntBitMask(const IsaVersion &Version)
unsigned getDefaultQueueImplicitArgPosition(unsigned CodeObjectVersion)
int getMIMGOpcode(unsigned BaseOpcode, unsigned MIMGEncoding, unsigned VDataDwords, unsigned VAddrDwords, bool IndexedRsrc, bool IndexedSamp)
std::tuple< char, unsigned, unsigned > parseAsmPhysRegName(StringRef RegName)
Returns a valid charcode or 0 in the first entry if this is a valid physical register name.
bool isLDSDMAIntrinsic(unsigned IntrID)
bool getHasDepthExport(const Function &F)
bool isGFX8_GFX9_GFX10(const MCSubtargetInfo &STI)
LLVM_READNONE constexpr bool isKernel(CallingConv::ID CC)
bool getMUBUFHasVAddr(unsigned Opc)
bool hasNoOpSelHi(unsigned Opc)
Returns true if this VOP3P opcode has no op_sel_hi field, in which case those bits are encoded as zer...
bool isTrue16Inst(unsigned Opc)
LLVM_READNONE constexpr bool isEntryFunctionCC(CallingConv::ID CC)
unsigned getVGPREncodingMSBs(MCRegister Reg, const MCRegisterInfo &MRI)
std::pair< unsigned, unsigned > getVOPDComponents(unsigned VOPDOpcode)
LLVM_READONLY const MIMGDimInfo * getMIMGDimInfoByEncoding(uint8_t DimEnc)
bool isInlinableLiteral32(int32_t Literal, bool HasInv2Pi)
LLVM_READNONE constexpr bool isCompute(CallingConv::ID CC)
bool isGFX12(const MCSubtargetInfo &STI)
unsigned getInitialPSInputAddr(const Function &F)
unsigned encodeExpcnt(const IsaVersion &Version, unsigned Waitcnt, unsigned Expcnt)
bool isAsyncStore(unsigned Opc)
unsigned getDynamicVGPRBlockSize(const Function &F)
unsigned getKmcntBitMask(const IsaVersion &Version)
MCRegister getVGPRWithMSBs(MCRegister Reg, unsigned MSBs, const MCRegisterInfo &MRI)
If Reg is a low VGPR return a corresponding high VGPR with MSBs set.
unsigned getVmcntBitMask(const IsaVersion &Version)
bool isNotGFX10Plus(const MCSubtargetInfo &STI)
bool hasMAIInsts(const MCSubtargetInfo &STI)
unsigned getBitOp2(unsigned Opc)
bool isIntrinsicSourceOfDivergence(unsigned IntrID)
constexpr bool isSISrcOperand(const MCOperandInfo &OpInfo)
Is this an AMDGPU specific source operand?
unsigned getXcntBitMask(const IsaVersion &Version)
bool isGenericAtomic(unsigned Opc)
const MFMA_F8F6F4_Info * getWMMA_F8F6F4_WithFormatArgs(unsigned FmtA, unsigned FmtB, unsigned F8F8Opcode)
bool isGFX8Plus(const MCSubtargetInfo &STI)
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)
unsigned decodeDscnt(const IsaVersion &Version, unsigned Waitcnt)
std::pair< const AMDGPU::OpName *, const AMDGPU::OpName * > getVGPRLoweringOperandTables(const MCInstrDesc &Desc)
bool hasG16(const MCSubtargetInfo &STI)
unsigned getAddrSizeMIMGOp(const MIMGBaseOpcodeInfo *BaseOpcode, const MIMGDimInfo *Dim, bool IsA16, bool IsG16Supported)
int getMTBUFOpcode(unsigned BaseOpc, unsigned Elements)
bool isGFX13Plus(const MCSubtargetInfo &STI)
unsigned getExpcntBitMask(const IsaVersion &Version)
bool hasArchitectedFlatScratch(const MCSubtargetInfo &STI)
int32_t getMCOpcode(uint32_t Opcode, unsigned Gen)
bool getMUBUFHasSoffset(unsigned Opc)
bool isWMMABothF4(const InstT &MI)
bool isNotGFX11Plus(const MCSubtargetInfo &STI)
WMMAVariant
Normalized WMMA or SWMMAC family used to select co-execution rules.
bool isGFX11Plus(const MCSubtargetInfo &STI)
std::optional< unsigned > getInlineEncodingV2F16(uint32_t Literal)
bool isSISrcFPOperand(const MCInstrDesc &Desc, unsigned OpNo)
Is this floating-point operand?
std::optional< APFloat > evaluateRcp(const APFloat &Val)
Evaluate the constant-folded result of v_rcp for Val, accounting for the hardware's denormal flushing...
std::tuple< char, unsigned, unsigned > parseAsmConstraintPhysReg(StringRef Constraint)
Returns a valid charcode or 0 in the first entry if this is a valid physical register constraint.
unsigned getHostcallImplicitArgPosition(unsigned CodeObjectVersion)
bool isGFX10Plus(const MCSubtargetInfo &STI)
std::optional< int64_t > getSMRDEncodedOffset(const MCSubtargetInfo &ST, int64_t ByteOffset, bool IsBuffer, bool HasSOffset)
SmallVector< unsigned > getMaxNumWorkGroups(const Function &F)
int64_t encode32BitLiteral(int64_t Imm, OperandType Type, bool IsLit)
bool isValidWMMAScaleFmtCombination(unsigned AFmt, unsigned AScale, unsigned BFmt, unsigned BScale)
@ OPERAND_REG_IMM_V2FP64
Definition SIDefines.h:441
@ OPERAND_KIMM32
Operand with 32-bit immediate that uses the constant bus.
Definition SIDefines.h:459
@ OPERAND_REG_IMM_INT64
Definition SIDefines.h:426
@ OPERAND_REG_IMM_V2FP16
Definition SIDefines.h:434
@ OPERAND_REG_INLINE_C_FP64
Definition SIDefines.h:450
@ OPERAND_REG_IMM_NOINLINE_FP16
Definition SIDefines.h:432
@ OPERAND_REG_INLINE_C_BF16
Definition SIDefines.h:447
@ OPERAND_REG_INLINE_C_V2BF16
Definition SIDefines.h:452
@ OPERAND_REG_IMM_V2INT64
Definition SIDefines.h:437
@ OPERAND_REG_IMM_V2INT16
Definition SIDefines.h:436
@ OPERAND_REG_IMM_BF16
Definition SIDefines.h:430
@ OPERAND_REG_IMM_INT32
Operands with register, 32-bit, or 64-bit immediate.
Definition SIDefines.h:425
@ OPERAND_REG_IMM_V2BF16
Definition SIDefines.h:433
@ OPERAND_REG_IMM_FP16
Definition SIDefines.h:431
@ OPERAND_REG_IMM_V2FP16_SPLAT
Definition SIDefines.h:435
@ OPERAND_REG_INLINE_C_INT64
Definition SIDefines.h:446
@ OPERAND_REG_INLINE_C_INT16
Operands with register or inline constant.
Definition SIDefines.h:444
@ OPERAND_REG_IMM_NOINLINE_V2FP16
Definition SIDefines.h:438
@ OPERAND_REG_IMM_FP64
Definition SIDefines.h:429
@ OPERAND_REG_INLINE_C_V2FP16
Definition SIDefines.h:453
@ OPERAND_REG_INLINE_AC_INT32
Operands with an AccVGPR register or inline constant.
Definition SIDefines.h:464
@ OPERAND_REG_INLINE_AC_FP32
Definition SIDefines.h:465
@ OPERAND_REG_IMM_V2INT32
Definition SIDefines.h:439
@ OPERAND_REG_IMM_FP32
Definition SIDefines.h:428
@ OPERAND_REG_INLINE_C_FP32
Definition SIDefines.h:449
@ OPERAND_REG_INLINE_C_INT32
Definition SIDefines.h:445
@ OPERAND_REG_INLINE_C_V2INT16
Definition SIDefines.h:451
@ OPERAND_REG_IMM_V2FP32
Definition SIDefines.h:440
@ OPERAND_REG_INLINE_AC_FP64
Definition SIDefines.h:466
@ OPERAND_REG_INLINE_C_FP16
Definition SIDefines.h:448
@ OPERAND_REG_IMM_INT16
Definition SIDefines.h:427
@ OPERAND_INLINE_SPLIT_BARRIER_INT32
Definition SIDefines.h:456
std::optional< unsigned > getPKFMACF16InlineEncoding(uint32_t Literal, bool IsGFX11Plus)
std::pair< unsigned, unsigned > getWMMAMatrixFmts(const InstT &MI)
constexpr bool isBF16SrcOperand(const MCOperandInfo &OpInfo)
Is this a scalar (i.e. not packed) bf16 source operand?
bool isNotGFX9Plus(const MCSubtargetInfo &STI)
LLVM_READONLY const MIMGLZMappingInfo * getMIMGLZMappingInfo(unsigned L)
bool isDPALU_DPP(const MCInstrDesc &OpDesc, const MCInstrInfo &MII, const MCSubtargetInfo &ST)
LLVM_READONLY int32_t getSOPPWithRelaxation(uint32_t Opcode)
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)
bool isWMMAAnyF8(const InstT &MI)
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 isRsrcIndexReg(MCRegister Reg, const MCRegisterInfo &MRI)
bool isCvt_F32_Fp8_Bf8_e64(unsigned Opc)
std::optional< unsigned > getInlineEncodingV2I16(uint32_t Literal)
unsigned encodeStorecntDscnt(const IsaVersion &Version, const Waitcnt &Decoded)
bool isGFX1250(const MCSubtargetInfo &STI)
const MIMGBaseOpcodeInfo * getMIMGBaseOpcode(unsigned Opc)
bool isVI(const MCSubtargetInfo &STI)
bool isSingleSGPRReadInst(unsigned Opc)
Packed instructions that read a single SGPR for SGPR operands, except for 64-bit elements which read ...
bool isTensorStore(unsigned Opc)
LLVM_READONLY const MIMGDimInfo * getMIMGDimInfo(unsigned DimEnum)
bool getMUBUFIsBufferInv(unsigned Opc)
bool supportsScaleOffset(const MCInstrInfo &MII, unsigned Opcode)
unsigned getBarrierMemberCountBitMask(const IsaVersion &Version)
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 supportsWGP(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)
LLVM_READNONE constexpr bool isChainCC(CallingConv::ID CC)
unsigned decodeStorecnt(const IsaVersion &Version, unsigned Waitcnt)
bool isGFX1250Plus(const MCSubtargetInfo &STI)
LLVM_READONLY StringRef getMIMGDimInfoStr(StringTable::Offset)
int getMaskedMIMGOp(unsigned Opc, unsigned NewChannels)
bool isNotGFX12Plus(const MCSubtargetInfo &STI)
bool getMTBUFHasVAddr(unsigned Opc)
bool hasPopsExitingWaveID(const MCSubtargetInfo &STI)
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)
LLVM_READNONE constexpr bool canGuaranteeTCO(CallingConv::ID CC)
LLVM_READNONE constexpr bool isGraphics(CallingConv::ID CC)
int getVOPDFull(unsigned OpX, unsigned OpY, unsigned EncodingFamily, bool VOPD3)
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 decodeLoadcnt(const IsaVersion &Version, unsigned Waitcnt)
unsigned getMultigridSyncArgImplicitArgPosition(unsigned CodeObjectVersion)
bool isGFX9_GFX10_GFX11(const MCSubtargetInfo &STI)
bool isGFX9_GFX10(const MCSubtargetInfo &STI)
int getMUBUFElements(unsigned Opc)
const GcnBufferFormatInfo * getGcnBufferFormatInfo(uint8_t BitsPerComp, uint8_t NumComponents, uint8_t NumFormat, const MCSubtargetInfo &STI)
bool isPermlane16(unsigned Opc)
bool getMUBUFHasSrsrc(unsigned Opc)
unsigned getDscntBitMask(const IsaVersion &Version)
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ AMDGPU_CS
Used for Mesa/AMDPAL compute shaders.
@ AMDGPU_VS
Used for Mesa vertex shaders, or AMDPAL last shader stage before rasterization (vertex shader if tess...
@ AMDGPU_KERNEL
Used for AMDGPU code object kernels.
@ AMDGPU_Gfx
Used for AMD graphics targets.
@ AMDGPU_CS_ChainPreserve
Used on AMDGPUs to give the middle-end more control over argument placement.
@ AMDGPU_HS
Used for Mesa/AMDPAL hull shaders (= tessellation control shaders).
@ AMDGPU_GS
Used for Mesa/AMDPAL geometry shaders.
@ AMDGPU_CS_Chain
Used on AMDGPUs to give the middle-end more control over argument placement.
@ AMDGPU_PS
Used for Mesa/AMDPAL pixel shaders.
@ SPIR_KERNEL
Used for SPIR kernel functions.
@ Fast
Attempts to make calls as fast as possible (e.g.
Definition CallingConv.h:41
@ AMDGPU_ES
Used for AMDPAL shader stage before geometry shader if geometry is in use.
@ AMDGPU_LS
Used for AMDPAL vertex shader if tessellation is in use.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
constexpr uint64_t maxUIntN(uint64_t N)
Gets the maximum value for a N-bit unsigned integer.
Definition MathExtras.h:208
RelativeUniformCounterPtr Values
Definition InstrProf.h:91
Op::Description Desc
MachineInstr * getImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
AMD Kernel Code Object (amd_kernel_code_t).
constexpr EncodingField(ValueType Value)
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 EncodingField(ValueType Value)
constexpr uint64_t encode() const
static ValueType decode(uint64_t Encoded)
Instruction set architecture version.
StringTable::Offset AsmSuffix