1285163Sdim//- WebAssemblyISelLowering.h - WebAssembly DAG Lowering Interface -*- C++ -*-//
2285163Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6285163Sdim//
7285163Sdim//===----------------------------------------------------------------------===//
8285163Sdim///
9285163Sdim/// \file
10341825Sdim/// This file defines the interfaces that WebAssembly uses to lower LLVM
11285163Sdim/// code into a selection DAG.
12285163Sdim///
13285163Sdim//===----------------------------------------------------------------------===//
14285163Sdim
15285163Sdim#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYISELLOWERING_H
16285163Sdim#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYISELLOWERING_H
17285163Sdim
18327952Sdim#include "llvm/CodeGen/TargetLowering.h"
19285163Sdim
20285163Sdimnamespace llvm {
21285163Sdim
22285163Sdimnamespace WebAssemblyISD {
23285163Sdim
24296417Sdimenum NodeType : unsigned {
25285163Sdim  FIRST_NUMBER = ISD::BUILTIN_OP_END,
26296417Sdim#define HANDLE_NODETYPE(NODE) NODE,
27360784Sdim#define HANDLE_MEM_NODETYPE(NODE)
28296417Sdim#include "WebAssemblyISD.def"
29360784Sdim  FIRST_MEM_OPCODE = ISD::FIRST_TARGET_MEMORY_OPCODE,
30296417Sdim#undef HANDLE_NODETYPE
31360784Sdim#undef HANDLE_MEM_NODETYPE
32360784Sdim#define HANDLE_NODETYPE(NODE)
33360784Sdim#define HANDLE_MEM_NODETYPE(NODE) NODE,
34360784Sdim#include "WebAssemblyISD.def"
35360784Sdim#undef HANDLE_NODETYPE
36360784Sdim#undef HANDLE_MEM_NODETYPE
37285163Sdim};
38285163Sdim
39344779Sdim} // end namespace WebAssemblyISD
40285163Sdim
41285163Sdimclass WebAssemblySubtarget;
42285163Sdimclass WebAssemblyTargetMachine;
43285163Sdim
44285163Sdimclass WebAssemblyTargetLowering final : public TargetLowering {
45344779Sdimpublic:
46285163Sdim  WebAssemblyTargetLowering(const TargetMachine &TM,
47285163Sdim                            const WebAssemblySubtarget &STI);
48285163Sdim
49344779Sdimprivate:
50285163Sdim  /// Keep a pointer to the WebAssemblySubtarget around so that we can make the
51285163Sdim  /// right decision when generating code for different targets.
52285163Sdim  const WebAssemblySubtarget *Subtarget;
53296417Sdim
54344779Sdim  AtomicExpansionKind shouldExpandAtomicRMWInIR(AtomicRMWInst *) const override;
55296417Sdim  FastISel *createFastISel(FunctionLoweringInfo &FuncInfo,
56296417Sdim                           const TargetLibraryInfo *LibInfo) const override;
57296417Sdim  MVT getScalarShiftAmountTy(const DataLayout &DL, EVT) const override;
58327952Sdim  MachineBasicBlock *
59327952Sdim  EmitInstrWithCustomInserter(MachineInstr &MI,
60327952Sdim                              MachineBasicBlock *MBB) const override;
61296417Sdim  const char *getTargetNodeName(unsigned Opcode) const override;
62344779Sdim  std::pair<unsigned, const TargetRegisterClass *>
63344779Sdim  getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
64344779Sdim                               StringRef Constraint, MVT VT) const override;
65296417Sdim  bool isCheapToSpeculateCttz() const override;
66296417Sdim  bool isCheapToSpeculateCtlz() const override;
67296417Sdim  bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty,
68327952Sdim                             unsigned AS,
69327952Sdim                             Instruction *I = nullptr) const override;
70309124Sdim  bool allowsMisalignedMemoryAccesses(EVT, unsigned AddrSpace, unsigned Align,
71353358Sdim                                      MachineMemOperand::Flags Flags,
72309124Sdim                                      bool *Fast) const override;
73321369Sdim  bool isIntDivCheap(EVT VT, AttributeList Attr) const override;
74360784Sdim  bool isVectorLoadExtDesirable(SDValue ExtVal) const override;
75341825Sdim  EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context,
76341825Sdim                         EVT VT) const override;
77344779Sdim  bool getTgtMemIntrinsic(IntrinsicInfo &Info, const CallInst &I,
78344779Sdim                          MachineFunction &MF,
79344779Sdim                          unsigned Intrinsic) const override;
80341825Sdim
81296417Sdim  SDValue LowerCall(CallLoweringInfo &CLI,
82296417Sdim                    SmallVectorImpl<SDValue> &InVals) const override;
83296417Sdim  bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
84296417Sdim                      bool isVarArg,
85296417Sdim                      const SmallVectorImpl<ISD::OutputArg> &Outs,
86296417Sdim                      LLVMContext &Context) const override;
87296417Sdim  SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
88296417Sdim                      const SmallVectorImpl<ISD::OutputArg> &Outs,
89309124Sdim                      const SmallVectorImpl<SDValue> &OutVals, const SDLoc &dl,
90296417Sdim                      SelectionDAG &DAG) const override;
91296417Sdim  SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
92296417Sdim                               bool IsVarArg,
93296417Sdim                               const SmallVectorImpl<ISD::InputArg> &Ins,
94309124Sdim                               const SDLoc &DL, SelectionDAG &DAG,
95296417Sdim                               SmallVectorImpl<SDValue> &InVals) const override;
96296417Sdim
97353358Sdim  void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
98353358Sdim                          SelectionDAG &DAG) const override;
99353358Sdim
100353358Sdim  const char *getClearCacheBuiltinName() const override {
101353358Sdim    report_fatal_error("llvm.clear_cache is not supported on wasm");
102353358Sdim  }
103353358Sdim
104296417Sdim  // Custom lowering hooks.
105296417Sdim  SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
106296417Sdim  SDValue LowerFrameIndex(SDValue Op, SelectionDAG &DAG) const;
107353358Sdim  SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
108309124Sdim  SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
109296417Sdim  SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
110296417Sdim  SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const;
111296417Sdim  SDValue LowerBR_JT(SDValue Op, SelectionDAG &DAG) const;
112296417Sdim  SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
113296417Sdim  SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
114309124Sdim  SDValue LowerCopyToReg(SDValue Op, SelectionDAG &DAG) const;
115353358Sdim  SDValue LowerIntrinsic(SDValue Op, SelectionDAG &DAG) const;
116344779Sdim  SDValue LowerSIGN_EXTEND_INREG(SDValue Op, SelectionDAG &DAG) const;
117353358Sdim  SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
118344779Sdim  SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
119360784Sdim  SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
120344779Sdim  SDValue LowerAccessVectorElement(SDValue Op, SelectionDAG &DAG) const;
121344779Sdim  SDValue LowerShift(SDValue Op, SelectionDAG &DAG) const;
122285163Sdim};
123285163Sdim
124296417Sdimnamespace WebAssembly {
125296417SdimFastISel *createFastISel(FunctionLoweringInfo &funcInfo,
126296417Sdim                         const TargetLibraryInfo *libInfo);
127344779Sdim} // end namespace WebAssembly
128296417Sdim
129344779Sdim} // end namespace llvm
130285163Sdim
131285163Sdim#endif
132