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