1 //===- Support/MachineValueType.h - Machine-Level types ---------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file defines the set of machine-level target independent types which
10 // legal values in the code generator use.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_SUPPORT_MACHINEVALUETYPE_H
15 #define LLVM_SUPPORT_MACHINEVALUETYPE_H
16 
17 #include "llvm/ADT/iterator_range.h"
18 #include "llvm/Support/ErrorHandling.h"
19 #include "llvm/Support/MathExtras.h"
20 #include "llvm/Support/TypeSize.h"
21 #include <cassert>
22 
23 namespace llvm {
24 
25   class Type;
26 
27   /// Machine Value Type. Every type that is supported natively by some
28   /// processor targeted by LLVM occurs here. This means that any legal value
29   /// type can be represented by an MVT.
30   class MVT {
31   public:
32     enum SimpleValueType : uint8_t {
33       // Simple value types that aren't explicitly part of this enumeration
34       // are considered extended value types.
35       INVALID_SIMPLE_VALUE_TYPE = 0,
36 
37       // If you change this numbering, you must change the values in
38       // ValueTypes.td as well!
39       Other          =   1,   // This is a non-standard value
40       i1             =   2,   // This is a 1 bit integer value
41       i8             =   3,   // This is an 8 bit integer value
42       i16            =   4,   // This is a 16 bit integer value
43       i32            =   5,   // This is a 32 bit integer value
44       i64            =   6,   // This is a 64 bit integer value
45       i128           =   7,   // This is a 128 bit integer value
46 
47       FIRST_INTEGER_VALUETYPE = i1,
48       LAST_INTEGER_VALUETYPE  = i128,
49 
50       f16            =   8,   // This is a 16 bit floating point value
51       f32            =   9,   // This is a 32 bit floating point value
52       f64            =  10,   // This is a 64 bit floating point value
53       f80            =  11,   // This is a 80 bit floating point value
54       f128           =  12,   // This is a 128 bit floating point value
55       ppcf128        =  13,   // This is a PPC 128-bit floating point value
56 
57       FIRST_FP_VALUETYPE = f16,
58       LAST_FP_VALUETYPE  = ppcf128,
59 
60       v1i1           =  14,   //    1 x i1
61       v2i1           =  15,   //    2 x i1
62       v4i1           =  16,   //    4 x i1
63       v8i1           =  17,   //    8 x i1
64       v16i1          =  18,   //   16 x i1
65       v32i1          =  19,   //   32 x i1
66       v64i1          =  20,   //   64 x i1
67       v128i1         =  21,   //  128 x i1
68       v256i1         =  22,   //  256 x i1
69       v512i1         =  23,   //  512 x i1
70       v1024i1        =  24,   // 1024 x i1
71 
72       v1i8           =  25,   //  1 x i8
73       v2i8           =  26,   //  2 x i8
74       v4i8           =  27,   //  4 x i8
75       v8i8           =  28,   //  8 x i8
76       v16i8          =  29,   // 16 x i8
77       v32i8          =  30,   // 32 x i8
78       v64i8          =  31,   // 64 x i8
79       v128i8         =  32,   //128 x i8
80       v256i8         =  33,   //256 x i8
81 
82       v1i16          =  34,   //  1 x i16
83       v2i16          =  35,   //  2 x i16
84       v3i16          =  36,   //  3 x i16
85       v4i16          =  37,   //  4 x i16
86       v8i16          =  38,   //  8 x i16
87       v16i16         =  39,   // 16 x i16
88       v32i16         =  40,   // 32 x i16
89       v64i16         =  41,   // 64 x i16
90       v128i16        =  42,   //128 x i16
91 
92       v1i32          =  43,   //    1 x i32
93       v2i32          =  44,   //    2 x i32
94       v3i32          =  45,   //    3 x i32
95       v4i32          =  46,   //    4 x i32
96       v5i32          =  47,   //    5 x i32
97       v8i32          =  48,   //    8 x i32
98       v16i32         =  49,   //   16 x i32
99       v32i32         =  50,   //   32 x i32
100       v64i32         =  51,   //   64 x i32
101       v128i32        =  52,   //  128 x i32
102       v256i32        =  53,   //  256 x i32
103       v512i32        =  54,   //  512 x i32
104       v1024i32       =  55,   // 1024 x i32
105       v2048i32       =  56,   // 2048 x i32
106 
107       v1i64          =  57,   //  1 x i64
108       v2i64          =  58,   //  2 x i64
109       v4i64          =  59,   //  4 x i64
110       v8i64          =  60,   //  8 x i64
111       v16i64         =  61,   // 16 x i64
112       v32i64         =  62,   // 32 x i64
113 
114       v1i128         =  63,   //  1 x i128
115 
116       FIRST_INTEGER_FIXEDLEN_VECTOR_VALUETYPE = v1i1,
117       LAST_INTEGER_FIXEDLEN_VECTOR_VALUETYPE = v1i128,
118 
119       v2f16          =  64,   //    2 x f16
120       v3f16          =  65,   //    3 x f16
121       v4f16          =  66,   //    4 x f16
122       v8f16          =  67,   //    8 x f16
123       v16f16         =  68,   //   16 x f16
124       v32f16         =  69,   //   32 x f16
125       v1f32          =  70,   //    1 x f32
126       v2f32          =  71,   //    2 x f32
127       v3f32          =  72,   //    3 x f32
128       v4f32          =  73,   //    4 x f32
129       v5f32          =  74,   //    5 x f32
130       v8f32          =  75,   //    8 x f32
131       v16f32         =  76,   //   16 x f32
132       v32f32         =  77,   //   32 x f32
133       v64f32         =  78,   //   64 x f32
134       v128f32        =  79,   //  128 x f32
135       v256f32        =  80,   //  256 x f32
136       v512f32        =  81,   //  512 x f32
137       v1024f32       =  82,   // 1024 x f32
138       v2048f32       =  83,   // 2048 x f32
139       v1f64          =  84,   //    1 x f64
140       v2f64          =  85,   //    2 x f64
141       v4f64          =  86,   //    4 x f64
142       v8f64          =  87,   //    8 x f64
143 
144       FIRST_FP_FIXEDLEN_VECTOR_VALUETYPE = v2f16,
145       LAST_FP_FIXEDLEN_VECTOR_VALUETYPE = v8f64,
146 
147       FIRST_FIXEDLEN_VECTOR_VALUETYPE = v1i1,
148       LAST_FIXEDLEN_VECTOR_VALUETYPE = v8f64,
149 
150       nxv1i1         =  88,   // n x  1 x i1
151       nxv2i1         =  89,   // n x  2 x i1
152       nxv4i1         =  90,   // n x  4 x i1
153       nxv8i1         =  91,   // n x  8 x i1
154       nxv16i1        =  92,   // n x 16 x i1
155       nxv32i1        =  93,   // n x 32 x i1
156 
157       nxv1i8         =  94,   // n x  1 x i8
158       nxv2i8         =  95,   // n x  2 x i8
159       nxv4i8         =  96,   // n x  4 x i8
160       nxv8i8         =  97,   // n x  8 x i8
161       nxv16i8        =  98,   // n x 16 x i8
162       nxv32i8        =  99,   // n x 32 x i8
163 
164       nxv1i16        =  100,  // n x  1 x i16
165       nxv2i16        =  101,  // n x  2 x i16
166       nxv4i16        =  102,  // n x  4 x i16
167       nxv8i16        =  103,  // n x  8 x i16
168       nxv16i16       =  104,  // n x 16 x i16
169       nxv32i16       =  105,  // n x 32 x i16
170 
171       nxv1i32        =  106,  // n x  1 x i32
172       nxv2i32        =  107,  // n x  2 x i32
173       nxv4i32        =  108,  // n x  4 x i32
174       nxv8i32        =  109,  // n x  8 x i32
175       nxv16i32       =  110,  // n x 16 x i32
176       nxv32i32       =  111,  // n x 32 x i32
177 
178       nxv1i64        =  112,  // n x  1 x i64
179       nxv2i64        =  113,  // n x  2 x i64
180       nxv4i64        =  114,  // n x  4 x i64
181       nxv8i64        =  115,  // n x  8 x i64
182       nxv16i64       =  116,  // n x 16 x i64
183       nxv32i64       =  117,  // n x 32 x i64
184 
185       FIRST_INTEGER_SCALABLE_VECTOR_VALUETYPE = nxv1i1,
186       LAST_INTEGER_SCALABLE_VECTOR_VALUETYPE = nxv32i64,
187 
188       nxv2f16        =  118,  // n x  2 x f16
189       nxv4f16        =  119,  // n x  4 x f16
190       nxv8f16        =  120,  // n x  8 x f16
191       nxv1f32        =  121,  // n x  1 x f32
192       nxv2f32        =  122,  // n x  2 x f32
193       nxv4f32        =  123,  // n x  4 x f32
194       nxv8f32        =  124,  // n x  8 x f32
195       nxv16f32       =  125,  // n x 16 x f32
196       nxv1f64        =  126,  // n x  1 x f64
197       nxv2f64        =  127,  // n x  2 x f64
198       nxv4f64        =  128,  // n x  4 x f64
199       nxv8f64        =  129,  // n x  8 x f64
200 
201       FIRST_FP_SCALABLE_VECTOR_VALUETYPE = nxv2f16,
202       LAST_FP_SCALABLE_VECTOR_VALUETYPE = nxv8f64,
203 
204       FIRST_SCALABLE_VECTOR_VALUETYPE = nxv1i1,
205       LAST_SCALABLE_VECTOR_VALUETYPE = nxv8f64,
206 
207       FIRST_VECTOR_VALUETYPE = v1i1,
208       LAST_VECTOR_VALUETYPE  = nxv8f64,
209 
210       x86mmx         =  130,   // This is an X86 MMX value
211 
212       Glue           =  131,   // This glues nodes together during pre-RA sched
213 
214       isVoid         =  132,   // This has no value
215 
216       Untyped        =  133,   // This value takes a register, but has
217                                // unspecified type.  The register class
218                                // will be determined by the opcode.
219 
220       exnref         =  134,   // WebAssembly's exnref type
221 
222       FIRST_VALUETYPE = 1,     // This is always the beginning of the list.
223       LAST_VALUETYPE =  135,   // This always remains at the end of the list.
224 
225       // This is the current maximum for LAST_VALUETYPE.
226       // MVT::MAX_ALLOWED_VALUETYPE is used for asserts and to size bit vectors
227       // This value must be a multiple of 32.
228       MAX_ALLOWED_VALUETYPE = 160,
229 
230       // A value of type llvm::TokenTy
231       token          = 248,
232 
233       // This is MDNode or MDString.
234       Metadata       = 249,
235 
236       // An int value the size of the pointer of the current
237       // target to any address space. This must only be used internal to
238       // tblgen. Other than for overloading, we treat iPTRAny the same as iPTR.
239       iPTRAny        = 250,
240 
241       // A vector with any length and element size. This is used
242       // for intrinsics that have overloadings based on vector types.
243       // This is only for tblgen's consumption!
244       vAny           = 251,
245 
246       // Any floating-point or vector floating-point value. This is used
247       // for intrinsics that have overloadings based on floating-point types.
248       // This is only for tblgen's consumption!
249       fAny           = 252,
250 
251       // An integer or vector integer value of any bit width. This is
252       // used for intrinsics that have overloadings based on integer bit widths.
253       // This is only for tblgen's consumption!
254       iAny           = 253,
255 
256       // An int value the size of the pointer of the current
257       // target.  This should only be used internal to tblgen!
258       iPTR           = 254,
259 
260       // Any type. This is used for intrinsics that have overloadings.
261       // This is only for tblgen's consumption!
262       Any            = 255
263     };
264 
265     SimpleValueType SimpleTy = INVALID_SIMPLE_VALUE_TYPE;
266 
267     constexpr MVT() = default;
MVT(SimpleValueType SVT)268     constexpr MVT(SimpleValueType SVT) : SimpleTy(SVT) {}
269 
270     bool operator>(const MVT& S)  const { return SimpleTy >  S.SimpleTy; }
271     bool operator<(const MVT& S)  const { return SimpleTy <  S.SimpleTy; }
272     bool operator==(const MVT& S) const { return SimpleTy == S.SimpleTy; }
273     bool operator!=(const MVT& S) const { return SimpleTy != S.SimpleTy; }
274     bool operator>=(const MVT& S) const { return SimpleTy >= S.SimpleTy; }
275     bool operator<=(const MVT& S) const { return SimpleTy <= S.SimpleTy; }
276 
277     /// Return true if this is a valid simple valuetype.
isValid()278     bool isValid() const {
279       return (SimpleTy >= MVT::FIRST_VALUETYPE &&
280               SimpleTy < MVT::LAST_VALUETYPE);
281     }
282 
283     /// Return true if this is a FP or a vector FP type.
isFloatingPoint()284     bool isFloatingPoint() const {
285       return ((SimpleTy >= MVT::FIRST_FP_VALUETYPE &&
286                SimpleTy <= MVT::LAST_FP_VALUETYPE) ||
287               (SimpleTy >= MVT::FIRST_FP_FIXEDLEN_VECTOR_VALUETYPE &&
288                SimpleTy <= MVT::LAST_FP_FIXEDLEN_VECTOR_VALUETYPE) ||
289               (SimpleTy >= MVT::FIRST_FP_SCALABLE_VECTOR_VALUETYPE &&
290                SimpleTy <= MVT::LAST_FP_SCALABLE_VECTOR_VALUETYPE));
291     }
292 
293     /// Return true if this is an integer or a vector integer type.
isInteger()294     bool isInteger() const {
295       return ((SimpleTy >= MVT::FIRST_INTEGER_VALUETYPE &&
296                SimpleTy <= MVT::LAST_INTEGER_VALUETYPE) ||
297               (SimpleTy >= MVT::FIRST_INTEGER_FIXEDLEN_VECTOR_VALUETYPE &&
298                SimpleTy <= MVT::LAST_INTEGER_FIXEDLEN_VECTOR_VALUETYPE) ||
299               (SimpleTy >= MVT::FIRST_INTEGER_SCALABLE_VECTOR_VALUETYPE &&
300                SimpleTy <= MVT::LAST_INTEGER_SCALABLE_VECTOR_VALUETYPE));
301     }
302 
303     /// Return true if this is an integer, not including vectors.
isScalarInteger()304     bool isScalarInteger() const {
305       return (SimpleTy >= MVT::FIRST_INTEGER_VALUETYPE &&
306               SimpleTy <= MVT::LAST_INTEGER_VALUETYPE);
307     }
308 
309     /// Return true if this is a vector value type.
isVector()310     bool isVector() const {
311       return (SimpleTy >= MVT::FIRST_VECTOR_VALUETYPE &&
312               SimpleTy <= MVT::LAST_VECTOR_VALUETYPE);
313     }
314 
315     /// Return true if this is a vector value type where the
316     /// runtime length is machine dependent
isScalableVector()317     bool isScalableVector() const {
318       return (SimpleTy >= MVT::FIRST_SCALABLE_VECTOR_VALUETYPE &&
319               SimpleTy <= MVT::LAST_SCALABLE_VECTOR_VALUETYPE);
320     }
321 
isFixedLengthVector()322     bool isFixedLengthVector() const {
323       return (SimpleTy >= MVT::FIRST_FIXEDLEN_VECTOR_VALUETYPE &&
324               SimpleTy <= MVT::LAST_FIXEDLEN_VECTOR_VALUETYPE);
325     }
326 
327     /// Return true if this is a 16-bit vector type.
is16BitVector()328     bool is16BitVector() const {
329       return (SimpleTy == MVT::v2i8  || SimpleTy == MVT::v1i16 ||
330               SimpleTy == MVT::v16i1);
331     }
332 
333     /// Return true if this is a 32-bit vector type.
is32BitVector()334     bool is32BitVector() const {
335       return (SimpleTy == MVT::v32i1 || SimpleTy == MVT::v4i8  ||
336               SimpleTy == MVT::v2i16 || SimpleTy == MVT::v1i32 ||
337               SimpleTy == MVT::v2f16 || SimpleTy == MVT::v1f32);
338     }
339 
340     /// Return true if this is a 64-bit vector type.
is64BitVector()341     bool is64BitVector() const {
342       return (SimpleTy == MVT::v64i1 || SimpleTy == MVT::v8i8  ||
343               SimpleTy == MVT::v4i16 || SimpleTy == MVT::v2i32 ||
344               SimpleTy == MVT::v1i64 || SimpleTy == MVT::v4f16 ||
345               SimpleTy == MVT::v2f32 || SimpleTy == MVT::v1f64);
346     }
347 
348     /// Return true if this is a 128-bit vector type.
is128BitVector()349     bool is128BitVector() const {
350       return (SimpleTy == MVT::v128i1 || SimpleTy == MVT::v16i8  ||
351               SimpleTy == MVT::v8i16  || SimpleTy == MVT::v4i32  ||
352               SimpleTy == MVT::v2i64  || SimpleTy == MVT::v1i128 ||
353               SimpleTy == MVT::v8f16  || SimpleTy == MVT::v4f32  ||
354               SimpleTy == MVT::v2f64);
355     }
356 
357     /// Return true if this is a 256-bit vector type.
is256BitVector()358     bool is256BitVector() const {
359       return (SimpleTy == MVT::v16f16 || SimpleTy == MVT::v8f32 ||
360               SimpleTy == MVT::v4f64  || SimpleTy == MVT::v32i8 ||
361               SimpleTy == MVT::v16i16 || SimpleTy == MVT::v8i32 ||
362               SimpleTy == MVT::v4i64  || SimpleTy == MVT::v256i1);
363     }
364 
365     /// Return true if this is a 512-bit vector type.
is512BitVector()366     bool is512BitVector() const {
367       return (SimpleTy == MVT::v32f16 || SimpleTy == MVT::v16f32 ||
368               SimpleTy == MVT::v8f64  || SimpleTy == MVT::v512i1 ||
369               SimpleTy == MVT::v64i8  || SimpleTy == MVT::v32i16 ||
370               SimpleTy == MVT::v16i32 || SimpleTy == MVT::v8i64);
371     }
372 
373     /// Return true if this is a 1024-bit vector type.
is1024BitVector()374     bool is1024BitVector() const {
375       return (SimpleTy == MVT::v1024i1 || SimpleTy == MVT::v128i8 ||
376               SimpleTy == MVT::v64i16  || SimpleTy == MVT::v32i32 ||
377               SimpleTy == MVT::v16i64);
378     }
379 
380     /// Return true if this is a 2048-bit vector type.
is2048BitVector()381     bool is2048BitVector() const {
382       return (SimpleTy == MVT::v256i8 || SimpleTy == MVT::v128i16 ||
383               SimpleTy == MVT::v64i32 || SimpleTy == MVT::v32i64);
384     }
385 
386     /// Return true if this is an overloaded type for TableGen.
isOverloaded()387     bool isOverloaded() const {
388       return (SimpleTy==MVT::Any  ||
389               SimpleTy==MVT::iAny || SimpleTy==MVT::fAny ||
390               SimpleTy==MVT::vAny || SimpleTy==MVT::iPTRAny);
391     }
392 
393     /// Return a VT for a vector type with the same element type but
394     /// half the number of elements.
getHalfNumVectorElementsVT()395     MVT getHalfNumVectorElementsVT() const {
396       MVT EltVT = getVectorElementType();
397       auto EltCnt = getVectorElementCount();
398       assert(!(EltCnt.Min & 1) && "Splitting vector, but not in half!");
399       return getVectorVT(EltVT, EltCnt / 2);
400     }
401 
402     /// Returns true if the given vector is a power of 2.
isPow2VectorType()403     bool isPow2VectorType() const {
404       unsigned NElts = getVectorNumElements();
405       return !(NElts & (NElts - 1));
406     }
407 
408     /// Widens the length of the given vector MVT up to the nearest power of 2
409     /// and returns that type.
getPow2VectorType()410     MVT getPow2VectorType() const {
411       if (isPow2VectorType())
412         return *this;
413 
414       unsigned NElts = getVectorNumElements();
415       unsigned Pow2NElts = 1 << Log2_32_Ceil(NElts);
416       return MVT::getVectorVT(getVectorElementType(), Pow2NElts);
417     }
418 
419     /// If this is a vector, return the element type, otherwise return this.
getScalarType()420     MVT getScalarType() const {
421       return isVector() ? getVectorElementType() : *this;
422     }
423 
getVectorElementType()424     MVT getVectorElementType() const {
425       switch (SimpleTy) {
426       default:
427         llvm_unreachable("Not a vector MVT!");
428       case v1i1:
429       case v2i1:
430       case v4i1:
431       case v8i1:
432       case v16i1:
433       case v32i1:
434       case v64i1:
435       case v128i1:
436       case v256i1:
437       case v512i1:
438       case v1024i1:
439       case nxv1i1:
440       case nxv2i1:
441       case nxv4i1:
442       case nxv8i1:
443       case nxv16i1:
444       case nxv32i1: return i1;
445       case v1i8:
446       case v2i8:
447       case v4i8:
448       case v8i8:
449       case v16i8:
450       case v32i8:
451       case v64i8:
452       case v128i8:
453       case v256i8:
454       case nxv1i8:
455       case nxv2i8:
456       case nxv4i8:
457       case nxv8i8:
458       case nxv16i8:
459       case nxv32i8: return i8;
460       case v1i16:
461       case v2i16:
462       case v3i16:
463       case v4i16:
464       case v8i16:
465       case v16i16:
466       case v32i16:
467       case v64i16:
468       case v128i16:
469       case nxv1i16:
470       case nxv2i16:
471       case nxv4i16:
472       case nxv8i16:
473       case nxv16i16:
474       case nxv32i16: return i16;
475       case v1i32:
476       case v2i32:
477       case v3i32:
478       case v4i32:
479       case v5i32:
480       case v8i32:
481       case v16i32:
482       case v32i32:
483       case v64i32:
484       case v128i32:
485       case v256i32:
486       case v512i32:
487       case v1024i32:
488       case v2048i32:
489       case nxv1i32:
490       case nxv2i32:
491       case nxv4i32:
492       case nxv8i32:
493       case nxv16i32:
494       case nxv32i32: return i32;
495       case v1i64:
496       case v2i64:
497       case v4i64:
498       case v8i64:
499       case v16i64:
500       case v32i64:
501       case nxv1i64:
502       case nxv2i64:
503       case nxv4i64:
504       case nxv8i64:
505       case nxv16i64:
506       case nxv32i64: return i64;
507       case v1i128: return i128;
508       case v2f16:
509       case v3f16:
510       case v4f16:
511       case v8f16:
512       case v16f16:
513       case v32f16:
514       case nxv2f16:
515       case nxv4f16:
516       case nxv8f16: return f16;
517       case v1f32:
518       case v2f32:
519       case v3f32:
520       case v4f32:
521       case v5f32:
522       case v8f32:
523       case v16f32:
524       case v32f32:
525       case v64f32:
526       case v128f32:
527       case v256f32:
528       case v512f32:
529       case v1024f32:
530       case v2048f32:
531       case nxv1f32:
532       case nxv2f32:
533       case nxv4f32:
534       case nxv8f32:
535       case nxv16f32: return f32;
536       case v1f64:
537       case v2f64:
538       case v4f64:
539       case v8f64:
540       case nxv1f64:
541       case nxv2f64:
542       case nxv4f64:
543       case nxv8f64: return f64;
544       }
545     }
546 
getVectorNumElements()547     unsigned getVectorNumElements() const {
548       switch (SimpleTy) {
549       default:
550         llvm_unreachable("Not a vector MVT!");
551       case v2048i32:
552       case v2048f32: return 2048;
553       case v1024i1:
554       case v1024i32:
555       case v1024f32: return 1024;
556       case v512i1:
557       case v512i32:
558       case v512f32: return 512;
559       case v256i1:
560       case v256i8:
561       case v256i32:
562       case v256f32: return 256;
563       case v128i1:
564       case v128i8:
565       case v128i16:
566       case v128i32:
567       case v128f32: return 128;
568       case v64i1:
569       case v64i8:
570       case v64i16:
571       case v64i32:
572       case v64f32: return 64;
573       case v32i1:
574       case v32i8:
575       case v32i16:
576       case v32i32:
577       case v32i64:
578       case v32f16:
579       case v32f32:
580       case nxv32i1:
581       case nxv32i8:
582       case nxv32i16:
583       case nxv32i32:
584       case nxv32i64: return 32;
585       case v16i1:
586       case v16i8:
587       case v16i16:
588       case v16i32:
589       case v16i64:
590       case v16f16:
591       case v16f32:
592       case nxv16i1:
593       case nxv16i8:
594       case nxv16i16:
595       case nxv16i32:
596       case nxv16i64:
597       case nxv16f32: return 16;
598       case v8i1:
599       case v8i8:
600       case v8i16:
601       case v8i32:
602       case v8i64:
603       case v8f16:
604       case v8f32:
605       case v8f64:
606       case nxv8i1:
607       case nxv8i8:
608       case nxv8i16:
609       case nxv8i32:
610       case nxv8i64:
611       case nxv8f16:
612       case nxv8f32:
613       case nxv8f64: return 8;
614       case v5i32:
615       case v5f32: return 5;
616       case v4i1:
617       case v4i8:
618       case v4i16:
619       case v4i32:
620       case v4i64:
621       case v4f16:
622       case v4f32:
623       case v4f64:
624       case nxv4i1:
625       case nxv4i8:
626       case nxv4i16:
627       case nxv4i32:
628       case nxv4i64:
629       case nxv4f16:
630       case nxv4f32:
631       case nxv4f64: return 4;
632       case v3i16:
633       case v3i32:
634       case v3f16:
635       case v3f32: return 3;
636       case v2i1:
637       case v2i8:
638       case v2i16:
639       case v2i32:
640       case v2i64:
641       case v2f16:
642       case v2f32:
643       case v2f64:
644       case nxv2i1:
645       case nxv2i8:
646       case nxv2i16:
647       case nxv2i32:
648       case nxv2i64:
649       case nxv2f16:
650       case nxv2f32:
651       case nxv2f64: return 2;
652       case v1i1:
653       case v1i8:
654       case v1i16:
655       case v1i32:
656       case v1i64:
657       case v1i128:
658       case v1f32:
659       case v1f64:
660       case nxv1i1:
661       case nxv1i8:
662       case nxv1i16:
663       case nxv1i32:
664       case nxv1i64:
665       case nxv1f32:
666       case nxv1f64: return 1;
667       }
668     }
669 
getVectorElementCount()670     ElementCount getVectorElementCount() const {
671       return { getVectorNumElements(), isScalableVector() };
672     }
673 
674     /// Returns the size of the specified MVT in bits.
675     ///
676     /// If the value type is a scalable vector type, the scalable property will
677     /// be set and the runtime size will be a positive integer multiple of the
678     /// base size.
getSizeInBits()679     TypeSize getSizeInBits() const {
680       switch (SimpleTy) {
681       default:
682         llvm_unreachable("getSizeInBits called on extended MVT.");
683       case Other:
684         llvm_unreachable("Value type is non-standard value, Other.");
685       case iPTR:
686         llvm_unreachable("Value type size is target-dependent. Ask TLI.");
687       case iPTRAny:
688       case iAny:
689       case fAny:
690       case vAny:
691       case Any:
692         llvm_unreachable("Value type is overloaded.");
693       case token:
694         llvm_unreachable("Token type is a sentinel that cannot be used "
695                          "in codegen and has no size");
696       case Metadata:
697         llvm_unreachable("Value type is metadata.");
698       case i1:
699       case v1i1: return TypeSize::Fixed(1);
700       case nxv1i1: return TypeSize::Scalable(1);
701       case v2i1: return TypeSize::Fixed(2);
702       case nxv2i1: return TypeSize::Scalable(2);
703       case v4i1: return TypeSize::Fixed(4);
704       case nxv4i1: return TypeSize::Scalable(4);
705       case i8  :
706       case v1i8:
707       case v8i1: return TypeSize::Fixed(8);
708       case nxv1i8:
709       case nxv8i1: return TypeSize::Scalable(8);
710       case i16 :
711       case f16:
712       case v16i1:
713       case v2i8:
714       case v1i16: return TypeSize::Fixed(16);
715       case nxv16i1:
716       case nxv2i8:
717       case nxv1i16: return TypeSize::Scalable(16);
718       case f32 :
719       case i32 :
720       case v32i1:
721       case v4i8:
722       case v2i16:
723       case v2f16:
724       case v1f32:
725       case v1i32: return TypeSize::Fixed(32);
726       case nxv32i1:
727       case nxv4i8:
728       case nxv2i16:
729       case nxv1i32:
730       case nxv2f16:
731       case nxv1f32: return TypeSize::Scalable(32);
732       case v3i16:
733       case v3f16: return TypeSize::Fixed(48);
734       case x86mmx:
735       case f64 :
736       case i64 :
737       case v64i1:
738       case v8i8:
739       case v4i16:
740       case v2i32:
741       case v1i64:
742       case v4f16:
743       case v2f32:
744       case v1f64: return TypeSize::Fixed(64);
745       case nxv8i8:
746       case nxv4i16:
747       case nxv2i32:
748       case nxv1i64:
749       case nxv4f16:
750       case nxv2f32:
751       case nxv1f64: return TypeSize::Scalable(64);
752       case f80 :  return TypeSize::Fixed(80);
753       case v3i32:
754       case v3f32: return TypeSize::Fixed(96);
755       case f128:
756       case ppcf128:
757       case i128:
758       case v128i1:
759       case v16i8:
760       case v8i16:
761       case v4i32:
762       case v2i64:
763       case v1i128:
764       case v8f16:
765       case v4f32:
766       case v2f64: return TypeSize::Fixed(128);
767       case nxv16i8:
768       case nxv8i16:
769       case nxv4i32:
770       case nxv2i64:
771       case nxv8f16:
772       case nxv4f32:
773       case nxv2f64: return TypeSize::Scalable(128);
774       case v5i32:
775       case v5f32: return TypeSize::Fixed(160);
776       case v256i1:
777       case v32i8:
778       case v16i16:
779       case v8i32:
780       case v4i64:
781       case v16f16:
782       case v8f32:
783       case v4f64: return TypeSize::Fixed(256);
784       case nxv32i8:
785       case nxv16i16:
786       case nxv8i32:
787       case nxv4i64:
788       case nxv8f32:
789       case nxv4f64: return TypeSize::Scalable(256);
790       case v512i1:
791       case v64i8:
792       case v32i16:
793       case v16i32:
794       case v8i64:
795       case v32f16:
796       case v16f32:
797       case v8f64: return TypeSize::Fixed(512);
798       case nxv32i16:
799       case nxv16i32:
800       case nxv8i64:
801       case nxv16f32:
802       case nxv8f64: return TypeSize::Scalable(512);
803       case v1024i1:
804       case v128i8:
805       case v64i16:
806       case v32i32:
807       case v16i64:
808       case v32f32: return TypeSize::Fixed(1024);
809       case nxv32i32:
810       case nxv16i64: return TypeSize::Scalable(1024);
811       case v256i8:
812       case v128i16:
813       case v64i32:
814       case v32i64:
815       case v64f32: return TypeSize::Fixed(2048);
816       case nxv32i64: return TypeSize::Scalable(2048);
817       case v128i32:
818       case v128f32:  return TypeSize::Fixed(4096);
819       case v256i32:
820       case v256f32:  return TypeSize::Fixed(8192);
821       case v512i32:
822       case v512f32:  return TypeSize::Fixed(16384);
823       case v1024i32:
824       case v1024f32:  return TypeSize::Fixed(32768);
825       case v2048i32:
826       case v2048f32:  return TypeSize::Fixed(65536);
827       case exnref: return TypeSize::Fixed(0); // opaque type
828       }
829     }
830 
getScalarSizeInBits()831     TypeSize getScalarSizeInBits() const {
832       return getScalarType().getSizeInBits();
833     }
834 
835     /// Return the number of bytes overwritten by a store of the specified value
836     /// type.
837     ///
838     /// If the value type is a scalable vector type, the scalable property will
839     /// be set and the runtime size will be a positive integer multiple of the
840     /// base size.
getStoreSize()841     TypeSize getStoreSize() const {
842       TypeSize BaseSize = getSizeInBits();
843       return {(BaseSize.getKnownMinSize() + 7) / 8, BaseSize.isScalable()};
844     }
845 
846     /// Return the number of bits overwritten by a store of the specified value
847     /// type.
848     ///
849     /// If the value type is a scalable vector type, the scalable property will
850     /// be set and the runtime size will be a positive integer multiple of the
851     /// base size.
getStoreSizeInBits()852     TypeSize getStoreSizeInBits() const {
853       return getStoreSize() * 8;
854     }
855 
856     /// Returns true if the number of bits for the type is a multiple of an
857     /// 8-bit byte.
isByteSized()858     bool isByteSized() const {
859       return getSizeInBits().isByteSized();
860     }
861 
862     /// Return true if this has more bits than VT.
bitsGT(MVT VT)863     bool bitsGT(MVT VT) const {
864       return getSizeInBits() > VT.getSizeInBits();
865     }
866 
867     /// Return true if this has no less bits than VT.
bitsGE(MVT VT)868     bool bitsGE(MVT VT) const {
869       return getSizeInBits() >= VT.getSizeInBits();
870     }
871 
872     /// Return true if this has less bits than VT.
bitsLT(MVT VT)873     bool bitsLT(MVT VT) const {
874       return getSizeInBits() < VT.getSizeInBits();
875     }
876 
877     /// Return true if this has no more bits than VT.
bitsLE(MVT VT)878     bool bitsLE(MVT VT) const {
879       return getSizeInBits() <= VT.getSizeInBits();
880     }
881 
getFloatingPointVT(unsigned BitWidth)882     static MVT getFloatingPointVT(unsigned BitWidth) {
883       switch (BitWidth) {
884       default:
885         llvm_unreachable("Bad bit width!");
886       case 16:
887         return MVT::f16;
888       case 32:
889         return MVT::f32;
890       case 64:
891         return MVT::f64;
892       case 80:
893         return MVT::f80;
894       case 128:
895         return MVT::f128;
896       }
897     }
898 
getIntegerVT(unsigned BitWidth)899     static MVT getIntegerVT(unsigned BitWidth) {
900       switch (BitWidth) {
901       default:
902         return (MVT::SimpleValueType)(MVT::INVALID_SIMPLE_VALUE_TYPE);
903       case 1:
904         return MVT::i1;
905       case 8:
906         return MVT::i8;
907       case 16:
908         return MVT::i16;
909       case 32:
910         return MVT::i32;
911       case 64:
912         return MVT::i64;
913       case 128:
914         return MVT::i128;
915       }
916     }
917 
getVectorVT(MVT VT,unsigned NumElements)918     static MVT getVectorVT(MVT VT, unsigned NumElements) {
919       switch (VT.SimpleTy) {
920       default:
921         break;
922       case MVT::i1:
923         if (NumElements == 1)    return MVT::v1i1;
924         if (NumElements == 2)    return MVT::v2i1;
925         if (NumElements == 4)    return MVT::v4i1;
926         if (NumElements == 8)    return MVT::v8i1;
927         if (NumElements == 16)   return MVT::v16i1;
928         if (NumElements == 32)   return MVT::v32i1;
929         if (NumElements == 64)   return MVT::v64i1;
930         if (NumElements == 128)  return MVT::v128i1;
931         if (NumElements == 256)  return MVT::v256i1;
932         if (NumElements == 512)  return MVT::v512i1;
933         if (NumElements == 1024) return MVT::v1024i1;
934         break;
935       case MVT::i8:
936         if (NumElements == 1)   return MVT::v1i8;
937         if (NumElements == 2)   return MVT::v2i8;
938         if (NumElements == 4)   return MVT::v4i8;
939         if (NumElements == 8)   return MVT::v8i8;
940         if (NumElements == 16)  return MVT::v16i8;
941         if (NumElements == 32)  return MVT::v32i8;
942         if (NumElements == 64)  return MVT::v64i8;
943         if (NumElements == 128) return MVT::v128i8;
944         if (NumElements == 256) return MVT::v256i8;
945         break;
946       case MVT::i16:
947         if (NumElements == 1)   return MVT::v1i16;
948         if (NumElements == 2)   return MVT::v2i16;
949         if (NumElements == 3)   return MVT::v3i16;
950         if (NumElements == 4)   return MVT::v4i16;
951         if (NumElements == 8)   return MVT::v8i16;
952         if (NumElements == 16)  return MVT::v16i16;
953         if (NumElements == 32)  return MVT::v32i16;
954         if (NumElements == 64)  return MVT::v64i16;
955         if (NumElements == 128) return MVT::v128i16;
956         break;
957       case MVT::i32:
958         if (NumElements == 1)    return MVT::v1i32;
959         if (NumElements == 2)    return MVT::v2i32;
960         if (NumElements == 3)    return MVT::v3i32;
961         if (NumElements == 4)    return MVT::v4i32;
962         if (NumElements == 5)    return MVT::v5i32;
963         if (NumElements == 8)    return MVT::v8i32;
964         if (NumElements == 16)   return MVT::v16i32;
965         if (NumElements == 32)   return MVT::v32i32;
966         if (NumElements == 64)   return MVT::v64i32;
967         if (NumElements == 128)  return MVT::v128i32;
968         if (NumElements == 256)  return MVT::v256i32;
969         if (NumElements == 512)  return MVT::v512i32;
970         if (NumElements == 1024) return MVT::v1024i32;
971         if (NumElements == 2048) return MVT::v2048i32;
972         break;
973       case MVT::i64:
974         if (NumElements == 1)  return MVT::v1i64;
975         if (NumElements == 2)  return MVT::v2i64;
976         if (NumElements == 4)  return MVT::v4i64;
977         if (NumElements == 8)  return MVT::v8i64;
978         if (NumElements == 16) return MVT::v16i64;
979         if (NumElements == 32) return MVT::v32i64;
980         break;
981       case MVT::i128:
982         if (NumElements == 1)  return MVT::v1i128;
983         break;
984       case MVT::f16:
985         if (NumElements == 2)  return MVT::v2f16;
986         if (NumElements == 3)  return MVT::v3f16;
987         if (NumElements == 4)  return MVT::v4f16;
988         if (NumElements == 8)  return MVT::v8f16;
989         if (NumElements == 16) return MVT::v16f16;
990         if (NumElements == 32) return MVT::v32f16;
991         break;
992       case MVT::f32:
993         if (NumElements == 1)    return MVT::v1f32;
994         if (NumElements == 2)    return MVT::v2f32;
995         if (NumElements == 3)    return MVT::v3f32;
996         if (NumElements == 4)    return MVT::v4f32;
997         if (NumElements == 5)    return MVT::v5f32;
998         if (NumElements == 8)    return MVT::v8f32;
999         if (NumElements == 16)   return MVT::v16f32;
1000         if (NumElements == 32)   return MVT::v32f32;
1001         if (NumElements == 64)   return MVT::v64f32;
1002         if (NumElements == 128)  return MVT::v128f32;
1003         if (NumElements == 256)  return MVT::v256f32;
1004         if (NumElements == 512)  return MVT::v512f32;
1005         if (NumElements == 1024) return MVT::v1024f32;
1006         if (NumElements == 2048) return MVT::v2048f32;
1007         break;
1008       case MVT::f64:
1009         if (NumElements == 1)  return MVT::v1f64;
1010         if (NumElements == 2)  return MVT::v2f64;
1011         if (NumElements == 4)  return MVT::v4f64;
1012         if (NumElements == 8)  return MVT::v8f64;
1013         break;
1014       }
1015       return (MVT::SimpleValueType)(MVT::INVALID_SIMPLE_VALUE_TYPE);
1016     }
1017 
getScalableVectorVT(MVT VT,unsigned NumElements)1018     static MVT getScalableVectorVT(MVT VT, unsigned NumElements) {
1019       switch(VT.SimpleTy) {
1020         default:
1021           break;
1022         case MVT::i1:
1023           if (NumElements == 1)  return MVT::nxv1i1;
1024           if (NumElements == 2)  return MVT::nxv2i1;
1025           if (NumElements == 4)  return MVT::nxv4i1;
1026           if (NumElements == 8)  return MVT::nxv8i1;
1027           if (NumElements == 16) return MVT::nxv16i1;
1028           if (NumElements == 32) return MVT::nxv32i1;
1029           break;
1030         case MVT::i8:
1031           if (NumElements == 1)  return MVT::nxv1i8;
1032           if (NumElements == 2)  return MVT::nxv2i8;
1033           if (NumElements == 4)  return MVT::nxv4i8;
1034           if (NumElements == 8)  return MVT::nxv8i8;
1035           if (NumElements == 16) return MVT::nxv16i8;
1036           if (NumElements == 32) return MVT::nxv32i8;
1037           break;
1038         case MVT::i16:
1039           if (NumElements == 1)  return MVT::nxv1i16;
1040           if (NumElements == 2)  return MVT::nxv2i16;
1041           if (NumElements == 4)  return MVT::nxv4i16;
1042           if (NumElements == 8)  return MVT::nxv8i16;
1043           if (NumElements == 16) return MVT::nxv16i16;
1044           if (NumElements == 32) return MVT::nxv32i16;
1045           break;
1046         case MVT::i32:
1047           if (NumElements == 1)  return MVT::nxv1i32;
1048           if (NumElements == 2)  return MVT::nxv2i32;
1049           if (NumElements == 4)  return MVT::nxv4i32;
1050           if (NumElements == 8)  return MVT::nxv8i32;
1051           if (NumElements == 16) return MVT::nxv16i32;
1052           if (NumElements == 32) return MVT::nxv32i32;
1053           break;
1054         case MVT::i64:
1055           if (NumElements == 1)  return MVT::nxv1i64;
1056           if (NumElements == 2)  return MVT::nxv2i64;
1057           if (NumElements == 4)  return MVT::nxv4i64;
1058           if (NumElements == 8)  return MVT::nxv8i64;
1059           if (NumElements == 16) return MVT::nxv16i64;
1060           if (NumElements == 32) return MVT::nxv32i64;
1061           break;
1062         case MVT::f16:
1063           if (NumElements == 2)  return MVT::nxv2f16;
1064           if (NumElements == 4)  return MVT::nxv4f16;
1065           if (NumElements == 8)  return MVT::nxv8f16;
1066           break;
1067         case MVT::f32:
1068           if (NumElements == 1)  return MVT::nxv1f32;
1069           if (NumElements == 2)  return MVT::nxv2f32;
1070           if (NumElements == 4)  return MVT::nxv4f32;
1071           if (NumElements == 8)  return MVT::nxv8f32;
1072           if (NumElements == 16) return MVT::nxv16f32;
1073           break;
1074         case MVT::f64:
1075           if (NumElements == 1)  return MVT::nxv1f64;
1076           if (NumElements == 2)  return MVT::nxv2f64;
1077           if (NumElements == 4)  return MVT::nxv4f64;
1078           if (NumElements == 8)  return MVT::nxv8f64;
1079           break;
1080       }
1081       return (MVT::SimpleValueType)(MVT::INVALID_SIMPLE_VALUE_TYPE);
1082     }
1083 
getVectorVT(MVT VT,unsigned NumElements,bool IsScalable)1084     static MVT getVectorVT(MVT VT, unsigned NumElements, bool IsScalable) {
1085       if (IsScalable)
1086         return getScalableVectorVT(VT, NumElements);
1087       return getVectorVT(VT, NumElements);
1088     }
1089 
getVectorVT(MVT VT,ElementCount EC)1090     static MVT getVectorVT(MVT VT, ElementCount EC) {
1091       if (EC.Scalable)
1092         return getScalableVectorVT(VT, EC.Min);
1093       return getVectorVT(VT, EC.Min);
1094     }
1095 
1096     /// Return the value type corresponding to the specified type.  This returns
1097     /// all pointers as iPTR.  If HandleUnknown is true, unknown types are
1098     /// returned as Other, otherwise they are invalid.
1099     static MVT getVT(Type *Ty, bool HandleUnknown = false);
1100 
1101   private:
1102     /// A simple iterator over the MVT::SimpleValueType enum.
1103     struct mvt_iterator {
1104       SimpleValueType VT;
1105 
mvt_iteratormvt_iterator1106       mvt_iterator(SimpleValueType VT) : VT(VT) {}
1107 
1108       MVT operator*() const { return VT; }
1109       bool operator!=(const mvt_iterator &LHS) const { return VT != LHS.VT; }
1110 
1111       mvt_iterator& operator++() {
1112         VT = (MVT::SimpleValueType)((int)VT + 1);
1113         assert((int)VT <= MVT::MAX_ALLOWED_VALUETYPE &&
1114                "MVT iterator overflowed.");
1115         return *this;
1116       }
1117     };
1118 
1119     /// A range of the MVT::SimpleValueType enum.
1120     using mvt_range = iterator_range<mvt_iterator>;
1121 
1122   public:
1123     /// SimpleValueType Iteration
1124     /// @{
all_valuetypes()1125     static mvt_range all_valuetypes() {
1126       return mvt_range(MVT::FIRST_VALUETYPE, MVT::LAST_VALUETYPE);
1127     }
1128 
integer_valuetypes()1129     static mvt_range integer_valuetypes() {
1130       return mvt_range(MVT::FIRST_INTEGER_VALUETYPE,
1131                        (MVT::SimpleValueType)(MVT::LAST_INTEGER_VALUETYPE + 1));
1132     }
1133 
fp_valuetypes()1134     static mvt_range fp_valuetypes() {
1135       return mvt_range(MVT::FIRST_FP_VALUETYPE,
1136                        (MVT::SimpleValueType)(MVT::LAST_FP_VALUETYPE + 1));
1137     }
1138 
vector_valuetypes()1139     static mvt_range vector_valuetypes() {
1140       return mvt_range(MVT::FIRST_VECTOR_VALUETYPE,
1141                        (MVT::SimpleValueType)(MVT::LAST_VECTOR_VALUETYPE + 1));
1142     }
1143 
fixedlen_vector_valuetypes()1144     static mvt_range fixedlen_vector_valuetypes() {
1145       return mvt_range(
1146                MVT::FIRST_FIXEDLEN_VECTOR_VALUETYPE,
1147                (MVT::SimpleValueType)(MVT::LAST_FIXEDLEN_VECTOR_VALUETYPE + 1));
1148     }
1149 
scalable_vector_valuetypes()1150     static mvt_range scalable_vector_valuetypes() {
1151       return mvt_range(
1152                MVT::FIRST_SCALABLE_VECTOR_VALUETYPE,
1153                (MVT::SimpleValueType)(MVT::LAST_SCALABLE_VECTOR_VALUETYPE + 1));
1154     }
1155 
integer_fixedlen_vector_valuetypes()1156     static mvt_range integer_fixedlen_vector_valuetypes() {
1157       return mvt_range(
1158        MVT::FIRST_INTEGER_FIXEDLEN_VECTOR_VALUETYPE,
1159        (MVT::SimpleValueType)(MVT::LAST_INTEGER_FIXEDLEN_VECTOR_VALUETYPE + 1));
1160     }
1161 
fp_fixedlen_vector_valuetypes()1162     static mvt_range fp_fixedlen_vector_valuetypes() {
1163       return mvt_range(
1164           MVT::FIRST_FP_FIXEDLEN_VECTOR_VALUETYPE,
1165           (MVT::SimpleValueType)(MVT::LAST_FP_FIXEDLEN_VECTOR_VALUETYPE + 1));
1166     }
1167 
integer_scalable_vector_valuetypes()1168     static mvt_range integer_scalable_vector_valuetypes() {
1169       return mvt_range(
1170        MVT::FIRST_INTEGER_SCALABLE_VECTOR_VALUETYPE,
1171        (MVT::SimpleValueType)(MVT::LAST_INTEGER_SCALABLE_VECTOR_VALUETYPE + 1));
1172     }
1173 
fp_scalable_vector_valuetypes()1174     static mvt_range fp_scalable_vector_valuetypes() {
1175       return mvt_range(
1176             MVT::FIRST_FP_SCALABLE_VECTOR_VALUETYPE,
1177             (MVT::SimpleValueType)(MVT::LAST_FP_SCALABLE_VECTOR_VALUETYPE + 1));
1178     }
1179     /// @}
1180   };
1181 
1182 } // end namespace llvm
1183 
1184 #endif // LLVM_CODEGEN_MACHINEVALUETYPE_H
1185