| //===- PPCInstructionSelector.cpp --------------------------------*- C++ -*-==// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| /// \file |
| /// This file implements the targeting of the InstructionSelector class for |
| /// PowerPC. |
| //===----------------------------------------------------------------------===// |
| |
| #include "PPCInstrInfo.h" |
| #include "PPCRegisterBankInfo.h" |
| #include "PPCSubtarget.h" |
| #include "PPCTargetMachine.h" |
| #include "llvm/CodeGen/GlobalISel/InstructionSelector.h" |
| #include "llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h" |
| #include "llvm/CodeGen/MachineFunction.h" |
| #include "llvm/IR/IntrinsicsPowerPC.h" |
| #include "llvm/Support/Debug.h" |
| |
| #define DEBUG_TYPE "ppc-gisel" |
| |
| using namespace llvm; |
| |
| namespace { |
| |
| #define GET_GLOBALISEL_PREDICATE_BITSET |
| #include "PPCGenGlobalISel.inc" |
| #undef GET_GLOBALISEL_PREDICATE_BITSET |
| |
| class PPCInstructionSelector : public InstructionSelector { |
| public: |
| PPCInstructionSelector(const PPCTargetMachine &TM, const PPCSubtarget &STI, |
| const PPCRegisterBankInfo &RBI); |
| |
| bool select(MachineInstr &I) override; |
| static const char *getName() { return DEBUG_TYPE; } |
| |
| private: |
| /// tblgen generated 'select' implementation that is used as the initial |
| /// selector for the patterns that do not require complex C++. |
| bool selectImpl(MachineInstr &I, CodeGenCoverage &CoverageInfo) const; |
| |
| const PPCInstrInfo &TII; |
| const PPCRegisterInfo &TRI; |
| const PPCRegisterBankInfo &RBI; |
| |
| #define GET_GLOBALISEL_PREDICATES_DECL |
| #include "PPCGenGlobalISel.inc" |
| #undef GET_GLOBALISEL_PREDICATES_DECL |
| |
| #define GET_GLOBALISEL_TEMPORARIES_DECL |
| #include "PPCGenGlobalISel.inc" |
| #undef GET_GLOBALISEL_TEMPORARIES_DECL |
| }; |
| |
| } // end anonymous namespace |
| |
| #define GET_GLOBALISEL_IMPL |
| #include "PPCGenGlobalISel.inc" |
| #undef GET_GLOBALISEL_IMPL |
| |
| PPCInstructionSelector::PPCInstructionSelector(const PPCTargetMachine &TM, |
| const PPCSubtarget &STI, |
| const PPCRegisterBankInfo &RBI) |
| : InstructionSelector(), TII(*STI.getInstrInfo()), |
| TRI(*STI.getRegisterInfo()), RBI(RBI), |
| #define GET_GLOBALISEL_PREDICATES_INIT |
| #include "PPCGenGlobalISel.inc" |
| #undef GET_GLOBALISEL_PREDICATES_INIT |
| #define GET_GLOBALISEL_TEMPORARIES_INIT |
| #include "PPCGenGlobalISel.inc" |
| #undef GET_GLOBALISEL_TEMPORARIES_INIT |
| { |
| } |
| |
| bool PPCInstructionSelector::select(MachineInstr &I) { |
| if (selectImpl(I, *CoverageInfo)) |
| return true; |
| return false; |
| } |
| |
| namespace llvm { |
| InstructionSelector * |
| createPPCInstructionSelector(const PPCTargetMachine &TM, |
| const PPCSubtarget &Subtarget, |
| const PPCRegisterBankInfo &RBI) { |
| return new PPCInstructionSelector(TM, Subtarget, RBI); |
| } |
| } // end namespace llvm |