1 //===-- M68kInstructionSelector.cpp -----------------------------*- C++ -*-===//
2 //===----------------------------------------------------------------------===//
3 /// \file
4 /// This file implements the targeting of the InstructionSelector class for
5 /// M68k.
6 /// \todo This should be generated by TableGen.
7 //===----------------------------------------------------------------------===//
8
9 #include "M68kRegisterBankInfo.h"
10 #include "M68kSubtarget.h"
11 #include "M68kTargetMachine.h"
12 #include "llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h"
13 #include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
14 #include "llvm/Support/Debug.h"
15
16 #define DEBUG_TYPE "m68k-isel"
17
18 using namespace llvm;
19
20 #define GET_GLOBALISEL_PREDICATE_BITSET
21 #include "M68kGenGlobalISel.inc"
22 #undef GET_GLOBALISEL_PREDICATE_BITSET
23
24 namespace {
25
26 class M68kInstructionSelector : public InstructionSelector {
27 public:
28 M68kInstructionSelector(const M68kTargetMachine &TM, const M68kSubtarget &STI,
29 const M68kRegisterBankInfo &RBI);
30
31 bool select(MachineInstr &I) override;
getName()32 static const char *getName() { return DEBUG_TYPE; }
33
34 private:
35 bool selectImpl(MachineInstr &I, CodeGenCoverage &CoverageInfo) const;
36
37 const M68kTargetMachine &TM;
38 const M68kInstrInfo &TII;
39 const M68kRegisterInfo &TRI;
40 const M68kRegisterBankInfo &RBI;
41
42 #define GET_GLOBALISEL_PREDICATES_DECL
43 #include "M68kGenGlobalISel.inc"
44 #undef GET_GLOBALISEL_PREDICATES_DECL
45
46 #define GET_GLOBALISEL_TEMPORARIES_DECL
47 #include "M68kGenGlobalISel.inc"
48 #undef GET_GLOBALISEL_TEMPORARIES_DECL
49 };
50
51 } // end anonymous namespace
52
53 #define GET_GLOBALISEL_IMPL
54 #include "M68kGenGlobalISel.inc"
55 #undef GET_GLOBALISEL_IMPL
56
M68kInstructionSelector(const M68kTargetMachine & TM,const M68kSubtarget & STI,const M68kRegisterBankInfo & RBI)57 M68kInstructionSelector::M68kInstructionSelector(
58 const M68kTargetMachine &TM, const M68kSubtarget &STI,
59 const M68kRegisterBankInfo &RBI)
60 : InstructionSelector(), TM(TM), TII(*STI.getInstrInfo()),
61 TRI(*STI.getRegisterInfo()), RBI(RBI),
62
63 #define GET_GLOBALISEL_PREDICATES_INIT
64 #include "M68kGenGlobalISel.inc"
65 #undef GET_GLOBALISEL_PREDICATES_INIT
66 #define GET_GLOBALISEL_TEMPORARIES_INIT
67 #include "M68kGenGlobalISel.inc"
68 #undef GET_GLOBALISEL_TEMPORARIES_INIT
69 {
70 }
71
select(MachineInstr & I)72 bool M68kInstructionSelector::select(MachineInstr &I) {
73 // Certain non-generic instructions also need some special handling.
74 if (!isPreISelGenericOpcode(I.getOpcode()))
75 return true;
76
77 if (selectImpl(I, *CoverageInfo))
78 return true;
79
80 return false;
81 }
82
83 namespace llvm {
84 InstructionSelector *
createM68kInstructionSelector(const M68kTargetMachine & TM,const M68kSubtarget & Subtarget,const M68kRegisterBankInfo & RBI)85 createM68kInstructionSelector(const M68kTargetMachine &TM,
86 const M68kSubtarget &Subtarget,
87 const M68kRegisterBankInfo &RBI) {
88 return new M68kInstructionSelector(TM, Subtarget, RBI);
89 }
90 } // end namespace llvm
91