xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/BPF/BPFSubtarget.cpp (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
10b57cec5SDimitry Andric //===-- BPFSubtarget.cpp - BPF Subtarget Information ----------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file implements the BPF specific subclass of TargetSubtargetInfo.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #include "BPFSubtarget.h"
140b57cec5SDimitry Andric #include "BPF.h"
15*5f757f3fSDimitry Andric #include "BPFTargetMachine.h"
16*5f757f3fSDimitry Andric #include "GISel/BPFCallLowering.h"
17*5f757f3fSDimitry Andric #include "GISel/BPFLegalizerInfo.h"
18*5f757f3fSDimitry Andric #include "GISel/BPFRegisterBankInfo.h"
19349cc55cSDimitry Andric #include "llvm/MC/TargetRegistry.h"
2006c3fb27SDimitry Andric #include "llvm/TargetParser/Host.h"
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric using namespace llvm;
230b57cec5SDimitry Andric 
240b57cec5SDimitry Andric #define DEBUG_TYPE "bpf-subtarget"
250b57cec5SDimitry Andric 
260b57cec5SDimitry Andric #define GET_SUBTARGETINFO_TARGET_DESC
270b57cec5SDimitry Andric #define GET_SUBTARGETINFO_CTOR
280b57cec5SDimitry Andric #include "BPFGenSubtargetInfo.inc"
290b57cec5SDimitry Andric 
30*5f757f3fSDimitry Andric static cl::opt<bool> Disable_ldsx("disable-ldsx", cl::Hidden, cl::init(false),
31*5f757f3fSDimitry Andric   cl::desc("Disable ldsx insns"));
32*5f757f3fSDimitry Andric static cl::opt<bool> Disable_movsx("disable-movsx", cl::Hidden, cl::init(false),
33*5f757f3fSDimitry Andric   cl::desc("Disable movsx insns"));
34*5f757f3fSDimitry Andric static cl::opt<bool> Disable_bswap("disable-bswap", cl::Hidden, cl::init(false),
35*5f757f3fSDimitry Andric   cl::desc("Disable bswap insns"));
36*5f757f3fSDimitry Andric static cl::opt<bool> Disable_sdiv_smod("disable-sdiv-smod", cl::Hidden,
37*5f757f3fSDimitry Andric   cl::init(false), cl::desc("Disable sdiv/smod insns"));
38*5f757f3fSDimitry Andric static cl::opt<bool> Disable_gotol("disable-gotol", cl::Hidden, cl::init(false),
39*5f757f3fSDimitry Andric   cl::desc("Disable gotol insn"));
40*5f757f3fSDimitry Andric static cl::opt<bool>
41*5f757f3fSDimitry Andric     Disable_StoreImm("disable-storeimm", cl::Hidden, cl::init(false),
42*5f757f3fSDimitry Andric                      cl::desc("Disable BPF_ST (immediate store) insn"));
43*5f757f3fSDimitry Andric 
anchor()440b57cec5SDimitry Andric void BPFSubtarget::anchor() {}
450b57cec5SDimitry Andric 
initializeSubtargetDependencies(StringRef CPU,StringRef FS)460b57cec5SDimitry Andric BPFSubtarget &BPFSubtarget::initializeSubtargetDependencies(StringRef CPU,
470b57cec5SDimitry Andric                                                             StringRef FS) {
480b57cec5SDimitry Andric   initializeEnvironment();
490b57cec5SDimitry Andric   initSubtargetFeatures(CPU, FS);
50e8d8bef9SDimitry Andric   ParseSubtargetFeatures(CPU, /*TuneCPU*/ CPU, FS);
510b57cec5SDimitry Andric   return *this;
520b57cec5SDimitry Andric }
530b57cec5SDimitry Andric 
initializeEnvironment()540b57cec5SDimitry Andric void BPFSubtarget::initializeEnvironment() {
550b57cec5SDimitry Andric   HasJmpExt = false;
560b57cec5SDimitry Andric   HasJmp32 = false;
570b57cec5SDimitry Andric   HasAlu32 = false;
580b57cec5SDimitry Andric   UseDwarfRIS = false;
59*5f757f3fSDimitry Andric   HasLdsx = false;
60*5f757f3fSDimitry Andric   HasMovsx = false;
61*5f757f3fSDimitry Andric   HasBswap = false;
62*5f757f3fSDimitry Andric   HasSdivSmod = false;
63*5f757f3fSDimitry Andric   HasGotol = false;
64*5f757f3fSDimitry Andric   HasStoreImm = false;
650b57cec5SDimitry Andric }
660b57cec5SDimitry Andric 
initSubtargetFeatures(StringRef CPU,StringRef FS)670b57cec5SDimitry Andric void BPFSubtarget::initSubtargetFeatures(StringRef CPU, StringRef FS) {
680b57cec5SDimitry Andric   if (CPU == "probe")
690b57cec5SDimitry Andric     CPU = sys::detail::getHostCPUNameForBPF();
700b57cec5SDimitry Andric   if (CPU == "generic" || CPU == "v1")
710b57cec5SDimitry Andric     return;
720b57cec5SDimitry Andric   if (CPU == "v2") {
730b57cec5SDimitry Andric     HasJmpExt = true;
740b57cec5SDimitry Andric     return;
750b57cec5SDimitry Andric   }
760b57cec5SDimitry Andric   if (CPU == "v3") {
770b57cec5SDimitry Andric     HasJmpExt = true;
780b57cec5SDimitry Andric     HasJmp32 = true;
79480093f4SDimitry Andric     HasAlu32 = true;
800b57cec5SDimitry Andric     return;
810b57cec5SDimitry Andric   }
82*5f757f3fSDimitry Andric   if (CPU == "v4") {
83*5f757f3fSDimitry Andric     HasJmpExt = true;
84*5f757f3fSDimitry Andric     HasJmp32 = true;
85*5f757f3fSDimitry Andric     HasAlu32 = true;
86*5f757f3fSDimitry Andric     HasLdsx = !Disable_ldsx;
87*5f757f3fSDimitry Andric     HasMovsx = !Disable_movsx;
88*5f757f3fSDimitry Andric     HasBswap = !Disable_bswap;
89*5f757f3fSDimitry Andric     HasSdivSmod = !Disable_sdiv_smod;
90*5f757f3fSDimitry Andric     HasGotol = !Disable_gotol;
91*5f757f3fSDimitry Andric     HasStoreImm = !Disable_StoreImm;
92*5f757f3fSDimitry Andric     return;
93*5f757f3fSDimitry Andric   }
940b57cec5SDimitry Andric }
950b57cec5SDimitry Andric 
BPFSubtarget(const Triple & TT,const std::string & CPU,const std::string & FS,const TargetMachine & TM)960b57cec5SDimitry Andric BPFSubtarget::BPFSubtarget(const Triple &TT, const std::string &CPU,
970b57cec5SDimitry Andric                            const std::string &FS, const TargetMachine &TM)
9804eeddc0SDimitry Andric     : BPFGenSubtargetInfo(TT, CPU, /*TuneCPU*/ CPU, FS),
990b57cec5SDimitry Andric       FrameLowering(initializeSubtargetDependencies(CPU, FS)),
100*5f757f3fSDimitry Andric       TLInfo(TM, *this) {
101*5f757f3fSDimitry Andric   IsLittleEndian = TT.isLittleEndian();
102*5f757f3fSDimitry Andric 
103*5f757f3fSDimitry Andric   CallLoweringInfo.reset(new BPFCallLowering(*getTargetLowering()));
104*5f757f3fSDimitry Andric   Legalizer.reset(new BPFLegalizerInfo(*this));
105*5f757f3fSDimitry Andric   auto *RBI = new BPFRegisterBankInfo(*getRegisterInfo());
106*5f757f3fSDimitry Andric   RegBankInfo.reset(RBI);
107*5f757f3fSDimitry Andric 
108*5f757f3fSDimitry Andric   InstSelector.reset(createBPFInstructionSelector(
109*5f757f3fSDimitry Andric       *static_cast<const BPFTargetMachine *>(&TM), *this, *RBI));
110*5f757f3fSDimitry Andric }
111*5f757f3fSDimitry Andric 
getCallLowering() const112*5f757f3fSDimitry Andric const CallLowering *BPFSubtarget::getCallLowering() const {
113*5f757f3fSDimitry Andric   return CallLoweringInfo.get();
114*5f757f3fSDimitry Andric }
115*5f757f3fSDimitry Andric 
getInstructionSelector() const116*5f757f3fSDimitry Andric InstructionSelector *BPFSubtarget::getInstructionSelector() const {
117*5f757f3fSDimitry Andric   return InstSelector.get();
118*5f757f3fSDimitry Andric }
119*5f757f3fSDimitry Andric 
getLegalizerInfo() const120*5f757f3fSDimitry Andric const LegalizerInfo *BPFSubtarget::getLegalizerInfo() const {
121*5f757f3fSDimitry Andric   return Legalizer.get();
122*5f757f3fSDimitry Andric }
123*5f757f3fSDimitry Andric 
getRegBankInfo() const124*5f757f3fSDimitry Andric const RegisterBankInfo *BPFSubtarget::getRegBankInfo() const {
125*5f757f3fSDimitry Andric   return RegBankInfo.get();
126*5f757f3fSDimitry Andric }
127