/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
|*                                                                            *|
|* Target Register and Register Classes Information                           *|
|*                                                                            *|
|* Automatically generated file, do not edit!                                 *|
|*                                                                            *|
\*===----------------------------------------------------------------------===*/

namespace llvm {

extern const MCRegisterClass R600MCRegisterClasses[];

static const MVT::SimpleValueType VTLists[] = {
  /* 0 */ MVT::f32, MVT::i32, MVT::Other,
  /* 3 */ MVT::v2f32, MVT::v2i32, MVT::i64, MVT::f64, MVT::Other,
  /* 8 */ MVT::v2f32, MVT::v2i32, MVT::Other,
  /* 11 */ MVT::v4f32, MVT::v4i32, MVT::Other,
};

static const char *SubRegIndexNameTable[] = { "sub0", "sub1", "sub2", "sub3", "sub4", "sub5", "sub6", "sub7", "sub8", "sub9", "sub10", "sub11", "sub12", "sub13", "sub14", "sub15", "" };

static const TargetRegisterInfo::SubRegCoveredBits SubRegIdxRangeTable[] = {
  { 65535, 65535 },
  { 0, 32 },	// sub0
  { 32, 32 },	// sub1
  { 64, 32 },	// sub2
  { 96, 32 },	// sub3
  { 128, 32 },	// sub4
  { 160, 32 },	// sub5
  { 192, 32 },	// sub6
  { 224, 32 },	// sub7
  { 256, 32 },	// sub8
  { 288, 32 },	// sub9
  { 320, 32 },	// sub10
  { 352, 32 },	// sub11
  { 384, 32 },	// sub12
  { 416, 32 },	// sub13
  { 448, 32 },	// sub14
  { 480, 32 },	// sub15
};


static const LaneBitmask SubRegIndexLaneMaskTable[] = {
  LaneBitmask::getAll(),
  LaneBitmask(0x0000000000000001), // sub0
  LaneBitmask(0x0000000000000002), // sub1
  LaneBitmask(0x0000000000000004), // sub2
  LaneBitmask(0x0000000000000008), // sub3
  LaneBitmask(0x0000000000000010), // sub4
  LaneBitmask(0x0000000000000020), // sub5
  LaneBitmask(0x0000000000000040), // sub6
  LaneBitmask(0x0000000000000080), // sub7
  LaneBitmask(0x0000000000000100), // sub8
  LaneBitmask(0x0000000000000200), // sub9
  LaneBitmask(0x0000000000000400), // sub10
  LaneBitmask(0x0000000000000800), // sub11
  LaneBitmask(0x0000000000001000), // sub12
  LaneBitmask(0x0000000000002000), // sub13
  LaneBitmask(0x0000000000004000), // sub14
  LaneBitmask(0x0000000000008000), // sub15
 };



static const TargetRegisterInfo::RegClassInfo RegClassInfos[] = {
  // Mode = 0 (Default)
  { 32, 32, 32, /*VTLists+*/0 },    // R600_Reg32
  { 32, 32, 32, /*VTLists+*/0 },    // R600_TReg32
  { 32, 32, 32, /*VTLists+*/0 },    // R600_TReg32_X
  { 32, 32, 32, /*VTLists+*/1 },    // R600_Addr
  { 32, 32, 32, /*VTLists+*/0 },    // R600_KC0
  { 32, 32, 32, /*VTLists+*/0 },    // R600_KC1
  { 32, 32, 32, /*VTLists+*/0 },    // R600_TReg32_W
  { 32, 32, 32, /*VTLists+*/0 },    // R600_TReg32_Y
  { 32, 32, 32, /*VTLists+*/0 },    // R600_TReg32_Z
  { 32, 32, 32, /*VTLists+*/0 },    // R600_ArrayBase
  { 32, 32, 32, /*VTLists+*/0 },    // R600_KC0_W
  { 32, 32, 32, /*VTLists+*/0 },    // R600_KC0_X
  { 32, 32, 32, /*VTLists+*/0 },    // R600_KC0_Y
  { 32, 32, 32, /*VTLists+*/0 },    // R600_KC0_Z
  { 32, 32, 32, /*VTLists+*/0 },    // R600_KC1_W
  { 32, 32, 32, /*VTLists+*/0 },    // R600_KC1_X
  { 32, 32, 32, /*VTLists+*/0 },    // R600_KC1_Y
  { 32, 32, 32, /*VTLists+*/0 },    // R600_KC1_Z
  { 32, 32, 32, /*VTLists+*/1 },    // R600_LDS_SRC_REG
  { 32, 32, 32, /*VTLists+*/1 },    // R600_Predicate
  { 32, 32, 32, /*VTLists+*/1 },    // R600_Addr_W
  { 32, 32, 32, /*VTLists+*/1 },    // R600_Addr_Y
  { 32, 32, 32, /*VTLists+*/1 },    // R600_Addr_Z
  { 32, 32, 32, /*VTLists+*/0 },    // R600_LDS_SRC_REG_and_R600_Reg32
  { 32, 32, 32, /*VTLists+*/1 },    // R600_Predicate_Bit
  { 64, 64, 64, /*VTLists+*/3 },    // R600_Reg64
  { 64, 64, 64, /*VTLists+*/8 },    // R600_Reg64Vertical
  { 64, 64, 64, /*VTLists+*/8 },    // R600_Reg64Vertical_with_sub0_in_R600_TReg32_W
  { 64, 64, 64, /*VTLists+*/8 },    // R600_Reg64Vertical_with_sub0_in_R600_TReg32_X
  { 64, 64, 64, /*VTLists+*/8 },    // R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y
  { 64, 64, 64, /*VTLists+*/8 },    // R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z
  { 128, 128, 128, /*VTLists+*/11 },    // R600_Reg128
  { 128, 128, 128, /*VTLists+*/11 },    // R600_Reg128Vertical
  { 128, 128, 128, /*VTLists+*/11 },    // R600_Reg128Vertical_with_sub0_in_R600_TReg32_W
  { 128, 128, 128, /*VTLists+*/11 },    // R600_Reg128Vertical_with_sub0_in_R600_TReg32_X
  { 128, 128, 128, /*VTLists+*/11 },    // R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y
  { 128, 128, 128, /*VTLists+*/11 },    // R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z
};
static const uint32_t R600_Reg32SubClassMask[] = {
  0x0083ffff, 0x00000000, 
  0xfe000000, 0x0000001f, // sub0
  0xfe000000, 0x0000001f, // sub1
  0x80000000, 0x0000001f, // sub2
  0x80000000, 0x0000001f, // sub3
};

static const uint32_t R600_TReg32SubClassMask[] = {
  0x000001c6, 0x00000000, 
  0xfe000000, 0x0000001f, // sub0
  0xfe000000, 0x0000001f, // sub1
  0x80000000, 0x0000001f, // sub2
  0x80000000, 0x0000001f, // sub3
};

static const uint32_t R600_TReg32_XSubClassMask[] = {
  0x00000004, 0x00000000, 
  0x92000000, 0x00000004, // sub0
  0x10000000, 0x00000004, // sub1
  0x00000000, 0x00000004, // sub2
  0x00000000, 0x00000004, // sub3
};

static const uint32_t R600_AddrSubClassMask[] = {
  0x00000008, 0x00000000, 
};

static const uint32_t R600_KC0SubClassMask[] = {
  0x00003c10, 0x00000000, 
};

static const uint32_t R600_KC1SubClassMask[] = {
  0x0003c020, 0x00000000, 
};

static const uint32_t R600_TReg32_WSubClassMask[] = {
  0x00000040, 0x00000000, 
  0x08000000, 0x00000002, // sub0
  0x08000000, 0x00000002, // sub1
  0x00000000, 0x00000002, // sub2
  0x80000000, 0x00000002, // sub3
};

static const uint32_t R600_TReg32_YSubClassMask[] = {
  0x00000080, 0x00000000, 
  0x20000000, 0x00000008, // sub0
  0xa2000000, 0x00000008, // sub1
  0x00000000, 0x00000008, // sub2
  0x00000000, 0x00000008, // sub3
};

static const uint32_t R600_TReg32_ZSubClassMask[] = {
  0x00000100, 0x00000000, 
  0x40000000, 0x00000010, // sub0
  0x40000000, 0x00000010, // sub1
  0x80000000, 0x00000010, // sub2
  0x00000000, 0x00000010, // sub3
};

static const uint32_t R600_ArrayBaseSubClassMask[] = {
  0x00000200, 0x00000000, 
};

static const uint32_t R600_KC0_WSubClassMask[] = {
  0x00000400, 0x00000000, 
};

static const uint32_t R600_KC0_XSubClassMask[] = {
  0x00000800, 0x00000000, 
};

static const uint32_t R600_KC0_YSubClassMask[] = {
  0x00001000, 0x00000000, 
};

static const uint32_t R600_KC0_ZSubClassMask[] = {
  0x00002000, 0x00000000, 
};

static const uint32_t R600_KC1_WSubClassMask[] = {
  0x00004000, 0x00000000, 
};

static const uint32_t R600_KC1_XSubClassMask[] = {
  0x00008000, 0x00000000, 
};

static const uint32_t R600_KC1_YSubClassMask[] = {
  0x00010000, 0x00000000, 
};

static const uint32_t R600_KC1_ZSubClassMask[] = {
  0x00020000, 0x00000000, 
};

static const uint32_t R600_LDS_SRC_REGSubClassMask[] = {
  0x00840000, 0x00000000, 
};

static const uint32_t R600_PredicateSubClassMask[] = {
  0x00080000, 0x00000000, 
};

static const uint32_t R600_Addr_WSubClassMask[] = {
  0x00100000, 0x00000000, 
};

static const uint32_t R600_Addr_YSubClassMask[] = {
  0x00200000, 0x00000000, 
};

static const uint32_t R600_Addr_ZSubClassMask[] = {
  0x00400000, 0x00000000, 
};

static const uint32_t R600_LDS_SRC_REG_and_R600_Reg32SubClassMask[] = {
  0x00800000, 0x00000000, 
};

static const uint32_t R600_Predicate_BitSubClassMask[] = {
  0x01000000, 0x00000000, 
};

static const uint32_t R600_Reg64SubClassMask[] = {
  0x02000000, 0x00000000, 
};

static const uint32_t R600_Reg64VerticalSubClassMask[] = {
  0x7c000000, 0x00000000, 
};

static const uint32_t R600_Reg64Vertical_with_sub0_in_R600_TReg32_WSubClassMask[] = {
  0x08000000, 0x00000000, 
};

static const uint32_t R600_Reg64Vertical_with_sub0_in_R600_TReg32_XSubClassMask[] = {
  0x10000000, 0x00000000, 
};

static const uint32_t R600_Reg64Vertical_with_sub0_in_R600_TReg32_YSubClassMask[] = {
  0x20000000, 0x00000000, 
};

static const uint32_t R600_Reg64Vertical_with_sub0_in_R600_TReg32_ZSubClassMask[] = {
  0x40000000, 0x00000000, 
};

static const uint32_t R600_Reg128SubClassMask[] = {
  0x80000000, 0x00000000, 
};

static const uint32_t R600_Reg128VerticalSubClassMask[] = {
  0x00000000, 0x0000001f, 
};

static const uint32_t R600_Reg128Vertical_with_sub0_in_R600_TReg32_WSubClassMask[] = {
  0x00000000, 0x00000002, 
};

static const uint32_t R600_Reg128Vertical_with_sub0_in_R600_TReg32_XSubClassMask[] = {
  0x00000000, 0x00000004, 
};

static const uint32_t R600_Reg128Vertical_with_sub0_in_R600_TReg32_YSubClassMask[] = {
  0x00000000, 0x00000008, 
};

static const uint32_t R600_Reg128Vertical_with_sub0_in_R600_TReg32_ZSubClassMask[] = {
  0x00000000, 0x00000010, 
};

static const uint16_t SuperRegIdxSeqs[] = {
  /* 0 */ 1, 2, 3, 4, 0,
};

static unsigned const R600_TReg32Superclasses[] = {
  R600::R600_Reg32RegClassID,
};

static unsigned const R600_TReg32_XSuperclasses[] = {
  R600::R600_Reg32RegClassID,
  R600::R600_TReg32RegClassID,
};

static unsigned const R600_AddrSuperclasses[] = {
  R600::R600_Reg32RegClassID,
};

static unsigned const R600_KC0Superclasses[] = {
  R600::R600_Reg32RegClassID,
};

static unsigned const R600_KC1Superclasses[] = {
  R600::R600_Reg32RegClassID,
};

static unsigned const R600_TReg32_WSuperclasses[] = {
  R600::R600_Reg32RegClassID,
  R600::R600_TReg32RegClassID,
};

static unsigned const R600_TReg32_YSuperclasses[] = {
  R600::R600_Reg32RegClassID,
  R600::R600_TReg32RegClassID,
};

static unsigned const R600_TReg32_ZSuperclasses[] = {
  R600::R600_Reg32RegClassID,
  R600::R600_TReg32RegClassID,
};

static unsigned const R600_ArrayBaseSuperclasses[] = {
  R600::R600_Reg32RegClassID,
};

static unsigned const R600_KC0_WSuperclasses[] = {
  R600::R600_Reg32RegClassID,
  R600::R600_KC0RegClassID,
};

static unsigned const R600_KC0_XSuperclasses[] = {
  R600::R600_Reg32RegClassID,
  R600::R600_KC0RegClassID,
};

static unsigned const R600_KC0_YSuperclasses[] = {
  R600::R600_Reg32RegClassID,
  R600::R600_KC0RegClassID,
};

static unsigned const R600_KC0_ZSuperclasses[] = {
  R600::R600_Reg32RegClassID,
  R600::R600_KC0RegClassID,
};

static unsigned const R600_KC1_WSuperclasses[] = {
  R600::R600_Reg32RegClassID,
  R600::R600_KC1RegClassID,
};

static unsigned const R600_KC1_XSuperclasses[] = {
  R600::R600_Reg32RegClassID,
  R600::R600_KC1RegClassID,
};

static unsigned const R600_KC1_YSuperclasses[] = {
  R600::R600_Reg32RegClassID,
  R600::R600_KC1RegClassID,
};

static unsigned const R600_KC1_ZSuperclasses[] = {
  R600::R600_Reg32RegClassID,
  R600::R600_KC1RegClassID,
};

static unsigned const R600_LDS_SRC_REG_and_R600_Reg32Superclasses[] = {
  R600::R600_Reg32RegClassID,
  R600::R600_LDS_SRC_REGRegClassID,
};

static unsigned const R600_Reg64Vertical_with_sub0_in_R600_TReg32_WSuperclasses[] = {
  R600::R600_Reg64VerticalRegClassID,
};

static unsigned const R600_Reg64Vertical_with_sub0_in_R600_TReg32_XSuperclasses[] = {
  R600::R600_Reg64VerticalRegClassID,
};

static unsigned const R600_Reg64Vertical_with_sub0_in_R600_TReg32_YSuperclasses[] = {
  R600::R600_Reg64VerticalRegClassID,
};

static unsigned const R600_Reg64Vertical_with_sub0_in_R600_TReg32_ZSuperclasses[] = {
  R600::R600_Reg64VerticalRegClassID,
};

static unsigned const R600_Reg128Vertical_with_sub0_in_R600_TReg32_WSuperclasses[] = {
  R600::R600_Reg128VerticalRegClassID,
};

static unsigned const R600_Reg128Vertical_with_sub0_in_R600_TReg32_XSuperclasses[] = {
  R600::R600_Reg128VerticalRegClassID,
};

static unsigned const R600_Reg128Vertical_with_sub0_in_R600_TReg32_YSuperclasses[] = {
  R600::R600_Reg128VerticalRegClassID,
};

static unsigned const R600_Reg128Vertical_with_sub0_in_R600_TReg32_ZSuperclasses[] = {
  R600::R600_Reg128VerticalRegClassID,
};


namespace R600 {   // Register class instances
  extern const TargetRegisterClass R600_Reg32RegClass = {
    &R600MCRegisterClasses[R600_Reg32RegClassID],
    R600_Reg32SubClassMask,
    SuperRegIdxSeqs + 0,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    nullptr, 0,
    nullptr
  };

