//===- WebAssemblyInstructionSelector.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 /// WebAssembly. /// \todo This should be generated by TableGen. //===----------------------------------------------------------------------===// #include "GISel/WebAssemblyRegisterBankInfo.h" #include "MCTargetDesc/WebAssemblyMCTargetDesc.h" #include "WebAssemblyRegisterInfo.h" #include "WebAssemblySubtarget.h" #include "WebAssemblyTargetMachine.h" #include "llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h" #include "llvm/CodeGen/GlobalISel/InstructionSelector.h" #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h" #include "llvm/CodeGen/GlobalISel/Utils.h" #include "llvm/CodeGen/MachineOperand.h" #include "llvm/CodeGen/TargetLowering.h" #include "llvm/IR/IntrinsicsWebAssembly.h" #define DEBUG_TYPE "wasm-isel" using namespace llvm; namespace { #define GET_GLOBALISEL_PREDICATE_BITSET #include "WebAssemblyGenGlobalISel.inc" #undef GET_GLOBALISEL_PREDICATE_BITSET class WebAssemblyInstructionSelector : public InstructionSelector { public: WebAssemblyInstructionSelector(const WebAssemblyTargetMachine &TM, const WebAssemblySubtarget &STI, const WebAssemblyRegisterBankInfo &RBI); bool select(MachineInstr &I) override; static const char *getName() { return DEBUG_TYPE; } private: bool selectImpl(MachineInstr &I, CodeGenCoverage &CoverageInfo) const; const WebAssemblyTargetMachine &TM; // const WebAssemblySubtarget &STI; const WebAssemblyInstrInfo &TII; const WebAssemblyRegisterInfo &TRI; const WebAssemblyRegisterBankInfo &RBI; #define GET_GLOBALISEL_PREDICATES_DECL #include "WebAssemblyGenGlobalISel.inc" #undef GET_GLOBALISEL_PREDICATES_DECL #define GET_GLOBALISEL_TEMPORARIES_DECL #include "WebAssemblyGenGlobalISel.inc" #undef GET_GLOBALISEL_TEMPORARIES_DECL }; } // end anonymous namespace #define GET_GLOBALISEL_IMPL #include "WebAssemblyGenGlobalISel.inc" #undef GET_GLOBALISEL_IMPL WebAssemblyInstructionSelector::WebAssemblyInstructionSelector( const WebAssemblyTargetMachine &TM, const WebAssemblySubtarget &STI, const WebAssemblyRegisterBankInfo &RBI) : TM(TM), /*STI(STI),*/ TII(*STI.getInstrInfo()), TRI(*STI.getRegisterInfo()), RBI(RBI), #define GET_GLOBALISEL_PREDICATES_INIT #include "WebAssemblyGenGlobalISel.inc" #undef GET_GLOBALISEL_PREDICATES_INIT #define GET_GLOBALISEL_TEMPORARIES_INIT #include "WebAssemblyGenGlobalISel.inc" #undef GET_GLOBALISEL_TEMPORARIES_INIT { } bool WebAssemblyInstructionSelector::select(MachineInstr &I) { if (selectImpl(I, *CoverageInfo)) return true; return false; } namespace llvm { InstructionSelector * createWebAssemblyInstructionSelector(const WebAssemblyTargetMachine &TM, const WebAssemblySubtarget &Subtarget, const WebAssemblyRegisterBankInfo &RBI) { return new WebAssemblyInstructionSelector(TM, Subtarget, RBI); } } // namespace llvm