/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
|*                                                                            *|
|* Subtarget Enumeration Source Fragment                                      *|
|*                                                                            *|
|* Automatically generated file, do not edit!                                 *|
|*                                                                            *|
\*===----------------------------------------------------------------------===*/


#ifdef GET_SUBTARGETINFO_ENUM
#undef GET_SUBTARGETINFO_ENUM
namespace llvm {
namespace Hexagon {
enum : uint64_t {
  ArchV4 = 0,
  ArchV5 = 1,
  ArchV55 = 2,
  ArchV60 = 3,
  ExtensionHVX = 4,
  ExtensionHVXDbl = 5
};
}
} // end llvm namespace
#endif // GET_SUBTARGETINFO_ENUM


#ifdef GET_SUBTARGETINFO_MC_DESC
#undef GET_SUBTARGETINFO_MC_DESC
namespace llvm {
// Sorted (by key) array of values for CPU features.
extern const llvm::SubtargetFeatureKV HexagonFeatureKV[] = {
  { "hvx", "Hexagon HVX instructions", { Hexagon::ExtensionHVX }, { } },
  { "hvx-double", "Hexagon HVX Double instructions", { Hexagon::ExtensionHVXDbl }, { } },
  { "v4", "Hexagon V4", { Hexagon::ArchV4 }, { } },
  { "v5", "Hexagon V5", { Hexagon::ArchV5 }, { } },
  { "v55", "Hexagon V55", { Hexagon::ArchV55 }, { } },
  { "v60", "Hexagon V60", { Hexagon::ArchV60 }, { } }
};

// Sorted (by key) array of values for CPU subtype.
extern const llvm::SubtargetFeatureKV HexagonSubTypeKV[] = {
  { "hexagonv4", "Select the hexagonv4 processor", { Hexagon::ArchV4 }, { } },
  { "hexagonv5", "Select the hexagonv5 processor", { Hexagon::ArchV4, Hexagon::ArchV5 }, { } },
  { "hexagonv55", "Select the hexagonv55 processor", { Hexagon::ArchV4, Hexagon::ArchV5, Hexagon::ArchV55 }, { } },
  { "hexagonv60", "Select the hexagonv60 processor", { Hexagon::ArchV4, Hexagon::ArchV5, Hexagon::ArchV55, Hexagon::ArchV60, Hexagon::ExtensionHVX }, { } }
};

#ifdef DBGFIELD
#error "<target>GenSubtargetInfo.inc requires a DBGFIELD macro"
#endif
#ifndef NDEBUG
#define DBGFIELD(x) x,
#else
#define DBGFIELD(x)
#endif

// Functional units for "HexagonItinerariesV4"
namespace HexagonItinerariesV4FU {
  const unsigned SLOT0 = 1 << 0;
  const unsigned SLOT1 = 1 << 1;
  const unsigned SLOT2 = 1 << 2;
  const unsigned SLOT3 = 1 << 3;
  const unsigned SLOT_ENDLOOP = 1 << 4;
}

// Functional units for "HexagonItinerariesV55"
namespace HexagonItinerariesV55FU {
  const unsigned SLOT0 = 1 << 0;
  const unsigned SLOT1 = 1 << 1;
  const unsigned SLOT2 = 1 << 2;
  const unsigned SLOT3 = 1 << 3;
  const unsigned SLOT_ENDLOOP = 1 << 4;
}

// Functional units for "HexagonItinerariesV60"
namespace HexagonItinerariesV60FU {
  const unsigned SLOT0 = 1 << 0;
  const unsigned SLOT1 = 1 << 1;
  const unsigned SLOT2 = 1 << 2;
  const unsigned SLOT3 = 1 << 3;
  const unsigned SLOT_ENDLOOP = 1 << 4;
  const unsigned CVI_ST = 1 << 5;
  const unsigned CVI_XLANE = 1 << 6;
  const unsigned CVI_SHIFT = 1 << 7;
  const unsigned CVI_MPY0 = 1 << 8;
  const unsigned CVI_MPY1 = 1 << 9;
  const unsigned CVI_LD = 1 << 10;
  const unsigned CVI_XLSHF = 1 << 11;
  const unsigned CVI_MPY01 = 1 << 12;
  const unsigned CVI_ALL = 1 << 13;
}

extern const llvm::InstrStage HexagonStages[] = {
  { 0, 0, 0, llvm::InstrStage::Required }, // No itinerary
  { 1, HexagonItinerariesV4FU::SLOT2 | HexagonItinerariesV4FU::SLOT3, -1, (llvm::InstrStage::ReservationKinds)0 }, // 1
  { 1, HexagonItinerariesV4FU::SLOT0 | HexagonItinerariesV4FU::SLOT1 | HexagonItinerariesV4FU::SLOT2 | HexagonItinerariesV4FU::SLOT3, -1, (llvm::InstrStage::ReservationKinds)0 }, // 2
  { 1, HexagonItinerariesV4FU::SLOT3, -1, (llvm::InstrStage::ReservationKinds)0 }, // 3
  { 1, HexagonItinerariesV4FU::SLOT2, -1, (llvm::InstrStage::ReservationKinds)0 }, // 4
  { 1, HexagonItinerariesV4FU::SLOT0 | HexagonItinerariesV4FU::SLOT1, -1, (llvm::InstrStage::ReservationKinds)0 }, // 5
  { 1, HexagonItinerariesV4FU::SLOT0, -1, (llvm::InstrStage::ReservationKinds)0 }, // 6
  { 1, HexagonItinerariesV4FU::SLOT_ENDLOOP, -1, (llvm::InstrStage::ReservationKinds)0 }, // 7
  { 1, HexagonItinerariesV4FU::SLOT2 | HexagonItinerariesV4FU::SLOT3, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV4FU::SLOT2 | HexagonItinerariesV4FU::SLOT3, -1, (llvm::InstrStage::ReservationKinds)0 }, // 8-9
  { 2, HexagonItinerariesV55FU::SLOT2 | HexagonItinerariesV55FU::SLOT3, -1, (llvm::InstrStage::ReservationKinds)0 }, // 10
  { 1, HexagonItinerariesV55FU::SLOT2 | HexagonItinerariesV55FU::SLOT3, -1, (llvm::InstrStage::ReservationKinds)0 }, // 11
  { 1, HexagonItinerariesV55FU::SLOT0 | HexagonItinerariesV55FU::SLOT1 | HexagonItinerariesV55FU::SLOT2 | HexagonItinerariesV55FU::SLOT3, -1, (llvm::InstrStage::ReservationKinds)0 }, // 12
  { 2, HexagonItinerariesV55FU::SLOT0 | HexagonItinerariesV55FU::SLOT1 | HexagonItinerariesV55FU::SLOT2 | HexagonItinerariesV55FU::SLOT3, -1, (llvm::InstrStage::ReservationKinds)0 }, // 13
  { 3, HexagonItinerariesV55FU::SLOT3, -1, (llvm::InstrStage::ReservationKinds)0 }, // 14
  { 3, HexagonItinerariesV55FU::SLOT2 | HexagonItinerariesV55FU::SLOT3, -1, (llvm::InstrStage::ReservationKinds)0 }, // 15
  { 2, HexagonItinerariesV55FU::SLOT3, -1, (llvm::InstrStage::ReservationKinds)0 }, // 16
  { 2, HexagonItinerariesV55FU::SLOT2, -1, (llvm::InstrStage::ReservationKinds)0 }, // 17
  { 3, HexagonItinerariesV55FU::SLOT0 | HexagonItinerariesV55FU::SLOT1, -1, (llvm::InstrStage::ReservationKinds)0 }, // 18
  { 1, HexagonItinerariesV55FU::SLOT0, -1, (llvm::InstrStage::ReservationKinds)0 }, // 19
  { 2, HexagonItinerariesV55FU::SLOT_ENDLOOP, -1, (llvm::InstrStage::ReservationKinds)0 }, // 20
  { 1, HexagonItinerariesV55FU::SLOT2 | HexagonItinerariesV55FU::SLOT3, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV55FU::SLOT2 | HexagonItinerariesV55FU::SLOT3, -1, (llvm::InstrStage::ReservationKinds)0 }, // 21-22
  { 3, HexagonItinerariesV55FU::SLOT0, -1, (llvm::InstrStage::ReservationKinds)0 }, // 23
  { 2, HexagonItinerariesV55FU::SLOT0 | HexagonItinerariesV55FU::SLOT1, -1, (llvm::InstrStage::ReservationKinds)0 }, // 24
  { 1, HexagonItinerariesV55FU::SLOT0 | HexagonItinerariesV55FU::SLOT1, -1, (llvm::InstrStage::ReservationKinds)0 }, // 25
  { 2, HexagonItinerariesV60FU::SLOT2 | HexagonItinerariesV60FU::SLOT3, -1, (llvm::InstrStage::ReservationKinds)0 }, // 26
  { 1, HexagonItinerariesV60FU::SLOT2 | HexagonItinerariesV60FU::SLOT3, -1, (llvm::InstrStage::ReservationKinds)0 }, // 27
  { 1, HexagonItinerariesV60FU::SLOT0 | HexagonItinerariesV60FU::SLOT1 | HexagonItinerariesV60FU::SLOT2 | HexagonItinerariesV60FU::SLOT3, -1, (llvm::InstrStage::ReservationKinds)0 }, // 28
  { 2, HexagonItinerariesV60FU::SLOT0 | HexagonItinerariesV60FU::SLOT1 | HexagonItinerariesV60FU::SLOT2 | HexagonItinerariesV60FU::SLOT3, -1, (llvm::InstrStage::ReservationKinds)0 }, // 29
  { 3, HexagonItinerariesV60FU::SLOT3, -1, (llvm::InstrStage::ReservationKinds)0 }, // 30
  { 3, HexagonItinerariesV60FU::SLOT2 | HexagonItinerariesV60FU::SLOT3, -1, (llvm::InstrStage::ReservationKinds)0 }, // 31
  { 2, HexagonItinerariesV60FU::SLOT3, -1, (llvm::InstrStage::ReservationKinds)0 }, // 32
  { 2, HexagonItinerariesV60FU::SLOT2, -1, (llvm::InstrStage::ReservationKinds)0 }, // 33
  { 3, HexagonItinerariesV60FU::SLOT0 | HexagonItinerariesV60FU::SLOT1, -1, (llvm::InstrStage::ReservationKinds)0 }, // 34
  { 1, HexagonItinerariesV60FU::SLOT0, -1, (llvm::InstrStage::ReservationKinds)0 }, // 35
  { 2, HexagonItinerariesV60FU::SLOT_ENDLOOP, -1, (llvm::InstrStage::ReservationKinds)0 }, // 36
  { 4, HexagonItinerariesV60FU::SLOT2 | HexagonItinerariesV60FU::SLOT3, -1, (llvm::InstrStage::ReservationKinds)0 }, // 37
  { 1, HexagonItinerariesV60FU::SLOT0 | HexagonItinerariesV60FU::SLOT1 | HexagonItinerariesV60FU::SLOT2 | HexagonItinerariesV60FU::SLOT3, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV60FU::CVI_XLANE | HexagonItinerariesV60FU::CVI_SHIFT | HexagonItinerariesV60FU::CVI_MPY0 | HexagonItinerariesV60FU::CVI_MPY1, -1, (llvm::InstrStage::ReservationKinds)0 }, // 38-39
  { 1, HexagonItinerariesV60FU::SLOT2 | HexagonItinerariesV60FU::SLOT3, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV60FU::SLOT2 | HexagonItinerariesV60FU::SLOT3, -1, (llvm::InstrStage::ReservationKinds)0 }, // 40-41
  { 4, HexagonItinerariesV60FU::SLOT0, -1, (llvm::InstrStage::ReservationKinds)0 }, // 42
  { 2, HexagonItinerariesV60FU::SLOT0 | HexagonItinerariesV60FU::SLOT1, -1, (llvm::InstrStage::ReservationKinds)0 }, // 43
  { 3, HexagonItinerariesV60FU::SLOT0, -1, (llvm::InstrStage::ReservationKinds)0 }, // 44
  { 1, HexagonItinerariesV60FU::SLOT0 | HexagonItinerariesV60FU::SLOT1, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV60FU::CVI_LD, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV60FU::CVI_XLANE | HexagonItinerariesV60FU::CVI_SHIFT | HexagonItinerariesV60FU::CVI_MPY0 | HexagonItinerariesV60FU::CVI_MPY1, -1, (llvm::InstrStage::ReservationKinds)0 }, // 45-47
  { 1, HexagonItinerariesV60FU::SLOT0 | HexagonItinerariesV60FU::SLOT1, -1, (llvm::InstrStage::ReservationKinds)0 }, // 48
  { 1, HexagonItinerariesV60FU::SLOT0, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV60FU::CVI_ST, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV60FU::CVI_XLANE | HexagonItinerariesV60FU::CVI_SHIFT | HexagonItinerariesV60FU::CVI_MPY0 | HexagonItinerariesV60FU::CVI_MPY1, -1, (llvm::InstrStage::ReservationKinds)0 }, // 49-51
  { 1, HexagonItinerariesV60FU::SLOT2 | HexagonItinerariesV60FU::SLOT3, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV60FU::CVI_MPY0 | HexagonItinerariesV60FU::CVI_MPY1, -1, (llvm::InstrStage::ReservationKinds)0 }, // 52-53
  { 1, HexagonItinerariesV60FU::SLOT0 | HexagonItinerariesV60FU::SLOT1 | HexagonItinerariesV60FU::SLOT2 | HexagonItinerariesV60FU::SLOT3, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV60FU::CVI_XLSHF | HexagonItinerariesV60FU::CVI_MPY01, -1, (llvm::InstrStage::ReservationKinds)0 }, // 54-55
  { 1, HexagonItinerariesV60FU::SLOT0 | HexagonItinerariesV60FU::SLOT1 | HexagonItinerariesV60FU::SLOT2 | HexagonItinerariesV60FU::SLOT3, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV60FU::CVI_XLANE, -1, (llvm::InstrStage::ReservationKinds)0 }, // 56-57
  { 1, HexagonItinerariesV60FU::SLOT0, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV60FU::SLOT1, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV60FU::CVI_LD, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV60FU::CVI_XLANE, -1, (llvm::InstrStage::ReservationKinds)0 }, // 58-61
  { 1, HexagonItinerariesV60FU::SLOT0 | HexagonItinerariesV60FU::SLOT1, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV60FU::CVI_LD, -1, (llvm::InstrStage::ReservationKinds)0 }, // 62-63
  { 1, HexagonItinerariesV60FU::SLOT0, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV60FU::SLOT1, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV60FU::CVI_ST, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV60FU::CVI_XLANE, -1, (llvm::InstrStage::ReservationKinds)0 }, // 64-67
  { 1, HexagonItinerariesV60FU::SLOT0, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV60FU::CVI_ST, -1, (llvm::InstrStage::ReservationKinds)0 }, // 68-69
  { 1, HexagonItinerariesV60FU::SLOT2 | HexagonItinerariesV60FU::SLOT3, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV60FU::CVI_MPY01, -1, (llvm::InstrStage::ReservationKinds)0 }, // 70-71
  { 1, HexagonItinerariesV60FU::SLOT0 | HexagonItinerariesV60FU::SLOT1 | HexagonItinerariesV60FU::SLOT2 | HexagonItinerariesV60FU::SLOT3, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV60FU::CVI_SHIFT, -1, (llvm::InstrStage::ReservationKinds)0 }, // 72-73
  { 1, HexagonItinerariesV60FU::SLOT0 | HexagonItinerariesV60FU::SLOT1 | HexagonItinerariesV60FU::SLOT2 | HexagonItinerariesV60FU::SLOT3, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV60FU::CVI_XLSHF, -1, (llvm::InstrStage::ReservationKinds)0 }, // 74-75
  { 1, HexagonItinerariesV60FU::SLOT0 | HexagonItinerariesV60FU::SLOT1 | HexagonItinerariesV60FU::SLOT2 | HexagonItinerariesV60FU::SLOT3, 0, (llvm::InstrStage::ReservationKinds)0 },   { 1, HexagonItinerariesV60FU::CVI_ALL, -1, (llvm::InstrStage::ReservationKinds)0 }, // 76-77
  { 0, 0, 0, llvm::InstrStage::Required } // End stages
};

static const llvm::InstrItinerary HexagonItinerariesV4[] = {
  { 0, 0, 0, 0, 0 }, // 0 NoInstrModel
  { 1, 1, 2, 0, 0 }, // 1 S_2op_tc_2_SLOT23
  { 1, 1, 2, 0, 0 }, // 2 S_2op_tc_1_SLOT23
  { 1, 2, 3, 0, 0 }, // 3 ALU32_3op_tc_1_SLOT0123
  { 1, 1, 2, 0, 0 }, // 4 ALU64_tc_1_SLOT23
  { 1, 1, 2, 0, 0 }, // 5 ALU64_tc_2_SLOT23
  { 1, 2, 3, 0, 0 }, // 6 ALU32_ADDI_tc_1_SLOT0123
  { 1, 2, 3, 0, 0 }, // 7 ALU32_3op_tc_2_SLOT0123
  { 1, 2, 3, 0, 0 }, // 8 ALU32_2op_tc_1_SLOT0123
  { 1, 3, 4, 0, 0 }, // 9 CR_tc_3x_SLOT3
  { 1, 1, 2, 0, 0 }, // 10 ALU64_tc_2early_SLOT23
  { 1, 1, 2, 0, 0 }, // 11 M_tc_3x_SLOT23
  { 1, 1, 2, 0, 0 }, // 12 S_3op_tc_1_SLOT23
  { 1, 1, 2, 0, 0 }, // 13 S_3op_tc_2early_SLOT23
  { 1, 1, 2, 0, 0 }, // 14 S_3op_tc_2_SLOT23
  { 1, 2, 3, 0, 0 }, // 15 EXTENDER_tc_1_SLOT0123
  { 1, 1, 2, 0, 0 }, // 16 S_3op_tc_3_SLOT23
  { 0, 0, 0, 0, 0 }, // 17 M_tc_3stall_SLOT23
  { 1, 2, 3, 0, 0 }, // 18 PSEUDO
  { 1, 1, 2, 0, 0 }, // 19 CR_tc_2early_SLOT23
  { 1, 1, 2, 0, 0 }, // 20 S_2op_tc_2early_SLOT23
  { 1, 2, 3, 0, 0 }, // 21 ALU32_3op_tc_2early_SLOT0123
  { 1, 2, 3, 0, 0 }, // 22 ALU32_2op_tc_2early_SLOT0123
  { 1, 3, 4, 0, 0 }, // 23 CR_tc_2_SLOT3
  { 1, 4, 5, 0, 0 }, // 24 J_tc_2early_SLOT2
  { 1, 1, 2, 0, 0 }, // 25 J_tc_2early_SLOT23
  { 1, 5, 6, 0, 0 }, // 26 LD_tc_ld_SLOT01
  { 1, 6, 7, 0, 0 }, // 27 DUPLEX
  { 1, 7, 8, 0, 0 }, // 28 J_tc_2early_SLOT0123
  { 1, 1, 2, 0, 0 }, // 29 S_2op_tc_3or4x_SLOT23
  { 1, 1, 2, 0, 0 }, // 30 ALU64_tc_3x_SLOT23
  { 1, 1, 2, 0, 0 }, // 31 M_tc_3or4x_SLOT23
  { 1, 1, 2, 0, 0 }, // 32 M_tc_3_SLOT23
  { 0, 0, 0, 0, 0 }, // 33 CVI_VA
  { 1, 8, 10, 0, 0 }, // 34 PSEUDOM
  { 1, 3, 4, 0, 0 }, // 35 CR_tc_2early_SLOT3
  { 1, 6, 7, 0, 0 }, // 36 NCJ_tc_3or4stall_SLOT0
  { 1, 1, 2, 0, 0 }, // 37 COMPOUND
  { 1, 5, 6, 0, 0 }, // 38 V2LDST_tc_ld_SLOT01
  { 1, 6, 7, 0, 0 }, // 39 LD_tc_ld_SLOT0
  { 1, 6, 7, 0, 0 }, // 40 V4LDST_tc_st_SLOT0
  { 1, 5, 6, 0, 0 }, // 41 V4LDST_tc_ld_SLOT01
  { 1, 6, 7, 0, 0 }, // 42 LD_tc_3or4stall_SLOT0
  { 0, 0, 0, 0, 0 }, // 43 CVI_VM_LD
  { 1, 1, 2, 0, 0 }, // 44 M_tc_2_SLOT23
  { 1, 1, 2, 0, 0 }, // 45 S_3op_tc_3x_SLOT23
  { 1, 6, 7, 0, 0 }, // 46 ST_tc_ld_SLOT0
  { 1, 5, 6, 0, 0 }, // 47 V2LDST_tc_st_SLOT01
  { 1, 5, 6, 0, 0 }, // 48 ST_tc_st_SLOT01
  { 1, 6, 7, 0, 0 }, // 49 V2LDST_tc_st_SLOT0
  { 1, 6, 7, 0, 0 }, // 50 ST_tc_st_SLOT0
  { 1, 5, 6, 0, 0 }, // 51 V4LDST_tc_st_SLOT01
  { 0, 0, 0, 0, 0 }, // 52 CVI_VM_ST
  { 0, 0, 0, 0, 0 }, // 53 PREFIX
  { 0, 0, 0, 0, 0 }, // 54 CVI_VX_LATE
  { 0, 0, 0, 0, 0 }, // 55 CVI_VA_DV
  { 0, 0, 0, 0, 0 }, // 56 CVI_VP_LONG
  { 0, 0, 0, 0, 0 }, // 57 CVI_VM_VP_LDU
  { 0, 0, 0, 0, 0 }, // 58 CVI_VM_CUR_LD
  { 0, 0, 0, 0, 0 }, // 59 CVI_VM_TMP_LD
  { 0, 0, 0, 0, 0 }, // 60 CVI_VM_STU
  { 0, 0, 0, 0, 0 }, // 61 CVI_VM_NEW_ST
  { 0, 0, 0, 0, 0 }, // 62 CVI_VX
  { 0, 0, 0, 0, 0 }, // 63 CVI_VX_DV
  { 0, 0, 0, 0, 0 }, // 64 CVI_VS
  { 0, 0, 0, 0, 0 }, // 65 CVI_VP_VS_LONG_EARLY
  { 0, 0, 0, 0, 0 }, // 66 CVI_VP
  { 0, 0, 0, 0, 0 }, // 67 CVI_VP_VS_LONG
  { 0, 0, 0, 0, 0 }, // 68 CVI_HIST
  { 0, 0, 0, 0, 0 }, // 69 CVI_VX_DV_LONG
  { 0, 0, 0, 0, 0 }, // 70 CVI_VX_LONG
  { 0, 0, 0, 0, 0 }, // 71 CVI_VINLANESAT
  { 0, 0, 0, 0, 0 }, // 72 CVI_VP_VS
  { 1, 6, 7, 0, 0 }, // 73 ST_tc_3stall_SLOT0
  { 0, ~0U, ~0U, ~0U, ~0U } // end marker
};

static const llvm::InstrItinerary HexagonItinerariesV55[] = {
  { 0, 0, 0, 0, 0 }, // 0 NoInstrModel
  { 1, 10, 11, 0, 0 }, // 1 S_2op_tc_2_SLOT23
  { 1, 11, 12, 0, 0 }, // 2 S_2op_tc_1_SLOT23
  { 1, 12, 13, 0, 0 }, // 3 ALU32_3op_tc_1_SLOT0123
  { 1, 11, 12, 0, 0 }, // 4 ALU64_tc_1_SLOT23
  { 1, 10, 11, 0, 0 }, // 5 ALU64_tc_2_SLOT23
  { 1, 12, 13, 0, 0 }, // 6 ALU32_ADDI_tc_1_SLOT0123
  { 1, 13, 14, 0, 0 }, // 7 ALU32_3op_tc_2_SLOT0123
  { 1, 12, 13, 0, 0 }, // 8 ALU32_2op_tc_1_SLOT0123
  { 1, 14, 15, 0, 0 }, // 9 CR_tc_3x_SLOT3
  { 1, 10, 11, 0, 0 }, // 10 ALU64_tc_2early_SLOT23
  { 1, 15, 16, 0, 0 }, // 11 M_tc_3x_SLOT23
  { 1, 11, 12, 0, 0 }, // 12 S_3op_tc_1_SLOT23
  { 1, 10, 11, 0, 0 }, // 13 S_3op_tc_2early_SLOT23
  { 1, 10, 11, 0, 0 }, // 14 S_3op_tc_2_SLOT23
  { 1, 12, 13, 0, 0 }, // 15 EXTENDER_tc_1_SLOT0123
  { 1, 15, 16, 0, 0 }, // 16 S_3op_tc_3_SLOT23
  { 1, 15, 16, 0, 0 }, // 17 M_tc_3stall_SLOT23
  { 1, 12, 13, 0, 0 }, // 18 PSEUDO
  { 1, 10, 11, 0, 0 }, // 19 CR_tc_2early_SLOT23
  { 1, 10, 11, 0, 0 }, // 20 S_2op_tc_2early_SLOT23
  { 1, 13, 14, 0, 0 }, // 21 ALU32_3op_tc_2early_SLOT0123
  { 1, 13, 14, 0, 0 }, // 22 ALU32_2op_tc_2early_SLOT0123
  { 1, 16, 17, 0, 0 }, // 23 CR_tc_2_SLOT3
  { 1, 17, 18, 0, 0 }, // 24 J_tc_2early_SLOT2
  { 1, 10, 11, 0, 0 }, // 25 J_tc_2early_SLOT23
  { 1, 18, 19, 0, 0 }, // 26 LD_tc_ld_SLOT01
  { 1, 19, 20, 0, 0 }, // 27 DUPLEX
  { 1, 20, 21, 0, 0 }, // 28 J_tc_2early_SLOT0123
  { 1, 15, 16, 0, 0 }, // 29 S_2op_tc_3or4x_SLOT23
  { 1, 15, 16, 0, 0 }, // 30 ALU64_tc_3x_SLOT23
  { 1, 15, 16, 0, 0 }, // 31 M_tc_3or4x_SLOT23
  { 1, 15, 16, 0, 0 }, // 32 M_tc_3_SLOT23
  { 0, 0, 0, 0, 0 }, // 33 CVI_VA
  { 1, 21, 23, 0, 0 }, // 34 PSEUDOM
  { 1, 16, 17, 0, 0 }, // 35 CR_tc_2early_SLOT3
  { 1, 23, 24, 0, 0 }, // 36 NCJ_tc_3or4stall_SLOT0
  { 1, 11, 12, 0, 0 }, // 37 COMPOUND
  { 1, 24, 25, 0, 0 }, // 38 V2LDST_tc_ld_SLOT01
  { 1, 23, 24, 0, 0 }, // 39 LD_tc_ld_SLOT0
  { 1, 19, 20, 0, 0 }, // 40 V4LDST_tc_st_SLOT0
  { 1, 18, 19, 0, 0 }, // 41 V4LDST_tc_ld_SLOT01
  { 1, 23, 24, 0, 0 }, // 42 LD_tc_3or4stall_SLOT0
  { 0, 0, 0, 0, 0 }, // 43 CVI_VM_LD
  { 1, 10, 11, 0, 0 }, // 44 M_tc_2_SLOT23
  { 1, 15, 16, 0, 0 }, // 45 S_3op_tc_3x_SLOT23
  { 1, 23, 24, 0, 0 }, // 46 ST_tc_ld_SLOT0
  { 1, 25, 26, 0, 0 }, // 47 V2LDST_tc_st_SLOT01
  { 1, 25, 26, 0, 0 }, // 48 ST_tc_st_SLOT01
  { 1, 19, 20, 0, 0 }, // 49 V2LDST_tc_st_SLOT0
  { 1, 19, 20, 0, 0 }, // 50 ST_tc_st_SLOT0
  { 1, 25, 26, 0, 0 }, // 51 V4LDST_tc_st_SLOT01
  { 0, 0, 0, 0, 0 }, // 52 CVI_VM_ST
  { 1, 12, 13, 0, 0 }, // 53 PREFIX
  { 0, 0, 0, 0, 0 }, // 54 CVI_VX_LATE
  { 0, 0, 0, 0, 0 }, // 55 CVI_VA_DV
  { 0, 0, 0, 0, 0 }, // 56 CVI_VP_LONG
  { 0, 0, 0, 0, 0 }, // 57 CVI_VM_VP_LDU
  { 0, 0, 0, 0, 0 }, // 58 CVI_VM_CUR_LD
  { 0, 0, 0, 0, 0 }, // 59 CVI_VM_TMP_LD
  { 0, 0, 0, 0, 0 }, // 60 CVI_VM_STU
  { 0, 0, 0, 0, 0 }, // 61 CVI_VM_NEW_ST
  { 0, 0, 0, 0, 0 }, // 62 CVI_VX
  { 0, 0, 0, 0, 0 }, // 63 CVI_VX_DV
  { 0, 0, 0, 0, 0 }, // 64 CVI_VS
  { 0, 0, 0, 0, 0 }, // 65 CVI_VP_VS_LONG_EARLY
  { 0, 0, 0, 0, 0 }, // 66 CVI_VP
  { 0, 0, 0, 0, 0 }, // 67 CVI_VP_VS_LONG
  { 0, 0, 0, 0, 0 }, // 68 CVI_HIST
  { 0, 0, 0, 0, 0 }, // 69 CVI_VX_DV_LONG
  { 0, 0, 0, 0, 0 }, // 70 CVI_VX_LONG
  { 0, 0, 0, 0, 0 }, // 71 CVI_VINLANESAT
  { 0, 0, 0, 0, 0 }, // 72 CVI_VP_VS
  { 1, 23, 24, 0, 0 }, // 73 ST_tc_3stall_SLOT0
  { 0, ~0U, ~0U, ~0U, ~0U } // end marker
};

static const llvm::InstrItinerary HexagonItinerariesV60[] = {
  { 0, 0, 0, 0, 0 }, // 0 NoInstrModel
  { 1, 26, 27, 0, 0 }, // 1 S_2op_tc_2_SLOT23
  { 1, 27, 28, 0, 0 }, // 2 S_2op_tc_1_SLOT23
  { 1, 28, 29, 0, 0 }, // 3 ALU32_3op_tc_1_SLOT0123
  { 1, 27, 28, 0, 0 }, // 4 ALU64_tc_1_SLOT23
  { 1, 26, 27, 0, 0 }, // 5 ALU64_tc_2_SLOT23
  { 1, 28, 29, 0, 0 }, // 6 ALU32_ADDI_tc_1_SLOT0123
  { 1, 29, 30, 0, 0 }, // 7 ALU32_3op_tc_2_SLOT0123
  { 1, 28, 29, 0, 0 }, // 8 ALU32_2op_tc_1_SLOT0123
  { 1, 30, 31, 0, 0 }, // 9 CR_tc_3x_SLOT3
  { 1, 26, 27, 0, 0 }, // 10 ALU64_tc_2early_SLOT23
  { 1, 31, 32, 0, 0 }, // 11 M_tc_3x_SLOT23
  { 1, 27, 28, 0, 0 }, // 12 S_3op_tc_1_SLOT23
  { 1, 26, 27, 0, 0 }, // 13 S_3op_tc_2early_SLOT23
  { 1, 26, 27, 0, 0 }, // 14 S_3op_tc_2_SLOT23
  { 1, 28, 29, 0, 0 }, // 15 EXTENDER_tc_1_SLOT0123
  { 1, 31, 32, 0, 0 }, // 16 S_3op_tc_3_SLOT23
  { 1, 31, 32, 0, 0 }, // 17 M_tc_3stall_SLOT23
  { 1, 28, 29, 0, 0 }, // 18 PSEUDO
  { 1, 26, 27, 0, 0 }, // 19 CR_tc_2early_SLOT23
  { 1, 26, 27, 0, 0 }, // 20 S_2op_tc_2early_SLOT23
  { 1, 29, 30, 0, 0 }, // 21 ALU32_3op_tc_2early_SLOT0123
  { 1, 29, 30, 0, 0 }, // 22 ALU32_2op_tc_2early_SLOT0123
  { 1, 32, 33, 0, 0 }, // 23 CR_tc_2_SLOT3
  { 1, 33, 34, 0, 0 }, // 24 J_tc_2early_SLOT2
  { 1, 26, 27, 0, 0 }, // 25 J_tc_2early_SLOT23
  { 1, 34, 35, 0, 0 }, // 26 LD_tc_ld_SLOT01
  { 1, 35, 36, 0, 0 }, // 27 DUPLEX
  { 1, 36, 37, 0, 0 }, // 28 J_tc_2early_SLOT0123
  { 1, 37, 38, 0, 0 }, // 29 S_2op_tc_3or4x_SLOT23
  { 1, 31, 32, 0, 0 }, // 30 ALU64_tc_3x_SLOT23
  { 1, 37, 38, 0, 0 }, // 31 M_tc_3or4x_SLOT23
  { 1, 31, 32, 0, 0 }, // 32 M_tc_3_SLOT23
  { 1, 38, 40, 0, 0 }, // 33 CVI_VA
  { 1, 40, 42, 0, 0 }, // 34 PSEUDOM
  { 1, 32, 33, 0, 0 }, // 35 CR_tc_2early_SLOT3
  { 1, 42, 43, 0, 0 }, // 36 NCJ_tc_3or4stall_SLOT0
  { 1, 27, 28, 0, 0 }, // 37 COMPOUND
  { 1, 43, 44, 0, 0 }, // 38 V2LDST_tc_ld_SLOT01
  { 1, 44, 45, 0, 0 }, // 39 LD_tc_ld_SLOT0
  { 1, 35, 36, 0, 0 }, // 40 V4LDST_tc_st_SLOT0
  { 1, 34, 35, 0, 0 }, // 41 V4LDST_tc_ld_SLOT01
  { 1, 42, 43, 0, 0 }, // 42 LD_tc_3or4stall_SLOT0
  { 1, 45, 48, 0, 0 }, // 43 CVI_VM_LD
  { 1, 26, 27, 0, 0 }, // 44 M_tc_2_SLOT23
  { 1, 31, 32, 0, 0 }, // 45 S_3op_tc_3x_SLOT23
  { 1, 44, 45, 0, 0 }, // 46 ST_tc_ld_SLOT0
  { 1, 48, 49, 0, 0 }, // 47 V2LDST_tc_st_SLOT01
  { 1, 48, 49, 0, 0 }, // 48 ST_tc_st_SLOT01
  { 1, 35, 36, 0, 0 }, // 49 V2LDST_tc_st_SLOT0
  { 1, 35, 36, 0, 0 }, // 50 ST_tc_st_SLOT0
  { 1, 48, 49, 0, 0 }, // 51 V4LDST_tc_st_SLOT01
  { 1, 49, 52, 0, 0 }, // 52 CVI_VM_ST
  { 1, 28, 29, 0, 0 }, // 53 PREFIX
  { 1, 52, 54, 0, 0 }, // 54 CVI_VX_LATE
  { 1, 54, 56, 0, 0 }, // 55 CVI_VA_DV
  { 1, 56, 58, 0, 0 }, // 56 CVI_VP_LONG
  { 1, 58, 62, 0, 0 }, // 57 CVI_VM_VP_LDU
  { 1, 45, 48, 0, 0 }, // 58 CVI_VM_CUR_LD
  { 1, 62, 64, 0, 0 }, // 59 CVI_VM_TMP_LD
  { 1, 64, 68, 0, 0 }, // 60 CVI_VM_STU
  { 1, 68, 70, 0, 0 }, // 61 CVI_VM_NEW_ST
  { 1, 52, 54, 0, 0 }, // 62 CVI_VX
  { 1, 70, 72, 0, 0 }, // 63 CVI_VX_DV
  { 1, 72, 74, 0, 0 }, // 64 CVI_VS
  { 1, 74, 76, 0, 0 }, // 65 CVI_VP_VS_LONG_EARLY
  { 1, 56, 58, 0, 0 }, // 66 CVI_VP
  { 1, 74, 76, 0, 0 }, // 67 CVI_VP_VS_LONG
  { 1, 76, 78, 0, 0 }, // 68 CVI_HIST
  { 1, 70, 72, 0, 0 }, // 69 CVI_VX_DV_LONG
  { 1, 52, 54, 0, 0 }, // 70 CVI_VX_LONG
  { 1, 72, 74, 0, 0 }, // 71 CVI_VINLANESAT
  { 1, 74, 76, 0, 0 }, // 72 CVI_VP_VS
  { 1, 44, 45, 0, 0 }, // 73 ST_tc_3stall_SLOT0
  { 0, ~0U, ~0U, ~0U, ~0U } // end marker
};

// ===============================================================
// Data tables for the new per-operand machine model.

static const llvm::MCSchedModel HexagonModelV4 = {
  4, // IssueWidth
  MCSchedModel::DefaultMicroOpBufferSize,
  MCSchedModel::DefaultLoopMicroOpBufferSize,
  1, // LoadLatency
  MCSchedModel::DefaultHighLatency,
  MCSchedModel::DefaultMispredictPenalty,
  0, // PostRAScheduler
  1, // CompleteModel
  1, // Processor ID
  nullptr, nullptr, 0, 0, // No instruction-level machine model.
  HexagonItinerariesV4};

static const llvm::MCSchedModel HexagonModelV55 = {
  4, // IssueWidth
  MCSchedModel::DefaultMicroOpBufferSize,
  MCSchedModel::DefaultLoopMicroOpBufferSize,
  1, // LoadLatency
  MCSchedModel::DefaultHighLatency,
  MCSchedModel::DefaultMispredictPenalty,
  0, // PostRAScheduler
  1, // CompleteModel
  2, // Processor ID
  nullptr, nullptr, 0, 0, // No instruction-level machine model.
  HexagonItinerariesV55};

static const llvm::MCSchedModel HexagonModelV60 = {
  4, // IssueWidth
  MCSchedModel::DefaultMicroOpBufferSize,
  MCSchedModel::DefaultLoopMicroOpBufferSize,
  1, // LoadLatency
  MCSchedModel::DefaultHighLatency,
  MCSchedModel::DefaultMispredictPenalty,
  0, // PostRAScheduler
  1, // CompleteModel
  3, // Processor ID
  nullptr, nullptr, 0, 0, // No instruction-level machine model.
  HexagonItinerariesV60};

// Sorted (by key) array of itineraries for CPU subtype.
extern const llvm::SubtargetInfoKV HexagonProcSchedKV[] = {
  { "hexagonv4", (const void *)&HexagonModelV4 },
  { "hexagonv5", (const void *)&HexagonModelV4 },
  { "hexagonv55", (const void *)&HexagonModelV55 },
  { "hexagonv60", (const void *)&HexagonModelV60 }
};
#undef DBGFIELD
static inline MCSubtargetInfo *createHexagonMCSubtargetInfoImpl(const Triple &TT, StringRef CPU, StringRef FS) {
  return new MCSubtargetInfo(TT, CPU, FS, HexagonFeatureKV, HexagonSubTypeKV,
          HexagonProcSchedKV);
}

} // end llvm namespace
#endif // GET_SUBTARGETINFO_MC_DESC


