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; 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 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 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 * 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