1249259Sdim//===----------- ValueTypes.cpp - Implementation of EVT methods -----------===//
2249259Sdim//
3249259Sdim//                     The LLVM Compiler Infrastructure
4249259Sdim//
5249259Sdim// This file is distributed under the University of Illinois Open Source
6249259Sdim// License. See LICENSE.TXT for details.
7249259Sdim//
8249259Sdim//===----------------------------------------------------------------------===//
9249259Sdim//
10249259Sdim// This file implements methods in the CodeGen/ValueTypes.h header.
11249259Sdim//
12249259Sdim//===----------------------------------------------------------------------===//
13249259Sdim
14249259Sdim#include "llvm/CodeGen/ValueTypes.h"
15249259Sdim#include "llvm/ADT/StringExtras.h"
16249259Sdim#include "llvm/IR/DerivedTypes.h"
17249259Sdim#include "llvm/IR/LLVMContext.h"
18249259Sdim#include "llvm/IR/Type.h"
19249259Sdim#include "llvm/Support/ErrorHandling.h"
20249259Sdimusing namespace llvm;
21249259Sdim
22249259SdimEVT EVT::changeExtendedVectorElementTypeToInteger() const {
23249259Sdim  LLVMContext &Context = LLVMTy->getContext();
24249259Sdim  EVT IntTy = getIntegerVT(Context, getVectorElementType().getSizeInBits());
25249259Sdim  return getVectorVT(Context, IntTy, getVectorNumElements());
26249259Sdim}
27249259Sdim
28249259SdimEVT EVT::getExtendedIntegerVT(LLVMContext &Context, unsigned BitWidth) {
29249259Sdim  EVT VT;
30249259Sdim  VT.LLVMTy = IntegerType::get(Context, BitWidth);
31249259Sdim  assert(VT.isExtended() && "Type is not extended!");
32249259Sdim  return VT;
33249259Sdim}
34249259Sdim
35249259SdimEVT EVT::getExtendedVectorVT(LLVMContext &Context, EVT VT,
36249259Sdim                             unsigned NumElements) {
37249259Sdim  EVT ResultVT;
38249259Sdim  ResultVT.LLVMTy = VectorType::get(VT.getTypeForEVT(Context), NumElements);
39249259Sdim  assert(ResultVT.isExtended() && "Type is not extended!");
40249259Sdim  return ResultVT;
41249259Sdim}
42249259Sdim
43249259Sdimbool EVT::isExtendedFloatingPoint() const {
44249259Sdim  assert(isExtended() && "Type is not extended!");
45249259Sdim  return LLVMTy->isFPOrFPVectorTy();
46249259Sdim}
47249259Sdim
48249259Sdimbool EVT::isExtendedInteger() const {
49249259Sdim  assert(isExtended() && "Type is not extended!");
50249259Sdim  return LLVMTy->isIntOrIntVectorTy();
51249259Sdim}
52249259Sdim
53249259Sdimbool EVT::isExtendedVector() const {
54249259Sdim  assert(isExtended() && "Type is not extended!");
55249259Sdim  return LLVMTy->isVectorTy();
56249259Sdim}
57249259Sdim
58249259Sdimbool EVT::isExtended16BitVector() const {
59249259Sdim  return isExtendedVector() && getExtendedSizeInBits() == 16;
60249259Sdim}
61249259Sdim
62249259Sdimbool EVT::isExtended32BitVector() const {
63249259Sdim  return isExtendedVector() && getExtendedSizeInBits() == 32;
64249259Sdim}
65249259Sdim
66249259Sdimbool EVT::isExtended64BitVector() const {
67249259Sdim  return isExtendedVector() && getExtendedSizeInBits() == 64;
68249259Sdim}
69249259Sdim
70249259Sdimbool EVT::isExtended128BitVector() const {
71249259Sdim  return isExtendedVector() && getExtendedSizeInBits() == 128;
72249259Sdim}
73249259Sdim
74249259Sdimbool EVT::isExtended256BitVector() const {
75249259Sdim  return isExtendedVector() && getExtendedSizeInBits() == 256;
76249259Sdim}
77249259Sdim
78249259Sdimbool EVT::isExtended512BitVector() const {
79249259Sdim  return isExtendedVector() && getExtendedSizeInBits() == 512;
80249259Sdim}
81249259Sdim
82249259Sdimbool EVT::isExtended1024BitVector() const {
83249259Sdim  return isExtendedVector() && getExtendedSizeInBits() == 1024;
84249259Sdim}
85249259Sdim
86249259SdimEVT EVT::getExtendedVectorElementType() const {
87249259Sdim  assert(isExtended() && "Type is not extended!");
88249259Sdim  return EVT::getEVT(cast<VectorType>(LLVMTy)->getElementType());
89249259Sdim}
90249259Sdim
91249259Sdimunsigned EVT::getExtendedVectorNumElements() const {
92249259Sdim  assert(isExtended() && "Type is not extended!");
93249259Sdim  return cast<VectorType>(LLVMTy)->getNumElements();
94249259Sdim}
95249259Sdim
96249259Sdimunsigned EVT::getExtendedSizeInBits() const {
97249259Sdim  assert(isExtended() && "Type is not extended!");
98249259Sdim  if (IntegerType *ITy = dyn_cast<IntegerType>(LLVMTy))
99249259Sdim    return ITy->getBitWidth();
100249259Sdim  if (VectorType *VTy = dyn_cast<VectorType>(LLVMTy))
101249259Sdim    return VTy->getBitWidth();
102249259Sdim  llvm_unreachable("Unrecognized extended type!");
103249259Sdim}
104249259Sdim
105249259Sdim/// getEVTString - This function returns value type as a string, e.g. "i32".
106249259Sdimstd::string EVT::getEVTString() const {
107249259Sdim  switch (V.SimpleTy) {
108249259Sdim  default:
109249259Sdim    if (isVector())
110249259Sdim      return "v" + utostr(getVectorNumElements()) +
111249259Sdim             getVectorElementType().getEVTString();
112249259Sdim    if (isInteger())
113249259Sdim      return "i" + utostr(getSizeInBits());
114249259Sdim    llvm_unreachable("Invalid EVT!");
115249259Sdim  case MVT::i1:      return "i1";
116249259Sdim  case MVT::i8:      return "i8";
117249259Sdim  case MVT::i16:     return "i16";
118249259Sdim  case MVT::i32:     return "i32";
119249259Sdim  case MVT::i64:     return "i64";
120249259Sdim  case MVT::i128:    return "i128";
121249259Sdim  case MVT::f16:     return "f16";
122249259Sdim  case MVT::f32:     return "f32";
123249259Sdim  case MVT::f64:     return "f64";
124249259Sdim  case MVT::f80:     return "f80";
125249259Sdim  case MVT::f128:    return "f128";
126249259Sdim  case MVT::ppcf128: return "ppcf128";
127249259Sdim  case MVT::isVoid:  return "isVoid";
128249259Sdim  case MVT::Other:   return "ch";
129249259Sdim  case MVT::Glue:    return "glue";
130249259Sdim  case MVT::x86mmx:  return "x86mmx";
131249259Sdim  case MVT::v2i1:    return "v2i1";
132249259Sdim  case MVT::v4i1:    return "v4i1";
133249259Sdim  case MVT::v8i1:    return "v8i1";
134249259Sdim  case MVT::v16i1:   return "v16i1";
135249259Sdim  case MVT::v32i1:   return "v32i1";
136249259Sdim  case MVT::v64i1:   return "v64i1";
137263509Sdim  case MVT::v1i8:    return "v1i8";
138249259Sdim  case MVT::v2i8:    return "v2i8";
139249259Sdim  case MVT::v4i8:    return "v4i8";
140249259Sdim  case MVT::v8i8:    return "v8i8";
141249259Sdim  case MVT::v16i8:   return "v16i8";
142249259Sdim  case MVT::v32i8:   return "v32i8";
143249259Sdim  case MVT::v64i8:   return "v64i8";
144249259Sdim  case MVT::v1i16:   return "v1i16";
145249259Sdim  case MVT::v2i16:   return "v2i16";
146249259Sdim  case MVT::v4i16:   return "v4i16";
147249259Sdim  case MVT::v8i16:   return "v8i16";
148249259Sdim  case MVT::v16i16:  return "v16i16";
149249259Sdim  case MVT::v32i16:  return "v32i16";
150249259Sdim  case MVT::v1i32:   return "v1i32";
151249259Sdim  case MVT::v2i32:   return "v2i32";
152249259Sdim  case MVT::v4i32:   return "v4i32";
153249259Sdim  case MVT::v8i32:   return "v8i32";
154249259Sdim  case MVT::v16i32:  return "v16i32";
155249259Sdim  case MVT::v1i64:   return "v1i64";
156249259Sdim  case MVT::v2i64:   return "v2i64";
157249259Sdim  case MVT::v4i64:   return "v4i64";
158249259Sdim  case MVT::v8i64:   return "v8i64";
159249259Sdim  case MVT::v16i64:  return "v16i64";
160263509Sdim  case MVT::v1f32:   return "v1f32";
161249259Sdim  case MVT::v2f32:   return "v2f32";
162249259Sdim  case MVT::v2f16:   return "v2f16";
163263509Sdim  case MVT::v4f16:   return "v4f16";
164263509Sdim  case MVT::v8f16:   return "v8f16";
165249259Sdim  case MVT::v4f32:   return "v4f32";
166249259Sdim  case MVT::v8f32:   return "v8f32";
167249259Sdim  case MVT::v16f32:  return "v16f32";
168263509Sdim  case MVT::v1f64:   return "v1f64";
169249259Sdim  case MVT::v2f64:   return "v2f64";
170249259Sdim  case MVT::v4f64:   return "v4f64";
171249259Sdim  case MVT::v8f64:   return "v8f64";
172249259Sdim  case MVT::Metadata:return "Metadata";
173249259Sdim  case MVT::Untyped: return "Untyped";
174249259Sdim  }
175249259Sdim}
176249259Sdim
177249259Sdim/// getTypeForEVT - This method returns an LLVM type corresponding to the
178249259Sdim/// specified EVT.  For integer types, this returns an unsigned type.  Note
179249259Sdim/// that this will abort for types that cannot be represented.
180249259SdimType *EVT::getTypeForEVT(LLVMContext &Context) const {
181249259Sdim  switch (V.SimpleTy) {
182249259Sdim  default:
183249259Sdim    assert(isExtended() && "Type is not extended!");
184249259Sdim    return LLVMTy;
185249259Sdim  case MVT::isVoid:  return Type::getVoidTy(Context);
186249259Sdim  case MVT::i1:      return Type::getInt1Ty(Context);
187249259Sdim  case MVT::i8:      return Type::getInt8Ty(Context);
188249259Sdim  case MVT::i16:     return Type::getInt16Ty(Context);
189249259Sdim  case MVT::i32:     return Type::getInt32Ty(Context);
190249259Sdim  case MVT::i64:     return Type::getInt64Ty(Context);
191249259Sdim  case MVT::i128:    return IntegerType::get(Context, 128);
192249259Sdim  case MVT::f16:     return Type::getHalfTy(Context);
193249259Sdim  case MVT::f32:     return Type::getFloatTy(Context);
194249259Sdim  case MVT::f64:     return Type::getDoubleTy(Context);
195249259Sdim  case MVT::f80:     return Type::getX86_FP80Ty(Context);
196249259Sdim  case MVT::f128:    return Type::getFP128Ty(Context);
197249259Sdim  case MVT::ppcf128: return Type::getPPC_FP128Ty(Context);
198249259Sdim  case MVT::x86mmx:  return Type::getX86_MMXTy(Context);
199249259Sdim  case MVT::v2i1:    return VectorType::get(Type::getInt1Ty(Context), 2);
200249259Sdim  case MVT::v4i1:    return VectorType::get(Type::getInt1Ty(Context), 4);
201249259Sdim  case MVT::v8i1:    return VectorType::get(Type::getInt1Ty(Context), 8);
202249259Sdim  case MVT::v16i1:   return VectorType::get(Type::getInt1Ty(Context), 16);
203249259Sdim  case MVT::v32i1:   return VectorType::get(Type::getInt1Ty(Context), 32);
204249259Sdim  case MVT::v64i1:   return VectorType::get(Type::getInt1Ty(Context), 64);
205263509Sdim  case MVT::v1i8:    return VectorType::get(Type::getInt8Ty(Context), 1);
206249259Sdim  case MVT::v2i8:    return VectorType::get(Type::getInt8Ty(Context), 2);
207249259Sdim  case MVT::v4i8:    return VectorType::get(Type::getInt8Ty(Context), 4);
208249259Sdim  case MVT::v8i8:    return VectorType::get(Type::getInt8Ty(Context), 8);
209249259Sdim  case MVT::v16i8:   return VectorType::get(Type::getInt8Ty(Context), 16);
210249259Sdim  case MVT::v32i8:   return VectorType::get(Type::getInt8Ty(Context), 32);
211249259Sdim  case MVT::v64i8:   return VectorType::get(Type::getInt8Ty(Context), 64);
212249259Sdim  case MVT::v1i16:   return VectorType::get(Type::getInt16Ty(Context), 1);
213249259Sdim  case MVT::v2i16:   return VectorType::get(Type::getInt16Ty(Context), 2);
214249259Sdim  case MVT::v4i16:   return VectorType::get(Type::getInt16Ty(Context), 4);
215249259Sdim  case MVT::v8i16:   return VectorType::get(Type::getInt16Ty(Context), 8);
216249259Sdim  case MVT::v16i16:  return VectorType::get(Type::getInt16Ty(Context), 16);
217249259Sdim  case MVT::v32i16:  return VectorType::get(Type::getInt16Ty(Context), 32);
218249259Sdim  case MVT::v1i32:   return VectorType::get(Type::getInt32Ty(Context), 1);
219249259Sdim  case MVT::v2i32:   return VectorType::get(Type::getInt32Ty(Context), 2);
220249259Sdim  case MVT::v4i32:   return VectorType::get(Type::getInt32Ty(Context), 4);
221249259Sdim  case MVT::v8i32:   return VectorType::get(Type::getInt32Ty(Context), 8);
222249259Sdim  case MVT::v16i32:  return VectorType::get(Type::getInt32Ty(Context), 16);
223249259Sdim  case MVT::v1i64:   return VectorType::get(Type::getInt64Ty(Context), 1);
224249259Sdim  case MVT::v2i64:   return VectorType::get(Type::getInt64Ty(Context), 2);
225249259Sdim  case MVT::v4i64:   return VectorType::get(Type::getInt64Ty(Context), 4);
226249259Sdim  case MVT::v8i64:   return VectorType::get(Type::getInt64Ty(Context), 8);
227249259Sdim  case MVT::v16i64:  return VectorType::get(Type::getInt64Ty(Context), 16);
228249259Sdim  case MVT::v2f16:   return VectorType::get(Type::getHalfTy(Context), 2);
229263509Sdim  case MVT::v4f16:   return VectorType::get(Type::getHalfTy(Context), 4);
230263509Sdim  case MVT::v8f16:   return VectorType::get(Type::getHalfTy(Context), 8);
231263509Sdim  case MVT::v1f32:   return VectorType::get(Type::getFloatTy(Context), 1);
232249259Sdim  case MVT::v2f32:   return VectorType::get(Type::getFloatTy(Context), 2);
233249259Sdim  case MVT::v4f32:   return VectorType::get(Type::getFloatTy(Context), 4);
234249259Sdim  case MVT::v8f32:   return VectorType::get(Type::getFloatTy(Context), 8);
235249259Sdim  case MVT::v16f32:   return VectorType::get(Type::getFloatTy(Context), 16);
236263509Sdim  case MVT::v1f64:   return VectorType::get(Type::getDoubleTy(Context), 1);
237249259Sdim  case MVT::v2f64:   return VectorType::get(Type::getDoubleTy(Context), 2);
238249259Sdim  case MVT::v4f64:   return VectorType::get(Type::getDoubleTy(Context), 4);
239249259Sdim  case MVT::v8f64:   return VectorType::get(Type::getDoubleTy(Context), 8);
240249259Sdim  case MVT::Metadata: return Type::getMetadataTy(Context);
241249259Sdim }
242249259Sdim}
243249259Sdim
244249259Sdim/// Return the value type corresponding to the specified type.  This returns all
245249259Sdim/// pointers as MVT::iPTR.  If HandleUnknown is true, unknown types are returned
246249259Sdim/// as Other, otherwise they are invalid.
247249259SdimMVT MVT::getVT(Type *Ty, bool HandleUnknown){
248249259Sdim  switch (Ty->getTypeID()) {
249249259Sdim  default:
250249259Sdim    if (HandleUnknown) return MVT(MVT::Other);
251249259Sdim    llvm_unreachable("Unknown type!");
252249259Sdim  case Type::VoidTyID:
253249259Sdim    return MVT::isVoid;
254249259Sdim  case Type::IntegerTyID:
255249259Sdim    return getIntegerVT(cast<IntegerType>(Ty)->getBitWidth());
256249259Sdim  case Type::HalfTyID:      return MVT(MVT::f16);
257249259Sdim  case Type::FloatTyID:     return MVT(MVT::f32);
258249259Sdim  case Type::DoubleTyID:    return MVT(MVT::f64);
259249259Sdim  case Type::X86_FP80TyID:  return MVT(MVT::f80);
260249259Sdim  case Type::X86_MMXTyID:   return MVT(MVT::x86mmx);
261249259Sdim  case Type::FP128TyID:     return MVT(MVT::f128);
262249259Sdim  case Type::PPC_FP128TyID: return MVT(MVT::ppcf128);
263249259Sdim  case Type::PointerTyID:   return MVT(MVT::iPTR);
264249259Sdim  case Type::VectorTyID: {
265249259Sdim    VectorType *VTy = cast<VectorType>(Ty);
266249259Sdim    return getVectorVT(
267249259Sdim      getVT(VTy->getElementType(), false), VTy->getNumElements());
268249259Sdim  }
269249259Sdim  }
270249259Sdim}
271249259Sdim
272249259Sdim/// getEVT - Return the value type corresponding to the specified type.  This
273249259Sdim/// returns all pointers as MVT::iPTR.  If HandleUnknown is true, unknown types
274249259Sdim/// are returned as Other, otherwise they are invalid.
275249259SdimEVT EVT::getEVT(Type *Ty, bool HandleUnknown){
276249259Sdim  switch (Ty->getTypeID()) {
277249259Sdim  default:
278249259Sdim    return MVT::getVT(Ty, HandleUnknown);
279249259Sdim  case Type::IntegerTyID:
280249259Sdim    return getIntegerVT(Ty->getContext(), cast<IntegerType>(Ty)->getBitWidth());
281249259Sdim  case Type::VectorTyID: {
282249259Sdim    VectorType *VTy = cast<VectorType>(Ty);
283249259Sdim    return getVectorVT(Ty->getContext(), getEVT(VTy->getElementType(), false),
284249259Sdim                       VTy->getNumElements());
285249259Sdim  }
286249259Sdim  }
287249259Sdim}
288