1 //===--- AArch64Subtarget.h - Define Subtarget for the AArch64 -*- C++ -*--===// 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 file declares the AArch64 specific subclass of TargetSubtarget. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_LIB_TARGET_AARCH64_AARCH64SUBTARGET_H 14 #define LLVM_LIB_TARGET_AARCH64_AARCH64SUBTARGET_H 15 16 #include "AArch64FrameLowering.h" 17 #include "AArch64ISelLowering.h" 18 #include "AArch64InstrInfo.h" 19 #include "AArch64RegisterInfo.h" 20 #include "AArch64SelectionDAGInfo.h" 21 #include "llvm/CodeGen/GlobalISel/CallLowering.h" 22 #include "llvm/CodeGen/GlobalISel/InlineAsmLowering.h" 23 #include "llvm/CodeGen/GlobalISel/InstructionSelector.h" 24 #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h" 25 #include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h" 26 #include "llvm/CodeGen/TargetSubtargetInfo.h" 27 #include "llvm/IR/DataLayout.h" 28 #include <string> 29 30 #define GET_SUBTARGETINFO_HEADER 31 #include "AArch64GenSubtargetInfo.inc" 32 33 namespace llvm { 34 class GlobalValue; 35 class StringRef; 36 class Triple; 37 38 class AArch64Subtarget final : public AArch64GenSubtargetInfo { 39 public: 40 enum ARMProcFamilyEnum : uint8_t { 41 Others, 42 A64FX, 43 AppleA7, 44 AppleA10, 45 AppleA11, 46 AppleA12, 47 AppleA13, 48 AppleA14, 49 Carmel, 50 CortexA35, 51 CortexA53, 52 CortexA55, 53 CortexA57, 54 CortexA65, 55 CortexA72, 56 CortexA73, 57 CortexA75, 58 CortexA76, 59 CortexA77, 60 CortexA78, 61 CortexA78C, 62 CortexR82, 63 CortexX1, 64 ExynosM3, 65 Falkor, 66 Kryo, 67 NeoverseE1, 68 NeoverseN1, 69 NeoverseN2, 70 NeoverseV1, 71 Saphira, 72 ThunderX2T99, 73 ThunderX, 74 ThunderXT81, 75 ThunderXT83, 76 ThunderXT88, 77 ThunderX3T110, 78 TSV110 79 }; 80 81 protected: 82 /// ARMProcFamily - ARM processor family: Cortex-A53, Cortex-A57, and others. 83 ARMProcFamilyEnum ARMProcFamily = Others; 84 85 bool HasV8_1aOps = false; 86 bool HasV8_2aOps = false; 87 bool HasV8_3aOps = false; 88 bool HasV8_4aOps = false; 89 bool HasV8_5aOps = false; 90 bool HasV8_6aOps = false; 91 bool HasV8_7aOps = false; 92 93 bool HasV8_0rOps = false; 94 bool HasCONTEXTIDREL2 = false; 95 96 bool HasFPARMv8 = false; 97 bool HasNEON = false; 98 bool HasCrypto = false; 99 bool HasDotProd = false; 100 bool HasCRC = false; 101 bool HasLSE = false; 102 bool HasRAS = false; 103 bool HasRDM = false; 104 bool HasPerfMon = false; 105 bool HasFullFP16 = false; 106 bool HasFP16FML = false; 107 bool HasSPE = false; 108 109 // ARMv8.1 extensions 110 bool HasVH = false; 111 bool HasPAN = false; 112 bool HasLOR = false; 113 114 // ARMv8.2 extensions 115 bool HasPsUAO = false; 116 bool HasPAN_RWV = false; 117 bool HasCCPP = false; 118 119 // SVE extensions 120 bool HasSVE = false; 121 bool UseExperimentalZeroingPseudos = false; 122 123 // Armv8.2 Crypto extensions 124 bool HasSM4 = false; 125 bool HasSHA3 = false; 126 bool HasSHA2 = false; 127 bool HasAES = false; 128 129 // ARMv8.3 extensions 130 bool HasPAuth = false; 131 bool HasJS = false; 132 bool HasCCIDX = false; 133 bool HasComplxNum = false; 134 135 // ARMv8.4 extensions 136 bool HasNV = false; 137 bool HasMPAM = false; 138 bool HasDIT = false; 139 bool HasTRACEV8_4 = false; 140 bool HasAM = false; 141 bool HasSEL2 = false; 142 bool HasPMU = false; 143 bool HasTLB_RMI = false; 144 bool HasFlagM = false; 145 bool HasRCPC_IMMO = false; 146 147 bool HasLSLFast = false; 148 bool HasRCPC = false; 149 bool HasAggressiveFMA = false; 150 151 // Armv8.5-A Extensions 152 bool HasAlternativeNZCV = false; 153 bool HasFRInt3264 = false; 154 bool HasSpecRestrict = false; 155 bool HasSSBS = false; 156 bool HasSB = false; 157 bool HasPredRes = false; 158 bool HasCCDP = false; 159 bool HasBTI = false; 160 bool HasRandGen = false; 161 bool HasMTE = false; 162 bool HasTME = false; 163 164 // Armv8.6-A Extensions 165 bool HasBF16 = false; 166 bool HasMatMulInt8 = false; 167 bool HasMatMulFP32 = false; 168 bool HasMatMulFP64 = false; 169 bool HasAMVS = false; 170 bool HasFineGrainedTraps = false; 171 bool HasEnhancedCounterVirtualization = false; 172 173 // Armv8.7-A Extensions 174 bool HasXS = false; 175 bool HasWFxT = false; 176 bool HasHCX = false; 177 bool HasLS64 = false; 178 179 // Arm SVE2 extensions 180 bool HasSVE2 = false; 181 bool HasSVE2AES = false; 182 bool HasSVE2SM4 = false; 183 bool HasSVE2SHA3 = false; 184 bool HasSVE2BitPerm = false; 185 186 // Armv9-A Extensions 187 bool HasRME = false; 188 189 // Arm Scalable Matrix Extension (SME) 190 bool HasSME = false; 191 bool HasSMEF64 = false; 192 bool HasSMEI64 = false; 193 194 // Future architecture extensions. 195 bool HasETE = false; 196 bool HasTRBE = false; 197 bool HasBRBE = false; 198 bool HasPAUTH = false; 199 bool HasSPE_EEF = false; 200 201 // HasZeroCycleRegMove - Has zero-cycle register mov instructions. 202 bool HasZeroCycleRegMove = false; 203 204 // HasZeroCycleZeroing - Has zero-cycle zeroing instructions. 205 bool HasZeroCycleZeroing = false; 206 bool HasZeroCycleZeroingGP = false; 207 bool HasZeroCycleZeroingFPWorkaround = false; 208 209 // It is generally beneficial to rewrite "fmov s0, wzr" to "movi d0, #0". 210 // as movi is more efficient across all cores. Newer cores can eliminate 211 // fmovs early and there is no difference with movi, but this not true for 212 // all implementations. 213 bool HasZeroCycleZeroingFP = true; 214 215 // StrictAlign - Disallow unaligned memory accesses. 216 bool StrictAlign = false; 217 218 // NegativeImmediates - transform instructions with negative immediates 219 bool NegativeImmediates = true; 220 221 // Enable 64-bit vectorization in SLP. 222 unsigned MinVectorRegisterBitWidth = 64; 223 224 bool OutlineAtomics = false; 225 bool PredictableSelectIsExpensive = false; 226 bool BalanceFPOps = false; 227 bool CustomAsCheapAsMove = false; 228 bool ExynosAsCheapAsMove = false; 229 bool UsePostRAScheduler = false; 230 bool Misaligned128StoreIsSlow = false; 231 bool Paired128IsSlow = false; 232 bool STRQroIsSlow = false; 233 bool UseAlternateSExtLoadCVTF32Pattern = false; 234 bool HasArithmeticBccFusion = false; 235 bool HasArithmeticCbzFusion = false; 236 bool HasCmpBccFusion = false; 237 bool HasFuseAddress = false; 238 bool HasFuseAES = false; 239 bool HasFuseArithmeticLogic = false; 240 bool HasFuseCCSelect = false; 241 bool HasFuseCryptoEOR = false; 242 bool HasFuseLiterals = false; 243 bool DisableLatencySchedHeuristic = false; 244 bool UseRSqrt = false; 245 bool Force32BitJumpTables = false; 246 bool UseEL1ForTP = false; 247 bool UseEL2ForTP = false; 248 bool UseEL3ForTP = false; 249 bool AllowTaggedGlobals = false; 250 bool HardenSlsRetBr = false; 251 bool HardenSlsBlr = false; 252 bool HardenSlsNoComdat = false; 253 uint8_t MaxInterleaveFactor = 2; 254 uint8_t VectorInsertExtractBaseCost = 3; 255 uint16_t CacheLineSize = 0; 256 uint16_t PrefetchDistance = 0; 257 uint16_t MinPrefetchStride = 1; 258 unsigned MaxPrefetchIterationsAhead = UINT_MAX; 259 unsigned PrefFunctionLogAlignment = 0; 260 unsigned PrefLoopLogAlignment = 0; 261 unsigned MaxJumpTableSize = 0; 262 unsigned WideningBaseCost = 0; 263 264 // ReserveXRegister[i] - X#i is not available as a general purpose register. 265 BitVector ReserveXRegister; 266 267 // CustomCallUsedXRegister[i] - X#i call saved. 268 BitVector CustomCallSavedXRegs; 269 270 bool IsLittle; 271 272 unsigned MinSVEVectorSizeInBits; 273 unsigned MaxSVEVectorSizeInBits; 274 275 /// TargetTriple - What processor and OS we're targeting. 276 Triple TargetTriple; 277 278 AArch64FrameLowering FrameLowering; 279 AArch64InstrInfo InstrInfo; 280 AArch64SelectionDAGInfo TSInfo; 281 AArch64TargetLowering TLInfo; 282 283 /// GlobalISel related APIs. 284 std::unique_ptr<CallLowering> CallLoweringInfo; 285 std::unique_ptr<InlineAsmLowering> InlineAsmLoweringInfo; 286 std::unique_ptr<InstructionSelector> InstSelector; 287 std::unique_ptr<LegalizerInfo> Legalizer; 288 std::unique_ptr<RegisterBankInfo> RegBankInfo; 289 290 private: 291 /// initializeSubtargetDependencies - Initializes using CPUString and the 292 /// passed in feature string so that we can use initializer lists for 293 /// subtarget initialization. 294 AArch64Subtarget &initializeSubtargetDependencies(StringRef FS, 295 StringRef CPUString); 296 297 /// Initialize properties based on the selected processor family. 298 void initializeProperties(); 299 300 public: 301 /// This constructor initializes the data members to match that 302 /// of the specified triple. 303 AArch64Subtarget(const Triple &TT, const std::string &CPU, 304 const std::string &FS, const TargetMachine &TM, 305 bool LittleEndian, 306 unsigned MinSVEVectorSizeInBitsOverride = 0, 307 unsigned MaxSVEVectorSizeInBitsOverride = 0); 308 309 const AArch64SelectionDAGInfo *getSelectionDAGInfo() const override { 310 return &TSInfo; 311 } 312 const AArch64FrameLowering *getFrameLowering() const override { 313 return &FrameLowering; 314 } 315 const AArch64TargetLowering *getTargetLowering() const override { 316 return &TLInfo; 317 } 318 const AArch64InstrInfo *getInstrInfo() const override { return &InstrInfo; } 319 const AArch64RegisterInfo *getRegisterInfo() const override { 320 return &getInstrInfo()->getRegisterInfo(); 321 } 322 const CallLowering *getCallLowering() const override; 323 const InlineAsmLowering *getInlineAsmLowering() const override; 324 InstructionSelector *getInstructionSelector() const override; 325 const LegalizerInfo *getLegalizerInfo() const override; 326 const RegisterBankInfo *getRegBankInfo() const override; 327 const Triple &getTargetTriple() const { return TargetTriple; } 328 bool enableMachineScheduler() const override { return true; } 329 bool enablePostRAScheduler() const override { 330 return UsePostRAScheduler; 331 } 332 333 /// Returns ARM processor family. 334 /// Avoid this function! CPU specifics should be kept local to this class 335 /// and preferably modeled with SubtargetFeatures or properties in 336 /// initializeProperties(). 337 ARMProcFamilyEnum getProcFamily() const { 338 return ARMProcFamily; 339 } 340 341 bool hasV8_1aOps() const { return HasV8_1aOps; } 342 bool hasV8_2aOps() const { return HasV8_2aOps; } 343 bool hasV8_3aOps() const { return HasV8_3aOps; } 344 bool hasV8_4aOps() const { return HasV8_4aOps; } 345 bool hasV8_5aOps() const { return HasV8_5aOps; } 346 bool hasV8_0rOps() const { return HasV8_0rOps; } 347 348 bool hasZeroCycleRegMove() const { return HasZeroCycleRegMove; } 349 350 bool hasZeroCycleZeroingGP() const { return HasZeroCycleZeroingGP; } 351 352 bool hasZeroCycleZeroingFP() const { return HasZeroCycleZeroingFP; } 353 354 bool hasZeroCycleZeroingFPWorkaround() const { 355 return HasZeroCycleZeroingFPWorkaround; 356 } 357 358 bool requiresStrictAlign() const { return StrictAlign; } 359 360 bool isXRaySupported() const override { return true; } 361 362 unsigned getMinVectorRegisterBitWidth() const { 363 return MinVectorRegisterBitWidth; 364 } 365 366 bool isXRegisterReserved(size_t i) const { return ReserveXRegister[i]; } 367 unsigned getNumXRegisterReserved() const { return ReserveXRegister.count(); } 368 bool isXRegCustomCalleeSaved(size_t i) const { 369 return CustomCallSavedXRegs[i]; 370 } 371 bool hasCustomCallingConv() const { return CustomCallSavedXRegs.any(); } 372 bool hasFPARMv8() const { return HasFPARMv8; } 373 bool hasNEON() const { return HasNEON; } 374 bool hasCrypto() const { return HasCrypto; } 375 bool hasDotProd() const { return HasDotProd; } 376 bool hasCRC() const { return HasCRC; } 377 bool hasLSE() const { return HasLSE; } 378 bool hasRAS() const { return HasRAS; } 379 bool hasRDM() const { return HasRDM; } 380 bool hasSM4() const { return HasSM4; } 381 bool hasSHA3() const { return HasSHA3; } 382 bool hasSHA2() const { return HasSHA2; } 383 bool hasAES() const { return HasAES; } 384 bool hasCONTEXTIDREL2() const { return HasCONTEXTIDREL2; } 385 bool balanceFPOps() const { return BalanceFPOps; } 386 bool predictableSelectIsExpensive() const { 387 return PredictableSelectIsExpensive; 388 } 389 bool hasCustomCheapAsMoveHandling() const { return CustomAsCheapAsMove; } 390 bool hasExynosCheapAsMoveHandling() const { return ExynosAsCheapAsMove; } 391 bool isMisaligned128StoreSlow() const { return Misaligned128StoreIsSlow; } 392 bool isPaired128Slow() const { return Paired128IsSlow; } 393 bool isSTRQroSlow() const { return STRQroIsSlow; } 394 bool useAlternateSExtLoadCVTF32Pattern() const { 395 return UseAlternateSExtLoadCVTF32Pattern; 396 } 397 bool hasArithmeticBccFusion() const { return HasArithmeticBccFusion; } 398 bool hasArithmeticCbzFusion() const { return HasArithmeticCbzFusion; } 399 bool hasCmpBccFusion() const { return HasCmpBccFusion; } 400 bool hasFuseAddress() const { return HasFuseAddress; } 401 bool hasFuseAES() const { return HasFuseAES; } 402 bool hasFuseArithmeticLogic() const { return HasFuseArithmeticLogic; } 403 bool hasFuseCCSelect() const { return HasFuseCCSelect; } 404 bool hasFuseCryptoEOR() const { return HasFuseCryptoEOR; } 405 bool hasFuseLiterals() const { return HasFuseLiterals; } 406 407 /// Return true if the CPU supports any kind of instruction fusion. 408 bool hasFusion() const { 409 return hasArithmeticBccFusion() || hasArithmeticCbzFusion() || 410 hasFuseAES() || hasFuseArithmeticLogic() || 411 hasFuseCCSelect() || hasFuseLiterals(); 412 } 413 414 bool hardenSlsRetBr() const { return HardenSlsRetBr; } 415 bool hardenSlsBlr() const { return HardenSlsBlr; } 416 bool hardenSlsNoComdat() const { return HardenSlsNoComdat; } 417 418 bool useEL1ForTP() const { return UseEL1ForTP; } 419 bool useEL2ForTP() const { return UseEL2ForTP; } 420 bool useEL3ForTP() const { return UseEL3ForTP; } 421 422 bool useRSqrt() const { return UseRSqrt; } 423 bool force32BitJumpTables() const { return Force32BitJumpTables; } 424 unsigned getMaxInterleaveFactor() const { return MaxInterleaveFactor; } 425 unsigned getVectorInsertExtractBaseCost() const { 426 return VectorInsertExtractBaseCost; 427 } 428 unsigned getCacheLineSize() const override { return CacheLineSize; } 429 unsigned getPrefetchDistance() const override { return PrefetchDistance; } 430 unsigned getMinPrefetchStride(unsigned NumMemAccesses, 431 unsigned NumStridedMemAccesses, 432 unsigned NumPrefetches, 433 bool HasCall) const override { 434 return MinPrefetchStride; 435 } 436 unsigned getMaxPrefetchIterationsAhead() const override { 437 return MaxPrefetchIterationsAhead; 438 } 439 unsigned getPrefFunctionLogAlignment() const { 440 return PrefFunctionLogAlignment; 441 } 442 unsigned getPrefLoopLogAlignment() const { return PrefLoopLogAlignment; } 443 444 unsigned getMaximumJumpTableSize() const { return MaxJumpTableSize; } 445 446 unsigned getWideningBaseCost() const { return WideningBaseCost; } 447 448 bool useExperimentalZeroingPseudos() const { 449 return UseExperimentalZeroingPseudos; 450 } 451 452 /// CPU has TBI (top byte of addresses is ignored during HW address 453 /// translation) and OS enables it. 454 bool supportsAddressTopByteIgnored() const; 455 456 bool hasPerfMon() const { return HasPerfMon; } 457 bool hasFullFP16() const { return HasFullFP16; } 458 bool hasFP16FML() const { return HasFP16FML; } 459 bool hasSPE() const { return HasSPE; } 460 bool hasLSLFast() const { return HasLSLFast; } 461 bool hasSVE() const { return HasSVE; } 462 bool hasSVE2() const { return HasSVE2; } 463 bool hasRCPC() const { return HasRCPC; } 464 bool hasAggressiveFMA() const { return HasAggressiveFMA; } 465 bool hasAlternativeNZCV() const { return HasAlternativeNZCV; } 466 bool hasFRInt3264() const { return HasFRInt3264; } 467 bool hasSpecRestrict() const { return HasSpecRestrict; } 468 bool hasSSBS() const { return HasSSBS; } 469 bool hasSB() const { return HasSB; } 470 bool hasPredRes() const { return HasPredRes; } 471 bool hasCCDP() const { return HasCCDP; } 472 bool hasBTI() const { return HasBTI; } 473 bool hasRandGen() const { return HasRandGen; } 474 bool hasMTE() const { return HasMTE; } 475 bool hasTME() const { return HasTME; } 476 bool hasPAUTH() const { return HasPAUTH; } 477 // Arm SVE2 extensions 478 bool hasSVE2AES() const { return HasSVE2AES; } 479 bool hasSVE2SM4() const { return HasSVE2SM4; } 480 bool hasSVE2SHA3() const { return HasSVE2SHA3; } 481 bool hasSVE2BitPerm() const { return HasSVE2BitPerm; } 482 bool hasMatMulInt8() const { return HasMatMulInt8; } 483 bool hasMatMulFP32() const { return HasMatMulFP32; } 484 bool hasMatMulFP64() const { return HasMatMulFP64; } 485 486 // Armv8.6-A Extensions 487 bool hasBF16() const { return HasBF16; } 488 bool hasFineGrainedTraps() const { return HasFineGrainedTraps; } 489 bool hasEnhancedCounterVirtualization() const { 490 return HasEnhancedCounterVirtualization; 491 } 492 493 // Arm Scalable Matrix Extension (SME) 494 bool hasSME() const { return HasSME; } 495 bool hasSMEF64() const { return HasSMEF64; } 496 bool hasSMEI64() const { return HasSMEI64; } 497 498 bool isLittleEndian() const { return IsLittle; } 499 500 bool isTargetDarwin() const { return TargetTriple.isOSDarwin(); } 501 bool isTargetIOS() const { return TargetTriple.isiOS(); } 502 bool isTargetLinux() const { return TargetTriple.isOSLinux(); } 503 bool isTargetWindows() const { return TargetTriple.isOSWindows(); } 504 bool isTargetAndroid() const { return TargetTriple.isAndroid(); } 505 bool isTargetFuchsia() const { return TargetTriple.isOSFuchsia(); } 506 507 bool isTargetCOFF() const { return TargetTriple.isOSBinFormatCOFF(); } 508 bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); } 509 bool isTargetMachO() const { return TargetTriple.isOSBinFormatMachO(); } 510 511 bool isTargetILP32() const { 512 return TargetTriple.isArch32Bit() || 513 TargetTriple.getEnvironment() == Triple::GNUILP32; 514 } 515 516 bool useAA() const override; 517 518 bool outlineAtomics() const { return OutlineAtomics; } 519 520 bool hasVH() const { return HasVH; } 521 bool hasPAN() const { return HasPAN; } 522 bool hasLOR() const { return HasLOR; } 523 524 bool hasPsUAO() const { return HasPsUAO; } 525 bool hasPAN_RWV() const { return HasPAN_RWV; } 526 bool hasCCPP() const { return HasCCPP; } 527 528 bool hasPAuth() const { return HasPAuth; } 529 bool hasJS() const { return HasJS; } 530 bool hasCCIDX() const { return HasCCIDX; } 531 bool hasComplxNum() const { return HasComplxNum; } 532 533 bool hasNV() const { return HasNV; } 534 bool hasMPAM() const { return HasMPAM; } 535 bool hasDIT() const { return HasDIT; } 536 bool hasTRACEV8_4() const { return HasTRACEV8_4; } 537 bool hasAM() const { return HasAM; } 538 bool hasAMVS() const { return HasAMVS; } 539 bool hasXS() const { return HasXS; } 540 bool hasWFxT() const { return HasWFxT; } 541 bool hasHCX() const { return HasHCX; } 542 bool hasLS64() const { return HasLS64; } 543 bool hasSEL2() const { return HasSEL2; } 544 bool hasPMU() const { return HasPMU; } 545 bool hasTLB_RMI() const { return HasTLB_RMI; } 546 bool hasFlagM() const { return HasFlagM; } 547 bool hasRCPC_IMMO() const { return HasRCPC_IMMO; } 548 549 bool addrSinkUsingGEPs() const override { 550 // Keeping GEPs inbounds is important for exploiting AArch64 551 // addressing-modes in ILP32 mode. 552 return useAA() || isTargetILP32(); 553 } 554 555 bool useSmallAddressing() const { 556 switch (TLInfo.getTargetMachine().getCodeModel()) { 557 case CodeModel::Kernel: 558 // Kernel is currently allowed only for Fuchsia targets, 559 // where it is the same as Small for almost all purposes. 560 case CodeModel::Small: 561 return true; 562 default: 563 return false; 564 } 565 } 566 567 /// ParseSubtargetFeatures - Parses features string setting specified 568 /// subtarget options. Definition of function is auto generated by tblgen. 569 void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS); 570 571 /// ClassifyGlobalReference - Find the target operand flags that describe 572 /// how a global value should be referenced for the current subtarget. 573 unsigned ClassifyGlobalReference(const GlobalValue *GV, 574 const TargetMachine &TM) const; 575 576 unsigned classifyGlobalFunctionReference(const GlobalValue *GV, 577 const TargetMachine &TM) const; 578 579 void overrideSchedPolicy(MachineSchedPolicy &Policy, 580 unsigned NumRegionInstrs) const override; 581 582 bool enableEarlyIfConversion() const override; 583 584 bool enableAdvancedRASplitCost() const override { return false; } 585 586 std::unique_ptr<PBQPRAConstraint> getCustomPBQPConstraints() const override; 587 588 bool isCallingConvWin64(CallingConv::ID CC) const { 589 switch (CC) { 590 case CallingConv::C: 591 case CallingConv::Fast: 592 case CallingConv::Swift: 593 return isTargetWindows(); 594 case CallingConv::Win64: 595 return true; 596 default: 597 return false; 598 } 599 } 600 601 void mirFileLoaded(MachineFunction &MF) const override; 602 603 // Return the known range for the bit length of SVE data registers. A value 604 // of 0 means nothing is known about that particular limit beyong what's 605 // implied by the architecture. 606 unsigned getMaxSVEVectorSizeInBits() const { 607 assert(HasSVE && "Tried to get SVE vector length without SVE support!"); 608 return MaxSVEVectorSizeInBits; 609 } 610 611 unsigned getMinSVEVectorSizeInBits() const { 612 assert(HasSVE && "Tried to get SVE vector length without SVE support!"); 613 return MinSVEVectorSizeInBits; 614 } 615 616 bool useSVEForFixedLengthVectors() const; 617 }; 618 } // End llvm namespace 619 620 #endif 621