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(Opcode: I.getOpcode())) |
80 | return true; |
81 | if (selectImpl(I, CoverageInfo&: *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 | |