1//===-- 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
15#ifndef LLVM_LIB_TARGET_NVPTX_NVPTX_H
16#define LLVM_LIB_TARGET_NVPTX_NVPTX_H
17
18#include "MCTargetDesc/NVPTXBaseInfo.h"
19#include "llvm/ADT/StringMap.h"
20#include "llvm/IR/Module.h"
21#include "llvm/IR/Value.h"
22#include "llvm/Support/ErrorHandling.h"
23#include "llvm/Target/TargetMachine.h"
24#include <cassert>
25#include <iosfwd>
26
27namespace llvm {
28class NVPTXTargetMachine;
29class FunctionPass;
30class MachineFunctionPass;
31class formatted_raw_ostream;
32
33namespace NVPTXCC {
34enum CondCodes {
35  EQ,
36  NE,
37  LT,
38  LE,
39  GT,
40  GE
41};
42}
43
44inline static const char *NVPTXCondCodeToString(NVPTXCC::CondCodes CC) {
45  switch (CC) {
46  case NVPTXCC::NE:
47    return "ne";
48  case NVPTXCC::EQ:
49    return "eq";
50  case NVPTXCC::LT:
51    return "lt";
52  case NVPTXCC::LE:
53    return "le";
54  case NVPTXCC::GT:
55    return "gt";
56  case NVPTXCC::GE:
57    return "ge";
58  }
59  llvm_unreachable("Unknown condition code");
60}
61
62FunctionPass *createNVPTXISelDag(NVPTXTargetMachine &TM,
63                                 llvm::CodeGenOpt::Level OptLevel);
64ModulePass *createNVPTXAssignValidGlobalNamesPass();
65ModulePass *createGenericToNVVMPass();
66FunctionPass *createNVPTXFavorNonGenericAddrSpacesPass();
67ModulePass *createNVVMReflectPass();
68ModulePass *createNVVMReflectPass(const StringMap<int>& Mapping);
69MachineFunctionPass *createNVPTXPrologEpilogPass();
70MachineFunctionPass *createNVPTXReplaceImageHandlesPass();
71FunctionPass *createNVPTXImageOptimizerPass();
72FunctionPass *createNVPTXLowerStructArgsPass();
73
74bool isImageOrSamplerVal(const Value *, const Module *);
75
76extern Target TheNVPTXTarget32;
77extern Target TheNVPTXTarget64;
78
79namespace NVPTX {
80enum DrvInterface {
81  NVCL,
82  CUDA
83};
84
85// A field inside TSFlags needs a shift and a mask. The usage is
86// always as follows :
87// ((TSFlags & fieldMask) >> fieldShift)
88// The enum keeps the mask, the shift, and all valid values of the
89// field in one place.
90enum VecInstType {
91  VecInstTypeShift = 0,
92  VecInstTypeMask = 0xF,
93
94  VecNOP = 0,
95  VecLoad = 1,
96  VecStore = 2,
97  VecBuild = 3,
98  VecShuffle = 4,
99  VecExtract = 5,
100  VecInsert = 6,
101  VecDest = 7,
102  VecOther = 15
103};
104
105enum SimpleMove {
106  SimpleMoveMask = 0x10,
107  SimpleMoveShift = 4
108};
109enum LoadStore {
110  isLoadMask = 0x20,
111  isLoadShift = 5,
112  isStoreMask = 0x40,
113  isStoreShift = 6
114};
115
116namespace PTXLdStInstCode {
117enum AddressSpace {
118  GENERIC = 0,
119  GLOBAL = 1,
120  CONSTANT = 2,
121  SHARED = 3,
122  PARAM = 4,
123  LOCAL = 5
124};
125enum FromType {
126  Unsigned = 0,
127  Signed,
128  Float
129};
130enum VecType {
131  Scalar = 1,
132  V2 = 2,
133  V4 = 4
134};
135}
136
137/// PTXCvtMode - Conversion code enumeration
138namespace PTXCvtMode {
139enum CvtMode {
140  NONE = 0,
141  RNI,
142  RZI,
143  RMI,
144  RPI,
145  RN,
146  RZ,
147  RM,
148  RP,
149
150  BASE_MASK = 0x0F,
151  FTZ_FLAG = 0x10,
152  SAT_FLAG = 0x20
153};
154}
155
156/// PTXCmpMode - Comparison mode enumeration
157namespace PTXCmpMode {
158enum CmpMode {
159  EQ = 0,
160  NE,
161  LT,
162  LE,
163  GT,
164  GE,
165  LO,
166  LS,
167  HI,
168  HS,
169  EQU,
170  NEU,
171  LTU,
172  LEU,
173  GTU,
174  GEU,
175  NUM,
176  // NAN is a MACRO
177  NotANumber,
178
179  BASE_MASK = 0xFF,
180  FTZ_FLAG = 0x100
181};
182}
183}
184} // end namespace llvm;
185
186// Defines symbolic names for NVPTX registers.  This defines a mapping from
187// register name to register number.
188#define GET_REGINFO_ENUM
189#include "NVPTXGenRegisterInfo.inc"
190
191// Defines symbolic names for the NVPTX instructions.
192#define GET_INSTRINFO_ENUM
193#include "NVPTXGenInstrInfo.inc"
194
195#endif
196