1//===- CodeGen/ValueTypes.h - Low-Level Target independ. types --*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the set of low-level target independent types which various
11// values in the code generator are.  This allows the target specific behavior
12// of instructions to be described to target independent passes.
13//
14//===----------------------------------------------------------------------===//
15
16#ifndef LLVM_CODEGEN_VALUETYPES_H
17#define LLVM_CODEGEN_VALUETYPES_H
18
19#include "llvm/Support/DataTypes.h"
20#include "llvm/Support/ErrorHandling.h"
21#include "llvm/Support/MathExtras.h"
22#include <cassert>
23#include <string>
24
25namespace llvm {
26  class Type;
27  class LLVMContext;
28  struct EVT;
29
30  /// MVT - Machine Value Type.  Every type that is supported natively by some
31  /// processor targeted by LLVM occurs here.  This means that any legal value
32  /// type can be represented by a MVT.
33  class MVT {
34  public:
35    enum SimpleValueType {
36      // If you change this numbering, you must change the values in
37      // ValueTypes.td as well!
38      Other          =   0,   // This is a non-standard value
39      i1             =   1,   // This is a 1 bit integer value
40      i8             =   2,   // This is an 8 bit integer value
41      i16            =   3,   // This is a 16 bit integer value
42      i32            =   4,   // This is a 32 bit integer value
43      i64            =   5,   // This is a 64 bit integer value
44      i128           =   6,   // This is a 128 bit integer value
45
46      FIRST_INTEGER_VALUETYPE = i1,
47      LAST_INTEGER_VALUETYPE  = i128,
48
49      f16            =   7,   // This is a 16 bit floating point value
50      f32            =   8,   // This is a 32 bit floating point value
51      f64            =   9,   // This is a 64 bit floating point value
52      f80            =  10,   // This is a 80 bit floating point value
53      f128           =  11,   // This is a 128 bit floating point value
54      ppcf128        =  12,   // This is a PPC 128-bit floating point value
55
56      FIRST_FP_VALUETYPE = f16,
57      LAST_FP_VALUETYPE  = ppcf128,
58
59      v2i1           =  13,   //  2 x i1
60      v4i1           =  14,   //  4 x i1
61      v8i1           =  15,   //  8 x i1
62      v16i1          =  16,   // 16 x i1
63      v2i8           =  17,   //  2 x i8
64      v4i8           =  18,   //  4 x i8
65      v8i8           =  19,   //  8 x i8
66      v16i8          =  20,   // 16 x i8
67      v32i8          =  21,   // 32 x i8
68      v1i16          =  22,   //  1 x i16
69      v2i16          =  23,   //  2 x i16
70      v4i16          =  24,   //  4 x i16
71      v8i16          =  25,   //  8 x i16
72      v16i16         =  26,   // 16 x i16
73      v1i32          =  27,   //  1 x i32
74      v2i32          =  28,   //  2 x i32
75      v4i32          =  29,   //  4 x i32
76      v8i32          =  30,   //  8 x i32
77      v16i32         =  31,   // 16 x i32
78      v1i64          =  32,   //  1 x i64
79      v2i64          =  33,   //  2 x i64
80      v4i64          =  34,   //  4 x i64
81      v8i64          =  35,   //  8 x i64
82      v16i64         =  36,   // 16 x i64
83
84      v2f16          =  37,   //  2 x f16
85      v2f32          =  38,   //  2 x f32
86      v4f32          =  39,   //  4 x f32
87      v8f32          =  40,   //  8 x f32
88      v2f64          =  41,   //  2 x f64
89      v4f64          =  42,   //  4 x f64
90
91      FIRST_VECTOR_VALUETYPE = v2i1,
92      LAST_VECTOR_VALUETYPE  = v4f64,
93      FIRST_INTEGER_VECTOR_VALUETYPE = v2i1,
94      LAST_INTEGER_VECTOR_VALUETYPE = v16i64,
95      FIRST_FP_VECTOR_VALUETYPE = v2f16,
96      LAST_FP_VECTOR_VALUETYPE = v4f64,
97
98      x86mmx         =  43,   // This is an X86 MMX value
99
100      Glue           =  44,   // This glues nodes together during pre-RA sched
101
102      isVoid         =  45,   // This has no value
103
104      Untyped        =  46,   // This value takes a register, but has
105                              // unspecified type.  The register class
106                              // will be determined by the opcode.
107
108      LAST_VALUETYPE =  47,   // This always remains at the end of the list.
109
110      // This is the current maximum for LAST_VALUETYPE.
111      // MVT::MAX_ALLOWED_VALUETYPE is used for asserts and to size bit vectors
112      // This value must be a multiple of 32.
113      MAX_ALLOWED_VALUETYPE = 64,
114
115      // Metadata - This is MDNode or MDString.
116      Metadata       = 250,
117
118      // iPTRAny - An int value the size of the pointer of the current
119      // target to any address space. This must only be used internal to
120      // tblgen. Other than for overloading, we treat iPTRAny the same as iPTR.
121      iPTRAny        = 251,
122
123      // vAny - A vector with any length and element size. This is used
124      // for intrinsics that have overloadings based on vector types.
125      // This is only for tblgen's consumption!
126      vAny           = 252,
127
128      // fAny - Any floating-point or vector floating-point value. This is used
129      // for intrinsics that have overloadings based on floating-point types.
130      // This is only for tblgen's consumption!
131      fAny           = 253,
132
133      // iAny - An integer or vector integer value of any bit width. This is
134      // used for intrinsics that have overloadings based on integer bit widths.
135      // This is only for tblgen's consumption!
136      iAny           = 254,
137
138      // iPTR - An int value the size of the pointer of the current
139      // target.  This should only be used internal to tblgen!
140      iPTR           = 255,
141
142      // LastSimpleValueType - The greatest valid SimpleValueType value.
143      LastSimpleValueType = 255,
144
145      // INVALID_SIMPLE_VALUE_TYPE - Simple value types greater than or equal
146      // to this are considered extended value types.
147      INVALID_SIMPLE_VALUE_TYPE = LastSimpleValueType + 1
148    };
149
150    SimpleValueType SimpleTy;
151
152    MVT() : SimpleTy((SimpleValueType)(INVALID_SIMPLE_VALUE_TYPE)) {}
153    MVT(SimpleValueType SVT) : SimpleTy(SVT) { }
154
155    bool operator>(const MVT& S)  const { return SimpleTy >  S.SimpleTy; }
156    bool operator<(const MVT& S)  const { return SimpleTy <  S.SimpleTy; }
157    bool operator==(const MVT& S) const { return SimpleTy == S.SimpleTy; }
158    bool operator!=(const MVT& S) const { return SimpleTy != S.SimpleTy; }
159    bool operator>=(const MVT& S) const { return SimpleTy >= S.SimpleTy; }
160    bool operator<=(const MVT& S) const { return SimpleTy <= S.SimpleTy; }
161
162    /// isFloatingPoint - Return true if this is a FP, or a vector FP type.
163    bool isFloatingPoint() const {
164      return ((SimpleTy >= MVT::FIRST_FP_VALUETYPE &&
165               SimpleTy <= MVT::LAST_FP_VALUETYPE) ||
166              (SimpleTy >= MVT::FIRST_FP_VECTOR_VALUETYPE &&
167               SimpleTy <= MVT::LAST_FP_VECTOR_VALUETYPE));
168    }
169
170    /// isInteger - Return true if this is an integer, or a vector integer type.
171    bool isInteger() const {
172      return ((SimpleTy >= MVT::FIRST_INTEGER_VALUETYPE &&
173               SimpleTy <= MVT::LAST_INTEGER_VALUETYPE) ||
174              (SimpleTy >= MVT::FIRST_INTEGER_VECTOR_VALUETYPE &&
175               SimpleTy <= MVT::LAST_INTEGER_VECTOR_VALUETYPE));
176    }
177
178    /// isVector - Return true if this is a vector value type.
179    bool isVector() const {
180      return (SimpleTy >= MVT::FIRST_VECTOR_VALUETYPE &&
181              SimpleTy <= MVT::LAST_VECTOR_VALUETYPE);
182    }
183
184    /// is16BitVector - Return true if this is a 16-bit vector type.
185    bool is16BitVector() const {
186      return (SimpleTy == MVT::v2i8  || SimpleTy == MVT::v1i16 ||
187              SimpleTy == MVT::v16i1);
188    }
189
190    /// is32BitVector - Return true if this is a 32-bit vector type.
191    bool is32BitVector() const {
192      return (SimpleTy == MVT::v4i8  || SimpleTy == MVT::v2i16 ||
193              SimpleTy == MVT::v1i32);
194    }
195
196    /// is64BitVector - Return true if this is a 64-bit vector type.
197    bool is64BitVector() const {
198      return (SimpleTy == MVT::v8i8  || SimpleTy == MVT::v4i16 ||
199              SimpleTy == MVT::v2i32 || SimpleTy == MVT::v1i64 ||
200              SimpleTy == MVT::v2f32);
201    }
202
203    /// is128BitVector - Return true if this is a 128-bit vector type.
204    bool is128BitVector() const {
205      return (SimpleTy == MVT::v16i8 || SimpleTy == MVT::v8i16 ||
206              SimpleTy == MVT::v4i32 || SimpleTy == MVT::v2i64 ||
207              SimpleTy == MVT::v4f32 || SimpleTy == MVT::v2f64);
208    }
209
210    /// is256BitVector - Return true if this is a 256-bit vector type.
211    bool is256BitVector() const {
212      return (SimpleTy == MVT::v8f32 || SimpleTy == MVT::v4f64  ||
213              SimpleTy == MVT::v32i8 || SimpleTy == MVT::v16i16 ||
214              SimpleTy == MVT::v8i32 || SimpleTy == MVT::v4i64);
215    }
216
217    /// is512BitVector - Return true if this is a 512-bit vector type.
218    bool is512BitVector() const {
219      return (SimpleTy == MVT::v8i64 || SimpleTy == MVT::v16i32);
220    }
221
222    /// is1024BitVector - Return true if this is a 1024-bit vector type.
223    bool is1024BitVector() const {
224      return (SimpleTy == MVT::v16i64);
225    }
226
227    /// isPow2VectorType - Returns true if the given vector is a power of 2.
228    bool isPow2VectorType() const {
229      unsigned NElts = getVectorNumElements();
230      return !(NElts & (NElts - 1));
231    }
232
233    /// getPow2VectorType - Widens the length of the given vector MVT up to
234    /// the nearest power of 2 and returns that type.
235    MVT getPow2VectorType() const {
236      if (isPow2VectorType())
237        return *this;
238
239      unsigned NElts = getVectorNumElements();
240      unsigned Pow2NElts = 1 << Log2_32_Ceil(NElts);
241      return MVT::getVectorVT(getVectorElementType(), Pow2NElts);
242    }
243
244    /// getScalarType - If this is a vector type, return the element type,
245    /// otherwise return this.
246    MVT getScalarType() const {
247      return isVector() ? getVectorElementType() : *this;
248    }
249
250    MVT getVectorElementType() const {
251      switch (SimpleTy) {
252      default:
253        llvm_unreachable("Not a vector MVT!");
254      case v2i1 :
255      case v4i1 :
256      case v8i1 :
257      case v16i1: return i1;
258      case v2i8 :
259      case v4i8 :
260      case v8i8 :
261      case v16i8:
262      case v32i8: return i8;
263      case v1i16:
264      case v2i16:
265      case v4i16:
266      case v8i16:
267      case v16i16: return i16;
268      case v1i32:
269      case v2i32:
270      case v4i32:
271      case v8i32:
272      case v16i32: return i32;
273      case v1i64:
274      case v2i64:
275      case v4i64:
276      case v8i64:
277      case v16i64: return i64;
278      case v2f16: return f16;
279      case v2f32:
280      case v4f32:
281      case v8f32: return f32;
282      case v2f64:
283      case v4f64: return f64;
284      }
285    }
286
287    unsigned getVectorNumElements() const {
288      switch (SimpleTy) {
289      default:
290        llvm_unreachable("Not a vector MVT!");
291      case v32i8: return 32;
292      case v16i1:
293      case v16i8:
294      case v16i16:
295      case v16i32:
296      case v16i64:return 16;
297      case v8i1:
298      case v8i8 :
299      case v8i16:
300      case v8i32:
301      case v8i64:
302      case v8f32: return 8;
303      case v4i1:
304      case v4i8:
305      case v4i16:
306      case v4i32:
307      case v4i64:
308      case v4f32:
309      case v4f64: return 4;
310      case v2i1:
311      case v2i8:
312      case v2i16:
313      case v2i32:
314      case v2i64:
315      case v2f16:
316      case v2f32:
317      case v2f64: return 2;
318      case v1i16:
319      case v1i32:
320      case v1i64: return 1;
321      }
322    }
323
324    unsigned getSizeInBits() const {
325      switch (SimpleTy) {
326      case iPTR:
327        llvm_unreachable("Value type size is target-dependent. Ask TLI.");
328      case iPTRAny:
329      case iAny:
330      case fAny:
331        llvm_unreachable("Value type is overloaded.");
332      default:
333        llvm_unreachable("getSizeInBits called on extended MVT.");
334      case i1  :  return 1;
335      case v2i1:  return 2;
336      case v4i1:  return 4;
337      case i8  :
338      case v8i1: return 8;
339      case i16 :
340      case f16:
341      case v16i1:
342      case v2i8:
343      case v1i16: return 16;
344      case f32 :
345      case i32 :
346      case v4i8:
347      case v2i16:
348      case v2f16:
349      case v1i32: return 32;
350      case x86mmx:
351      case f64 :
352      case i64 :
353      case v8i8:
354      case v4i16:
355      case v2i32:
356      case v1i64:
357      case v2f32: return 64;
358      case f80 :  return 80;
359      case f128:
360      case ppcf128:
361      case i128:
362      case v16i8:
363      case v8i16:
364      case v4i32:
365      case v2i64:
366      case v4f32:
367      case v2f64: return 128;
368      case v32i8:
369      case v16i16:
370      case v8i32:
371      case v4i64:
372      case v8f32:
373      case v4f64: return 256;
374      case v16i32:
375      case v8i64: return 512;
376      case v16i64:return 1024;
377      }
378    }
379
380    /// getStoreSize - Return the number of bytes overwritten by a store
381    /// of the specified value type.
382    unsigned getStoreSize() const {
383      return (getSizeInBits() + 7) / 8;
384    }
385
386    /// getStoreSizeInBits - Return the number of bits overwritten by a store
387    /// of the specified value type.
388    unsigned getStoreSizeInBits() const {
389      return getStoreSize() * 8;
390    }
391
392    static MVT getFloatingPointVT(unsigned BitWidth) {
393      switch (BitWidth) {
394      default:
395        llvm_unreachable("Bad bit width!");
396      case 16:
397        return MVT::f16;
398      case 32:
399        return MVT::f32;
400      case 64:
401        return MVT::f64;
402      case 80:
403        return MVT::f80;
404      case 128:
405        return MVT::f128;
406      }
407    }
408
409    static MVT getIntegerVT(unsigned BitWidth) {
410      switch (BitWidth) {
411      default:
412        return (MVT::SimpleValueType)(MVT::INVALID_SIMPLE_VALUE_TYPE);
413      case 1:
414        return MVT::i1;
415      case 8:
416        return MVT::i8;
417      case 16:
418        return MVT::i16;
419      case 32:
420        return MVT::i32;
421      case 64:
422        return MVT::i64;
423      case 128:
424        return MVT::i128;
425      }
426    }
427
428    static MVT getVectorVT(MVT VT, unsigned NumElements) {
429      switch (VT.SimpleTy) {
430      default:
431        break;
432      case MVT::i1:
433        if (NumElements == 2)  return MVT::v2i1;
434        if (NumElements == 4)  return MVT::v4i1;
435        if (NumElements == 8)  return MVT::v8i1;
436        if (NumElements == 16) return MVT::v16i1;
437        break;
438      case MVT::i8:
439        if (NumElements == 2)  return MVT::v2i8;
440        if (NumElements == 4)  return MVT::v4i8;
441        if (NumElements == 8)  return MVT::v8i8;
442        if (NumElements == 16) return MVT::v16i8;
443        if (NumElements == 32) return MVT::v32i8;
444        break;
445      case MVT::i16:
446        if (NumElements == 1)  return MVT::v1i16;
447        if (NumElements == 2)  return MVT::v2i16;
448        if (NumElements == 4)  return MVT::v4i16;
449        if (NumElements == 8)  return MVT::v8i16;
450        if (NumElements == 16) return MVT::v16i16;
451        break;
452      case MVT::i32:
453        if (NumElements == 1)  return MVT::v1i32;
454        if (NumElements == 2)  return MVT::v2i32;
455        if (NumElements == 4)  return MVT::v4i32;
456        if (NumElements == 8)  return MVT::v8i32;
457        if (NumElements == 16) return MVT::v16i32;
458        break;
459      case MVT::i64:
460        if (NumElements == 1)  return MVT::v1i64;
461        if (NumElements == 2)  return MVT::v2i64;
462        if (NumElements == 4)  return MVT::v4i64;
463        if (NumElements == 8)  return MVT::v8i64;
464        if (NumElements == 16) return MVT::v16i64;
465        break;
466      case MVT::f16:
467        if (NumElements == 2)  return MVT::v2f16;
468        break;
469      case MVT::f32:
470        if (NumElements == 2)  return MVT::v2f32;
471        if (NumElements == 4)  return MVT::v4f32;
472        if (NumElements == 8)  return MVT::v8f32;
473        break;
474      case MVT::f64:
475        if (NumElements == 2)  return MVT::v2f64;
476        if (NumElements == 4)  return MVT::v4f64;
477        break;
478      }
479      return (MVT::SimpleValueType)(MVT::INVALID_SIMPLE_VALUE_TYPE);
480    }
481  };
482
483
484  /// EVT - Extended Value Type.  Capable of holding value types which are not
485  /// native for any processor (such as the i12345 type), as well as the types
486  /// a MVT can represent.
487  struct EVT {
488  private:
489    MVT V;
490    Type *LLVMTy;
491
492  public:
493    EVT() : V((MVT::SimpleValueType)(MVT::INVALID_SIMPLE_VALUE_TYPE)),
494            LLVMTy(0) {}
495    EVT(MVT::SimpleValueType SVT) : V(SVT), LLVMTy(0) { }
496    EVT(MVT S) : V(S), LLVMTy(0) {}
497
498    bool operator==(EVT VT) const {
499      return !(*this != VT);
500    }
501    bool operator!=(EVT VT) const {
502      if (V.SimpleTy != VT.V.SimpleTy)
503        return true;
504      if (V.SimpleTy == MVT::INVALID_SIMPLE_VALUE_TYPE)
505        return LLVMTy != VT.LLVMTy;
506      return false;
507    }
508
509    /// getFloatingPointVT - Returns the EVT that represents a floating point
510    /// type with the given number of bits.  There are two floating point types
511    /// with 128 bits - this returns f128 rather than ppcf128.
512    static EVT getFloatingPointVT(unsigned BitWidth) {
513      return MVT::getFloatingPointVT(BitWidth);
514    }
515
516    /// getIntegerVT - Returns the EVT that represents an integer with the given
517    /// number of bits.
518    static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth) {
519      MVT M = MVT::getIntegerVT(BitWidth);
520      if (M.SimpleTy != MVT::INVALID_SIMPLE_VALUE_TYPE)
521        return M;
522      return getExtendedIntegerVT(Context, BitWidth);
523    }
524
525    /// getVectorVT - Returns the EVT that represents a vector NumElements in
526    /// length, where each element is of type VT.
527    static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements) {
528      MVT M = MVT::getVectorVT(VT.V, NumElements);
529      if (M.SimpleTy != MVT::INVALID_SIMPLE_VALUE_TYPE)
530        return M;
531      return getExtendedVectorVT(Context, VT, NumElements);
532    }
533
534    /// changeVectorElementTypeToInteger - Return a vector with the same number
535    /// of elements as this vector, but with the element type converted to an
536    /// integer type with the same bitwidth.
537    EVT changeVectorElementTypeToInteger() const {
538      if (!isSimple())
539        return changeExtendedVectorElementTypeToInteger();
540      MVT EltTy = getSimpleVT().getVectorElementType();
541      unsigned BitWidth = EltTy.getSizeInBits();
542      MVT IntTy = MVT::getIntegerVT(BitWidth);
543      MVT VecTy = MVT::getVectorVT(IntTy, getVectorNumElements());
544      assert(VecTy != MVT::INVALID_SIMPLE_VALUE_TYPE &&
545             "Simple vector VT not representable by simple integer vector VT!");
546      return VecTy;
547    }
548
549    /// isSimple - Test if the given EVT is simple (as opposed to being
550    /// extended).
551    bool isSimple() const {
552      return V.SimpleTy <= MVT::LastSimpleValueType;
553    }
554
555    /// isExtended - Test if the given EVT is extended (as opposed to
556    /// being simple).
557    bool isExtended() const {
558      return !isSimple();
559    }
560
561    /// isFloatingPoint - Return true if this is a FP, or a vector FP type.
562    bool isFloatingPoint() const {
563      return isSimple() ? V.isFloatingPoint() : isExtendedFloatingPoint();
564    }
565
566    /// isInteger - Return true if this is an integer, or a vector integer type.
567    bool isInteger() const {
568      return isSimple() ? V.isInteger() : isExtendedInteger();
569    }
570
571    /// isVector - Return true if this is a vector value type.
572    bool isVector() const {
573      return isSimple() ? V.isVector() : isExtendedVector();
574    }
575
576    /// is16BitVector - Return true if this is a 16-bit vector type.
577    bool is16BitVector() const {
578      return isSimple() ? V.is16BitVector() : isExtended16BitVector();
579    }
580
581    /// is32BitVector - Return true if this is a 32-bit vector type.
582    bool is32BitVector() const {
583      return isSimple() ? V.is32BitVector() : isExtended32BitVector();
584    }
585
586    /// is64BitVector - Return true if this is a 64-bit vector type.
587    bool is64BitVector() const {
588      return isSimple() ? V.is64BitVector() : isExtended64BitVector();
589    }
590
591    /// is128BitVector - Return true if this is a 128-bit vector type.
592    bool is128BitVector() const {
593      return isSimple() ? V.is128BitVector() : isExtended128BitVector();
594    }
595
596    /// is256BitVector - Return true if this is a 256-bit vector type.
597    bool is256BitVector() const {
598      return isSimple() ? V.is256BitVector() : isExtended256BitVector();
599    }
600
601    /// is512BitVector - Return true if this is a 512-bit vector type.
602    bool is512BitVector() const {
603      return isSimple() ? V.is512BitVector() : isExtended512BitVector();
604    }
605
606    /// is1024BitVector - Return true if this is a 1024-bit vector type.
607    bool is1024BitVector() const {
608      return isSimple() ? V.is1024BitVector() : isExtended1024BitVector();
609    }
610
611    /// isOverloaded - Return true if this is an overloaded type for TableGen.
612    bool isOverloaded() const {
613      return (V==MVT::iAny || V==MVT::fAny || V==MVT::vAny || V==MVT::iPTRAny);
614    }
615
616    /// isByteSized - Return true if the bit size is a multiple of 8.
617    bool isByteSized() const {
618      return (getSizeInBits() & 7) == 0;
619    }
620
621    /// isRound - Return true if the size is a power-of-two number of bytes.
622    bool isRound() const {
623      unsigned BitSize = getSizeInBits();
624      return BitSize >= 8 && !(BitSize & (BitSize - 1));
625    }
626
627    /// bitsEq - Return true if this has the same number of bits as VT.
628    bool bitsEq(EVT VT) const {
629      if (EVT::operator==(VT)) return true;
630      return getSizeInBits() == VT.getSizeInBits();
631    }
632
633    /// bitsGT - Return true if this has more bits than VT.
634    bool bitsGT(EVT VT) const {
635      if (EVT::operator==(VT)) return false;
636      return getSizeInBits() > VT.getSizeInBits();
637    }
638
639    /// bitsGE - Return true if this has no less bits than VT.
640    bool bitsGE(EVT VT) const {
641      if (EVT::operator==(VT)) return true;
642      return getSizeInBits() >= VT.getSizeInBits();
643    }
644
645    /// bitsLT - Return true if this has less bits than VT.
646    bool bitsLT(EVT VT) const {
647      if (EVT::operator==(VT)) return false;
648      return getSizeInBits() < VT.getSizeInBits();
649    }
650
651    /// bitsLE - Return true if this has no more bits than VT.
652    bool bitsLE(EVT VT) const {
653      if (EVT::operator==(VT)) return true;
654      return getSizeInBits() <= VT.getSizeInBits();
655    }
656
657
658    /// getSimpleVT - Return the SimpleValueType held in the specified
659    /// simple EVT.
660    MVT getSimpleVT() const {
661      assert(isSimple() && "Expected a SimpleValueType!");
662      return V;
663    }
664
665    /// getScalarType - If this is a vector type, return the element type,
666    /// otherwise return this.
667    EVT getScalarType() const {
668      return isVector() ? getVectorElementType() : *this;
669    }
670
671    /// getVectorElementType - Given a vector type, return the type of
672    /// each element.
673    EVT getVectorElementType() const {
674      assert(isVector() && "Invalid vector type!");
675      if (isSimple())
676        return V.getVectorElementType();
677      return getExtendedVectorElementType();
678    }
679
680    /// getVectorNumElements - Given a vector type, return the number of
681    /// elements it contains.
682    unsigned getVectorNumElements() const {
683      assert(isVector() && "Invalid vector type!");
684      if (isSimple())
685        return V.getVectorNumElements();
686      return getExtendedVectorNumElements();
687    }
688
689    /// getSizeInBits - Return the size of the specified value type in bits.
690    unsigned getSizeInBits() const {
691      if (isSimple())
692        return V.getSizeInBits();
693      return getExtendedSizeInBits();
694    }
695
696    /// getStoreSize - Return the number of bytes overwritten by a store
697    /// of the specified value type.
698    unsigned getStoreSize() const {
699      return (getSizeInBits() + 7) / 8;
700    }
701
702    /// getStoreSizeInBits - Return the number of bits overwritten by a store
703    /// of the specified value type.
704    unsigned getStoreSizeInBits() const {
705      return getStoreSize() * 8;
706    }
707
708    /// getRoundIntegerType - Rounds the bit-width of the given integer EVT up
709    /// to the nearest power of two (and at least to eight), and returns the
710    /// integer EVT with that number of bits.
711    EVT getRoundIntegerType(LLVMContext &Context) const {
712      assert(isInteger() && !isVector() && "Invalid integer type!");
713      unsigned BitWidth = getSizeInBits();
714      if (BitWidth <= 8)
715        return EVT(MVT::i8);
716      return getIntegerVT(Context, 1 << Log2_32_Ceil(BitWidth));
717    }
718
719    /// getHalfSizedIntegerVT - Finds the smallest simple value type that is
720    /// greater than or equal to half the width of this EVT. If no simple
721    /// value type can be found, an extended integer value type of half the
722    /// size (rounded up) is returned.
723    EVT getHalfSizedIntegerVT(LLVMContext &Context) const {
724      assert(isInteger() && !isVector() && "Invalid integer type!");
725      unsigned EVTSize = getSizeInBits();
726      for (unsigned IntVT = MVT::FIRST_INTEGER_VALUETYPE;
727          IntVT <= MVT::LAST_INTEGER_VALUETYPE; ++IntVT) {
728        EVT HalfVT = EVT((MVT::SimpleValueType)IntVT);
729        if (HalfVT.getSizeInBits() * 2 >= EVTSize)
730          return HalfVT;
731      }
732      return getIntegerVT(Context, (EVTSize + 1) / 2);
733    }
734
735    /// isPow2VectorType - Returns true if the given vector is a power of 2.
736    bool isPow2VectorType() const {
737      unsigned NElts = getVectorNumElements();
738      return !(NElts & (NElts - 1));
739    }
740
741    /// getPow2VectorType - Widens the length of the given vector EVT up to
742    /// the nearest power of 2 and returns that type.
743    EVT getPow2VectorType(LLVMContext &Context) const {
744      if (!isPow2VectorType()) {
745        unsigned NElts = getVectorNumElements();
746        unsigned Pow2NElts = 1 <<  Log2_32_Ceil(NElts);
747        return EVT::getVectorVT(Context, getVectorElementType(), Pow2NElts);
748      }
749      else {
750        return *this;
751      }
752    }
753
754    /// getEVTString - This function returns value type as a string,
755    /// e.g. "i32".
756    std::string getEVTString() const;
757
758    /// getTypeForEVT - This method returns an LLVM type corresponding to the
759    /// specified EVT.  For integer types, this returns an unsigned type.  Note
760    /// that this will abort for types that cannot be represented.
761    Type *getTypeForEVT(LLVMContext &Context) const;
762
763    /// getEVT - Return the value type corresponding to the specified type.
764    /// This returns all pointers as iPTR.  If HandleUnknown is true, unknown
765    /// types are returned as Other, otherwise they are invalid.
766    static EVT getEVT(Type *Ty, bool HandleUnknown = false);
767
768    intptr_t getRawBits() {
769      if (isSimple())
770        return V.SimpleTy;
771      else
772        return (intptr_t)(LLVMTy);
773    }
774
775    /// compareRawBits - A meaningless but well-behaved order, useful for
776    /// constructing containers.
777    struct compareRawBits {
778      bool operator()(EVT L, EVT R) const {
779        if (L.V.SimpleTy == R.V.SimpleTy)
780          return L.LLVMTy < R.LLVMTy;
781        else
782          return L.V.SimpleTy < R.V.SimpleTy;
783      }
784    };
785
786  private:
787    // Methods for handling the Extended-type case in functions above.
788    // These are all out-of-line to prevent users of this header file
789    // from having a dependency on Type.h.
790    EVT changeExtendedVectorElementTypeToInteger() const;
791    static EVT getExtendedIntegerVT(LLVMContext &C, unsigned BitWidth);
792    static EVT getExtendedVectorVT(LLVMContext &C, EVT VT,
793                                   unsigned NumElements);
794    bool isExtendedFloatingPoint() const;
795    bool isExtendedInteger() const;
796    bool isExtendedVector() const;
797    bool isExtended16BitVector() const;
798    bool isExtended32BitVector() const;
799    bool isExtended64BitVector() const;
800    bool isExtended128BitVector() const;
801    bool isExtended256BitVector() const;
802    bool isExtended512BitVector() const;
803    bool isExtended1024BitVector() const;
804    EVT getExtendedVectorElementType() const;
805    unsigned getExtendedVectorNumElements() const;
806    unsigned getExtendedSizeInBits() const;
807  };
808
809} // End llvm namespace
810
811#endif
812