blob: db8e01ea4043d94957e34106d2edaf3d486daa20 [file] [log] [blame]
Tom Stellardf98f2ce2012-12-11 21:25:42 +00001//===-- 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 {
Tom Stellardff4faab2013-03-04 17:40:28 +0000118 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;
Tom Stellardf98f2ce2012-12-11 21:25:42 +0000132}