blob: 4b4d162ffbfff74ed7a2d66bea136d5b91869aa7 [file]
//===-- IntelGPUTargetParser - Parser for Intel GPU targets ---------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file implements a target parser for the Intel GPU list.
//
//===----------------------------------------------------------------------===//
#include "llvm/TargetParser/IntelGPUTargetParser.h"
#include "llvm/ADT/Twine.h"
#include <cassert>
using namespace llvm;
using namespace IntelGPU;
// A GPU IP version packs four fields, from the most significant bit down:
//
// 31 22 21 14 13 6 5 0
// +---------------+----------+----------+----------+
// | major | minor | reserved | revision |
// +---------------+----------+----------+----------+
// 10 bits 8 bits 8 bits 6 bits
//
// The reserved bits carry no information.
static constexpr uint32_t GPUIPMajorShift = 22;
static constexpr uint32_t GPUIPMinorShift = 14;
[[maybe_unused]] static constexpr uint32_t GPUIPMajorMask = 0x3ff;
static constexpr uint32_t GPUIPMinorMask = 0xff;
static constexpr uint32_t GPUIPRevisionMask = 0x3f;
// The bits that identify a device: the major and the minor version. Neither the
// revision nor the reserved bits take part in the lookup, because every
// revision of a device is one device as far as the compiler is concerned.
static constexpr uint32_t GPUIPDeviceMask = ~0u << GPUIPMinorShift;
// Pack a major and a minor version the way a GPU IP version does, so that a
// row of the table can be compared against a reported version as it is. A value
// too wide for its field would silently corrupt the fields above it, which
// would mean a typo in IntelGPUTargetParser.def going unnoticed.
static constexpr uint32_t packDevice(uint32_t Major, uint32_t Minor) {
assert((Major & ~GPUIPMajorMask) == 0 && "major version too wide");
assert((Minor & ~GPUIPMinorMask) == 0 && "minor version too wide");
return (Major << GPUIPMajorShift) | (Minor << GPUIPMinorShift);
}
StringRef llvm::IntelGPU::getArchName(uint32_t GPUIPVersion) {
const uint32_t Device = GPUIPVersion & GPUIPDeviceMask;
#define INTEL_GPU(NAME, KIND, MAJOR, MINOR, IGCA_TARGET, IGCA_FEATURE_SETS) \
if (Device == packDevice(MAJOR, MINOR)) \
return NAME;
#include "llvm/TargetParser/IntelGPUTargetParser.def"
return "";
}
std::string llvm::IntelGPU::getNumericArchName(uint32_t GPUIPVersion) {
const uint32_t Major = GPUIPVersion >> GPUIPMajorShift;
const uint32_t Minor = (GPUIPVersion >> GPUIPMinorShift) & GPUIPMinorMask;
const uint32_t Revision = GPUIPVersion & GPUIPRevisionMask;
return ("xe_" + Twine(Major) + "." + Twine(Minor) + "." + Twine(Revision))
.str();
}