1//===- ValueTypes.cpp - Tablegen extended ValueType implementation --------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// The EVT type is used by tablegen as well as in LLVM. In order to handle 11// extended types, the EVT type uses support functions that call into 12// LLVM's type system code. These aren't accessible in tablegen, so this 13// file provides simple replacements. 14// 15//===----------------------------------------------------------------------===// 16 17#include "llvm/CodeGen/ValueTypes.h" 18#include <map> 19using namespace llvm; 20 21namespace llvm { 22 23class Type { 24public: 25 virtual unsigned getSizeInBits() const = 0; 26 virtual ~Type() {} 27}; 28 29} 30 31class ExtendedIntegerType : public Type { 32 unsigned BitWidth; 33public: 34 explicit ExtendedIntegerType(unsigned bits) 35 : BitWidth(bits) {} 36 unsigned getSizeInBits() const { 37 return getBitWidth(); 38 } 39 unsigned getBitWidth() const { 40 return BitWidth; 41 } 42}; 43 44class ExtendedVectorType : public Type { 45 EVT ElementType; 46 unsigned NumElements; 47public: 48 ExtendedVectorType(EVT elty, unsigned num) 49 : ElementType(elty), NumElements(num) {} 50 unsigned getSizeInBits() const { 51 return getNumElements() * getElementType().getSizeInBits(); 52 } 53 EVT getElementType() const { 54 return ElementType; 55 } 56 unsigned getNumElements() const { 57 return NumElements; 58 } 59}; 60 61static std::map<unsigned, const Type *> 62 ExtendedIntegerTypeMap; 63static std::map<std::pair<uintptr_t, uintptr_t>, const Type *> 64 ExtendedVectorTypeMap; 65 66bool EVT::isExtendedFloatingPoint() const { 67 assert(isExtended() && "Type is not extended!"); 68 // Extended floating-point types are not supported yet. 69 return false; 70} 71 72bool EVT::isExtendedInteger() const { 73 assert(isExtended() && "Type is not extended!"); 74 return dynamic_cast<const ExtendedIntegerType *>(LLVMTy) != 0; 75} 76 77bool EVT::isExtendedVector() const { 78 assert(isExtended() && "Type is not extended!"); 79 return dynamic_cast<const ExtendedVectorType *>(LLVMTy) != 0; 80} 81 82bool EVT::isExtended64BitVector() const { 83 assert(isExtended() && "Type is not extended!"); 84 return isExtendedVector() && getSizeInBits() == 64; 85} 86 87bool EVT::isExtended128BitVector() const { 88 assert(isExtended() && "Type is not extended!"); 89 return isExtendedVector() && getSizeInBits() == 128; 90} 91 92EVT EVT::getExtendedVectorElementType() const { 93 assert(isExtendedVector() && "Type is not an extended vector!"); 94 return static_cast<const ExtendedVectorType *>(LLVMTy)->getElementType(); 95} 96 97unsigned EVT::getExtendedVectorNumElements() const { 98 assert(isExtendedVector() && "Type is not an extended vector!"); 99 return static_cast<const ExtendedVectorType *>(LLVMTy)->getNumElements(); 100} 101 102unsigned EVT::getExtendedSizeInBits() const { 103 assert(isExtended() && "Type is not extended!"); 104 return LLVMTy->getSizeInBits(); 105} 106