|  | //===-- LoongArchSubtarget.cpp - LoongArch Subtarget Information -*- C++ -*--=// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file implements the LoongArch specific subclass of TargetSubtargetInfo. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "LoongArchSubtarget.h" | 
|  | #include "LoongArchFrameLowering.h" | 
|  | #include "MCTargetDesc/LoongArchBaseInfo.h" | 
|  |  | 
|  | using namespace llvm; | 
|  |  | 
|  | #define DEBUG_TYPE "loongarch-subtarget" | 
|  |  | 
|  | #define GET_SUBTARGETINFO_TARGET_DESC | 
|  | #define GET_SUBTARGETINFO_CTOR | 
|  | #include "LoongArchGenSubtargetInfo.inc" | 
|  |  | 
|  | static cl::opt<bool> UseAA("loongarch-use-aa", cl::init(true), | 
|  | cl::desc("Enable the use of AA during codegen.")); | 
|  |  | 
|  | void LoongArchSubtarget::anchor() {} | 
|  |  | 
|  | // Enable use of alias analysis during code generation (during MI scheduling, | 
|  | // DAGCombine, etc.). | 
|  | bool LoongArchSubtarget::useAA() const { return UseAA; } | 
|  |  | 
|  | LoongArchSubtarget &LoongArchSubtarget::initializeSubtargetDependencies( | 
|  | const Triple &TT, StringRef CPU, StringRef TuneCPU, StringRef FS, | 
|  | StringRef ABIName) { | 
|  | bool Is64Bit = TT.isArch64Bit(); | 
|  | if (CPU.empty() || CPU == "generic") | 
|  | CPU = Is64Bit ? "generic-la64" : "generic-la32"; | 
|  |  | 
|  | if (TuneCPU.empty()) | 
|  | TuneCPU = CPU; | 
|  |  | 
|  | ParseSubtargetFeatures(CPU, TuneCPU, FS); | 
|  | initializeProperties(TuneCPU); | 
|  | if (Is64Bit) { | 
|  | GRLenVT = MVT::i64; | 
|  | GRLen = 64; | 
|  | } | 
|  |  | 
|  | if (HasLA32 == HasLA64) | 
|  | report_fatal_error("Please use one feature of 32bit and 64bit."); | 
|  |  | 
|  | if (Is64Bit && HasLA32) | 
|  | report_fatal_error("Feature 32bit should be used for loongarch32 target."); | 
|  |  | 
|  | if (!Is64Bit && HasLA64) | 
|  | report_fatal_error("Feature 64bit should be used for loongarch64 target."); | 
|  |  | 
|  | TargetABI = LoongArchABI::computeTargetABI(TT, getFeatureBits(), ABIName); | 
|  |  | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | void LoongArchSubtarget::initializeProperties(StringRef TuneCPU) { | 
|  | // Initialize CPU specific properties. We should add a tablegen feature for | 
|  | // this in the future so we can specify it together with the subtarget | 
|  | // features. | 
|  |  | 
|  | // TODO: Check TuneCPU and override defaults (that are for LA464) once we | 
|  | // support optimizing for more uarchs. | 
|  |  | 
|  | // Default to the alignment settings empirically confirmed to perform best | 
|  | // on LA464, with 4-wide instruction fetch and decode stages. These settings | 
|  | // can also be overridden in initializeProperties. | 
|  | // | 
|  | // We default to such higher-than-minimum alignments because we assume that: | 
|  | // | 
|  | // * these settings should benefit most existing uarchs/users, | 
|  | // * future general-purpose LoongArch cores are likely to have issue widths | 
|  | //   equal to or wider than 4, | 
|  | // * instruction sequences best for LA464 should not pessimize other future | 
|  | //   uarchs, and | 
|  | // * narrower cores would not suffer much (aside from slightly increased | 
|  | //   ICache footprint maybe), compared to the gains everywhere else. | 
|  | PrefFunctionAlignment = Align(32); | 
|  | PrefLoopAlignment = Align(16); | 
|  | MaxBytesForAlignment = 16; | 
|  | } | 
|  |  | 
|  | LoongArchSubtarget::LoongArchSubtarget(const Triple &TT, StringRef CPU, | 
|  | StringRef TuneCPU, StringRef FS, | 
|  | StringRef ABIName, | 
|  | const TargetMachine &TM) | 
|  | : LoongArchGenSubtargetInfo(TT, CPU, TuneCPU, FS), | 
|  | FrameLowering( | 
|  | initializeSubtargetDependencies(TT, CPU, TuneCPU, FS, ABIName)), | 
|  | InstrInfo(*this), RegInfo(getHwMode()), TLInfo(TM, *this) {} |