LLVM 22.0.0git
MachineValueType.h
Go to the documentation of this file.
1//===- CodeGenTypes/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// Constants and properties are defined in ValueTypes.td.
13//
14//===----------------------------------------------------------------------===//
15
16#ifndef LLVM_CODEGEN_MACHINEVALUETYPE_H
17#define LLVM_CODEGEN_MACHINEVALUETYPE_H
18
19#include "llvm/ADT/Sequence.h"
24#include <cassert>
25#include <cstdint>
26
27namespace llvm {
28
29 class Type;
30 struct fltSemantics;
31 class raw_ostream;
32
33 /// Machine Value Type. Every type that is supported natively by some
34 /// processor targeted by LLVM occurs here. This means that any legal value
35 /// type can be represented by an MVT.
36 class MVT {
37 public:
39 // Simple value types that aren't explicitly part of this enumeration
40 // are considered extended value types.
42
43#define GET_VT_ATTR(Ty, n, sz, Any, Int, FP, Vec, Sc, Tup, NF, NElem, EltTy) \
44 Ty = n,
45#define GET_VT_RANGES
46#include "llvm/CodeGen/GenVT.inc"
47#undef GET_VT_ATTR
48#undef GET_VT_RANGES
49
50 VALUETYPE_SIZE = LAST_VALUETYPE + 1,
51 };
52
53 static_assert(FIRST_VALUETYPE > 0);
54 static_assert(LAST_VALUETYPE < token);
55
57
58 constexpr MVT() = default;
59 constexpr MVT(SimpleValueType SVT) : SimpleTy(SVT) {}
60
61 bool operator>(const MVT& S) const { return SimpleTy > S.SimpleTy; }
62 bool operator<(const MVT& S) const { return SimpleTy < S.SimpleTy; }
63 bool operator==(const MVT& S) const { return SimpleTy == S.SimpleTy; }
64 bool operator!=(const MVT& S) const { return SimpleTy != S.SimpleTy; }
65 bool operator>=(const MVT& S) const { return SimpleTy >= S.SimpleTy; }
66 bool operator<=(const MVT& S) const { return SimpleTy <= S.SimpleTy; }
67
68 /// Support for debugging, callable in GDB: VT.dump()
69 LLVM_ABI void dump() const;
70
71 /// Implement operator<<.
72 LLVM_ABI void print(raw_ostream &OS) const;
73
74 /// Return true if this is a valid simple valuetype.
75 bool isValid() const {
76 return (SimpleTy >= MVT::FIRST_VALUETYPE &&
77 SimpleTy <= MVT::LAST_VALUETYPE);
78 }
79
80 /// Return true if this is a FP or a vector FP type.
81 bool isFloatingPoint() const {
82 return ((SimpleTy >= MVT::FIRST_FP_VALUETYPE &&
83 SimpleTy <= MVT::LAST_FP_VALUETYPE) ||
84 (SimpleTy >= MVT::FIRST_FP_FIXEDLEN_VECTOR_VALUETYPE &&
85 SimpleTy <= MVT::LAST_FP_FIXEDLEN_VECTOR_VALUETYPE) ||
86 (SimpleTy >= MVT::FIRST_FP_SCALABLE_VECTOR_VALUETYPE &&
87 SimpleTy <= MVT::LAST_FP_SCALABLE_VECTOR_VALUETYPE));
88 }
89
90 /// Return true if this is an integer or a vector integer type.
91 bool isInteger() const {
92 return ((SimpleTy >= MVT::FIRST_INTEGER_VALUETYPE &&
93 SimpleTy <= MVT::LAST_INTEGER_VALUETYPE) ||
94 (SimpleTy >= MVT::FIRST_INTEGER_FIXEDLEN_VECTOR_VALUETYPE &&
95 SimpleTy <= MVT::LAST_INTEGER_FIXEDLEN_VECTOR_VALUETYPE) ||
96 (SimpleTy >= MVT::FIRST_INTEGER_SCALABLE_VECTOR_VALUETYPE &&
97 SimpleTy <= MVT::LAST_INTEGER_SCALABLE_VECTOR_VALUETYPE));
98 }
99
100 /// Return true if this is an integer, not including vectors.
101 bool isScalarInteger() const {
102 return (SimpleTy >= MVT::FIRST_INTEGER_VALUETYPE &&
103 SimpleTy <= MVT::LAST_INTEGER_VALUETYPE);
104 }
105
106 /// Return true if this is a vector value type.
107 bool isVector() const {
108 return (SimpleTy >= MVT::FIRST_VECTOR_VALUETYPE &&
109 SimpleTy <= MVT::LAST_VECTOR_VALUETYPE);
110 }
111
112 /// Return true if this is a vector value type where the
113 /// runtime length is machine dependent
114 bool isScalableVector() const {
115 return (SimpleTy >= MVT::FIRST_SCALABLE_VECTOR_VALUETYPE &&
116 SimpleTy <= MVT::LAST_SCALABLE_VECTOR_VALUETYPE);
117 }
118
119 /// Return true if this is a RISCV vector tuple type where the
120 /// runtime length is machine dependent
121 bool isRISCVVectorTuple() const {
122 return (SimpleTy >= MVT::FIRST_RISCV_VECTOR_TUPLE_VALUETYPE &&
123 SimpleTy <= MVT::LAST_RISCV_VECTOR_TUPLE_VALUETYPE);
124 }
125
126 /// Return true if this is a custom target type that has a scalable size.
128 return SimpleTy == MVT::aarch64svcount || isRISCVVectorTuple();
129 }
130
131 /// Return true if the type is a scalable type.
132 bool isScalableVT() const {
134 }
135
136 bool isFixedLengthVector() const {
137 return (SimpleTy >= MVT::FIRST_FIXEDLEN_VECTOR_VALUETYPE &&
138 SimpleTy <= MVT::LAST_FIXEDLEN_VECTOR_VALUETYPE);
139 }
140
141 /// Return true if this is a 16-bit vector type.
142 bool is16BitVector() const {
143 return (isFixedLengthVector() && getFixedSizeInBits() == 16);
144 }
145
146 /// Return true if this is a 32-bit vector type.
147 bool is32BitVector() const {
148 return (isFixedLengthVector() && getFixedSizeInBits() == 32);
149 }
150
151 /// Return true if this is a 64-bit vector type.
152 bool is64BitVector() const {
153 return (isFixedLengthVector() && getFixedSizeInBits() == 64);
154 }
155
156 /// Return true if this is a 128-bit vector type.
157 bool is128BitVector() const {
158 return (isFixedLengthVector() && getFixedSizeInBits() == 128);
159 }
160
161 /// Return true if this is a 256-bit vector type.
162 bool is256BitVector() const {
163 return (isFixedLengthVector() && getFixedSizeInBits() == 256);
164 }
165
166 /// Return true if this is a 512-bit vector type.
167 bool is512BitVector() const {
168 return (isFixedLengthVector() && getFixedSizeInBits() == 512);
169 }
170
171 /// Return true if this is a 1024-bit vector type.
172 bool is1024BitVector() const {
173 return (isFixedLengthVector() && getFixedSizeInBits() == 1024);
174 }
175
176 /// Return true if this is a 2048-bit vector type.
177 bool is2048BitVector() const {
178 return (isFixedLengthVector() && getFixedSizeInBits() == 2048);
179 }
180
181 /// Return true if this is an overloaded type for TableGen.
182 bool isOverloaded() const {
183 switch (SimpleTy) {
184#define GET_VT_ATTR(Ty, n, sz, Any, Int, FP, Vec, Sc, Tup, NF, NElem, EltTy) \
185 case Ty: \
186 return Any;
187#include "llvm/CodeGen/GenVT.inc"
188#undef GET_VT_ATTR
189 default:
190 return false;
191 }
192 }
193
194 /// Return a vector with the same number of elements as this vector, but
195 /// with the element type converted to an integer type with the same
196 /// bitwidth.
198 MVT EltTy = getVectorElementType();
199 MVT IntTy = MVT::getIntegerVT(EltTy.getSizeInBits());
202 "Simple vector VT not representable by simple integer vector VT!");
203 return VecTy;
204 }
205
206 /// Return a VT for a vector type whose attributes match ourselves
207 /// with the exception of the element type that is chosen by the caller.
211 "Simple vector VT not representable by simple integer vector VT!");
212 return VecTy;
213 }
214
215 /// Return the type converted to an equivalently sized integer or vector
216 /// with integer element type. Similar to changeVectorElementTypeToInteger,
217 /// but also handles scalars.
219 if (isVector())
222 }
223
224 /// Return a VT for a vector type with the same element type but
225 /// half the number of elements.
227 MVT EltVT = getVectorElementType();
228 auto EltCnt = getVectorElementCount();
229 assert(EltCnt.isKnownEven() && "Splitting vector, but not in half!");
230 return getVectorVT(EltVT, EltCnt.divideCoefficientBy(2));
231 }
232
233 // Return a VT for a vector type with the same element type but
234 // double the number of elements.
236 MVT EltVT = getVectorElementType();
237 auto EltCnt = getVectorElementCount();
238 return MVT::getVectorVT(EltVT, EltCnt * 2);
239 }
240
241 /// Returns true if the given vector is a power of 2.
242 bool isPow2VectorType() const {
243 unsigned NElts = getVectorMinNumElements();
244 return !(NElts & (NElts - 1));
245 }
246
247 /// Widens the length of the given vector MVT up to the nearest power of 2
248 /// and returns that type.
250 if (isPow2VectorType())
251 return *this;
252
254 unsigned NewMinCount = 1 << Log2_32_Ceil(NElts.getKnownMinValue());
255 NElts = ElementCount::get(NewMinCount, NElts.isScalable());
256 return MVT::getVectorVT(getVectorElementType(), NElts);
257 }
258
259 /// If this is a vector, return the element type, otherwise return this.
261 return isVector() ? getVectorElementType() : *this;
262 }
263
265 assert(SimpleTy >= FIRST_VALUETYPE && SimpleTy <= LAST_VALUETYPE);
266 static constexpr SimpleValueType EltTyTable[] = {
267#define GET_VT_ATTR(Ty, N, Sz, Any, Int, FP, Vec, Sc, Tup, NF, NElem, EltTy) \
268 EltTy,
269#include "llvm/CodeGen/GenVT.inc"
270#undef GET_VT_ATTR
271 };
272 SimpleValueType VT = EltTyTable[SimpleTy - FIRST_VALUETYPE];
273 assert(VT != INVALID_SIMPLE_VALUE_TYPE && "Not a vector MVT!");
274 return VT;
275 }
276
277 /// Given a vector type, return the minimum number of elements it contains.
278 unsigned getVectorMinNumElements() const {
279 assert(SimpleTy >= FIRST_VALUETYPE && SimpleTy <= LAST_VALUETYPE);
280 static constexpr uint16_t NElemTable[] = {
281#define GET_VT_ATTR(Ty, N, Sz, Any, Int, FP, Vec, Sc, Tup, NF, NElem, EltTy) \
282 NElem,
283#include "llvm/CodeGen/GenVT.inc"
284#undef GET_VT_ATTR
285 };
286 unsigned NElem = NElemTable[SimpleTy - FIRST_VALUETYPE];
287 assert(NElem != 0 && "Not a vector MVT!");
288 return NElem;
289 }
290
293 }
294
295 unsigned getVectorNumElements() const {
296 if (isScalableVector())
298 "Possible incorrect use of MVT::getVectorNumElements() for "
299 "scalable vector. Scalable flag may be dropped, use "
300 "MVT::getVectorElementCount() instead");
302 }
303
304 /// Returns the size of the specified MVT in bits.
305 ///
306 /// If the value type is a scalable vector type, the scalable property will
307 /// be set and the runtime size will be a positive integer multiple of the
308 /// base size.
310 static constexpr TypeSize SizeTable[] = {
311#define GET_VT_ATTR(Ty, N, Sz, Any, Int, FP, Vec, Sc, Tup, NF, NElem, EltTy) \
312 TypeSize(Sz, Sc || Tup || Ty == aarch64svcount /* FIXME: Not in the td. \
313 */),
314#include "llvm/CodeGen/GenVT.inc"
315#undef GET_VT_ATTR
316 };
317
318 switch (SimpleTy) {
320 llvm_unreachable("getSizeInBits called on extended MVT.");
321 case Other:
322 llvm_unreachable("Value type is non-standard value, Other.");
323 case iPTR:
324 llvm_unreachable("Value type size is target-dependent. Ask TLI.");
325 case pAny:
326 case iAny:
327 case fAny:
328 case vAny:
329 case Any:
330 llvm_unreachable("Value type is overloaded.");
331 case token:
332 llvm_unreachable("Token type is a sentinel that cannot be used "
333 "in codegen and has no size");
334 case Metadata:
335 llvm_unreachable("Value type is metadata.");
336 default:
337 assert(SimpleTy < VALUETYPE_SIZE && "Unexpected value type!");
338 return SizeTable[SimpleTy - FIRST_VALUETYPE];
339 }
340 }
341
342 /// Return the size of the specified fixed width value type in bits. The
343 /// function will assert if the type is scalable.
345 return getSizeInBits().getFixedValue();
346 }
350 }
351
352 /// Return the number of bytes overwritten by a store of the specified value
353 /// type.
354 ///
355 /// If the value type is a scalable vector type, the scalable property will
356 /// be set and the runtime size will be a positive integer multiple of the
357 /// base size.
358 TypeSize getStoreSize() const {
359 TypeSize BaseSize = getSizeInBits();
360 return {(BaseSize.getKnownMinValue() + 7) / 8, BaseSize.isScalable()};
361 }
362
363 // Return the number of bytes overwritten by a store of this value type or
364 // this value type's element type in the case of a vector.
367 }
368
369 /// Return the number of bits overwritten by a store of the specified value
370 /// type.
371 ///
372 /// If the value type is a scalable vector type, the scalable property will
373 /// be set and the runtime size will be a positive integer multiple of the
374 /// base size.
376 return getStoreSize() * 8;
377 }
378
379 /// Returns true if the number of bits for the type is a multiple of an
380 /// 8-bit byte.
381 bool isByteSized() const { return getSizeInBits().isKnownMultipleOf(8); }
382
383 /// Return true if we know at compile time this has more bits than VT.
384 bool knownBitsGT(MVT VT) const {
386 }
387
388 /// Return true if we know at compile time this has more than or the same
389 /// bits as VT.
390 bool knownBitsGE(MVT VT) const {
392 }
393
394 /// Return true if we know at compile time this has fewer bits than VT.
395 bool knownBitsLT(MVT VT) const {
397 }
398
399 /// Return true if we know at compile time this has fewer than or the same
400 /// bits as VT.
401 bool knownBitsLE(MVT VT) const {
403 }
404
405 /// Return true if this has more bits than VT.
406 bool bitsGT(MVT VT) const {
408 "Comparison between scalable and fixed types");
409 return knownBitsGT(VT);
410 }
411
412 /// Return true if this has no less bits than VT.
413 bool bitsGE(MVT VT) const {
415 "Comparison between scalable and fixed types");
416 return knownBitsGE(VT);
417 }
418
419 /// Return true if this has less bits than VT.
420 bool bitsLT(MVT VT) const {
422 "Comparison between scalable and fixed types");
423 return knownBitsLT(VT);
424 }
425
426 /// Return true if this has no more bits than VT.
427 bool bitsLE(MVT VT) const {
429 "Comparison between scalable and fixed types");
430 return knownBitsLE(VT);
431 }
433 static MVT getFloatingPointVT(unsigned BitWidth) {
434#define GET_VT_ATTR(Ty, n, sz, Any, Int, FP, Vec, Sc, Tup, NF, NElem, EltTy) \
435 if (FP == 3 && sz == BitWidth) \
436 return Ty;
437#include "llvm/CodeGen/GenVT.inc"
438#undef GET_VT_ATTR
439
440 llvm_unreachable("Bad bit width!");
441 }
443 static MVT getIntegerVT(unsigned BitWidth) {
444#define GET_VT_ATTR(Ty, n, sz, Any, Int, FP, Vec, Sc, Tup, NF, NElem, EltTy) \
445 if (Int == 3 && sz == BitWidth) \
446 return Ty;
447#include "llvm/CodeGen/GenVT.inc"
448#undef GET_VT_ATTR
449
451 }
453 static MVT getVectorVT(MVT VT, unsigned NumElements) {
454#define GET_VT_VECATTR(Ty, Sc, Tup, nElem, ElTy) \
455 if (!Sc && !Tup && VT.SimpleTy == ElTy && NumElements == nElem) \
456 return Ty;
457#include "llvm/CodeGen/GenVT.inc"
458#undef GET_VT_VECATTR
459
461 }
463 static MVT getScalableVectorVT(MVT VT, unsigned NumElements) {
464#define GET_VT_VECATTR(Ty, Sc, Tup, nElem, ElTy) \
465 if (Sc && VT.SimpleTy == ElTy && NumElements == nElem) \
466 return Ty;
467#include "llvm/CodeGen/GenVT.inc"
468#undef GET_VT_VECATTR
469
471 }
473 static MVT getRISCVVectorTupleVT(unsigned Sz, unsigned NFields) {
474#define GET_VT_ATTR(Ty, n, sz, Any, Int, FP, Vec, Sc, Tup, NF, nElem, EltTy) \
475 if (Tup && sz == Sz && NF == NFields) \
476 return Ty;
477#include "llvm/CodeGen/GenVT.inc"
478#undef GET_VT_ATTR
479
480 llvm_unreachable("Invalid RISCV vector tuple type");
481 }
482
483 /// Given a RISC-V vector tuple type, return the num_fields.
484 unsigned getRISCVVectorTupleNumFields() const {
485 assert(isRISCVVectorTuple() && SimpleTy >= FIRST_VALUETYPE &&
486 SimpleTy <= LAST_VALUETYPE);
487 static constexpr uint8_t NFTable[] = {
488#define GET_VT_ATTR(Ty, N, Sz, Any, Int, FP, Vec, Sc, Tup, NF, NElem, EltTy) \
489 NF,
490#include "llvm/CodeGen/GenVT.inc"
491#undef GET_VT_ATTR
492 };
493 return NFTable[SimpleTy - FIRST_VALUETYPE];
494 }
496 static MVT getVectorVT(MVT VT, unsigned NumElements, bool IsScalable) {
497 if (IsScalable)
498 return getScalableVectorVT(VT, NumElements);
499 return getVectorVT(VT, NumElements);
500 }
502 static MVT getVectorVT(MVT VT, ElementCount EC) {
503 if (EC.isScalable())
504 return getScalableVectorVT(VT, EC.getKnownMinValue());
505 return getVectorVT(VT, EC.getKnownMinValue());
506 }
507
508 /// Return the value type corresponding to the specified type.
509 /// If HandleUnknown is true, unknown types are returned as Other,
510 /// otherwise they are invalid.
511 /// NB: This includes pointer types, which require a DataLayout to convert
512 /// to a concrete value type.
513 LLVM_ABI static MVT getVT(Type *Ty, bool HandleUnknown = false);
514
515 /// Returns an APFloat semantics tag appropriate for the value type. If this
516 /// is a vector type, the element semantics are returned.
518
519 public:
520 /// SimpleValueType Iteration
521 /// @{
522 static auto all_valuetypes() {
523 return enum_seq_inclusive(MVT::FIRST_VALUETYPE, MVT::LAST_VALUETYPE,
525 }
527 static auto integer_valuetypes() {
528 return enum_seq_inclusive(MVT::FIRST_INTEGER_VALUETYPE,
529 MVT::LAST_INTEGER_VALUETYPE,
531 }
533 static auto fp_valuetypes() {
534 return enum_seq_inclusive(MVT::FIRST_FP_VALUETYPE, MVT::LAST_FP_VALUETYPE,
536 }
538 static auto vector_valuetypes() {
539 return enum_seq_inclusive(MVT::FIRST_VECTOR_VALUETYPE,
540 MVT::LAST_VECTOR_VALUETYPE,
542 }
544 static auto fixedlen_vector_valuetypes() {
545 return enum_seq_inclusive(MVT::FIRST_FIXEDLEN_VECTOR_VALUETYPE,
546 MVT::LAST_FIXEDLEN_VECTOR_VALUETYPE,
548 }
550 static auto scalable_vector_valuetypes() {
551 return enum_seq_inclusive(MVT::FIRST_SCALABLE_VECTOR_VALUETYPE,
552 MVT::LAST_SCALABLE_VECTOR_VALUETYPE,
554 }
557 return enum_seq_inclusive(MVT::FIRST_INTEGER_FIXEDLEN_VECTOR_VALUETYPE,
558 MVT::LAST_INTEGER_FIXEDLEN_VECTOR_VALUETYPE,
560 }
562 static auto fp_fixedlen_vector_valuetypes() {
563 return enum_seq_inclusive(MVT::FIRST_FP_FIXEDLEN_VECTOR_VALUETYPE,
564 MVT::LAST_FP_FIXEDLEN_VECTOR_VALUETYPE,
566 }
569 return enum_seq_inclusive(MVT::FIRST_INTEGER_SCALABLE_VECTOR_VALUETYPE,
570 MVT::LAST_INTEGER_SCALABLE_VECTOR_VALUETYPE,
572 }
574 static auto fp_scalable_vector_valuetypes() {
575 return enum_seq_inclusive(MVT::FIRST_FP_SCALABLE_VECTOR_VALUETYPE,
576 MVT::LAST_FP_SCALABLE_VECTOR_VALUETYPE,
578 }
579 /// @}
580 };
582 inline raw_ostream &operator<<(raw_ostream &OS, const MVT &VT) {
583 VT.print(OS);
584 return OS;
585 }
586
587} // end namespace llvm
588
589#endif // LLVM_CODEGEN_MACHINEVALUETYPE_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
RelocType Type
Definition: COFFYAML.cpp:410
#define LLVM_ABI
Definition: Compiler.h:213
raw_pwrite_stream & OS
Provides some synthesis utilities to produce sequences of values.
Definition: Any.h:28
static constexpr ElementCount get(ScalarTy MinVal, bool Scalable)
Definition: TypeSize.h:318
Machine Value Type.
LLVM_ABI void dump() const
Support for debugging, callable in GDB: VT.dump()
Definition: ValueTypes.cpp:335
static MVT getFloatingPointVT(unsigned BitWidth)
bool isByteSized() const
Returns true if the number of bits for the type is a multiple of an 8-bit byte.
bool is128BitVector() const
Return true if this is a 128-bit vector type.
bool knownBitsGT(MVT VT) const
Return true if we know at compile time this has more bits than VT.
@ INVALID_SIMPLE_VALUE_TYPE
static auto integer_fixedlen_vector_valuetypes()
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
bool isRISCVVectorTuple() const
Return true if this is a RISCV vector tuple type where the runtime length is machine dependent.
bool operator>(const MVT &S) const
SimpleValueType SimpleTy
bool isOverloaded() const
Return true if this is an overloaded type for TableGen.
bool isScalableTargetExtVT() const
Return true if this is a custom target type that has a scalable size.
uint64_t getScalarSizeInBits() const
MVT changeVectorElementType(MVT EltVT) const
Return a VT for a vector type whose attributes match ourselves with the exception of the element type...
bool operator<=(const MVT &S) const
constexpr MVT()=default
bool bitsLE(MVT VT) const
Return true if this has no more bits than VT.
unsigned getVectorNumElements() const
bool knownBitsLT(MVT VT) const
Return true if we know at compile time this has fewer bits than VT.
static MVT getRISCVVectorTupleVT(unsigned Sz, unsigned NFields)
bool isVector() const
Return true if this is a vector value type.
bool isInteger() const
Return true if this is an integer or a vector integer type.
bool isScalableVector() const
Return true if this is a vector value type where the runtime length is machine dependent.
static MVT getScalableVectorVT(MVT VT, unsigned NumElements)
bool is16BitVector() const
Return true if this is a 16-bit vector type.
bool is32BitVector() const
Return true if this is a 32-bit vector type.
unsigned getRISCVVectorTupleNumFields() const
Given a RISC-V vector tuple type, return the num_fields.
MVT changeTypeToInteger()
Return the type converted to an equivalently sized integer or vector with integer element type.
static LLVM_ABI MVT getVT(Type *Ty, bool HandleUnknown=false)
Return the value type corresponding to the specified type.
Definition: ValueTypes.cpp:247
bool isScalableVT() const
Return true if the type is a scalable type.
bool bitsLT(MVT VT) const
Return true if this has less bits than VT.
static auto all_valuetypes()
SimpleValueType Iteration.
bool operator<(const MVT &S) const
bool is512BitVector() const
Return true if this is a 512-bit vector type.
bool operator==(const MVT &S) const
static auto integer_valuetypes()
bool is1024BitVector() const
Return true if this is a 1024-bit vector type.
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
bool isPow2VectorType() const
Returns true if the given vector is a power of 2.
uint64_t getScalarStoreSize() const
static auto scalable_vector_valuetypes()
static auto fixedlen_vector_valuetypes()
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
LLVM_ABI const fltSemantics & getFltSemantics() const
Returns an APFloat semantics tag appropriate for the value type.
Definition: ValueTypes.cpp:317
bool bitsGT(MVT VT) const
Return true if this has more bits than VT.
bool isFixedLengthVector() const
static auto vector_valuetypes()
bool is256BitVector() const
Return true if this is a 256-bit vector type.
ElementCount getVectorElementCount() const
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
bool bitsGE(MVT VT) const
Return true if this has no less bits than VT.
bool isScalarInteger() const
Return true if this is an integer, not including vectors.
TypeSize getStoreSizeInBits() const
Return the number of bits overwritten by a store of the specified value type.
static MVT getVectorVT(MVT VT, unsigned NumElements)
bool knownBitsGE(MVT VT) const
Return true if we know at compile time this has more than or the same bits as VT.
static auto fp_scalable_vector_valuetypes()
MVT getVectorElementType() const
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
bool operator>=(const MVT &S) const
bool isValid() const
Return true if this is a valid simple valuetype.
static MVT getIntegerVT(unsigned BitWidth)
MVT getDoubleNumVectorElementsVT() const
static auto fp_valuetypes()
MVT getHalfNumVectorElementsVT() const
Return a VT for a vector type with the same element type but half the number of elements.
bool knownBitsLE(MVT VT) const
Return true if we know at compile time this has fewer than or the same bits as VT.
bool operator!=(const MVT &S) const
MVT getScalarType() const
If this is a vector, return the element type, otherwise return this.
static auto integer_scalable_vector_valuetypes()
LLVM_ABI void print(raw_ostream &OS) const
Implement operator<<.
Definition: ValueTypes.cpp:341
bool is64BitVector() const
Return true if this is a 64-bit vector type.
MVT changeVectorElementTypeToInteger() const
Return a vector with the same number of elements as this vector, but with the element type converted ...
MVT getPow2VectorType() const
Widens the length of the given vector MVT up to the nearest power of 2 and returns that type.
static auto fp_fixedlen_vector_valuetypes()
constexpr MVT(SimpleValueType SVT)
bool is2048BitVector() const
Return true if this is a 2048-bit vector type.
Root of the metadata hierarchy.
Definition: Metadata.h:63
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
constexpr bool isKnownMultipleOf(ScalarTy RHS) const
This function tells the caller whether the element count is known at compile time to be a multiple of...
Definition: TypeSize.h:184
constexpr ScalarTy getFixedValue() const
Definition: TypeSize.h:203
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition: TypeSize.h:233
static constexpr bool isKnownLT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition: TypeSize.h:219
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition: TypeSize.h:172
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition: TypeSize.h:169
static constexpr bool isKnownGT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition: TypeSize.h:226
static constexpr bool isKnownGE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition: TypeSize.h:240
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:53
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition: MathExtras.h:349
auto enum_seq_inclusive(EnumT Begin, EnumT End)
Iterate over an enum type from Begin to End inclusive.
Definition: Sequence.h:364
constexpr force_iteration_on_noniterable_enum_t force_iteration_on_noniterable_enum
Definition: Sequence.h:108
LLVM_ABI void reportInvalidSizeRequest(const char *Msg)
Reports a diagnostic message to indicate an invalid size request has been done on a scalable vector.
Definition: TypeSize.cpp:39
@ Other
Any other memory.
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
Definition: APFixedPoint.h:312
constexpr unsigned BitWidth
Definition: BitmaskEnum.h:223