// This file is part of AsmJit project <https://asmjit.com>
//
// See asmjit.h or LICENSE.md for license and copyright information
// SPDX-License-Identifier: Zlib

#ifndef ASMJIT_ARM_A64INSTDB_H_P_INCLUDED
#define ASMJIT_ARM_A64INSTDB_H_P_INCLUDED

#include "../core/codeholder.h"
#include "../arm/a64instdb.h"
#include "../arm/a64operand.h"

ASMJIT_BEGIN_SUB_NAMESPACE(a64)

//! \cond INTERNAL
//! \addtogroup asmjit_a64
//! \{

namespace InstDB {

// a64::InstDB - Constants Used by Instructions
// ============================================

// GP register types supported by base instructions.
static constexpr uint32_t kW = 0x1;
static constexpr uint32_t kX = 0x2;
static constexpr uint32_t kWX = 0x3;

// GP high register IDs supported by the instruction.
static constexpr uint32_t kZR = Gp::kIdZr;
static constexpr uint32_t kSP = Gp::kIdSp;

// a64::InstDB - RWInfo
// ====================

enum RWInfoType : uint32_t {
  kRWI_R,
  kRWI_RW,
  kRWI_RX,
  kRWI_RRW,
  kRWI_RWX,
  kRWI_W,
  kRWI_WRW,
  kRWI_WRX,
  kRWI_WRRW,
  kRWI_WRRX,
  kRWI_WW,
  kRWI_X,
  kRWI_XRX,
  kRWI_XXRRX,

  kRWI_LDn,
  kRWI_STn,

  kRWI_SpecialStart = kRWI_LDn
};

// a64::InstDB - ElementType
// =========================

enum ElementType : uint8_t {
  kET_None = Vec::kElementTypeNone,
  kET_B    = Vec::kElementTypeB,
  kET_H    = Vec::kElementTypeH,
  kET_S    = Vec::kElementTypeS,
  kET_D    = Vec::kElementTypeD,
  kET_2H   = Vec::kElementTypeH2,
  kET_4B   = Vec::kElementTypeB4
};

// a64::InstDB - GpType
// ====================

enum GpType : uint8_t {
  kGp_W,
  kGp_X,
  kGp_X_SP
};

// a64::InstDB - OPSig
// ===================

enum kOpSignature : uint32_t {
  kOp_GpW = GpW::kSignature,
  kOp_GpX = GpX::kSignature,

  kOp_B = VecB::kSignature,
  kOp_H = VecH::kSignature,
  kOp_S = VecS::kSignature,
  kOp_D = VecD::kSignature,
  kOp_Q = VecV::kSignature,

  kOp_V8B = VecD::kSignature | Vec::kSignatureElementB,
  kOp_V4H = VecD::kSignature | Vec::kSignatureElementH,
  kOp_V2S = VecD::kSignature | Vec::kSignatureElementS,

  kOp_V16B = VecV::kSignature | Vec::kSignatureElementB,
  kOp_V8H = VecV::kSignature | Vec::kSignatureElementH,
  kOp_V4S = VecV::kSignature | Vec::kSignatureElementS,
  kOp_V2D = VecV::kSignature | Vec::kSignatureElementD
};

// a64::InstDB - HFConv
// ====================

enum kHFConv : uint32_t {
  //! FP16 version of the instruction is not available.
  kHF_N,

  //! Doesn't do any change to the opcode.
  kHF_0,

  kHF_A,
  kHF_B,
  kHF_C,
  kHF_D,

  kHF_Count
};

// a64::InstDB - VOType
// ====================

//! Vector operand type combinations used by FP&SIMD instructions.
enum VOType : uint32_t {
  kVO_V_B,
  kVO_V_BH,
  kVO_V_BH_4S,
  kVO_V_BHS,
  kVO_V_BHS_D2,
  kVO_V_HS,
  kVO_V_S,

  kVO_V_B8H4,
  kVO_V_B8H4S2,
  kVO_V_B8D1,
  kVO_V_H4S2,

  kVO_V_B16,
  kVO_V_B16H8,
  kVO_V_B16H8S4,
  kVO_V_B16D2,
  kVO_V_H8S4,
  kVO_V_S4,
  kVO_V_D2,

  kVO_SV_BHS,
  kVO_SV_B8H4S2,
  kVO_SV_HS,
  kVO_V_Any,
  kVO_SV_Any,

