| //===-- RISCVInstructionSelector.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 | |
| /// RISCV. | |
| /// \todo This should be generated by TableGen. | |
| //===----------------------------------------------------------------------===// | |
| #include "RISCVRegisterBankInfo.h" | |
| #include "RISCVSubtarget.h" | |
| #include "RISCVTargetMachine.h" | |
| #include "llvm/CodeGen/GlobalISel/InstructionSelector.h" | |
| #include "llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h" | |
| #include "llvm/Support/Debug.h" | |
| #define DEBUG_TYPE "riscv-isel" | |
| using namespace llvm; | |
| #define GET_GLOBALISEL_PREDICATE_BITSET | |
| #include "RISCVGenGlobalISel.inc" | |
| #undef GET_GLOBALISEL_PREDICATE_BITSET | |
| namespace { | |
| class RISCVInstructionSelector : public InstructionSelector { | |
| public: | |
| RISCVInstructionSelector(const RISCVTargetMachine &TM, | |
| const RISCVSubtarget &STI, | |
| const RISCVRegisterBankInfo &RBI); | |
| bool select(MachineInstr &I) override; | |
| static const char *getName() { return DEBUG_TYPE; } | |
| private: | |
| bool selectImpl(MachineInstr &I, CodeGenCoverage &CoverageInfo) const; | |
| const RISCVSubtarget &STI; | |
| const RISCVInstrInfo &TII; | |
| const RISCVRegisterInfo &TRI; | |
| const RISCVRegisterBankInfo &RBI; | |
| // FIXME: This is necessary because DAGISel uses "Subtarget->" and GlobalISel | |
| // uses "STI." in the code generated by TableGen. We need to unify the name of | |
| // Subtarget variable. | |
| const RISCVSubtarget *Subtarget = &STI; | |
| #define GET_GLOBALISEL_PREDICATES_DECL | |
| #include "RISCVGenGlobalISel.inc" | |
| #undef GET_GLOBALISEL_PREDICATES_DECL | |
| #define GET_GLOBALISEL_TEMPORARIES_DECL | |
| #include "RISCVGenGlobalISel.inc" | |
| #undef GET_GLOBALISEL_TEMPORARIES_DECL | |
| }; | |
| } // end anonymous namespace | |
| #define GET_GLOBALISEL_IMPL | |
| #include "RISCVGenGlobalISel.inc" | |
| #undef GET_GLOBALISEL_IMPL | |
| RISCVInstructionSelector::RISCVInstructionSelector( | |
| const RISCVTargetMachine &TM, const RISCVSubtarget &STI, | |
| const RISCVRegisterBankInfo &RBI) | |
| : InstructionSelector(), STI(STI), TII(*STI.getInstrInfo()), | |
| TRI(*STI.getRegisterInfo()), RBI(RBI), | |
| #define GET_GLOBALISEL_PREDICATES_INIT | |
| #include "RISCVGenGlobalISel.inc" | |
| #undef GET_GLOBALISEL_PREDICATES_INIT | |
| #define GET_GLOBALISEL_TEMPORARIES_INIT | |
| #include "RISCVGenGlobalISel.inc" | |
| #undef GET_GLOBALISEL_TEMPORARIES_INIT | |
| { | |
| } | |
| bool RISCVInstructionSelector::select(MachineInstr &I) { | |
| if (!isPreISelGenericOpcode(I.getOpcode())) { | |
| // Certain non-generic instructions also need some special handling. | |
| return true; | |
| } | |
| if (selectImpl(I, *CoverageInfo)) | |
| return true; | |
| return false; | |
| } | |
| namespace llvm { | |
| InstructionSelector * | |
| createRISCVInstructionSelector(const RISCVTargetMachine &TM, | |
| RISCVSubtarget &Subtarget, | |
| RISCVRegisterBankInfo &RBI) { | |
| return new RISCVInstructionSelector(TM, Subtarget, RBI); | |
| } | |
| } // end namespace llvm |