//===-- 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"

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);
}

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;
}
