//===-- 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/IR/IntrinsicsRISCV.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) : 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