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/IR/IntrinsicsBPF.h" |
20 | |
21 | #define DEBUG_TYPE "bpf-gisel" |
22 | |
23 | using namespace llvm; |
24 | |
25 | namespace { |
26 | |
27 | #define GET_GLOBALISEL_PREDICATE_BITSET |
28 | #include "BPFGenGlobalISel.inc" |
29 | #undef GET_GLOBALISEL_PREDICATE_BITSET |
30 | |
31 | class BPFInstructionSelector : public InstructionSelector { |
32 | public: |
33 | BPFInstructionSelector(const BPFTargetMachine &TM, const BPFSubtarget &STI, |
34 | const BPFRegisterBankInfo &RBI); |
35 | |
36 | bool select(MachineInstr &I) override; |
37 | static const char *getName() { return DEBUG_TYPE; } |
38 | |
39 | private: |
40 | /// tblgen generated 'select' implementation that is used as the initial |
41 | /// selector for the patterns that do not require complex C++. |
42 | bool selectImpl(MachineInstr &I, CodeGenCoverage &CoverageInfo) const; |
43 | |
44 | const BPFInstrInfo &TII; |
45 | const BPFRegisterInfo &TRI; |
46 | const BPFRegisterBankInfo &RBI; |
47 | |
48 | #define GET_GLOBALISEL_PREDICATES_DECL |
49 | #include "BPFGenGlobalISel.inc" |
50 | #undef GET_GLOBALISEL_PREDICATES_DECL |
51 | |
52 | #define GET_GLOBALISEL_TEMPORARIES_DECL |
53 | #include "BPFGenGlobalISel.inc" |
54 | #undef GET_GLOBALISEL_TEMPORARIES_DECL |
55 | }; |
56 | |
57 | } // namespace |
58 | |
59 | #define GET_GLOBALISEL_IMPL |
60 | #include "BPFGenGlobalISel.inc" |
61 | #undef GET_GLOBALISEL_IMPL |
62 | |
63 | BPFInstructionSelector::BPFInstructionSelector(const BPFTargetMachine &TM, |
64 | const BPFSubtarget &STI, |
65 | const BPFRegisterBankInfo &RBI) |
66 | : TII(*STI.getInstrInfo()), TRI(*STI.getRegisterInfo()), RBI(RBI), |
67 | #define GET_GLOBALISEL_PREDICATES_INIT |
68 | #include "BPFGenGlobalISel.inc" |
69 | #undef GET_GLOBALISEL_PREDICATES_INIT |
70 | #define GET_GLOBALISEL_TEMPORARIES_INIT |
71 | #include "BPFGenGlobalISel.inc" |
72 | #undef GET_GLOBALISEL_TEMPORARIES_INIT |
73 | { |
74 | } |
75 | |
76 | bool BPFInstructionSelector::select(MachineInstr &I) { |
77 | if (!isPreISelGenericOpcode(Opcode: I.getOpcode())) |
78 | return true; |
79 | if (selectImpl(I, CoverageInfo&: *CoverageInfo)) |
80 | return true; |
81 | return false; |
82 | } |
83 | |
84 | namespace llvm { |
85 | InstructionSelector * |
86 | createBPFInstructionSelector(const BPFTargetMachine &TM, |
87 | const BPFSubtarget &Subtarget, |
88 | const BPFRegisterBankInfo &RBI) { |
89 | return new BPFInstructionSelector(TM, Subtarget, RBI); |
90 | } |
91 | } // namespace llvm |
92 | |