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