| //===- 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 |