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