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