133388ae8SLu Weining //===-- LoongArchSubtarget.cpp - LoongArch Subtarget Information -*- C++ -*--=// 233388ae8SLu Weining // 333388ae8SLu Weining // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 433388ae8SLu Weining // See https://llvm.org/LICENSE.txt for license information. 533388ae8SLu Weining // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 633388ae8SLu Weining // 733388ae8SLu Weining //===----------------------------------------------------------------------===// 833388ae8SLu Weining // 933388ae8SLu Weining // This file implements the LoongArch specific subclass of TargetSubtargetInfo. 1033388ae8SLu Weining // 1133388ae8SLu Weining //===----------------------------------------------------------------------===// 1233388ae8SLu Weining 1333388ae8SLu Weining #include "LoongArchSubtarget.h" 1433388ae8SLu Weining #include "LoongArchFrameLowering.h" 15695c81e8SWANG Xuerui #include "MCTargetDesc/LoongArchBaseInfo.h" 1633388ae8SLu Weining 1733388ae8SLu Weining using namespace llvm; 1833388ae8SLu Weining 1933388ae8SLu Weining #define DEBUG_TYPE "loongarch-subtarget" 2033388ae8SLu Weining 2133388ae8SLu Weining #define GET_SUBTARGETINFO_TARGET_DESC 2233388ae8SLu Weining #define GET_SUBTARGETINFO_CTOR 2333388ae8SLu Weining #include "LoongArchGenSubtargetInfo.inc" 2433388ae8SLu Weining 25*cab606c3Shev static cl::opt<bool> UseAA("loongarch-use-aa", cl::init(true), 26*cab606c3Shev cl::desc("Enable the use of AA during codegen.")); 27*cab606c3Shev 2833388ae8SLu Weining void LoongArchSubtarget::anchor() {} 2933388ae8SLu Weining 30*cab606c3Shev // Enable use of alias analysis during code generation (during MI scheduling, 31*cab606c3Shev // DAGCombine, etc.). 32*cab606c3Shev bool LoongArchSubtarget::useAA() const { return UseAA; } 33*cab606c3Shev 3433388ae8SLu Weining LoongArchSubtarget &LoongArchSubtarget::initializeSubtargetDependencies( 3533388ae8SLu Weining const Triple &TT, StringRef CPU, StringRef TuneCPU, StringRef FS, 3633388ae8SLu Weining StringRef ABIName) { 3733388ae8SLu Weining bool Is64Bit = TT.isArch64Bit(); 38ad6fe320SWANG Xuerui if (CPU.empty() || CPU == "generic") 3933388ae8SLu Weining CPU = Is64Bit ? "generic-la64" : "generic-la32"; 4033388ae8SLu Weining 4133388ae8SLu Weining if (TuneCPU.empty()) 4233388ae8SLu Weining TuneCPU = CPU; 4333388ae8SLu Weining 4433388ae8SLu Weining ParseSubtargetFeatures(CPU, TuneCPU, FS); 45f27017a0SWANG Xuerui initializeProperties(TuneCPU); 4633388ae8SLu Weining if (Is64Bit) { 4733388ae8SLu Weining GRLenVT = MVT::i64; 4833388ae8SLu Weining GRLen = 64; 4933388ae8SLu Weining } 5033388ae8SLu Weining 518d798eabSXiaodong Liu if (HasLA32 == HasLA64) 528d798eabSXiaodong Liu report_fatal_error("Please use one feature of 32bit and 64bit."); 538d798eabSXiaodong Liu 548d798eabSXiaodong Liu if (Is64Bit && HasLA32) 558d798eabSXiaodong Liu report_fatal_error("Feature 32bit should be used for loongarch32 target."); 568d798eabSXiaodong Liu 578d798eabSXiaodong Liu if (!Is64Bit && HasLA64) 588d798eabSXiaodong Liu report_fatal_error("Feature 64bit should be used for loongarch64 target."); 598d798eabSXiaodong Liu 6070608c24Swanglei TargetABI = LoongArchABI::computeTargetABI(TT, getFeatureBits(), ABIName); 61695c81e8SWANG Xuerui 6233388ae8SLu Weining return *this; 6333388ae8SLu Weining } 6433388ae8SLu Weining 65f27017a0SWANG Xuerui void LoongArchSubtarget::initializeProperties(StringRef TuneCPU) { 66f27017a0SWANG Xuerui // Initialize CPU specific properties. We should add a tablegen feature for 67f27017a0SWANG Xuerui // this in the future so we can specify it together with the subtarget 68f27017a0SWANG Xuerui // features. 69f27017a0SWANG Xuerui 70f27017a0SWANG Xuerui // TODO: Check TuneCPU and override defaults (that are for LA464) once we 71f27017a0SWANG Xuerui // support optimizing for more uarchs. 72f27017a0SWANG Xuerui 73f27017a0SWANG Xuerui // Default to the alignment settings empirically confirmed to perform best 74f27017a0SWANG Xuerui // on LA464, with 4-wide instruction fetch and decode stages. These settings 75f27017a0SWANG Xuerui // can also be overridden in initializeProperties. 76f27017a0SWANG Xuerui // 77f27017a0SWANG Xuerui // We default to such higher-than-minimum alignments because we assume that: 78f27017a0SWANG Xuerui // 79f27017a0SWANG Xuerui // * these settings should benefit most existing uarchs/users, 80f27017a0SWANG Xuerui // * future general-purpose LoongArch cores are likely to have issue widths 81f27017a0SWANG Xuerui // equal to or wider than 4, 82f27017a0SWANG Xuerui // * instruction sequences best for LA464 should not pessimize other future 83f27017a0SWANG Xuerui // uarchs, and 84f27017a0SWANG Xuerui // * narrower cores would not suffer much (aside from slightly increased 85f27017a0SWANG Xuerui // ICache footprint maybe), compared to the gains everywhere else. 86f27017a0SWANG Xuerui PrefFunctionAlignment = Align(32); 87f27017a0SWANG Xuerui PrefLoopAlignment = Align(16); 88f27017a0SWANG Xuerui MaxBytesForAlignment = 16; 89f27017a0SWANG Xuerui } 90f27017a0SWANG Xuerui 9133388ae8SLu Weining LoongArchSubtarget::LoongArchSubtarget(const Triple &TT, StringRef CPU, 9233388ae8SLu Weining StringRef TuneCPU, StringRef FS, 9333388ae8SLu Weining StringRef ABIName, 9433388ae8SLu Weining const TargetMachine &TM) 9533388ae8SLu Weining : LoongArchGenSubtargetInfo(TT, CPU, TuneCPU, FS), 9633388ae8SLu Weining FrameLowering( 9733388ae8SLu Weining initializeSubtargetDependencies(TT, CPU, TuneCPU, FS, ABIName)), 9833388ae8SLu Weining InstrInfo(*this), RegInfo(getHwMode()), TLInfo(TM, *this) {} 99