1 //===- PPCInstructionSelector.cpp --------------------------------*- C++ -*-==// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// \file 9 /// This file implements the targeting of the InstructionSelector class for 10 /// PowerPC. 11 //===----------------------------------------------------------------------===// 12 13 #include "PPCInstrInfo.h" 14 #include "PPCRegisterBankInfo.h" 15 #include "PPCSubtarget.h" 16 #include "PPCTargetMachine.h" 17 #include "llvm/CodeGen/GlobalISel/InstructionSelector.h" 18 #include "llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h" 19 #include "llvm/CodeGen/MachineFunction.h" 20 #include "llvm/IR/IntrinsicsPowerPC.h" 21 #include "llvm/Support/Debug.h" 22 23 #define DEBUG_TYPE "ppc-gisel" 24 25 using namespace llvm; 26 27 namespace { 28 29 #define GET_GLOBALISEL_PREDICATE_BITSET 30 #include "PPCGenGlobalISel.inc" 31 #undef GET_GLOBALISEL_PREDICATE_BITSET 32 33 class PPCInstructionSelector : public InstructionSelector { 34 public: 35 PPCInstructionSelector(const PPCTargetMachine &TM, const PPCSubtarget &STI, 36 const PPCRegisterBankInfo &RBI); 37 38 bool select(MachineInstr &I) override; 39 static const char *getName() { return DEBUG_TYPE; } 40 41 private: 42 /// tblgen generated 'select' implementation that is used as the initial 43 /// selector for the patterns that do not require complex C++. 44 bool selectImpl(MachineInstr &I, CodeGenCoverage &CoverageInfo) const; 45 46 const PPCInstrInfo &TII; 47 const PPCRegisterInfo &TRI; 48 const PPCRegisterBankInfo &RBI; 49 50 #define GET_GLOBALISEL_PREDICATES_DECL 51 #include "PPCGenGlobalISel.inc" 52 #undef GET_GLOBALISEL_PREDICATES_DECL 53 54 #define GET_GLOBALISEL_TEMPORARIES_DECL 55 #include "PPCGenGlobalISel.inc" 56 #undef GET_GLOBALISEL_TEMPORARIES_DECL 57 }; 58 59 } // end anonymous namespace 60 61 #define GET_GLOBALISEL_IMPL 62 #include "PPCGenGlobalISel.inc" 63 #undef GET_GLOBALISEL_IMPL 64 65 PPCInstructionSelector::PPCInstructionSelector(const PPCTargetMachine &TM, 66 const PPCSubtarget &STI, 67 const PPCRegisterBankInfo &RBI) 68 : TII(*STI.getInstrInfo()), TRI(*STI.getRegisterInfo()), RBI(RBI), 69 #define GET_GLOBALISEL_PREDICATES_INIT 70 #include "PPCGenGlobalISel.inc" 71 #undef GET_GLOBALISEL_PREDICATES_INIT 72 #define GET_GLOBALISEL_TEMPORARIES_INIT 73 #include "PPCGenGlobalISel.inc" 74 #undef GET_GLOBALISEL_TEMPORARIES_INIT 75 { 76 } 77 78 bool PPCInstructionSelector::select(MachineInstr &I) { 79 if (selectImpl(I, *CoverageInfo)) 80 return true; 81 return false; 82 } 83 84 namespace llvm { 85 InstructionSelector * 86 createPPCInstructionSelector(const PPCTargetMachine &TM, 87 const PPCSubtarget &Subtarget, 88 const PPCRegisterBankInfo &RBI) { 89 return new PPCInstructionSelector(TM, Subtarget, RBI); 90 } 91 } // end namespace llvm 92