1//===-- NVPTX.h - Top-level interface for NVPTX representation --*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file contains the entry points for global functions defined in
10// the LLVM NVPTX back-end.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_NVPTX_NVPTX_H
15#define LLVM_LIB_TARGET_NVPTX_NVPTX_H
16
17#include "llvm/IR/PassManager.h"
18#include "llvm/Pass.h"
19#include "llvm/Support/CodeGen.h"
20
21namespace llvm {
22class NVPTXTargetMachine;
23class FunctionPass;
24class MachineFunctionPass;
25
26namespace NVPTXCC {
27enum CondCodes {
28  EQ,
29  NE,
30  LT,
31  LE,
32  GT,
33  GE
34};
35}
36
37FunctionPass *createNVPTXISelDag(NVPTXTargetMachine &TM,
38                                 llvm::CodeGenOpt::Level OptLevel);
39ModulePass *createNVPTXAssignValidGlobalNamesPass();
40ModulePass *createGenericToNVVMPass();
41FunctionPass *createNVVMIntrRangePass(unsigned int SmVersion);
42FunctionPass *createNVVMReflectPass(unsigned int SmVersion);
43MachineFunctionPass *createNVPTXPrologEpilogPass();
44MachineFunctionPass *createNVPTXReplaceImageHandlesPass();
45FunctionPass *createNVPTXImageOptimizerPass();
46FunctionPass *createNVPTXLowerArgsPass(const NVPTXTargetMachine *TM);
47FunctionPass *createNVPTXLowerAllocaPass();
48MachineFunctionPass *createNVPTXPeephole();
49MachineFunctionPass *createNVPTXProxyRegErasurePass();
50
51struct NVVMIntrRangePass : PassInfoMixin<NVVMIntrRangePass> {
52  NVVMIntrRangePass();
53  NVVMIntrRangePass(unsigned SmVersion) : SmVersion(SmVersion) {}
54  PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
55
56private:
57  unsigned SmVersion;
58};
59
60struct NVVMReflectPass : PassInfoMixin<NVVMReflectPass> {
61  NVVMReflectPass();
62  NVVMReflectPass(unsigned SmVersion) : SmVersion(SmVersion) {}
63  PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
64
65private:
66  unsigned SmVersion;
67};
68
69namespace NVPTX {
70enum DrvInterface {
71  NVCL,
72  CUDA
73};
74
75// A field inside TSFlags needs a shift and a mask. The usage is
76// always as follows :
77// ((TSFlags & fieldMask) >> fieldShift)
78// The enum keeps the mask, the shift, and all valid values of the
79// field in one place.
80enum VecInstType {
81  VecInstTypeShift = 0,
82  VecInstTypeMask = 0xF,
83
84  VecNOP = 0,
85  VecLoad = 1,
86  VecStore = 2,
87  VecBuild = 3,
88  VecShuffle = 4,
89  VecExtract = 5,
90  VecInsert = 6,
91  VecDest = 7,
92  VecOther = 15
93};
94
95enum SimpleMove {
96  SimpleMoveMask = 0x10,
97  SimpleMoveShift = 4
98};
99enum LoadStore {
100  isLoadMask = 0x20,
101  isLoadShift = 5,
102  isStoreMask = 0x40,
103  isStoreShift = 6
104};
105
106namespace PTXLdStInstCode {
107enum AddressSpace {
108  GENERIC = 0,
109  GLOBAL = 1,
110  CONSTANT = 2,
111  SHARED = 3,
112  PARAM = 4,
113  LOCAL = 5
114};
115enum FromType {
116  Unsigned = 0,
117  Signed,
118  Float,
119  Untyped
120};
121enum VecType {
122  Scalar = 1,
123  V2 = 2,
124  V4 = 4
125};
126}
127
128/// PTXCvtMode - Conversion code enumeration
129namespace PTXCvtMode {
130enum CvtMode {
131  NONE = 0,
132  RNI,
133  RZI,
134  RMI,
135  RPI,
136  RN,
137  RZ,
138  RM,
139  RP,
140
141  BASE_MASK = 0x0F,
142  FTZ_FLAG = 0x10,
143  SAT_FLAG = 0x20
144};
145}
146
147/// PTXCmpMode - Comparison mode enumeration
148namespace PTXCmpMode {
149enum CmpMode {
150  EQ = 0,
151  NE,
152  LT,
153  LE,
154  GT,
155  GE,
156  LO,
157  LS,
158  HI,
159  HS,
160  EQU,
161  NEU,
162  LTU,
163  LEU,
164  GTU,
165  GEU,
166  NUM,
167  // NAN is a MACRO
168  NotANumber,
169
170  BASE_MASK = 0xFF,
171  FTZ_FLAG = 0x100
172};
173}
174}
175} // end namespace llvm;
176
177// Defines symbolic names for NVPTX registers.  This defines a mapping from
178// register name to register number.
179#define GET_REGINFO_ENUM
180#include "NVPTXGenRegisterInfo.inc"
181
182// Defines symbolic names for the NVPTX instructions.
183#define GET_INSTRINFO_ENUM
184#include "NVPTXGenInstrInfo.inc"
185
186#endif
187