//===----------------------------------------------------------------------===// // // 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 functions associated with NVVM Intrinsics. // //===----------------------------------------------------------------------===// #include "llvm/IR/NVVMIntrinsicUtils.h" #include "llvm/ADT/StringRef.h" using namespace llvm; using namespace nvvm; void nvvm::printTcgen05MMAKind(raw_ostream &OS, const Constant *ImmArgVal) { if (const auto *CI = dyn_cast(ImmArgVal)) { uint64_t Val = CI->getZExtValue(); switch (static_cast(Val)) { case Tcgen05MMAKind::F16: OS << "f16"; return; case Tcgen05MMAKind::TF32: OS << "tf32"; return; case Tcgen05MMAKind::F8F6F4: OS << "f8f6f4"; return; case Tcgen05MMAKind::I8: OS << "i8"; return; } } llvm_unreachable( "printTcgen05MMAKind called with invalid value for immediate argument"); } void nvvm::printTcgen05CollectorUsageOp(raw_ostream &OS, const Constant *ImmArgVal) { if (const auto *CI = dyn_cast(ImmArgVal)) { uint64_t Val = CI->getZExtValue(); switch (static_cast(Val)) { case Tcgen05CollectorUsageOp::DISCARD: OS << "discard"; return; case Tcgen05CollectorUsageOp::LASTUSE: OS << "lastuse"; return; case Tcgen05CollectorUsageOp::FILL: OS << "fill"; return; case Tcgen05CollectorUsageOp::USE: OS << "use"; return; } } llvm_unreachable("printTcgen05CollectorUsageOp called with invalid value for " "immediate argument"); } void nvvm::printTensormapElemType(raw_ostream &OS, const Constant *ImmArgVal) { static constexpr StringRef TensormapElemTypes[] = { "u8", "u16", "u32", "s32", "u64", "s64", "f16", "f32", "f32.ftz", "f64", "bf16", "tf32", "tf32.ftz", "b4x16", "b4x16_p64", "b6x16_p32"}; if (const auto *CI = dyn_cast(ImmArgVal)) { uint64_t Val = CI->getZExtValue(); if (Val <= static_cast(nvvm::TensormapElemType::B6x16_p32)) { OS << TensormapElemTypes[Val]; return; } } } void nvvm::printTensormapInterleaveLayout(raw_ostream &OS, const Constant *ImmArgVal) { if (const auto *CI = dyn_cast(ImmArgVal)) { uint64_t Val = CI->getZExtValue(); switch (static_cast(Val)) { case TensormapInterleaveLayout::NO_INTERLEAVE: OS << "No interleave"; return; case TensormapInterleaveLayout::INTERLEAVE_16B: OS << "16B interleave"; return; case TensormapInterleaveLayout::INTERLEAVE_32B: OS << "32B interleave"; return; } } } void nvvm::printTensormapSwizzleMode(raw_ostream &OS, const Constant *ImmArgVal) { static constexpr StringRef TensormapSwizzleModes[] = { "No swizzling", "32B swizzling", "64B swizzling", "128B swizzling", "96B swizzling"}; if (const auto *CI = dyn_cast(ImmArgVal)) { uint64_t Val = CI->getZExtValue(); if (Val <= static_cast(nvvm::TensormapSwizzleMode::SWIZZLE_96B)) { OS << TensormapSwizzleModes[Val]; return; } } } void nvvm::printTensormapSwizzleAtomicity(raw_ostream &OS, const Constant *ImmArgVal) { static constexpr StringRef TensormapSwizzleAtomicities[] = { "16B", "32B", "32B + 8B flip", "64B"}; if (const auto *CI = dyn_cast(ImmArgVal)) { uint64_t Val = CI->getZExtValue(); if (Val <= static_cast( nvvm::TensormapSwizzleAtomicity::SWIZZLE_ATOMICITY_64B)) { OS << TensormapSwizzleAtomicities[Val]; return; } } } void nvvm::printTensormapFillMode(raw_ostream &OS, const Constant *ImmArgVal) { if (const auto *CI = dyn_cast(ImmArgVal)) { uint64_t Val = CI->getZExtValue(); OS << (Val == static_cast(TensormapFillMode::ZERO_FILL) ? "Zero fill" : "OOB-NaN fill"); return; } }