  extern const TargetRegisterClass R600_TReg32RegClass = {
    &R600MCRegisterClasses[R600_TReg32RegClassID],
    R600_TReg32SubClassMask,
    SuperRegIdxSeqs + 0,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_TReg32Superclasses,  1,
    nullptr
  };

  extern const TargetRegisterClass R600_TReg32_XRegClass = {
    &R600MCRegisterClasses[R600_TReg32_XRegClassID],
    R600_TReg32_XSubClassMask,
    SuperRegIdxSeqs + 0,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_TReg32_XSuperclasses,  2,
    nullptr
  };

  extern const TargetRegisterClass R600_AddrRegClass = {
    &R600MCRegisterClasses[R600_AddrRegClassID],
    R600_AddrSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_AddrSuperclasses,  1,
    nullptr
  };

  extern const TargetRegisterClass R600_KC0RegClass = {
    &R600MCRegisterClasses[R600_KC0RegClassID],
    R600_KC0SubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_KC0Superclasses,  1,
    nullptr
  };

  extern const TargetRegisterClass R600_KC1RegClass = {
    &R600MCRegisterClasses[R600_KC1RegClassID],
    R600_KC1SubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_KC1Superclasses,  1,
    nullptr
  };

  extern const TargetRegisterClass R600_TReg32_WRegClass = {
    &R600MCRegisterClasses[R600_TReg32_WRegClassID],
    R600_TReg32_WSubClassMask,
    SuperRegIdxSeqs + 0,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_TReg32_WSuperclasses,  2,
    nullptr
  };

  extern const TargetRegisterClass R600_TReg32_YRegClass = {
    &R600MCRegisterClasses[R600_TReg32_YRegClassID],
    R600_TReg32_YSubClassMask,
    SuperRegIdxSeqs + 0,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_TReg32_YSuperclasses,  2,
    nullptr
  };

  extern const TargetRegisterClass R600_TReg32_ZRegClass = {
    &R600MCRegisterClasses[R600_TReg32_ZRegClassID],
    R600_TReg32_ZSubClassMask,
    SuperRegIdxSeqs + 0,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_TReg32_ZSuperclasses,  2,
    nullptr
  };

  extern const TargetRegisterClass R600_ArrayBaseRegClass = {
    &R600MCRegisterClasses[R600_ArrayBaseRegClassID],
    R600_ArrayBaseSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_ArrayBaseSuperclasses,  1,
    nullptr
  };

  extern const TargetRegisterClass R600_KC0_WRegClass = {
    &R600MCRegisterClasses[R600_KC0_WRegClassID],
    R600_KC0_WSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_KC0_WSuperclasses,  2,
    nullptr
  };

  extern const TargetRegisterClass R600_KC0_XRegClass = {
    &R600MCRegisterClasses[R600_KC0_XRegClassID],
    R600_KC0_XSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_KC0_XSuperclasses,  2,
    nullptr
  };

  extern const TargetRegisterClass R600_KC0_YRegClass = {
    &R600MCRegisterClasses[R600_KC0_YRegClassID],
    R600_KC0_YSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_KC0_YSuperclasses,  2,
    nullptr
  };

