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