Coverage Report

Created: 2024-01-17 10:31

/src/build/lib/Target/Sparc/SparcGenSubtargetInfo.inc
Line
Count
Source (jump to first uncovered line)
1
/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
2
|*                                                                            *|
3
|* Subtarget Enumeration Source Fragment                                      *|
4
|*                                                                            *|
5
|* Automatically generated file, do not edit!                                 *|
6
|*                                                                            *|
7
\*===----------------------------------------------------------------------===*/
8
9
10
#ifdef GET_SUBTARGETINFO_ENUM
11
#undef GET_SUBTARGETINFO_ENUM
12
13
namespace llvm {
14
namespace Sparc {
15
enum {
16
  DetectRoundChange = 0,
17
  FeatureHardQuad = 1,
18
  FeatureLeon = 2,
19
  FeatureNoFMULS = 3,
20
  FeatureNoFSMULD = 4,
21
  FeaturePWRPSR = 5,
22
  FeatureSoftFloat = 6,
23
  FeatureSoftMulDiv = 7,
24
  FeatureV8Deprecated = 8,
25
  FeatureV9 = 9,
26
  FeatureVIS = 10,
27
  FeatureVIS2 = 11,
28
  FeatureVIS3 = 12,
29
  FixAllFDIVSQRT = 13,
30
  InsertNOPLoad = 14,
31
  LeonCASA = 15,
32
  LeonCycleCounter = 16,
33
  TuneSlowRDPC = 17,
34
  UMACSMACSupport = 18,
35
  UsePopc = 19,
36
  NumSubtargetFeatures = 20
37
};
38
} // end namespace Sparc
39
} // end namespace llvm
40
41
#endif // GET_SUBTARGETINFO_ENUM
42
43
44
#ifdef GET_SUBTARGETINFO_MACRO
45
GET_SUBTARGETINFO_MACRO(DetectRoundChange, false, detectRoundChange)
46
GET_SUBTARGETINFO_MACRO(FixAllFDIVSQRT, false, fixAllFDIVSQRT)
47
GET_SUBTARGETINFO_MACRO(HasHardQuad, false, hasHardQuad)
48
GET_SUBTARGETINFO_MACRO(HasLeonCasa, false, hasLeonCasa)
49
GET_SUBTARGETINFO_MACRO(HasLeonCycleCounter, false, hasLeonCycleCounter)
50
GET_SUBTARGETINFO_MACRO(HasNoFMULS, false, hasNoFMULS)
51
GET_SUBTARGETINFO_MACRO(HasNoFSMULD, false, hasNoFSMULD)
52
GET_SUBTARGETINFO_MACRO(HasPWRPSR, false, hasPWRPSR)
53
GET_SUBTARGETINFO_MACRO(HasSlowRDPC, false, hasSlowRDPC)
54
GET_SUBTARGETINFO_MACRO(HasUmacSmac, false, hasUmacSmac)
55
GET_SUBTARGETINFO_MACRO(InsertNOPLoad, false, insertNOPLoad)
56
GET_SUBTARGETINFO_MACRO(IsLeon, false, isLeon)
57
GET_SUBTARGETINFO_MACRO(IsV9, false, isV9)
58
GET_SUBTARGETINFO_MACRO(IsVIS, false, isVIS)
59
GET_SUBTARGETINFO_MACRO(IsVIS2, false, isVIS2)
60
GET_SUBTARGETINFO_MACRO(IsVIS3, false, isVIS3)
61
GET_SUBTARGETINFO_MACRO(UsePopc, false, usePopc)
62
GET_SUBTARGETINFO_MACRO(UseSoftFloat, false, useSoftFloat)
63
GET_SUBTARGETINFO_MACRO(UseSoftMulDiv, false, useSoftMulDiv)
64
GET_SUBTARGETINFO_MACRO(UseV8DeprecatedInsts, false, useV8DeprecatedInsts)
65
#undef GET_SUBTARGETINFO_MACRO
66
#endif // GET_SUBTARGETINFO_MACRO
67
68
69
#ifdef GET_SUBTARGETINFO_MC_DESC
70
#undef GET_SUBTARGETINFO_MC_DESC
71
72
namespace llvm {
73
// Sorted (by key) array of values for CPU features.
74
extern const llvm::SubtargetFeatureKV SparcFeatureKV[] = {
75
  { "deprecated-v8", "Enable deprecated V8 instructions in V9 mode", Sparc::FeatureV8Deprecated, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } } },
76
  { "detectroundchange", "LEON3 erratum detection: Detects any rounding mode change request: use only the round-to-nearest rounding mode", Sparc::DetectRoundChange, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } } },
