Coverage Report

Created: 2024-01-17 10:31

/src/build/lib/Target/Lanai/LanaiGenRegisterInfo.inc
Line
Count
Source (jump to first uncovered line)
1
/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
2
|*                                                                            *|
3
|* Target Register Enum Values                                                *|
4
|*                                                                            *|
5
|* Automatically generated file, do not edit!                                 *|
6
|*                                                                            *|
7
\*===----------------------------------------------------------------------===*/
8
9
10
#ifdef GET_REGINFO_ENUM
11
#undef GET_REGINFO_ENUM
12
13
namespace llvm {
14
15
class MCRegisterClass;
16
extern const MCRegisterClass LanaiMCRegisterClasses[];
17
18
namespace Lanai {
19
enum {
20
  NoRegister,
21
  FP = 1,
22
  PC = 2,
23
  RCA = 3,
24
  RV = 4,
25
  SP = 5,
26
  SR = 6,
27
  R0 = 7,
28
  R1 = 8,
29
  R2 = 9,
30
  R3 = 10,
31
  R4 = 11,
32
  R5 = 12,
33
  R6 = 13,
34
  R7 = 14,
35
  R8 = 15,
36
  R9 = 16,
37
  R10 = 17,
38
  R11 = 18,
39
  R12 = 19,
40
  R13 = 20,
41
  R14 = 21,
42
  R15 = 22,
43
  R16 = 23,
44
  R17 = 24,
45
  R18 = 25,
46
  R19 = 26,
47
  R20 = 27,
48
  R21 = 28,
49
  R22 = 29,
50
  R23 = 30,
51
  R24 = 31,
52
  R25 = 32,
53
  R26 = 33,
54
  R27 = 34,
55
  R28 = 35,
56
  R29 = 36,
57
  R30 = 37,
58
  R31 = 38,
59
  RR1 = 39,
60
  RR2 = 40,
61
  NUM_TARGET_REGS // 41
62
};
63
} // end namespace Lanai
64
65
// Register classes
66
67
namespace Lanai {
68
enum {
69
  GPRRegClassID = 0,
70
  GPR_with_sub_32RegClassID = 1,
71
  CCRRegClassID = 2,
72
73
};
74
} // end namespace Lanai
75
76
77
// Subregister indices
78
79
namespace Lanai {
80
enum : uint16_t {
81
  NoSubRegister,
82
  sub_32, // 1
83
  NUM_TARGET_SUBREGS
84
};
85
} // end namespace Lanai
86
87
// Register pressure sets enum.
88
namespace Lanai {
89
enum RegisterPressureSets {
90
  GPR_with_sub_32 = 0,
91
  GPR = 1,
92
};
93
} // end namespace Lanai
94
95
} // end namespace llvm
96
97
#endif // GET_REGINFO_ENUM
98
99
/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
100
|*                                                                            *|
101
|* MC Register Information                                                    *|
102
|*                                                                            *|
103
|* Automatically generated file, do not edit!                                 *|
104
|*                                                                            *|
105
\*===----------------------------------------------------------------------===*/
106
107
108
#ifdef GET_REGINFO_MC_DESC
109
#undef GET_REGINFO_MC_DESC
110
111
namespace llvm {
112
113
extern const int16_t LanaiRegDiffLists[] = {
114
  /* 0 */ -22, 0,
115
  /* 2 */ -19, 0,
116
  /* 4 */ -11, 0,
117
  /* 6 */ -7, 0,
118
  /* 8 */ -6, 0,
119
  /* 10 */ 6, 0,
120
  /* 12 */ 7, 0,
121
  /* 14 */ 11, 0,
122
  /* 16 */ 19, 0,
123
  /* 18 */ 22, 0,
124
};
125
126
extern const LaneBitmask LanaiLaneMaskLists[] = {
127
  /* 0 */ LaneBitmask(0x0000000000000001), LaneBitmask::getAll(),
128
  /* 2 */ LaneBitmask(0xFFFFFFFFFFFFFFFF), LaneBitmask::getAll(),
129
};
130
131
extern const uint16_t LanaiSubRegIdxLists[] = {
132
  /* 0 */ 1, 0,
133
};
134
135
extern const MCRegisterInfo::SubRegCoveredBits LanaiSubRegIdxRanges[] = {
136
  { 65535, 65535 },
137
  { 0, 32 },  // sub_32
138
};
139
140
141
#ifdef __GNUC__
142
#pragma GCC diagnostic push
143
#pragma GCC diagnostic ignored "-Woverlength-strings"
144
#endif
145
extern const char LanaiRegStrings[] = {
146
  /* 0 */ "R10\0"
147
  /* 4 */ "R20\0"
148
  /* 8 */ "R30\0"
149
  /* 12 */ "R0\0"
150
  /* 15 */ "R11\0"
151
  /* 19 */ "R21\0"
152
  /* 23 */ "R31\0"
153
  /* 27 */ "RR1\0"
154
  /* 31 */ "R12\0"
155
  /* 35 */ "R22\0"
156
  /* 39 */ "RR2\0"
157
  /* 43 */ "R13\0"
158
  /* 47 */ "R23\0"
159
  /* 51 */ "R3\0"
160
  /* 54 */ "R14\0"
161
  /* 58 */ "R24\0"
162
  /* 62 */ "R4\0"
163
  /* 65 */ "R15\0"
164
  /* 69 */ "R25\0"
165
  /* 73 */ "R5\0"
166
  /* 76 */ "R16\0"
167
  /* 80 */ "R26\0"
168
  /* 84 */ "R6\0"
169
  /* 87 */ "R17\0"
170
  /* 91 */ "R27\0"
171
  /* 95 */ "R7\0"
172
  /* 98 */ "R18\0"
173
  /* 102 */ "R28\0"
174
  /* 106 */ "R8\0"
175
  /* 109 */ "R19\0"
176
  /* 113 */ "R29\0"
177
  /* 117 */ "R9\0"
178
  /* 120 */ "RCA\0"
179
  /* 124 */ "PC\0"
180
  /* 127 */ "FP\0"
181
  /* 130 */ "SP\0"
182
  /* 133 */ "SR\0"
183
  /* 136 */ "RV\0"
184
};
185
#ifdef __GNUC__
186
#pragma GCC diagnostic pop
187
#endif
188
189
extern const MCRegisterDesc LanaiRegDesc[] = { // Descriptors
190
  { 3, 0, 0, 0, 0, 0 },
191
  { 127, 14, 1, 0, 4096, 0 },
192
  { 124, 12, 1, 0, 4097, 0 },
193
  { 120, 16, 1, 0, 4098, 0 },
194
  { 136, 14, 1, 0, 4099, 0 },
195
  { 130, 10, 1, 0, 4100, 0 },
196
  { 133, 1, 1, 1, 4101, 2 },
197
  { 12, 1, 1, 1, 4102, 2 },
198
  { 28, 1, 1, 1, 4103, 2 },
199
  { 40, 1, 6, 1, 4097, 2 },
200
  { 51, 1, 1, 1, 4104, 2 },
201
  { 62, 1, 8, 1, 4100, 2 },
202
  { 73, 1, 4, 1, 4096, 2 },
203
  { 84, 1, 1, 1, 4105, 2 },
204
  { 95, 1, 1, 1, 4106, 2 },
205
  { 106, 1, 4, 1, 4099, 2 },
206
  { 117, 1, 1, 1, 4107, 2 },
207
  { 0, 1, 18, 1, 4108, 2 },
208
  { 15, 1, 18, 1, 4109, 2 },
209
  { 31, 1, 1, 1, 4110, 2 },
210
  { 43, 1, 1, 1, 4111, 2 },
211
  { 54, 1, 1, 1, 4112, 2 },
212
  { 65, 1, 2, 1, 4098, 2 },
213
  { 76, 1, 1, 1, 4113, 2 },
214
  { 87, 1, 1, 1, 4114, 2 },
215
  { 98, 1, 1, 1, 4115, 2 },
216
  { 109, 1, 1, 1, 4116, 2 },
217
  { 4, 1, 1, 1, 4117, 2 },
218
  { 19, 1, 1, 1, 4118, 2 },
219
  { 35, 1, 1, 1, 4119, 2 },
220
  { 47, 1, 1, 1, 4120, 2 },
221
  { 58, 1, 1, 1, 4121, 2 },
222
  { 69, 1, 1, 1, 4122, 2 },
223
  { 80, 1, 1, 1, 4123, 2 },
224
  { 91, 1, 1, 1, 4124, 2 },
225
  { 102, 1, 1, 1, 4125, 2 },
226
  { 113, 1, 1, 1, 4126, 2 },
227
  { 8, 1, 1, 1, 4127, 2 },
228
  { 23, 1, 1, 1, 4128, 2 },
229
  { 27, 0, 1, 0, 4108, 0 },
230
  { 39, 0, 1, 0, 4109, 0 },
231
};
232
233
extern const MCPhysReg LanaiRegUnitRoots[][2] = {
234
  { Lanai::R5 },
235
  { Lanai::R2 },
236
  { Lanai::R15 },
237
  { Lanai::R8 },
238
  { Lanai::R4 },
239
  { Lanai::SR },
240
  { Lanai::R0 },
241
  { Lanai::R1 },
242
  { Lanai::R3 },
243
  { Lanai::R6 },
244
  { Lanai::R7 },
245
  { Lanai::R9 },
246
  { Lanai::R10 },
247
  { Lanai::R11 },
248
  { Lanai::R12 },
249
  { Lanai::R13 },
250
  { Lanai::R14 },
251
  { Lanai::R16 },
252
  { Lanai::R17 },
253
  { Lanai::R18 },
254
  { Lanai::R19 },
255
  { Lanai::R20 },
256
  { Lanai::R21 },
257
  { Lanai::R22 },
258
  { Lanai::R23 },
259
  { Lanai::R24 },
260
  { Lanai::R25 },
261
  { Lanai::R26 },
262
  { Lanai::R27 },
263
  { Lanai::R28 },
264
  { Lanai::R29 },
265
  { Lanai::R30 },
266
  { Lanai::R31 },
267
};
268
269
namespace {     // Register classes...
270
  // GPR Register Class...
271
  const MCPhysReg GPR[] = {
272
    Lanai::R3, Lanai::R9, Lanai::R12, Lanai::R13, Lanai::R14, Lanai::R16, Lanai::R17, Lanai::R20, Lanai::R21, Lanai::R22, Lanai::R23, Lanai::R24, Lanai::R25, Lanai::R26, Lanai::R27, Lanai::R28, Lanai::R29, Lanai::R30, Lanai::R31, Lanai::R6, Lanai::R7, Lanai::R18, Lanai::R19, Lanai::R15, Lanai::RCA, Lanai::R10, Lanai::RR1, Lanai::R11, Lanai::RR2, Lanai::R8, Lanai::RV, Lanai::R5, Lanai::FP, Lanai::R4, Lanai::SP, Lanai::R2, Lanai::PC, Lanai::R1, Lanai::R0, 
273
  };
274
275
  // GPR Bit set.
276
  const uint8_t GPRBits[] = {
277
    0xbe, 0xff, 0xff, 0xff, 0xff, 0x01, 
278
  };
279
280
  // GPR_with_sub_32 Register Class...
281
  const MCPhysReg GPR_with_sub_32[] = {
282
    Lanai::RCA, Lanai::RR1, Lanai::RR2, Lanai::RV, Lanai::FP, Lanai::SP, Lanai::PC, 
283
  };
284
285
  // GPR_with_sub_32 Bit set.
286
  const uint8_t GPR_with_sub_32Bits[] = {
287
    0x3e, 0x00, 0x00, 0x00, 0x80, 0x01, 
288
  };
289
290
  // CCR Register Class...
291
  const MCPhysReg CCR[] = {
292
    Lanai::SR, 
293
  };
294
295
  // CCR Bit set.
296
  const uint8_t CCRBits[] = {
297
    0x40, 
298
  };
299
300
} // end anonymous namespace
301
302
303
#ifdef __GNUC__
304
#pragma GCC diagnostic push
305
#pragma GCC diagnostic ignored "-Woverlength-strings"
306
#endif
307
extern const char LanaiRegClassStrings[] = {
308
  /* 0 */ "GPR_with_sub_32\0"
309
  /* 16 */ "CCR\0"
310
  /* 20 */ "GPR\0"
311
};
312
#ifdef __GNUC__
313
#pragma GCC diagnostic pop
314
#endif
315
316
extern const MCRegisterClass LanaiMCRegisterClasses[] = {
317
  { GPR, GPRBits, 20, 39, sizeof(GPRBits), Lanai::GPRRegClassID, 32, 1, true },
318
  { GPR_with_sub_32, GPR_with_sub_32Bits, 0, 7, sizeof(GPR_with_sub_32Bits), Lanai::GPR_with_sub_32RegClassID, 32, 1, true },
319
  { CCR, CCRBits, 16, 1, sizeof(CCRBits), Lanai::CCRRegClassID, 32, -1, false },
320
};
321
322
// Lanai Dwarf<->LLVM register mappings.
323
extern const MCRegisterInfo::DwarfLLVMRegPair LanaiDwarfFlavour0Dwarf2L[] = {
324
  { 0U, Lanai::R0 },
325
  { 1U, Lanai::R1 },
326
  { 2U, Lanai::R2 },
327
  { 3U, Lanai::R3 },
328
  { 4U, Lanai::R4 },
329
  { 5U, Lanai::R5 },
330
  { 6U, Lanai::R6 },
331
  { 7U, Lanai::R7 },
332
  { 8U, Lanai::R8 },
333
  { 9U, Lanai::R9 },
334
  { 10U, Lanai::R10 },
335
  { 11U, Lanai::R11 },
336
  { 12U, Lanai::R12 },
337
  { 13U, Lanai::R13 },
338
  { 14U, Lanai::R14 },
339
  { 15U, Lanai::R15 },
340
  { 16U, Lanai::R16 },
341
  { 17U, Lanai::R17 },
342
  { 18U, Lanai::R18 },
343
  { 19U, Lanai::R19 },
344
  { 20U, Lanai::R20 },
345
  { 21U, Lanai::R21 },
346
  { 22U, Lanai::R22 },
347
  { 23U, Lanai::R23 },
348
  { 24U, Lanai::R24 },
349
  { 25U, Lanai::R25 },
350
  { 26U, Lanai::R26 },
351
  { 27U, Lanai::R27 },
352
  { 28U, Lanai::R28 },
353
  { 29U, Lanai::R29 },
354
  { 30U, Lanai::R30 },
355
  { 31U, Lanai::R31 },
356
};
357
extern const unsigned LanaiDwarfFlavour0Dwarf2LSize = std::size(LanaiDwarfFlavour0Dwarf2L);
358
359
extern const MCRegisterInfo::DwarfLLVMRegPair LanaiEHFlavour0Dwarf2L[] = {
360
  { 0U, Lanai::R0 },
361
  { 1U, Lanai::R1 },
362
  { 2U, Lanai::R2 },
363
  { 3U, Lanai::R3 },
364
  { 4U, Lanai::R4 },
365
  { 5U, Lanai::R5 },
366
  { 6U, Lanai::R6 },
367
  { 7U, Lanai::R7 },
368
  { 8U, Lanai::R8 },
369
  { 9U, Lanai::R9 },
370
  { 10U, Lanai::R10 },
371
  { 11U, Lanai::R11 },
372
  { 12U, Lanai::R12 },
373
  { 13U, Lanai::R13 },
374
  { 14U, Lanai::R14 },
375
  { 15U, Lanai::R15 },
376
  { 16U, Lanai::R16 },
377
  { 17U, Lanai::R17 },
378
  { 18U, Lanai::R18 },
379
  { 19U, Lanai::R19 },
380
  { 20U, Lanai::R20 },
381
  { 21U, Lanai::R21 },
382
  { 22U, Lanai::R22 },
383
  { 23U, Lanai::R23 },
384
  { 24U, Lanai::R24 },
385
  { 25U, Lanai::R25 },
386
  { 26U, Lanai::R26 },
387
  { 27U, Lanai::R27 },
388
  { 28U, Lanai::R28 },
389
  { 29U, Lanai::R29 },
390
  { 30U, Lanai::R30 },
391
  { 31U, Lanai::R31 },
392
};
393
extern const unsigned LanaiEHFlavour0Dwarf2LSize = std::size(LanaiEHFlavour0Dwarf2L);
394
395
extern const MCRegisterInfo::DwarfLLVMRegPair LanaiDwarfFlavour0L2Dwarf[] = {
396
  { Lanai::FP, 5U },
397
  { Lanai::PC, 2U },
398
  { Lanai::RCA, 15U },
399
  { Lanai::RV, 8U },
400
  { Lanai::SP, 4U },
401
  { Lanai::R0, 0U },
402
  { Lanai::R1, 1U },
403
  { Lanai::R2, 2U },
404
  { Lanai::R3, 3U },
405
  { Lanai::R4, 4U },
406
  { Lanai::R5, 5U },
407
  { Lanai::R6, 6U },
408
  { Lanai::R7, 7U },
409
  { Lanai::R8, 8U },
410
  { Lanai::R9, 9U },
411
  { Lanai::R10, 10U },
412
  { Lanai::R11, 11U },
413
  { Lanai::R12, 12U },
414
  { Lanai::R13, 13U },
415
  { Lanai::R14, 14U },
416
  { Lanai::R15, 15U },
417
  { Lanai::R16, 16U },
418
  { Lanai::R17, 17U },
419
  { Lanai::R18, 18U },
420
  { Lanai::R19, 19U },
421
  { Lanai::R20, 20U },
422
  { Lanai::R21, 21U },
423
  { Lanai::R22, 22U },
424
  { Lanai::R23, 23U },
425
  { Lanai::R24, 24U },
426
  { Lanai::R25, 25U },
427
  { Lanai::R26, 26U },
428
  { Lanai::R27, 27U },
429
  { Lanai::R28, 28U },
430
  { Lanai::R29, 29U },
431
  { Lanai::R30, 30U },
432
  { Lanai::R31, 31U },
433
  { Lanai::RR1, 10U },
434
  { Lanai::RR2, 11U },
435
};
436
extern const unsigned LanaiDwarfFlavour0L2DwarfSize = std::size(LanaiDwarfFlavour0L2Dwarf);
437
438
extern const MCRegisterInfo::DwarfLLVMRegPair LanaiEHFlavour0L2Dwarf[] = {
439
  { Lanai::FP, 5U },
440
  { Lanai::PC, 2U },
441
  { Lanai::RCA, 15U },
442
  { Lanai::RV, 8U },
443
  { Lanai::SP, 4U },
444
  { Lanai::R0, 0U },
445
  { Lanai::R1, 1U },
446
  { Lanai::R2, 2U },
447
  { Lanai::R3, 3U },
448
  { Lanai::R4, 4U },
449
  { Lanai::R5, 5U },
450
  { Lanai::R6, 6U },
451
  { Lanai::R7, 7U },
452
  { Lanai::R8, 8U },
453
  { Lanai::R9, 9U },
454
  { Lanai::R10, 10U },
455
  { Lanai::R11, 11U },
456
  { Lanai::R12, 12U },
457
  { Lanai::R13, 13U },
458
  { Lanai::R14, 14U },
459
  { Lanai::R15, 15U },
460
  { Lanai::R16, 16U },
461
  { Lanai::R17, 17U },
462
  { Lanai::R18, 18U },
463
  { Lanai::R19, 19U },
464
  { Lanai::R20, 20U },
465
  { Lanai::R21, 21U },
466
  { Lanai::R22, 22U },
467
  { Lanai::R23, 23U },
468
  { Lanai::R24, 24U },
469
  { Lanai::R25, 25U },
470
  { Lanai::R26, 26U },
471
  { Lanai::R27, 27U },
472
  { Lanai::R28, 28U },
473
  { Lanai::R29, 29U },
474
  { Lanai::R30, 30U },
475
  { Lanai::R31, 31U },
476
  { Lanai::RR1, 10U },
477
  { Lanai::RR2, 11U },
478
};
479
extern const unsigned LanaiEHFlavour0L2DwarfSize = std::size(LanaiEHFlavour0L2Dwarf);
480
481
extern const uint16_t LanaiRegEncodingTable[] = {
482
  0,
483
  0,
484
  0,
485
  0,
486
  0,
487
  0,
488
  0,
489
  0,
490
  0,
491
  0,
492
  0,
493
  0,
494
  0,
495
  0,
496
  0,
497
  0,
498
  0,
499
  0,
500
  0,
501
  0,
502
  0,
503
  0,
504
  0,
505
  0,
506
  0,
507
  0,
508
  0,
509
  0,
510
  0,
511
  0,
512
  0,
513
  0,
514
  0,
515
  0,
516
  0,
517
  0,
518
  0,
519
  0,
520
  0,
521
  0,
522
  0,
523
};
524
0
static inline void InitLanaiMCRegisterInfo(MCRegisterInfo *RI, unsigned RA, unsigned DwarfFlavour = 0, unsigned EHFlavour = 0, unsigned PC = 0) {
525
0
  RI->InitMCRegisterInfo(LanaiRegDesc, 41, RA, PC, LanaiMCRegisterClasses, 3, LanaiRegUnitRoots, 33, LanaiRegDiffLists, LanaiLaneMaskLists, LanaiRegStrings, LanaiRegClassStrings, LanaiSubRegIdxLists, 2,
526
0
LanaiSubRegIdxRanges, LanaiRegEncodingTable);
527
528
0
  switch (DwarfFlavour) {
529
0
  default:
530
0
    llvm_unreachable("Unknown DWARF flavour");
531
0
  case 0:
532
0
    RI->mapDwarfRegsToLLVMRegs(LanaiDwarfFlavour0Dwarf2L, LanaiDwarfFlavour0Dwarf2LSize, false);
533
0
    break;
534
0
  }
535
0
  switch (EHFlavour) {
536
0
  default:
537
0
    llvm_unreachable("Unknown DWARF flavour");
538
0
  case 0:
539
0
    RI->mapDwarfRegsToLLVMRegs(LanaiEHFlavour0Dwarf2L, LanaiEHFlavour0Dwarf2LSize, true);
540
0
    break;
541
0
  }
542
0
  switch (DwarfFlavour) {
543
0
  default:
544
0
    llvm_unreachable("Unknown DWARF flavour");
545
0
  case 0:
546
0
    RI->mapLLVMRegsToDwarfRegs(LanaiDwarfFlavour0L2Dwarf, LanaiDwarfFlavour0L2DwarfSize, false);
547
0
    break;
548
0
  }
549
0
  switch (EHFlavour) {
550
0
  default:
551
0
    llvm_unreachable("Unknown DWARF flavour");
552
0
  case 0:
553
0
    RI->mapLLVMRegsToDwarfRegs(LanaiEHFlavour0L2Dwarf, LanaiEHFlavour0L2DwarfSize, true);
554
0
    break;
555
0
  }
556
0
}
557
558
} // end namespace llvm
559
560
#endif // GET_REGINFO_MC_DESC
561
562
/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
563
|*                                                                            *|
564
|* Register Information Header Fragment                                       *|
565
|*                                                                            *|
566
|* Automatically generated file, do not edit!                                 *|
567
|*                                                                            *|
568
\*===----------------------------------------------------------------------===*/
569
570
571
#ifdef GET_REGINFO_HEADER
572
#undef GET_REGINFO_HEADER
573
574
#include "llvm/CodeGen/TargetRegisterInfo.h"
575
576
namespace llvm {
577
578
class LanaiFrameLowering;
579
580
struct LanaiGenRegisterInfo : public TargetRegisterInfo {
581
  explicit LanaiGenRegisterInfo(unsigned RA, unsigned D = 0, unsigned E = 0,
582
      unsigned PC = 0, unsigned HwMode = 0);
583
  unsigned composeSubRegIndicesImpl(unsigned, unsigned) const override;
584
  LaneBitmask composeSubRegIndexLaneMaskImpl(unsigned, LaneBitmask) const override;
585
  LaneBitmask reverseComposeSubRegIndexLaneMaskImpl(unsigned, LaneBitmask) const override;
586
  const TargetRegisterClass *getSubClassWithSubReg(const TargetRegisterClass *, unsigned) const override;
587
  const TargetRegisterClass *getSubRegisterClass(const TargetRegisterClass *, unsigned) const override;
588
  const RegClassWeight &getRegClassWeight(const TargetRegisterClass *RC) const override;
589
  unsigned getRegUnitWeight(unsigned RegUnit) const override;
590
  unsigned getNumRegPressureSets() const override;
591
  const char *getRegPressureSetName(unsigned Idx) const override;
592
  unsigned getRegPressureSetLimit(const MachineFunction &MF, unsigned Idx) const override;
593
  const int *getRegClassPressureSets(const TargetRegisterClass *RC) const override;
594
  const int *getRegUnitPressureSets(unsigned RegUnit) const override;
595
  ArrayRef<const char *> getRegMaskNames() const override;
596
  ArrayRef<const uint32_t *> getRegMasks() const override;
597
  bool isGeneralPurposeRegister(const MachineFunction &, MCRegister) const override;
598
  bool isFixedRegister(const MachineFunction &, MCRegister) const override;
599
  bool isArgumentRegister(const MachineFunction &, MCRegister) const override;
600
  bool isConstantPhysReg(MCRegister PhysReg) const override final;
601
  /// Devirtualized TargetFrameLowering.
602
  static const LanaiFrameLowering *getFrameLowering(
603
      const MachineFunction &MF);
604
};
605
606
namespace Lanai { // Register classes
607
  extern const TargetRegisterClass GPRRegClass;
608
  extern const TargetRegisterClass GPR_with_sub_32RegClass;
609
  extern const TargetRegisterClass CCRRegClass;
610
} // end namespace Lanai
611
612
} // end namespace llvm
613
614
#endif // GET_REGINFO_HEADER
615
616
/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
617
|*                                                                            *|
618
|* Target Register and Register Classes Information                           *|
619
|*                                                                            *|
620
|* Automatically generated file, do not edit!                                 *|
621
|*                                                                            *|
622
\*===----------------------------------------------------------------------===*/
623
624
625
#ifdef GET_REGINFO_TARGET_DESC
626
#undef GET_REGINFO_TARGET_DESC
627
628
namespace llvm {
629
630
extern const MCRegisterClass LanaiMCRegisterClasses[];
631
632
static const MVT::SimpleValueType VTLists[] = {
633
  /* 0 */ MVT::i32, MVT::Other,
634
};
635
636
static const char *SubRegIndexNameTable[] = { "sub_32", "" };
637
638
639
static const LaneBitmask SubRegIndexLaneMaskTable[] = {
640
  LaneBitmask::getAll(),
641
  LaneBitmask(0x0000000000000001), // sub_32
642
 };
643
644
645
646
static const TargetRegisterInfo::RegClassInfo RegClassInfos[] = {
647
  // Mode = 0 (Default)
648
  { 32, 32, 32, /*VTLists+*/0 },    // GPR
649
  { 32, 32, 32, /*VTLists+*/0 },    // GPR_with_sub_32
650
  { 32, 32, 32, /*VTLists+*/0 },    // CCR
651
};
652
653
static const TargetRegisterClass *const NullRegClasses[] = { nullptr };
654
655
static const uint32_t GPRSubClassMask[] = {
656
  0x00000003, 
657
  0x00000002, // sub_32
658
};
659
660
static const uint32_t GPR_with_sub_32SubClassMask[] = {
661
  0x00000002, 
662
};
663
664
static const uint32_t CCRSubClassMask[] = {
665
  0x00000004, 
666
};
667
668
static const uint16_t SuperRegIdxSeqs[] = {
669
  /* 0 */ 1, 0,
670
};
671
672
static const TargetRegisterClass *const GPR_with_sub_32Superclasses[] = {
673
  &Lanai::GPRRegClass,
674
  nullptr
675
};
676
677
678
namespace Lanai {   // Register class instances
679
  extern const TargetRegisterClass GPRRegClass = {
680
    &LanaiMCRegisterClasses[GPRRegClassID],
681
    GPRSubClassMask,
682
    SuperRegIdxSeqs + 0,
683
    LaneBitmask(0x0000000000000001),
684
    0,
685
    false,
686
    0x00, /* TSFlags */
687
    false, /* HasDisjunctSubRegs */
688
    false, /* CoveredBySubRegs */
689
    NullRegClasses,
690
    nullptr
691
  };
692
693
  extern const TargetRegisterClass GPR_with_sub_32RegClass = {
694
    &LanaiMCRegisterClasses[GPR_with_sub_32RegClassID],
695
    GPR_with_sub_32SubClassMask,
696
    SuperRegIdxSeqs + 1,
697
    LaneBitmask(0x0000000000000001),
698
    0,
699
    false,
700
    0x00, /* TSFlags */
701
    false, /* HasDisjunctSubRegs */
702
    false, /* CoveredBySubRegs */
703
    GPR_with_sub_32Superclasses,
704
    nullptr
705
  };
706
707
  extern const TargetRegisterClass CCRRegClass = {
708
    &LanaiMCRegisterClasses[CCRRegClassID],
709
    CCRSubClassMask,
710
    SuperRegIdxSeqs + 1,
711
    LaneBitmask(0x0000000000000001),
712
    0,
713
    false,
714
    0x00, /* TSFlags */
715
    false, /* HasDisjunctSubRegs */
716
    false, /* CoveredBySubRegs */
717
    NullRegClasses,
718
    nullptr
719
  };
720
721
} // end namespace Lanai
722
723
namespace {
724
  const TargetRegisterClass *const RegisterClasses[] = {
725
    &Lanai::GPRRegClass,
726
    &Lanai::GPR_with_sub_32RegClass,
727
    &Lanai::CCRRegClass,
728
  };
729
} // end anonymous namespace
730
731
static const uint8_t CostPerUseTable[] = { 
732
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
733
734
735
static const bool InAllocatableClassTable[] = { 
736
false, true, true, true, true, true, 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, };
737
738
739
static const TargetRegisterInfoDesc LanaiRegInfoDesc = { // Extra Descriptors
740
CostPerUseTable, 1, InAllocatableClassTable};
741
742
0
unsigned LanaiGenRegisterInfo::composeSubRegIndicesImpl(unsigned IdxA, unsigned IdxB) const {
743
0
  static const uint8_t Rows[1][1] = {
744
0
    { 0, },
745
0
  };
746
747
0
  --IdxA; assert(IdxA < 1); (void) IdxA;
748
0
  --IdxB; assert(IdxB < 1);
749
0
  return Rows[0][IdxB];
750
0
}
751
752
  struct MaskRolOp {
753
    LaneBitmask Mask;
754
    uint8_t  RotateLeft;
755
  };
756
  static const MaskRolOp LaneMaskComposeSequences[] = {
757
    { LaneBitmask(0xFFFFFFFFFFFFFFFF),  0 }, { LaneBitmask::getNone(), 0 }  // Sequence 0
758
  };
759
  static const uint8_t CompositeSequences[] = {
760
    0 // to sub_32
761
  };
762
763
0
LaneBitmask LanaiGenRegisterInfo::composeSubRegIndexLaneMaskImpl(unsigned IdxA, LaneBitmask LaneMask) const {
764
0
  --IdxA; assert(IdxA < 1 && "Subregister index out of bounds");
765
0
  LaneBitmask Result;
766
0
  for (const MaskRolOp *Ops =
767
0
       &LaneMaskComposeSequences[CompositeSequences[IdxA]];
768
0
       Ops->Mask.any(); ++Ops) {
769
0
    LaneBitmask::Type M = LaneMask.getAsInteger() & Ops->Mask.getAsInteger();
770
0
    if (unsigned S = Ops->RotateLeft)
771
0
      Result |= LaneBitmask((M << S) | (M >> (LaneBitmask::BitWidth - S)));
772
0
    else
773
0
      Result |= LaneBitmask(M);
774
0
  }
775
0
  return Result;
776
0
}
777
778
0
LaneBitmask LanaiGenRegisterInfo::reverseComposeSubRegIndexLaneMaskImpl(unsigned IdxA,  LaneBitmask LaneMask) const {
779
0
  LaneMask &= getSubRegIndexLaneMask(IdxA);
780
0
  --IdxA; assert(IdxA < 1 && "Subregister index out of bounds");
781
0
  LaneBitmask Result;
782
0
  for (const MaskRolOp *Ops =
783
0
       &LaneMaskComposeSequences[CompositeSequences[IdxA]];
784
0
       Ops->Mask.any(); ++Ops) {
785
0
    LaneBitmask::Type M = LaneMask.getAsInteger();
786
0
    if (unsigned S = Ops->RotateLeft)
787
0
      Result |= LaneBitmask((M >> S) | (M << (LaneBitmask::BitWidth - S)));
788
0
    else
789
0
      Result |= LaneBitmask(M);
790
0
  }
791
0
  return Result;
792
0
}
793
794
0
const TargetRegisterClass *LanaiGenRegisterInfo::getSubClassWithSubReg(const TargetRegisterClass *RC, unsigned Idx) const {
795
0
  static const uint8_t Table[3][1] = {
796
0
    { // GPR
797
0
      2,  // sub_32 -> GPR_with_sub_32
798
0
    },
799
0
    { // GPR_with_sub_32
800
0
      2,  // sub_32 -> GPR_with_sub_32
801
0
    },
802
0
    { // CCR
803
0
      0,  // sub_32
804
0
    },
805
0
  };
806
0
  assert(RC && "Missing regclass");
807
0
  if (!Idx) return RC;
808
0
  --Idx;
809
0
  assert(Idx < 1 && "Bad subreg");
810
0
  unsigned TV = Table[RC->getID()][Idx];
811
0
  return TV ? getRegClass(TV - 1) : nullptr;
812
0
}
813
814
0
const TargetRegisterClass *LanaiGenRegisterInfo::getSubRegisterClass(const TargetRegisterClass *RC, unsigned Idx) const {
815
0
  static const uint8_t Table[3][1] = {
816
0
    { // GPR
817
0
      1,  // GPR:sub_32 -> GPR
818
0
    },
819
0
    { // GPR_with_sub_32
820
0
      1,  // GPR_with_sub_32:sub_32 -> GPR
821
0
    },
822
0
    { // CCR
823
0
      0,  // CCR:sub_32
824
0
    },
825
0
  };
826
0
  assert(RC && "Missing regclass");
827
0
  if (!Idx) return RC;
828
0
  --Idx;
829
0
  assert(Idx < 1 && "Bad subreg");
830
0
  unsigned TV = Table[RC->getID()][Idx];
831
0
  return TV ? getRegClass(TV - 1) : nullptr;
832
0
}
833
834
/// Get the weight in units of pressure for this register class.
835
const RegClassWeight &LanaiGenRegisterInfo::
836
0
getRegClassWeight(const TargetRegisterClass *RC) const {
837
0
  static const RegClassWeight RCWeightTable[] = {
838
0
    {1, 32},    // GPR
839
0
    {1, 7},   // GPR_with_sub_32
840
0
    {0, 0},   // CCR
841
0
  };
842
0
  return RCWeightTable[RC->getID()];
843
0
}
844
845
/// Get the weight in units of pressure for this register unit.
846
unsigned LanaiGenRegisterInfo::
847
0
getRegUnitWeight(unsigned RegUnit) const {
848
0
  assert(RegUnit < 33 && "invalid register unit");
849
  // All register units have unit weight.
850
0
  return 1;
851
0
}
852
853
854
// Get the number of dimensions of register pressure.
855
0
unsigned LanaiGenRegisterInfo::getNumRegPressureSets() const {
856
0
  return 2;
857
0
}
858
859
// Get the name of this register unit pressure set.
860
const char *LanaiGenRegisterInfo::
861
0
getRegPressureSetName(unsigned Idx) const {
862
0
  static const char *PressureNameTable[] = {
863
0
    "GPR_with_sub_32",
864
0
    "GPR",
865
0
  };
866
0
  return PressureNameTable[Idx];
867
0
}
868
869
// Get the register unit pressure limit for this dimension.
870
// This limit must be adjusted dynamically for reserved registers.
871
unsigned LanaiGenRegisterInfo::
872
0
getRegPressureSetLimit(const MachineFunction &MF, unsigned Idx) const {
873
0
  static const uint8_t PressureLimitTable[] = {
874
0
    7,    // 0: GPR_with_sub_32
875
0
    32,   // 1: GPR
876
0
  };
877
0
  return PressureLimitTable[Idx];
878
0
}
879
880
/// Table of pressure sets per register class or unit.
881
static const int RCSetsTable[] = {
882
  /* 0 */ 0, 1, -1,
883
};
884
885
/// Get the dimensions of register pressure impacted by this register class.
886
/// Returns a -1 terminated array of pressure set IDs
887
const int *LanaiGenRegisterInfo::
888
0
getRegClassPressureSets(const TargetRegisterClass *RC) const {
889
0
  static const uint8_t RCSetStartTable[] = {
890
0
    1,0,2,};
891
0
  return &RCSetsTable[RCSetStartTable[RC->getID()]];
892
0
}
893
894
/// Get the dimensions of register pressure impacted by this register unit.
895
/// Returns a -1 terminated array of pressure set IDs
896
const int *LanaiGenRegisterInfo::
897
0
getRegUnitPressureSets(unsigned RegUnit) const {
898
0
  assert(RegUnit < 33 && "invalid register unit");
899
0
  static const uint8_t RUSetStartTable[] = {
900
0
    0,0,0,0,0,2,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,};
901
0
  return &RCSetsTable[RUSetStartTable[RegUnit]];
902
0
}
903
904
extern const MCRegisterDesc LanaiRegDesc[];
905
extern const int16_t LanaiRegDiffLists[];
906
extern const LaneBitmask LanaiLaneMaskLists[];
907
extern const char LanaiRegStrings[];
908
extern const char LanaiRegClassStrings[];
909
extern const MCPhysReg LanaiRegUnitRoots[][2];
910
extern const uint16_t LanaiSubRegIdxLists[];
911
extern const MCRegisterInfo::SubRegCoveredBits LanaiSubRegIdxRanges[];
912
extern const uint16_t LanaiRegEncodingTable[];
913
// Lanai Dwarf<->LLVM register mappings.
914
extern const MCRegisterInfo::DwarfLLVMRegPair LanaiDwarfFlavour0Dwarf2L[];
915
extern const unsigned LanaiDwarfFlavour0Dwarf2LSize;
916
917
extern const MCRegisterInfo::DwarfLLVMRegPair LanaiEHFlavour0Dwarf2L[];
918
extern const unsigned LanaiEHFlavour0Dwarf2LSize;
919
920
extern const MCRegisterInfo::DwarfLLVMRegPair LanaiDwarfFlavour0L2Dwarf[];
921
extern const unsigned LanaiDwarfFlavour0L2DwarfSize;
922
923
extern const MCRegisterInfo::DwarfLLVMRegPair LanaiEHFlavour0L2Dwarf[];
924
extern const unsigned LanaiEHFlavour0L2DwarfSize;
925
926
LanaiGenRegisterInfo::
927
LanaiGenRegisterInfo(unsigned RA, unsigned DwarfFlavour, unsigned EHFlavour,
928
      unsigned PC, unsigned HwMode)
929
  : TargetRegisterInfo(&LanaiRegInfoDesc, RegisterClasses, RegisterClasses+3,
930
             SubRegIndexNameTable, SubRegIndexLaneMaskTable,
931
0
             LaneBitmask(0xFFFFFFFFFFFFFFFE), RegClassInfos, VTLists, HwMode) {
932
0
  InitMCRegisterInfo(LanaiRegDesc, 41, RA, PC,
933
0
                     LanaiMCRegisterClasses, 3,
934
0
                     LanaiRegUnitRoots,
935
0
                     33,
936
0
                     LanaiRegDiffLists,
937
0
                     LanaiLaneMaskLists,
938
0
                     LanaiRegStrings,
939
0
                     LanaiRegClassStrings,
940
0
                     LanaiSubRegIdxLists,
941
0
                     2,
942
0
                     LanaiSubRegIdxRanges,
943
0
                     LanaiRegEncodingTable);
944
945
0
  switch (DwarfFlavour) {
946
0
  default:
947
0
    llvm_unreachable("Unknown DWARF flavour");
948
0
  case 0:
949
0
    mapDwarfRegsToLLVMRegs(LanaiDwarfFlavour0Dwarf2L, LanaiDwarfFlavour0Dwarf2LSize, false);
950
0
    break;
951
0
  }
952
0
  switch (EHFlavour) {
953
0
  default:
954
0
    llvm_unreachable("Unknown DWARF flavour");
955
0
  case 0:
956
0
    mapDwarfRegsToLLVMRegs(LanaiEHFlavour0Dwarf2L, LanaiEHFlavour0Dwarf2LSize, true);
957
0
    break;
958
0
  }
959
0
  switch (DwarfFlavour) {
960
0
  default:
961
0
    llvm_unreachable("Unknown DWARF flavour");
962
0
  case 0:
963
0
    mapLLVMRegsToDwarfRegs(LanaiDwarfFlavour0L2Dwarf, LanaiDwarfFlavour0L2DwarfSize, false);
964
0
    break;
965
0
  }
966
0
  switch (EHFlavour) {
967
0
  default:
968
0
    llvm_unreachable("Unknown DWARF flavour");
969
0
  case 0:
970
0
    mapLLVMRegsToDwarfRegs(LanaiEHFlavour0L2Dwarf, LanaiEHFlavour0L2DwarfSize, true);
971
0
    break;
972
0
  }
973
0
}
974
975
static const MCPhysReg CSR_SaveList[] = { 0 };
976
static const uint32_t CSR_RegMask[] = { 0x00000000, 0x00000000, };
977
978
979
0
ArrayRef<const uint32_t *> LanaiGenRegisterInfo::getRegMasks() const {
980
0
  static const uint32_t *const Masks[] = {
981
0
    CSR_RegMask,
982
0
  };
983
0
  return ArrayRef(Masks);
984
0
}
985
986
bool LanaiGenRegisterInfo::
987
0
isGeneralPurposeRegister(const MachineFunction &MF, MCRegister PhysReg) const {
988
0
  return
989
0
      false;
990
0
}
991
992
bool LanaiGenRegisterInfo::
993
0
isFixedRegister(const MachineFunction &MF, MCRegister PhysReg) const {
994
0
  return
995
0
      false;
996
0
}
997
998
bool LanaiGenRegisterInfo::
999
0
isArgumentRegister(const MachineFunction &MF, MCRegister PhysReg) const {
1000
0
  return
1001
0
      false;
1002
0
}
1003
1004
bool LanaiGenRegisterInfo::
1005
0
isConstantPhysReg(MCRegister PhysReg) const {
1006
0
  return
1007
0
      false;
1008
0
}
1009
1010
0
ArrayRef<const char *> LanaiGenRegisterInfo::getRegMaskNames() const {
1011
0
  static const char *Names[] = {
1012
0
    "CSR",
1013
0
  };
1014
0
  return ArrayRef(Names);
1015
0
}
1016
1017
const LanaiFrameLowering *
1018
0
LanaiGenRegisterInfo::getFrameLowering(const MachineFunction &MF) {
1019
0
  return static_cast<const LanaiFrameLowering *>(
1020
0
      MF.getSubtarget().getFrameLowering());
1021
0
}
1022
1023
} // end namespace llvm
1024
1025
#endif // GET_REGINFO_TARGET_DESC
1026