  extern const TargetRegisterClass R600_KC0_ZRegClass = {
    &R600MCRegisterClasses[R600_KC0_ZRegClassID],
    R600_KC0_ZSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_KC0_ZSuperclasses,  2,
    nullptr
  };

  extern const TargetRegisterClass R600_KC1_WRegClass = {
    &R600MCRegisterClasses[R600_KC1_WRegClassID],
    R600_KC1_WSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_KC1_WSuperclasses,  2,
    nullptr
  };

  extern const TargetRegisterClass R600_KC1_XRegClass = {
    &R600MCRegisterClasses[R600_KC1_XRegClassID],
    R600_KC1_XSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_KC1_XSuperclasses,  2,
    nullptr
  };

  extern const TargetRegisterClass R600_KC1_YRegClass = {
    &R600MCRegisterClasses[R600_KC1_YRegClassID],
    R600_KC1_YSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_KC1_YSuperclasses,  2,
    nullptr
  };

  extern const TargetRegisterClass R600_KC1_ZRegClass = {
    &R600MCRegisterClasses[R600_KC1_ZRegClassID],
    R600_KC1_ZSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_KC1_ZSuperclasses,  2,
    nullptr
  };

  extern const TargetRegisterClass R600_LDS_SRC_REGRegClass = {
    &R600MCRegisterClasses[R600_LDS_SRC_REGRegClassID],
    R600_LDS_SRC_REGSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    nullptr, 0,
    nullptr
  };

  extern const TargetRegisterClass R600_PredicateRegClass = {
    &R600MCRegisterClasses[R600_PredicateRegClassID],
    R600_PredicateSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    nullptr, 0,
    nullptr
  };

  extern const TargetRegisterClass R600_Addr_WRegClass = {
    &R600MCRegisterClasses[R600_Addr_WRegClassID],
    R600_Addr_WSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    nullptr, 0,
    nullptr
  };

  extern const TargetRegisterClass R600_Addr_YRegClass = {
    &R600MCRegisterClasses[R600_Addr_YRegClassID],
    R600_Addr_YSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    nullptr, 0,
    nullptr
  };

  extern const TargetRegisterClass R600_Addr_ZRegClass = {
    &R600MCRegisterClasses[R600_Addr_ZRegClassID],
    R600_Addr_ZSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    nullptr, 0,
    nullptr
  };

  extern const TargetRegisterClass R600_LDS_SRC_REG_and_R600_Reg32RegClass = {
    &R600MCRegisterClasses[R600_LDS_SRC_REG_and_R600_Reg32RegClassID],
    R600_LDS_SRC_REG_and_R600_Reg32SubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_LDS_SRC_REG_and_R600_Reg32Superclasses,  2,
    nullptr
  };

  extern const TargetRegisterClass R600_Predicate_BitRegClass = {
    &R600MCRegisterClasses[R600_Predicate_BitRegClassID],
    R600_Predicate_BitSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000001),
    0,
    false,
    0x00, /* TSFlags */
    false, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    nullptr, 0,
    nullptr
  };

  extern const TargetRegisterClass R600_Reg64RegClass = {
    &R600MCRegisterClasses[R600_Reg64RegClassID],
    R600_Reg64SubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000003),
    0,
    false,
    0x00, /* TSFlags */
    true, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    nullptr, 0,
    nullptr
  };

  extern const TargetRegisterClass R600_Reg64VerticalRegClass = {
    &R600MCRegisterClasses[R600_Reg64VerticalRegClassID],
    R600_Reg64VerticalSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000003),
    0,
    false,
    0x00, /* TSFlags */
    true, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    nullptr, 0,
    nullptr
  };

  extern const TargetRegisterClass R600_Reg64Vertical_with_sub0_in_R600_TReg32_WRegClass = {
    &R600MCRegisterClasses[R600_Reg64Vertical_with_sub0_in_R600_TReg32_WRegClassID],
    R600_Reg64Vertical_with_sub0_in_R600_TReg32_WSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000003),
    0,
    false,
    0x00, /* TSFlags */
    true, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_Reg64Vertical_with_sub0_in_R600_TReg32_WSuperclasses,  1,
    nullptr
  };

  extern const TargetRegisterClass R600_Reg64Vertical_with_sub0_in_R600_TReg32_XRegClass = {
    &R600MCRegisterClasses[R600_Reg64Vertical_with_sub0_in_R600_TReg32_XRegClassID],
    R600_Reg64Vertical_with_sub0_in_R600_TReg32_XSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000003),
    0,
    false,
    0x00, /* TSFlags */
    true, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_Reg64Vertical_with_sub0_in_R600_TReg32_XSuperclasses,  1,
    nullptr
  };

  extern const TargetRegisterClass R600_Reg64Vertical_with_sub0_in_R600_TReg32_YRegClass = {
    &R600MCRegisterClasses[R600_Reg64Vertical_with_sub0_in_R600_TReg32_YRegClassID],
    R600_Reg64Vertical_with_sub0_in_R600_TReg32_YSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000003),
    0,
    false,
    0x00, /* TSFlags */
    true, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_Reg64Vertical_with_sub0_in_R600_TReg32_YSuperclasses,  1,
    nullptr
  };

  extern const TargetRegisterClass R600_Reg64Vertical_with_sub0_in_R600_TReg32_ZRegClass = {
    &R600MCRegisterClasses[R600_Reg64Vertical_with_sub0_in_R600_TReg32_ZRegClassID],
    R600_Reg64Vertical_with_sub0_in_R600_TReg32_ZSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x0000000000000003),
    0,
    false,
    0x00, /* TSFlags */
    true, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_Reg64Vertical_with_sub0_in_R600_TReg32_ZSuperclasses,  1,
    nullptr
  };

  extern const TargetRegisterClass R600_Reg128RegClass = {
    &R600MCRegisterClasses[R600_Reg128RegClassID],
    R600_Reg128SubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x000000000000000F),
    0,
    false,
    0x00, /* TSFlags */
    true, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    nullptr, 0,
    nullptr
  };

  extern const TargetRegisterClass R600_Reg128VerticalRegClass = {
    &R600MCRegisterClasses[R600_Reg128VerticalRegClassID],
    R600_Reg128VerticalSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x000000000000000F),
    0,
    false,
    0x00, /* TSFlags */
    true, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    nullptr, 0,
    nullptr
  };

  extern const TargetRegisterClass R600_Reg128Vertical_with_sub0_in_R600_TReg32_WRegClass = {
    &R600MCRegisterClasses[R600_Reg128Vertical_with_sub0_in_R600_TReg32_WRegClassID],
    R600_Reg128Vertical_with_sub0_in_R600_TReg32_WSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x000000000000000F),
    0,
    false,
    0x00, /* TSFlags */
    true, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_Reg128Vertical_with_sub0_in_R600_TReg32_WSuperclasses,  1,
    nullptr
  };

  extern const TargetRegisterClass R600_Reg128Vertical_with_sub0_in_R600_TReg32_XRegClass = {
    &R600MCRegisterClasses[R600_Reg128Vertical_with_sub0_in_R600_TReg32_XRegClassID],
    R600_Reg128Vertical_with_sub0_in_R600_TReg32_XSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x000000000000000F),
    0,
    false,
    0x00, /* TSFlags */
    true, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_Reg128Vertical_with_sub0_in_R600_TReg32_XSuperclasses,  1,
    nullptr
  };

  extern const TargetRegisterClass R600_Reg128Vertical_with_sub0_in_R600_TReg32_YRegClass = {
    &R600MCRegisterClasses[R600_Reg128Vertical_with_sub0_in_R600_TReg32_YRegClassID],
    R600_Reg128Vertical_with_sub0_in_R600_TReg32_YSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x000000000000000F),
    0,
    false,
    0x00, /* TSFlags */
    true, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_Reg128Vertical_with_sub0_in_R600_TReg32_YSuperclasses,  1,
    nullptr
  };

  extern const TargetRegisterClass R600_Reg128Vertical_with_sub0_in_R600_TReg32_ZRegClass = {
    &R600MCRegisterClasses[R600_Reg128Vertical_with_sub0_in_R600_TReg32_ZRegClassID],
    R600_Reg128Vertical_with_sub0_in_R600_TReg32_ZSubClassMask,
    SuperRegIdxSeqs + 4,
    LaneBitmask(0x000000000000000F),
    0,
    false,
    0x00, /* TSFlags */
    true, /* HasDisjunctSubRegs */
    false, /* CoveredBySubRegs */
    R600_Reg128Vertical_with_sub0_in_R600_TReg32_ZSuperclasses,  1,
    nullptr
  };

} // end namespace R600

