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