  kVO_Count
};

// a64::InstDB - EncodingId
// ========================

// ${EncodingId:Begin}
// ------------------- Automatically generated, do not edit -------------------
enum EncodingId : uint32_t {
  kEncodingNone = 0,
  kEncodingBaseAddSub,
  kEncodingBaseAdr,
  kEncodingBaseAtDcIcTlbi,
  kEncodingBaseAtomicCasp,
  kEncodingBaseAtomicOp,
  kEncodingBaseAtomicSt,
  kEncodingBaseBfc,
  kEncodingBaseBfi,
  kEncodingBaseBfm,
  kEncodingBaseBfx,
  kEncodingBaseBranchCmp,
  kEncodingBaseBranchReg,
  kEncodingBaseBranchRel,
  kEncodingBaseBranchTst,
  kEncodingBaseCCmp,
  kEncodingBaseCInc,
  kEncodingBaseCSel,
  kEncodingBaseCSet,
  kEncodingBaseCmpCmn,
  kEncodingBaseExtend,
  kEncodingBaseExtract,
  kEncodingBaseLdSt,
  kEncodingBaseLdpStp,
  kEncodingBaseLdxp,
  kEncodingBaseLogical,
  kEncodingBaseMov,
  kEncodingBaseMovKNZ,
  kEncodingBaseMrs,
  kEncodingBaseMsr,
  kEncodingBaseMvnNeg,
  kEncodingBaseOp,
  kEncodingBaseOpImm,
  kEncodingBaseR,
  kEncodingBaseRM_NoImm,
  kEncodingBaseRM_SImm10,
  kEncodingBaseRM_SImm9,
  kEncodingBaseRR,
  kEncodingBaseRRII,
  kEncodingBaseRRR,
  kEncodingBaseRRRR,
  kEncodingBaseRev,
  kEncodingBaseShift,
  kEncodingBaseStx,
  kEncodingBaseStxp,
  kEncodingBaseSys,
  kEncodingBaseTst,
  kEncodingFSimdPair,
  kEncodingFSimdSV,
  kEncodingFSimdVV,
  kEncodingFSimdVVV,
  kEncodingFSimdVVVV,
  kEncodingFSimdVVVe,
  kEncodingISimdPair,
  kEncodingISimdSV,
  kEncodingISimdVV,
  kEncodingISimdVVV,
  kEncodingISimdVVVI,
  kEncodingISimdVVVV,
  kEncodingISimdVVVVx,
  kEncodingISimdVVVe,
  kEncodingISimdVVVx,
  kEncodingISimdVVx,
  kEncodingISimdWWV,
  kEncodingSimdBicOrr,
  kEncodingSimdCmp,
  kEncodingSimdDot,
  kEncodingSimdDup,
  kEncodingSimdFcadd,
  kEncodingSimdFccmpFccmpe,
  kEncodingSimdFcm,
  kEncodingSimdFcmla,
  kEncodingSimdFcmpFcmpe,
  kEncodingSimdFcsel,
  kEncodingSimdFcvt,
  kEncodingSimdFcvtLN,
  kEncodingSimdFcvtSV,
  kEncodingSimdFmlal,
  kEncodingSimdFmov,
  kEncodingSimdIns,
  kEncodingSimdLdNStN,
  kEncodingSimdLdSt,
  kEncodingSimdLdpStp,
  kEncodingSimdLdurStur,
  kEncodingSimdMov,
  kEncodingSimdMoviMvni,
  kEncodingSimdShift,
  kEncodingSimdShiftES,
  kEncodingSimdSm3tt,
  kEncodingSimdSmovUmov,
  kEncodingSimdSxtlUxtl,
  kEncodingSimdTblTbx
};
// ----------------------------------------------------------------------------
// ${EncodingId:End}

// a64::InstDB::EncodingData
// =========================

namespace EncodingData {

#define M_OPCODE(field, bits) \
  uint32_t _##field : bits; \
  ASMJIT_INLINE_NODEBUG constexpr uint32_t field() const noexcept { return uint32_t(_##field) << (32 - bits); }

struct BaseOp {
  uint32_t opcode;
};

struct BaseOpImm {
  uint32_t opcode;
  uint16_t immBits;
  uint16_t immOffset;
};

struct BaseR {
  uint32_t opcode;
  uint32_t rType : 8;
  uint32_t rHiId : 8;
  uint32_t rShift : 8;
};

struct BaseRR {
  uint32_t opcode;
  uint32_t aType : 2;
  uint32_t aHiId : 6;
  uint32_t aShift : 5;
  uint32_t bType : 2;
  uint32_t bHiId : 6;
  uint32_t bShift : 5;
  uint32_t uniform : 1;
};

struct BaseRRR {
  M_OPCODE(opcode, 22)
  uint32_t aType : 2;
  uint32_t aHiId : 6;
  uint32_t bType : 2;
  uint32_t bHiId : 6;
  uint32_t cType : 2;
  uint32_t cHiId : 6;
  uint32_t uniform : 1;
};

struct BaseRRRR {
  M_OPCODE(opcode, 22)
  uint32_t aType : 2;
  uint32_t aHiId : 6;
  uint32_t bType : 2;
  uint32_t bHiId : 6;
  uint32_t cType : 2;
  uint32_t cHiId : 6;
  uint32_t dType : 2;
  uint32_t dHiId : 6;
  uint32_t uniform : 1;
};

struct BaseRRII {
  M_OPCODE(opcode, 22)
  uint32_t aType : 2;
  uint32_t aHiId : 6;
  uint32_t bType : 2;
  uint32_t bHiId : 6;
  uint32_t aImmSize : 6;
  uint32_t aImmDiscardLsb : 5;
  uint32_t aImmOffset : 5;
  uint32_t bImmSize : 6;
  uint32_t bImmDiscardLsb : 5;
  uint32_t bImmOffset : 5;
};

struct BaseAtDcIcTlbi {
  uint32_t immVerifyMask : 14;
  uint32_t immVerifyData : 14;
  uint32_t mandatoryReg : 1;
};

struct BaseAdcSbc {
  uint32_t opcode;
};

struct BaseAddSub {
  uint32_t shiftedOp  : 10; // sf|.......|Sh|.|Rm|  Imm:6 |Rn|Rd|
  uint32_t extendedOp : 10; // sf|.......|..|.|Rm|Opt|Imm3|Rn|Rd|
  uint32_t immediateOp: 10; // sf|.......|Sh|    Imm:12   |Rn|Rd|
};

struct BaseAdr {
  M_OPCODE(opcode, 22)
  OffsetType offsetType : 8;
};

struct BaseBfm {
  uint32_t opcode;         // sf|........|N|ImmR:6|ImmS:6|Rn|Rd|
};

struct BaseCmpCmn {
  uint32_t shiftedOp  : 10; // sf|.......|Sh|.|Rm|  Imm:6 |Rn|11111|
  uint32_t extendedOp : 10; // sf|.......|..|.|Rm|Opt|Imm3|Rn|11111|
  uint32_t immediateOp: 10; // sf|.......|Sh|    Imm:12   |Rn|11111|
};

struct BaseExtend {
  M_OPCODE(opcode, 22)      // sf|........|N|......|......|Rn|Rd|
  uint32_t rType : 2;
  uint32_t u : 1;
};

struct BaseLogical {
  uint32_t shiftedOp  : 10; // sf|.......|Sh|.|Rm|  Imm:6 |Rn|Rd|
  uint32_t immediateOp: 10; // sf|........|N|ImmR:6|ImmS:6|Rn|Rd|
  uint32_t negateImm  : 1 ; // True if this is an operation that must negate IMM.
};

struct BaseMvnNeg {
  uint32_t opcode;
};

struct BaseShift {
  M_OPCODE(registerOp, 22)
  M_OPCODE(immediateOp, 22)
  uint32_t ror : 2;
};

struct BaseTst {
  uint32_t shiftedOp  : 10; // sf|.......|Sh|.|Rm|  Imm:6 |Rn|11111|
  uint32_t immediateOp: 10; // sf|........|N|ImmR:6|ImmS:6|Rn|11111|
};

struct BaseRM_NoImm {
  M_OPCODE(opcode, 22)
  uint32_t rType : 2;
  uint32_t rHiId : 6;
  uint32_t xOffset : 5;
};

struct BaseRM_SImm9 {
  M_OPCODE(offsetOp, 22)
  M_OPCODE(prePostOp, 22)
  uint32_t rType : 2;
  uint32_t rHiId : 6;
  uint32_t xOffset : 5;
  uint32_t immShift : 4;
};

struct BaseRM_SImm10 {
  M_OPCODE(opcode, 22)
  uint32_t rType : 2;
  uint32_t rHiId : 6;
  uint32_t xOffset : 5;
  uint32_t immShift : 4;
};

struct BaseLdSt {
  uint32_t uOffsetOp  : 10;
  uint32_t prePostOp  : 11;
  uint32_t registerOp : 11;
  uint32_t literalOp  : 8;
  uint32_t rType      : 2;
  uint32_t xOffset    : 5;
  uint32_t uOffsetShift : 3;
  uint32_t uAltInstId : 14;
};

struct BaseLdpStp {
  uint32_t offsetOp : 10;
  uint32_t prePostOp : 10;
  uint32_t rType : 2;
  uint32_t xOffset : 5;
  uint32_t offsetShift : 3;
};

struct BaseStx {
  M_OPCODE(opcode, 22)
  uint32_t rType : 2;
  uint32_t xOffset : 5;
};

struct BaseLdxp {
  M_OPCODE(opcode, 22)
  uint32_t rType : 2;
  uint32_t xOffset : 5;
};

struct BaseStxp {
  M_OPCODE(opcode, 22)
  uint32_t rType : 2;
  uint32_t xOffset : 5;
};

struct BaseAtomicOp {
  M_OPCODE(opcode, 22)
  uint32_t rType : 2;
  uint32_t xOffset : 5;
  uint32_t zr : 1;
};

struct BaseAtomicSt {
  M_OPCODE(opcode, 22)
  uint32_t rType : 2;
  uint32_t xOffset : 5;
};

struct BaseAtomicCasp {
  M_OPCODE(opcode, 22)
  uint32_t rType : 2;
  uint32_t xOffset : 5;
};

typedef BaseOp BaseBranchReg;
typedef BaseOp BaseBranchRel;
typedef BaseOp BaseBranchCmp;
typedef BaseOp BaseBranchTst;
typedef BaseOp BaseExtract;
typedef BaseOp BaseBfc;
typedef BaseOp BaseBfi;
typedef BaseOp BaseBfx;
typedef BaseOp BaseCCmp;
typedef BaseOp BaseCInc;
typedef BaseOp BaseCSet;
typedef BaseOp BaseCSel;
typedef BaseOp BaseMovKNZ;
typedef BaseOp BaseMull;

struct FSimdGeneric {
  uint32_t _scalarOp : 28;
  uint32_t _scalarHf : 4;
  uint32_t _vectorOp : 28;
  uint32_t _vectorHf : 4;

  constexpr uint32_t scalarOp() const noexcept { return uint32_t(_scalarOp) << 10; }
  constexpr uint32_t vectorOp() const noexcept { return uint32_t(_vectorOp) << 10; }
  constexpr uint32_t scalarHf() const noexcept { return uint32_t(_scalarHf); }
  constexpr uint32_t vectorHf() const noexcept { return uint32_t(_vectorHf); }
};

typedef FSimdGeneric FSimdVV;
typedef FSimdGeneric FSimdVVV;
typedef FSimdGeneric FSimdVVVV;

struct FSimdSV {
  uint32_t opcode;
};

struct FSimdVVVe {
  uint32_t _scalarOp : 28;
  uint32_t _scalarHf : 4;
  uint32_t _vectorOp;
  uint32_t _elementOp;

  constexpr uint32_t scalarOp() const noexcept { return uint32_t(_scalarOp) << 10; }
  constexpr uint32_t scalarHf() const noexcept { return uint32_t(_scalarHf); };
  constexpr uint32_t vectorOp() const noexcept { return uint32_t(_vectorOp) << 10; }
  constexpr uint32_t vectorHf() const noexcept { return kHF_C; }
  constexpr uint32_t elementScalarOp() const noexcept { return (uint32_t(_elementOp) << 10) | (0x5u << 28); }
  constexpr uint32_t elementVectorOp() const noexcept { return (uint32_t(_elementOp) << 10); }
};

struct SimdFcadd {
  uint32_t _opcode;

  constexpr uint32_t opcode() const noexcept { return _opcode << 10; }
};

struct SimdFcmla {
  uint32_t _regularOp;
  uint32_t _elementOp;

  constexpr uint32_t regularOp() const noexcept { return uint32_t(_regularOp) << 10; }
  constexpr uint32_t elementOp() const noexcept { return (uint32_t(_elementOp) << 10); }
};

struct SimdFccmpFccmpe {
  uint32_t _opcode;
  constexpr uint32_t opcode() const noexcept { return _opcode; }
};

struct SimdFcm {
  uint32_t _registerOp : 28;
  uint32_t _registerHf : 4;

  uint32_t _zeroOp : 28;

  constexpr bool hasRegisterOp() const noexcept { return _registerOp != 0; }
  constexpr bool hasZeroOp() const noexcept { return _zeroOp != 0; }

  constexpr uint32_t registerScalarOp() const noexcept { return (uint32_t(_registerOp) << 10) | (0x5u << 28); }
  constexpr uint32_t registerVectorOp() const noexcept { return uint32_t(_registerOp) << 10; }
  constexpr uint32_t registerScalarHf() const noexcept { return uint32_t(_registerHf); }
  constexpr uint32_t registerVectorHf() const noexcept { return uint32_t(_registerHf); }

  constexpr uint32_t zeroScalarOp() const noexcept { return (uint32_t(_zeroOp) << 10) | (0x5u << 28); }
  constexpr uint32_t zeroVectorOp() const noexcept { return (uint32_t(_zeroOp) << 10); }
};

struct SimdFcmpFcmpe {
  uint32_t _opcode;
  constexpr uint32_t opcode() const noexcept { return _opcode; }
};

struct SimdFcvtLN {
  uint32_t _opcode : 22;
  uint32_t _isCvtxn : 1;
  uint32_t _hasScalar : 1;

  constexpr uint32_t scalarOp() const noexcept { return (uint32_t(_opcode) << 10) | (0x5u << 28); }
  constexpr uint32_t vectorOp() const noexcept { return (uint32_t(_opcode) << 10); }

  constexpr uint32_t isCvtxn() const noexcept { return _isCvtxn; }
  constexpr uint32_t hasScalar() const noexcept { return _hasScalar; }
};

struct SimdFcvtSV {
  uint32_t _vectorIntOp;
  uint32_t _vectorFpOp;
  uint32_t _generalOp : 31;
  uint32_t _isFloatToInt : 1;

  constexpr uint32_t scalarIntOp() const noexcept { return (uint32_t(_vectorIntOp) << 10) | (0x5u << 28); }
  constexpr uint32_t vectorIntOp() const noexcept { return uint32_t(_vectorIntOp) << 10; }
  constexpr uint32_t scalarFpOp() const noexcept { return (uint32_t(_vectorFpOp) << 10) | (0x5u << 28); }
  constexpr uint32_t vectorFpOp() const noexcept { return uint32_t(_vectorFpOp) << 10; }
  constexpr uint32_t generalOp() const noexcept { return (uint32_t(_generalOp) << 10); }

  constexpr uint32_t isFloatToInt() const noexcept { return _isFloatToInt; }
  constexpr uint32_t isFixedPoint() const noexcept { return _vectorFpOp != 0; }
};

struct SimdFmlal {
  uint32_t _vectorOp;
  uint32_t _elementOp;
  uint8_t _optionalQ;
  uint8_t tA;
  uint8_t tB;
  uint8_t tElement;

  constexpr uint32_t vectorOp() const noexcept { return uint32_t(_vectorOp) << 10; }
  constexpr uint32_t elementOp() const noexcept { return uint32_t(_elementOp) << 10; }
  constexpr uint32_t optionalQ() const noexcept { return _optionalQ; }
};

struct FSimdPair {
  uint32_t _scalarOp;
  uint32_t _vectorOp;

  constexpr uint32_t scalarOp() const noexcept { return uint32_t(_scalarOp) << 10; }
  constexpr uint32_t vectorOp() const noexcept { return uint32_t(_vectorOp) << 10; }
};

struct ISimdVV {
  M_OPCODE(opcode, 22)
  uint32_t vecOpType : 6;
};

struct ISimdVVx {
  M_OPCODE(opcode, 22)
  uint32_t op0Signature;
  uint32_t op1Signature;
};

struct ISimdSV {
  M_OPCODE(opcode, 22)
  uint32_t vecOpType : 6;
};

struct ISimdVVV {
  M_OPCODE(opcode, 22)
  uint32_t vecOpType : 6;
};

struct ISimdVVVx {
  M_OPCODE(opcode, 22)
  uint32_t op0Signature;
  uint32_t op1Signature;
  uint32_t op2Signature;
};

struct ISimdWWV {
  M_OPCODE(opcode, 22)
  uint32_t vecOpType : 6;
};

struct ISimdVVVe {
  uint32_t regularOp : 26; // 22 bits used.
  uint32_t regularVecType : 6;
  uint32_t elementOp : 26; // 22 bits used.
  uint32_t elementVecType : 6;
};

struct ISimdVVVI {
  M_OPCODE(opcode, 22)
  uint32_t vecOpType : 6;
  uint32_t immSize : 4;
  uint32_t immShift : 4;
  uint32_t imm64HasOneBitLess : 1;
};

struct ISimdVVVV {
  uint32_t opcode : 22;
  uint32_t vecOpType : 6;
};

struct ISimdVVVVx {
  uint32_t opcode;
  uint32_t op0Signature;
  uint32_t op1Signature;
  uint32_t op2Signature;
  uint32_t op3Signature;
};

struct SimdBicOrr {
  uint32_t registerOp;   // 22 bits used.
  uint32_t immediateOp;  // 22 bits used.
};

struct SimdCmp {
  uint32_t regOp;
  uint32_t zeroOp : 22;
  uint32_t vecOpType : 6;
};

struct SimdDot {
  uint32_t vectorOp;     // 22 bits used.
  uint32_t elementOp;    // 22 bits used.
  uint8_t tA;            // Element-type of the first operand.
  uint8_t tB;            // Element-type of the second and third operands.
  uint8_t tElement;      // Element-type of the element index[] operand.
};

struct SimdMoviMvni {
  uint32_t opcode : 31;
  uint32_t inverted : 1;
};

struct SimdLdSt {
  uint32_t uOffsetOp  : 10;
  uint32_t prePostOp  : 11;
  uint32_t registerOp : 11;
  uint32_t literalOp  : 8;
  uint32_t uAltInstId : 16;
};

struct SimdLdNStN {
  uint32_t singleOp;
  uint32_t multipleOp : 22;
  uint32_t n : 3;
  uint32_t replicate : 1;
};

struct SimdLdpStp {
  uint32_t offsetOp : 10;
  uint32_t prePostOp : 10;
};

struct SimdLdurStur {
  uint32_t opcode;
};

struct ISimdPair {
  uint32_t opcode2;      // 22 bits used.
  uint32_t opcode3 : 26; // 22 bits used.
  uint32_t opType3 : 6;
};

struct SimdShift {
  uint32_t registerOp;       // 22 bits used.
  uint32_t immediateOp : 22; // 22 bits used.
  uint32_t invertedImm : 1;
  uint32_t vecOpType : 6;
};

struct SimdShiftES {
  uint32_t opcode : 22;
  uint32_t vecOpType : 6;
};

struct SimdSm3tt {
  uint32_t opcode;
};

struct SimdSmovUmov {
  uint32_t opcode : 22;
  uint32_t vecOpType : 6;
  uint32_t isSigned : 1;
};

struct SimdSxtlUxtl {
  uint32_t opcode : 22;
  uint32_t vecOpType : 6;
};

struct SimdTblTbx {
  uint32_t opcode;
};

#undef M_OPCODE

// ${EncodingDataForward:Begin}
// ------------------- Automatically generated, do not edit -------------------
extern const BaseAddSub baseAddSub[4];
extern const BaseAdr baseAdr[2];
extern const BaseAtDcIcTlbi baseAtDcIcTlbi[4];
extern const BaseAtomicCasp baseAtomicCasp[4];
extern const BaseAtomicOp baseAtomicOp[123];
extern const BaseAtomicSt baseAtomicSt[48];
extern const BaseBfc baseBfc[1];
extern const BaseBfi baseBfi[3];
extern const BaseBfm baseBfm[3];
extern const BaseBfx baseBfx[3];
extern const BaseBranchCmp baseBranchCmp[2];
extern const BaseBranchReg baseBranchReg[3];
extern const BaseBranchRel baseBranchRel[2];
extern const BaseBranchTst baseBranchTst[2];
extern const BaseCCmp baseCCmp[2];
extern const BaseCInc baseCInc[3];
extern const BaseCSel baseCSel[4];
extern const BaseCSet baseCSet[2];
extern const BaseCmpCmn baseCmpCmn[2];
extern const BaseExtend baseExtend[5];
extern const BaseExtract baseExtract[1];
extern const BaseLdSt baseLdSt[9];
extern const BaseLdpStp baseLdpStp[6];
extern const BaseLdxp baseLdxp[2];
extern const BaseLogical baseLogical[8];
extern const BaseMovKNZ baseMovKNZ[3];
extern const BaseMvnNeg baseMvnNeg[3];
extern const BaseOp baseOp[23];
extern const BaseOpImm baseOpImm[14];
extern const BaseR baseR[10];
extern const BaseRM_NoImm baseRM_NoImm[21];
extern const BaseRM_SImm10 baseRM_SImm10[2];
extern const BaseRM_SImm9 baseRM_SImm9[23];
extern const BaseRR baseRR[15];
extern const BaseRRII baseRRII[2];
extern const BaseRRR baseRRR[26];
extern const BaseRRRR baseRRRR[6];
extern const BaseShift baseShift[8];
extern const BaseStx baseStx[3];
extern const BaseStxp baseStxp[2];
extern const BaseTst baseTst[1];
extern const FSimdPair fSimdPair[5];
extern const FSimdSV fSimdSV[4];
extern const FSimdVV fSimdVV[17];
extern const FSimdVVV fSimdVVV[13];
extern const FSimdVVVV fSimdVVVV[4];
extern const FSimdVVVe fSimdVVVe[4];
extern const ISimdPair iSimdPair[1];
extern const ISimdSV iSimdSV[7];
extern const ISimdVV iSimdVV[29];
extern const ISimdVVV iSimdVVV[65];
extern const ISimdVVVI iSimdVVVI[2];
extern const ISimdVVVV iSimdVVVV[2];
extern const ISimdVVVVx iSimdVVVVx[1];
extern const ISimdVVVe iSimdVVVe[25];
extern const ISimdVVVx iSimdVVVx[17];
extern const ISimdVVx iSimdVVx[13];
extern const ISimdWWV iSimdWWV[8];
extern const SimdBicOrr simdBicOrr[2];
extern const SimdCmp simdCmp[7];
extern const SimdDot simdDot[5];
extern const SimdFcadd simdFcadd[1];
extern const SimdFccmpFccmpe simdFccmpFccmpe[2];
extern const SimdFcm simdFcm[5];
extern const SimdFcmla simdFcmla[1];
extern const SimdFcmpFcmpe simdFcmpFcmpe[2];
extern const SimdFcvtLN simdFcvtLN[6];
extern const SimdFcvtSV simdFcvtSV[12];
extern const SimdFmlal simdFmlal[6];
extern const SimdLdNStN simdLdNStN[12];
extern const SimdLdSt simdLdSt[2];
extern const SimdLdpStp simdLdpStp[4];
extern const SimdLdurStur simdLdurStur[2];
extern const SimdMoviMvni simdMoviMvni[2];
extern const SimdShift simdShift[40];
extern const SimdShiftES simdShiftES[2];
extern const SimdSm3tt simdSm3tt[4];
extern const SimdSmovUmov simdSmovUmov[2];
extern const SimdSxtlUxtl simdSxtlUxtl[4];
extern const SimdTblTbx simdTblTbx[2];
// ----------------------------------------------------------------------------
// ${EncodingDataForward:End}

} // {EncodingData}

// a64::InstDB - InstNameIndex
// ===========================

// ${NameLimits:Begin}
// ------------------- Automatically generated, do not edit -------------------
enum : uint32_t { kMaxNameSize = 9 };
// ----------------------------------------------------------------------------
// ${NameLimits:End}

struct InstNameIndex {
  uint16_t start;
  uint16_t end;
};

// a64::InstDB - Tables
// ====================

#ifndef ASMJIT_NO_TEXT
extern const uint32_t _instNameIndexTable[];
extern const char _instNameStringTable[];
extern const InstNameIndex instNameIndex[26];
#endif // !ASMJIT_NO_TEXT

} // {InstDB}

//! \}
//! \endcond

ASMJIT_END_SUB_NAMESPACE

#endif // ASMJIT_A64_ARMINSTDB_H_P_INCLUDED

