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