13a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman//===- ValueTypes.cpp - Tablegen extended ValueType implementation --------===// 23a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman// 33a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman// The LLVM Compiler Infrastructure 43a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman// 53a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman// This file is distributed under the University of Illinois Open Source 63a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman// License. See LICENSE.TXT for details. 73a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman// 83a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman//===----------------------------------------------------------------------===// 93a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman// 10e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson// The EVT type is used by tablegen as well as in LLVM. In order to handle 11e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson// extended types, the EVT type uses support functions that call into 123a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman// LLVM's type system code. These aren't accessible in tablegen, so this 133a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman// file provides simple replacements. 143a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman// 153a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman//===----------------------------------------------------------------------===// 163a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman 173a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman#include "llvm/CodeGen/ValueTypes.h" 188b43dbf9ead694a011944f7b33ed194d901d2313Sean Silva#include "llvm/Support/Casting.h" 193a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman#include <map> 203a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohmanusing namespace llvm; 213a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman 223a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohmannamespace llvm { 233a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman 243a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohmanclass Type { 258b43dbf9ead694a011944f7b33ed194d901d2313Sean Silvaprotected: 268b43dbf9ead694a011944f7b33ed194d901d2313Sean Silva enum TypeKind { 278b43dbf9ead694a011944f7b33ed194d901d2313Sean Silva TK_ExtendedIntegerType, 288b43dbf9ead694a011944f7b33ed194d901d2313Sean Silva TK_ExtendedVectorType 298b43dbf9ead694a011944f7b33ed194d901d2313Sean Silva }; 308b43dbf9ead694a011944f7b33ed194d901d2313Sean Silvaprivate: 318b43dbf9ead694a011944f7b33ed194d901d2313Sean Silva TypeKind Kind; 323a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohmanpublic: 338b43dbf9ead694a011944f7b33ed194d901d2313Sean Silva TypeKind getKind() const { 348b43dbf9ead694a011944f7b33ed194d901d2313Sean Silva return Kind; 358b43dbf9ead694a011944f7b33ed194d901d2313Sean Silva } 368b43dbf9ead694a011944f7b33ed194d901d2313Sean Silva Type(TypeKind K) : Kind(K) {} 373a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman virtual unsigned getSizeInBits() const = 0; 38da71cf0ce95dae621ecd4e9cdb603b7b2d2ec33cDan Gohman virtual ~Type() {} 393a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman}; 403a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman 413a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman} 423a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman 433a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohmanclass ExtendedIntegerType : public Type { 443a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman unsigned BitWidth; 453a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohmanpublic: 463a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman explicit ExtendedIntegerType(unsigned bits) 478b43dbf9ead694a011944f7b33ed194d901d2313Sean Silva : Type(TK_ExtendedIntegerType), BitWidth(bits) {} 488b43dbf9ead694a011944f7b33ed194d901d2313Sean Silva static bool classof(const Type *T) { 498b43dbf9ead694a011944f7b33ed194d901d2313Sean Silva return T->getKind() == TK_ExtendedIntegerType; 50fcb5e95c310f37f648c2150fabc861fb687e3732Chad Rosier } 513a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman unsigned getSizeInBits() const { 523a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman return getBitWidth(); 533a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman } 543a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman unsigned getBitWidth() const { 553a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman return BitWidth; 563a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman } 573a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman}; 583a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman 593a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohmanclass ExtendedVectorType : public Type { 60e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson EVT ElementType; 613a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman unsigned NumElements; 623a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohmanpublic: 63e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson ExtendedVectorType(EVT elty, unsigned num) 648b43dbf9ead694a011944f7b33ed194d901d2313Sean Silva : Type(TK_ExtendedVectorType), ElementType(elty), NumElements(num) {} 658b43dbf9ead694a011944f7b33ed194d901d2313Sean Silva static bool classof(const Type *T) { 668b43dbf9ead694a011944f7b33ed194d901d2313Sean Silva return T->getKind() == TK_ExtendedVectorType; 67fcb5e95c310f37f648c2150fabc861fb687e3732Chad Rosier } 683a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman unsigned getSizeInBits() const { 693a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman return getNumElements() * getElementType().getSizeInBits(); 703a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman } 71e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson EVT getElementType() const { 723a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman return ElementType; 733a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman } 743a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman unsigned getNumElements() const { 753a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman return NumElements; 763a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman } 773a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman}; 783a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman 793a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohmanstatic std::map<unsigned, const Type *> 803a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman ExtendedIntegerTypeMap; 813a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohmanstatic std::map<std::pair<uintptr_t, uintptr_t>, const Type *> 823a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman ExtendedVectorTypeMap; 833a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman 84e50ed30282bb5b4a9ed952580523f2dda16215acOwen Andersonbool EVT::isExtendedFloatingPoint() const { 853a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman assert(isExtended() && "Type is not extended!"); 863a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman // Extended floating-point types are not supported yet. 873a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman return false; 883a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman} 893a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman 90e50ed30282bb5b4a9ed952580523f2dda16215acOwen Andersonbool EVT::isExtendedInteger() const { 913a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman assert(isExtended() && "Type is not extended!"); 928b43dbf9ead694a011944f7b33ed194d901d2313Sean Silva return isa<ExtendedIntegerType>(LLVMTy); 933a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman} 943a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman 95e50ed30282bb5b4a9ed952580523f2dda16215acOwen Andersonbool EVT::isExtendedVector() const { 963a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman assert(isExtended() && "Type is not extended!"); 978b43dbf9ead694a011944f7b33ed194d901d2313Sean Silva return isa<ExtendedVectorType>(LLVMTy); 983a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman} 993a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman 100e50ed30282bb5b4a9ed952580523f2dda16215acOwen Andersonbool EVT::isExtended64BitVector() const { 1013a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman assert(isExtended() && "Type is not extended!"); 1023a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman return isExtendedVector() && getSizeInBits() == 64; 1033a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman} 1043a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman 105e50ed30282bb5b4a9ed952580523f2dda16215acOwen Andersonbool EVT::isExtended128BitVector() const { 1063a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman assert(isExtended() && "Type is not extended!"); 1073a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman return isExtendedVector() && getSizeInBits() == 128; 1083a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman} 1093a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman 110e50ed30282bb5b4a9ed952580523f2dda16215acOwen AndersonEVT EVT::getExtendedVectorElementType() const { 1113a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman assert(isExtendedVector() && "Type is not an extended vector!"); 1123a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman return static_cast<const ExtendedVectorType *>(LLVMTy)->getElementType(); 1133a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman} 1143a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman 115e50ed30282bb5b4a9ed952580523f2dda16215acOwen Andersonunsigned EVT::getExtendedVectorNumElements() const { 1163a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman assert(isExtendedVector() && "Type is not an extended vector!"); 1173a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman return static_cast<const ExtendedVectorType *>(LLVMTy)->getNumElements(); 1183a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman} 1193a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman 120e50ed30282bb5b4a9ed952580523f2dda16215acOwen Andersonunsigned EVT::getExtendedSizeInBits() const { 1213a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman assert(isExtended() && "Type is not extended!"); 1223a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman return LLVMTy->getSizeInBits(); 1233a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman} 124