1 //===-- AMDILEvergreenDevice.cpp - TODO: Add brief description -------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //==-----------------------------------------------------------------------===//
9 #include "AMDILEvergreenDevice.h"
11 #include "AMDILEGAsmPrinter.h"
13 #include "AMDILIOExpansion.h"
14 #include "AMDILPointerManager.h"
18 AMDILEvergreenDevice::AMDILEvergreenDevice(AMDILSubtarget
*ST
)
21 std::string name
= ST
->getDeviceName();
22 if (name
== "cedar") {
23 mDeviceFlag
= OCL_DEVICE_CEDAR
;
24 } else if (name
== "redwood") {
25 mDeviceFlag
= OCL_DEVICE_REDWOOD
;
26 } else if (name
== "cypress") {
27 mDeviceFlag
= OCL_DEVICE_CYPRESS
;
29 mDeviceFlag
= OCL_DEVICE_JUNIPER
;
33 AMDILEvergreenDevice::~AMDILEvergreenDevice() {
36 size_t AMDILEvergreenDevice::getMaxLDSSize() const {
37 if (usesHardware(AMDILDeviceInfo::LocalMem
)) {
38 return MAX_LDS_SIZE_800
;
43 size_t AMDILEvergreenDevice::getMaxGDSSize() const {
44 if (usesHardware(AMDILDeviceInfo::RegionMem
)) {
45 return MAX_LDS_SIZE_800
;
50 uint32_t AMDILEvergreenDevice::getMaxNumUAVs() const {
54 uint32_t AMDILEvergreenDevice::getResourceID(uint32_t id
) const {
57 assert(0 && "ID type passed in is unknown!");
61 if (mSTM
->calVersion() >= CAL_VERSION_GLOBAL_RETURN_BUFFER
) {
62 return GLOBAL_RETURN_RAW_UAV_ID
;
64 return DEFAULT_RAW_UAV_ID
;
68 return DEFAULT_ARENA_UAV_ID
;
70 if (usesHardware(AMDILDeviceInfo::LocalMem
)) {
71 return DEFAULT_LDS_ID
;
73 return DEFAULT_ARENA_UAV_ID
;
76 if (usesHardware(AMDILDeviceInfo::RegionMem
)) {
77 return DEFAULT_GDS_ID
;
79 return DEFAULT_ARENA_UAV_ID
;
82 if (usesHardware(AMDILDeviceInfo::PrivateMem
)) {
83 return DEFAULT_SCRATCH_ID
;
85 return DEFAULT_ARENA_UAV_ID
;
91 size_t AMDILEvergreenDevice::getWavefrontSize() const {
92 return AMDILDevice::WavefrontSize
;
95 uint32_t AMDILEvergreenDevice::getGeneration() const {
96 return AMDILDeviceInfo::HD5XXX
;
99 void AMDILEvergreenDevice::setCaps() {
100 mSWBits
.set(AMDILDeviceInfo::ArenaSegment
);
101 mHWBits
.set(AMDILDeviceInfo::ArenaUAV
);
102 if (mSTM
->calVersion() >= CAL_VERSION_SC_140
) {
103 mHWBits
.set(AMDILDeviceInfo::HW64BitDivMod
);
104 mSWBits
.reset(AMDILDeviceInfo::HW64BitDivMod
);
106 mSWBits
.set(AMDILDeviceInfo::Signed24BitOps
);
107 if (mSTM
->isOverride(AMDILDeviceInfo::ByteStores
)) {
108 mHWBits
.set(AMDILDeviceInfo::ByteStores
);
110 if (mSTM
->isOverride(AMDILDeviceInfo::Debug
)) {
111 mSWBits
.set(AMDILDeviceInfo::LocalMem
);
112 mSWBits
.set(AMDILDeviceInfo::RegionMem
);
114 mHWBits
.set(AMDILDeviceInfo::LocalMem
);
115 mHWBits
.set(AMDILDeviceInfo::RegionMem
);
117 mHWBits
.set(AMDILDeviceInfo::Images
);
118 if (mSTM
->isOverride(AMDILDeviceInfo::NoAlias
)) {
119 mHWBits
.set(AMDILDeviceInfo::NoAlias
);
121 if (mSTM
->calVersion() > CAL_VERSION_GLOBAL_RETURN_BUFFER
) {
122 mHWBits
.set(AMDILDeviceInfo::CachedMem
);
124 if (mSTM
->isOverride(AMDILDeviceInfo::MultiUAV
)) {
125 mHWBits
.set(AMDILDeviceInfo::MultiUAV
);
127 if (mSTM
->calVersion() > CAL_VERSION_SC_136
) {
128 mHWBits
.set(AMDILDeviceInfo::ByteLDSOps
);
129 mSWBits
.reset(AMDILDeviceInfo::ByteLDSOps
);
130 mHWBits
.set(AMDILDeviceInfo::ArenaVectors
);
132 mSWBits
.set(AMDILDeviceInfo::ArenaVectors
);
134 if (mSTM
->calVersion() > CAL_VERSION_SC_137
) {
135 mHWBits
.set(AMDILDeviceInfo::LongOps
);
136 mSWBits
.reset(AMDILDeviceInfo::LongOps
);
138 mHWBits
.set(AMDILDeviceInfo::TmrReg
);
141 AMDILEvergreenDevice::getIOExpansion(
142 TargetMachine
& TM AMDIL_OPT_LEVEL_DECL
) const
144 return new AMDILEGIOExpansion(TM AMDIL_OPT_LEVEL_VAR
);
148 AMDILEvergreenDevice::getAsmPrinter(TargetMachine
& TM
, MCStreamer
&Streamer
) const
151 return new AMDILEGAsmPrinter(TM
, Streamer
);
158 AMDILEvergreenDevice::getPointerManager(
159 TargetMachine
& TM AMDIL_OPT_LEVEL_DECL
) const
161 return new AMDILEGPointerManager(TM AMDIL_OPT_LEVEL_VAR
);
164 AMDILCypressDevice::AMDILCypressDevice(AMDILSubtarget
*ST
)
165 : AMDILEvergreenDevice(ST
) {
169 AMDILCypressDevice::~AMDILCypressDevice() {
172 void AMDILCypressDevice::setCaps() {
173 if (mSTM
->isOverride(AMDILDeviceInfo::DoubleOps
)) {
174 mHWBits
.set(AMDILDeviceInfo::DoubleOps
);
175 mHWBits
.set(AMDILDeviceInfo::FMA
);
180 AMDILCedarDevice::AMDILCedarDevice(AMDILSubtarget
*ST
)
181 : AMDILEvergreenDevice(ST
) {
185 AMDILCedarDevice::~AMDILCedarDevice() {
188 void AMDILCedarDevice::setCaps() {
189 mSWBits
.set(AMDILDeviceInfo::FMA
);
192 size_t AMDILCedarDevice::getWavefrontSize() const {
193 return AMDILDevice::QuarterWavefrontSize
;
196 AMDILRedwoodDevice::AMDILRedwoodDevice(AMDILSubtarget
*ST
)
197 : AMDILEvergreenDevice(ST
) {
201 AMDILRedwoodDevice::~AMDILRedwoodDevice()
205 void AMDILRedwoodDevice::setCaps() {
206 mSWBits
.set(AMDILDeviceInfo::FMA
);
209 size_t AMDILRedwoodDevice::getWavefrontSize() const {
210 return AMDILDevice::HalfWavefrontSize
;