1*2cab237bSDimitry Andric //===-- RISCVSubtarget.cpp - RISCV Subtarget Information ------------------===//
2*2cab237bSDimitry Andric //
3*2cab237bSDimitry Andric //                     The LLVM Compiler Infrastructure
4*2cab237bSDimitry Andric //
5*2cab237bSDimitry Andric // This file is distributed under the University of Illinois Open Source
6*2cab237bSDimitry Andric // License. See LICENSE.TXT for details.
7*2cab237bSDimitry Andric //
8*2cab237bSDimitry Andric //===----------------------------------------------------------------------===//
9*2cab237bSDimitry Andric //
10*2cab237bSDimitry Andric // This file implements the RISCV specific subclass of TargetSubtargetInfo.
11*2cab237bSDimitry Andric //
12*2cab237bSDimitry Andric //===----------------------------------------------------------------------===//
13*2cab237bSDimitry Andric 
14*2cab237bSDimitry Andric #include "RISCVSubtarget.h"
15*2cab237bSDimitry Andric #include "RISCV.h"
16*2cab237bSDimitry Andric #include "RISCVFrameLowering.h"
17*2cab237bSDimitry Andric #include "llvm/Support/TargetRegistry.h"
18*2cab237bSDimitry Andric 
19*2cab237bSDimitry Andric using namespace llvm;
20*2cab237bSDimitry Andric 
21*2cab237bSDimitry Andric #define DEBUG_TYPE "riscv-subtarget"
22*2cab237bSDimitry Andric 
23*2cab237bSDimitry Andric #define GET_SUBTARGETINFO_TARGET_DESC
24*2cab237bSDimitry Andric #define GET_SUBTARGETINFO_CTOR
25*2cab237bSDimitry Andric #include "RISCVGenSubtargetInfo.inc"
26*2cab237bSDimitry Andric 
anchor()27*2cab237bSDimitry Andric void RISCVSubtarget::anchor() {}
28*2cab237bSDimitry Andric 
initializeSubtargetDependencies(StringRef CPU,StringRef FS,bool Is64Bit)29*2cab237bSDimitry Andric RISCVSubtarget &RISCVSubtarget::initializeSubtargetDependencies(StringRef CPU,
30*2cab237bSDimitry Andric                                                                 StringRef FS,
31*2cab237bSDimitry Andric                                                                 bool Is64Bit) {
32*2cab237bSDimitry Andric   // Determine default and user-specified characteristics
33*2cab237bSDimitry Andric   std::string CPUName = CPU;
34*2cab237bSDimitry Andric   if (CPUName.empty())
35*2cab237bSDimitry Andric     CPUName = Is64Bit ? "generic-rv64" : "generic-rv32";
36*2cab237bSDimitry Andric   ParseSubtargetFeatures(CPUName, FS);
37*2cab237bSDimitry Andric   if (Is64Bit) {
38*2cab237bSDimitry Andric     XLenVT = MVT::i64;
39*2cab237bSDimitry Andric     XLen = 64;
40*2cab237bSDimitry Andric   }
41*2cab237bSDimitry Andric   return *this;
42*2cab237bSDimitry Andric }
43*2cab237bSDimitry Andric 
RISCVSubtarget(const Triple & TT,const std::string & CPU,const std::string & FS,const TargetMachine & TM)44*2cab237bSDimitry Andric RISCVSubtarget::RISCVSubtarget(const Triple &TT, const std::string &CPU,
45*2cab237bSDimitry Andric                                const std::string &FS, const TargetMachine &TM)
46*2cab237bSDimitry Andric     : RISCVGenSubtargetInfo(TT, CPU, FS),
47*2cab237bSDimitry Andric       FrameLowering(initializeSubtargetDependencies(CPU, FS, TT.isArch64Bit())),
48*2cab237bSDimitry Andric       InstrInfo(), RegInfo(getHwMode()), TLInfo(TM, *this) {}
49