149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===-- NVPTX.h - Top-level interface for NVPTX representation --*- C++ -*-===//
249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//
349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//                     The LLVM Compiler Infrastructure
449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//
549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// This file is distributed under the University of Illinois Open Source
649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// License. See LICENSE.TXT for details.
749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//
849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===----------------------------------------------------------------------===//
949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//
1049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// This file contains the entry points for global functions defined in
1149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// the LLVM NVPTX back-end.
1249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//
1349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski//===----------------------------------------------------------------------===//
1449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
1549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#ifndef LLVM_TARGET_NVPTX_H
1649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#define LLVM_TARGET_NVPTX_H
1749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
18a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "MCTargetDesc/NVPTXBaseInfo.h"
19d22367559300c77c73e0ad9e193a33451bf8bf6cJustin Holewinski#include "llvm/ADT/StringMap.h"
200b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h"
210b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Value.h"
2249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Support/ErrorHandling.h"
2349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Target/TargetMachine.h"
2409b5df8996b37e61369026d50b44713984adbdc4Yuan Lin#include <cassert>
2509b5df8996b37e61369026d50b44713984adbdc4Yuan Lin#include <iosfwd>
2649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
2749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskinamespace llvm {
2849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiclass NVPTXTargetMachine;
2949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiclass FunctionPass;
305443e7d79044f3198f2da044f1b389b40d9bea6fJustin Holewinskiclass MachineFunctionPass;
3149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiclass formatted_raw_ostream;
3249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
3349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskinamespace NVPTXCC {
3449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskienum CondCodes {
3549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  EQ,
3649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  NE,
3749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  LT,
3849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  LE,
3949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  GT,
4049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  GE
4149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski};
4249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
4349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
4449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiinline static const char *NVPTXCondCodeToString(NVPTXCC::CondCodes CC) {
4549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  switch (CC) {
463639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  case NVPTXCC::NE:
473639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    return "ne";
483639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  case NVPTXCC::EQ:
493639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    return "eq";
503639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  case NVPTXCC::LT:
513639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    return "lt";
523639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  case NVPTXCC::LE:
533639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    return "le";
543639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  case NVPTXCC::GT:
553639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    return "gt";
563639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski  case NVPTXCC::GE:
573639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinski    return "ge";
5849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
59917644d0c347950f8e77f52797cb89ceb771215dChandler Carruth  llvm_unreachable("Unknown condition code");
6049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
6149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
623639ce2575660a0e6938d2e84e8bd9a738fd7051Justin HolewinskiFunctionPass *
633639ce2575660a0e6938d2e84e8bd9a738fd7051Justin HolewinskicreateNVPTXISelDag(NVPTXTargetMachine &TM, llvm::CodeGenOpt::Level OptLevel);
6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesModulePass *createNVPTXAssignValidGlobalNamesPass();
657536ecf2916a6a986f0d328069e3a210f34d5ea7Justin HolewinskiModulePass *createGenericToNVVMPass();
66dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesFunctionPass *createNVPTXFavorNonGenericAddrSpacesPass();
67d22367559300c77c73e0ad9e193a33451bf8bf6cJustin HolewinskiModulePass *createNVVMReflectPass();
68d22367559300c77c73e0ad9e193a33451bf8bf6cJustin HolewinskiModulePass *createNVVMReflectPass(const StringMap<int>& Mapping);
695443e7d79044f3198f2da044f1b389b40d9bea6fJustin HolewinskiMachineFunctionPass *createNVPTXPrologEpilogPass();
70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesMachineFunctionPass *createNVPTXReplaceImageHandlesPass();
71dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesFunctionPass *createNVPTXImageOptimizerPass();
7249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
7349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool isImageOrSamplerVal(const Value *, const Module *);
7449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
7549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiextern Target TheNVPTXTarget32;
7649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiextern Target TheNVPTXTarget64;
7749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
783639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskinamespace NVPTX {
7949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskienum DrvInterface {
8049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  NVCL,
810ff4287fe2245f417ed78fa535fce360b8b8df23Justin Holewinski  CUDA
8249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski};
8349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
8449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// A field inside TSFlags needs a shift and a mask. The usage is
8549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// always as follows :
8649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// ((TSFlags & fieldMask) >> fieldShift)
8749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// The enum keeps the mask, the shift, and all valid values of the
8849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// field in one place.
8949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskienum VecInstType {
9049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  VecInstTypeShift = 0,
9149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  VecInstTypeMask = 0xF,
9249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
9349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  VecNOP = 0,
9449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  VecLoad = 1,
9549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  VecStore = 2,
9649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  VecBuild = 3,
9749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  VecShuffle = 4,
9849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  VecExtract = 5,
9949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  VecInsert = 6,
10049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  VecDest = 7,
10149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  VecOther = 15
10249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski};
10349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
10449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskienum SimpleMove {
10549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SimpleMoveMask = 0x10,
10649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SimpleMoveShift = 4
10749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski};
10849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskienum LoadStore {
10949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  isLoadMask = 0x20,
11049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  isLoadShift = 5,
11149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  isStoreMask = 0x40,
11249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  isStoreShift = 6
11349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski};
11449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
11549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskinamespace PTXLdStInstCode {
1163639ce2575660a0e6938d2e84e8bd9a738fd7051Justin Holewinskienum AddressSpace {
11749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  GENERIC = 0,
11849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  GLOBAL = 1,
11949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  CONSTANT = 2,
12049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SHARED = 3,
12149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  PARAM = 4,
12249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  LOCAL = 5
12349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski};
12449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskienum FromType {
12549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  Unsigned = 0,
12649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  Signed,
12749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  Float
12849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski};
12949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskienum VecType {
13049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  Scalar = 1,
13149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  V2 = 2,
13249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  V4 = 4
13349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski};
13449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
135ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski
136ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski/// PTXCvtMode - Conversion code enumeration
137ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinskinamespace PTXCvtMode {
138ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinskienum CvtMode {
139ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  NONE = 0,
140ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  RNI,
141ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  RZI,
142ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  RMI,
143ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  RPI,
144ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  RN,
145ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  RZ,
146ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  RM,
147ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  RP,
148ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski
149ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  BASE_MASK = 0x0F,
150ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  FTZ_FLAG = 0x10,
151ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  SAT_FLAG = 0x20
152ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski};
153ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski}
154ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski
155ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski/// PTXCmpMode - Comparison mode enumeration
156ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinskinamespace PTXCmpMode {
157ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinskienum CmpMode {
158ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  EQ = 0,
159ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  NE,
160ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  LT,
161ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  LE,
162ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  GT,
163ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  GE,
164ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  LO,
165ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  LS,
166ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  HI,
167ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  HS,
168ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  EQU,
169ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  NEU,
170ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  LTU,
171ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  LEU,
172ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  GTU,
173ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  GEU,
174ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  NUM,
175ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  // NAN is a MACRO
176ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  NotANumber,
177ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski
178ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  BASE_MASK = 0xFF,
179ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski  FTZ_FLAG = 0x100
180ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski};
181ef0ccc93203e99077632cec7a0a15b8e1b704aeeJustin Holewinski}
18249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
18349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} // end namespace llvm;
18449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
18549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// Defines symbolic names for NVPTX registers.  This defines a mapping from
18649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// register name to register number.
18749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#define GET_REGINFO_ENUM
18849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTXGenRegisterInfo.inc"
18949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
19049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// Defines symbolic names for the NVPTX instructions.
19149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#define GET_INSTRINFO_ENUM
19249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTXGenInstrInfo.inc"
19349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
19449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#endif
195