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
1849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Value.h"
1949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Module.h"
2049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Support/ErrorHandling.h"
2149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "llvm/Target/TargetMachine.h"
2249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "MCTargetDesc/NVPTXBaseInfo.h"
2309b5df8996b37e61369026d50b44713984adbdc4Yuan Lin#include <cassert>
2409b5df8996b37e61369026d50b44713984adbdc4Yuan Lin#include <iosfwd>
2549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
2649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskinamespace llvm {
2749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiclass NVPTXTargetMachine;
2849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiclass FunctionPass;
2949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiclass formatted_raw_ostream;
3049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
3149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskinamespace NVPTXCC {
3249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskienum CondCodes {
3349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  EQ,
3449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  NE,
3549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  LT,
3649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  LE,
3749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  GT,
3849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  GE
3949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski};
4049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
4149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
4249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiinline static const char *NVPTXCondCodeToString(NVPTXCC::CondCodes CC) {
4349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  switch (CC) {
4449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  case NVPTXCC::NE:  return "ne";
4549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  case NVPTXCC::EQ:   return "eq";
4649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  case NVPTXCC::LT:   return "lt";
4749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  case NVPTXCC::LE:  return "le";
4849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  case NVPTXCC::GT:  return "gt";
4949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  case NVPTXCC::GE:   return "ge";
5049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  }
51917644d0c347950f8e77f52797cb89ceb771215dChandler Carruth  llvm_unreachable("Unknown condition code");
5249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
5349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
5449683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiFunctionPass *createNVPTXISelDag(NVPTXTargetMachine &TM,
5549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski                                 llvm::CodeGenOpt::Level OptLevel);
5649683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiFunctionPass *createVectorElementizePass(NVPTXTargetMachine &);
5749683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiFunctionPass *createLowerStructArgsPass(NVPTXTargetMachine &);
5849683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiFunctionPass *createNVPTXReMatPass(NVPTXTargetMachine &);
5949683f3c961379fbc088871a5d6304950f1f1cbcJustin HolewinskiFunctionPass *createNVPTXReMatBlockPass(NVPTXTargetMachine &);
6049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
6149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskibool isImageOrSamplerVal(const Value *, const Module *);
6249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
6349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiextern Target TheNVPTXTarget32;
6449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskiextern Target TheNVPTXTarget64;
6549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
6649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskinamespace NVPTX
6749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski{
6849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskienum DrvInterface {
6949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  NVCL,
7049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  CUDA,
7149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  TEST
7249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski};
7349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
7449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// A field inside TSFlags needs a shift and a mask. The usage is
7549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// always as follows :
7649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// ((TSFlags & fieldMask) >> fieldShift)
7749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// The enum keeps the mask, the shift, and all valid values of the
7849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// field in one place.
7949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskienum VecInstType {
8049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  VecInstTypeShift = 0,
8149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  VecInstTypeMask = 0xF,
8249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
8349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  VecNOP = 0,
8449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  VecLoad = 1,
8549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  VecStore = 2,
8649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  VecBuild = 3,
8749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  VecShuffle = 4,
8849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  VecExtract = 5,
8949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  VecInsert = 6,
9049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  VecDest = 7,
9149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  VecOther = 15
9249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski};
9349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
9449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskienum SimpleMove {
9549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SimpleMoveMask = 0x10,
9649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SimpleMoveShift = 4
9749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski};
9849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskienum LoadStore {
9949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  isLoadMask = 0x20,
10049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  isLoadShift = 5,
10149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  isStoreMask = 0x40,
10249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  isStoreShift = 6
10349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski};
10449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
10549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskinamespace PTXLdStInstCode {
10649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskienum AddressSpace{
10749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  GENERIC = 0,
10849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  GLOBAL = 1,
10949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  CONSTANT = 2,
11049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  SHARED = 3,
11149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  PARAM = 4,
11249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  LOCAL = 5
11349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski};
11449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskienum FromType {
11549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  Unsigned = 0,
11649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  Signed,
11749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  Float
11849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski};
11949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinskienum VecType {
12049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  Scalar = 1,
12149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  V2 = 2,
12249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski  V4 = 4
12349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski};
12449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
12549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski}
12649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski} // end namespace llvm;
12749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
12849683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// Defines symbolic names for NVPTX registers.  This defines a mapping from
12949683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// register name to register number.
13049683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#define GET_REGINFO_ENUM
13149683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTXGenRegisterInfo.inc"
13249683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
13349683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski// Defines symbolic names for the NVPTX instructions.
13449683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#define GET_INSTRINFO_ENUM
13549683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#include "NVPTXGenInstrInfo.inc"
13649683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski
13749683f3c961379fbc088871a5d6304950f1f1cbcJustin Holewinski#endif
138