152b4ce72SDaniel Sanders //===-- llvm/CodeGen/LowLevelType.cpp -------------------------------------===//
262ae568bSTim Northover //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
662ae568bSTim Northover //
762ae568bSTim Northover //===----------------------------------------------------------------------===//
862ae568bSTim Northover //
962ae568bSTim Northover /// \file This file implements the more header-heavy bits of the LLT class to
1062ae568bSTim Northover /// avoid polluting users' namespaces.
1162ae568bSTim Northover //
1262ae568bSTim Northover //===----------------------------------------------------------------------===//
1362ae568bSTim Northover 
1462ae568bSTim Northover #include "llvm/CodeGen/LowLevelType.h"
15c4e589b7SMichael Kitzan #include "llvm/ADT/APFloat.h"
1628fdc427STim Northover #include "llvm/IR/DataLayout.h"
1762ae568bSTim Northover #include "llvm/IR/DerivedTypes.h"
1862ae568bSTim Northover using namespace llvm;
1962ae568bSTim Northover 
getLLTForType(Type & Ty,const DataLayout & DL)2052b4ce72SDaniel Sanders LLT llvm::getLLTForType(Type &Ty, const DataLayout &DL) {
2162ae568bSTim Northover   if (auto VTy = dyn_cast<VectorType>(&Ty)) {
22bd7f7e2eSSander de Smalen     auto EC = VTy->getElementCount();
230f36e68fSKristof Beyls     LLT ScalarTy = getLLTForType(*VTy->getElementType(), DL);
24bd7f7e2eSSander de Smalen     if (EC.isScalar())
250f36e68fSKristof Beyls       return ScalarTy;
26d5e14ba8SSander de Smalen     return LLT::vector(EC, ScalarTy);
27ac53a5f1SMatt Arsenault   }
28ac53a5f1SMatt Arsenault 
29ac53a5f1SMatt Arsenault   if (auto PTy = dyn_cast<PointerType>(&Ty)) {
30ac53a5f1SMatt Arsenault     unsigned AddrSpace = PTy->getAddressSpace();
31ac53a5f1SMatt Arsenault     return LLT::pointer(AddrSpace, DL.getPointerSizeInBits(AddrSpace));
32ac53a5f1SMatt Arsenault   }
33ac53a5f1SMatt Arsenault 
34ac53a5f1SMatt Arsenault   if (Ty.isSized()) {
3562ae568bSTim Northover     // Aggregates are no different from real scalars as far as GlobalISel is
3662ae568bSTim Northover     // concerned.
3752b4ce72SDaniel Sanders     auto SizeInBits = DL.getTypeSizeInBits(&Ty);
385ae8350aSTim Northover     assert(SizeInBits != 0 && "invalid zero-sized type");
3952b4ce72SDaniel Sanders     return LLT::scalar(SizeInBits);
4062ae568bSTim Northover   }
41ac53a5f1SMatt Arsenault 
4252b4ce72SDaniel Sanders   return LLT();
4362ae568bSTim Northover }
44595ac8c4SMatt Arsenault 
getMVTForLLT(LLT Ty)45595ac8c4SMatt Arsenault MVT llvm::getMVTForLLT(LLT Ty) {
46595ac8c4SMatt Arsenault   if (!Ty.isVector())
47595ac8c4SMatt Arsenault     return MVT::getIntegerVT(Ty.getSizeInBits());
48595ac8c4SMatt Arsenault 
49595ac8c4SMatt Arsenault   return MVT::getVectorVT(
50595ac8c4SMatt Arsenault       MVT::getIntegerVT(Ty.getElementType().getSizeInBits()),
51595ac8c4SMatt Arsenault       Ty.getNumElements());
52595ac8c4SMatt Arsenault }
53595ac8c4SMatt Arsenault 
getApproximateEVTForLLT(LLT Ty,const DataLayout & DL,LLVMContext & Ctx)54*cc56152fSMatt Arsenault EVT llvm::getApproximateEVTForLLT(LLT Ty, const DataLayout &DL,
55*cc56152fSMatt Arsenault                                   LLVMContext &Ctx) {
56*cc56152fSMatt Arsenault   if (Ty.isVector()) {
57*cc56152fSMatt Arsenault     EVT EltVT = getApproximateEVTForLLT(Ty.getElementType(), DL, Ctx);
58*cc56152fSMatt Arsenault     return EVT::getVectorVT(Ctx, EltVT, Ty.getElementCount());
59*cc56152fSMatt Arsenault   }
60*cc56152fSMatt Arsenault 
61*cc56152fSMatt Arsenault   return EVT::getIntegerVT(Ctx, Ty.getSizeInBits());
62*cc56152fSMatt Arsenault }
63*cc56152fSMatt Arsenault 
getLLTForMVT(MVT Ty)64595ac8c4SMatt Arsenault LLT llvm::getLLTForMVT(MVT Ty) {
65595ac8c4SMatt Arsenault   if (!Ty.isVector())
66595ac8c4SMatt Arsenault     return LLT::scalar(Ty.getSizeInBits());
67595ac8c4SMatt Arsenault 
68990278d0SMatt Arsenault   return LLT::scalarOrVector(Ty.getVectorElementCount(),
69595ac8c4SMatt Arsenault                              Ty.getVectorElementType().getSizeInBits());
70595ac8c4SMatt Arsenault }
71c4e589b7SMichael Kitzan 
getFltSemanticForLLT(LLT Ty)72c4e589b7SMichael Kitzan const llvm::fltSemantics &llvm::getFltSemanticForLLT(LLT Ty) {
73c4e589b7SMichael Kitzan   assert(Ty.isScalar() && "Expected a scalar type.");
74c4e589b7SMichael Kitzan   switch (Ty.getSizeInBits()) {
75c4e589b7SMichael Kitzan   case 16:
76c4e589b7SMichael Kitzan     return APFloat::IEEEhalf();
77c4e589b7SMichael Kitzan   case 32:
78c4e589b7SMichael Kitzan     return APFloat::IEEEsingle();
79c4e589b7SMichael Kitzan   case 64:
80c4e589b7SMichael Kitzan     return APFloat::IEEEdouble();
81c4e589b7SMichael Kitzan   case 128:
82c4e589b7SMichael Kitzan     return APFloat::IEEEquad();
83c4e589b7SMichael Kitzan   }
84c4e589b7SMichael Kitzan   llvm_unreachable("Invalid FP type size.");
85c4e589b7SMichael Kitzan }
86