blob: eb0ee48d74d73cd019df7524355506726f749f5e [file] [log] [blame]
/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
|* *|
|* Target Register Enum Values *|
|* *|
|* Automatically generated file, do not edit! *|
|* *|
\*===----------------------------------------------------------------------===*/
#ifdef GET_REGINFO_ENUM
#undef GET_REGINFO_ENUM
namespace llvm {
class MCRegisterClass;
extern const MCRegisterClass LoongArchMCRegisterClasses[];
namespace LoongArch {
enum {
NoRegister,
F0 = 1,
F1 = 2,
F2 = 3,
F3 = 4,
F4 = 5,
F5 = 6,
F6 = 7,
F7 = 8,
F8 = 9,
F9 = 10,
F10 = 11,
F11 = 12,
F12 = 13,
F13 = 14,
F14 = 15,
F15 = 16,
F16 = 17,
F17 = 18,
F18 = 19,
F19 = 20,
F20 = 21,
F21 = 22,
F22 = 23,
F23 = 24,
F24 = 25,
F25 = 26,
F26 = 27,
F27 = 28,
F28 = 29,
F29 = 30,
F30 = 31,
F31 = 32,
FCC0 = 33,
FCC1 = 34,
FCC2 = 35,
FCC3 = 36,
FCC4 = 37,
FCC5 = 38,
FCC6 = 39,
FCC7 = 40,
FCSR0 = 41,
FCSR1 = 42,
FCSR2 = 43,
FCSR3 = 44,
R0 = 45,
R1 = 46,
R2 = 47,
R3 = 48,
R4 = 49,
R5 = 50,
R6 = 51,
R7 = 52,
R8 = 53,
R9 = 54,
R10 = 55,
R11 = 56,
R12 = 57,
R13 = 58,
R14 = 59,
R15 = 60,
R16 = 61,
R17 = 62,
R18 = 63,
R19 = 64,
R20 = 65,
R21 = 66,
R22 = 67,
R23 = 68,
R24 = 69,
R25 = 70,
R26 = 71,
R27 = 72,
R28 = 73,
R29 = 74,
R30 = 75,
R31 = 76,
F0_64 = 77,
F1_64 = 78,
F2_64 = 79,
F3_64 = 80,
F4_64 = 81,
F5_64 = 82,
F6_64 = 83,
F7_64 = 84,
F8_64 = 85,
F9_64 = 86,
F10_64 = 87,
F11_64 = 88,
F12_64 = 89,
F13_64 = 90,
F14_64 = 91,
F15_64 = 92,
F16_64 = 93,
F17_64 = 94,
F18_64 = 95,
F19_64 = 96,
F20_64 = 97,
F21_64 = 98,
F22_64 = 99,
F23_64 = 100,
F24_64 = 101,
F25_64 = 102,
F26_64 = 103,
F27_64 = 104,
F28_64 = 105,
F29_64 = 106,
F30_64 = 107,
F31_64 = 108,
NUM_TARGET_REGS // 109
};
} // end namespace LoongArch
// Register classes
namespace LoongArch {
enum {
FPR32RegClassID = 0,
GPRRegClassID = 1,
GPRTRegClassID = 2,
CFRRegClassID = 3,
FCSRRegClassID = 4,
FPR64RegClassID = 5,
};
} // end namespace LoongArch
// Register alternate name indices
namespace LoongArch {
enum {
NoRegAltName, // 0
RegAliasName, // 1
NUM_TARGET_REG_ALT_NAMES = 2
};
} // end namespace LoongArch
// Subregister indices
namespace LoongArch {
enum : uint16_t {
NoSubRegister,
sub_32, // 1
NUM_TARGET_SUBREGS
};
} // end namespace LoongArch
// Register pressure sets enum.
namespace LoongArch {
enum RegisterPressureSets {
CFR = 0,
GPRT = 1,
FPR32 = 2,
GPR = 3,
};
} // end namespace LoongArch
} // end namespace llvm
#endif // GET_REGINFO_ENUM
/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
|* *|
|* MC Register Information *|
|* *|
|* Automatically generated file, do not edit! *|
|* *|
\*===----------------------------------------------------------------------===*/
#ifdef GET_REGINFO_MC_DESC
#undef GET_REGINFO_MC_DESC
namespace llvm {
extern const MCPhysReg LoongArchRegDiffLists[] = {
/* 0 */ 76, 0,
/* 2 */ 65459, 0,
/* 4 */ 65460, 0,
/* 6 */ 65535, 0,
};
extern const LaneBitmask LoongArchLaneMaskLists[] = {
/* 0 */ LaneBitmask(0x0000000000000000), LaneBitmask::getAll(),
/* 2 */ LaneBitmask(0x0000000000000001), LaneBitmask::getAll(),
};
extern const uint16_t LoongArchSubRegIdxLists[] = {
/* 0 */ 1, 0,
};
extern const MCRegisterInfo::SubRegCoveredBits LoongArchSubRegIdxRanges[] = {
{ 65535, 65535 },
{ 0, 32 }, // sub_32
};
#ifdef __GNUC__
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Woverlength-strings"
#endif
extern const char LoongArchRegStrings[] = {
/* 0 */ "F10\0"
/* 4 */ "R10\0"
/* 8 */ "F20\0"
/* 12 */ "R20\0"
/* 16 */ "F30\0"
/* 20 */ "R30\0"
/* 24 */ "FCC0\0"
/* 29 */ "F0\0"
/* 32 */ "FCSR0\0"
/* 38 */ "F11\0"
/* 42 */ "R11\0"
/* 46 */ "F21\0"
/* 50 */ "R21\0"
/* 54 */ "F31\0"
/* 58 */ "R31\0"
/* 62 */ "FCC1\0"
/* 67 */ "F1\0"
/* 70 */ "FCSR1\0"
/* 76 */ "F12\0"
/* 80 */ "R12\0"
/* 84 */ "F22\0"
/* 88 */ "R22\0"
/* 92 */ "FCC2\0"
/* 97 */ "F2\0"
/* 100 */ "FCSR2\0"
/* 106 */ "F13\0"
/* 110 */ "R13\0"
/* 114 */ "F23\0"
/* 118 */ "R23\0"
/* 122 */ "FCC3\0"
/* 127 */ "F3\0"
/* 130 */ "FCSR3\0"
/* 136 */ "F14\0"
/* 140 */ "R14\0"
/* 144 */ "F24\0"
/* 148 */ "R24\0"
/* 152 */ "F10_64\0"
/* 159 */ "F20_64\0"
/* 166 */ "F30_64\0"
/* 173 */ "F0_64\0"
/* 179 */ "F11_64\0"
/* 186 */ "F21_64\0"
/* 193 */ "F31_64\0"
/* 200 */ "F1_64\0"
/* 206 */ "F12_64\0"
/* 213 */ "F22_64\0"
/* 220 */ "F2_64\0"
/* 226 */ "F13_64\0"
/* 233 */ "F23_64\0"
/* 240 */ "F3_64\0"
/* 246 */ "F14_64\0"
/* 253 */ "F24_64\0"
/* 260 */ "F4_64\0"
/* 266 */ "F15_64\0"
/* 273 */ "F25_64\0"
/* 280 */ "F5_64\0"
/* 286 */ "F16_64\0"
/* 293 */ "F26_64\0"
/* 300 */ "F6_64\0"
/* 306 */ "F17_64\0"
/* 313 */ "F27_64\0"
/* 320 */ "F7_64\0"
/* 326 */ "F18_64\0"
/* 333 */ "F28_64\0"
/* 340 */ "F8_64\0"
/* 346 */ "F19_64\0"
/* 353 */ "F29_64\0"
/* 360 */ "F9_64\0"
/* 366 */ "FCC4\0"
/* 371 */ "F4\0"
/* 374 */ "R4\0"
/* 377 */ "F15\0"
/* 381 */ "R15\0"
/* 385 */ "F25\0"
/* 389 */ "R25\0"
/* 393 */ "FCC5\0"
/* 398 */ "F5\0"
/* 401 */ "R5\0"
/* 404 */ "F16\0"
/* 408 */ "R16\0"
/* 412 */ "F26\0"
/* 416 */ "R26\0"
/* 420 */ "FCC6\0"
/* 425 */ "F6\0"
/* 428 */ "R6\0"
/* 431 */ "F17\0"
/* 435 */ "R17\0"
/* 439 */ "F27\0"
/* 443 */ "R27\0"
/* 447 */ "FCC7\0"
/* 452 */ "F7\0"
/* 455 */ "R7\0"
/* 458 */ "F18\0"
/* 462 */ "R18\0"
/* 466 */ "F28\0"
/* 470 */ "R28\0"
/* 474 */ "F8\0"
/* 477 */ "R8\0"
/* 480 */ "F19\0"
/* 484 */ "R19\0"
/* 488 */ "F29\0"
/* 492 */ "R29\0"
/* 496 */ "F9\0"
/* 499 */ "R9\0"
};
#ifdef __GNUC__
#pragma GCC diagnostic pop
#endif
extern const MCRegisterDesc LoongArchRegDesc[] = { // Descriptors
{ 3, 0, 0, 0, 0, 0 },
{ 29, 1, 0, 1, 97, 0 },
{ 67, 1, 0, 1, 97, 0 },
{ 97, 1, 0, 1, 97, 0 },
{ 127, 1, 0, 1, 97, 0 },
{ 371, 1, 0, 1, 97, 0 },
{ 398, 1, 0, 1, 97, 0 },
{ 425, 1, 0, 1, 97, 0 },
{ 452, 1, 0, 1, 97, 0 },
{ 474, 1, 0, 1, 97, 0 },
{ 496, 1, 0, 1, 97, 0 },
{ 0, 1, 0, 1, 97, 0 },
{ 38, 1, 0, 1, 97, 0 },
{ 76, 1, 0, 1, 97, 0 },
{ 106, 1, 0, 1, 97, 0 },
{ 136, 1, 0, 1, 97, 0 },
{ 377, 1, 0, 1, 97, 0 },
{ 404, 1, 0, 1, 97, 0 },
{ 431, 1, 0, 1, 97, 0 },
{ 458, 1, 0, 1, 97, 0 },
{ 480, 1, 0, 1, 97, 0 },
{ 8, 1, 0, 1, 97, 0 },
{ 46, 1, 0, 1, 97, 0 },
{ 84, 1, 0, 1, 97, 0 },
{ 114, 1, 0, 1, 97, 0 },
{ 144, 1, 0, 1, 97, 0 },
{ 385, 1, 0, 1, 97, 0 },
{ 412, 1, 0, 1, 97, 0 },
{ 439, 1, 0, 1, 97, 0 },
{ 466, 1, 0, 1, 97, 0 },
{ 488, 1, 0, 1, 97, 0 },
{ 16, 1, 0, 1, 97, 0 },
{ 54, 1, 0, 1, 97, 0 },
{ 24, 1, 1, 1, 97, 0 },
{ 62, 1, 1, 1, 97, 0 },
{ 92, 1, 1, 1, 97, 0 },
{ 122, 1, 1, 1, 97, 0 },
{ 366, 1, 1, 1, 97, 0 },
{ 393, 1, 1, 1, 97, 0 },
{ 420, 1, 1, 1, 97, 0 },
{ 447, 1, 1, 1, 97, 0 },
{ 32, 1, 1, 1, 97, 0 },
{ 70, 1, 1, 1, 97, 0 },
{ 100, 1, 1, 1, 97, 0 },
{ 130, 1, 1, 1, 97, 0 },
{ 35, 1, 1, 1, 97, 0 },
{ 73, 1, 1, 1, 97, 0 },
{ 103, 1, 1, 1, 97, 0 },
{ 133, 1, 1, 1, 97, 0 },
{ 374, 1, 1, 1, 97, 0 },
{ 401, 1, 1, 1, 97, 0 },
{ 428, 1, 1, 1, 97, 0 },
{ 455, 1, 1, 1, 97, 0 },
{ 477, 1, 1, 1, 97, 0 },
{ 499, 1, 1, 1, 97, 0 },
{ 4, 1, 1, 1, 97, 0 },
{ 42, 1, 1, 1, 97, 0 },
{ 80, 1, 1, 1, 97, 0 },
{ 110, 1, 1, 1, 97, 0 },
{ 140, 1, 1, 1, 97, 0 },
{ 381, 1, 1, 1, 97, 0 },
{ 408, 1, 1, 1, 97, 0 },
{ 435, 1, 1, 1, 97, 0 },
{ 462, 1, 1, 1, 97, 0 },
{ 484, 1, 1, 1, 97, 0 },
{ 12, 1, 1, 1, 97, 0 },
{ 50, 1, 1, 1, 97, 0 },
{ 88, 1, 1, 1, 97, 0 },
{ 118, 1, 1, 1, 97, 0 },
{ 148, 1, 1, 1, 97, 0 },
{ 389, 1, 1, 1, 97, 0 },
{ 416, 1, 1, 1, 97, 0 },
{ 443, 1, 1, 1, 97, 0 },
{ 470, 1, 1, 1, 97, 0 },
{ 492, 1, 1, 1, 97, 0 },
{ 20, 1, 1, 1, 97, 0 },
{ 58, 1, 1, 1, 97, 0 },
{ 173, 4, 1, 0, 33, 2 },
{ 200, 4, 1, 0, 33, 2 },
{ 220, 4, 1, 0, 33, 2 },
{ 240, 4, 1, 0, 33, 2 },
{ 260, 4, 1, 0, 33, 2 },
{ 280, 4, 1, 0, 33, 2 },
{ 300, 4, 1, 0, 33, 2 },
{ 320, 4, 1, 0, 33, 2 },
{ 340, 4, 1, 0, 33, 2 },
{ 360, 4, 1, 0, 33, 2 },
{ 152, 4, 1, 0, 33, 2 },
{ 179, 4, 1, 0, 33, 2 },
{ 206, 4, 1, 0, 33, 2 },
{ 226, 4, 1, 0, 33, 2 },
{ 246, 4, 1, 0, 33, 2 },
{ 266, 4, 1, 0, 33, 2 },
{ 286, 4, 1, 0, 33, 2 },
{ 306, 4, 1, 0, 33, 2 },
{ 326, 4, 1, 0, 33, 2 },
{ 346, 4, 1, 0, 33, 2 },
{ 159, 4, 1, 0, 33, 2 },
{ 186, 4, 1, 0, 33, 2 },
{ 213, 4, 1, 0, 33, 2 },
{ 233, 4, 1, 0, 33, 2 },
{ 253, 4, 1, 0, 33, 2 },
{ 273, 4, 1, 0, 33, 2 },
{ 293, 4, 1, 0, 33, 2 },
{ 313, 4, 1, 0, 33, 2 },
{ 333, 4, 1, 0, 33, 2 },
{ 353, 4, 1, 0, 33, 2 },
{ 166, 4, 1, 0, 33, 2 },
{ 193, 4, 1, 0, 33, 2 },
};
extern const MCPhysReg LoongArchRegUnitRoots[][2] = {
{ LoongArch::F0 },
{ LoongArch::F1 },
{ LoongArch::F2 },
{ LoongArch::F3 },
{ LoongArch::F4 },
{ LoongArch::F5 },
{ LoongArch::F6 },
{ LoongArch::F7 },
{ LoongArch::F8 },
{ LoongArch::F9 },
{ LoongArch::F10 },
{ LoongArch::F11 },
{ LoongArch::F12 },
{ LoongArch::F13 },
{ LoongArch::F14 },
{ LoongArch::F15 },
{ LoongArch::F16 },
{ LoongArch::F17 },
{ LoongArch::F18 },
{ LoongArch::F19 },
{ LoongArch::F20 },
{ LoongArch::F21 },
{ LoongArch::F22 },
{ LoongArch::F23 },
{ LoongArch::F24 },
{ LoongArch::F25 },
{ LoongArch::F26 },
{ LoongArch::F27 },
{ LoongArch::F28 },
{ LoongArch::F29 },
{ LoongArch::F30 },
{ LoongArch::F31 },
{ LoongArch::FCC0 },
{ LoongArch::FCC1 },
{ LoongArch::FCC2 },
{ LoongArch::FCC3 },
{ LoongArch::FCC4 },
{ LoongArch::FCC5 },
{ LoongArch::FCC6 },
{ LoongArch::FCC7 },
{ LoongArch::FCSR0 },
{ LoongArch::FCSR1 },
{ LoongArch::FCSR2 },
{ LoongArch::FCSR3 },
{ LoongArch::R0 },
{ LoongArch::R1 },
{ LoongArch::R2 },
{ LoongArch::R3 },
{ LoongArch::R4 },
{ LoongArch::R5 },
{ LoongArch::R6 },
{ LoongArch::R7 },
{ LoongArch::R8 },
{ LoongArch::R9 },
{ LoongArch::R10 },
{ LoongArch::R11 },
{ LoongArch::R12 },
{ LoongArch::R13 },
{ LoongArch::R14 },
{ LoongArch::R15 },
{ LoongArch::R16 },
{ LoongArch::R17 },
{ LoongArch::R18 },
{ LoongArch::R19 },
{ LoongArch::R20 },
{ LoongArch::R21 },
{ LoongArch::R22 },
{ LoongArch::R23 },
{ LoongArch::R24 },
{ LoongArch::R25 },
{ LoongArch::R26 },
{ LoongArch::R27 },
{ LoongArch::R28 },
{ LoongArch::R29 },
{ LoongArch::R30 },
{ LoongArch::R31 },
};
namespace { // Register classes...
// FPR32 Register Class...
const MCPhysReg FPR32[] = {
LoongArch::F0, LoongArch::F1, LoongArch::F2, LoongArch::F3, LoongArch::F4, LoongArch::F5, LoongArch::F6, LoongArch::F7, LoongArch::F8, LoongArch::F9, LoongArch::F10, LoongArch::F11, LoongArch::F12, LoongArch::F13, LoongArch::F14, LoongArch::F15, LoongArch::F16, LoongArch::F17, LoongArch::F18, LoongArch::F19, LoongArch::F20, LoongArch::F21, LoongArch::F22, LoongArch::F23, LoongArch::F24, LoongArch::F25, LoongArch::F26, LoongArch::F27, LoongArch::F28, LoongArch::F29, LoongArch::F30, LoongArch::F31,
};
// FPR32 Bit set.
const uint8_t FPR32Bits[] = {
0xfe, 0xff, 0xff, 0xff, 0x01,
};
// GPR Register Class...
const MCPhysReg GPR[] = {
LoongArch::R4, LoongArch::R5, LoongArch::R6, LoongArch::R7, LoongArch::R8, LoongArch::R9, LoongArch::R10, LoongArch::R11, LoongArch::R12, LoongArch::R13, LoongArch::R14, LoongArch::R15, LoongArch::R16, LoongArch::R17, LoongArch::R18, LoongArch::R19, LoongArch::R20, LoongArch::R22, LoongArch::R23, LoongArch::R24, LoongArch::R25, LoongArch::R26, LoongArch::R27, LoongArch::R28, LoongArch::R29, LoongArch::R30, LoongArch::R31, LoongArch::R0, LoongArch::R1, LoongArch::R2, LoongArch::R3, LoongArch::R21,
};
// GPR Bit set.
const uint8_t GPRBits[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x1f,
};
// GPRT Register Class...
const MCPhysReg GPRT[] = {
LoongArch::R4, LoongArch::R5, LoongArch::R6, LoongArch::R7, LoongArch::R8, LoongArch::R9, LoongArch::R10, LoongArch::R11, LoongArch::R12, LoongArch::R13, LoongArch::R14, LoongArch::R15, LoongArch::R16, LoongArch::R17, LoongArch::R18, LoongArch::R19, LoongArch::R20,
};
// GPRT Bit set.
const uint8_t GPRTBits[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x03,
};
// CFR Register Class...
const MCPhysReg CFR[] = {
LoongArch::FCC0, LoongArch::FCC1, LoongArch::FCC2, LoongArch::FCC3, LoongArch::FCC4, LoongArch::FCC5, LoongArch::FCC6, LoongArch::FCC7,
};
// CFR Bit set.
const uint8_t CFRBits[] = {
0x00, 0x00, 0x00, 0x00, 0xfe, 0x01,
};
// FCSR Register Class...
const MCPhysReg FCSR[] = {
LoongArch::FCSR0, LoongArch::FCSR1, LoongArch::FCSR2, LoongArch::FCSR3,
};
// FCSR Bit set.
const uint8_t FCSRBits[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x1e,
};
// FPR64 Register Class...
const MCPhysReg FPR64[] = {
LoongArch::F0_64, LoongArch::F1_64, LoongArch::F2_64, LoongArch::F3_64, LoongArch::F4_64, LoongArch::F5_64, LoongArch::F6_64, LoongArch::F7_64, LoongArch::F8_64, LoongArch::F9_64, LoongArch::F10_64, LoongArch::F11_64, LoongArch::F12_64, LoongArch::F13_64, LoongArch::F14_64, LoongArch::F15_64, LoongArch::F16_64, LoongArch::F17_64, LoongArch::F18_64, LoongArch::F19_64, LoongArch::F20_64, LoongArch::F21_64, LoongArch::F22_64, LoongArch::F23_64, LoongArch::F24_64, LoongArch::F25_64, LoongArch::F26_64, LoongArch::F27_64, LoongArch::F28_64, LoongArch::F29_64, LoongArch::F30_64, LoongArch::F31_64,
};
// FPR64 Bit set.
const uint8_t FPR64Bits[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x1f,
};
} // end anonymous namespace
#ifdef __GNUC__
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Woverlength-strings"
#endif
extern const char LoongArchRegClassStrings[] = {
/* 0 */ "FPR32\0"
/* 6 */ "FPR64\0"
/* 12 */ "CFR\0"
/* 16 */ "GPR\0"
/* 20 */ "FCSR\0"
/* 25 */ "GPRT\0"
};
#ifdef __GNUC__
#pragma GCC diagnostic pop
#endif
extern const MCRegisterClass LoongArchMCRegisterClasses[] = {
{ FPR32, FPR32Bits, 0, 32, sizeof(FPR32Bits), LoongArch::FPR32RegClassID, 32, 1, true },
{ GPR, GPRBits, 16, 32, sizeof(GPRBits), LoongArch::GPRRegClassID, 0, 1, true },
{ GPRT, GPRTBits, 25, 17, sizeof(GPRTBits), LoongArch::GPRTRegClassID, 0, 1, true },
{ CFR, CFRBits, 12, 8, sizeof(CFRBits), LoongArch::CFRRegClassID, 0, 1, true },
{ FCSR, FCSRBits, 20, 4, sizeof(FCSRBits), LoongArch::FCSRRegClassID, 32, 1, false },
{ FPR64, FPR64Bits, 6, 32, sizeof(FPR64Bits), LoongArch::FPR64RegClassID, 64, 1, true },
};
// LoongArch Dwarf<->LLVM register mappings.
extern const MCRegisterInfo::DwarfLLVMRegPair LoongArchDwarfFlavour0Dwarf2L[] = {
{ 0U, LoongArch::R0 },
{ 1U, LoongArch::R1 },
{ 2U, LoongArch::R2 },
{ 3U, LoongArch::R3 },
{ 4U, LoongArch::R4 },
{ 5U, LoongArch::R5 },
{ 6U, LoongArch::R6 },
{ 7U, LoongArch::R7 },
{ 8U, LoongArch::R8 },
{ 9U, LoongArch::R9 },
{ 10U, LoongArch::R10 },
{ 11U, LoongArch::R11 },
{ 12U, LoongArch::R12 },
{ 13U, LoongArch::R13 },
{ 14U, LoongArch::R14 },
{ 15U, LoongArch::R15 },
{ 16U, LoongArch::R16 },
{ 17U, LoongArch::R17 },
{ 18U, LoongArch::R18 },
{ 19U, LoongArch::R19 },
{ 20U, LoongArch::R20 },
{ 21U, LoongArch::R21 },
{ 22U, LoongArch::R22 },
{ 23U, LoongArch::R23 },
{ 24U, LoongArch::R24 },
{ 25U, LoongArch::R25 },
{ 26U, LoongArch::R26 },
{ 27U, LoongArch::R27 },
{ 28U, LoongArch::R28 },
{ 29U, LoongArch::R29 },
{ 30U, LoongArch::R30 },
{ 31U, LoongArch::R31 },
{ 32U, LoongArch::F0_64 },
{ 33U, LoongArch::F1_64 },
{ 34U, LoongArch::F2_64 },
{ 35U, LoongArch::F3_64 },
{ 36U, LoongArch::F4_64 },
{ 37U, LoongArch::F5_64 },
{ 38U, LoongArch::F6_64 },
{ 39U, LoongArch::F7_64 },
{ 40U, LoongArch::F8_64 },
{ 41U, LoongArch::F9_64 },
{ 42U, LoongArch::F10_64 },
{ 43U, LoongArch::F11_64 },
{ 44U, LoongArch::F12_64 },
{ 45U, LoongArch::F13_64 },
{ 46U, LoongArch::F14_64 },
{ 47U, LoongArch::F15_64 },
{ 48U, LoongArch::F16_64 },
{ 49U, LoongArch::F17_64 },
{ 50U, LoongArch::F18_64 },
{ 51U, LoongArch::F19_64 },
{ 52U, LoongArch::F20_64 },
{ 53U, LoongArch::F21_64 },
{ 54U, LoongArch::F22_64 },
{ 55U, LoongArch::F23_64 },
{ 56U, LoongArch::F24_64 },
{ 57U, LoongArch::F25_64 },
{ 58U, LoongArch::F26_64 },
{ 59U, LoongArch::F27_64 },
{ 60U, LoongArch::F28_64 },
{ 61U, LoongArch::F29_64 },
{ 62U, LoongArch::F30_64 },
{ 63U, LoongArch::F31_64 },
};
extern const unsigned LoongArchDwarfFlavour0Dwarf2LSize = std::size(LoongArchDwarfFlavour0Dwarf2L);
extern const MCRegisterInfo::DwarfLLVMRegPair LoongArchEHFlavour0Dwarf2L[] = {
{ 0U, LoongArch::R0 },
{ 1U, LoongArch::R1 },
{ 2U, LoongArch::R2 },
{ 3U, LoongArch::R3 },
{ 4U, LoongArch::R4 },
{ 5U, LoongArch::R5 },
{ 6U, LoongArch::R6 },
{ 7U, LoongArch::R7 },
{ 8U, LoongArch::R8 },
{ 9U, LoongArch::R9 },
{ 10U, LoongArch::R10 },
{ 11U, LoongArch::R11 },
{ 12U, LoongArch::R12 },
{ 13U, LoongArch::R13 },
{ 14U, LoongArch::R14 },
{ 15U, LoongArch::R15 },
{ 16U, LoongArch::R16 },
{ 17U, LoongArch::R17 },
{ 18U, LoongArch::R18 },
{ 19U, LoongArch::R19 },
{ 20U, LoongArch::R20 },
{ 21U, LoongArch::R21 },
{ 22U, LoongArch::R22 },
{ 23U, LoongArch::R23 },
{ 24U, LoongArch::R24 },
{ 25U, LoongArch::R25 },
{ 26U, LoongArch::R26 },
{ 27U, LoongArch::R27 },
{ 28U, LoongArch::R28 },
{ 29U, LoongArch::R29 },
{ 30U, LoongArch::R30 },
{ 31U, LoongArch::R31 },
{ 32U, LoongArch::F0_64 },
{ 33U, LoongArch::F1_64 },
{ 34U, LoongArch::F2_64 },
{ 35U, LoongArch::F3_64 },
{ 36U, LoongArch::F4_64 },
{ 37U, LoongArch::F5_64 },
{ 38U, LoongArch::F6_64 },
{ 39U, LoongArch::F7_64 },
{ 40U, LoongArch::F8_64 },
{ 41U, LoongArch::F9_64 },
{ 42U, LoongArch::F10_64 },
{ 43U, LoongArch::F11_64 },
{ 44U, LoongArch::F12_64 },
{ 45U, LoongArch::F13_64 },
{ 46U, LoongArch::F14_64 },
{ 47U, LoongArch::F15_64 },
{ 48U, LoongArch::F16_64 },
{ 49U, LoongArch::F17_64 },
{ 50U, LoongArch::F18_64 },
{ 51U, LoongArch::F19_64 },
{ 52U, LoongArch::F20_64 },
{ 53U, LoongArch::F21_64 },
{ 54U, LoongArch::F22_64 },
{ 55U, LoongArch::F23_64 },
{ 56U, LoongArch::F24_64 },
{ 57U, LoongArch::F25_64 },
{ 58U, LoongArch::F26_64 },
{ 59U, LoongArch::F27_64 },
{ 60U, LoongArch::F28_64 },
{ 61U, LoongArch::F29_64 },
{ 62U, LoongArch::F30_64 },
{ 63U, LoongArch::F31_64 },
};
extern const unsigned LoongArchEHFlavour0Dwarf2LSize = std::size(LoongArchEHFlavour0Dwarf2L);
extern const MCRegisterInfo::DwarfLLVMRegPair LoongArchDwarfFlavour0L2Dwarf[] = {
{ LoongArch::F0, 32U },
{ LoongArch::F1, 33U },
{ LoongArch::F2, 34U },
{ LoongArch::F3, 35U },
{ LoongArch::F4, 36U },
{ LoongArch::F5, 37U },
{ LoongArch::F6, 38U },
{ LoongArch::F7, 39U },
{ LoongArch::F8, 40U },
{ LoongArch::F9, 41U },
{ LoongArch::F10, 42U },
{ LoongArch::F11, 43U },
{ LoongArch::F12, 44U },
{ LoongArch::F13, 45U },
{ LoongArch::F14, 46U },
{ LoongArch::F15, 47U },
{ LoongArch::F16, 48U },
{ LoongArch::F17, 49U },
{ LoongArch::F18, 50U },
{ LoongArch::F19, 51U },
{ LoongArch::F20, 52U },
{ LoongArch::F21, 53U },
{ LoongArch::F22, 54U },
{ LoongArch::F23, 55U },
{ LoongArch::F24, 56U },
{ LoongArch::F25, 57U },
{ LoongArch::F26, 58U },
{ LoongArch::F27, 59U },
{ LoongArch::F28, 60U },
{ LoongArch::F29, 61U },
{ LoongArch::F30, 62U },
{ LoongArch::F31, 63U },
{ LoongArch::R0, 0U },
{ LoongArch::R1, 1U },
{ LoongArch::R2, 2U },
{ LoongArch::R3, 3U },
{ LoongArch::R4, 4U },
{ LoongArch::R5, 5U },
{ LoongArch::R6, 6U },
{ LoongArch::R7, 7U },
{ LoongArch::R8, 8U },
{ LoongArch::R9, 9U },
{ LoongArch::R10, 10U },
{ LoongArch::R11, 11U },
{ LoongArch::R12, 12U },
{ LoongArch::R13, 13U },
{ LoongArch::R14, 14U },
{ LoongArch::R15, 15U },
{ LoongArch::R16, 16U },
{ LoongArch::R17, 17U },
{ LoongArch::R18, 18U },
{ LoongArch::R19, 19U },
{ LoongArch::R20, 20U },
{ LoongArch::R21, 21U },
{ LoongArch::R22, 22U },
{ LoongArch::R23, 23U },
{ LoongArch::R24, 24U },
{ LoongArch::R25, 25U },
{ LoongArch::R26, 26U },
{ LoongArch::R27, 27U },
{ LoongArch::R28, 28U },
{ LoongArch::R29, 29U },
{ LoongArch::R30, 30U },
{ LoongArch::R31, 31U },
{ LoongArch::F0_64, 32U },
{ LoongArch::F1_64, 33U },
{ LoongArch::F2_64, 34U },
{ LoongArch::F3_64, 35U },
{ LoongArch::F4_64, 36U },
{ LoongArch::F5_64, 37U },
{ LoongArch::F6_64, 38U },
{ LoongArch::F7_64, 39U },
{ LoongArch::F8_64, 40U },
{ LoongArch::F9_64, 41U },
{ LoongArch::F10_64, 42U },
{ LoongArch::F11_64, 43U },
{ LoongArch::F12_64, 44U },
{ LoongArch::F13_64, 45U },
{ LoongArch::F14_64, 46U },
{ LoongArch::F15_64, 47U },
{ LoongArch::F16_64, 48U },
{ LoongArch::F17_64, 49U },
{ LoongArch::F18_64, 50U },
{ LoongArch::F19_64, 51U },
{ LoongArch::F20_64, 52U },
{ LoongArch::F21_64, 53U },
{ LoongArch::F22_64, 54U },
{ LoongArch::F23_64, 55U },
{ LoongArch::F24_64, 56U },
{ LoongArch::F25_64, 57U },
{ LoongArch::F26_64, 58U },
{ LoongArch::F27_64, 59U },
{ LoongArch::F28_64, 60U },
{ LoongArch::F29_64, 61U },
{ LoongArch::F30_64, 62U },
{ LoongArch::F31_64, 63U },
};
extern const unsigned LoongArchDwarfFlavour0L2DwarfSize = std::size(LoongArchDwarfFlavour0L2Dwarf);
extern const MCRegisterInfo::DwarfLLVMRegPair LoongArchEHFlavour0L2Dwarf[] = {
{ LoongArch::F0, 32U },
{ LoongArch::F1, 33U },
{ LoongArch::F2, 34U },
{ LoongArch::F3, 35U },
{ LoongArch::F4, 36U },
{ LoongArch::F5, 37U },
{ LoongArch::F6, 38U },
{ LoongArch::F7, 39U },
{ LoongArch::F8, 40U },
{ LoongArch::F9, 41U },
{ LoongArch::F10, 42U },
{ LoongArch::F11, 43U },
{ LoongArch::F12, 44U },
{ LoongArch::F13, 45U },
{ LoongArch::F14, 46U },
{ LoongArch::F15, 47U },
{ LoongArch::F16, 48U },
{ LoongArch::F17, 49U },
{ LoongArch::F18, 50U },
{ LoongArch::F19, 51U },
{ LoongArch::F20, 52U },
{ LoongArch::F21, 53U },
{ LoongArch::F22, 54U },
{ LoongArch::F23, 55U },
{ LoongArch::F24, 56U },
{ LoongArch::F25, 57U },
{ LoongArch::F26, 58U },
{ LoongArch::F27, 59U },
{ LoongArch::F28, 60U },
{ LoongArch::F29, 61U },
{ LoongArch::F30, 62U },
{ LoongArch::F31, 63U },
{ LoongArch::R0, 0U },
{ LoongArch::R1, 1U },
{ LoongArch::R2, 2U },
{ LoongArch::R3, 3U },
{ LoongArch::R4, 4U },
{ LoongArch::R5, 5U },
{ LoongArch::R6, 6U },
{ LoongArch::R7, 7U },
{ LoongArch::R8, 8U },
{ LoongArch::R9, 9U },
{ LoongArch::R10, 10U },
{ LoongArch::R11, 11U },
{ LoongArch::R12, 12U },
{ LoongArch::R13, 13U },
{ LoongArch::R14, 14U },
{ LoongArch::R15, 15U },
{ LoongArch::R16, 16U },
{ LoongArch::R17, 17U },
{ LoongArch::R18, 18U },
{ LoongArch::R19, 19U },
{ LoongArch::R20, 20U },
{ LoongArch::R21, 21U },
{ LoongArch::R22, 22U },
{ LoongArch::R23, 23U },
{ LoongArch::R24, 24U },
{ LoongArch::R25, 25U },
{ LoongArch::R26, 26U },
{ LoongArch::R27, 27U },
{ LoongArch::R28, 28U },
{ LoongArch::R29, 29U },
{ LoongArch::R30, 30U },
{ LoongArch::R31, 31U },
{ LoongArch::F0_64, 32U },
{ LoongArch::F1_64, 33U },
{ LoongArch::F2_64, 34U },
{ LoongArch::F3_64, 35U },
{ LoongArch::F4_64, 36U },
{ LoongArch::F5_64, 37U },
{ LoongArch::F6_64, 38U },
{ LoongArch::F7_64, 39U },
{ LoongArch::F8_64, 40U },
{ LoongArch::F9_64, 41U },
{ LoongArch::F10_64, 42U },
{ LoongArch::F11_64, 43U },
{ LoongArch::F12_64, 44U },
{ LoongArch::F13_64, 45U },
{ LoongArch::F14_64, 46U },
{ LoongArch::F15_64, 47U },
{ LoongArch::F16_64, 48U },
{ LoongArch::F17_64, 49U },
{ LoongArch::F18_64, 50U },
{ LoongArch::F19_64, 51U },
{ LoongArch::F20_64, 52U },
{ LoongArch::F21_64, 53U },
{ LoongArch::F22_64, 54U },
{ LoongArch::F23_64, 55U },
{ LoongArch::F24_64, 56U },
{ LoongArch::F25_64, 57U },
{ LoongArch::F26_64, 58U },
{ LoongArch::F27_64, 59U },
{ LoongArch::F28_64, 60U },
{ LoongArch::F29_64, 61U },
{ LoongArch::F30_64, 62U },
{ LoongArch::F31_64, 63U },
};
extern const unsigned LoongArchEHFlavour0L2DwarfSize = std::size(LoongArchEHFlavour0L2Dwarf);
extern const uint16_t LoongArchRegEncodingTable[] = {
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
0,
1,
2,
3,
4,
5,
6,
7,
0,
1,
2,
3,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
};
static inline void InitLoongArchMCRegisterInfo(MCRegisterInfo *RI, unsigned RA, unsigned DwarfFlavour = 0, unsigned EHFlavour = 0, unsigned PC = 0) {
RI->InitMCRegisterInfo(LoongArchRegDesc, 109, RA, PC, LoongArchMCRegisterClasses, 6, LoongArchRegUnitRoots, 76, LoongArchRegDiffLists, LoongArchLaneMaskLists, LoongArchRegStrings, LoongArchRegClassStrings, LoongArchSubRegIdxLists, 2,
LoongArchSubRegIdxRanges, LoongArchRegEncodingTable);
switch (DwarfFlavour) {
default:
llvm_unreachable("Unknown DWARF flavour");
case 0:
RI->mapDwarfRegsToLLVMRegs(LoongArchDwarfFlavour0Dwarf2L, LoongArchDwarfFlavour0Dwarf2LSize, false);
break;
}
switch (EHFlavour) {
default:
llvm_unreachable("Unknown DWARF flavour");
case 0:
RI->mapDwarfRegsToLLVMRegs(LoongArchEHFlavour0Dwarf2L, LoongArchEHFlavour0Dwarf2LSize, true);
break;
}
switch (DwarfFlavour) {
default:
llvm_unreachable("Unknown DWARF flavour");
case 0:
RI->mapLLVMRegsToDwarfRegs(LoongArchDwarfFlavour0L2Dwarf, LoongArchDwarfFlavour0L2DwarfSize, false);
break;
}
switch (EHFlavour) {
default:
llvm_unreachable("Unknown DWARF flavour");
case 0:
RI->mapLLVMRegsToDwarfRegs(LoongArchEHFlavour0L2Dwarf, LoongArchEHFlavour0L2DwarfSize, true);
break;
}
}
} // end namespace llvm
#endif // GET_REGINFO_MC_DESC
/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
|* *|
|* Register Information Header Fragment *|
|* *|
|* Automatically generated file, do not edit! *|
|* *|
\*===----------------------------------------------------------------------===*/
#ifdef GET_REGINFO_HEADER
#undef GET_REGINFO_HEADER
#include "llvm/CodeGen/TargetRegisterInfo.h"
namespace llvm {
class LoongArchFrameLowering;
struct LoongArchGenRegisterInfo : public TargetRegisterInfo {
explicit LoongArchGenRegisterInfo(unsigned RA, unsigned D = 0, unsigned E = 0,
unsigned PC = 0, unsigned HwMode = 0);
unsigned composeSubRegIndicesImpl(unsigned, unsigned) const override;
LaneBitmask composeSubRegIndexLaneMaskImpl(unsigned, LaneBitmask) const override;
LaneBitmask reverseComposeSubRegIndexLaneMaskImpl(unsigned, LaneBitmask) const override;
const TargetRegisterClass *getSubClassWithSubReg(const TargetRegisterClass *, unsigned) const override;
const TargetRegisterClass *getSubRegisterClass(const TargetRegisterClass *, unsigned) const override;
const RegClassWeight &getRegClassWeight(const TargetRegisterClass *RC) const override;
unsigned getRegUnitWeight(unsigned RegUnit) const override;
unsigned getNumRegPressureSets() const override;
const char *getRegPressureSetName(unsigned Idx) const override;
unsigned getRegPressureSetLimit(const MachineFunction &MF, unsigned Idx) const override;
const int *getRegClassPressureSets(const TargetRegisterClass *RC) const override;
const int *getRegUnitPressureSets(unsigned RegUnit) const override;
ArrayRef<const char *> getRegMaskNames() const override;
ArrayRef<const uint32_t *> getRegMasks() const override;
bool isGeneralPurposeRegister(const MachineFunction &, MCRegister) const override;
bool isFixedRegister(const MachineFunction &, MCRegister) const override;
bool isArgumentRegister(const MachineFunction &, MCRegister) const override;
bool isConstantPhysReg(MCRegister PhysReg) const override final;
/// Devirtualized TargetFrameLowering.
static const LoongArchFrameLowering *getFrameLowering(
const MachineFunction &MF);
};
namespace LoongArch { // Register classes
extern const TargetRegisterClass FPR32RegClass;
extern const TargetRegisterClass GPRRegClass;
extern const TargetRegisterClass GPRTRegClass;
extern const TargetRegisterClass CFRRegClass;
extern const TargetRegisterClass FCSRRegClass;
extern const TargetRegisterClass FPR64RegClass;
} // end namespace LoongArch
} // end namespace llvm
#endif // GET_REGINFO_HEADER
/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
|* *|
|* Target Register and Register Classes Information *|
|* *|
|* Automatically generated file, do not edit! *|
|* *|
\*===----------------------------------------------------------------------===*/
#ifdef GET_REGINFO_TARGET_DESC
#undef GET_REGINFO_TARGET_DESC
namespace llvm {
extern const MCRegisterClass LoongArchMCRegisterClasses[];
static const MVT::SimpleValueType VTLists[] = {
/* 0 */ MVT::i32, MVT::Other,
/* 2 */ MVT::i64, MVT::Other,
/* 4 */ MVT::f32, MVT::Other,
/* 6 */ MVT::f64, MVT::Other,
};
static const char *SubRegIndexNameTable[] = { "sub_32", "" };
static const LaneBitmask SubRegIndexLaneMaskTable[] = {
LaneBitmask::getAll(),
LaneBitmask(0x0000000000000001), // sub_32
};
static const TargetRegisterInfo::RegClassInfo RegClassInfos[] = {
// Mode = 0 (Default)
{ 32, 32, 32, VTLists+4 }, // FPR32
{ 32, 32, 32, VTLists+0 }, // GPR
{ 32, 32, 32, VTLists+0 }, // GPRT
{ 32, 32, 32, VTLists+0 }, // CFR
{ 32, 32, 32, VTLists+0 }, // FCSR
{ 64, 64, 64, VTLists+6 }, // FPR64
// Mode = 1 (LA64)
{ 32, 32, 32, VTLists+4 }, // FPR32
{ 64, 64, 64, VTLists+2 }, // GPR
{ 64, 64, 64, VTLists+2 }, // GPRT
{ 64, 64, 64, VTLists+2 }, // CFR
{ 32, 32, 32, VTLists+0 }, // FCSR
{ 64, 64, 64, VTLists+6 }, // FPR64
};
static const TargetRegisterClass *const NullRegClasses[] = { nullptr };
static const uint32_t FPR32SubClassMask[] = {
0x00000001,
0x00000020, // sub_32
};
static const uint32_t GPRSubClassMask[] = {
0x00000006,
};
static const uint32_t GPRTSubClassMask[] = {
0x00000004,
};
static const uint32_t CFRSubClassMask[] = {
0x00000008,
};
static const uint32_t FCSRSubClassMask[] = {
0x00000010,
};
static const uint32_t FPR64SubClassMask[] = {
0x00000020,
};
static const uint16_t SuperRegIdxSeqs[] = {
/* 0 */ 1, 0,
};
static const TargetRegisterClass *const GPRTSuperclasses[] = {
&LoongArch::GPRRegClass,
nullptr
};
namespace LoongArch { // Register class instances
extern const TargetRegisterClass FPR32RegClass = {
&LoongArchMCRegisterClasses[FPR32RegClassID],
FPR32SubClassMask,
SuperRegIdxSeqs + 0,
LaneBitmask(0x0000000000000001),
0,
false,
0x00, /* TSFlags */
false, /* HasDisjunctSubRegs */
false, /* CoveredBySubRegs */
NullRegClasses,
nullptr
};
extern const TargetRegisterClass GPRRegClass = {
&LoongArchMCRegisterClasses[GPRRegClassID],
GPRSubClassMask,
SuperRegIdxSeqs + 1,
LaneBitmask(0x0000000000000001),
0,
false,
0x00, /* TSFlags */
false, /* HasDisjunctSubRegs */
false, /* CoveredBySubRegs */
NullRegClasses,
nullptr
};
extern const TargetRegisterClass GPRTRegClass = {
&LoongArchMCRegisterClasses[GPRTRegClassID],
GPRTSubClassMask,
SuperRegIdxSeqs + 1,
LaneBitmask(0x0000000000000001),
0,
false,
0x00, /* TSFlags */
false, /* HasDisjunctSubRegs */
false, /* CoveredBySubRegs */
GPRTSuperclasses,
nullptr
};
extern const TargetRegisterClass CFRRegClass = {
&LoongArchMCRegisterClasses[CFRRegClassID],
CFRSubClassMask,
SuperRegIdxSeqs + 1,
LaneBitmask(0x0000000000000001),
0,
false,
0x00, /* TSFlags */
false, /* HasDisjunctSubRegs */
false, /* CoveredBySubRegs */
NullRegClasses,
nullptr
};
extern const TargetRegisterClass FCSRRegClass = {
&LoongArchMCRegisterClasses[FCSRRegClassID],
FCSRSubClassMask,
SuperRegIdxSeqs + 1,
LaneBitmask(0x0000000000000001),
0,
false,
0x00, /* TSFlags */
false, /* HasDisjunctSubRegs */
false, /* CoveredBySubRegs */
NullRegClasses,
nullptr
};
extern const TargetRegisterClass FPR64RegClass = {
&LoongArchMCRegisterClasses[FPR64RegClassID],
FPR64SubClassMask,
SuperRegIdxSeqs + 1,
LaneBitmask(0x0000000000000001),
0,
false,
0x00, /* TSFlags */
false, /* HasDisjunctSubRegs */
false, /* CoveredBySubRegs */
NullRegClasses,
nullptr
};
} // end namespace LoongArch
namespace {
const TargetRegisterClass *const RegisterClasses[] = {
&LoongArch::FPR32RegClass,
&LoongArch::GPRRegClass,
&LoongArch::GPRTRegClass,
&LoongArch::CFRRegClass,
&LoongArch::FCSRRegClass,
&LoongArch::FPR64RegClass,
};
} // 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, };
static const bool InAllocatableClassTable[] = {
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, 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, };
static const TargetRegisterInfoDesc LoongArchRegInfoDesc = { // Extra Descriptors
CostPerUseTable, 1, InAllocatableClassTable};
unsigned LoongArchGenRegisterInfo::composeSubRegIndicesImpl(unsigned IdxA, unsigned IdxB) const {
static const uint8_t Rows[1][1] = {
{ 0, },
};
--IdxA; assert(IdxA < 1); (void) IdxA;
--IdxB; assert(IdxB < 1);
return Rows[0][IdxB];
}
struct MaskRolOp {
LaneBitmask Mask;
uint8_t RotateLeft;
};
static const MaskRolOp LaneMaskComposeSequences[] = {
{ LaneBitmask(0xFFFFFFFFFFFFFFFF), 0 }, { LaneBitmask::getNone(), 0 } // Sequence 0
};
static const uint8_t CompositeSequences[] = {
0 // to sub_32
};
LaneBitmask LoongArchGenRegisterInfo::composeSubRegIndexLaneMaskImpl(unsigned IdxA, LaneBitmask LaneMask) const {
--IdxA; assert(IdxA < 1 && "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 LoongArchGenRegisterInfo::reverseComposeSubRegIndexLaneMaskImpl(unsigned IdxA, LaneBitmask LaneMask) const {
LaneMask &= getSubRegIndexLaneMask(IdxA);
--IdxA; assert(IdxA < 1 && "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 *LoongArchGenRegisterInfo::getSubClassWithSubReg(const TargetRegisterClass *RC, unsigned Idx) const {
static const uint8_t Table[6][1] = {
{ // FPR32
0, // sub_32
},
{ // GPR
0, // sub_32
},
{ // GPRT
0, // sub_32
},
{ // CFR
0, // sub_32
},
{ // FCSR
0, // sub_32
},
{ // FPR64
6, // sub_32 -> FPR64
},
};
assert(RC && "Missing regclass");
if (!Idx) return RC;
--Idx;
assert(Idx < 1 && "Bad subreg");
unsigned TV = Table[RC->getID()][Idx];
return TV ? getRegClass(TV - 1) : nullptr;
}
const TargetRegisterClass *LoongArchGenRegisterInfo::getSubRegisterClass(const TargetRegisterClass *RC, unsigned Idx) const {
static const uint8_t Table[6][1] = {
{ // FPR32
0, // FPR32:sub_32
},
{ // GPR
0, // GPR:sub_32
},
{ // GPRT
0, // GPRT:sub_32
},
{ // CFR
0, // CFR:sub_32
},
{ // FCSR
0, // FCSR:sub_32
},
{ // FPR64
1, // FPR64:sub_32 -> FPR32
},
};
assert(RC && "Missing regclass");
if (!Idx) return RC;
--Idx;
assert(Idx < 1 && "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 &LoongArchGenRegisterInfo::
getRegClassWeight(const TargetRegisterClass *RC) const {
static const RegClassWeight RCWeightTable[] = {
{1, 32}, // FPR32
{1, 32}, // GPR
{1, 17}, // GPRT
{1, 8}, // CFR
{0, 0}, // FCSR
{1, 32}, // FPR64
};
return RCWeightTable[RC->getID()];
}
/// Get the weight in units of pressure for this register unit.
unsigned LoongArchGenRegisterInfo::
getRegUnitWeight(unsigned RegUnit) const {
assert(RegUnit < 76 && "invalid register unit");
// All register units have unit weight.
return 1;
}
// Get the number of dimensions of register pressure.
unsigned LoongArchGenRegisterInfo::getNumRegPressureSets() const {
return 4;
}
// Get the name of this register unit pressure set.
const char *LoongArchGenRegisterInfo::
getRegPressureSetName(unsigned Idx) const {
static const char *PressureNameTable[] = {
"CFR",
"GPRT",
"FPR32",
"GPR",
};
return PressureNameTable[Idx];
}
// Get the register unit pressure limit for this dimension.
// This limit must be adjusted dynamically for reserved registers.
unsigned LoongArchGenRegisterInfo::
getRegPressureSetLimit(const MachineFunction &MF, unsigned Idx) const {
static const uint8_t PressureLimitTable[] = {
8, // 0: CFR
17, // 1: GPRT
32, // 2: FPR32
32, // 3: GPR
};
return PressureLimitTable[Idx];
}
/// Table of pressure sets per register class or unit.
static const int RCSetsTable[] = {
/* 0 */ 0, -1,
/* 2 */ 2, -1,
/* 4 */ 1, 3, -1,
};
/// Get the dimensions of register pressure impacted by this register class.
/// Returns a -1 terminated array of pressure set IDs
const int *LoongArchGenRegisterInfo::
getRegClassPressureSets(const TargetRegisterClass *RC) const {
static const uint8_t RCSetStartTable[] = {
2,5,4,0,1,2,};
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 *LoongArchGenRegisterInfo::
getRegUnitPressureSets(unsigned RegUnit) const {
assert(RegUnit < 76 && "invalid register unit");
static const uint8_t RUSetStartTable[] = {
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,1,1,1,1,5,5,5,5,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,};
return &RCSetsTable[RUSetStartTable[RegUnit]];
}
extern const MCRegisterDesc LoongArchRegDesc[];
extern const MCPhysReg LoongArchRegDiffLists[];
extern const LaneBitmask LoongArchLaneMaskLists[];
extern const char LoongArchRegStrings[];
extern const char LoongArchRegClassStrings[];
extern const MCPhysReg LoongArchRegUnitRoots[][2];
extern const uint16_t LoongArchSubRegIdxLists[];
extern const MCRegisterInfo::SubRegCoveredBits LoongArchSubRegIdxRanges[];
extern const uint16_t LoongArchRegEncodingTable[];
// LoongArch Dwarf<->LLVM register mappings.
extern const MCRegisterInfo::DwarfLLVMRegPair LoongArchDwarfFlavour0Dwarf2L[];
extern const unsigned LoongArchDwarfFlavour0Dwarf2LSize;
extern const MCRegisterInfo::DwarfLLVMRegPair LoongArchEHFlavour0Dwarf2L[];
extern const unsigned LoongArchEHFlavour0Dwarf2LSize;
extern const MCRegisterInfo::DwarfLLVMRegPair LoongArchDwarfFlavour0L2Dwarf[];
extern const unsigned LoongArchDwarfFlavour0L2DwarfSize;
extern const MCRegisterInfo::DwarfLLVMRegPair LoongArchEHFlavour0L2Dwarf[];
extern const unsigned LoongArchEHFlavour0L2DwarfSize;
LoongArchGenRegisterInfo::
LoongArchGenRegisterInfo(unsigned RA, unsigned DwarfFlavour, unsigned EHFlavour,
unsigned PC, unsigned HwMode)
: TargetRegisterInfo(&LoongArchRegInfoDesc, RegisterClasses, RegisterClasses+6,
SubRegIndexNameTable, SubRegIndexLaneMaskTable,
LaneBitmask(0xFFFFFFFFFFFFFFFE), RegClassInfos, HwMode) {
InitMCRegisterInfo(LoongArchRegDesc, 109, RA, PC,
LoongArchMCRegisterClasses, 6,
LoongArchRegUnitRoots,
76,
LoongArchRegDiffLists,
LoongArchLaneMaskLists,
LoongArchRegStrings,
LoongArchRegClassStrings,
LoongArchSubRegIdxLists,
2,
LoongArchSubRegIdxRanges,
LoongArchRegEncodingTable);
switch (DwarfFlavour) {
default:
llvm_unreachable("Unknown DWARF flavour");
case 0:
mapDwarfRegsToLLVMRegs(LoongArchDwarfFlavour0Dwarf2L, LoongArchDwarfFlavour0Dwarf2LSize, false);
break;
}
switch (EHFlavour) {
default:
llvm_unreachable("Unknown DWARF flavour");
case 0:
mapDwarfRegsToLLVMRegs(LoongArchEHFlavour0Dwarf2L, LoongArchEHFlavour0Dwarf2LSize, true);
break;
}
switch (DwarfFlavour) {
default:
llvm_unreachable("Unknown DWARF flavour");
case 0:
mapLLVMRegsToDwarfRegs(LoongArchDwarfFlavour0L2Dwarf, LoongArchDwarfFlavour0L2DwarfSize, false);
break;
}
switch (EHFlavour) {
default:
llvm_unreachable("Unknown DWARF flavour");
case 0:
mapLLVMRegsToDwarfRegs(LoongArchEHFlavour0L2Dwarf, LoongArchEHFlavour0L2DwarfSize, true);
break;
}
}
static const MCPhysReg CSR_ILP32D_LP64D_SaveList[] = { LoongArch::R1, LoongArch::R22, LoongArch::R23, LoongArch::R24, LoongArch::R25, LoongArch::R26, LoongArch::R27, LoongArch::R28, LoongArch::R29, LoongArch::R30, LoongArch::R31, LoongArch::F24_64, LoongArch::F25_64, LoongArch::F26_64, LoongArch::F27_64, LoongArch::F28_64, LoongArch::F29_64, LoongArch::F30_64, LoongArch::F31_64, 0 };
static const uint32_t CSR_ILP32D_LP64D_RegMask[] = { 0xfe000000, 0x00006001, 0x00001ff8, 0x00001fe0, };
static const MCPhysReg CSR_ILP32F_LP64F_SaveList[] = { LoongArch::R1, LoongArch::R22, LoongArch::R23, LoongArch::R24, LoongArch::R25, LoongArch::R26, LoongArch::R27, LoongArch::R28, LoongArch::R29, LoongArch::R30, LoongArch::R31, LoongArch::F24, LoongArch::F25, LoongArch::F26, LoongArch::F27, LoongArch::F28, LoongArch::F29, LoongArch::F30, LoongArch::F31, 0 };
static const uint32_t CSR_ILP32F_LP64F_RegMask[] = { 0xfe000000, 0x00006001, 0x00001ff8, 0x00000000, };
static const MCPhysReg CSR_ILP32S_LP64S_SaveList[] = { LoongArch::R1, LoongArch::R22, LoongArch::R23, LoongArch::R24, LoongArch::R25, LoongArch::R26, LoongArch::R27, LoongArch::R28, LoongArch::R29, LoongArch::R30, LoongArch::R31, 0 };
static const uint32_t CSR_ILP32S_LP64S_RegMask[] = { 0x00000000, 0x00006000, 0x00001ff8, 0x00000000, };
static const MCPhysReg CSR_NoRegs_SaveList[] = { 0 };
static const uint32_t CSR_NoRegs_RegMask[] = { 0x00000000, 0x00002000, 0x00000000, 0x00000000, };
ArrayRef<const uint32_t *> LoongArchGenRegisterInfo::getRegMasks() const {
static const uint32_t *const Masks[] = {
CSR_ILP32D_LP64D_RegMask,
CSR_ILP32F_LP64F_RegMask,
CSR_ILP32S_LP64S_RegMask,
CSR_NoRegs_RegMask,
};
return ArrayRef(Masks);
}
bool LoongArchGenRegisterInfo::
isGeneralPurposeRegister(const MachineFunction &MF, MCRegister PhysReg) const {
return
false;
}
bool LoongArchGenRegisterInfo::
isFixedRegister(const MachineFunction &MF, MCRegister PhysReg) const {
return
false;
}
bool LoongArchGenRegisterInfo::
isArgumentRegister(const MachineFunction &MF, MCRegister PhysReg) const {
return
false;
}
bool LoongArchGenRegisterInfo::
isConstantPhysReg(MCRegister PhysReg) const {
return
PhysReg == LoongArch::R0 ||
false;
}
ArrayRef<const char *> LoongArchGenRegisterInfo::getRegMaskNames() const {
static const char *Names[] = {
"CSR_ILP32D_LP64D",
"CSR_ILP32F_LP64F",
"CSR_ILP32S_LP64S",
"CSR_NoRegs",
};
return ArrayRef(Names);
}
const LoongArchFrameLowering *
LoongArchGenRegisterInfo::getFrameLowering(const MachineFunction &MF) {
return static_cast<const LoongArchFrameLowering *>(
MF.getSubtarget().getFrameLowering());
}
} // end namespace llvm
#endif // GET_REGINFO_TARGET_DESC