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