77
  { "fixallfdivsqrt", "LEON erratum fix: Fix FDIVS/FDIVD/FSQRTS/FSQRTD instructions with NOPs and floating-point store", Sparc::FixAllFDIVSQRT, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } } },
78
  { "hard-quad-float", "Enable quad-word floating point instructions", Sparc::FeatureHardQuad, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } } },
79
  { "hasleoncasa", "Enable CASA instruction for LEON3 and LEON4 processors", Sparc::LeonCASA, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } } },
80
  { "hasumacsmac", "Enable UMAC and SMAC for LEON3 and LEON4 processors", Sparc::UMACSMACSupport, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } } },
81
  { "insertnopload", "LEON3 erratum fix: Insert a NOP instruction after every single-cycle load instruction when the next instruction is another load/store instruction", Sparc::InsertNOPLoad, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } } },
82
  { "leon", "Enable LEON extensions", Sparc::FeatureLeon, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } } },
83
  { "leoncyclecounter", "Use the Leon cycle counter register", Sparc::LeonCycleCounter, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } } },
84
  { "leonpwrpsr", "Enable the PWRPSR instruction", Sparc::FeaturePWRPSR, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } } },
85
  { "no-fmuls", "Disable the fmuls instruction.", Sparc::FeatureNoFMULS, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } } },
86
  { "no-fsmuld", "Disable the fsmuld instruction.", Sparc::FeatureNoFSMULD, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } } },
87
  { "popc", "Use the popc (population count) instruction", Sparc::UsePopc, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } } },
88
  { "slow-rdpc", "rd %pc, %XX is slow", Sparc::TuneSlowRDPC, { { { 0x200ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } } },
89
  { "soft-float", "Use software emulation for floating point", Sparc::FeatureSoftFloat, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } } },
90
  { "soft-mul-div", "Use software emulation for integer multiply and divide", Sparc::FeatureSoftMulDiv, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } } },
91
  { "v9", "Enable SPARC-V9 instructions", Sparc::FeatureV9, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } } },
92
  { "vis", "Enable UltraSPARC Visual Instruction Set extensions", Sparc::FeatureVIS, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } } },
93
  { "vis2", "Enable Visual Instruction Set extensions II", Sparc::FeatureVIS2, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } } },
94
  { "vis3", "Enable Visual Instruction Set extensions III", Sparc::FeatureVIS3, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } } },
95
};
96
97
#ifdef DBGFIELD
98
#error "<target>GenSubtargetInfo.inc requires a DBGFIELD macro"
99
#endif
100
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
101
#define DBGFIELD(x) x,
102
#else
103
#define DBGFIELD(x)
104
#endif
105
106
// Functional units for "LEON2Itineraries"
107
namespace LEON2ItinerariesFU {
108
  const InstrStage::FuncUnits LEONIU = 1ULL << 0;
109
  const InstrStage::FuncUnits LEONFPU = 1ULL << 1;
110
} // end namespace LEON2ItinerariesFU
111
112
// Functional units for "LEON3Itineraries"
113
namespace LEON3ItinerariesFU {
114
  const InstrStage::FuncUnits LEONIU = 1ULL << 0;
115
  const InstrStage::FuncUnits LEONFPU = 1ULL << 1;
116
} // end namespace LEON3ItinerariesFU
117
118
// Functional units for "LEON4Itineraries"
119
namespace LEON4ItinerariesFU {
120
  const InstrStage::FuncUnits LEONIU = 1ULL << 0;
121
  const InstrStage::FuncUnits LEONFPU = 1ULL << 1;
122
} // end namespace LEON4ItinerariesFU
123
124
extern const llvm::InstrStage SparcStages[] = {
125
  { 0, 0, 0, llvm::InstrStage::Required }, // No itinerary
126
  { 1, LEON2ItinerariesFU::LEONIU, -1, (llvm::InstrStage::ReservationKinds)0 }, // 1
127
  { 1, LEON2ItinerariesFU::LEONFPU, -1, (llvm::InstrStage::ReservationKinds)0 }, // 2
128
  { 1, LEON2ItinerariesFU::LEONIU | LEON2ItinerariesFU::LEONFPU, -1, (llvm::InstrStage::ReservationKinds)0 }, // 3
129
  { 1, LEON3ItinerariesFU::LEONIU, -1, (llvm::InstrStage::ReservationKinds)0 }, // 4
130
  { 1, LEON3ItinerariesFU::LEONFPU, -1, (llvm::InstrStage::ReservationKinds)0 }, // 5
131
  { 1, LEON3ItinerariesFU::LEONIU | LEON3ItinerariesFU::LEONFPU, -1, (llvm::InstrStage::ReservationKinds)0 }, // 6
132
  { 1, LEON4ItinerariesFU::LEONIU, -1, (llvm::InstrStage::ReservationKinds)0 }, // 7
133
  { 1, LEON4ItinerariesFU::LEONFPU, -1, (llvm::InstrStage::ReservationKinds)0 }, // 8
134
  { 1, LEON4ItinerariesFU::LEONIU | LEON4ItinerariesFU::LEONFPU, -1, (llvm::InstrStage::ReservationKinds)0 }, // 9
135
  { 0, 0, 0, llvm::InstrStage::Required } // End stages
136
};
137
extern const unsigned SparcOperandCycles[] = {
138
  0, // No itinerary
139
  1,   1, // 1-2
140
  7,   1, // 3-4
141
  2,   1, // 5-6
142
  2,   1, // 7-8
143
  7,   1, // 9-10
144
  36,   1, // 11-12
145
  20,   1, // 13-14
146
  21,   1, // 15-16
147
  16,   1, // 17-18
148
  2,   1, // 19-20
149
  65,   1, // 21-22
150
  37,   1, // 23-24
151
  2,   1, // 25-26
152
  2,   1, // 27-28
153
  1,   1, // 29-30
154
  35,   1, // 31-32
155
  5,   1, // 33-34
156
  2,   1, // 35-36
157
  3,   1, // 37-38
158
  5,   1, // 39-40
159
  1,   1, // 41-42
160
  7,   1, // 43-44
161
  3,   1, // 45-46
162
  2,   1, // 47-48
163
  4,   1, // 49-50
164
  17,   1, // 51-52
165
  16,   1, // 53-54
166
  4,   1, // 55-56
167
  4,   1, // 57-58
168
  2,   1, // 59-60
169
  25,   1, // 61-62
170
  24,   1, // 63-64
171
  4,   1, // 65-66
172
  2,   1, // 67-68
173
  1,   1, // 69-70
174
  35,   1, // 71-72
175
  2,   1, // 73-74
176
  1,   1, // 75-76
177
  4,   1, // 77-78
178
  5,   1, // 79-80
179
  4,   1, // 81-82
180
  1,   1, // 83-84
181
  7,   1, // 85-86
182
  3,   1, // 87-88
183
  2,   1, // 89-90
184
  4,   1, // 91-92
185
  17,   1, // 93-94
186
  16,   1, // 95-96
187
  4,   1, // 97-98
188
  4,   1, // 99-100
189
  2,   1, // 101-102
190
  25,   1, // 103-104
191
  24,   1, // 105-106
192
  4,   1, // 107-108
193
  1,   1, // 109-110
194
  1,   1, // 111-112
195
  35,   1, // 113-114
196
  2,   1, // 115-116
197
  1,   1, // 117-118
198
  1,   1, // 119-120
199
  1,   1, // 121-122
200
  4,   1, // 123-124
201
  0 // End operand cycles
202
};
203
extern const unsigned SparcForwardingPaths[] = {
204
 0, // No itinerary
205
 0,  0, // 1-2
206
 0,  0, // 3-4
207
 0,  0, // 5-6
208
 0,  0, // 7-8
209
 0,  0, // 9-10
210
 0,  0, // 11-12
211
 0,  0, // 13-14
212
 0,  0, // 15-16
213
 0,  0, // 17-18
214
 0,  0, // 19-20
215
 0,  0, // 21-22
216
 0,  0, // 23-24
217
 0,  0, // 25-26
218
 0,  0, // 27-28
219
 0,  0, // 29-30
220
 0,  0, // 31-32
221
 0,  0, // 33-34
222
 0,  0, // 35-36
223
 0,  0, // 37-38
224
 0,  0, // 39-40
225
 0,  0, // 41-42
226
 0,  0, // 43-44
227
 0,  0, // 45-46
228
 0,  0, // 47-48
229
 0,  0, // 49-50
230
 0,  0, // 51-52
231
 0,  0, // 53-54
232
 0,  0, // 55-56
233
 0,  0, // 57-58
234
 0,  0, // 59-60
235
 0,  0, // 61-62
236
 0,  0, // 63-64
237
 0,  0, // 65-66
238
 0,  0, // 67-68
239
 0,  0, // 69-70
240
 0,  0, // 71-72
241
 0,  0, // 73-74
242
 0,  0, // 75-76
243
 0,  0, // 77-78
244
 0,  0, // 79-80
245
 0,  0, // 81-82
246
 0,  0, // 83-84
247
 0,  0, // 85-86
248
 0,  0, // 87-88
249
 0,  0, // 89-90
250
 0,  0, // 91-92
251
 0,  0, // 93-94
252
 0,  0, // 95-96
253
 0,  0, // 97-98
254
 0,  0, // 99-100
255
 0,  0, // 101-102
256
 0,  0, // 103-104
257
 0,  0, // 105-106
258
 0,  0, // 107-108
259
 0,  0, // 109-110
260
 0,  0, // 111-112
261
 0,  0, // 113-114
262
 0,  0, // 115-116
263
 0,  0, // 117-118
264
 0,  0, // 119-120
265
 0,  0, // 121-122
266
 0,  0, // 123-124
267
 0 // End bypass tables
268
};
269
270
static const llvm::InstrItinerary LEON2Itineraries[] = {
271
  { 0, 0, 0, 0, 0 }, // 0 NoInstrModel
272
  { 1, 1, 2, 1, 3 }, // 1 IIC_iu_instr
273
  { 1, 2, 3, 3, 5 }, // 2 IIC_fpu_normal_instr
274
  { 1, 3, 4, 5, 7 }, // 3 IIC_jmp_or_call
275
  { 1, 2, 3, 7, 9 }, // 4 IIC_fpu_abs
276
  { 1, 2, 3, 9, 11 }, // 5 IIC_fpu_fast_instr
277
  { 1, 2, 3, 11, 13 }, // 6 IIC_fpu_divd
278
  { 1, 2, 3, 13, 15 }, // 7 IIC_fpu_divs
279
  { 1, 2, 3, 15, 17 }, // 8 IIC_fpu_muld
280
  { 1, 2, 3, 17, 19 }, // 9 IIC_fpu_muls
281
  { 1, 2, 3, 19, 21 }, // 10 IIC_fpu_negs
282
  { 1, 2, 3, 21, 23 }, // 11 IIC_fpu_sqrtd
283
  { 1, 2, 3, 23, 25 }, // 12 IIC_fpu_sqrts
284
  { 1, 2, 3, 25, 27 }, // 13 IIC_fpu_stod
285
  { 1, 3, 4, 27, 29 }, // 14 IIC_ldd
286
  { 1, 3, 4, 29, 31 }, // 15 IIC_iu_or_fpu_instr
287
  { 1, 1, 2, 31, 33 }, // 16 IIC_iu_div
288
  { 0, 0, 0, 0, 0 }, // 17 IIC_smac_umac
289
  { 1, 1, 2, 33, 35 }, // 18 IIC_iu_smul
290
  { 1, 3, 4, 35, 37 }, // 19 IIC_st
291
  { 1, 3, 4, 37, 39 }, // 20 IIC_std
292
  { 1, 1, 2, 39, 41 }, // 21 IIC_iu_umul
293
  { 0, uint16_t(~0U), uint16_t(~0U), uint16_t(~0U), uint16_t(~0U) }// end marker
294
};
295
296
static const llvm::InstrItinerary LEON3Itineraries[] = {
297
  { 0, 0, 0, 0, 0 }, // 0 NoInstrModel
298
  { 1, 4, 5, 41, 43 }, // 1 IIC_iu_instr
299
  { 1, 5, 6, 43, 45 }, // 2 IIC_fpu_normal_instr
300
  { 1, 6, 7, 45, 47 }, // 3 IIC_jmp_or_call
301
  { 1, 5, 6, 47, 49 }, // 4 IIC_fpu_abs
302
  { 1, 5, 6, 49, 51 }, // 5 IIC_fpu_fast_instr
303
  { 1, 5, 6, 51, 53 }, // 6 IIC_fpu_divd
304
  { 1, 5, 6, 53, 55 }, // 7 IIC_fpu_divs
305
  { 1, 5, 6, 55, 57 }, // 8 IIC_fpu_muld
306
  { 1, 5, 6, 57, 59 }, // 9 IIC_fpu_muls
307
  { 1, 5, 6, 59, 61 }, // 10 IIC_fpu_negs
308
  { 1, 5, 6, 61, 63 }, // 11 IIC_fpu_sqrtd
309
  { 1, 5, 6, 63, 65 }, // 12 IIC_fpu_sqrts
310
  { 1, 5, 6, 65, 67 }, // 13 IIC_fpu_stod
311
  { 1, 6, 7, 67, 69 }, // 14 IIC_ldd
312
  { 1, 6, 7, 69, 71 }, // 15 IIC_iu_or_fpu_instr
313
  { 1, 4, 5, 71, 73 }, // 16 IIC_iu_div
314
  { 1, 4, 5, 73, 75 }, // 17 IIC_smac_umac
315
  { 1, 4, 5, 75, 77 }, // 18 IIC_iu_smul
316
  { 1, 6, 7, 77, 79 }, // 19 IIC_st
317
  { 1, 6, 7, 79, 81 }, // 20 IIC_std
318
  { 1, 4, 5, 81, 83 }, // 21 IIC_iu_umul
319
  { 0, uint16_t(~0U), uint16_t(~0U), uint16_t(~0U), uint16_t(~0U) }// end marker
320
};
321
322
static const llvm::InstrItinerary LEON4Itineraries[] = {
323
  { 0, 0, 0, 0, 0 }, // 0 NoInstrModel
324
  { 1, 7, 8, 83, 85 }, // 1 IIC_iu_instr
325
  { 1, 8, 9, 85, 87 }, // 2 IIC_fpu_normal_instr
326
  { 1, 9, 10, 87, 89 }, // 3 IIC_jmp_or_call
327
  { 1, 8, 9, 89, 91 }, // 4 IIC_fpu_abs
328
  { 1, 8, 9, 91, 93 }, // 5 IIC_fpu_fast_instr
329
  { 1, 8, 9, 93, 95 }, // 6 IIC_fpu_divd
330
  { 1, 8, 9, 95, 97 }, // 7 IIC_fpu_divs
331
  { 1, 8, 9, 97, 99 }, // 8 IIC_fpu_muld
332
  { 1, 8, 9, 99, 101 }, // 9 IIC_fpu_muls
333
  { 1, 8, 9, 101, 103 }, // 10 IIC_fpu_negs
334
  { 1, 8, 9, 103, 105 }, // 11 IIC_fpu_sqrtd
335
  { 1, 8, 9, 105, 107 }, // 12 IIC_fpu_sqrts
336
  { 1, 8, 9, 107, 109 }, // 13 IIC_fpu_stod
337
  { 1, 9, 10, 109, 111 }, // 14 IIC_ldd
338
  { 1, 9, 10, 111, 113 }, // 15 IIC_iu_or_fpu_instr
339
  { 1, 7, 8, 113, 115 }, // 16 IIC_iu_div
340
  { 1, 7, 8, 115, 117 }, // 17 IIC_smac_umac
341
  { 1, 7, 8, 117, 119 }, // 18 IIC_iu_smul
342
  { 1, 9, 10, 119, 121 }, // 19 IIC_st
343
  { 1, 9, 10, 121, 123 }, // 20 IIC_std
344
  { 1, 7, 8, 123, 125 }, // 21 IIC_iu_umul
345
  { 0, uint16_t(~0U), uint16_t(~0U), uint16_t(~0U), uint16_t(~0U) }// end marker
346
};
347
348
// ===============================================================
349
// Data tables for the new per-operand machine model.
350
351
// {ProcResourceIdx, ReleaseAtCycle, AcquireAtCycle}
352
extern const llvm::MCWriteProcResEntry SparcWriteProcResTable[] = {
353
  { 0,  0,  0 }, // Invalid
354
}; // SparcWriteProcResTable
355
356
// {Cycles, WriteResourceID}
357
extern const llvm::MCWriteLatencyEntry SparcWriteLatencyTable[] = {
358
  { 0,  0}, // Invalid
359
}; // SparcWriteLatencyTable
360
361
// {UseIdx, WriteResourceID, Cycles}
362
extern const llvm::MCReadAdvanceEntry SparcReadAdvanceTable[] = {
363
  {0,  0,  0}, // Invalid
364
}; // SparcReadAdvanceTable
365
366
#undef DBGFIELD
367
368
static const llvm::MCSchedModel NoSchedModel = {
369
  MCSchedModel::DefaultIssueWidth,
370
  MCSchedModel::DefaultMicroOpBufferSize,
371
  MCSchedModel::DefaultLoopMicroOpBufferSize,
372
  MCSchedModel::DefaultLoadLatency,
373
  MCSchedModel::DefaultHighLatency,
374
  MCSchedModel::DefaultMispredictPenalty,
375
  false, // PostRAScheduler
376
  false, // CompleteModel
377
  false, // EnableIntervals
378
  0, // Processor ID
379
  nullptr, nullptr, 0, 0, // No instruction-level machine model.
380
  nullptr, // No Itinerary
381
  nullptr // No extra processor descriptor
382
};
383
384
static const llvm::MCSchedModel LEON2ItinerariesModel = {
385
  MCSchedModel::DefaultIssueWidth,
386
  MCSchedModel::DefaultMicroOpBufferSize,
387
  MCSchedModel::DefaultLoopMicroOpBufferSize,
388
  MCSchedModel::DefaultLoadLatency,
389
  MCSchedModel::DefaultHighLatency,
390
  MCSchedModel::DefaultMispredictPenalty,
391
  false, // PostRAScheduler
392
  false, // CompleteModel
393
  false, // EnableIntervals
394
  1, // Processor ID
395
  nullptr, nullptr, 0, 0, // No instruction-level machine model.
396
  LEON2Itineraries,
397
  nullptr // No extra processor descriptor
398
};
399
400
static const llvm::MCSchedModel LEON3ItinerariesModel = {
401
  MCSchedModel::DefaultIssueWidth,
402
  MCSchedModel::DefaultMicroOpBufferSize,
403
  MCSchedModel::DefaultLoopMicroOpBufferSize,
404
  MCSchedModel::DefaultLoadLatency,
405
  MCSchedModel::DefaultHighLatency,
406
  MCSchedModel::DefaultMispredictPenalty,
407
  false, // PostRAScheduler
408
  false, // CompleteModel
409
  false, // EnableIntervals
410
  2, // Processor ID
411
  nullptr, nullptr, 0, 0, // No instruction-level machine model.
412
  LEON3Itineraries,
413
  nullptr // No extra processor descriptor
414
};
415
416
static const llvm::MCSchedModel LEON4ItinerariesModel = {
417
  MCSchedModel::DefaultIssueWidth,
418
  MCSchedModel::DefaultMicroOpBufferSize,
419
  MCSchedModel::DefaultLoopMicroOpBufferSize,
420
  MCSchedModel::DefaultLoadLatency,
421
  MCSchedModel::DefaultHighLatency,
422
  MCSchedModel::DefaultMispredictPenalty,
423
  false, // PostRAScheduler
424
  false, // CompleteModel
425
  false, // EnableIntervals
426
  3, // Processor ID
427
  nullptr, nullptr, 0, 0, // No instruction-level machine model.
428
  LEON4Itineraries,
429
  nullptr // No extra processor descriptor
430
};
431
432
// Sorted (by key) array of values for CPU subtype.
433
extern const llvm::SubtargetSubTypeKV SparcSubTypeKV[] = {
434
 { "at697e", { { { 0x4004ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &LEON2ItinerariesModel },
435
 { "at697f", { { { 0x4004ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &LEON2ItinerariesModel },
436
 { "f934", { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
437
 { "generic", { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
438
 { "gr712rc", { { { 0x8004ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &LEON3ItinerariesModel },
439
 { "gr740", { { { 0x58024ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &LEON4ItinerariesModel },
440
 { "hypersparc", { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
441
 { "leon2", { { { 0x4ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &LEON2ItinerariesModel },
442
 { "leon3", { { { 0x40004ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &LEON3ItinerariesModel },
443
 { "leon4", { { { 0x48004ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &LEON4ItinerariesModel },
444
 { "ma2080", { { { 0x8004ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
445
 { "ma2085", { { { 0x8004ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
446
 { "ma2100", { { { 0x8004ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
447
 { "ma2150", { { { 0x8004ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
448
 { "ma2155", { { { 0x8004ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
449
 { "ma2450", { { { 0x8004ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
450
 { "ma2455", { { { 0x8004ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
451
 { "ma2480", { { { 0x8004ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
452
 { "ma2485", { { { 0x8004ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
453
 { "ma2x5x", { { { 0x8004ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
454
 { "ma2x8x", { { { 0x8004ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
455
 { "myriad2", { { { 0x8004ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
456
 { "myriad2.1", { { { 0x8004ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
457
 { "myriad2.2", { { { 0x8004ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
458
 { "myriad2.3", { { { 0x8004ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
459
 { "niagara", { { { 0xf00ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
460
 { "niagara2", { { { 0x80f00ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
461
 { "niagara3", { { { 0x80f00ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
462
 { "niagara4", { { { 0x81f00ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
463
 { "sparclet", { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
464
 { "sparclite", { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
465
 { "sparclite86x", { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
466
 { "supersparc", { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
467
 { "tsc701", { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
468
 { "ultrasparc", { { { 0x700ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x20000ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
469
 { "ultrasparc3", { { { 0xf00ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x20000ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
470
 { "ut699", { { { 0x601cULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &LEON3ItinerariesModel },
471
 { "v7", { { { 0x90ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
472
 { "v8", { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
473
 { "v9", { { { 0x200ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, { { { 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, 0x0ULL, } } }, &NoSchedModel },
474
};
475
476
namespace Sparc_MC {
477
unsigned resolveVariantSchedClassImpl(unsigned SchedClass,
478
0
    const MCInst *MI, const MCInstrInfo *MCII, unsigned CPUID) {
479
  // Don't know how to resolve this scheduling class.
480
0
  return 0;
481
0
}
482
} // end namespace Sparc_MC
483
484
struct SparcGenMCSubtargetInfo : public MCSubtargetInfo {
485
  SparcGenMCSubtargetInfo(const Triple &TT,
486
    StringRef CPU, StringRef TuneCPU, StringRef FS,
487
    ArrayRef<SubtargetFeatureKV> PF,
488
    ArrayRef<SubtargetSubTypeKV> PD,
489
    const MCWriteProcResEntry *WPR,
490
    const MCWriteLatencyEntry *WL,
491
    const MCReadAdvanceEntry *RA, const InstrStage *IS,
492
    const unsigned *OC, const unsigned *FP) :
493
      MCSubtargetInfo(TT, CPU, TuneCPU, FS, PF, PD,
494
0
                      WPR, WL, RA, IS, OC, FP) { }
495
496
  unsigned resolveVariantSchedClass(unsigned SchedClass,
497
      const MCInst *MI, const MCInstrInfo *MCII,
498
0
      unsigned CPUID) const override {
499
0
    return Sparc_MC::resolveVariantSchedClassImpl(SchedClass, MI, MCII, CPUID);
500
0
  }
501
};
502
503
0
static inline MCSubtargetInfo *createSparcMCSubtargetInfoImpl(const Triple &TT, StringRef CPU, StringRef TuneCPU, StringRef FS) {
504
0
  return new SparcGenMCSubtargetInfo(TT, CPU, TuneCPU, FS, SparcFeatureKV, SparcSubTypeKV, 
505
0
                      SparcWriteProcResTable, SparcWriteLatencyTable, SparcReadAdvanceTable, 
506
0
                      SparcStages, SparcOperandCycles, SparcForwardingPaths);
507
0
}
508
509
} // end namespace llvm
510
511
#endif // GET_SUBTARGETINFO_MC_DESC
512
513
514
#ifdef GET_SUBTARGETINFO_TARGET_DESC
515
#undef GET_SUBTARGETINFO_TARGET_DESC
516
517
#include "llvm/Support/Debug.h"
518
#include "llvm/Support/raw_ostream.h"
519
520
// ParseSubtargetFeatures - Parses features string setting specified
521
// subtarget options.
522
0
void llvm::SparcSubtarget::ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS) {
523
0
  LLVM_DEBUG(dbgs() << "\nFeatures:" << FS);
524
0
  LLVM_DEBUG(dbgs() << "\nCPU:" << CPU);
525
0
  LLVM_DEBUG(dbgs() << "\nTuneCPU:" << TuneCPU << "\n\n");
526
0
  InitMCProcessorInfo(CPU, TuneCPU, FS);
527
0
  const FeatureBitset &Bits = getFeatureBits();
528
0
  if (Bits[Sparc::DetectRoundChange]) DetectRoundChange = true;
529
0
  if (Bits[Sparc::FeatureHardQuad]) HasHardQuad = true;
530
0
  if (Bits[Sparc::FeatureLeon]) IsLeon = true;
531
0
  if (Bits[Sparc::FeatureNoFMULS]) HasNoFMULS = true;
532
0
  if (Bits[Sparc::FeatureNoFSMULD]) HasNoFSMULD = true;
533
0
  if (Bits[Sparc::FeaturePWRPSR]) HasPWRPSR = true;
534
0
  if (Bits[Sparc::FeatureSoftFloat]) UseSoftFloat = true;
535
0
  if (Bits[Sparc::FeatureSoftMulDiv]) UseSoftMulDiv = true;
536
0
  if (Bits[Sparc::FeatureV8Deprecated]) UseV8DeprecatedInsts = true;
537
0
  if (Bits[Sparc::FeatureV9]) IsV9 = true;
538
0
  if (Bits[Sparc::FeatureVIS]) IsVIS = true;
539
0
  if (Bits[Sparc::FeatureVIS2]) IsVIS2 = true;
540
0
  if (Bits[Sparc::FeatureVIS3]) IsVIS3 = true;
541
0
  if (Bits[Sparc::FixAllFDIVSQRT]) FixAllFDIVSQRT = true;
542
0
  if (Bits[Sparc::InsertNOPLoad]) InsertNOPLoad = true;
543
0
  if (Bits[Sparc::LeonCASA]) HasLeonCasa = true;
544
0
  if (Bits[Sparc::LeonCycleCounter]) HasLeonCycleCounter = true;
545
0
  if (Bits[Sparc::TuneSlowRDPC]) HasSlowRDPC = true;
546
0
  if (Bits[Sparc::UMACSMACSupport]) HasUmacSmac = true;
547
0
  if (Bits[Sparc::UsePopc]) UsePopc = true;
548
0
}
549
#endif // GET_SUBTARGETINFO_TARGET_DESC
550
551
552
#ifdef GET_SUBTARGETINFO_HEADER
553
#undef GET_SUBTARGETINFO_HEADER
554
555
namespace llvm {
556
class DFAPacketizer;
557
namespace Sparc_MC {
558
unsigned resolveVariantSchedClassImpl(unsigned SchedClass, const MCInst *MI, const MCInstrInfo *MCII, unsigned CPUID);
559
} // end namespace Sparc_MC
560
561
struct SparcGenSubtargetInfo : public TargetSubtargetInfo {
562
  explicit SparcGenSubtargetInfo(const Triple &TT, StringRef CPU, StringRef TuneCPU, StringRef FS);
563
public:
564
  unsigned resolveSchedClass(unsigned SchedClass,  const MachineInstr *DefMI, const TargetSchedModel *SchedModel) const override;
565
  unsigned resolveVariantSchedClass(unsigned SchedClass, const MCInst *MI, const MCInstrInfo *MCII, unsigned CPUID) const override;
566
  DFAPacketizer *createDFAPacketizer(const InstrItineraryData *IID) const;
567
};
568
} // end namespace llvm
569
570
#endif // GET_SUBTARGETINFO_HEADER
571
572
573
#ifdef GET_SUBTARGETINFO_CTOR
574
#undef GET_SUBTARGETINFO_CTOR
575
576
#include "llvm/CodeGen/TargetSchedule.h"
577
578
namespace llvm {
579
extern const llvm::SubtargetFeatureKV SparcFeatureKV[];
580
extern const llvm::SubtargetSubTypeKV SparcSubTypeKV[];
581
extern const llvm::MCWriteProcResEntry SparcWriteProcResTable[];
582
extern const llvm::MCWriteLatencyEntry SparcWriteLatencyTable[];
583
extern const llvm::MCReadAdvanceEntry SparcReadAdvanceTable[];
584
extern const llvm::InstrStage SparcStages[];
585
extern const unsigned SparcOperandCycles[];
586
extern const unsigned SparcForwardingPaths[];
587
SparcGenSubtargetInfo::SparcGenSubtargetInfo(const Triple &TT, StringRef CPU, StringRef TuneCPU, StringRef FS)
588
  : TargetSubtargetInfo(TT, CPU, TuneCPU, FS, ArrayRef(SparcFeatureKV, 20), ArrayRef(SparcSubTypeKV, 40), 
589
                        SparcWriteProcResTable, SparcWriteLatencyTable, SparcReadAdvanceTable, 
590
0
                        SparcStages, SparcOperandCycles, SparcForwardingPaths) {}
591
592
unsigned SparcGenSubtargetInfo
593
0
::resolveSchedClass(unsigned SchedClass, const MachineInstr *MI, const TargetSchedModel *SchedModel) const {
594
0
  report_fatal_error("Expected a variant SchedClass");
595
0
} // SparcGenSubtargetInfo::resolveSchedClass
596
597
unsigned SparcGenSubtargetInfo
598
0
::resolveVariantSchedClass(unsigned SchedClass, const MCInst *MI, const MCInstrInfo *MCII, unsigned CPUID) const {
599
0
  return Sparc_MC::resolveVariantSchedClassImpl(SchedClass, MI, MCII, CPUID);
600
0
} // SparcGenSubtargetInfo::resolveVariantSchedClass
601
602
} // end namespace llvm
603
604
#endif // GET_SUBTARGETINFO_CTOR
605
606
607
#ifdef GET_STIPREDICATE_DECLS_FOR_MC_ANALYSIS
608
#undef GET_STIPREDICATE_DECLS_FOR_MC_ANALYSIS
609
610
#endif // GET_STIPREDICATE_DECLS_FOR_MC_ANALYSIS
611
612
613
#ifdef GET_STIPREDICATE_DEFS_FOR_MC_ANALYSIS
614
#undef GET_STIPREDICATE_DEFS_FOR_MC_ANALYSIS
615
616
#endif // GET_STIPREDICATE_DEFS_FOR_MC_ANALYSIS
617