namespace {
  const TargetRegisterClass *const RegisterClasses[] = {
    &R600::R600_Reg32RegClass,
    &R600::R600_TReg32RegClass,
    &R600::R600_TReg32_XRegClass,
    &R600::R600_AddrRegClass,
    &R600::R600_KC0RegClass,
    &R600::R600_KC1RegClass,
    &R600::R600_TReg32_WRegClass,
    &R600::R600_TReg32_YRegClass,
    &R600::R600_TReg32_ZRegClass,
    &R600::R600_ArrayBaseRegClass,
    &R600::R600_KC0_WRegClass,
    &R600::R600_KC0_XRegClass,
    &R600::R600_KC0_YRegClass,
    &R600::R600_KC0_ZRegClass,
    &R600::R600_KC1_WRegClass,
    &R600::R600_KC1_XRegClass,
    &R600::R600_KC1_YRegClass,
    &R600::R600_KC1_ZRegClass,
    &R600::R600_LDS_SRC_REGRegClass,
    &R600::R600_PredicateRegClass,
    &R600::R600_Addr_WRegClass,
    &R600::R600_Addr_YRegClass,
    &R600::R600_Addr_ZRegClass,
    &R600::R600_LDS_SRC_REG_and_R600_Reg32RegClass,
    &R600::R600_Predicate_BitRegClass,
    &R600::R600_Reg64RegClass,
    &R600::R600_Reg64VerticalRegClass,
    &R600::R600_Reg64Vertical_with_sub0_in_R600_TReg32_WRegClass,
    &R600::R600_Reg64Vertical_with_sub0_in_R600_TReg32_XRegClass,
    &R600::R600_Reg64Vertical_with_sub0_in_R600_TReg32_YRegClass,
    &R600::R600_Reg64Vertical_with_sub0_in_R600_TReg32_ZRegClass,
    &R600::R600_Reg128RegClass,
    &R600::R600_Reg128VerticalRegClass,
    &R600::R600_Reg128Vertical_with_sub0_in_R600_TReg32_WRegClass,
    &R600::R600_Reg128Vertical_with_sub0_in_R600_TReg32_XRegClass,
    &R600::R600_Reg128Vertical_with_sub0_in_R600_TReg32_YRegClass,
    &R600::R600_Reg128Vertical_with_sub0_in_R600_TReg32_ZRegClass,
  };
} // end anonymous namespace

static const uint8_t CostPerUseTable[] = { 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };


static const bool InAllocatableClassTable[] = { 
false, true, false, true, false, false, true, true, true, true, false, false, true, true, true, true, false, true, false, false, true, true, true, true, false, false, true, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, };


static const TargetRegisterInfoDesc R600RegInfoDesc = { // Extra Descriptors
CostPerUseTable, 1, InAllocatableClassTable};

unsigned R600GenRegisterInfo::composeSubRegIndicesImpl(unsigned IdxA, unsigned IdxB) const {
  static const uint8_t Rows[1][16] = {
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
  };

  --IdxA; assert(IdxA < 16); (void) IdxA;
  --IdxB; assert(IdxB < 16);
  return Rows[0][IdxB];
}

unsigned R600GenRegisterInfo::reverseComposeSubRegIndicesImpl(unsigned IdxA, unsigned IdxB) const {
  static const uint8_t Table[16][16] = {
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
  };

  --IdxA; assert(IdxA < 16);
  --IdxB; assert(IdxB < 16);
  return Table[IdxA][IdxB];
  }

  struct MaskRolOp {
    LaneBitmask Mask;
    uint8_t  RotateLeft;
  };
  static const MaskRolOp LaneMaskComposeSequences[] = {
    { LaneBitmask(0xFFFFFFFFFFFFFFFF),  0 }, { LaneBitmask::getNone(), 0 },   // Sequence 0
    { LaneBitmask(0xFFFFFFFFFFFFFFFF),  1 }, { LaneBitmask::getNone(), 0 },   // Sequence 2
    { LaneBitmask(0xFFFFFFFFFFFFFFFF),  2 }, { LaneBitmask::getNone(), 0 },   // Sequence 4
    { LaneBitmask(0xFFFFFFFFFFFFFFFF),  3 }, { LaneBitmask::getNone(), 0 },   // Sequence 6
    { LaneBitmask(0xFFFFFFFFFFFFFFFF),  4 }, { LaneBitmask::getNone(), 0 },   // Sequence 8
    { LaneBitmask(0xFFFFFFFFFFFFFFFF),  5 }, { LaneBitmask::getNone(), 0 },   // Sequence 10
    { LaneBitmask(0xFFFFFFFFFFFFFFFF),  6 }, { LaneBitmask::getNone(), 0 },   // Sequence 12
    { LaneBitmask(0xFFFFFFFFFFFFFFFF),  7 }, { LaneBitmask::getNone(), 0 },   // Sequence 14
    { LaneBitmask(0xFFFFFFFFFFFFFFFF),  8 }, { LaneBitmask::getNone(), 0 },   // Sequence 16
    { LaneBitmask(0xFFFFFFFFFFFFFFFF),  9 }, { LaneBitmask::getNone(), 0 },   // Sequence 18
    { LaneBitmask(0xFFFFFFFFFFFFFFFF), 10 }, { LaneBitmask::getNone(), 0 },   // Sequence 20
    { LaneBitmask(0xFFFFFFFFFFFFFFFF), 11 }, { LaneBitmask::getNone(), 0 },   // Sequence 22
    { LaneBitmask(0xFFFFFFFFFFFFFFFF), 12 }, { LaneBitmask::getNone(), 0 },   // Sequence 24
    { LaneBitmask(0xFFFFFFFFFFFFFFFF), 13 }, { LaneBitmask::getNone(), 0 },   // Sequence 26
    { LaneBitmask(0xFFFFFFFFFFFFFFFF), 14 }, { LaneBitmask::getNone(), 0 },   // Sequence 28
    { LaneBitmask(0xFFFFFFFFFFFFFFFF), 15 }, { LaneBitmask::getNone(), 0 }  // Sequence 30
  };
  static const uint8_t CompositeSequences[] = {
    0, // to sub0
    2, // to sub1
    4, // to sub2
    6, // to sub3
    8, // to sub4
    10, // to sub5
    12, // to sub6
    14, // to sub7
    16, // to sub8
    18, // to sub9
    20, // to sub10
    22, // to sub11
    24, // to sub12
    26, // to sub13
    28, // to sub14
    30 // to sub15
  };

LaneBitmask R600GenRegisterInfo::composeSubRegIndexLaneMaskImpl(unsigned IdxA, LaneBitmask LaneMask) const {
  --IdxA; assert(IdxA < 16 && "Subregister index out of bounds");
  LaneBitmask Result;
  for (const MaskRolOp *Ops =
       &LaneMaskComposeSequences[CompositeSequences[IdxA]];
       Ops->Mask.any(); ++Ops) {
    LaneBitmask::Type M = LaneMask.getAsInteger() & Ops->Mask.getAsInteger();
    if (unsigned S = Ops->RotateLeft)
      Result |= LaneBitmask((M << S) | (M >> (LaneBitmask::BitWidth - S)));
    else
      Result |= LaneBitmask(M);
  }
  return Result;
}

LaneBitmask R600GenRegisterInfo::reverseComposeSubRegIndexLaneMaskImpl(unsigned IdxA,  LaneBitmask LaneMask) const {
  LaneMask &= getSubRegIndexLaneMask(IdxA);
  --IdxA; assert(IdxA < 16 && "Subregister index out of bounds");
  LaneBitmask Result;
  for (const MaskRolOp *Ops =
       &LaneMaskComposeSequences[CompositeSequences[IdxA]];
       Ops->Mask.any(); ++Ops) {
    LaneBitmask::Type M = LaneMask.getAsInteger();
    if (unsigned S = Ops->RotateLeft)
      Result |= LaneBitmask((M >> S) | (M << (LaneBitmask::BitWidth - S)));
    else
      Result |= LaneBitmask(M);
  }
  return Result;
}

