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