blob: c455a437d8d5ecc3f5fc5063c967fef94808f7c4 [file] [log] [blame]
Justin Holewinskiae556d32012-05-04 20:18:50 +00001//===-- NVPTX.h - Top-level interface for NVPTX representation --*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains the entry points for global functions defined in
11// the LLVM NVPTX back-end.
12//
13//===----------------------------------------------------------------------===//
14
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000015#ifndef LLVM_LIB_TARGET_NVPTX_NVPTX_H
16#define LLVM_LIB_TARGET_NVPTX_NVPTX_H
Justin Holewinskiae556d32012-05-04 20:18:50 +000017
Chandler Carruth802d7552012-12-04 07:12:27 +000018#include "MCTargetDesc/NVPTXBaseInfo.h"
Justin Holewinski18f3a1f2013-05-20 16:42:16 +000019#include "llvm/ADT/StringMap.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000020#include "llvm/IR/Module.h"
21#include "llvm/IR/Value.h"
Justin Holewinskiae556d32012-05-04 20:18:50 +000022#include "llvm/Support/ErrorHandling.h"
23#include "llvm/Target/TargetMachine.h"
Yuan Lin572a3a22012-06-05 19:06:13 +000024#include <cassert>
25#include <iosfwd>
Justin Holewinskiae556d32012-05-04 20:18:50 +000026
27namespace llvm {
28class NVPTXTargetMachine;
29class FunctionPass;
Justin Holewinskidbb3b2f2013-05-31 12:14:49 +000030class MachineFunctionPass;
Justin Holewinskiae556d32012-05-04 20:18:50 +000031class formatted_raw_ostream;
32
33namespace NVPTXCC {
34enum CondCodes {
35 EQ,
36 NE,
37 LT,
38 LE,
39 GT,
40 GE
41};
42}
43
Jacques Pienaar0c7dc9f2014-12-03 23:21:02 +000044FunctionPass *createNVPTXISelDag(NVPTXTargetMachine &TM,
45 llvm::CodeGenOpt::Level OptLevel);
Eli Bendersky264cd462014-03-31 15:56:26 +000046ModulePass *createNVPTXAssignValidGlobalNamesPass();
Justin Holewinski01f89f02013-05-20 12:13:32 +000047ModulePass *createGenericToNVVMPass();
Jingyue Wu13755602016-03-20 20:59:20 +000048FunctionPass *createNVPTXInferAddressSpacesPass();
Artem Belevich49e9a812016-05-26 17:02:56 +000049FunctionPass *createNVVMIntrRangePass(unsigned int SmVersion);
Justin Lebare3804cc2016-03-30 20:40:11 +000050FunctionPass *createNVVMReflectPass();
51FunctionPass *createNVVMReflectPass(const StringMap<int> &Mapping);
Justin Holewinskidbb3b2f2013-05-31 12:14:49 +000052MachineFunctionPass *createNVPTXPrologEpilogPass();
Justin Holewinski30d56a72014-04-09 15:39:15 +000053MachineFunctionPass *createNVPTXReplaceImageHandlesPass();
54FunctionPass *createNVPTXImageOptimizerPass();
Artem Belevich7e9c9a62016-07-20 21:44:07 +000055FunctionPass *createNVPTXLowerArgsPass(const NVPTXTargetMachine *TM);
Jingyue Wucd3afea2015-06-17 22:31:02 +000056BasicBlockPass *createNVPTXLowerAllocaPass();
Jingyue Wu9c711502015-06-24 20:20:16 +000057MachineFunctionPass *createNVPTXPeephole();
Justin Holewinskiae556d32012-05-04 20:18:50 +000058
Mehdi Aminif42454b2016-10-09 23:00:34 +000059Target &getTheNVPTXTarget32();
60Target &getTheNVPTXTarget64();
Justin Holewinskiae556d32012-05-04 20:18:50 +000061
Justin Holewinski0497ab12013-03-30 14:29:21 +000062namespace NVPTX {
Justin Holewinskiae556d32012-05-04 20:18:50 +000063enum DrvInterface {
64 NVCL,
Justin Holewinskib6e6cd32013-06-21 18:51:49 +000065 CUDA
Justin Holewinskiae556d32012-05-04 20:18:50 +000066};
67
68// A field inside TSFlags needs a shift and a mask. The usage is
69// always as follows :
70// ((TSFlags & fieldMask) >> fieldShift)
71// The enum keeps the mask, the shift, and all valid values of the
72// field in one place.
73enum VecInstType {
74 VecInstTypeShift = 0,
75 VecInstTypeMask = 0xF,
76
77 VecNOP = 0,
78 VecLoad = 1,
79 VecStore = 2,
80 VecBuild = 3,
81 VecShuffle = 4,
82 VecExtract = 5,
83 VecInsert = 6,
84 VecDest = 7,
85 VecOther = 15
86};
87
88enum SimpleMove {
89 SimpleMoveMask = 0x10,
90 SimpleMoveShift = 4
91};
92enum LoadStore {
93 isLoadMask = 0x20,
94 isLoadShift = 5,
95 isStoreMask = 0x40,
96 isStoreShift = 6
97};
98
99namespace PTXLdStInstCode {
Justin Holewinski0497ab12013-03-30 14:29:21 +0000100enum AddressSpace {
Justin Holewinskiae556d32012-05-04 20:18:50 +0000101 GENERIC = 0,
102 GLOBAL = 1,
103 CONSTANT = 2,
104 SHARED = 3,
105 PARAM = 4,
106 LOCAL = 5
107};
108enum FromType {
109 Unsigned = 0,
110 Signed,
111 Float
112};
113enum VecType {
114 Scalar = 1,
115 V2 = 2,
116 V4 = 4
117};
Alexander Kornienkof00654e2015-06-23 09:49:53 +0000118}
Justin Holewinskidc5e3b62013-06-28 17:58:04 +0000119
120/// PTXCvtMode - Conversion code enumeration
121namespace PTXCvtMode {
122enum CvtMode {
123 NONE = 0,
124 RNI,
125 RZI,
126 RMI,
127 RPI,
128 RN,
129 RZ,
130 RM,
131 RP,
132
133 BASE_MASK = 0x0F,
134 FTZ_FLAG = 0x10,
135 SAT_FLAG = 0x20
136};
Alexander Kornienkof00654e2015-06-23 09:49:53 +0000137}
Justin Holewinskidc5e3b62013-06-28 17:58:04 +0000138
139/// PTXCmpMode - Comparison mode enumeration
140namespace PTXCmpMode {
141enum CmpMode {
142 EQ = 0,
143 NE,
144 LT,
145 LE,
146 GT,
147 GE,
148 LO,
149 LS,
150 HI,
151 HS,
152 EQU,
153 NEU,
154 LTU,
155 LEU,
156 GTU,
157 GEU,
158 NUM,
159 // NAN is a MACRO
160 NotANumber,
161
162 BASE_MASK = 0xFF,
163 FTZ_FLAG = 0x100
164};
Alexander Kornienkof00654e2015-06-23 09:49:53 +0000165}
166}
167} // end namespace llvm;
Justin Holewinskiae556d32012-05-04 20:18:50 +0000168
169// Defines symbolic names for NVPTX registers. This defines a mapping from
170// register name to register number.
171#define GET_REGINFO_ENUM
172#include "NVPTXGenRegisterInfo.inc"
173
174// Defines symbolic names for the NVPTX instructions.
175#define GET_INSTRINFO_ENUM
176#include "NVPTXGenInstrInfo.inc"
177
178#endif