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
18using namespace llvm;
19
20#define GET_GLOBALISEL_PREDICATE_BITSET
21#include "M68kGenGlobalISel.inc"
22#undef GET_GLOBALISEL_PREDICATE_BITSET
23
24namespace {
25
26class M68kInstructionSelector : public InstructionSelector {
27public:
28  M68kInstructionSelector(const M68kTargetMachine &TM, const M68kSubtarget &STI,
29                          const M68kRegisterBankInfo &RBI);
30
31  bool select(MachineInstr &I) override;
32  static const char *getName() { return DEBUG_TYPE; }
33
34private:
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
57M68kInstructionSelector::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
72bool 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
83namespace llvm {
84InstructionSelector *
85createM68kInstructionSelector(const M68kTargetMachine &TM,
86                              const M68kSubtarget &Subtarget,
87                              const M68kRegisterBankInfo &RBI) {
88  return new M68kInstructionSelector(TM, Subtarget, RBI);
89}
90} // end namespace llvm
91