Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/llvm/lib/Target/BPF/GISel/BPFInstructionSelector.cpp
35294 views
1
//===- BPFInstructionSelector.cpp --------------------------------*- C++ -*-==//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
/// \file
9
/// This file implements the targeting of the InstructionSelector class for BPF.
10
//===----------------------------------------------------------------------===//
11
12
#include "BPFInstrInfo.h"
13
#include "BPFRegisterBankInfo.h"
14
#include "BPFSubtarget.h"
15
#include "BPFTargetMachine.h"
16
#include "llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h"
17
#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
18
#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
19
#include "llvm/CodeGen/MachineFunction.h"
20
#include "llvm/IR/IntrinsicsBPF.h"
21
#include "llvm/Support/Debug.h"
22
23
#define DEBUG_TYPE "bpf-gisel"
24
25
using namespace llvm;
26
27
namespace {
28
29
#define GET_GLOBALISEL_PREDICATE_BITSET
30
#include "BPFGenGlobalISel.inc"
31
#undef GET_GLOBALISEL_PREDICATE_BITSET
32
33
class BPFInstructionSelector : public InstructionSelector {
34
public:
35
BPFInstructionSelector(const BPFTargetMachine &TM, const BPFSubtarget &STI,
36
const BPFRegisterBankInfo &RBI);
37
38
bool select(MachineInstr &I) override;
39
static const char *getName() { return DEBUG_TYPE; }
40
41
private:
42
/// tblgen generated 'select' implementation that is used as the initial
43
/// selector for the patterns that do not require complex C++.
44
bool selectImpl(MachineInstr &I, CodeGenCoverage &CoverageInfo) const;
45
46
const BPFInstrInfo &TII;
47
const BPFRegisterInfo &TRI;
48
const BPFRegisterBankInfo &RBI;
49
50
#define GET_GLOBALISEL_PREDICATES_DECL
51
#include "BPFGenGlobalISel.inc"
52
#undef GET_GLOBALISEL_PREDICATES_DECL
53
54
#define GET_GLOBALISEL_TEMPORARIES_DECL
55
#include "BPFGenGlobalISel.inc"
56
#undef GET_GLOBALISEL_TEMPORARIES_DECL
57
};
58
59
} // namespace
60
61
#define GET_GLOBALISEL_IMPL
62
#include "BPFGenGlobalISel.inc"
63
#undef GET_GLOBALISEL_IMPL
64
65
BPFInstructionSelector::BPFInstructionSelector(const BPFTargetMachine &TM,
66
const BPFSubtarget &STI,
67
const BPFRegisterBankInfo &RBI)
68
: TII(*STI.getInstrInfo()), TRI(*STI.getRegisterInfo()), RBI(RBI),
69
#define GET_GLOBALISEL_PREDICATES_INIT
70
#include "BPFGenGlobalISel.inc"
71
#undef GET_GLOBALISEL_PREDICATES_INIT
72
#define GET_GLOBALISEL_TEMPORARIES_INIT
73
#include "BPFGenGlobalISel.inc"
74
#undef GET_GLOBALISEL_TEMPORARIES_INIT
75
{
76
}
77
78
bool BPFInstructionSelector::select(MachineInstr &I) {
79
if (!isPreISelGenericOpcode(I.getOpcode()))
80
return true;
81
if (selectImpl(I, *CoverageInfo))
82
return true;
83
return false;
84
}
85
86
namespace llvm {
87
InstructionSelector *
88
createBPFInstructionSelector(const BPFTargetMachine &TM,
89
const BPFSubtarget &Subtarget,
90
const BPFRegisterBankInfo &RBI) {
91
return new BPFInstructionSelector(TM, Subtarget, RBI);
92
}
93
} // namespace llvm
94
95