NVPTX.h revision 249423
1239310Sdim//===-- NVPTX.h - Top-level interface for NVPTX representation --*- C++ -*-===//
2239310Sdim//
3239310Sdim//                     The LLVM Compiler Infrastructure
4239310Sdim//
5239310Sdim// This file is distributed under the University of Illinois Open Source
6239310Sdim// License. See LICENSE.TXT for details.
7239310Sdim//
8239310Sdim//===----------------------------------------------------------------------===//
9239310Sdim//
10239310Sdim// This file contains the entry points for global functions defined in
11239310Sdim// the LLVM NVPTX back-end.
12239310Sdim//
13239310Sdim//===----------------------------------------------------------------------===//
14239310Sdim
15239310Sdim#ifndef LLVM_TARGET_NVPTX_H
16239310Sdim#define LLVM_TARGET_NVPTX_H
17239310Sdim
18249423Sdim#include "MCTargetDesc/NVPTXBaseInfo.h"
19249423Sdim#include "llvm/IR/Module.h"
20249423Sdim#include "llvm/IR/Value.h"
21239310Sdim#include "llvm/Support/ErrorHandling.h"
22239310Sdim#include "llvm/Target/TargetMachine.h"
23239310Sdim#include <cassert>
24239310Sdim#include <iosfwd>
25239310Sdim
26239310Sdimnamespace llvm {
27239310Sdimclass NVPTXTargetMachine;
28239310Sdimclass FunctionPass;
29239310Sdimclass formatted_raw_ostream;
30239310Sdim
31239310Sdimnamespace NVPTXCC {
32239310Sdimenum CondCodes {
33239310Sdim  EQ,
34239310Sdim  NE,
35239310Sdim  LT,
36239310Sdim  LE,
37239310Sdim  GT,
38239310Sdim  GE
39239310Sdim};
40239310Sdim}
41239310Sdim
42239310Sdiminline static const char *NVPTXCondCodeToString(NVPTXCC::CondCodes CC) {
43239310Sdim  switch (CC) {
44249423Sdim  case NVPTXCC::NE:
45249423Sdim    return "ne";
46249423Sdim  case NVPTXCC::EQ:
47249423Sdim    return "eq";
48249423Sdim  case NVPTXCC::LT:
49249423Sdim    return "lt";
50249423Sdim  case NVPTXCC::LE:
51249423Sdim    return "le";
52249423Sdim  case NVPTXCC::GT:
53249423Sdim    return "gt";
54249423Sdim  case NVPTXCC::GE:
55249423Sdim    return "ge";
56239310Sdim  }
57239310Sdim  llvm_unreachable("Unknown condition code");
58239310Sdim}
59239310Sdim
60249423SdimFunctionPass *
61249423SdimcreateNVPTXISelDag(NVPTXTargetMachine &TM, llvm::CodeGenOpt::Level OptLevel);
62239310SdimFunctionPass *createLowerStructArgsPass(NVPTXTargetMachine &);
63239310SdimFunctionPass *createNVPTXReMatPass(NVPTXTargetMachine &);
64239310SdimFunctionPass *createNVPTXReMatBlockPass(NVPTXTargetMachine &);
65239310Sdim
66239310Sdimbool isImageOrSamplerVal(const Value *, const Module *);
67239310Sdim
68239310Sdimextern Target TheNVPTXTarget32;
69239310Sdimextern Target TheNVPTXTarget64;
70239310Sdim
71249423Sdimnamespace NVPTX {
72239310Sdimenum DrvInterface {
73239310Sdim  NVCL,
74239310Sdim  CUDA,
75239310Sdim  TEST
76239310Sdim};
77239310Sdim
78239310Sdim// A field inside TSFlags needs a shift and a mask. The usage is
79239310Sdim// always as follows :
80239310Sdim// ((TSFlags & fieldMask) >> fieldShift)
81239310Sdim// The enum keeps the mask, the shift, and all valid values of the
82239310Sdim// field in one place.
83239310Sdimenum VecInstType {
84239310Sdim  VecInstTypeShift = 0,
85239310Sdim  VecInstTypeMask = 0xF,
86239310Sdim
87239310Sdim  VecNOP = 0,
88239310Sdim  VecLoad = 1,
89239310Sdim  VecStore = 2,
90239310Sdim  VecBuild = 3,
91239310Sdim  VecShuffle = 4,
92239310Sdim  VecExtract = 5,
93239310Sdim  VecInsert = 6,
94239310Sdim  VecDest = 7,
95239310Sdim  VecOther = 15
96239310Sdim};
97239310Sdim
98239310Sdimenum SimpleMove {
99239310Sdim  SimpleMoveMask = 0x10,
100239310Sdim  SimpleMoveShift = 4
101239310Sdim};
102239310Sdimenum LoadStore {
103239310Sdim  isLoadMask = 0x20,
104239310Sdim  isLoadShift = 5,
105239310Sdim  isStoreMask = 0x40,
106239310Sdim  isStoreShift = 6
107239310Sdim};
108239310Sdim
109239310Sdimnamespace PTXLdStInstCode {
110249423Sdimenum AddressSpace {
111239310Sdim  GENERIC = 0,
112239310Sdim  GLOBAL = 1,
113239310Sdim  CONSTANT = 2,
114239310Sdim  SHARED = 3,
115239310Sdim  PARAM = 4,
116239310Sdim  LOCAL = 5
117239310Sdim};
118239310Sdimenum FromType {
119239310Sdim  Unsigned = 0,
120239310Sdim  Signed,
121239310Sdim  Float
122239310Sdim};
123239310Sdimenum VecType {
124239310Sdim  Scalar = 1,
125239310Sdim  V2 = 2,
126239310Sdim  V4 = 4
127239310Sdim};
128239310Sdim}
129239310Sdim}
130239310Sdim} // end namespace llvm;
131239310Sdim
132239310Sdim// Defines symbolic names for NVPTX registers.  This defines a mapping from
133239310Sdim// register name to register number.
134239310Sdim#define GET_REGINFO_ENUM
135239310Sdim#include "NVPTXGenRegisterInfo.inc"
136239310Sdim
137239310Sdim// Defines symbolic names for the NVPTX instructions.
138239310Sdim#define GET_INSTRINFO_ENUM
139239310Sdim#include "NVPTXGenInstrInfo.inc"
140239310Sdim
141239310Sdim#endif
142