1f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//===-- AMDILDevice.cpp - Base class for AMDIL Devices --------------------===//
2f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//
3f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//                     The LLVM Compiler Infrastructure
4f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//
5f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// This file is distributed under the University of Illinois Open Source
6f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// License. See LICENSE.TXT for details.
7f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//
8f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard/// \file
9f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//==-----------------------------------------------------------------------===//
10f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "AMDILDevice.h"
11f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "AMDGPUSubtarget.h"
12f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
13f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardusing namespace llvm;
14f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// Default implementation for all of the classes.
15f98f2ce29e6e2996fa58f38979143eceaa818335Tom StellardAMDGPUDevice::AMDGPUDevice(AMDGPUSubtarget *ST) : mSTM(ST) {
16f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  mHWBits.resize(AMDGPUDeviceInfo::MaxNumberCapabilities);
17f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  mSWBits.resize(AMDGPUDeviceInfo::MaxNumberCapabilities);
18f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  setCaps();
19f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  DeviceFlag = OCL_DEVICE_ALL;
20f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
21f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
22f98f2ce29e6e2996fa58f38979143eceaa818335Tom StellardAMDGPUDevice::~AMDGPUDevice() {
23f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    mHWBits.clear();
24f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    mSWBits.clear();
25f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
26f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
27f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardsize_t AMDGPUDevice::getMaxGDSSize() const {
28f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  return 0;
29f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
30f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
31f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellarduint32_t
32f98f2ce29e6e2996fa58f38979143eceaa818335Tom StellardAMDGPUDevice::getDeviceFlag() const {
33f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  return DeviceFlag;
34f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
35f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
36f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardsize_t AMDGPUDevice::getMaxNumCBs() const {
37f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  if (usesHardware(AMDGPUDeviceInfo::ConstantMem)) {
38f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    return HW_MAX_NUM_CB;
39f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
40f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
41f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  return 0;
42f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
43f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
44f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardsize_t AMDGPUDevice::getMaxCBSize() const {
45f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  if (usesHardware(AMDGPUDeviceInfo::ConstantMem)) {
46f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    return MAX_CB_SIZE;
47f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
48f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
49f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  return 0;
50f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
51f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
52f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardsize_t AMDGPUDevice::getMaxScratchSize() const {
53f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  return 65536;
54f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
55f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
56f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellarduint32_t AMDGPUDevice::getStackAlignment() const {
57f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  return 16;
58f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
59f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
60f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUDevice::setCaps() {
61f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  mSWBits.set(AMDGPUDeviceInfo::HalfOps);
62f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  mSWBits.set(AMDGPUDeviceInfo::ByteOps);
63f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  mSWBits.set(AMDGPUDeviceInfo::ShortOps);
64f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  mSWBits.set(AMDGPUDeviceInfo::HW64BitDivMod);
65f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  if (mSTM->isOverride(AMDGPUDeviceInfo::NoInline)) {
66f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    mSWBits.set(AMDGPUDeviceInfo::NoInline);
67f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
68f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  if (mSTM->isOverride(AMDGPUDeviceInfo::MacroDB)) {
69f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    mSWBits.set(AMDGPUDeviceInfo::MacroDB);
70f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
71f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  if (mSTM->isOverride(AMDGPUDeviceInfo::Debug)) {
72f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    mSWBits.set(AMDGPUDeviceInfo::ConstantMem);
73f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  } else {
74f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    mHWBits.set(AMDGPUDeviceInfo::ConstantMem);
75f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
76f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  if (mSTM->isOverride(AMDGPUDeviceInfo::Debug)) {
77f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    mSWBits.set(AMDGPUDeviceInfo::PrivateMem);
78f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  } else {
79f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    mHWBits.set(AMDGPUDeviceInfo::PrivateMem);
80f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
81f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  if (mSTM->isOverride(AMDGPUDeviceInfo::BarrierDetect)) {
82f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    mSWBits.set(AMDGPUDeviceInfo::BarrierDetect);
83f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
84f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  mSWBits.set(AMDGPUDeviceInfo::ByteLDSOps);
85f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  mSWBits.set(AMDGPUDeviceInfo::LongOps);
86f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
87f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
88f98f2ce29e6e2996fa58f38979143eceaa818335Tom StellardAMDGPUDeviceInfo::ExecutionMode
89f98f2ce29e6e2996fa58f38979143eceaa818335Tom StellardAMDGPUDevice::getExecutionMode(AMDGPUDeviceInfo::Caps Caps) const {
90f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  if (mHWBits[Caps]) {
91f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    assert(!mSWBits[Caps] && "Cannot set both SW and HW caps");
92f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    return AMDGPUDeviceInfo::Hardware;
93f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
94f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
95f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  if (mSWBits[Caps]) {
96f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    assert(!mHWBits[Caps] && "Cannot set both SW and HW caps");
97f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    return AMDGPUDeviceInfo::Software;
98f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
99f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
100f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  return AMDGPUDeviceInfo::Unsupported;
101f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
102f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
103f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
104f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardbool AMDGPUDevice::isSupported(AMDGPUDeviceInfo::Caps Mode) const {
105f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  return getExecutionMode(Mode) != AMDGPUDeviceInfo::Unsupported;
106f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
107f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
108f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardbool AMDGPUDevice::usesHardware(AMDGPUDeviceInfo::Caps Mode) const {
109f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  return getExecutionMode(Mode) == AMDGPUDeviceInfo::Hardware;
110f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
111f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
112f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardbool AMDGPUDevice::usesSoftware(AMDGPUDeviceInfo::Caps Mode) const {
113f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  return getExecutionMode(Mode) == AMDGPUDeviceInfo::Software;
114f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
115f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
116f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardstd::string
117f98f2ce29e6e2996fa58f38979143eceaa818335Tom StellardAMDGPUDevice::getDataLayout() const {
118ff4faabd2d98776372f45f7592482c9239cc40f2Tom Stellard  std::string DataLayout = std::string(
119ff4faabd2d98776372f45f7592482c9239cc40f2Tom Stellard   "e"
120ff4faabd2d98776372f45f7592482c9239cc40f2Tom Stellard   "-p:32:32:32"
121ff4faabd2d98776372f45f7592482c9239cc40f2Tom Stellard   "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32"
122ff4faabd2d98776372f45f7592482c9239cc40f2Tom Stellard   "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
123ff4faabd2d98776372f45f7592482c9239cc40f2Tom Stellard   "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048"
124ff4faabd2d98776372f45f7592482c9239cc40f2Tom Stellard   "-n32:64"
125ff4faabd2d98776372f45f7592482c9239cc40f2Tom Stellard  );
126ff4faabd2d98776372f45f7592482c9239cc40f2Tom Stellard
127ff4faabd2d98776372f45f7592482c9239cc40f2Tom Stellard  if (usesHardware(AMDGPUDeviceInfo::DoubleOps)) {
128ff4faabd2d98776372f45f7592482c9239cc40f2Tom Stellard    DataLayout.append("-f64:64:64");
129ff4faabd2d98776372f45f7592482c9239cc40f2Tom Stellard  }
130ff4faabd2d98776372f45f7592482c9239cc40f2Tom Stellard
131ff4faabd2d98776372f45f7592482c9239cc40f2Tom Stellard  return DataLayout;
132f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
133