//===-- AMDGPUAsmUtils.h - AsmParser/InstPrinter common ---------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLVM_LIB_TARGET_AMDGPU_UTILS_AMDGPUASMUTILS_H #define LLVM_LIB_TARGET_AMDGPU_UTILS_AMDGPUASMUTILS_H #include "SIDefines.h" #include "llvm/ADT/StringRef.h" namespace llvm { class StringLiteral; class MCSubtargetInfo; namespace AMDGPU { const int OPR_ID_UNKNOWN = -1; const int OPR_ID_UNSUPPORTED = -2; const int OPR_ID_DUPLICATE = -3; const int OPR_VAL_INVALID = -4; struct CustomOperand { StringLiteral Name; unsigned Encoding = 0; bool (*Cond)(const MCSubtargetInfo &STI) = nullptr; }; struct CustomOperandVal { StringLiteral Name; unsigned Max; unsigned Default; unsigned Shift; unsigned Width; bool (*Cond)(const MCSubtargetInfo &STI) = nullptr; unsigned Mask = (1 << Width) - 1; unsigned decode(unsigned Code) const { return (Code >> Shift) & Mask; } unsigned encode(unsigned Val) const { return (Val & Mask) << Shift; } unsigned getMask() const { return Mask << Shift; } bool isValid(unsigned Val) const { return Val <= Max; } bool isSupported(const MCSubtargetInfo &STI) const { return !Cond || Cond(STI); } }; namespace DepCtr { extern const CustomOperandVal DepCtrInfo[]; extern const int DEP_CTR_SIZE; } // namespace DepCtr // Symbolic names for the sendmsg(msg_id, operation, stream) syntax. namespace SendMsg { /// Map from a symbolic name for a msg_id to the message portion of the /// immediate encoding. A negative return value indicates that the Name was /// unknown or unsupported on this target. int64_t getMsgId(StringRef Name, const MCSubtargetInfo &STI); /// Map from an encoding to the symbolic name for a msg_id immediate. This is /// doing opposite of getMsgId(). StringRef getMsgName(uint64_t Encoding, const MCSubtargetInfo &STI); /// Map from a symbolic name for a sendmsg operation to the operation portion of /// the immediate encoding. A negative return value indicates that the Name was /// unknown or unsupported on this target. int64_t getMsgOpId(int64_t MsgId, StringRef Name, const MCSubtargetInfo &STI); /// Map from an encoding to the symbolic name for a sendmsg operation. This is /// doing opposite of getMsgOpId(). StringRef getMsgOpName(int64_t MsgId, uint64_t Encoding, const MCSubtargetInfo &STI); } // namespace SendMsg namespace Hwreg { // Symbolic names for the hwreg(...) syntax. int64_t getHwregId(StringRef Name, const MCSubtargetInfo &STI); StringRef getHwreg(uint64_t Encoding, const MCSubtargetInfo &STI); } // namespace Hwreg namespace MTBUFFormat { extern StringLiteral const DfmtSymbolic[]; extern StringLiteral const NfmtSymbolicGFX10[]; extern StringLiteral const NfmtSymbolicSICI[]; extern StringLiteral const NfmtSymbolicVI[]; extern StringLiteral const UfmtSymbolicGFX10[]; extern StringLiteral const UfmtSymbolicGFX11[]; extern unsigned const DfmtNfmt2UFmtGFX10[]; extern unsigned const DfmtNfmt2UFmtGFX11[]; } // namespace MTBUFFormat namespace Swizzle { // Symbolic names for the swizzle(...) syntax. extern const char* const IdSymbolic[]; } // namespace Swizzle namespace VGPRIndexMode { // Symbolic names for the gpr_idx(...) syntax. extern const char* const IdSymbolic[]; } // namespace VGPRIndexMode namespace UCVersion { struct GFXVersion { StringLiteral Symbol; unsigned Code; }; ArrayRef getGFXVersions(); } // namespace UCVersion } // namespace AMDGPU } // namespace llvm #endif