const TargetRegisterClass *R600GenRegisterInfo::getSubClassWithSubReg(const TargetRegisterClass *RC, unsigned Idx) const {
  static const uint8_t Table[37][16] = {
    {	// R600_Reg32
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_TReg32
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_TReg32_X
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_Addr
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_KC0
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_KC1
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_TReg32_W
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_TReg32_Y
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_TReg32_Z
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_ArrayBase
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_KC0_W
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_KC0_X
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_KC0_Y
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_KC0_Z
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_KC1_W
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_KC1_X
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_KC1_Y
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_KC1_Z
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_LDS_SRC_REG
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_Predicate
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_Addr_W
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_Addr_Y
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_Addr_Z
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_LDS_SRC_REG_and_R600_Reg32
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_Predicate_Bit
      0,	// sub0
      0,	// sub1
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_Reg64
      26,	// sub0 -> R600_Reg64
      26,	// sub1 -> R600_Reg64
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_Reg64Vertical
      27,	// sub0 -> R600_Reg64Vertical
      27,	// sub1 -> R600_Reg64Vertical
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_W
      28,	// sub0 -> R600_Reg64Vertical_with_sub0_in_R600_TReg32_W
      28,	// sub1 -> R600_Reg64Vertical_with_sub0_in_R600_TReg32_W
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_X
      29,	// sub0 -> R600_Reg64Vertical_with_sub0_in_R600_TReg32_X
      29,	// sub1 -> R600_Reg64Vertical_with_sub0_in_R600_TReg32_X
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y
      30,	// sub0 -> R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y
      30,	// sub1 -> R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z
      31,	// sub0 -> R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z
      31,	// sub1 -> R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z
      0,	// sub2
      0,	// sub3
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_Reg128
      32,	// sub0 -> R600_Reg128
      32,	// sub1 -> R600_Reg128
      32,	// sub2 -> R600_Reg128
      32,	// sub3 -> R600_Reg128
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_Reg128Vertical
      33,	// sub0 -> R600_Reg128Vertical
      33,	// sub1 -> R600_Reg128Vertical
      33,	// sub2 -> R600_Reg128Vertical
      33,	// sub3 -> R600_Reg128Vertical
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_W
      34,	// sub0 -> R600_Reg128Vertical_with_sub0_in_R600_TReg32_W
      34,	// sub1 -> R600_Reg128Vertical_with_sub0_in_R600_TReg32_W
      34,	// sub2 -> R600_Reg128Vertical_with_sub0_in_R600_TReg32_W
      34,	// sub3 -> R600_Reg128Vertical_with_sub0_in_R600_TReg32_W
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_X
      35,	// sub0 -> R600_Reg128Vertical_with_sub0_in_R600_TReg32_X
      35,	// sub1 -> R600_Reg128Vertical_with_sub0_in_R600_TReg32_X
      35,	// sub2 -> R600_Reg128Vertical_with_sub0_in_R600_TReg32_X
      35,	// sub3 -> R600_Reg128Vertical_with_sub0_in_R600_TReg32_X
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y
      36,	// sub0 -> R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y
      36,	// sub1 -> R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y
      36,	// sub2 -> R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y
      36,	// sub3 -> R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
    {	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z
      37,	// sub0 -> R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z
      37,	// sub1 -> R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z
      37,	// sub2 -> R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z
      37,	// sub3 -> R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z
      0,	// sub4
      0,	// sub5
      0,	// sub6
      0,	// sub7
      0,	// sub8
      0,	// sub9
      0,	// sub10
      0,	// sub11
      0,	// sub12
      0,	// sub13
      0,	// sub14
      0,	// sub15
    },
  };
  assert(RC && "Missing regclass");
  if (!Idx) return RC;
  --Idx;
  assert(Idx < 16 && "Bad subreg");
  unsigned TV = Table[RC->getID()][Idx];
  return TV ? getRegClass(TV - 1) : nullptr;
}

const TargetRegisterClass *R600GenRegisterInfo::getSubRegisterClass(const TargetRegisterClass *RC, unsigned Idx) const {
  static const uint8_t Table[37][16] = {
    {	// R600_Reg32
      0,	// R600_Reg32:sub0
      0,	// R600_Reg32:sub1
      0,	// R600_Reg32:sub2
      0,	// R600_Reg32:sub3
      0,	// R600_Reg32:sub4
      0,	// R600_Reg32:sub5
      0,	// R600_Reg32:sub6
      0,	// R600_Reg32:sub7
      0,	// R600_Reg32:sub8
      0,	// R600_Reg32:sub9
      0,	// R600_Reg32:sub10
      0,	// R600_Reg32:sub11
      0,	// R600_Reg32:sub12
      0,	// R600_Reg32:sub13
      0,	// R600_Reg32:sub14
      0,	// R600_Reg32:sub15
    },
    {	// R600_TReg32
      0,	// R600_TReg32:sub0
      0,	// R600_TReg32:sub1
      0,	// R600_TReg32:sub2
      0,	// R600_TReg32:sub3
      0,	// R600_TReg32:sub4
      0,	// R600_TReg32:sub5
      0,	// R600_TReg32:sub6
      0,	// R600_TReg32:sub7
      0,	// R600_TReg32:sub8
      0,	// R600_TReg32:sub9
      0,	// R600_TReg32:sub10
      0,	// R600_TReg32:sub11
      0,	// R600_TReg32:sub12
      0,	// R600_TReg32:sub13
      0,	// R600_TReg32:sub14
      0,	// R600_TReg32:sub15
    },
    {	// R600_TReg32_X
      0,	// R600_TReg32_X:sub0
      0,	// R600_TReg32_X:sub1
      0,	// R600_TReg32_X:sub2
      0,	// R600_TReg32_X:sub3
      0,	// R600_TReg32_X:sub4
      0,	// R600_TReg32_X:sub5
      0,	// R600_TReg32_X:sub6
      0,	// R600_TReg32_X:sub7
      0,	// R600_TReg32_X:sub8
      0,	// R600_TReg32_X:sub9
      0,	// R600_TReg32_X:sub10
      0,	// R600_TReg32_X:sub11
      0,	// R600_TReg32_X:sub12
      0,	// R600_TReg32_X:sub13
      0,	// R600_TReg32_X:sub14
      0,	// R600_TReg32_X:sub15
    },
    {	// R600_Addr
      0,	// R600_Addr:sub0
      0,	// R600_Addr:sub1
      0,	// R600_Addr:sub2
      0,	// R600_Addr:sub3
      0,	// R600_Addr:sub4
      0,	// R600_Addr:sub5
      0,	// R600_Addr:sub6
      0,	// R600_Addr:sub7
      0,	// R600_Addr:sub8
      0,	// R600_Addr:sub9
      0,	// R600_Addr:sub10
      0,	// R600_Addr:sub11
      0,	// R600_Addr:sub12
      0,	// R600_Addr:sub13
      0,	// R600_Addr:sub14
      0,	// R600_Addr:sub15
    },
    {	// R600_KC0
      0,	// R600_KC0:sub0
      0,	// R600_KC0:sub1
      0,	// R600_KC0:sub2
      0,	// R600_KC0:sub3
      0,	// R600_KC0:sub4
      0,	// R600_KC0:sub5
      0,	// R600_KC0:sub6
      0,	// R600_KC0:sub7
      0,	// R600_KC0:sub8
      0,	// R600_KC0:sub9
      0,	// R600_KC0:sub10
      0,	// R600_KC0:sub11
      0,	// R600_KC0:sub12
      0,	// R600_KC0:sub13
      0,	// R600_KC0:sub14
      0,	// R600_KC0:sub15
    },
    {	// R600_KC1
      0,	// R600_KC1:sub0
      0,	// R600_KC1:sub1
      0,	// R600_KC1:sub2
      0,	// R600_KC1:sub3
      0,	// R600_KC1:sub4
      0,	// R600_KC1:sub5
      0,	// R600_KC1:sub6
      0,	// R600_KC1:sub7
      0,	// R600_KC1:sub8
      0,	// R600_KC1:sub9
      0,	// R600_KC1:sub10
      0,	// R600_KC1:sub11
      0,	// R600_KC1:sub12
      0,	// R600_KC1:sub13
      0,	// R600_KC1:sub14
      0,	// R600_KC1:sub15
    },
    {	// R600_TReg32_W
      0,	// R600_TReg32_W:sub0
      0,	// R600_TReg32_W:sub1
      0,	// R600_TReg32_W:sub2
      0,	// R600_TReg32_W:sub3
      0,	// R600_TReg32_W:sub4
      0,	// R600_TReg32_W:sub5
      0,	// R600_TReg32_W:sub6
      0,	// R600_TReg32_W:sub7
      0,	// R600_TReg32_W:sub8
      0,	// R600_TReg32_W:sub9
      0,	// R600_TReg32_W:sub10
      0,	// R600_TReg32_W:sub11
      0,	// R600_TReg32_W:sub12
      0,	// R600_TReg32_W:sub13
      0,	// R600_TReg32_W:sub14
      0,	// R600_TReg32_W:sub15
    },
    {	// R600_TReg32_Y
      0,	// R600_TReg32_Y:sub0
      0,	// R600_TReg32_Y:sub1
      0,	// R600_TReg32_Y:sub2
      0,	// R600_TReg32_Y:sub3
      0,	// R600_TReg32_Y:sub4
      0,	// R600_TReg32_Y:sub5
      0,	// R600_TReg32_Y:sub6
      0,	// R600_TReg32_Y:sub7
      0,	// R600_TReg32_Y:sub8
      0,	// R600_TReg32_Y:sub9
      0,	// R600_TReg32_Y:sub10
      0,	// R600_TReg32_Y:sub11
      0,	// R600_TReg32_Y:sub12
      0,	// R600_TReg32_Y:sub13
      0,	// R600_TReg32_Y:sub14
      0,	// R600_TReg32_Y:sub15
    },
    {	// R600_TReg32_Z
      0,	// R600_TReg32_Z:sub0
      0,	// R600_TReg32_Z:sub1
      0,	// R600_TReg32_Z:sub2
      0,	// R600_TReg32_Z:sub3
      0,	// R600_TReg32_Z:sub4
      0,	// R600_TReg32_Z:sub5
      0,	// R600_TReg32_Z:sub6
      0,	// R600_TReg32_Z:sub7
      0,	// R600_TReg32_Z:sub8
      0,	// R600_TReg32_Z:sub9
      0,	// R600_TReg32_Z:sub10
      0,	// R600_TReg32_Z:sub11
      0,	// R600_TReg32_Z:sub12
      0,	// R600_TReg32_Z:sub13
      0,	// R600_TReg32_Z:sub14
      0,	// R600_TReg32_Z:sub15
    },
    {	// R600_ArrayBase
      0,	// R600_ArrayBase:sub0
      0,	// R600_ArrayBase:sub1
      0,	// R600_ArrayBase:sub2
      0,	// R600_ArrayBase:sub3
      0,	// R600_ArrayBase:sub4
      0,	// R600_ArrayBase:sub5
      0,	// R600_ArrayBase:sub6
      0,	// R600_ArrayBase:sub7
      0,	// R600_ArrayBase:sub8
      0,	// R600_ArrayBase:sub9
      0,	// R600_ArrayBase:sub10
      0,	// R600_ArrayBase:sub11
      0,	// R600_ArrayBase:sub12
      0,	// R600_ArrayBase:sub13
      0,	// R600_ArrayBase:sub14
      0,	// R600_ArrayBase:sub15
    },
    {	// R600_KC0_W
      0,	// R600_KC0_W:sub0
      0,	// R600_KC0_W:sub1
      0,	// R600_KC0_W:sub2
      0,	// R600_KC0_W:sub3
      0,	// R600_KC0_W:sub4
      0,	// R600_KC0_W:sub5
      0,	// R600_KC0_W:sub6
      0,	// R600_KC0_W:sub7
      0,	// R600_KC0_W:sub8
      0,	// R600_KC0_W:sub9
      0,	// R600_KC0_W:sub10
      0,	// R600_KC0_W:sub11
      0,	// R600_KC0_W:sub12
      0,	// R600_KC0_W:sub13
      0,	// R600_KC0_W:sub14
      0,	// R600_KC0_W:sub15
    },
    {	// R600_KC0_X
      0,	// R600_KC0_X:sub0
      0,	// R600_KC0_X:sub1
      0,	// R600_KC0_X:sub2
      0,	// R600_KC0_X:sub3
      0,	// R600_KC0_X:sub4
      0,	// R600_KC0_X:sub5
      0,	// R600_KC0_X:sub6
      0,	// R600_KC0_X:sub7
      0,	// R600_KC0_X:sub8
      0,	// R600_KC0_X:sub9
      0,	// R600_KC0_X:sub10
      0,	// R600_KC0_X:sub11
      0,	// R600_KC0_X:sub12
      0,	// R600_KC0_X:sub13
      0,	// R600_KC0_X:sub14
      0,	// R600_KC0_X:sub15
    },
    {	// R600_KC0_Y
      0,	// R600_KC0_Y:sub0
      0,	// R600_KC0_Y:sub1
      0,	// R600_KC0_Y:sub2
      0,	// R600_KC0_Y:sub3
      0,	// R600_KC0_Y:sub4
      0,	// R600_KC0_Y:sub5
      0,	// R600_KC0_Y:sub6
      0,	// R600_KC0_Y:sub7
      0,	// R600_KC0_Y:sub8
      0,	// R600_KC0_Y:sub9
      0,	// R600_KC0_Y:sub10
      0,	// R600_KC0_Y:sub11
      0,	// R600_KC0_Y:sub12
      0,	// R600_KC0_Y:sub13
      0,	// R600_KC0_Y:sub14
      0,	// R600_KC0_Y:sub15
    },
    {	// R600_KC0_Z
      0,	// R600_KC0_Z:sub0
      0,	// R600_KC0_Z:sub1
      0,	// R600_KC0_Z:sub2
      0,	// R600_KC0_Z:sub3
      0,	// R600_KC0_Z:sub4
      0,	// R600_KC0_Z:sub5
      0,	// R600_KC0_Z:sub6
      0,	// R600_KC0_Z:sub7
      0,	// R600_KC0_Z:sub8
      0,	// R600_KC0_Z:sub9
      0,	// R600_KC0_Z:sub10
      0,	// R600_KC0_Z:sub11
      0,	// R600_KC0_Z:sub12
      0,	// R600_KC0_Z:sub13
      0,	// R600_KC0_Z:sub14
      0,	// R600_KC0_Z:sub15
    },
    {	// R600_KC1_W
      0,	// R600_KC1_W:sub0
      0,	// R600_KC1_W:sub1
      0,	// R600_KC1_W:sub2
      0,	// R600_KC1_W:sub3
      0,	// R600_KC1_W:sub4
      0,	// R600_KC1_W:sub5
      0,	// R600_KC1_W:sub6
      0,	// R600_KC1_W:sub7
      0,	// R600_KC1_W:sub8
      0,	// R600_KC1_W:sub9
      0,	// R600_KC1_W:sub10
      0,	// R600_KC1_W:sub11
      0,	// R600_KC1_W:sub12
      0,	// R600_KC1_W:sub13
      0,	// R600_KC1_W:sub14
      0,	// R600_KC1_W:sub15
    },
    {	// R600_KC1_X
      0,	// R600_KC1_X:sub0
      0,	// R600_KC1_X:sub1
      0,	// R600_KC1_X:sub2
      0,	// R600_KC1_X:sub3
      0,	// R600_KC1_X:sub4
      0,	// R600_KC1_X:sub5
      0,	// R600_KC1_X:sub6
      0,	// R600_KC1_X:sub7
      0,	// R600_KC1_X:sub8
      0,	// R600_KC1_X:sub9
      0,	// R600_KC1_X:sub10
      0,	// R600_KC1_X:sub11
      0,	// R600_KC1_X:sub12
      0,	// R600_KC1_X:sub13
      0,	// R600_KC1_X:sub14
      0,	// R600_KC1_X:sub15
    },
    {	// R600_KC1_Y
      0,	// R600_KC1_Y:sub0
      0,	// R600_KC1_Y:sub1
      0,	// R600_KC1_Y:sub2
      0,	// R600_KC1_Y:sub3
      0,	// R600_KC1_Y:sub4
      0,	// R600_KC1_Y:sub5
      0,	// R600_KC1_Y:sub6
      0,	// R600_KC1_Y:sub7
      0,	// R600_KC1_Y:sub8
      0,	// R600_KC1_Y:sub9
      0,	// R600_KC1_Y:sub10
      0,	// R600_KC1_Y:sub11
      0,	// R600_KC1_Y:sub12
      0,	// R600_KC1_Y:sub13
      0,	// R600_KC1_Y:sub14
      0,	// R600_KC1_Y:sub15
    },
    {	// R600_KC1_Z
      0,	// R600_KC1_Z:sub0
      0,	// R600_KC1_Z:sub1
      0,	// R600_KC1_Z:sub2
      0,	// R600_KC1_Z:sub3
      0,	// R600_KC1_Z:sub4
      0,	// R600_KC1_Z:sub5
      0,	// R600_KC1_Z:sub6
      0,	// R600_KC1_Z:sub7
      0,	// R600_KC1_Z:sub8
      0,	// R600_KC1_Z:sub9
      0,	// R600_KC1_Z:sub10
      0,	// R600_KC1_Z:sub11
      0,	// R600_KC1_Z:sub12
      0,	// R600_KC1_Z:sub13
      0,	// R600_KC1_Z:sub14
      0,	// R600_KC1_Z:sub15
    },
    {	// R600_LDS_SRC_REG
      0,	// R600_LDS_SRC_REG:sub0
      0,	// R600_LDS_SRC_REG:sub1
      0,	// R600_LDS_SRC_REG:sub2
      0,	// R600_LDS_SRC_REG:sub3
      0,	// R600_LDS_SRC_REG:sub4
      0,	// R600_LDS_SRC_REG:sub5
      0,	// R600_LDS_SRC_REG:sub6
      0,	// R600_LDS_SRC_REG:sub7
      0,	// R600_LDS_SRC_REG:sub8
      0,	// R600_LDS_SRC_REG:sub9
      0,	// R600_LDS_SRC_REG:sub10
      0,	// R600_LDS_SRC_REG:sub11
      0,	// R600_LDS_SRC_REG:sub12
      0,	// R600_LDS_SRC_REG:sub13
      0,	// R600_LDS_SRC_REG:sub14
      0,	// R600_LDS_SRC_REG:sub15
    },
    {	// R600_Predicate
      0,	// R600_Predicate:sub0
      0,	// R600_Predicate:sub1
      0,	// R600_Predicate:sub2
      0,	// R600_Predicate:sub3
      0,	// R600_Predicate:sub4
      0,	// R600_Predicate:sub5
      0,	// R600_Predicate:sub6
      0,	// R600_Predicate:sub7
      0,	// R600_Predicate:sub8
      0,	// R600_Predicate:sub9
      0,	// R600_Predicate:sub10
      0,	// R600_Predicate:sub11
      0,	// R600_Predicate:sub12
      0,	// R600_Predicate:sub13
      0,	// R600_Predicate:sub14
      0,	// R600_Predicate:sub15
    },
    {	// R600_Addr_W
      0,	// R600_Addr_W:sub0
      0,	// R600_Addr_W:sub1
      0,	// R600_Addr_W:sub2
      0,	// R600_Addr_W:sub3
      0,	// R600_Addr_W:sub4
      0,	// R600_Addr_W:sub5
      0,	// R600_Addr_W:sub6
      0,	// R600_Addr_W:sub7
      0,	// R600_Addr_W:sub8
      0,	// R600_Addr_W:sub9
      0,	// R600_Addr_W:sub10
      0,	// R600_Addr_W:sub11
      0,	// R600_Addr_W:sub12
      0,	// R600_Addr_W:sub13
      0,	// R600_Addr_W:sub14
      0,	// R600_Addr_W:sub15
    },
    {	// R600_Addr_Y
      0,	// R600_Addr_Y:sub0
      0,	// R600_Addr_Y:sub1
      0,	// R600_Addr_Y:sub2
      0,	// R600_Addr_Y:sub3
      0,	// R600_Addr_Y:sub4
      0,	// R600_Addr_Y:sub5
      0,	// R600_Addr_Y:sub6
      0,	// R600_Addr_Y:sub7
      0,	// R600_Addr_Y:sub8
      0,	// R600_Addr_Y:sub9
      0,	// R600_Addr_Y:sub10
      0,	// R600_Addr_Y:sub11
      0,	// R600_Addr_Y:sub12
      0,	// R600_Addr_Y:sub13
      0,	// R600_Addr_Y:sub14
      0,	// R600_Addr_Y:sub15
    },
    {	// R600_Addr_Z
      0,	// R600_Addr_Z:sub0
      0,	// R600_Addr_Z:sub1
      0,	// R600_Addr_Z:sub2
      0,	// R600_Addr_Z:sub3
      0,	// R600_Addr_Z:sub4
      0,	// R600_Addr_Z:sub5
      0,	// R600_Addr_Z:sub6
      0,	// R600_Addr_Z:sub7
      0,	// R600_Addr_Z:sub8
      0,	// R600_Addr_Z:sub9
      0,	// R600_Addr_Z:sub10
      0,	// R600_Addr_Z:sub11
      0,	// R600_Addr_Z:sub12
      0,	// R600_Addr_Z:sub13
      0,	// R600_Addr_Z:sub14
      0,	// R600_Addr_Z:sub15
    },
    {	// R600_LDS_SRC_REG_and_R600_Reg32
      0,	// R600_LDS_SRC_REG_and_R600_Reg32:sub0
      0,	// R600_LDS_SRC_REG_and_R600_Reg32:sub1
      0,	// R600_LDS_SRC_REG_and_R600_Reg32:sub2
      0,	// R600_LDS_SRC_REG_and_R600_Reg32:sub3
      0,	// R600_LDS_SRC_REG_and_R600_Reg32:sub4
      0,	// R600_LDS_SRC_REG_and_R600_Reg32:sub5
      0,	// R600_LDS_SRC_REG_and_R600_Reg32:sub6
      0,	// R600_LDS_SRC_REG_and_R600_Reg32:sub7
      0,	// R600_LDS_SRC_REG_and_R600_Reg32:sub8
      0,	// R600_LDS_SRC_REG_and_R600_Reg32:sub9
      0,	// R600_LDS_SRC_REG_and_R600_Reg32:sub10
      0,	// R600_LDS_SRC_REG_and_R600_Reg32:sub11
      0,	// R600_LDS_SRC_REG_and_R600_Reg32:sub12
      0,	// R600_LDS_SRC_REG_and_R600_Reg32:sub13
      0,	// R600_LDS_SRC_REG_and_R600_Reg32:sub14
      0,	// R600_LDS_SRC_REG_and_R600_Reg32:sub15
    },
    {	// R600_Predicate_Bit
      0,	// R600_Predicate_Bit:sub0
      0,	// R600_Predicate_Bit:sub1
      0,	// R600_Predicate_Bit:sub2
      0,	// R600_Predicate_Bit:sub3
      0,	// R600_Predicate_Bit:sub4
      0,	// R600_Predicate_Bit:sub5
      0,	// R600_Predicate_Bit:sub6
      0,	// R600_Predicate_Bit:sub7
      0,	// R600_Predicate_Bit:sub8
      0,	// R600_Predicate_Bit:sub9
      0,	// R600_Predicate_Bit:sub10
      0,	// R600_Predicate_Bit:sub11
      0,	// R600_Predicate_Bit:sub12
      0,	// R600_Predicate_Bit:sub13
      0,	// R600_Predicate_Bit:sub14
      0,	// R600_Predicate_Bit:sub15
    },
    {	// R600_Reg64
      3,	// R600_Reg64:sub0 -> R600_TReg32_X
      8,	// R600_Reg64:sub1 -> R600_TReg32_Y
      0,	// R600_Reg64:sub2
      0,	// R600_Reg64:sub3
      0,	// R600_Reg64:sub4
      0,	// R600_Reg64:sub5
      0,	// R600_Reg64:sub6
      0,	// R600_Reg64:sub7
      0,	// R600_Reg64:sub8
      0,	// R600_Reg64:sub9
      0,	// R600_Reg64:sub10
      0,	// R600_Reg64:sub11
      0,	// R600_Reg64:sub12
      0,	// R600_Reg64:sub13
      0,	// R600_Reg64:sub14
      0,	// R600_Reg64:sub15
    },
    {	// R600_Reg64Vertical
      2,	// R600_Reg64Vertical:sub0 -> R600_TReg32
      2,	// R600_Reg64Vertical:sub1 -> R600_TReg32
      0,	// R600_Reg64Vertical:sub2
      0,	// R600_Reg64Vertical:sub3
      0,	// R600_Reg64Vertical:sub4
      0,	// R600_Reg64Vertical:sub5
      0,	// R600_Reg64Vertical:sub6
      0,	// R600_Reg64Vertical:sub7
      0,	// R600_Reg64Vertical:sub8
      0,	// R600_Reg64Vertical:sub9
      0,	// R600_Reg64Vertical:sub10
      0,	// R600_Reg64Vertical:sub11
      0,	// R600_Reg64Vertical:sub12
      0,	// R600_Reg64Vertical:sub13
      0,	// R600_Reg64Vertical:sub14
      0,	// R600_Reg64Vertical:sub15
    },
    {	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_W
      7,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_W:sub0 -> R600_TReg32_W
      7,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_W:sub1 -> R600_TReg32_W
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_W:sub2
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_W:sub3
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_W:sub4
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_W:sub5
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_W:sub6
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_W:sub7
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_W:sub8
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_W:sub9
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_W:sub10
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_W:sub11
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_W:sub12
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_W:sub13
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_W:sub14
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_W:sub15
    },
    {	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_X
      3,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_X:sub0 -> R600_TReg32_X
      3,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_X:sub1 -> R600_TReg32_X
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_X:sub2
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_X:sub3
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_X:sub4
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_X:sub5
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_X:sub6
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_X:sub7
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_X:sub8
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_X:sub9
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_X:sub10
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_X:sub11
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_X:sub12
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_X:sub13
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_X:sub14
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_X:sub15
    },
    {	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y
      8,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y:sub0 -> R600_TReg32_Y
      8,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y:sub1 -> R600_TReg32_Y
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y:sub2
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y:sub3
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y:sub4
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y:sub5
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y:sub6
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y:sub7
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y:sub8
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y:sub9
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y:sub10
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y:sub11
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y:sub12
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y:sub13
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y:sub14
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y:sub15
    },
    {	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z
      9,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z:sub0 -> R600_TReg32_Z
      9,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z:sub1 -> R600_TReg32_Z
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z:sub2
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z:sub3
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z:sub4
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z:sub5
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z:sub6
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z:sub7
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z:sub8
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z:sub9
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z:sub10
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z:sub11
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z:sub12
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z:sub13
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z:sub14
      0,	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z:sub15
    },
    {	// R600_Reg128
      3,	// R600_Reg128:sub0 -> R600_TReg32_X
      8,	// R600_Reg128:sub1 -> R600_TReg32_Y
      9,	// R600_Reg128:sub2 -> R600_TReg32_Z
      7,	// R600_Reg128:sub3 -> R600_TReg32_W
      0,	// R600_Reg128:sub4
      0,	// R600_Reg128:sub5
      0,	// R600_Reg128:sub6
      0,	// R600_Reg128:sub7
      0,	// R600_Reg128:sub8
      0,	// R600_Reg128:sub9
      0,	// R600_Reg128:sub10
      0,	// R600_Reg128:sub11
      0,	// R600_Reg128:sub12
      0,	// R600_Reg128:sub13
      0,	// R600_Reg128:sub14
      0,	// R600_Reg128:sub15
    },
    {	// R600_Reg128Vertical
      2,	// R600_Reg128Vertical:sub0 -> R600_TReg32
      2,	// R600_Reg128Vertical:sub1 -> R600_TReg32
      2,	// R600_Reg128Vertical:sub2 -> R600_TReg32
      2,	// R600_Reg128Vertical:sub3 -> R600_TReg32
      0,	// R600_Reg128Vertical:sub4
      0,	// R600_Reg128Vertical:sub5
      0,	// R600_Reg128Vertical:sub6
      0,	// R600_Reg128Vertical:sub7
      0,	// R600_Reg128Vertical:sub8
      0,	// R600_Reg128Vertical:sub9
      0,	// R600_Reg128Vertical:sub10
      0,	// R600_Reg128Vertical:sub11
      0,	// R600_Reg128Vertical:sub12
      0,	// R600_Reg128Vertical:sub13
      0,	// R600_Reg128Vertical:sub14
      0,	// R600_Reg128Vertical:sub15
    },
    {	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_W
      7,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_W:sub0 -> R600_TReg32_W
      7,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_W:sub1 -> R600_TReg32_W
      7,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_W:sub2 -> R600_TReg32_W
      7,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_W:sub3 -> R600_TReg32_W
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_W:sub4
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_W:sub5
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_W:sub6
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_W:sub7
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_W:sub8
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_W:sub9
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_W:sub10
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_W:sub11
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_W:sub12
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_W:sub13
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_W:sub14
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_W:sub15
    },
    {	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_X
      3,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_X:sub0 -> R600_TReg32_X
      3,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_X:sub1 -> R600_TReg32_X
      3,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_X:sub2 -> R600_TReg32_X
      3,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_X:sub3 -> R600_TReg32_X
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_X:sub4
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_X:sub5
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_X:sub6
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_X:sub7
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_X:sub8
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_X:sub9
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_X:sub10
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_X:sub11
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_X:sub12
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_X:sub13
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_X:sub14
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_X:sub15
    },
    {	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y
      8,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y:sub0 -> R600_TReg32_Y
      8,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y:sub1 -> R600_TReg32_Y
      8,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y:sub2 -> R600_TReg32_Y
      8,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y:sub3 -> R600_TReg32_Y
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y:sub4
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y:sub5
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y:sub6
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y:sub7
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y:sub8
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y:sub9
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y:sub10
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y:sub11
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y:sub12
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y:sub13
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y:sub14
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y:sub15
    },
    {	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z
      9,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z:sub0 -> R600_TReg32_Z
      9,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z:sub1 -> R600_TReg32_Z
      9,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z:sub2 -> R600_TReg32_Z
      9,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z:sub3 -> R600_TReg32_Z
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z:sub4
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z:sub5
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z:sub6
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z:sub7
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z:sub8
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z:sub9
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z:sub10
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z:sub11
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z:sub12
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z:sub13
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z:sub14
      0,	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z:sub15
    },
  };
  assert(RC && "Missing regclass");
  if (!Idx) return RC;
  --Idx;
  assert(Idx < 16 && "Bad subreg");
  unsigned TV = Table[RC->getID()][Idx];
  return TV ? getRegClass(TV - 1) : nullptr;
}

/// Get the weight in units of pressure for this register class.
const RegClassWeight &R600GenRegisterInfo::
getRegClassWeight(const TargetRegisterClass *RC) const {
  static const RegClassWeight RCWeightTable[] = {
    {0, 942},  	// R600_Reg32
    {0, 513},  	// R600_TReg32
    {0, 129},  	// R600_TReg32_X
    {0, 128},  	// R600_Addr
    {0, 128},  	// R600_KC0
    {0, 128},  	// R600_KC1
    {0, 128},  	// R600_TReg32_W
    {0, 128},  	// R600_TReg32_Y
    {0, 128},  	// R600_TReg32_Z
    {0, 33},  	// R600_ArrayBase
    {0, 32},  	// R600_KC0_W
    {0, 32},  	// R600_KC0_X
    {0, 32},  	// R600_KC0_Y
    {0, 32},  	// R600_KC0_Z
    {0, 32},  	// R600_KC1_W
    {0, 32},  	// R600_KC1_X
    {0, 32},  	// R600_KC1_Y
    {0, 32},  	// R600_KC1_Z
    {0, 1},  	// R600_LDS_SRC_REG
    {0, 3},  	// R600_Predicate
    {0, 0},  	// R600_Addr_W
    {0, 0},  	// R600_Addr_Y
    {0, 0},  	// R600_Addr_Z
    {1, 1},  	// R600_LDS_SRC_REG_and_R600_Reg32
    {0, 1},  	// R600_Predicate_Bit
    {0, 128},  	// R600_Reg64
    {0, 16},  	// R600_Reg64Vertical
    {2, 4},  	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_W
    {2, 4},  	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_X
    {2, 4},  	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y
    {2, 4},  	// R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z
    {0, 512},  	// R600_Reg128
    {0, 16},  	// R600_Reg128Vertical
    {4, 4},  	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_W
    {4, 4},  	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_X
    {4, 4},  	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Y
    {4, 4},  	// R600_Reg128Vertical_with_sub0_in_R600_TReg32_Z
  };
  return RCWeightTable[RC->getID()];
}

/// Get the weight in units of pressure for this register unit.
unsigned R600GenRegisterInfo::
getRegUnitWeight(MCRegUnit RegUnit) const {
  assert(static_cast<unsigned>(RegUnit) < 1342 && "invalid register unit");
  // All register units have unit weight.
  return 1;
}


// Get the number of dimensions of register pressure.
unsigned R600GenRegisterInfo::getNumRegPressureSets() const {
  return 23;
}

// Get the name of this register unit pressure set.
const char *R600GenRegisterInfo::
getRegPressureSetName(unsigned Idx) const {
  static const char *PressureNameTable[] = {
    "R600_LDS_SRC_REG_and_R600_Reg32",
    "R600_Predicate_Bit",
    "R600_Predicate",
    "R600_Reg64Vertical_with_sub0_in_R600_TReg32_W",
    "R600_Reg64Vertical_with_sub0_in_R600_TReg32_X",
    "R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y",
    "R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z",
    "R600_Reg64Vertical",
    "R600_ArrayBase",
    "R600_TReg32_W",
    "R600_TReg32_Y",
    "R600_TReg32_Z",
    "R600_Reg64",
    "R600_TReg32_X",
    "R600_Reg64_with_R600_Reg64Vertical",
    "R600_TReg32_W_with_R600_Reg64Vertical",
    "R600_TReg32_Y_with_R600_Reg64Vertical",
    "R600_TReg32_Z_with_R600_Reg64Vertical",
    "R600_TReg32_X_with_R600_Reg64Vertical",
    "R600_TReg32_Y_with_R600_Reg64",
    "R600_TReg32_X_with_R600_Reg64",
    "R600_TReg32",
    "R600_Reg32",
  };
  return PressureNameTable[Idx];
}

// Get the register unit pressure limit for this dimension.
// This limit must be adjusted dynamically for reserved registers.
unsigned R600GenRegisterInfo::
getRegPressureSetLimit(const MachineFunction &MF, unsigned Idx) const {
  static const uint16_t PressureLimitTable[] = {
    1,  	// 0: R600_LDS_SRC_REG_and_R600_Reg32
    1,  	// 1: R600_Predicate_Bit
    3,  	// 2: R600_Predicate
    4,  	// 3: R600_Reg64Vertical_with_sub0_in_R600_TReg32_W
    4,  	// 4: R600_Reg64Vertical_with_sub0_in_R600_TReg32_X
    4,  	// 5: R600_Reg64Vertical_with_sub0_in_R600_TReg32_Y
    4,  	// 6: R600_Reg64Vertical_with_sub0_in_R600_TReg32_Z
    16,  	// 7: R600_Reg64Vertical
    33,  	// 8: R600_ArrayBase
    128,  	// 9: R600_TReg32_W
    128,  	// 10: R600_TReg32_Y
    128,  	// 11: R600_TReg32_Z
    128,  	// 12: R600_Reg64
    129,  	// 13: R600_TReg32_X
    136,  	// 14: R600_Reg64_with_R600_Reg64Vertical
    140,  	// 15: R600_TReg32_W_with_R600_Reg64Vertical
    140,  	// 16: R600_TReg32_Y_with_R600_Reg64Vertical
    140,  	// 17: R600_TReg32_Z_with_R600_Reg64Vertical
    141,  	// 18: R600_TReg32_X_with_R600_Reg64Vertical
    192,  	// 19: R600_TReg32_Y_with_R600_Reg64
    193,  	// 20: R600_TReg32_X_with_R600_Reg64
    513,  	// 21: R600_TReg32
    942,  	// 22: R600_Reg32
  };
  return PressureLimitTable[Idx];
}

/// Table of pressure sets per register class or unit.
static const int RCSetsTable[] = {
  /* 0 */ 1, -1,
  /* 2 */ 2, -1,
  /* 4 */ 0, 22, -1,
  /* 7 */ 8, 22, -1,
  /* 10 */ 9, 15, 21, 22, -1,
  /* 15 */ 11, 17, 21, 22, -1,
  /* 20 */ 7, 14, 15, 16, 17, 18, 21, 22, -1,
  /* 29 */ 3, 7, 9, 14, 15, 16, 17, 18, 21, 22, -1,
  /* 40 */ 6, 7, 11, 14, 15, 16, 17, 18, 21, 22, -1,
  /* 51 */ 10, 16, 19, 21, 22, -1,
  /* 57 */ 13, 18, 20, 21, 22, -1,
  /* 63 */ 12, 14, 19, 20, 21, 22, -1,
  /* 70 */ 10, 12, 14, 16, 19, 20, 21, 22, -1,
  /* 79 */ 12, 13, 14, 18, 19, 20, 21, 22, -1,
  /* 88 */ 5, 7, 10, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, -1,
  /* 102 */ 4, 7, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, -1,
};

/// Get the dimensions of register pressure impacted by this register class.
/// Returns a -1 terminated array of pressure set IDs
const int *R600GenRegisterInfo::
getRegClassPressureSets(const TargetRegisterClass *RC) const {
  static const uint8_t RCSetStartTable[] = {
    5,12,57,1,1,1,10,51,15,7,1,1,1,1,1,1,1,1,1,2,1,1,1,4,0,63,20,29,102,88,40,12,20,29,102,88,40,};
  return &RCSetsTable[RCSetStartTable[RC->getID()]];
}

/// Get the dimensions of register pressure impacted by this register unit.
/// Returns a -1 terminated array of pressure set IDs
const int *R600GenRegisterInfo::
getRegUnitPressureSets(MCRegUnit RegUnit) const {
  assert(static_cast<unsigned>(RegUnit) < 1342 && "invalid register unit");
  static const uint8_t RUSetStartTable[] = {
    5,1,5,1,1,5,57,5,5,1,1,5,5,5,5,1,4,1,1,0,2,2,2,1,1,5,1,1,5,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,29,29,29,29,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,102,102,102,102,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,88,88,88,88,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,40,40,40,40,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,};
  return &RCSetsTable[RUSetStartTable[static_cast<unsigned>(RegUnit)]];
}

extern const MCRegisterDesc R600RegDesc[];
extern const int16_t R600RegDiffLists[];
extern const LaneBitmask R600LaneMaskLists[];
extern const char R600RegStrings[];
extern const char R600RegClassStrings[];
extern const MCPhysReg R600RegUnitRoots[][2];
extern const uint16_t R600SubRegIdxLists[];
extern const uint16_t R600RegEncodingTable[];
R600GenRegisterInfo::
R600GenRegisterInfo(unsigned RA, unsigned DwarfFlavour, unsigned EHFlavour,
      unsigned PC, unsigned HwMode)
  : TargetRegisterInfo(&R600RegInfoDesc, RegisterClasses, RegisterClasses+37,
             SubRegIndexNameTable, SubRegIdxRangeTable, SubRegIndexLaneMaskTable,
             LaneBitmask(0xFFFFFFFFFFFFFFF0), RegClassInfos, VTLists, HwMode) {
  InitMCRegisterInfo(R600RegDesc, 1675, RA, PC,
                     R600MCRegisterClasses, 37,
                     R600RegUnitRoots,
                     1342,
                     R600RegDiffLists,
                     R600LaneMaskLists,
                     R600RegStrings,
                     R600RegClassStrings,
                     R600SubRegIdxLists,
                     17,
                     R600RegEncodingTable);

}



ArrayRef<const uint32_t *> R600GenRegisterInfo::getRegMasks() const {
  return {};
}

bool R600GenRegisterInfo::
isGeneralPurposeRegister(const MachineFunction &MF, MCRegister PhysReg) const {
  return
      false;
}

bool R600GenRegisterInfo::
isGeneralPurposeRegisterClass(const TargetRegisterClass *RC) const {
  return
      false;
}

bool R600GenRegisterInfo::
isFixedRegister(const MachineFunction &MF, MCRegister PhysReg) const {
  return
      false;
}

bool R600GenRegisterInfo::
isArgumentRegister(const MachineFunction &MF, MCRegister PhysReg) const {
  return
      false;
}

bool R600GenRegisterInfo::
isConstantPhysReg(MCRegister PhysReg) const {
  return
      false;
}

ArrayRef<const char *> R600GenRegisterInfo::getRegMaskNames() const {
  return {};
}

const R600FrameLowering *
R600GenRegisterInfo::getFrameLowering(const MachineFunction &MF) {
  return static_cast<const R600FrameLowering *>(
      MF.getSubtarget().getFrameLowering());
}

} // end namespace llvm

