xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/LoongArch/LoongArchSubtarget.cpp (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
1*81ad6265SDimitry Andric //===-- LoongArchSubtarget.cpp - LoongArch Subtarget Information -*- C++ -*--=//
2*81ad6265SDimitry Andric //
3*81ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*81ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*81ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*81ad6265SDimitry Andric //
7*81ad6265SDimitry Andric //===----------------------------------------------------------------------===//
8*81ad6265SDimitry Andric //
9*81ad6265SDimitry Andric // This file implements the LoongArch specific subclass of TargetSubtargetInfo.
10*81ad6265SDimitry Andric //
11*81ad6265SDimitry Andric //===----------------------------------------------------------------------===//
12*81ad6265SDimitry Andric 
13*81ad6265SDimitry Andric #include "LoongArchSubtarget.h"
14*81ad6265SDimitry Andric #include "LoongArchFrameLowering.h"
15*81ad6265SDimitry Andric 
16*81ad6265SDimitry Andric using namespace llvm;
17*81ad6265SDimitry Andric 
18*81ad6265SDimitry Andric #define DEBUG_TYPE "loongarch-subtarget"
19*81ad6265SDimitry Andric 
20*81ad6265SDimitry Andric #define GET_SUBTARGETINFO_TARGET_DESC
21*81ad6265SDimitry Andric #define GET_SUBTARGETINFO_CTOR
22*81ad6265SDimitry Andric #include "LoongArchGenSubtargetInfo.inc"
23*81ad6265SDimitry Andric 
24*81ad6265SDimitry Andric void LoongArchSubtarget::anchor() {}
25*81ad6265SDimitry Andric 
26*81ad6265SDimitry Andric LoongArchSubtarget &LoongArchSubtarget::initializeSubtargetDependencies(
27*81ad6265SDimitry Andric     const Triple &TT, StringRef CPU, StringRef TuneCPU, StringRef FS,
28*81ad6265SDimitry Andric     StringRef ABIName) {
29*81ad6265SDimitry Andric   bool Is64Bit = TT.isArch64Bit();
30*81ad6265SDimitry Andric   if (CPU.empty())
31*81ad6265SDimitry Andric     CPU = Is64Bit ? "generic-la64" : "generic-la32";
32*81ad6265SDimitry Andric 
33*81ad6265SDimitry Andric   if (TuneCPU.empty())
34*81ad6265SDimitry Andric     TuneCPU = CPU;
35*81ad6265SDimitry Andric 
36*81ad6265SDimitry Andric   ParseSubtargetFeatures(CPU, TuneCPU, FS);
37*81ad6265SDimitry Andric   if (Is64Bit) {
38*81ad6265SDimitry Andric     GRLenVT = MVT::i64;
39*81ad6265SDimitry Andric     GRLen = 64;
40*81ad6265SDimitry Andric   }
41*81ad6265SDimitry Andric 
42*81ad6265SDimitry Andric   // TODO: ILP32{S,F} LP64{S,F}
43*81ad6265SDimitry Andric   TargetABI = Is64Bit ? LoongArchABI::ABI_LP64D : LoongArchABI::ABI_ILP32D;
44*81ad6265SDimitry Andric   return *this;
45*81ad6265SDimitry Andric }
46*81ad6265SDimitry Andric 
47*81ad6265SDimitry Andric LoongArchSubtarget::LoongArchSubtarget(const Triple &TT, StringRef CPU,
48*81ad6265SDimitry Andric                                        StringRef TuneCPU, StringRef FS,
49*81ad6265SDimitry Andric                                        StringRef ABIName,
50*81ad6265SDimitry Andric                                        const TargetMachine &TM)
51*81ad6265SDimitry Andric     : LoongArchGenSubtargetInfo(TT, CPU, TuneCPU, FS),
52*81ad6265SDimitry Andric       FrameLowering(
53*81ad6265SDimitry Andric           initializeSubtargetDependencies(TT, CPU, TuneCPU, FS, ABIName)),
54*81ad6265SDimitry Andric       InstrInfo(*this), RegInfo(getHwMode()), TLInfo(TM, *this) {}
55