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