Home | History | Annotate | Line # | Download | only in GISel
      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     : InstructionSelector(), TII(*STI.getInstrInfo()),
     69       TRI(*STI.getRegisterInfo()), RBI(RBI),
     70 #define GET_GLOBALISEL_PREDICATES_INIT
     71 #include "PPCGenGlobalISel.inc"
     72 #undef GET_GLOBALISEL_PREDICATES_INIT
     73 #define GET_GLOBALISEL_TEMPORARIES_INIT
     74 #include "PPCGenGlobalISel.inc"
     75 #undef GET_GLOBALISEL_TEMPORARIES_INIT
     76 {
     77 }
     78 
     79 bool PPCInstructionSelector::select(MachineInstr &I) {
     80   if (selectImpl(I, *CoverageInfo))
     81     return true;
     82   return false;
     83 }
     84 
     85 namespace llvm {
     86 InstructionSelector *
     87 createPPCInstructionSelector(const PPCTargetMachine &TM,
     88                              const PPCSubtarget &Subtarget,
     89                              const PPCRegisterBankInfo &RBI) {
     90   return new PPCInstructionSelector(TM, Subtarget, RBI);
     91 }
     92 } // end namespace llvm
     93