1fa63f976522bd4faf19249e8c9ac4d3edda498d9Tom Stellard//===-- AMDILEvergreenDevice.cpp - Device Info for Evergreen --------------===//
2a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//
3a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//                     The LLVM Compiler Infrastructure
4a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//
5a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// This file is distributed under the University of Illinois Open Source
6a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// License. See LICENSE.TXT for details.
7a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//
8a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//==-----------------------------------------------------------------------===//
9a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard#include "AMDILEvergreenDevice.h"
10a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
11a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardusing namespace llvm;
12a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
132f921101c0826dc52a2c69f85c3da0f7f6e8212aTom StellardAMDGPUEvergreenDevice::AMDGPUEvergreenDevice(AMDGPUSubtarget *ST)
142f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard: AMDGPUDevice(ST) {
15a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  setCaps();
16a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  std::string name = ST->getDeviceName();
17a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  if (name == "cedar") {
18a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    mDeviceFlag = OCL_DEVICE_CEDAR;
19a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  } else if (name == "redwood") {
20a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    mDeviceFlag = OCL_DEVICE_REDWOOD;
21a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  } else if (name == "cypress") {
22a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    mDeviceFlag = OCL_DEVICE_CYPRESS;
23a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  } else {
24a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    mDeviceFlag = OCL_DEVICE_JUNIPER;
25a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
26a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
27a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
282f921101c0826dc52a2c69f85c3da0f7f6e8212aTom StellardAMDGPUEvergreenDevice::~AMDGPUEvergreenDevice() {
29a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
30a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
312f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellardsize_t AMDGPUEvergreenDevice::getMaxLDSSize() const {
322f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  if (usesHardware(AMDGPUDeviceInfo::LocalMem)) {
33a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    return MAX_LDS_SIZE_800;
34a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  } else {
35a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    return 0;
36a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
37a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
382f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellardsize_t AMDGPUEvergreenDevice::getMaxGDSSize() const {
392f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  if (usesHardware(AMDGPUDeviceInfo::RegionMem)) {
40a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    return MAX_LDS_SIZE_800;
41a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  } else {
42a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    return 0;
43a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
44a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
452f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellarduint32_t AMDGPUEvergreenDevice::getMaxNumUAVs() const {
46a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  return 12;
47a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
48a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
492f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellarduint32_t AMDGPUEvergreenDevice::getResourceID(uint32_t id) const {
50a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  switch(id) {
51a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  default:
52a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    assert(0 && "ID type passed in is unknown!");
53a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    break;
54a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  case CONSTANT_ID:
55a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  case RAW_UAV_ID:
56b72ab79d73b29ec087d90cf2c698adbab4db5defTom Stellard    return GLOBAL_RETURN_RAW_UAV_ID;
57a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  case GLOBAL_ID:
58a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  case ARENA_UAV_ID:
59a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    return DEFAULT_ARENA_UAV_ID;
60a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  case LDS_ID:
612f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard    if (usesHardware(AMDGPUDeviceInfo::LocalMem)) {
62a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      return DEFAULT_LDS_ID;
63a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    } else {
64a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      return DEFAULT_ARENA_UAV_ID;
65a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    }
66a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  case GDS_ID:
672f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard    if (usesHardware(AMDGPUDeviceInfo::RegionMem)) {
68a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      return DEFAULT_GDS_ID;
69a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    } else {
70a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      return DEFAULT_ARENA_UAV_ID;
71a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    }
72a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  case SCRATCH_ID:
732f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard    if (usesHardware(AMDGPUDeviceInfo::PrivateMem)) {
74a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      return DEFAULT_SCRATCH_ID;
75a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    } else {
76a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      return DEFAULT_ARENA_UAV_ID;
77a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    }
78a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  };
79a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  return 0;
80a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
81a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
822f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellardsize_t AMDGPUEvergreenDevice::getWavefrontSize() const {
832f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  return AMDGPUDevice::WavefrontSize;
84a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
85a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
862f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellarduint32_t AMDGPUEvergreenDevice::getGeneration() const {
872f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  return AMDGPUDeviceInfo::HD5XXX;
88a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
89a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
902f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellardvoid AMDGPUEvergreenDevice::setCaps() {
912f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mSWBits.set(AMDGPUDeviceInfo::ArenaSegment);
922f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mHWBits.set(AMDGPUDeviceInfo::ArenaUAV);
932f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mHWBits.set(AMDGPUDeviceInfo::HW64BitDivMod);
942f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mSWBits.reset(AMDGPUDeviceInfo::HW64BitDivMod);
952f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mSWBits.set(AMDGPUDeviceInfo::Signed24BitOps);
962f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  if (mSTM->isOverride(AMDGPUDeviceInfo::ByteStores)) {
972f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard    mHWBits.set(AMDGPUDeviceInfo::ByteStores);
98a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
992f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  if (mSTM->isOverride(AMDGPUDeviceInfo::Debug)) {
1002f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard    mSWBits.set(AMDGPUDeviceInfo::LocalMem);
1012f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard    mSWBits.set(AMDGPUDeviceInfo::RegionMem);
102a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  } else {
1032f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard    mHWBits.set(AMDGPUDeviceInfo::LocalMem);
1042f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard    mHWBits.set(AMDGPUDeviceInfo::RegionMem);
105a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
1062f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mHWBits.set(AMDGPUDeviceInfo::Images);
1072f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  if (mSTM->isOverride(AMDGPUDeviceInfo::NoAlias)) {
1082f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard    mHWBits.set(AMDGPUDeviceInfo::NoAlias);
109a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
1102f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mHWBits.set(AMDGPUDeviceInfo::CachedMem);
1112f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  if (mSTM->isOverride(AMDGPUDeviceInfo::MultiUAV)) {
1122f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard    mHWBits.set(AMDGPUDeviceInfo::MultiUAV);
113a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
1142f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mHWBits.set(AMDGPUDeviceInfo::ByteLDSOps);
1152f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mSWBits.reset(AMDGPUDeviceInfo::ByteLDSOps);
1162f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mHWBits.set(AMDGPUDeviceInfo::ArenaVectors);
1172f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mHWBits.set(AMDGPUDeviceInfo::LongOps);
1182f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mSWBits.reset(AMDGPUDeviceInfo::LongOps);
1192f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mHWBits.set(AMDGPUDeviceInfo::TmrReg);
120a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
121a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
1222f921101c0826dc52a2c69f85c3da0f7f6e8212aTom StellardAMDGPUCypressDevice::AMDGPUCypressDevice(AMDGPUSubtarget *ST)
1232f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  : AMDGPUEvergreenDevice(ST) {
124a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  setCaps();
125a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
126a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
1272f921101c0826dc52a2c69f85c3da0f7f6e8212aTom StellardAMDGPUCypressDevice::~AMDGPUCypressDevice() {
128a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
129a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
1302f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellardvoid AMDGPUCypressDevice::setCaps() {
1312f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  if (mSTM->isOverride(AMDGPUDeviceInfo::DoubleOps)) {
1322f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard    mHWBits.set(AMDGPUDeviceInfo::DoubleOps);
1332f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard    mHWBits.set(AMDGPUDeviceInfo::FMA);
134a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
135a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
136a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
137a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
1382f921101c0826dc52a2c69f85c3da0f7f6e8212aTom StellardAMDGPUCedarDevice::AMDGPUCedarDevice(AMDGPUSubtarget *ST)
1392f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  : AMDGPUEvergreenDevice(ST) {
140a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  setCaps();
141a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
142a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
1432f921101c0826dc52a2c69f85c3da0f7f6e8212aTom StellardAMDGPUCedarDevice::~AMDGPUCedarDevice() {
144a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
145a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
1462f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellardvoid AMDGPUCedarDevice::setCaps() {
1472f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mSWBits.set(AMDGPUDeviceInfo::FMA);
148a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
149a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
1502f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellardsize_t AMDGPUCedarDevice::getWavefrontSize() const {
1512f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  return AMDGPUDevice::QuarterWavefrontSize;
152a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
153a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
1542f921101c0826dc52a2c69f85c3da0f7f6e8212aTom StellardAMDGPURedwoodDevice::AMDGPURedwoodDevice(AMDGPUSubtarget *ST)
1552f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  : AMDGPUEvergreenDevice(ST) {
156a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  setCaps();
157a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
158a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
1592f921101c0826dc52a2c69f85c3da0f7f6e8212aTom StellardAMDGPURedwoodDevice::~AMDGPURedwoodDevice()
160a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
161a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
162a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
1632f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellardvoid AMDGPURedwoodDevice::setCaps() {
1642f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mSWBits.set(AMDGPUDeviceInfo::FMA);
165a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
166a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
1672f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellardsize_t AMDGPURedwoodDevice::getWavefrontSize() const {
1682f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  return AMDGPUDevice::HalfWavefrontSize;
169a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
170