xref: /freebsd/contrib/llvm-project/llvm/lib/CodeGenTypes/LowLevelType.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1 //===-- llvm/CodeGenTypes/LowLevelType.cpp
2 //---------------------------------===//
3 //
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 /// \file This file implements the more header-heavy bits of the LLT class to
11 /// avoid polluting users' namespaces.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #include "llvm/CodeGenTypes/LowLevelType.h"
16 #include "llvm/Support/raw_ostream.h"
17 using namespace llvm;
18 
LLT(MVT VT)19 LLT::LLT(MVT VT) {
20   if (VT.isVector()) {
21     bool asVector = VT.getVectorMinNumElements() > 1 || VT.isScalableVector();
22     init(/*IsPointer=*/false, asVector, /*IsScalar=*/!asVector,
23          VT.getVectorElementCount(), VT.getVectorElementType().getSizeInBits(),
24          /*AddressSpace=*/0);
25   } else if (VT.isValid() && !VT.isScalableTargetExtVT()) {
26     // Aggregates are no different from real scalars as far as GlobalISel is
27     // concerned.
28     init(/*IsPointer=*/false, /*IsVector=*/false, /*IsScalar=*/true,
29          ElementCount::getFixed(0), VT.getSizeInBits(), /*AddressSpace=*/0);
30   } else {
31     IsScalar = false;
32     IsPointer = false;
33     IsVector = false;
34     RawData = 0;
35   }
36 }
37 
print(raw_ostream & OS) const38 void LLT::print(raw_ostream &OS) const {
39   if (isVector()) {
40     OS << "<";
41     OS << getElementCount() << " x " << getElementType() << ">";
42   } else if (isPointer())
43     OS << "p" << getAddressSpace();
44   else if (isValid()) {
45     assert(isScalar() && "unexpected type");
46     OS << "s" << getScalarSizeInBits();
47   } else
48     OS << "LLT_invalid";
49 }
50 
51 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
dump() const52 LLVM_DUMP_METHOD void LLT::dump() const {
53   print(dbgs());
54   dbgs() << '\n';
55 }
56 #endif
57 
58 const constexpr LLT::BitFieldInfo LLT::ScalarSizeFieldInfo;
59 const constexpr LLT::BitFieldInfo LLT::PointerSizeFieldInfo;
60 const constexpr LLT::BitFieldInfo LLT::PointerAddressSpaceFieldInfo;
61 const constexpr LLT::BitFieldInfo LLT::VectorElementsFieldInfo;
62 const constexpr LLT::BitFieldInfo LLT::VectorScalableFieldInfo;
63 const constexpr LLT::BitFieldInfo LLT::VectorSizeFieldInfo;
64 const constexpr LLT::BitFieldInfo LLT::PointerVectorElementsFieldInfo;
65 const constexpr LLT::BitFieldInfo LLT::PointerVectorScalableFieldInfo;
66 const constexpr LLT::BitFieldInfo LLT::PointerVectorSizeFieldInfo;
67 const constexpr LLT::BitFieldInfo LLT::PointerVectorAddressSpaceFieldInfo;
68