1//===---- AMDILDevice.h - Define Device Data for AMDIL -----*- C++ -*------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//==-----------------------------------------------------------------------===//
9//
10// Interface for the subtarget data classes.
11//
12//===----------------------------------------------------------------------===//
13// This file will define the interface that each generation needs to
14// implement in order to correctly answer queries on the capabilities of the
15// specific hardware.
16//===----------------------------------------------------------------------===//
17#ifndef _AMDILDEVICEIMPL_H_
18#define _AMDILDEVICEIMPL_H_
19#include "AMDIL.h"
20#include "llvm/ADT/BitVector.h"
21
22namespace llvm {
23  class AMDGPUSubtarget;
24  class MCStreamer;
25//===----------------------------------------------------------------------===//
26// Interface for data that is specific to a single device
27//===----------------------------------------------------------------------===//
28class AMDGPUDevice {
29public:
30  AMDGPUDevice(AMDGPUSubtarget *ST);
31  virtual ~AMDGPUDevice();
32
33  // Enum values for the various memory types.
34  enum {
35    RAW_UAV_ID   = 0,
36    ARENA_UAV_ID = 1,
37    LDS_ID       = 2,
38    GDS_ID       = 3,
39    SCRATCH_ID   = 4,
40    CONSTANT_ID  = 5,
41    GLOBAL_ID    = 6,
42    MAX_IDS      = 7
43  } IO_TYPE_IDS;
44
45  // Returns the max LDS size that the hardware supports.  Size is in
46  // bytes.
47  virtual size_t getMaxLDSSize() const = 0;
48
49  // Returns the max GDS size that the hardware supports if the GDS is
50  // supported by the hardware.  Size is in bytes.
51  virtual size_t getMaxGDSSize() const;
52
53  // Returns the max number of hardware constant address spaces that
54  // are supported by this device.
55  virtual size_t getMaxNumCBs() const;
56
57  // Returns the max number of bytes a single hardware constant buffer
58  // can support.  Size is in bytes.
59  virtual size_t getMaxCBSize() const;
60
61  // Returns the max number of bytes allowed by the hardware scratch
62  // buffer.  Size is in bytes.
63  virtual size_t getMaxScratchSize() const;
64
65  // Get the flag that corresponds to the device.
66  virtual uint32_t getDeviceFlag() const;
67
68  // Returns the number of work-items that exist in a single hardware
69  // wavefront.
70  virtual size_t getWavefrontSize() const = 0;
71
72  // Get the generational name of this specific device.
73  virtual uint32_t getGeneration() const = 0;
74
75  // Get the stack alignment of this specific device.
76  virtual uint32_t getStackAlignment() const;
77
78  // Get the resource ID for this specific device.
79  virtual uint32_t getResourceID(uint32_t DeviceID) const = 0;
80
81  // Get the max number of UAV's for this device.
82  virtual uint32_t getMaxNumUAVs() const = 0;
83
84  // API utilizing more detailed capabilities of each family of
85  // cards. If a capability is supported, then either usesHardware or
86  // usesSoftware returned true.  If usesHardware returned true, then
87  // usesSoftware must return false for the same capability.  Hardware
88  // execution means that the feature is done natively by the hardware
89  // and is not emulated by the softare.  Software execution means
90  // that the feature could be done in the hardware, but there is
91  // software that emulates it with possibly using the hardware for
92  // support since the hardware does not fully comply with OpenCL
93  // specs.
94  bool isSupported(AMDGPUDeviceInfo::Caps Mode) const;
95  bool usesHardware(AMDGPUDeviceInfo::Caps Mode) const;
96  bool usesSoftware(AMDGPUDeviceInfo::Caps Mode) const;
97  virtual std::string getDataLayout() const;
98  static const unsigned int MAX_LDS_SIZE_700 = 16384;
99  static const unsigned int MAX_LDS_SIZE_800 = 32768;
100  static const unsigned int WavefrontSize = 64;
101  static const unsigned int HalfWavefrontSize = 32;
102  static const unsigned int QuarterWavefrontSize = 16;
103protected:
104  virtual void setCaps();
105  llvm::BitVector mHWBits;
106  llvm::BitVector mSWBits;
107  AMDGPUSubtarget *mSTM;
108  uint32_t mDeviceFlag;
109private:
110  AMDGPUDeviceInfo::ExecutionMode
111  getExecutionMode(AMDGPUDeviceInfo::Caps Caps) const;
112}; // AMDILDevice
113
114} // namespace llvm
115#endif // _AMDILDEVICEIMPL_H_
116