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