LLVM API Documentation

ValueTypes.cpp

Go to the documentation of this file.
00001 //===----------- ValueTypes.cpp - Implementation of MVT methods -----------===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 //
00010 // This file implements methods in the CodeGen/ValueTypes.h header.
00011 //
00012 //===----------------------------------------------------------------------===//
00013 
00014 #include "llvm/ADT/StringExtras.h"
00015 #include "llvm/CodeGen/ValueTypes.h"
00016 #include "llvm/Type.h"
00017 #include "llvm/DerivedTypes.h"
00018 using namespace llvm;
00019 
00020 MVT MVT::getExtendedIntegerVT(unsigned BitWidth) {
00021   MVT VT;
00022   VT.LLVMTy = IntegerType::get(BitWidth);
00023   assert(VT.isExtended() && "Type is not extended!");
00024   return VT;
00025 }
00026 
00027 MVT MVT::getExtendedVectorVT(MVT VT, unsigned NumElements) {
00028   MVT ResultVT;
00029   ResultVT.LLVMTy = VectorType::get(VT.getTypeForMVT(), NumElements);
00030   assert(ResultVT.isExtended() && "Type is not extended!");
00031   return ResultVT;
00032 }
00033 
00034 bool MVT::isExtendedFloatingPoint() const {
00035   assert(isExtended() && "Type is not extended!");
00036   return LLVMTy->isFPOrFPVector();
00037 }
00038 
00039 bool MVT::isExtendedInteger() const {
00040   assert(isExtended() && "Type is not extended!");
00041   return LLVMTy->isIntOrIntVector();
00042 }
00043 
00044 bool MVT::isExtendedVector() const {
00045   assert(isExtended() && "Type is not extended!");
00046   return isa<VectorType>(LLVMTy);
00047 }
00048 
00049 bool MVT::isExtended64BitVector() const {
00050   return isExtendedVector() && getSizeInBits() == 64;
00051 }
00052 
00053 bool MVT::isExtended128BitVector() const {
00054   return isExtendedVector() && getSizeInBits() == 128;
00055 }
00056 
00057 MVT MVT::getExtendedVectorElementType() const {
00058   assert(isExtended() && "Type is not extended!");
00059   return MVT::getMVT(cast<VectorType>(LLVMTy)->getElementType());
00060 }
00061 
00062 unsigned MVT::getExtendedVectorNumElements() const {
00063   assert(isExtended() && "Type is not extended!");
00064   return cast<VectorType>(LLVMTy)->getNumElements();
00065 }
00066 
00067 unsigned MVT::getExtendedSizeInBits() const {
00068   assert(isExtended() && "Type is not extended!");
00069   if (const IntegerType *ITy = dyn_cast<IntegerType>(LLVMTy))
00070     return ITy->getBitWidth();
00071   if (const VectorType *VTy = dyn_cast<VectorType>(LLVMTy))
00072     return VTy->getBitWidth();
00073   assert(false && "Unrecognized extended type!");
00074   return 0; // Suppress warnings.
00075 }
00076 
00077 /// getMVTString - This function returns value type as a string, e.g. "i32".
00078 std::string MVT::getMVTString() const {
00079   switch (V) {
00080   default:
00081     if (isVector())
00082       return "v" + utostr(getVectorNumElements()) +
00083              getVectorElementType().getMVTString();
00084     if (isInteger())
00085       return "i" + utostr(getSizeInBits());
00086     assert(0 && "Invalid MVT!");
00087     return "?";
00088   case MVT::i1:      return "i1";
00089   case MVT::i8:      return "i8";
00090   case MVT::i16:     return "i16";
00091   case MVT::i32:     return "i32";
00092   case MVT::i64:     return "i64";
00093   case MVT::i128:    return "i128";
00094   case MVT::f32:     return "f32";
00095   case MVT::f64:     return "f64";
00096   case MVT::f80:     return "f80";
00097   case MVT::f128:    return "f128";
00098   case MVT::ppcf128: return "ppcf128";
00099   case MVT::isVoid:  return "isVoid";
00100   case MVT::Other:   return "ch";
00101   case MVT::Flag:    return "flag";
00102   case MVT::v2i8:    return "v2i8";
00103   case MVT::v4i8:    return "v4i8";
00104   case MVT::v2i16:   return "v2i16";
00105   case MVT::v8i8:    return "v8i8";
00106   case MVT::v4i16:   return "v4i16";
00107   case MVT::v2i32:   return "v2i32";
00108   case MVT::v1i64:   return "v1i64";
00109   case MVT::v16i8:   return "v16i8";
00110   case MVT::v8i16:   return "v8i16";
00111   case MVT::v4i32:   return "v4i32";
00112   case MVT::v2i64:   return "v2i64";
00113   case MVT::v2f32:   return "v2f32";
00114   case MVT::v4f32:   return "v4f32";
00115   case MVT::v2f64:   return "v2f64";
00116   case MVT::v3i32:   return "v3i32";
00117   case MVT::v3f32:   return "v3f32";
00118   }
00119 }
00120 
00121 /// getTypeForMVT - This method returns an LLVM type corresponding to the
00122 /// specified MVT.  For integer types, this returns an unsigned type.  Note
00123 /// that this will abort for types that cannot be represented.
00124 const Type *MVT::getTypeForMVT() const {
00125   switch (V) {
00126   default:
00127     assert(isExtended() && "Type is not extended!");
00128     return LLVMTy;
00129   case MVT::isVoid:  return Type::VoidTy;
00130   case MVT::i1:      return Type::Int1Ty;
00131   case MVT::i8:      return Type::Int8Ty;
00132   case MVT::i16:     return Type::Int16Ty;
00133   case MVT::i32:     return Type::Int32Ty;
00134   case MVT::i64:     return Type::Int64Ty;
00135   case MVT::i128:    return IntegerType::get(128);
00136   case MVT::f32:     return Type::FloatTy;
00137   case MVT::f64:     return Type::DoubleTy;
00138   case MVT::f80:     return Type::X86_FP80Ty;
00139   case MVT::f128:    return Type::FP128Ty;
00140   case MVT::ppcf128: return Type::PPC_FP128Ty;
00141   case MVT::v2i8:    return VectorType::get(Type::Int8Ty, 2);
00142   case MVT::v4i8:    return VectorType::get(Type::Int8Ty, 4);
00143   case MVT::v2i16:    return VectorType::get(Type::Int16Ty, 2);
00144   case MVT::v8i8:    return VectorType::get(Type::Int8Ty, 8);
00145   case MVT::v4i16:   return VectorType::get(Type::Int16Ty, 4);
00146   case MVT::v2i32:   return VectorType::get(Type::Int32Ty, 2);
00147   case MVT::v1i64:   return VectorType::get(Type::Int64Ty, 1);
00148   case MVT::v16i8:   return VectorType::get(Type::Int8Ty, 16);
00149   case MVT::v8i16:   return VectorType::get(Type::Int16Ty, 8);
00150   case MVT::v4i32:   return VectorType::get(Type::Int32Ty, 4);
00151   case MVT::v2i64:   return VectorType::get(Type::Int64Ty, 2);
00152   case MVT::v2f32:   return VectorType::get(Type::FloatTy, 2);
00153   case MVT::v4f32:   return VectorType::get(Type::FloatTy, 4);
00154   case MVT::v2f64:   return VectorType::get(Type::DoubleTy, 2);
00155   case MVT::v3i32:   return VectorType::get(Type::Int32Ty, 3);
00156   case MVT::v3f32:   return VectorType::get(Type::FloatTy, 3);
00157   }
00158 }
00159 
00160 /// getMVT - Return the value type corresponding to the specified type.  This
00161 /// returns all pointers as MVT::iPTR.  If HandleUnknown is true, unknown types
00162 /// are returned as Other, otherwise they are invalid.
00163 MVT MVT::getMVT(const Type *Ty, bool HandleUnknown){
00164   switch (Ty->getTypeID()) {
00165   default:
00166     if (HandleUnknown) return MVT::Other;
00167     assert(0 && "Unknown type!");
00168     return MVT::isVoid;
00169   case Type::VoidTyID:
00170     return MVT::isVoid;
00171   case Type::IntegerTyID:
00172     return getIntegerVT(cast<IntegerType>(Ty)->getBitWidth());
00173   case Type::FloatTyID:     return MVT::f32;
00174   case Type::DoubleTyID:    return MVT::f64;
00175   case Type::X86_FP80TyID:  return MVT::f80;
00176   case Type::FP128TyID:     return MVT::f128;
00177   case Type::PPC_FP128TyID: return MVT::ppcf128;
00178   case Type::PointerTyID:   return MVT::iPTR;
00179   case Type::VectorTyID: {
00180     const VectorType *VTy = cast<VectorType>(Ty);
00181     return getVectorVT(getMVT(VTy->getElementType(), false),
00182                        VTy->getNumElements());
00183   }
00184   }
00185 }



This web site is hosted by the Computer Science Department at the University of Illinois at Urbana-Champaign.