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