#ifdef GET_SUBTARGETINFO_TARGET_DESC
#undef GET_SUBTARGETINFO_TARGET_DESC
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
// ParseSubtargetFeatures - Parses features string setting specified
// subtarget options.
void llvm::HexagonSubtarget::ParseSubtargetFeatures(StringRef CPU, StringRef FS) {
  DEBUG(dbgs() << "\nFeatures:" << FS);
  DEBUG(dbgs() << "\nCPU:" << CPU << "\n\n");
  InitMCProcessorInfo(CPU, FS);
  const FeatureBitset& Bits = getFeatureBits();
  if (Bits[Hexagon::ArchV4] && HexagonArchVersion < V4) HexagonArchVersion = V4;
  if (Bits[Hexagon::ArchV5] && HexagonArchVersion < V5) HexagonArchVersion = V5;
  if (Bits[Hexagon::ArchV55] && HexagonArchVersion < V55) HexagonArchVersion = V55;
  if (Bits[Hexagon::ArchV60] && HexagonArchVersion < V60) HexagonArchVersion = V60;
  if (Bits[Hexagon::ExtensionHVX]) UseHVXOps = true;
  if (Bits[Hexagon::ExtensionHVXDbl]) UseHVXDblOps = true;
}
#endif // GET_SUBTARGETINFO_TARGET_DESC
