brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 936c9fb Raw
88 lines · cpp
1//===-- llvm/CodeGen/LowLevelTypeUtils.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-exception6//7//===----------------------------------------------------------------------===//8//9/// \file This file implements the more header-heavy bits of the LLT class to10/// avoid polluting users' namespaces.11//12//===----------------------------------------------------------------------===//13 14#include "llvm/CodeGen/LowLevelTypeUtils.h"15#include "llvm/ADT/APFloat.h"16#include "llvm/IR/DataLayout.h"17#include "llvm/IR/DerivedTypes.h"18using namespace llvm;19 20LLT llvm::getLLTForType(Type &Ty, const DataLayout &DL) {21  if (auto VTy = dyn_cast<VectorType>(&Ty)) {22    auto EC = VTy->getElementCount();23    LLT ScalarTy = getLLTForType(*VTy->getElementType(), DL);24    if (EC.isScalar())25      return ScalarTy;26    return LLT::vector(EC, ScalarTy);27  }28 29  if (auto PTy = dyn_cast<PointerType>(&Ty)) {30    unsigned AddrSpace = PTy->getAddressSpace();31    return LLT::pointer(AddrSpace, DL.getPointerSizeInBits(AddrSpace));32  }33 34  if (Ty.isSized() && !Ty.isScalableTargetExtTy()) {35    // Aggregates are no different from real scalars as far as GlobalISel is36    // concerned.37    auto SizeInBits = DL.getTypeSizeInBits(&Ty);38    assert(SizeInBits != 0 && "invalid zero-sized type");39    return LLT::scalar(SizeInBits);40  }41 42  if (Ty.isTokenTy())43    return LLT::token();44 45  return LLT();46}47 48MVT llvm::getMVTForLLT(LLT Ty) {49  if (!Ty.isVector())50    return MVT::getIntegerVT(Ty.getSizeInBits());51 52  return MVT::getVectorVT(53      MVT::getIntegerVT(Ty.getElementType().getSizeInBits()),54      Ty.getElementCount());55}56 57EVT llvm::getApproximateEVTForLLT(LLT Ty, LLVMContext &Ctx) {58  if (Ty.isVector()) {59    EVT EltVT = getApproximateEVTForLLT(Ty.getElementType(), Ctx);60    return EVT::getVectorVT(Ctx, EltVT, Ty.getElementCount());61  }62 63  return EVT::getIntegerVT(Ctx, Ty.getSizeInBits());64}65 66LLT llvm::getLLTForMVT(MVT Ty) {67  if (!Ty.isVector())68    return LLT::scalar(Ty.getSizeInBits());69 70  return LLT::scalarOrVector(Ty.getVectorElementCount(),71                             Ty.getVectorElementType().getSizeInBits());72}73 74const llvm::fltSemantics &llvm::getFltSemanticForLLT(LLT Ty) {75  assert(Ty.isScalar() && "Expected a scalar type.");76  switch (Ty.getSizeInBits()) {77  case 16:78    return APFloat::IEEEhalf();79  case 32:80    return APFloat::IEEEsingle();81  case 64:82    return APFloat::IEEEdouble();83  case 128:84    return APFloat::IEEEquad();85  }86  llvm_unreachable("Invalid FP type size.");87}88