xref: /llvm-project/llvm/lib/CodeGen/LowLevelTypeUtils.cpp (revision 0d9fc1743378c73012828698122c46dc580d29eb)
1d45fae60SNAKAMURA Takumi //===-- llvm/CodeGen/LowLevelTypeUtils.cpp --------------------------------===//
2d45fae60SNAKAMURA Takumi //
3d45fae60SNAKAMURA Takumi // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d45fae60SNAKAMURA Takumi // See https://llvm.org/LICENSE.txt for license information.
5d45fae60SNAKAMURA Takumi // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d45fae60SNAKAMURA Takumi //
7d45fae60SNAKAMURA Takumi //===----------------------------------------------------------------------===//
8d45fae60SNAKAMURA Takumi //
9d45fae60SNAKAMURA Takumi /// \file This file implements the more header-heavy bits of the LLT class to
10d45fae60SNAKAMURA Takumi /// avoid polluting users' namespaces.
11d45fae60SNAKAMURA Takumi //
12d45fae60SNAKAMURA Takumi //===----------------------------------------------------------------------===//
13d45fae60SNAKAMURA Takumi 
14d45fae60SNAKAMURA Takumi #include "llvm/CodeGen/LowLevelTypeUtils.h"
15d45fae60SNAKAMURA Takumi #include "llvm/ADT/APFloat.h"
16d45fae60SNAKAMURA Takumi #include "llvm/IR/DataLayout.h"
17d45fae60SNAKAMURA Takumi #include "llvm/IR/DerivedTypes.h"
18d45fae60SNAKAMURA Takumi using namespace llvm;
19d45fae60SNAKAMURA Takumi 
20d45fae60SNAKAMURA Takumi LLT llvm::getLLTForType(Type &Ty, const DataLayout &DL) {
21d45fae60SNAKAMURA Takumi   if (auto VTy = dyn_cast<VectorType>(&Ty)) {
22d45fae60SNAKAMURA Takumi     auto EC = VTy->getElementCount();
23d45fae60SNAKAMURA Takumi     LLT ScalarTy = getLLTForType(*VTy->getElementType(), DL);
24d45fae60SNAKAMURA Takumi     if (EC.isScalar())
25d45fae60SNAKAMURA Takumi       return ScalarTy;
26d45fae60SNAKAMURA Takumi     return LLT::vector(EC, ScalarTy);
27d45fae60SNAKAMURA Takumi   }
28d45fae60SNAKAMURA Takumi 
29d45fae60SNAKAMURA Takumi   if (auto PTy = dyn_cast<PointerType>(&Ty)) {
30d45fae60SNAKAMURA Takumi     unsigned AddrSpace = PTy->getAddressSpace();
31d45fae60SNAKAMURA Takumi     return LLT::pointer(AddrSpace, DL.getPointerSizeInBits(AddrSpace));
32d45fae60SNAKAMURA Takumi   }
33d45fae60SNAKAMURA Takumi 
34d45fae60SNAKAMURA Takumi   if (Ty.isSized() && !Ty.isScalableTargetExtTy()) {
35d45fae60SNAKAMURA Takumi     // Aggregates are no different from real scalars as far as GlobalISel is
36d45fae60SNAKAMURA Takumi     // concerned.
37d45fae60SNAKAMURA Takumi     auto SizeInBits = DL.getTypeSizeInBits(&Ty);
38d45fae60SNAKAMURA Takumi     assert(SizeInBits != 0 && "invalid zero-sized type");
39d45fae60SNAKAMURA Takumi     return LLT::scalar(SizeInBits);
40d45fae60SNAKAMURA Takumi   }
41d45fae60SNAKAMURA Takumi 
4232a067c0SSameer Sahasrabuddhe   if (Ty.isTokenTy())
4332a067c0SSameer Sahasrabuddhe     return LLT::token();
4432a067c0SSameer Sahasrabuddhe 
45d45fae60SNAKAMURA Takumi   return LLT();
46d45fae60SNAKAMURA Takumi }
47d45fae60SNAKAMURA Takumi 
48d45fae60SNAKAMURA Takumi MVT llvm::getMVTForLLT(LLT Ty) {
49d45fae60SNAKAMURA Takumi   if (!Ty.isVector())
50d45fae60SNAKAMURA Takumi     return MVT::getIntegerVT(Ty.getSizeInBits());
51d45fae60SNAKAMURA Takumi 
52d45fae60SNAKAMURA Takumi   return MVT::getVectorVT(
53d45fae60SNAKAMURA Takumi       MVT::getIntegerVT(Ty.getElementType().getSizeInBits()),
54d345599cSMichael Maitland       Ty.getElementCount());
55d45fae60SNAKAMURA Takumi }
56d45fae60SNAKAMURA Takumi 
57*0d9fc174SCraig Topper EVT llvm::getApproximateEVTForLLT(LLT Ty, LLVMContext &Ctx) {
58d45fae60SNAKAMURA Takumi   if (Ty.isVector()) {
59*0d9fc174SCraig Topper     EVT EltVT = getApproximateEVTForLLT(Ty.getElementType(), Ctx);
60d45fae60SNAKAMURA Takumi     return EVT::getVectorVT(Ctx, EltVT, Ty.getElementCount());
61d45fae60SNAKAMURA Takumi   }
62d45fae60SNAKAMURA Takumi 
63d45fae60SNAKAMURA Takumi   return EVT::getIntegerVT(Ctx, Ty.getSizeInBits());
64d45fae60SNAKAMURA Takumi }
65d45fae60SNAKAMURA Takumi 
66d45fae60SNAKAMURA Takumi LLT llvm::getLLTForMVT(MVT Ty) {
67d45fae60SNAKAMURA Takumi   if (!Ty.isVector())
68d45fae60SNAKAMURA Takumi     return LLT::scalar(Ty.getSizeInBits());
69d45fae60SNAKAMURA Takumi 
70d45fae60SNAKAMURA Takumi   return LLT::scalarOrVector(Ty.getVectorElementCount(),
71d45fae60SNAKAMURA Takumi                              Ty.getVectorElementType().getSizeInBits());
72d45fae60SNAKAMURA Takumi }
73d45fae60SNAKAMURA Takumi 
74d45fae60SNAKAMURA Takumi const llvm::fltSemantics &llvm::getFltSemanticForLLT(LLT Ty) {
75d45fae60SNAKAMURA Takumi   assert(Ty.isScalar() && "Expected a scalar type.");
76d45fae60SNAKAMURA Takumi   switch (Ty.getSizeInBits()) {
77d45fae60SNAKAMURA Takumi   case 16:
78d45fae60SNAKAMURA Takumi     return APFloat::IEEEhalf();
79d45fae60SNAKAMURA Takumi   case 32:
80d45fae60SNAKAMURA Takumi     return APFloat::IEEEsingle();
81d45fae60SNAKAMURA Takumi   case 64:
82d45fae60SNAKAMURA Takumi     return APFloat::IEEEdouble();
83d45fae60SNAKAMURA Takumi   case 128:
84d45fae60SNAKAMURA Takumi     return APFloat::IEEEquad();
85d45fae60SNAKAMURA Takumi   }
86d45fae60SNAKAMURA Takumi   llvm_unreachable("Invalid FP type size.");
87d45fae60SNAKAMURA Takumi }
88