//===-- AMDILDeviceInfo.cpp - AMDILDeviceInfo class -----------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//==-----------------------------------------------------------------------===//
//
// Function that creates DeviceInfo from a device name and other information.
//
//==-----------------------------------------------------------------------===//
#include "AMDILDevices.h"
#include "AMDGPUSubtarget.h"

using namespace llvm;
namespace llvm {
namespace AMDGPUDeviceInfo {
    AMDGPUDevice*
getDeviceFromName(const std::string &deviceName, AMDGPUSubtarget *ptr,
                  bool is64bit, bool is64on32bit)
{
    if (deviceName.c_str()[2] == '7') {
        switch (deviceName.c_str()[3]) {
            case '1':
                return new AMDGPU710Device(ptr);
            case '7':
                return new AMDGPU770Device(ptr);
            default:
                return new AMDGPU7XXDevice(ptr);
        };
    } else if (deviceName == "cypress") {
#if DEBUG
      assert(!is64bit && "This device does not support 64bit pointers!");
      assert(!is64on32bit && "This device does not support 64bit"
          " on 32bit pointers!");
#endif
        return new AMDGPUCypressDevice(ptr);
    } else if (deviceName == "juniper") {
#if DEBUG
      assert(!is64bit && "This device does not support 64bit pointers!");
      assert(!is64on32bit && "This device does not support 64bit"
          " on 32bit pointers!");
#endif
        return new AMDGPUEvergreenDevice(ptr);
    } else if (deviceName == "redwood") {
#if DEBUG
      assert(!is64bit && "This device does not support 64bit pointers!");
      assert(!is64on32bit && "This device does not support 64bit"
          " on 32bit pointers!");
#endif
      return new AMDGPURedwoodDevice(ptr);
    } else if (deviceName == "cedar") {
#if DEBUG
      assert(!is64bit && "This device does not support 64bit pointers!");
      assert(!is64on32bit && "This device does not support 64bit"
          " on 32bit pointers!");
#endif
        return new AMDGPUCedarDevice(ptr);
    } else if (deviceName == "barts"
      || deviceName == "turks") {
#if DEBUG
      assert(!is64bit && "This device does not support 64bit pointers!");
      assert(!is64on32bit && "This device does not support 64bit"
          " on 32bit pointers!");
#endif
        return new AMDGPUNIDevice(ptr);
    } else if (deviceName == "cayman") {
#if DEBUG
      assert(!is64bit && "This device does not support 64bit pointers!");
      assert(!is64on32bit && "This device does not support 64bit"
          " on 32bit pointers!");
#endif
        return new AMDGPUCaymanDevice(ptr);
    } else if (deviceName == "caicos") {
#if DEBUG
      assert(!is64bit && "This device does not support 64bit pointers!");
      assert(!is64on32bit && "This device does not support 64bit"
          " on 32bit pointers!");
#endif
        return new AMDGPUNIDevice(ptr);
    } else if (deviceName == "SI") {
        return new AMDGPUSIDevice(ptr);
    } else {
#if DEBUG
      assert(!is64bit && "This device does not support 64bit pointers!");
      assert(!is64on32bit && "This device does not support 64bit"
          " on 32bit pointers!");
#endif
        return new AMDGPU7XXDevice(ptr);
    }
}
} // End namespace AMDGPUDeviceInfo
} // End namespace llvm
