1//===-- AMDILEvergreenDevice.cpp - Device Info for Evergreen --------------===//
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#include "AMDILEvergreenDevice.h"
10
11using namespace llvm;
12
13AMDGPUEvergreenDevice::AMDGPUEvergreenDevice(AMDGPUSubtarget *ST)
14: AMDGPUDevice(ST) {
15  setCaps();
16  std::string name = ST->getDeviceName();
17  if (name == "cedar") {
18    mDeviceFlag = OCL_DEVICE_CEDAR;
19  } else if (name == "redwood") {
20    mDeviceFlag = OCL_DEVICE_REDWOOD;
21  } else if (name == "cypress") {
22    mDeviceFlag = OCL_DEVICE_CYPRESS;
23  } else {
24    mDeviceFlag = OCL_DEVICE_JUNIPER;
25  }
26}
27
28AMDGPUEvergreenDevice::~AMDGPUEvergreenDevice() {
29}
30
31size_t AMDGPUEvergreenDevice::getMaxLDSSize() const {
32  if (usesHardware(AMDGPUDeviceInfo::LocalMem)) {
33    return MAX_LDS_SIZE_800;
34  } else {
35    return 0;
36  }
37}
38size_t AMDGPUEvergreenDevice::getMaxGDSSize() const {
39  if (usesHardware(AMDGPUDeviceInfo::RegionMem)) {
40    return MAX_LDS_SIZE_800;
41  } else {
42    return 0;
43  }
44}
45uint32_t AMDGPUEvergreenDevice::getMaxNumUAVs() const {
46  return 12;
47}
48
49uint32_t AMDGPUEvergreenDevice::getResourceID(uint32_t id) const {
50  switch(id) {
51  default:
52    assert(0 && "ID type passed in is unknown!");
53    break;
54  case CONSTANT_ID:
55  case RAW_UAV_ID:
56    return GLOBAL_RETURN_RAW_UAV_ID;
57  case GLOBAL_ID:
58  case ARENA_UAV_ID:
59    return DEFAULT_ARENA_UAV_ID;
60  case LDS_ID:
61    if (usesHardware(AMDGPUDeviceInfo::LocalMem)) {
62      return DEFAULT_LDS_ID;
63    } else {
64      return DEFAULT_ARENA_UAV_ID;
65    }
66  case GDS_ID:
67    if (usesHardware(AMDGPUDeviceInfo::RegionMem)) {
68      return DEFAULT_GDS_ID;
69    } else {
70      return DEFAULT_ARENA_UAV_ID;
71    }
72  case SCRATCH_ID:
73    if (usesHardware(AMDGPUDeviceInfo::PrivateMem)) {
74      return DEFAULT_SCRATCH_ID;
75    } else {
76      return DEFAULT_ARENA_UAV_ID;
77    }
78  };
79  return 0;
80}
81
82size_t AMDGPUEvergreenDevice::getWavefrontSize() const {
83  return AMDGPUDevice::WavefrontSize;
84}
85
86uint32_t AMDGPUEvergreenDevice::getGeneration() const {
87  return AMDGPUDeviceInfo::HD5XXX;
88}
89
90void AMDGPUEvergreenDevice::setCaps() {
91  mSWBits.set(AMDGPUDeviceInfo::ArenaSegment);
92  mHWBits.set(AMDGPUDeviceInfo::ArenaUAV);
93  mHWBits.set(AMDGPUDeviceInfo::HW64BitDivMod);
94  mSWBits.reset(AMDGPUDeviceInfo::HW64BitDivMod);
95  mSWBits.set(AMDGPUDeviceInfo::Signed24BitOps);
96  if (mSTM->isOverride(AMDGPUDeviceInfo::ByteStores)) {
97    mHWBits.set(AMDGPUDeviceInfo::ByteStores);
98  }
99  if (mSTM->isOverride(AMDGPUDeviceInfo::Debug)) {
100    mSWBits.set(AMDGPUDeviceInfo::LocalMem);
101    mSWBits.set(AMDGPUDeviceInfo::RegionMem);
102  } else {
103    mHWBits.set(AMDGPUDeviceInfo::LocalMem);
104    mHWBits.set(AMDGPUDeviceInfo::RegionMem);
105  }
106  mHWBits.set(AMDGPUDeviceInfo::Images);
107  if (mSTM->isOverride(AMDGPUDeviceInfo::NoAlias)) {
108    mHWBits.set(AMDGPUDeviceInfo::NoAlias);
109  }
110  mHWBits.set(AMDGPUDeviceInfo::CachedMem);
111  if (mSTM->isOverride(AMDGPUDeviceInfo::MultiUAV)) {
112    mHWBits.set(AMDGPUDeviceInfo::MultiUAV);
113  }
114  mHWBits.set(AMDGPUDeviceInfo::ByteLDSOps);
115  mSWBits.reset(AMDGPUDeviceInfo::ByteLDSOps);
116  mHWBits.set(AMDGPUDeviceInfo::ArenaVectors);
117  mHWBits.set(AMDGPUDeviceInfo::LongOps);
118  mSWBits.reset(AMDGPUDeviceInfo::LongOps);
119  mHWBits.set(AMDGPUDeviceInfo::TmrReg);
120}
121
122AMDGPUCypressDevice::AMDGPUCypressDevice(AMDGPUSubtarget *ST)
123  : AMDGPUEvergreenDevice(ST) {
124  setCaps();
125}
126
127AMDGPUCypressDevice::~AMDGPUCypressDevice() {
128}
129
130void AMDGPUCypressDevice::setCaps() {
131  if (mSTM->isOverride(AMDGPUDeviceInfo::DoubleOps)) {
132    mHWBits.set(AMDGPUDeviceInfo::DoubleOps);
133    mHWBits.set(AMDGPUDeviceInfo::FMA);
134  }
135}
136
137
138AMDGPUCedarDevice::AMDGPUCedarDevice(AMDGPUSubtarget *ST)
139  : AMDGPUEvergreenDevice(ST) {
140  setCaps();
141}
142
143AMDGPUCedarDevice::~AMDGPUCedarDevice() {
144}
145
146void AMDGPUCedarDevice::setCaps() {
147  mSWBits.set(AMDGPUDeviceInfo::FMA);
148}
149
150size_t AMDGPUCedarDevice::getWavefrontSize() const {
151  return AMDGPUDevice::QuarterWavefrontSize;
152}
153
154AMDGPURedwoodDevice::AMDGPURedwoodDevice(AMDGPUSubtarget *ST)
155  : AMDGPUEvergreenDevice(ST) {
156  setCaps();
157}
158
159AMDGPURedwoodDevice::~AMDGPURedwoodDevice()
160{
161}
162
163void AMDGPURedwoodDevice::setCaps() {
164  mSWBits.set(AMDGPUDeviceInfo::FMA);
165}
166
167size_t AMDGPURedwoodDevice::getWavefrontSize() const {
168  return AMDGPUDevice::HalfWavefrontSize;
169}
170