1fa63f976522bd4faf19249e8c9ac4d3edda498d9Tom Stellard//===-- AMDILDevice.cpp - Base class for AMDIL Devices --------------------===//
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 "AMDILDevice.h"
10b72ab79d73b29ec087d90cf2c698adbab4db5defTom Stellard#include "AMDGPUSubtarget.h"
11a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
12a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardusing namespace llvm;
13a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// Default implementation for all of the classes.
142f921101c0826dc52a2c69f85c3da0f7f6e8212aTom StellardAMDGPUDevice::AMDGPUDevice(AMDGPUSubtarget *ST) : mSTM(ST)
15a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
162f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mHWBits.resize(AMDGPUDeviceInfo::MaxNumberCapabilities);
172f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mSWBits.resize(AMDGPUDeviceInfo::MaxNumberCapabilities);
18a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  setCaps();
19a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  mDeviceFlag = OCL_DEVICE_ALL;
20a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
21a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
222f921101c0826dc52a2c69f85c3da0f7f6e8212aTom StellardAMDGPUDevice::~AMDGPUDevice()
23a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
24a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    mHWBits.clear();
25a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    mSWBits.clear();
26a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
27a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
282f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellardsize_t AMDGPUDevice::getMaxGDSSize() const
29a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
30a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  return 0;
31a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
32a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
33a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellarduint32_t
342f921101c0826dc52a2c69f85c3da0f7f6e8212aTom StellardAMDGPUDevice::getDeviceFlag() const
35a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
36a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  return mDeviceFlag;
37a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
38a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
392f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellardsize_t AMDGPUDevice::getMaxNumCBs() const
40a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
412f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  if (usesHardware(AMDGPUDeviceInfo::ConstantMem)) {
42a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    return HW_MAX_NUM_CB;
43a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
44a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
45a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  return 0;
46a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
47a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
482f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellardsize_t AMDGPUDevice::getMaxCBSize() const
49a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
502f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  if (usesHardware(AMDGPUDeviceInfo::ConstantMem)) {
51a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    return MAX_CB_SIZE;
52a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
53a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
54a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  return 0;
55a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
56a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
572f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellardsize_t AMDGPUDevice::getMaxScratchSize() const
58a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
59a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  return 65536;
60a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
61a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
622f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellarduint32_t AMDGPUDevice::getStackAlignment() const
63a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
64a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  return 16;
65a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
66a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
672f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellardvoid AMDGPUDevice::setCaps()
68a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
692f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mSWBits.set(AMDGPUDeviceInfo::HalfOps);
702f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mSWBits.set(AMDGPUDeviceInfo::ByteOps);
712f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mSWBits.set(AMDGPUDeviceInfo::ShortOps);
722f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mSWBits.set(AMDGPUDeviceInfo::HW64BitDivMod);
732f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  if (mSTM->isOverride(AMDGPUDeviceInfo::NoInline)) {
742f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard    mSWBits.set(AMDGPUDeviceInfo::NoInline);
75a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
762f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  if (mSTM->isOverride(AMDGPUDeviceInfo::MacroDB)) {
772f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard    mSWBits.set(AMDGPUDeviceInfo::MacroDB);
78a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
792f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  if (mSTM->isOverride(AMDGPUDeviceInfo::Debug)) {
802f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard    mSWBits.set(AMDGPUDeviceInfo::ConstantMem);
81a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  } else {
822f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard    mHWBits.set(AMDGPUDeviceInfo::ConstantMem);
83a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
842f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  if (mSTM->isOverride(AMDGPUDeviceInfo::Debug)) {
852f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard    mSWBits.set(AMDGPUDeviceInfo::PrivateMem);
86a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  } else {
872f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard    mHWBits.set(AMDGPUDeviceInfo::PrivateMem);
88a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
892f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  if (mSTM->isOverride(AMDGPUDeviceInfo::BarrierDetect)) {
902f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard    mSWBits.set(AMDGPUDeviceInfo::BarrierDetect);
91a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
922f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mSWBits.set(AMDGPUDeviceInfo::ByteLDSOps);
932f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  mSWBits.set(AMDGPUDeviceInfo::LongOps);
94a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
95a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
962f921101c0826dc52a2c69f85c3da0f7f6e8212aTom StellardAMDGPUDeviceInfo::ExecutionMode
972f921101c0826dc52a2c69f85c3da0f7f6e8212aTom StellardAMDGPUDevice::getExecutionMode(AMDGPUDeviceInfo::Caps Caps) const
98a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
99a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  if (mHWBits[Caps]) {
100a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    assert(!mSWBits[Caps] && "Cannot set both SW and HW caps");
1012f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard    return AMDGPUDeviceInfo::Hardware;
102a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
103a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
104a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  if (mSWBits[Caps]) {
105a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    assert(!mHWBits[Caps] && "Cannot set both SW and HW caps");
1062f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard    return AMDGPUDeviceInfo::Software;
107a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard  }
108a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
1092f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  return AMDGPUDeviceInfo::Unsupported;
110a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
111a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
112a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
1132f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellardbool AMDGPUDevice::isSupported(AMDGPUDeviceInfo::Caps Mode) const
114a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
1152f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  return getExecutionMode(Mode) != AMDGPUDeviceInfo::Unsupported;
116a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
117a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
1182f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellardbool AMDGPUDevice::usesHardware(AMDGPUDeviceInfo::Caps Mode) const
119a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
1202f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  return getExecutionMode(Mode) == AMDGPUDeviceInfo::Hardware;
121a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
122a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
1232f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellardbool AMDGPUDevice::usesSoftware(AMDGPUDeviceInfo::Caps Mode) const
124a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
1252f921101c0826dc52a2c69f85c3da0f7f6e8212aTom Stellard  return getExecutionMode(Mode) == AMDGPUDeviceInfo::Software;
126a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
127a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard
128a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardstd::string
1292f921101c0826dc52a2c69f85c3da0f7f6e8212aTom StellardAMDGPUDevice::getDataLayout() const
130a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard{
131a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard    return std::string("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16"
132a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      "-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f80:32:32"
133a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64"
134a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      "-v96:128:128-v128:128:128-v192:256:256-v256:256:256"
135a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      "-v512:512:512-v1024:1024:1024-v2048:2048:2048"
136a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard      "-n8:16:32:64");
137a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard}
138