1 | //===----------- ValueTypes.cpp - Implementation of EVT methods -----------===// |
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 | #include "llvm/CodeGen/ValueTypes.h" |
10 | #include "llvm/ADT/StringExtras.h" |
11 | #include "llvm/IR/DerivedTypes.h" |
12 | #include "llvm/IR/Type.h" |
13 | #include "llvm/Support/Debug.h" |
14 | #include "llvm/Support/ErrorHandling.h" |
15 | #include "llvm/Support/TypeSize.h" |
16 | #include "llvm/Support/WithColor.h" |
17 | using namespace llvm; |
18 | |
19 | EVT EVT::changeExtendedTypeToInteger() const { |
20 | assert(isExtended() && "Type is not extended!" ); |
21 | LLVMContext &Context = LLVMTy->getContext(); |
22 | return getIntegerVT(Context, BitWidth: getSizeInBits()); |
23 | } |
24 | |
25 | EVT EVT::changeExtendedVectorElementTypeToInteger() const { |
26 | assert(isExtended() && "Type is not extended!" ); |
27 | LLVMContext &Context = LLVMTy->getContext(); |
28 | EVT IntTy = getIntegerVT(Context, BitWidth: getScalarSizeInBits()); |
29 | return getVectorVT(Context, VT: IntTy, EC: getVectorElementCount()); |
30 | } |
31 | |
32 | EVT EVT::changeExtendedVectorElementType(EVT EltVT) const { |
33 | assert(isExtended() && "Type is not extended!" ); |
34 | LLVMContext &Context = LLVMTy->getContext(); |
35 | return getVectorVT(Context, VT: EltVT, EC: getVectorElementCount()); |
36 | } |
37 | |
38 | EVT EVT::getExtendedIntegerVT(LLVMContext &Context, unsigned BitWidth) { |
39 | EVT VT; |
40 | VT.LLVMTy = IntegerType::get(C&: Context, NumBits: BitWidth); |
41 | assert(VT.isExtended() && "Type is not extended!" ); |
42 | return VT; |
43 | } |
44 | |
45 | EVT EVT::getExtendedVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, |
46 | bool IsScalable) { |
47 | EVT ResultVT; |
48 | ResultVT.LLVMTy = |
49 | VectorType::get(ElementType: VT.getTypeForEVT(Context), NumElements, Scalable: IsScalable); |
50 | assert(ResultVT.isExtended() && "Type is not extended!" ); |
51 | return ResultVT; |
52 | } |
53 | |
54 | EVT EVT::getExtendedVectorVT(LLVMContext &Context, EVT VT, ElementCount EC) { |
55 | EVT ResultVT; |
56 | ResultVT.LLVMTy = VectorType::get(ElementType: VT.getTypeForEVT(Context), EC); |
57 | assert(ResultVT.isExtended() && "Type is not extended!" ); |
58 | return ResultVT; |
59 | } |
60 | |
61 | bool EVT::isExtendedFloatingPoint() const { |
62 | assert(isExtended() && "Type is not extended!" ); |
63 | return LLVMTy->isFPOrFPVectorTy(); |
64 | } |
65 | |
66 | bool EVT::isExtendedInteger() const { |
67 | assert(isExtended() && "Type is not extended!" ); |
68 | return LLVMTy->isIntOrIntVectorTy(); |
69 | } |
70 | |
71 | bool EVT::isExtendedScalarInteger() const { |
72 | assert(isExtended() && "Type is not extended!" ); |
73 | return LLVMTy->isIntegerTy(); |
74 | } |
75 | |
76 | bool EVT::isExtendedVector() const { |
77 | assert(isExtended() && "Type is not extended!" ); |
78 | return LLVMTy->isVectorTy(); |
79 | } |
80 | |
81 | bool EVT::isExtended16BitVector() const { |
82 | return isExtendedVector() && |
83 | getExtendedSizeInBits() == TypeSize::getFixed(ExactSize: 16); |
84 | } |
85 | |
86 | bool EVT::isExtended32BitVector() const { |
87 | return isExtendedVector() && |
88 | getExtendedSizeInBits() == TypeSize::getFixed(ExactSize: 32); |
89 | } |
90 | |
91 | bool EVT::isExtended64BitVector() const { |
92 | return isExtendedVector() && |
93 | getExtendedSizeInBits() == TypeSize::getFixed(ExactSize: 64); |
94 | } |
95 | |
96 | bool EVT::isExtended128BitVector() const { |
97 | return isExtendedVector() && |
98 | getExtendedSizeInBits() == TypeSize::getFixed(ExactSize: 128); |
99 | } |
100 | |
101 | bool EVT::isExtended256BitVector() const { |
102 | return isExtendedVector() && |
103 | getExtendedSizeInBits() == TypeSize::getFixed(ExactSize: 256); |
104 | } |
105 | |
106 | bool EVT::isExtended512BitVector() const { |
107 | return isExtendedVector() && |
108 | getExtendedSizeInBits() == TypeSize::getFixed(ExactSize: 512); |
109 | } |
110 | |
111 | bool EVT::isExtended1024BitVector() const { |
112 | return isExtendedVector() && |
113 | getExtendedSizeInBits() == TypeSize::getFixed(ExactSize: 1024); |
114 | } |
115 | |
116 | bool EVT::isExtended2048BitVector() const { |
117 | return isExtendedVector() && |
118 | getExtendedSizeInBits() == TypeSize::getFixed(ExactSize: 2048); |
119 | } |
120 | |
121 | bool EVT::isExtendedFixedLengthVector() const { |
122 | return isExtendedVector() && isa<FixedVectorType>(Val: LLVMTy); |
123 | } |
124 | |
125 | bool EVT::isExtendedScalableVector() const { |
126 | return isExtendedVector() && isa<ScalableVectorType>(Val: LLVMTy); |
127 | } |
128 | |
129 | EVT EVT::getExtendedVectorElementType() const { |
130 | assert(isExtended() && "Type is not extended!" ); |
131 | return EVT::getEVT(Ty: cast<VectorType>(Val: LLVMTy)->getElementType()); |
132 | } |
133 | |
134 | unsigned EVT::getExtendedVectorNumElements() const { |
135 | assert(isExtended() && "Type is not extended!" ); |
136 | ElementCount EC = cast<VectorType>(Val: LLVMTy)->getElementCount(); |
137 | if (EC.isScalable()) { |
138 | WithColor::warning() |
139 | << "The code that requested the fixed number of elements has made the " |
140 | "assumption that this vector is not scalable. This assumption was " |
141 | "not correct, and this may lead to broken code\n" ; |
142 | } |
143 | return EC.getKnownMinValue(); |
144 | } |
145 | |
146 | ElementCount EVT::getExtendedVectorElementCount() const { |
147 | assert(isExtended() && "Type is not extended!" ); |
148 | return cast<VectorType>(Val: LLVMTy)->getElementCount(); |
149 | } |
150 | |
151 | TypeSize EVT::getExtendedSizeInBits() const { |
152 | assert(isExtended() && "Type is not extended!" ); |
153 | if (IntegerType *ITy = dyn_cast<IntegerType>(Val: LLVMTy)) |
154 | return TypeSize::getFixed(ExactSize: ITy->getBitWidth()); |
155 | if (VectorType *VTy = dyn_cast<VectorType>(Val: LLVMTy)) |
156 | return VTy->getPrimitiveSizeInBits(); |
157 | llvm_unreachable("Unrecognized extended type!" ); |
158 | } |
159 | |
160 | /// getEVTString - This function returns value type as a string, e.g. "i32". |
161 | std::string EVT::getEVTString() const { |
162 | switch (V.SimpleTy) { |
163 | default: |
164 | if (isVector()) |
165 | return (isScalableVector() ? "nxv" : "v" ) + |
166 | utostr(X: getVectorElementCount().getKnownMinValue()) + |
167 | getVectorElementType().getEVTString(); |
168 | if (isInteger()) |
169 | return "i" + utostr(X: getSizeInBits()); |
170 | if (isFloatingPoint()) |
171 | return "f" + utostr(X: getSizeInBits()); |
172 | llvm_unreachable("Invalid EVT!" ); |
173 | case MVT::bf16: return "bf16" ; |
174 | case MVT::ppcf128: return "ppcf128" ; |
175 | case MVT::isVoid: return "isVoid" ; |
176 | case MVT::Other: return "ch" ; |
177 | case MVT::Glue: return "glue" ; |
178 | case MVT::x86mmx: return "x86mmx" ; |
179 | case MVT::x86amx: return "x86amx" ; |
180 | case MVT::i64x8: return "i64x8" ; |
181 | case MVT::Metadata: return "Metadata" ; |
182 | case MVT::Untyped: return "Untyped" ; |
183 | case MVT::funcref: return "funcref" ; |
184 | case MVT::externref: return "externref" ; |
185 | case MVT::aarch64svcount: |
186 | return "aarch64svcount" ; |
187 | case MVT::spirvbuiltin: |
188 | return "spirvbuiltin" ; |
189 | } |
190 | } |
191 | |
192 | #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) |
193 | void EVT::dump() const { |
194 | print(OS&: dbgs()); |
195 | dbgs() << "\n" ; |
196 | } |
197 | #endif |
198 | |
199 | /// getTypeForEVT - This method returns an LLVM type corresponding to the |
200 | /// specified EVT. For integer types, this returns an unsigned type. Note |
201 | /// that this will abort for types that cannot be represented. |
202 | Type *EVT::getTypeForEVT(LLVMContext &Context) const { |
203 | // clang-format off |
204 | switch (V.SimpleTy) { |
205 | default: |
206 | assert(isExtended() && "Type is not extended!" ); |
207 | return LLVMTy; |
208 | case MVT::isVoid: return Type::getVoidTy(C&: Context); |
209 | case MVT::i1: return Type::getInt1Ty(C&: Context); |
210 | case MVT::i2: return Type::getIntNTy(C&: Context, N: 2); |
211 | case MVT::i4: return Type::getIntNTy(C&: Context, N: 4); |
212 | case MVT::i8: return Type::getInt8Ty(C&: Context); |
213 | case MVT::i16: return Type::getInt16Ty(C&: Context); |
214 | case MVT::i32: return Type::getInt32Ty(C&: Context); |
215 | case MVT::i64: return Type::getInt64Ty(C&: Context); |
216 | case MVT::i128: return IntegerType::get(C&: Context, NumBits: 128); |
217 | case MVT::f16: return Type::getHalfTy(C&: Context); |
218 | case MVT::bf16: return Type::getBFloatTy(C&: Context); |
219 | case MVT::f32: return Type::getFloatTy(C&: Context); |
220 | case MVT::f64: return Type::getDoubleTy(C&: Context); |
221 | case MVT::f80: return Type::getX86_FP80Ty(C&: Context); |
222 | case MVT::f128: return Type::getFP128Ty(C&: Context); |
223 | case MVT::ppcf128: return Type::getPPC_FP128Ty(C&: Context); |
224 | case MVT::x86mmx: return Type::getX86_MMXTy(C&: Context); |
225 | case MVT::aarch64svcount: |
226 | return TargetExtType::get(Context, Name: "aarch64.svcount" ); |
227 | case MVT::x86amx: return Type::getX86_AMXTy(C&: Context); |
228 | case MVT::i64x8: return IntegerType::get(C&: Context, NumBits: 512); |
229 | case MVT::externref: return Type::getWasm_ExternrefTy(C&: Context); |
230 | case MVT::funcref: return Type::getWasm_FuncrefTy(C&: Context); |
231 | case MVT::v1i1: |
232 | return FixedVectorType::get(ElementType: Type::getInt1Ty(C&: Context), NumElts: 1); |
233 | case MVT::v2i1: |
234 | return FixedVectorType::get(ElementType: Type::getInt1Ty(C&: Context), NumElts: 2); |
235 | case MVT::v3i1: |
236 | return FixedVectorType::get(ElementType: Type::getInt1Ty(C&: Context), NumElts: 3); |
237 | case MVT::v4i1: |
238 | return FixedVectorType::get(ElementType: Type::getInt1Ty(C&: Context), NumElts: 4); |
239 | case MVT::v8i1: |
240 | return FixedVectorType::get(ElementType: Type::getInt1Ty(C&: Context), NumElts: 8); |
241 | case MVT::v16i1: |
242 | return FixedVectorType::get(ElementType: Type::getInt1Ty(C&: Context), NumElts: 16); |
243 | case MVT::v32i1: |
244 | return FixedVectorType::get(ElementType: Type::getInt1Ty(C&: Context), NumElts: 32); |
245 | case MVT::v64i1: |
246 | return FixedVectorType::get(ElementType: Type::getInt1Ty(C&: Context), NumElts: 64); |
247 | case MVT::v128i1: |
248 | return FixedVectorType::get(ElementType: Type::getInt1Ty(C&: Context), NumElts: 128); |
249 | case MVT::v256i1: |
250 | return FixedVectorType::get(ElementType: Type::getInt1Ty(C&: Context), NumElts: 256); |
251 | case MVT::v512i1: |
252 | return FixedVectorType::get(ElementType: Type::getInt1Ty(C&: Context), NumElts: 512); |
253 | case MVT::v1024i1: |
254 | return FixedVectorType::get(ElementType: Type::getInt1Ty(C&: Context), NumElts: 1024); |
255 | case MVT::v2048i1: |
256 | return FixedVectorType::get(ElementType: Type::getInt1Ty(C&: Context), NumElts: 2048); |
257 | case MVT::v128i2: |
258 | return FixedVectorType::get(ElementType: Type::getIntNTy(C&: Context, N: 2), NumElts: 128); |
259 | case MVT::v256i2: |
260 | return FixedVectorType::get(ElementType: Type::getIntNTy(C&: Context, N: 2), NumElts: 256); |
261 | case MVT::v64i4: |
262 | return FixedVectorType::get(ElementType: Type::getIntNTy(C&: Context, N: 4), NumElts: 64); |
263 | case MVT::v128i4: |
264 | return FixedVectorType::get(ElementType: Type::getIntNTy(C&: Context, N: 4), NumElts: 128); |
265 | case MVT::v1i8: |
266 | return FixedVectorType::get(ElementType: Type::getInt8Ty(C&: Context), NumElts: 1); |
267 | case MVT::v2i8: |
268 | return FixedVectorType::get(ElementType: Type::getInt8Ty(C&: Context), NumElts: 2); |
269 | case MVT::v3i8: |
270 | return FixedVectorType::get(ElementType: Type::getInt8Ty(C&: Context), NumElts: 3); |
271 | case MVT::v4i8: |
272 | return FixedVectorType::get(ElementType: Type::getInt8Ty(C&: Context), NumElts: 4); |
273 | case MVT::v8i8: |
274 | return FixedVectorType::get(ElementType: Type::getInt8Ty(C&: Context), NumElts: 8); |
275 | case MVT::v16i8: |
276 | return FixedVectorType::get(ElementType: Type::getInt8Ty(C&: Context), NumElts: 16); |
277 | case MVT::v32i8: |
278 | return FixedVectorType::get(ElementType: Type::getInt8Ty(C&: Context), NumElts: 32); |
279 | case MVT::v64i8: |
280 | return FixedVectorType::get(ElementType: Type::getInt8Ty(C&: Context), NumElts: 64); |
281 | case MVT::v128i8: |
282 | return FixedVectorType::get(ElementType: Type::getInt8Ty(C&: Context), NumElts: 128); |
283 | case MVT::v256i8: |
284 | return FixedVectorType::get(ElementType: Type::getInt8Ty(C&: Context), NumElts: 256); |
285 | case MVT::v512i8: |
286 | return FixedVectorType::get(ElementType: Type::getInt8Ty(C&: Context), NumElts: 512); |
287 | case MVT::v1024i8: |
288 | return FixedVectorType::get(ElementType: Type::getInt8Ty(C&: Context), NumElts: 1024); |
289 | case MVT::v1i16: |
290 | return FixedVectorType::get(ElementType: Type::getInt16Ty(C&: Context), NumElts: 1); |
291 | case MVT::v2i16: |
292 | return FixedVectorType::get(ElementType: Type::getInt16Ty(C&: Context), NumElts: 2); |
293 | case MVT::v3i16: |
294 | return FixedVectorType::get(ElementType: Type::getInt16Ty(C&: Context), NumElts: 3); |
295 | case MVT::v4i16: |
296 | return FixedVectorType::get(ElementType: Type::getInt16Ty(C&: Context), NumElts: 4); |
297 | case MVT::v8i16: |
298 | return FixedVectorType::get(ElementType: Type::getInt16Ty(C&: Context), NumElts: 8); |
299 | case MVT::v16i16: |
300 | return FixedVectorType::get(ElementType: Type::getInt16Ty(C&: Context), NumElts: 16); |
301 | case MVT::v32i16: |
302 | return FixedVectorType::get(ElementType: Type::getInt16Ty(C&: Context), NumElts: 32); |
303 | case MVT::v64i16: |
304 | return FixedVectorType::get(ElementType: Type::getInt16Ty(C&: Context), NumElts: 64); |
305 | case MVT::v128i16: |
306 | return FixedVectorType::get(ElementType: Type::getInt16Ty(C&: Context), NumElts: 128); |
307 | case MVT::v256i16: |
308 | return FixedVectorType::get(ElementType: Type::getInt16Ty(C&: Context), NumElts: 256); |
309 | case MVT::v512i16: |
310 | return FixedVectorType::get(ElementType: Type::getInt16Ty(C&: Context), NumElts: 512); |
311 | case MVT::v1i32: |
312 | return FixedVectorType::get(ElementType: Type::getInt32Ty(C&: Context), NumElts: 1); |
313 | case MVT::v2i32: |
314 | return FixedVectorType::get(ElementType: Type::getInt32Ty(C&: Context), NumElts: 2); |
315 | case MVT::v3i32: |
316 | return FixedVectorType::get(ElementType: Type::getInt32Ty(C&: Context), NumElts: 3); |
317 | case MVT::v4i32: |
318 | return FixedVectorType::get(ElementType: Type::getInt32Ty(C&: Context), NumElts: 4); |
319 | case MVT::v5i32: |
320 | return FixedVectorType::get(ElementType: Type::getInt32Ty(C&: Context), NumElts: 5); |
321 | case MVT::v6i32: |
322 | return FixedVectorType::get(ElementType: Type::getInt32Ty(C&: Context), NumElts: 6); |
323 | case MVT::v7i32: |
324 | return FixedVectorType::get(ElementType: Type::getInt32Ty(C&: Context), NumElts: 7); |
325 | case MVT::v8i32: |
326 | return FixedVectorType::get(ElementType: Type::getInt32Ty(C&: Context), NumElts: 8); |
327 | case MVT::v9i32: |
328 | return FixedVectorType::get(ElementType: Type::getInt32Ty(C&: Context), NumElts: 9); |
329 | case MVT::v10i32: |
330 | return FixedVectorType::get(ElementType: Type::getInt32Ty(C&: Context), NumElts: 10); |
331 | case MVT::v11i32: |
332 | return FixedVectorType::get(ElementType: Type::getInt32Ty(C&: Context), NumElts: 11); |
333 | case MVT::v12i32: |
334 | return FixedVectorType::get(ElementType: Type::getInt32Ty(C&: Context), NumElts: 12); |
335 | case MVT::v16i32: |
336 | return FixedVectorType::get(ElementType: Type::getInt32Ty(C&: Context), NumElts: 16); |
337 | case MVT::v32i32: |
338 | return FixedVectorType::get(ElementType: Type::getInt32Ty(C&: Context), NumElts: 32); |
339 | case MVT::v64i32: |
340 | return FixedVectorType::get(ElementType: Type::getInt32Ty(C&: Context), NumElts: 64); |
341 | case MVT::v128i32: |
342 | return FixedVectorType::get(ElementType: Type::getInt32Ty(C&: Context), NumElts: 128); |
343 | case MVT::v256i32: |
344 | return FixedVectorType::get(ElementType: Type::getInt32Ty(C&: Context), NumElts: 256); |
345 | case MVT::v512i32: |
346 | return FixedVectorType::get(ElementType: Type::getInt32Ty(C&: Context), NumElts: 512); |
347 | case MVT::v1024i32: |
348 | return FixedVectorType::get(ElementType: Type::getInt32Ty(C&: Context), NumElts: 1024); |
349 | case MVT::v2048i32: |
350 | return FixedVectorType::get(ElementType: Type::getInt32Ty(C&: Context), NumElts: 2048); |
351 | case MVT::v1i64: |
352 | return FixedVectorType::get(ElementType: Type::getInt64Ty(C&: Context), NumElts: 1); |
353 | case MVT::v2i64: |
354 | return FixedVectorType::get(ElementType: Type::getInt64Ty(C&: Context), NumElts: 2); |
355 | case MVT::v3i64: |
356 | return FixedVectorType::get(ElementType: Type::getInt64Ty(C&: Context), NumElts: 3); |
357 | case MVT::v4i64: |
358 | return FixedVectorType::get(ElementType: Type::getInt64Ty(C&: Context), NumElts: 4); |
359 | case MVT::v8i64: |
360 | return FixedVectorType::get(ElementType: Type::getInt64Ty(C&: Context), NumElts: 8); |
361 | case MVT::v16i64: |
362 | return FixedVectorType::get(ElementType: Type::getInt64Ty(C&: Context), NumElts: 16); |
363 | case MVT::v32i64: |
364 | return FixedVectorType::get(ElementType: Type::getInt64Ty(C&: Context), NumElts: 32); |
365 | case MVT::v64i64: |
366 | return FixedVectorType::get(ElementType: Type::getInt64Ty(C&: Context), NumElts: 64); |
367 | case MVT::v128i64: |
368 | return FixedVectorType::get(ElementType: Type::getInt64Ty(C&: Context), NumElts: 128); |
369 | case MVT::v256i64: |
370 | return FixedVectorType::get(ElementType: Type::getInt64Ty(C&: Context), NumElts: 256); |
371 | case MVT::v1i128: |
372 | return FixedVectorType::get(ElementType: Type::getInt128Ty(C&: Context), NumElts: 1); |
373 | case MVT::v1f16: |
374 | return FixedVectorType::get(ElementType: Type::getHalfTy(C&: Context), NumElts: 1); |
375 | case MVT::v2f16: |
376 | return FixedVectorType::get(ElementType: Type::getHalfTy(C&: Context), NumElts: 2); |
377 | case MVT::v3f16: |
378 | return FixedVectorType::get(ElementType: Type::getHalfTy(C&: Context), NumElts: 3); |
379 | case MVT::v4f16: |
380 | return FixedVectorType::get(ElementType: Type::getHalfTy(C&: Context), NumElts: 4); |
381 | case MVT::v8f16: |
382 | return FixedVectorType::get(ElementType: Type::getHalfTy(C&: Context), NumElts: 8); |
383 | case MVT::v16f16: |
384 | return FixedVectorType::get(ElementType: Type::getHalfTy(C&: Context), NumElts: 16); |
385 | case MVT::v32f16: |
386 | return FixedVectorType::get(ElementType: Type::getHalfTy(C&: Context), NumElts: 32); |
387 | case MVT::v64f16: |
388 | return FixedVectorType::get(ElementType: Type::getHalfTy(C&: Context), NumElts: 64); |
389 | case MVT::v128f16: |
390 | return FixedVectorType::get(ElementType: Type::getHalfTy(C&: Context), NumElts: 128); |
391 | case MVT::v256f16: |
392 | return FixedVectorType::get(ElementType: Type::getHalfTy(C&: Context), NumElts: 256); |
393 | case MVT::v512f16: |
394 | return FixedVectorType::get(ElementType: Type::getHalfTy(C&: Context), NumElts: 512); |
395 | case MVT::v2bf16: |
396 | return FixedVectorType::get(ElementType: Type::getBFloatTy(C&: Context), NumElts: 2); |
397 | case MVT::v3bf16: |
398 | return FixedVectorType::get(ElementType: Type::getBFloatTy(C&: Context), NumElts: 3); |
399 | case MVT::v4bf16: |
400 | return FixedVectorType::get(ElementType: Type::getBFloatTy(C&: Context), NumElts: 4); |
401 | case MVT::v8bf16: |
402 | return FixedVectorType::get(ElementType: Type::getBFloatTy(C&: Context), NumElts: 8); |
403 | case MVT::v16bf16: |
404 | return FixedVectorType::get(ElementType: Type::getBFloatTy(C&: Context), NumElts: 16); |
405 | case MVT::v32bf16: |
406 | return FixedVectorType::get(ElementType: Type::getBFloatTy(C&: Context), NumElts: 32); |
407 | case MVT::v64bf16: |
408 | return FixedVectorType::get(ElementType: Type::getBFloatTy(C&: Context), NumElts: 64); |
409 | case MVT::v128bf16: |
410 | return FixedVectorType::get(ElementType: Type::getBFloatTy(C&: Context), NumElts: 128); |
411 | case MVT::v1f32: |
412 | return FixedVectorType::get(ElementType: Type::getFloatTy(C&: Context), NumElts: 1); |
413 | case MVT::v2f32: |
414 | return FixedVectorType::get(ElementType: Type::getFloatTy(C&: Context), NumElts: 2); |
415 | case MVT::v3f32: |
416 | return FixedVectorType::get(ElementType: Type::getFloatTy(C&: Context), NumElts: 3); |
417 | case MVT::v4f32: |
418 | return FixedVectorType::get(ElementType: Type::getFloatTy(C&: Context), NumElts: 4); |
419 | case MVT::v5f32: |
420 | return FixedVectorType::get(ElementType: Type::getFloatTy(C&: Context), NumElts: 5); |
421 | case MVT::v6f32: |
422 | return FixedVectorType::get(ElementType: Type::getFloatTy(C&: Context), NumElts: 6); |
423 | case MVT::v7f32: |
424 | return FixedVectorType::get(ElementType: Type::getFloatTy(C&: Context), NumElts: 7); |
425 | case MVT::v8f32: |
426 | return FixedVectorType::get(ElementType: Type::getFloatTy(C&: Context), NumElts: 8); |
427 | case MVT::v9f32: |
428 | return FixedVectorType::get(ElementType: Type::getFloatTy(C&: Context), NumElts: 9); |
429 | case MVT::v10f32: |
430 | return FixedVectorType::get(ElementType: Type::getFloatTy(C&: Context), NumElts: 10); |
431 | case MVT::v11f32: |
432 | return FixedVectorType::get(ElementType: Type::getFloatTy(C&: Context), NumElts: 11); |
433 | case MVT::v12f32: |
434 | return FixedVectorType::get(ElementType: Type::getFloatTy(C&: Context), NumElts: 12); |
435 | case MVT::v16f32: |
436 | return FixedVectorType::get(ElementType: Type::getFloatTy(C&: Context), NumElts: 16); |
437 | case MVT::v32f32: |
438 | return FixedVectorType::get(ElementType: Type::getFloatTy(C&: Context), NumElts: 32); |
439 | case MVT::v64f32: |
440 | return FixedVectorType::get(ElementType: Type::getFloatTy(C&: Context), NumElts: 64); |
441 | case MVT::v128f32: |
442 | return FixedVectorType::get(ElementType: Type::getFloatTy(C&: Context), NumElts: 128); |
443 | case MVT::v256f32: |
444 | return FixedVectorType::get(ElementType: Type::getFloatTy(C&: Context), NumElts: 256); |
445 | case MVT::v512f32: |
446 | return FixedVectorType::get(ElementType: Type::getFloatTy(C&: Context), NumElts: 512); |
447 | case MVT::v1024f32: |
448 | return FixedVectorType::get(ElementType: Type::getFloatTy(C&: Context), NumElts: 1024); |
449 | case MVT::v2048f32: |
450 | return FixedVectorType::get(ElementType: Type::getFloatTy(C&: Context), NumElts: 2048); |
451 | case MVT::v1f64: |
452 | return FixedVectorType::get(ElementType: Type::getDoubleTy(C&: Context), NumElts: 1); |
453 | case MVT::v2f64: |
454 | return FixedVectorType::get(ElementType: Type::getDoubleTy(C&: Context), NumElts: 2); |
455 | case MVT::v3f64: |
456 | return FixedVectorType::get(ElementType: Type::getDoubleTy(C&: Context), NumElts: 3); |
457 | case MVT::v4f64: |
458 | return FixedVectorType::get(ElementType: Type::getDoubleTy(C&: Context), NumElts: 4); |
459 | case MVT::v8f64: |
460 | return FixedVectorType::get(ElementType: Type::getDoubleTy(C&: Context), NumElts: 8); |
461 | case MVT::v16f64: |
462 | return FixedVectorType::get(ElementType: Type::getDoubleTy(C&: Context), NumElts: 16); |
463 | case MVT::v32f64: |
464 | return FixedVectorType::get(ElementType: Type::getDoubleTy(C&: Context), NumElts: 32); |
465 | case MVT::v64f64: |
466 | return FixedVectorType::get(ElementType: Type::getDoubleTy(C&: Context), NumElts: 64); |
467 | case MVT::v128f64: |
468 | return FixedVectorType::get(ElementType: Type::getDoubleTy(C&: Context), NumElts: 128); |
469 | case MVT::v256f64: |
470 | return FixedVectorType::get(ElementType: Type::getDoubleTy(C&: Context), NumElts: 256); |
471 | case MVT::nxv1i1: |
472 | return ScalableVectorType::get(ElementType: Type::getInt1Ty(C&: Context), MinNumElts: 1); |
473 | case MVT::nxv2i1: |
474 | return ScalableVectorType::get(ElementType: Type::getInt1Ty(C&: Context), MinNumElts: 2); |
475 | case MVT::nxv4i1: |
476 | return ScalableVectorType::get(ElementType: Type::getInt1Ty(C&: Context), MinNumElts: 4); |
477 | case MVT::nxv8i1: |
478 | return ScalableVectorType::get(ElementType: Type::getInt1Ty(C&: Context), MinNumElts: 8); |
479 | case MVT::nxv16i1: |
480 | return ScalableVectorType::get(ElementType: Type::getInt1Ty(C&: Context), MinNumElts: 16); |
481 | case MVT::nxv32i1: |
482 | return ScalableVectorType::get(ElementType: Type::getInt1Ty(C&: Context), MinNumElts: 32); |
483 | case MVT::nxv64i1: |
484 | return ScalableVectorType::get(ElementType: Type::getInt1Ty(C&: Context), MinNumElts: 64); |
485 | case MVT::nxv1i8: |
486 | return ScalableVectorType::get(ElementType: Type::getInt8Ty(C&: Context), MinNumElts: 1); |
487 | case MVT::nxv2i8: |
488 | return ScalableVectorType::get(ElementType: Type::getInt8Ty(C&: Context), MinNumElts: 2); |
489 | case MVT::nxv4i8: |
490 | return ScalableVectorType::get(ElementType: Type::getInt8Ty(C&: Context), MinNumElts: 4); |
491 | case MVT::nxv8i8: |
492 | return ScalableVectorType::get(ElementType: Type::getInt8Ty(C&: Context), MinNumElts: 8); |
493 | case MVT::nxv16i8: |
494 | return ScalableVectorType::get(ElementType: Type::getInt8Ty(C&: Context), MinNumElts: 16); |
495 | case MVT::nxv32i8: |
496 | return ScalableVectorType::get(ElementType: Type::getInt8Ty(C&: Context), MinNumElts: 32); |
497 | case MVT::nxv64i8: |
498 | return ScalableVectorType::get(ElementType: Type::getInt8Ty(C&: Context), MinNumElts: 64); |
499 | case MVT::nxv1i16: |
500 | return ScalableVectorType::get(ElementType: Type::getInt16Ty(C&: Context), MinNumElts: 1); |
501 | case MVT::nxv2i16: |
502 | return ScalableVectorType::get(ElementType: Type::getInt16Ty(C&: Context), MinNumElts: 2); |
503 | case MVT::nxv4i16: |
504 | return ScalableVectorType::get(ElementType: Type::getInt16Ty(C&: Context), MinNumElts: 4); |
505 | case MVT::nxv8i16: |
506 | return ScalableVectorType::get(ElementType: Type::getInt16Ty(C&: Context), MinNumElts: 8); |
507 | case MVT::nxv16i16: |
508 | return ScalableVectorType::get(ElementType: Type::getInt16Ty(C&: Context), MinNumElts: 16); |
509 | case MVT::nxv32i16: |
510 | return ScalableVectorType::get(ElementType: Type::getInt16Ty(C&: Context), MinNumElts: 32); |
511 | case MVT::nxv1i32: |
512 | return ScalableVectorType::get(ElementType: Type::getInt32Ty(C&: Context), MinNumElts: 1); |
513 | case MVT::nxv2i32: |
514 | return ScalableVectorType::get(ElementType: Type::getInt32Ty(C&: Context), MinNumElts: 2); |
515 | case MVT::nxv4i32: |
516 | return ScalableVectorType::get(ElementType: Type::getInt32Ty(C&: Context), MinNumElts: 4); |
517 | case MVT::nxv8i32: |
518 | return ScalableVectorType::get(ElementType: Type::getInt32Ty(C&: Context), MinNumElts: 8); |
519 | case MVT::nxv16i32: |
520 | return ScalableVectorType::get(ElementType: Type::getInt32Ty(C&: Context), MinNumElts: 16); |
521 | case MVT::nxv32i32: |
522 | return ScalableVectorType::get(ElementType: Type::getInt32Ty(C&: Context), MinNumElts: 32); |
523 | case MVT::nxv1i64: |
524 | return ScalableVectorType::get(ElementType: Type::getInt64Ty(C&: Context), MinNumElts: 1); |
525 | case MVT::nxv2i64: |
526 | return ScalableVectorType::get(ElementType: Type::getInt64Ty(C&: Context), MinNumElts: 2); |
527 | case MVT::nxv4i64: |
528 | return ScalableVectorType::get(ElementType: Type::getInt64Ty(C&: Context), MinNumElts: 4); |
529 | case MVT::nxv8i64: |
530 | return ScalableVectorType::get(ElementType: Type::getInt64Ty(C&: Context), MinNumElts: 8); |
531 | case MVT::nxv16i64: |
532 | return ScalableVectorType::get(ElementType: Type::getInt64Ty(C&: Context), MinNumElts: 16); |
533 | case MVT::nxv32i64: |
534 | return ScalableVectorType::get(ElementType: Type::getInt64Ty(C&: Context), MinNumElts: 32); |
535 | case MVT::nxv1f16: |
536 | return ScalableVectorType::get(ElementType: Type::getHalfTy(C&: Context), MinNumElts: 1); |
537 | case MVT::nxv2f16: |
538 | return ScalableVectorType::get(ElementType: Type::getHalfTy(C&: Context), MinNumElts: 2); |
539 | case MVT::nxv4f16: |
540 | return ScalableVectorType::get(ElementType: Type::getHalfTy(C&: Context), MinNumElts: 4); |
541 | case MVT::nxv8f16: |
542 | return ScalableVectorType::get(ElementType: Type::getHalfTy(C&: Context), MinNumElts: 8); |
543 | case MVT::nxv16f16: |
544 | return ScalableVectorType::get(ElementType: Type::getHalfTy(C&: Context), MinNumElts: 16); |
545 | case MVT::nxv32f16: |
546 | return ScalableVectorType::get(ElementType: Type::getHalfTy(C&: Context), MinNumElts: 32); |
547 | case MVT::nxv1bf16: |
548 | return ScalableVectorType::get(ElementType: Type::getBFloatTy(C&: Context), MinNumElts: 1); |
549 | case MVT::nxv2bf16: |
550 | return ScalableVectorType::get(ElementType: Type::getBFloatTy(C&: Context), MinNumElts: 2); |
551 | case MVT::nxv4bf16: |
552 | return ScalableVectorType::get(ElementType: Type::getBFloatTy(C&: Context), MinNumElts: 4); |
553 | case MVT::nxv8bf16: |
554 | return ScalableVectorType::get(ElementType: Type::getBFloatTy(C&: Context), MinNumElts: 8); |
555 | case MVT::nxv16bf16: |
556 | return ScalableVectorType::get(ElementType: Type::getBFloatTy(C&: Context), MinNumElts: 16); |
557 | case MVT::nxv32bf16: |
558 | return ScalableVectorType::get(ElementType: Type::getBFloatTy(C&: Context), MinNumElts: 32); |
559 | case MVT::nxv1f32: |
560 | return ScalableVectorType::get(ElementType: Type::getFloatTy(C&: Context), MinNumElts: 1); |
561 | case MVT::nxv2f32: |
562 | return ScalableVectorType::get(ElementType: Type::getFloatTy(C&: Context), MinNumElts: 2); |
563 | case MVT::nxv4f32: |
564 | return ScalableVectorType::get(ElementType: Type::getFloatTy(C&: Context), MinNumElts: 4); |
565 | case MVT::nxv8f32: |
566 | return ScalableVectorType::get(ElementType: Type::getFloatTy(C&: Context), MinNumElts: 8); |
567 | case MVT::nxv16f32: |
568 | return ScalableVectorType::get(ElementType: Type::getFloatTy(C&: Context), MinNumElts: 16); |
569 | case MVT::nxv1f64: |
570 | return ScalableVectorType::get(ElementType: Type::getDoubleTy(C&: Context), MinNumElts: 1); |
571 | case MVT::nxv2f64: |
572 | return ScalableVectorType::get(ElementType: Type::getDoubleTy(C&: Context), MinNumElts: 2); |
573 | case MVT::nxv4f64: |
574 | return ScalableVectorType::get(ElementType: Type::getDoubleTy(C&: Context), MinNumElts: 4); |
575 | case MVT::nxv8f64: |
576 | return ScalableVectorType::get(ElementType: Type::getDoubleTy(C&: Context), MinNumElts: 8); |
577 | case MVT::Metadata: return Type::getMetadataTy(C&: Context); |
578 | } |
579 | // clang-format on |
580 | } |
581 | |
582 | /// Return the value type corresponding to the specified type. This returns all |
583 | /// pointers as MVT::iPTR. If HandleUnknown is true, unknown types are returned |
584 | /// as Other, otherwise they are invalid. |
585 | MVT MVT::getVT(Type *Ty, bool HandleUnknown){ |
586 | assert(Ty != nullptr && "Invalid type" ); |
587 | switch (Ty->getTypeID()) { |
588 | default: |
589 | if (HandleUnknown) return MVT(MVT::Other); |
590 | llvm_unreachable("Unknown type!" ); |
591 | case Type::VoidTyID: |
592 | return MVT::isVoid; |
593 | case Type::IntegerTyID: |
594 | return getIntegerVT(BitWidth: cast<IntegerType>(Val: Ty)->getBitWidth()); |
595 | case Type::HalfTyID: return MVT(MVT::f16); |
596 | case Type::BFloatTyID: return MVT(MVT::bf16); |
597 | case Type::FloatTyID: return MVT(MVT::f32); |
598 | case Type::DoubleTyID: return MVT(MVT::f64); |
599 | case Type::X86_FP80TyID: return MVT(MVT::f80); |
600 | case Type::X86_MMXTyID: return MVT(MVT::x86mmx); |
601 | case Type::TargetExtTyID: { |
602 | TargetExtType *TargetExtTy = cast<TargetExtType>(Val: Ty); |
603 | if (TargetExtTy->getName() == "aarch64.svcount" ) |
604 | return MVT(MVT::aarch64svcount); |
605 | else if (TargetExtTy->getName().starts_with("spirv." )) |
606 | return MVT(MVT::spirvbuiltin); |
607 | if (HandleUnknown) |
608 | return MVT(MVT::Other); |
609 | llvm_unreachable("Unknown target ext type!" ); |
610 | } |
611 | case Type::X86_AMXTyID: return MVT(MVT::x86amx); |
612 | case Type::FP128TyID: return MVT(MVT::f128); |
613 | case Type::PPC_FP128TyID: return MVT(MVT::ppcf128); |
614 | case Type::PointerTyID: return MVT(MVT::iPTR); |
615 | case Type::FixedVectorTyID: |
616 | case Type::ScalableVectorTyID: { |
617 | VectorType *VTy = cast<VectorType>(Val: Ty); |
618 | return getVectorVT( |
619 | VT: getVT(Ty: VTy->getElementType(), /*HandleUnknown=*/ false), |
620 | EC: VTy->getElementCount()); |
621 | } |
622 | } |
623 | } |
624 | |
625 | /// getEVT - Return the value type corresponding to the specified type. This |
626 | /// returns all pointers as MVT::iPTR. If HandleUnknown is true, unknown types |
627 | /// are returned as Other, otherwise they are invalid. |
628 | EVT EVT::getEVT(Type *Ty, bool HandleUnknown){ |
629 | switch (Ty->getTypeID()) { |
630 | default: |
631 | return MVT::getVT(Ty, HandleUnknown); |
632 | case Type::TokenTyID: |
633 | return MVT::Untyped; |
634 | case Type::IntegerTyID: |
635 | return getIntegerVT(Context&: Ty->getContext(), BitWidth: cast<IntegerType>(Val: Ty)->getBitWidth()); |
636 | case Type::FixedVectorTyID: |
637 | case Type::ScalableVectorTyID: { |
638 | VectorType *VTy = cast<VectorType>(Val: Ty); |
639 | return getVectorVT(Context&: Ty->getContext(), |
640 | VT: getEVT(Ty: VTy->getElementType(), /*HandleUnknown=*/ false), |
641 | EC: VTy->getElementCount()); |
642 | } |
643 | } |
644 | } |
645 | |
646 | #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) |
647 | void MVT::dump() const { |
648 | print(OS&: dbgs()); |
649 | dbgs() << "\n" ; |
650 | } |
651 | #endif |
652 | |
653 | void MVT::print(raw_ostream &OS) const { |
654 | if (SimpleTy == INVALID_SIMPLE_VALUE_TYPE) |
655 | OS << "invalid" ; |
656 | else |
657 | OS << EVT(*this).getEVTString(); |
658 | } |
659 | |
660 | |