10b57cec5SDimitry Andric //===-- AMDGPUAsmUtils.h - AsmParser/InstPrinter common ---------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_AMDGPU_UTILS_AMDGPUASMUTILS_H 100b57cec5SDimitry Andric #define LLVM_LIB_TARGET_AMDGPU_UTILS_AMDGPUASMUTILS_H 110b57cec5SDimitry Andric 12fe6060f1SDimitry Andric #include "SIDefines.h" 13fe6060f1SDimitry Andric 1481ad6265SDimitry Andric #include "llvm/ADT/StringRef.h" 1581ad6265SDimitry Andric 160b57cec5SDimitry Andric namespace llvm { 17e8d8bef9SDimitry Andric 18e8d8bef9SDimitry Andric class StringLiteral; 1981ad6265SDimitry Andric class MCSubtargetInfo; 20e8d8bef9SDimitry Andric 210b57cec5SDimitry Andric namespace AMDGPU { 22e8d8bef9SDimitry Andric 2381ad6265SDimitry Andric const int OPR_ID_UNKNOWN = -1; 2481ad6265SDimitry Andric const int OPR_ID_UNSUPPORTED = -2; 2581ad6265SDimitry Andric const int OPR_ID_DUPLICATE = -3; 2681ad6265SDimitry Andric const int OPR_VAL_INVALID = -4; 2781ad6265SDimitry Andric 2881ad6265SDimitry Andric template <class T> struct CustomOperand { 2981ad6265SDimitry Andric StringLiteral Name; 3081ad6265SDimitry Andric int Encoding = 0; 3181ad6265SDimitry Andric bool (*Cond)(T Context) = nullptr; 3281ad6265SDimitry Andric }; 3381ad6265SDimitry Andric 3481ad6265SDimitry Andric struct CustomOperandVal { 3581ad6265SDimitry Andric StringLiteral Name; 3681ad6265SDimitry Andric unsigned Max; 3781ad6265SDimitry Andric unsigned Default; 3881ad6265SDimitry Andric unsigned Shift; 3981ad6265SDimitry Andric unsigned Width; 4081ad6265SDimitry Andric bool (*Cond)(const MCSubtargetInfo &STI) = nullptr; 4181ad6265SDimitry Andric unsigned Mask = (1 << Width) - 1; 4281ad6265SDimitry Andric decodeCustomOperandVal4381ad6265SDimitry Andric unsigned decode(unsigned Code) const { return (Code >> Shift) & Mask; } 4481ad6265SDimitry Andric encodeCustomOperandVal4581ad6265SDimitry Andric unsigned encode(unsigned Val) const { return (Val & Mask) << Shift; } 4681ad6265SDimitry Andric getMaskCustomOperandVal4781ad6265SDimitry Andric unsigned getMask() const { return Mask << Shift; } 4881ad6265SDimitry Andric isValidCustomOperandVal4981ad6265SDimitry Andric bool isValid(unsigned Val) const { return Val <= Max; } 5081ad6265SDimitry Andric isSupportedCustomOperandVal5181ad6265SDimitry Andric bool isSupported(const MCSubtargetInfo &STI) const { 5281ad6265SDimitry Andric return !Cond || Cond(STI); 5381ad6265SDimitry Andric } 5481ad6265SDimitry Andric }; 5581ad6265SDimitry Andric 5681ad6265SDimitry Andric namespace DepCtr { 5781ad6265SDimitry Andric 5881ad6265SDimitry Andric extern const CustomOperandVal DepCtrInfo[]; 5981ad6265SDimitry Andric extern const int DEP_CTR_SIZE; 6081ad6265SDimitry Andric 6181ad6265SDimitry Andric } // namespace DepCtr 6281ad6265SDimitry Andric 630b57cec5SDimitry Andric namespace SendMsg { // Symbolic names for the sendmsg(...) syntax. 640b57cec5SDimitry Andric 6581ad6265SDimitry Andric extern const CustomOperand<const MCSubtargetInfo &> Msg[]; 6681ad6265SDimitry Andric extern const int MSG_SIZE; 6781ad6265SDimitry Andric 68fe6060f1SDimitry Andric extern const char *const OpSysSymbolic[OP_SYS_LAST_]; 69fe6060f1SDimitry Andric extern const char *const OpGsSymbolic[OP_GS_LAST_]; 700b57cec5SDimitry Andric 710b57cec5SDimitry Andric } // namespace SendMsg 720b57cec5SDimitry Andric 730b57cec5SDimitry Andric namespace Hwreg { // Symbolic names for the hwreg(...) syntax. 740b57cec5SDimitry Andric 7581ad6265SDimitry Andric extern const CustomOperand<const MCSubtargetInfo &> Opr[]; 7681ad6265SDimitry Andric extern const int OPR_SIZE; 770b57cec5SDimitry Andric 780b57cec5SDimitry Andric } // namespace Hwreg 790b57cec5SDimitry Andric 80e8d8bef9SDimitry Andric namespace MTBUFFormat { 81e8d8bef9SDimitry Andric 82e8d8bef9SDimitry Andric extern StringLiteral const DfmtSymbolic[]; 83e8d8bef9SDimitry Andric extern StringLiteral const NfmtSymbolicGFX10[]; 84e8d8bef9SDimitry Andric extern StringLiteral const NfmtSymbolicSICI[]; 85e8d8bef9SDimitry Andric extern StringLiteral const NfmtSymbolicVI[]; 8681ad6265SDimitry Andric extern StringLiteral const UfmtSymbolicGFX10[]; 8781ad6265SDimitry Andric extern StringLiteral const UfmtSymbolicGFX11[]; 8881ad6265SDimitry Andric extern unsigned const DfmtNfmt2UFmtGFX10[]; 8981ad6265SDimitry Andric extern unsigned const DfmtNfmt2UFmtGFX11[]; 90e8d8bef9SDimitry Andric 91e8d8bef9SDimitry Andric } // namespace MTBUFFormat 92e8d8bef9SDimitry Andric 930b57cec5SDimitry Andric namespace Swizzle { // Symbolic names for the swizzle(...) syntax. 940b57cec5SDimitry Andric 950b57cec5SDimitry Andric extern const char* const IdSymbolic[]; 960b57cec5SDimitry Andric 970b57cec5SDimitry Andric } // namespace Swizzle 980b57cec5SDimitry Andric 990b57cec5SDimitry Andric namespace VGPRIndexMode { // Symbolic names for the gpr_idx(...) syntax. 1000b57cec5SDimitry Andric 1010b57cec5SDimitry Andric extern const char* const IdSymbolic[]; 1020b57cec5SDimitry Andric 1030b57cec5SDimitry Andric } // namespace VGPRIndexMode 1040b57cec5SDimitry Andric 1050b57cec5SDimitry Andric } // namespace AMDGPU 1060b57cec5SDimitry Andric } // namespace llvm 1070b57cec5SDimitry Andric 1080b57cec5SDimitry Andric #endif 109