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