//===-- AMDILEvergreenDevice.cpp - Device Info for Evergreen --------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //==-----------------------------------------------------------------------===// #include "AMDILEvergreenDevice.h" #ifdef UPSTREAM_LLVM #include "AMDILEGAsmPrinter.h" #endif using namespace llvm; AMDGPUEvergreenDevice::AMDGPUEvergreenDevice(AMDGPUSubtarget *ST) : AMDGPUDevice(ST) { setCaps(); std::string name = ST->getDeviceName(); if (name == "cedar") { mDeviceFlag = OCL_DEVICE_CEDAR; } else if (name == "redwood") { mDeviceFlag = OCL_DEVICE_REDWOOD; } else if (name == "cypress") { mDeviceFlag = OCL_DEVICE_CYPRESS; } else { mDeviceFlag = OCL_DEVICE_JUNIPER; } } AMDGPUEvergreenDevice::~AMDGPUEvergreenDevice() { } size_t AMDGPUEvergreenDevice::getMaxLDSSize() const { if (usesHardware(AMDGPUDeviceInfo::LocalMem)) { return MAX_LDS_SIZE_800; } else { return 0; } } size_t AMDGPUEvergreenDevice::getMaxGDSSize() const { if (usesHardware(AMDGPUDeviceInfo::RegionMem)) { return MAX_LDS_SIZE_800; } else { return 0; } } uint32_t AMDGPUEvergreenDevice::getMaxNumUAVs() const { return 12; } uint32_t AMDGPUEvergreenDevice::getResourceID(uint32_t id) const { switch(id) { default: assert(0 && "ID type passed in is unknown!"); break; case CONSTANT_ID: case RAW_UAV_ID: return GLOBAL_RETURN_RAW_UAV_ID; case GLOBAL_ID: case ARENA_UAV_ID: return DEFAULT_ARENA_UAV_ID; case LDS_ID: if (usesHardware(AMDGPUDeviceInfo::LocalMem)) { return DEFAULT_LDS_ID; } else { return DEFAULT_ARENA_UAV_ID; } case GDS_ID: if (usesHardware(AMDGPUDeviceInfo::RegionMem)) { return DEFAULT_GDS_ID; } else { return DEFAULT_ARENA_UAV_ID; } case SCRATCH_ID: if (usesHardware(AMDGPUDeviceInfo::PrivateMem)) { return DEFAULT_SCRATCH_ID; } else { return DEFAULT_ARENA_UAV_ID; } }; return 0; } size_t AMDGPUEvergreenDevice::getWavefrontSize() const { return AMDGPUDevice::WavefrontSize; } uint32_t AMDGPUEvergreenDevice::getGeneration() const { return AMDGPUDeviceInfo::HD5XXX; } void AMDGPUEvergreenDevice::setCaps() { mSWBits.set(AMDGPUDeviceInfo::ArenaSegment); mHWBits.set(AMDGPUDeviceInfo::ArenaUAV); mHWBits.set(AMDGPUDeviceInfo::HW64BitDivMod); mSWBits.reset(AMDGPUDeviceInfo::HW64BitDivMod); mSWBits.set(AMDGPUDeviceInfo::Signed24BitOps); if (mSTM->isOverride(AMDGPUDeviceInfo::ByteStores)) { mHWBits.set(AMDGPUDeviceInfo::ByteStores); } if (mSTM->isOverride(AMDGPUDeviceInfo::Debug)) { mSWBits.set(AMDGPUDeviceInfo::LocalMem); mSWBits.set(AMDGPUDeviceInfo::RegionMem); } else { mHWBits.set(AMDGPUDeviceInfo::LocalMem); mHWBits.set(AMDGPUDeviceInfo::RegionMem); } mHWBits.set(AMDGPUDeviceInfo::Images); if (mSTM->isOverride(AMDGPUDeviceInfo::NoAlias)) { mHWBits.set(AMDGPUDeviceInfo::NoAlias); } mHWBits.set(AMDGPUDeviceInfo::CachedMem); if (mSTM->isOverride(AMDGPUDeviceInfo::MultiUAV)) { mHWBits.set(AMDGPUDeviceInfo::MultiUAV); } mHWBits.set(AMDGPUDeviceInfo::ByteLDSOps); mSWBits.reset(AMDGPUDeviceInfo::ByteLDSOps); mHWBits.set(AMDGPUDeviceInfo::ArenaVectors); mHWBits.set(AMDGPUDeviceInfo::LongOps); mSWBits.reset(AMDGPUDeviceInfo::LongOps); mHWBits.set(AMDGPUDeviceInfo::TmrReg); } AsmPrinter* AMDGPUEvergreenDevice::getAsmPrinter(TargetMachine& TM, MCStreamer &Streamer) const { #ifdef UPSTREAM_LLVM return new AMDGPUEGAsmPrinter(TM, Streamer); #else return NULL; #endif } AMDGPUCypressDevice::AMDGPUCypressDevice(AMDGPUSubtarget *ST) : AMDGPUEvergreenDevice(ST) { setCaps(); } AMDGPUCypressDevice::~AMDGPUCypressDevice() { } void AMDGPUCypressDevice::setCaps() { if (mSTM->isOverride(AMDGPUDeviceInfo::DoubleOps)) { mHWBits.set(AMDGPUDeviceInfo::DoubleOps); mHWBits.set(AMDGPUDeviceInfo::FMA); } } AMDGPUCedarDevice::AMDGPUCedarDevice(AMDGPUSubtarget *ST) : AMDGPUEvergreenDevice(ST) { setCaps(); } AMDGPUCedarDevice::~AMDGPUCedarDevice() { } void AMDGPUCedarDevice::setCaps() { mSWBits.set(AMDGPUDeviceInfo::FMA); } size_t AMDGPUCedarDevice::getWavefrontSize() const { return AMDGPUDevice::QuarterWavefrontSize; } AMDGPURedwoodDevice::AMDGPURedwoodDevice(AMDGPUSubtarget *ST) : AMDGPUEvergreenDevice(ST) { setCaps(); } AMDGPURedwoodDevice::~AMDGPURedwoodDevice() { } void AMDGPURedwoodDevice::setCaps() { mSWBits.set(AMDGPUDeviceInfo::FMA); } size_t AMDGPURedwoodDevice::getWavefrontSize() const { return AMDGPUDevice::HalfWavefrontSize; }