1//===-- Hexagon.td - Describe the Hexagon Target Machine --*- tablegen -*--===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This is the top level entry point for the Hexagon target.
10//
11//===----------------------------------------------------------------------===//
12
13//===----------------------------------------------------------------------===//
14// Target-independent interfaces which we are implementing
15//===----------------------------------------------------------------------===//
16
17include "llvm/Target/Target.td"
18
19//===----------------------------------------------------------------------===//
20// Hexagon Subtarget features.
21//===----------------------------------------------------------------------===//
22
23// Hexagon Architectures
24include "HexagonDepArch.td"
25
26def ProcTinyCore: SubtargetFeature<"tinycore", "HexagonProcFamily",
27      "TinyCore", "Hexagon Tiny Core">;
28
29// Hexagon ISA Extensions
30def ExtensionZReg: SubtargetFeature<"zreg", "UseZRegOps", "true",
31      "Hexagon ZReg extension instructions">;
32def ExtensionHVXQFloat: SubtargetFeature<"hvx-qfloat", "UseHVXQFloatOps",
33      "true", "Hexagon HVX QFloating point instructions">;
34
35def ExtensionHVX: SubtargetFeature<"hvx", "HexagonHVXVersion",
36      "Hexagon::ArchEnum::V60", "Hexagon HVX instructions">;
37def ExtensionHVXV60: SubtargetFeature<"hvxv60", "HexagonHVXVersion",
38      "Hexagon::ArchEnum::V60", "Hexagon HVX instructions",
39      [ExtensionHVX]>;
40def ExtensionHVXV62: SubtargetFeature<"hvxv62", "HexagonHVXVersion",
41      "Hexagon::ArchEnum::V62", "Hexagon HVX instructions",
42      [ExtensionHVX, ExtensionHVXV60]>;
43def ExtensionHVXV65: SubtargetFeature<"hvxv65", "HexagonHVXVersion",
44      "Hexagon::ArchEnum::V65", "Hexagon HVX instructions",
45      [ExtensionHVX, ExtensionHVXV60, ExtensionHVXV62]>;
46def ExtensionHVXV66: SubtargetFeature<"hvxv66", "HexagonHVXVersion",
47      "Hexagon::ArchEnum::V66", "Hexagon HVX instructions",
48      [ExtensionHVX, ExtensionHVXV60, ExtensionHVXV62, ExtensionHVXV65,
49       ExtensionZReg]>;
50def ExtensionHVXV67: SubtargetFeature<"hvxv67", "HexagonHVXVersion",
51      "Hexagon::ArchEnum::V67", "Hexagon HVX instructions",
52      [ExtensionHVXV60, ExtensionHVXV62, ExtensionHVXV65, ExtensionHVXV66]>;
53def ExtensionHVXV68: SubtargetFeature<"hvxv68", "HexagonHVXVersion",
54      "Hexagon::ArchEnum::V68", "Hexagon HVX instructions",
55      [ExtensionHVXV60, ExtensionHVXV62, ExtensionHVXV65, ExtensionHVXV66,
56       ExtensionHVXV67]>;
57def ExtensionHVXV69: SubtargetFeature<"hvxv69", "HexagonHVXVersion",
58      "Hexagon::ArchEnum::V69", "Hexagon HVX instructions",
59      [ExtensionHVXV60, ExtensionHVXV62, ExtensionHVXV65, ExtensionHVXV66,
60       ExtensionHVXV67, ExtensionHVXV68]>;
61def ExtensionHVXV71: SubtargetFeature<"hvxv71", "HexagonHVXVersion",
62      "Hexagon::ArchEnum::V71", "Hexagon HVX instructions",
63      [ExtensionHVXV60, ExtensionHVXV62, ExtensionHVXV65, ExtensionHVXV66,
64       ExtensionHVXV67, ExtensionHVXV68, ExtensionHVXV69]>;
65def ExtensionHVXV73: SubtargetFeature<"hvxv73", "HexagonHVXVersion",
66      "Hexagon::ArchEnum::V73", "Hexagon HVX instructions",
67      [ExtensionHVXV60, ExtensionHVXV62, ExtensionHVXV65, ExtensionHVXV66,
68       ExtensionHVXV67, ExtensionHVXV68, ExtensionHVXV69, ExtensionHVXV71]>;
69
70def ExtensionHVX64B: SubtargetFeature<"hvx-length64b", "UseHVX64BOps",
71      "true", "Hexagon HVX 64B instructions", [ExtensionHVX]>;
72def ExtensionHVX128B: SubtargetFeature<"hvx-length128b", "UseHVX128BOps",
73      "true", "Hexagon HVX 128B instructions", [ExtensionHVX]>;
74
75def ExtensionAudio: SubtargetFeature<"audio", "UseAudioOps", "true",
76      "Hexagon Audio extension instructions">;
77
78def ExtensionHVXIEEEFP: SubtargetFeature<"hvx-ieee-fp", "UseHVXIEEEFPOps",
79      "true", "Hexagon HVX IEEE floating point instructions">;
80
81def FeatureCompound: SubtargetFeature<"compound", "UseCompound", "true",
82      "Use compound instructions">;
83def FeaturePackets: SubtargetFeature<"packets", "UsePackets", "true",
84      "Support for instruction packets">;
85def FeaturePreV65: SubtargetFeature<"prev65", "HasPreV65", "true",
86      "Support features deprecated in v65">;
87def FeatureLongCalls: SubtargetFeature<"long-calls", "UseLongCalls", "true",
88      "Use constant-extended calls">;
89def FeatureMemNoShuf: SubtargetFeature<"mem_noshuf", "HasMemNoShuf", "false",
90      "Supports mem_noshuf feature">;
91def FeatureMemops: SubtargetFeature<"memops", "UseMemops", "true",
92      "Use memop instructions">;
93def FeatureNVJ: SubtargetFeature<"nvj", "UseNewValueJumps", "true",
94      "Support for new-value jumps", [FeaturePackets]>;
95def FeatureNVS: SubtargetFeature<"nvs", "UseNewValueStores", "true",
96      "Support for new-value stores", [FeaturePackets]>;
97def FeatureSmallData: SubtargetFeature<"small-data", "UseSmallData", "true",
98      "Allow GP-relative addressing of global variables">;
99def FeatureDuplex: SubtargetFeature<"duplex", "EnableDuplex", "true",
100      "Enable generation of duplex instruction">;
101def FeatureUnsafeFP: SubtargetFeature<"unsafe-fp", "UseUnsafeMath", "true",
102      "Use unsafe FP math">;
103def FeatureReservedR19: SubtargetFeature<"reserved-r19", "ReservedR19",
104      "true", "Reserve register R19">;
105def FeatureNoreturnStackElim: SubtargetFeature<"noreturn-stack-elim",
106      "NoreturnStackElim", "true",
107      "Eliminate stack allocation in a noreturn function when possible">;
108def FeatureCabac: SubtargetFeature<"cabac", "UseCabac", "false",
109      "Emit the CABAC instruction">;
110
111//===----------------------------------------------------------------------===//
112// Hexagon Instruction Predicate Definitions.
113//===----------------------------------------------------------------------===//
114
115def UseMEMOPS          : Predicate<"HST->useMemops()">;
116def UseHVX64B          : Predicate<"HST->useHVX64BOps()">,
117                         AssemblerPredicate<(all_of ExtensionHVX64B)>;
118def UseHVX128B         : Predicate<"HST->useHVX128BOps()">,
119                         AssemblerPredicate<(all_of ExtensionHVX128B)>;
120def UseHVX             : Predicate<"HST->useHVXOps()">,
121                         AssemblerPredicate<(all_of ExtensionHVXV60)>;
122def UseHVXV60          : Predicate<"HST->useHVXV60Ops()">,
123                         AssemblerPredicate<(all_of ExtensionHVXV60)>;
124def UseHVXV62          : Predicate<"HST->useHVXV62Ops()">,
125                         AssemblerPredicate<(all_of ExtensionHVXV62)>;
126def UseHVXV65          : Predicate<"HST->useHVXV65Ops()">,
127                         AssemblerPredicate<(all_of ExtensionHVXV65)>;
128def UseHVXV66          : Predicate<"HST->useHVXV66Ops()">,
129                         AssemblerPredicate<(all_of ExtensionHVXV66)>;
130def UseHVXV67          : Predicate<"HST->useHVXV67Ops()">,
131                         AssemblerPredicate<(all_of ExtensionHVXV67)>;
132def UseHVXV68          : Predicate<"HST->useHVXV68Ops()">,
133                         AssemblerPredicate<(all_of ExtensionHVXV68)>;
134def UseHVXV69          : Predicate<"HST->useHVXV69Ops()">,
135                         AssemblerPredicate<(all_of ExtensionHVXV69)>;
136def UseHVXV71          : Predicate<"HST->useHVXV71Ops()">,
137                         AssemblerPredicate<(all_of ExtensionHVXV71)>;
138def UseHVXV73          : Predicate<"HST->useHVXV73Ops()">,
139                         AssemblerPredicate<(all_of ExtensionHVXV73)>;
140def UseAudio           : Predicate<"HST->useAudioOps()">,
141                         AssemblerPredicate<(all_of ExtensionAudio)>;
142def UseZReg            : Predicate<"HST->useZRegOps()">,
143                         AssemblerPredicate<(all_of ExtensionZReg)>;
144def UseCompound        : Predicate<"HST->useCompound()">;
145def HasPreV65          : Predicate<"HST->hasPreV65()">,
146                         AssemblerPredicate<(all_of FeaturePreV65)>;
147def UseHVXIEEEFP       : Predicate<"HST->useHVXIEEEFPOps()">,
148                         AssemblerPredicate<(all_of ExtensionHVXIEEEFP)>;
149def UseHVXQFloat       : Predicate<"HST->useHVXQFloatOps()">,
150                         AssemblerPredicate<(all_of ExtensionHVXQFloat)>;
151def UseHVXFloatingPoint: Predicate<"HST->useHVXFloatingPoint()">;
152def HasMemNoShuf       : Predicate<"HST->hasMemNoShuf()">,
153                         AssemblerPredicate<(all_of FeatureMemNoShuf)>;
154def UseUnsafeMath      : Predicate<"HST->useUnsafeMath()">;
155def NotOptTinyCore     : Predicate<"!HST->isTinyCore() ||"
156                                   "MF->getFunction().hasOptSize()"> {
157  let RecomputePerFunction = 1;
158}
159def UseSmallData       : Predicate<"HST->useSmallData()">;
160def UseCabac           : Predicate<"HST->useCabac()">,
161                         AssemblerPredicate<(any_of FeatureCabac)>;
162
163def Hvx64:  HwMode<"+hvx-length64b", [UseHVX64B]>;
164def Hvx128: HwMode<"+hvx-length128b", [UseHVX128B]>;
165
166//===----------------------------------------------------------------------===//
167// Classes used for relation maps.
168//===----------------------------------------------------------------------===//
169
170// The classes below should remain in hierarchical order...
171class ImmRegShl;
172// ImmRegRel - Filter class used to relate instructions having reg-reg form
173// with their reg-imm counterparts.
174class ImmRegRel;
175// PredRel - Filter class used to relate non-predicated instructions with their
176// predicated forms.
177class PredRel;
178class PredNewRel: PredRel;
179// NewValueRel - Filter class used to relate regular store instructions with
180// their new-value store form.
181class NewValueRel: PredNewRel;
182class AddrModeRel: NewValueRel;
183class PostInc_BaseImm;
184class IntrinsicsRel;
185// ... through here.
186
187//===----------------------------------------------------------------------===//
188// Generate mapping table to relate non-predicate instructions with their
189// predicated formats - true and false.
190//
191
192def getPredOpcode : InstrMapping {
193  let FilterClass = "PredRel";
194  // Instructions with the same BaseOpcode and isNVStore values form a row.
195  let RowFields = ["BaseOpcode", "isNVStore", "PNewValue", "isBrTaken", "isNT"];
196  // Instructions with the same predicate sense form a column.
197  let ColFields = ["PredSense"];
198  // The key column is the unpredicated instructions.
199  let KeyCol = [""];
200  // Value columns are PredSense=true and PredSense=false
201  let ValueCols = [["true"], ["false"]];
202}
203
204//===----------------------------------------------------------------------===//
205// Generate mapping table to relate predicate-true instructions with their
206// predicate-false forms
207//
208def getFalsePredOpcode : InstrMapping {
209  let FilterClass = "PredRel";
210  let RowFields = ["BaseOpcode", "PNewValue", "isNVStore", "isBrTaken", "isNT"];
211  let ColFields = ["PredSense"];
212  let KeyCol = ["true"];
213  let ValueCols = [["false"]];
214}
215
216//===----------------------------------------------------------------------===//
217// Generate mapping table to relate predicate-false instructions with their
218// predicate-true forms
219//
220def getTruePredOpcode : InstrMapping {
221  let FilterClass = "PredRel";
222  let RowFields = ["BaseOpcode", "PNewValue", "isNVStore", "isBrTaken", "isNT"];
223  let ColFields = ["PredSense"];
224  let KeyCol = ["false"];
225  let ValueCols = [["true"]];
226}
227
228//===----------------------------------------------------------------------===//
229// Generate mapping table to relate predicated instructions with their .new
230// format.
231//
232def getPredNewOpcode : InstrMapping {
233  let FilterClass = "PredNewRel";
234  let RowFields = ["BaseOpcode", "PredSense", "isNVStore", "isBrTaken"];
235  let ColFields = ["PNewValue"];
236  let KeyCol = [""];
237  let ValueCols = [["new"]];
238}
239
240//===----------------------------------------------------------------------===//
241// Generate mapping table to relate .new predicated instructions with their old
242// format.
243//
244def getPredOldOpcode : InstrMapping {
245  let FilterClass = "PredNewRel";
246  let RowFields = ["BaseOpcode", "PredSense", "isNVStore", "isBrTaken"];
247  let ColFields = ["PNewValue"];
248  let KeyCol = ["new"];
249  let ValueCols = [[""]];
250}
251
252//===----------------------------------------------------------------------===//
253// Generate mapping table to relate store instructions with their new-value
254// format.
255//
256def getNewValueOpcode : InstrMapping {
257  let FilterClass = "NewValueRel";
258  let RowFields = ["BaseOpcode", "PredSense", "PNewValue", "addrMode", "isNT"];
259  let ColFields = ["NValueST"];
260  let KeyCol = ["false"];
261  let ValueCols = [["true"]];
262}
263
264//===----------------------------------------------------------------------===//
265// Generate mapping table to relate new-value store instructions with their old
266// format.
267//
268def getNonNVStore : InstrMapping {
269  let FilterClass = "NewValueRel";
270  let RowFields = ["BaseOpcode", "PredSense", "PNewValue", "addrMode", "isNT"];
271  let ColFields = ["NValueST"];
272  let KeyCol = ["true"];
273  let ValueCols = [["false"]];
274}
275
276def changeAddrMode_abs_io: InstrMapping {
277  let FilterClass = "AddrModeRel";
278  let RowFields = ["CextOpcode", "PredSense", "PNewValue", "isNVStore",
279                   "isFloat"];
280  let ColFields = ["addrMode"];
281  let KeyCol = ["Absolute"];
282  let ValueCols = [["BaseImmOffset"]];
283}
284
285def changeAddrMode_io_abs: InstrMapping {
286  let FilterClass = "AddrModeRel";
287  let RowFields = ["CextOpcode", "PredSense", "PNewValue", "isNVStore",
288                   "isFloat"];
289  let ColFields = ["addrMode"];
290  let KeyCol = ["BaseImmOffset"];
291  let ValueCols = [["Absolute"]];
292}
293
294def changeAddrMode_io_rr: InstrMapping {
295  let FilterClass = "AddrModeRel";
296  let RowFields = ["CextOpcode", "PredSense", "PNewValue", "isNVStore"];
297  let ColFields = ["addrMode"];
298  let KeyCol = ["BaseImmOffset"];
299  let ValueCols = [["BaseRegOffset"]];
300}
301
302def changeAddrMode_rr_io: InstrMapping {
303  let FilterClass = "AddrModeRel";
304  let RowFields = ["CextOpcode", "PredSense", "PNewValue", "isNVStore"];
305  let ColFields = ["addrMode"];
306  let KeyCol = ["BaseRegOffset"];
307  let ValueCols = [["BaseImmOffset"]];
308}
309
310def changeAddrMode_pi_io: InstrMapping {
311  let FilterClass = "PostInc_BaseImm";
312  let RowFields = ["CextOpcode", "PredSense", "PNewValue", "isNVStore"];
313  let ColFields = ["addrMode"];
314  let KeyCol = ["PostInc"];
315  let ValueCols = [["BaseImmOffset"]];
316}
317
318def changeAddrMode_io_pi: InstrMapping {
319  let FilterClass = "PostInc_BaseImm";
320  let RowFields = ["CextOpcode", "PredSense", "PNewValue", "isNVStore"];
321  let ColFields = ["addrMode"];
322  let KeyCol = ["BaseImmOffset"];
323  let ValueCols = [["PostInc"]];
324}
325
326def changeAddrMode_rr_ur: InstrMapping {
327  let FilterClass = "ImmRegShl";
328  let RowFields = ["CextOpcode", "PredSense", "PNewValue", "isNVStore"];
329  let ColFields = ["addrMode"];
330  let KeyCol = ["BaseRegOffset"];
331  let ValueCols = [["BaseLongOffset"]];
332}
333
334def changeAddrMode_ur_rr: InstrMapping {
335  let FilterClass = "ImmRegShl";
336  let RowFields = ["CextOpcode", "PredSense", "PNewValue", "isNVStore"];
337  let ColFields = ["addrMode"];
338  let KeyCol = ["BaseLongOffset"];
339  let ValueCols = [["BaseRegOffset"]];
340}
341
342def getRegForm : InstrMapping {
343  let FilterClass = "ImmRegRel";
344  let RowFields = ["CextOpcode", "PredSense", "PNewValue"];
345  let ColFields = ["InputType"];
346  let KeyCol = ["imm"];
347  let ValueCols = [["reg"]];
348}
349
350def notTakenBranchPrediction : InstrMapping {
351  let FilterClass = "PredRel";
352  let RowFields = ["BaseOpcode", "PNewValue",  "PredSense", "isBranch", "isPredicated"];
353  let ColFields = ["isBrTaken"];
354  let KeyCol = ["true"];
355  let ValueCols = [["false"]];
356}
357
358def takenBranchPrediction : InstrMapping {
359  let FilterClass = "PredRel";
360  let RowFields = ["BaseOpcode", "PNewValue",  "PredSense", "isBranch", "isPredicated"];
361  let ColFields = ["isBrTaken"];
362  let KeyCol = ["false"];
363  let ValueCols = [["true"]];
364}
365
366def getRealHWInstr : InstrMapping {
367  let FilterClass = "IntrinsicsRel";
368  let RowFields = ["BaseOpcode"];
369  let ColFields = ["InstrType"];
370  let KeyCol = ["Pseudo"];
371  let ValueCols = [["Pseudo"], ["Real"]];
372}
373//===----------------------------------------------------------------------===//
374// Register File, Instruction Descriptions
375//===----------------------------------------------------------------------===//
376include "HexagonSchedule.td"
377include "HexagonRegisterInfo.td"
378include "HexagonOperands.td"
379include "HexagonDepOperands.td"
380include "HexagonDepITypes.td"
381include "HexagonInstrFormats.td"
382include "HexagonDepInstrFormats.td"
383include "HexagonDepInstrInfo.td"
384include "HexagonCallingConv.td"
385include "HexagonPseudo.td"
386include "HexagonPatterns.td"
387include "HexagonPatternsHVX.td"
388include "HexagonPatternsV65.td"
389include "HexagonDepMappings.td"
390include "HexagonIntrinsics.td"
391
392def HexagonInstrInfo : InstrInfo;
393
394//===----------------------------------------------------------------------===//
395// Hexagon processors supported.
396//===----------------------------------------------------------------------===//
397
398class Proc<string Name, SchedMachineModel Model,
399           list<SubtargetFeature> Features>
400 : ProcessorModel<Name, Model, Features>;
401
402def : Proc<"generic", HexagonModelV60,
403           [ArchV5, ArchV55, ArchV60,
404            FeatureCompound, FeatureDuplex, FeaturePreV65, FeatureMemops,
405            FeatureNVJ, FeatureNVS, FeaturePackets, FeatureSmallData,
406            FeatureCabac]>;
407def : Proc<"hexagonv5",  HexagonModelV5,
408           [ArchV5,
409            FeatureCompound, FeatureDuplex, FeaturePreV65, FeatureMemops,
410            FeatureNVJ, FeatureNVS, FeaturePackets, FeatureSmallData,
411            FeatureCabac]>;
412def : Proc<"hexagonv55", HexagonModelV55,
413           [ArchV5, ArchV55,
414            FeatureCompound, FeatureDuplex, FeaturePreV65, FeatureMemops,
415            FeatureNVJ, FeatureNVS, FeaturePackets, FeatureSmallData,
416            FeatureCabac]>;
417def : Proc<"hexagonv60", HexagonModelV60,
418           [ArchV5, ArchV55, ArchV60,
419            FeatureCompound, FeatureDuplex, FeaturePreV65, FeatureMemops,
420            FeatureNVJ, FeatureNVS, FeaturePackets, FeatureSmallData,
421            FeatureCabac]>;
422def : Proc<"hexagonv62", HexagonModelV62,
423           [ArchV5, ArchV55, ArchV60, ArchV62,
424            FeatureCompound, FeatureDuplex, FeaturePreV65, FeatureMemops,
425            FeatureNVJ, FeatureNVS, FeaturePackets, FeatureSmallData,
426            FeatureCabac]>;
427def : Proc<"hexagonv65", HexagonModelV65,
428           [ArchV5, ArchV55, ArchV60, ArchV62, ArchV65,
429            FeatureCompound, FeatureDuplex, FeatureMemNoShuf, FeatureMemops,
430            FeatureNVJ, FeatureNVS, FeaturePackets, FeatureSmallData,
431            FeatureCabac]>;
432def : Proc<"hexagonv66", HexagonModelV66,
433           [ArchV5, ArchV55, ArchV60, ArchV62, ArchV65, ArchV66,
434            FeatureCompound, FeatureDuplex, FeatureMemNoShuf, FeatureMemops,
435            FeatureNVJ, FeatureNVS, FeaturePackets, FeatureSmallData,
436            FeatureCabac]>;
437def : Proc<"hexagonv67", HexagonModelV67,
438           [ArchV5, ArchV55, ArchV60, ArchV62, ArchV65, ArchV66, ArchV67,
439            FeatureCompound, FeatureDuplex, FeatureMemNoShuf, FeatureMemops,
440            FeatureNVJ, FeatureNVS, FeaturePackets, FeatureSmallData,
441            FeatureCabac]>;
442def : Proc<"hexagonv68", HexagonModelV68,
443           [ArchV5, ArchV55, ArchV60, ArchV62, ArchV65, ArchV66, ArchV67,
444            ArchV68,
445            FeatureCompound, FeatureDuplex, FeatureMemNoShuf, FeatureMemops,
446            FeatureNVJ, FeatureNVS, FeaturePackets, FeatureSmallData,
447            FeatureCabac]>;
448def : Proc<"hexagonv69", HexagonModelV69,
449           [ArchV5, ArchV55, ArchV60, ArchV62, ArchV65, ArchV66, ArchV67,
450            ArchV68, ArchV69,
451            FeatureCompound, FeatureDuplex, FeatureMemNoShuf, FeatureMemops,
452            FeatureNVJ, FeatureNVS, FeaturePackets, FeatureSmallData,
453            FeatureCabac]>;
454def : Proc<"hexagonv71", HexagonModelV71,
455           [ArchV5, ArchV55, ArchV60, ArchV62, ArchV65, ArchV66, ArchV67,
456            ArchV68, ArchV69, ArchV71,
457            FeatureCompound, FeatureDuplex, FeatureMemNoShuf, FeatureMemops,
458            FeatureNVJ, FeatureNVS, FeaturePackets, FeatureSmallData,
459            FeatureCabac]>;
460def : Proc<"hexagonv73", HexagonModelV73,
461           [ArchV5, ArchV55, ArchV60, ArchV62, ArchV65, ArchV66, ArchV67,
462            ArchV68, ArchV69, ArchV71, ArchV73,
463            FeatureCompound, FeatureDuplex, FeatureMemNoShuf, FeatureMemops,
464            FeatureNVJ, FeatureNVS, FeaturePackets, FeatureSmallData]>;
465// Need to update the correct features for tiny core.
466// Disable NewValueJumps since the packetizer is unable to handle a packet with
467// a new value jump and another SLOT0 instruction.
468def : Proc<"hexagonv67t", HexagonModelV67T,
469           [ArchV5, ArchV55, ArchV60, ArchV62, ArchV65, ArchV66, ArchV67,
470            ProcTinyCore, ExtensionAudio,
471            FeatureCompound, FeatureMemNoShuf, FeatureMemops,
472            FeatureNVS, FeaturePackets, FeatureSmallData]>;
473
474def : Proc<"hexagonv71t", HexagonModelV71T,
475           [ArchV5, ArchV55, ArchV60, ArchV62, ArchV65, ArchV66, ArchV67,
476            ArchV68, ArchV69, ArchV71,
477            ProcTinyCore, ExtensionAudio,
478            FeatureCompound, FeatureMemNoShuf, FeatureMemops,
479            FeatureNVS, FeaturePackets, FeatureSmallData]>;
480
481//===----------------------------------------------------------------------===//
482// Declare the target which we are implementing
483//===----------------------------------------------------------------------===//
484
485def HexagonAsmParser : AsmParser {
486  let ShouldEmitMatchRegisterAltName = 1;
487  bit HasMnemonicFirst = 0;
488}
489
490def HexagonAsmParserVariant : AsmParserVariant {
491  int Variant = 0;
492  string TokenizingCharacters = "#()=:.<>!+*-|^&";
493  string BreakCharacters = "";
494}
495
496def HexagonAsmWriter : AsmWriter {
497  string AsmWriterClassName  = "InstPrinter";
498  bit isMCAsmWriter = 1;
499}
500
501def Hexagon : Target {
502  let InstructionSet = HexagonInstrInfo;
503  let AssemblyParsers = [HexagonAsmParser];
504  let AssemblyParserVariants = [HexagonAsmParserVariant];
505  let AssemblyWriters = [HexagonAsmWriter];
506  let AllowRegisterRenaming = 1;
507}
508