Path: blob/main/contrib/llvm-project/llvm/lib/Target/NVPTX/NVPTXISelDAGToDAG.h
35271 views
//===-- NVPTXISelDAGToDAG.h - A dag to dag inst selector for NVPTX --------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file defines an instruction selector for the NVPTX target.9//10//===----------------------------------------------------------------------===//1112#ifndef LLVM_LIB_TARGET_NVPTX_NVPTXISELDAGTODAG_H13#define LLVM_LIB_TARGET_NVPTX_NVPTXISELDAGTODAG_H1415#include "MCTargetDesc/NVPTXBaseInfo.h"16#include "NVPTX.h"17#include "NVPTXISelLowering.h"18#include "NVPTXRegisterInfo.h"19#include "NVPTXTargetMachine.h"20#include "llvm/CodeGen/SelectionDAGISel.h"21#include "llvm/IR/InlineAsm.h"22#include "llvm/IR/Intrinsics.h"23#include "llvm/Support/Compiler.h"2425namespace llvm {2627class LLVM_LIBRARY_VISIBILITY NVPTXDAGToDAGISel : public SelectionDAGISel {28const NVPTXTargetMachine &TM;2930// If true, generate mul.wide from sext and mul31bool doMulWide;3233int getDivF32Level() const;34bool usePrecSqrtF32() const;35bool useF32FTZ() const;36bool allowFMA() const;37bool allowUnsafeFPMath() const;38bool doRsqrtOpt() const;3940public:41NVPTXDAGToDAGISel() = delete;4243explicit NVPTXDAGToDAGISel(NVPTXTargetMachine &tm, CodeGenOptLevel OptLevel);4445bool runOnMachineFunction(MachineFunction &MF) override;46const NVPTXSubtarget *Subtarget = nullptr;4748bool SelectInlineAsmMemoryOperand(const SDValue &Op,49InlineAsm::ConstraintCode ConstraintID,50std::vector<SDValue> &OutOps) override;5152private:53// Include the pieces autogenerated from the target description.54#include "NVPTXGenDAGISel.inc"5556void Select(SDNode *N) override;57bool tryIntrinsicNoChain(SDNode *N);58bool tryIntrinsicChain(SDNode *N);59void SelectTexSurfHandle(SDNode *N);60bool tryLoad(SDNode *N);61bool tryLoadVector(SDNode *N);62bool tryLDGLDU(SDNode *N);63bool tryStore(SDNode *N);64bool tryStoreVector(SDNode *N);65bool tryLoadParam(SDNode *N);66bool tryStoreRetval(SDNode *N);67bool tryStoreParam(SDNode *N);68void SelectAddrSpaceCast(SDNode *N);69bool tryTextureIntrinsic(SDNode *N);70bool trySurfaceIntrinsic(SDNode *N);71bool tryBFE(SDNode *N);72bool tryConstantFP(SDNode *N);73bool SelectSETP_F16X2(SDNode *N);74bool SelectSETP_BF16X2(SDNode *N);75bool tryEXTRACT_VECTOR_ELEMENT(SDNode *N);76void SelectV2I64toI128(SDNode *N);77void SelectI128toV2I64(SDNode *N);78inline SDValue getI32Imm(unsigned Imm, const SDLoc &DL) {79return CurDAG->getTargetConstant(Imm, DL, MVT::i32);80}8182// Match direct address complex pattern.83bool SelectDirectAddr(SDValue N, SDValue &Address);8485bool SelectADDRri_imp(SDNode *OpNode, SDValue Addr, SDValue &Base,86SDValue &Offset, MVT mvt);87bool SelectADDRri(SDNode *OpNode, SDValue Addr, SDValue &Base,88SDValue &Offset);89bool SelectADDRri64(SDNode *OpNode, SDValue Addr, SDValue &Base,90SDValue &Offset);91bool SelectADDRsi_imp(SDNode *OpNode, SDValue Addr, SDValue &Base,92SDValue &Offset, MVT mvt);93bool SelectADDRsi(SDNode *OpNode, SDValue Addr, SDValue &Base,94SDValue &Offset);95bool SelectADDRsi64(SDNode *OpNode, SDValue Addr, SDValue &Base,96SDValue &Offset);9798bool ChkMemSDNodeAddressSpace(SDNode *N, unsigned int spN) const;99100static unsigned GetConvertOpcode(MVT DestTy, MVT SrcTy, LoadSDNode *N);101};102103class NVPTXDAGToDAGISelLegacy : public SelectionDAGISelLegacy {104public:105static char ID;106explicit NVPTXDAGToDAGISelLegacy(NVPTXTargetMachine &tm,107CodeGenOptLevel OptLevel);108};109} // end namespace llvm110111#endif112113114