104eeddc0SDimitry Andric //===-- M68kInstructionSelector.cpp -----------------------------*- C++ -*-===//
2349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
3349cc55cSDimitry Andric /// \file
4349cc55cSDimitry Andric /// This file implements the targeting of the InstructionSelector class for
5349cc55cSDimitry Andric /// M68k.
6349cc55cSDimitry Andric /// \todo This should be generated by TableGen.
7349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
8349cc55cSDimitry Andric
9349cc55cSDimitry Andric #include "M68kRegisterBankInfo.h"
10349cc55cSDimitry Andric #include "M68kSubtarget.h"
11349cc55cSDimitry Andric #include "M68kTargetMachine.h"
12*06c3fb27SDimitry Andric #include "llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h"
13349cc55cSDimitry Andric #include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
14349cc55cSDimitry Andric #include "llvm/Support/Debug.h"
15349cc55cSDimitry Andric
16349cc55cSDimitry Andric #define DEBUG_TYPE "m68k-isel"
17349cc55cSDimitry Andric
18349cc55cSDimitry Andric using namespace llvm;
19349cc55cSDimitry Andric
20349cc55cSDimitry Andric #define GET_GLOBALISEL_PREDICATE_BITSET
21349cc55cSDimitry Andric #include "M68kGenGlobalISel.inc"
22349cc55cSDimitry Andric #undef GET_GLOBALISEL_PREDICATE_BITSET
23349cc55cSDimitry Andric
24349cc55cSDimitry Andric namespace {
25349cc55cSDimitry Andric
26349cc55cSDimitry Andric class M68kInstructionSelector : public InstructionSelector {
27349cc55cSDimitry Andric public:
28349cc55cSDimitry Andric M68kInstructionSelector(const M68kTargetMachine &TM, const M68kSubtarget &STI,
29349cc55cSDimitry Andric const M68kRegisterBankInfo &RBI);
30349cc55cSDimitry Andric
31349cc55cSDimitry Andric bool select(MachineInstr &I) override;
getName()32349cc55cSDimitry Andric static const char *getName() { return DEBUG_TYPE; }
33349cc55cSDimitry Andric
34349cc55cSDimitry Andric private:
35349cc55cSDimitry Andric bool selectImpl(MachineInstr &I, CodeGenCoverage &CoverageInfo) const;
36349cc55cSDimitry Andric
37349cc55cSDimitry Andric const M68kTargetMachine &TM;
38349cc55cSDimitry Andric const M68kInstrInfo &TII;
39349cc55cSDimitry Andric const M68kRegisterInfo &TRI;
40349cc55cSDimitry Andric const M68kRegisterBankInfo &RBI;
41349cc55cSDimitry Andric
42349cc55cSDimitry Andric #define GET_GLOBALISEL_PREDICATES_DECL
43349cc55cSDimitry Andric #include "M68kGenGlobalISel.inc"
44349cc55cSDimitry Andric #undef GET_GLOBALISEL_PREDICATES_DECL
45349cc55cSDimitry Andric
46349cc55cSDimitry Andric #define GET_GLOBALISEL_TEMPORARIES_DECL
47349cc55cSDimitry Andric #include "M68kGenGlobalISel.inc"
48349cc55cSDimitry Andric #undef GET_GLOBALISEL_TEMPORARIES_DECL
49349cc55cSDimitry Andric };
50349cc55cSDimitry Andric
51349cc55cSDimitry Andric } // end anonymous namespace
52349cc55cSDimitry Andric
53349cc55cSDimitry Andric #define GET_GLOBALISEL_IMPL
54349cc55cSDimitry Andric #include "M68kGenGlobalISel.inc"
55349cc55cSDimitry Andric #undef GET_GLOBALISEL_IMPL
56349cc55cSDimitry Andric
M68kInstructionSelector(const M68kTargetMachine & TM,const M68kSubtarget & STI,const M68kRegisterBankInfo & RBI)57349cc55cSDimitry Andric M68kInstructionSelector::M68kInstructionSelector(
58349cc55cSDimitry Andric const M68kTargetMachine &TM, const M68kSubtarget &STI,
59349cc55cSDimitry Andric const M68kRegisterBankInfo &RBI)
60349cc55cSDimitry Andric : InstructionSelector(), TM(TM), TII(*STI.getInstrInfo()),
61349cc55cSDimitry Andric TRI(*STI.getRegisterInfo()), RBI(RBI),
62349cc55cSDimitry Andric
63349cc55cSDimitry Andric #define GET_GLOBALISEL_PREDICATES_INIT
64349cc55cSDimitry Andric #include "M68kGenGlobalISel.inc"
65349cc55cSDimitry Andric #undef GET_GLOBALISEL_PREDICATES_INIT
66349cc55cSDimitry Andric #define GET_GLOBALISEL_TEMPORARIES_INIT
67349cc55cSDimitry Andric #include "M68kGenGlobalISel.inc"
68349cc55cSDimitry Andric #undef GET_GLOBALISEL_TEMPORARIES_INIT
69349cc55cSDimitry Andric {
70349cc55cSDimitry Andric }
71349cc55cSDimitry Andric
select(MachineInstr & I)72349cc55cSDimitry Andric bool M68kInstructionSelector::select(MachineInstr &I) {
73349cc55cSDimitry Andric // Certain non-generic instructions also need some special handling.
74349cc55cSDimitry Andric if (!isPreISelGenericOpcode(I.getOpcode()))
75349cc55cSDimitry Andric return true;
76349cc55cSDimitry Andric
77349cc55cSDimitry Andric if (selectImpl(I, *CoverageInfo))
78349cc55cSDimitry Andric return true;
79349cc55cSDimitry Andric
80349cc55cSDimitry Andric return false;
81349cc55cSDimitry Andric }
82349cc55cSDimitry Andric
83349cc55cSDimitry Andric namespace llvm {
84349cc55cSDimitry Andric InstructionSelector *
createM68kInstructionSelector(const M68kTargetMachine & TM,const M68kSubtarget & Subtarget,const M68kRegisterBankInfo & RBI)85349cc55cSDimitry Andric createM68kInstructionSelector(const M68kTargetMachine &TM,
86349cc55cSDimitry Andric const M68kSubtarget &Subtarget,
87349cc55cSDimitry Andric const M68kRegisterBankInfo &RBI) {
88349cc55cSDimitry Andric return new M68kInstructionSelector(TM, Subtarget, RBI);
89349cc55cSDimitry Andric }
90349cc55cSDimitry Andric } // end namespace llvm
91