blob: 484329e918903f3a205571626896e4ad36c4036d [file]
//===-- llvm/CodeGenTypes/LowLevelType.cpp
//---------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
//
/// \file This file implements the more header-heavy bits of the LLT class to
/// avoid polluting users' namespaces.
//
//===----------------------------------------------------------------------===//
#include "llvm/CodeGenTypes/LowLevelType.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
bool LLT::ExtendedLLT = false;
static LLT::FpSemantics getFpSemanticsForMVT(MVT VT) {
switch (VT.getScalarType().SimpleTy) {
default:
llvm_unreachable("Unknown FP format");
case MVT::f16:
return LLT::FpSemantics::S_IEEEhalf;
case MVT::bf16:
return LLT::FpSemantics::S_BFloat;
case MVT::f32:
return LLT::FpSemantics::S_IEEEsingle;
case MVT::f64:
return LLT::FpSemantics::S_IEEEdouble;
case MVT::f80:
return LLT::FpSemantics::S_x87DoubleExtended;
case MVT::f128:
return LLT::FpSemantics::S_IEEEquad;
case MVT::ppcf128:
return LLT::FpSemantics::S_PPCDoubleDouble;
}
}
LLT::LLT(MVT VT) {
if (!ExtendedLLT) {
if (VT.isVector()) {
bool AsVector = VT.getVectorMinNumElements() > 1 || VT.isScalableVector();
Kind Info = AsVector ? Kind::VECTOR_ANY : Kind::ANY_SCALAR;
init(Info, VT.getVectorElementCount(),
VT.getVectorElementType().getSizeInBits());
} else if (VT.isValid() && !VT.isScalableTargetExtVT()) {
init(Kind::ANY_SCALAR, ElementCount::getFixed(0), VT.getSizeInBits());
} else {
this->Info = Kind::INVALID;
this->RawData = 0;
}
return;
}
bool IsFloatingPoint = VT.isFloatingPoint();
bool AsVector = VT.isVector() &&
(VT.getVectorMinNumElements() > 1 || VT.isScalableVector());
if (AsVector) {
if (IsFloatingPoint)
init(LLT::Kind::VECTOR_FLOAT, VT.getVectorElementCount(),
VT.getVectorElementType().getSizeInBits(), getFpSemanticsForMVT(VT));
else
init(LLT::Kind::VECTOR_INTEGER, VT.getVectorElementCount(),
VT.getVectorElementType().getSizeInBits());
} else if (VT.isValid() && !VT.isScalableTargetExtVT()) {
// Aggregates are no different from real scalars as far as GlobalISel is
// concerned.
if (IsFloatingPoint)
init(LLT::Kind::FLOAT, ElementCount::getFixed(0), VT.getSizeInBits(),
getFpSemanticsForMVT(VT));
else
init(LLT::Kind::INTEGER, ElementCount::getFixed(0), VT.getSizeInBits());
} else {
this->Info = Kind::INVALID;
this->RawData = 0;
}
return;
}
void LLT::print(raw_ostream &OS) const {
if (isVector()) {
OS << "<";
OS << getElementCount() << " x " << getElementType() << ">";
} else if (isPointer()) {
OS << "p" << getAddressSpace();
} else if (isBFloat16()) {
OS << "bf16";
} else if (isPPCF128()) {
OS << "ppcf128";
} else if (isFloatIEEE()) {
OS << "f" << getScalarSizeInBits();
} else if (isInteger()) {
OS << "i" << getScalarSizeInBits();
} else if (isValid()) {
assert(isScalar() && "unexpected type");
OS << "s" << getScalarSizeInBits();
} else {
OS << "LLT_invalid";
}
}
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
LLVM_DUMP_METHOD void LLT::dump() const {
print(dbgs());
dbgs() << '\n';
}
#endif