LLVM API Documentation
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.