clang 23.0.0git
CIRGenBuiltinAArch64.cpp
Go to the documentation of this file.
1//===---- CIRGenBuiltinAArch64.cpp - Emit CIR for AArch64 builtins --------===//
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 contains code to emit ARM64 Builtin calls as CIR or a function call
10// to be later resolved.
11//
12//===----------------------------------------------------------------------===//
13
14#include "CIRGenBuilder.h"
15#include "CIRGenFunction.h"
18
19// TODO(cir): once all builtins are covered, decide whether we still
20// need to use LLVM intrinsics or if there's a better approach to follow. Right
21// now the intrinsics are reused to make it convenient to encode all thousands
22// of them and passing down to LLVM lowering.
23#include "llvm/IR/Intrinsics.h"
24#include "llvm/IR/IntrinsicsAArch64.h"
25
26#include "mlir/IR/Value.h"
29
30using namespace clang;
31using namespace clang::CIRGen;
32using namespace llvm;
33
34// Generate vscale * scalingFactor
35static mlir::Value genVscaleTimesFactor(mlir::Location loc,
36 CIRGenBuilderTy builder,
37 mlir::Type cirTy,
38 int32_t scalingFactor) {
39 mlir::Value vscale = builder.emitIntrinsicCallOp(loc, "vscale", cirTy);
40 return builder.createNUWAMul(loc, vscale,
41 builder.getUInt64(scalingFactor, loc));
42}
43
45
46namespace {
47struct AArch64BuiltinInfo {
48 unsigned builtinID;
49 unsigned llvmIntrinsic;
50 uint64_t typeModifier;
51
52 bool operator<(unsigned rhsBuiltinID) const {
53 return builtinID < rhsBuiltinID;
54 }
55 bool operator<(const AArch64BuiltinInfo &te) const {
56 return builtinID < te.builtinID;
57 }
58};
59} // end anonymous namespace
60
61#define SVEMAP1(NameBase, llvmIntrinsic, TypeModifier) \
62 {SVE::BI__builtin_sve_##NameBase, Intrinsic::llvmIntrinsic, TypeModifier}
63
64#define SVEMAP2(NameBase, TypeModifier) \
65 {SVE::BI__builtin_sve_##NameBase, 0, TypeModifier}
66static const AArch64BuiltinInfo aarch64SVEIntrinsicMap[] = {
67#define GET_SVE_LLVM_INTRINSIC_MAP
68#include "clang/Basic/arm_sve_builtin_cg.inc"
69#undef GET_SVE_LLVM_INTRINSIC_MAP
70};
71
72static const AArch64BuiltinInfo *
74 unsigned builtinID, bool &mapProvenSorted) {
75
76#ifndef NDEBUG
77 if (!mapProvenSorted) {
78 assert(llvm::is_sorted(intrinsicMap));
79 mapProvenSorted = true;
80 }
81#endif
82
83 const AArch64BuiltinInfo *info = llvm::lower_bound(intrinsicMap, builtinID);
84
85 if (info != intrinsicMap.end() && info->builtinID == builtinID)
86 return info;
87
88 return nullptr;
89}
90
92 unsigned builtinID, const CallExpr *expr, SmallVectorImpl<mlir::Value> &ops,
93 SVETypeFlags typeFlags) {
94 // Find out if any arguments are required to be integer constant expressions.
95 unsigned iceArguments = 0;
97 getContext().GetBuiltinType(builtinID, error, &iceArguments);
98 assert(error == ASTContext::GE_None && "Should not codegen an error");
99
100 for (unsigned i = 0, e = expr->getNumArgs(); i != e; i++) {
101 bool isIce = iceArguments & (1 << i);
102 mlir::Value arg = emitScalarExpr(expr->getArg(i));
103
104 if (isIce) {
105 cgm.errorNYI(expr->getSourceRange(),
106 std::string("unimplemented AArch64 builtin call: ") +
107 getContext().BuiltinInfo.getName(builtinID));
108 }
109
110 // FIXME: Handle types like svint16x2_t, which are currently incorrectly
111 // converted to i32. These should be treated as structs and unpacked.
112
113 ops.push_back(arg);
114 }
115 return true;
116}
117
118std::optional<mlir::Value>
120 const CallExpr *expr) {
121 if (builtinID >= SVE::BI__builtin_sve_reinterpret_s8_s8 &&
122 builtinID <= SVE::BI__builtin_sve_reinterpret_f64_f64_x4) {
123 cgm.errorNYI(expr->getSourceRange(),
124 std::string("unimplemented AArch64 builtin call: ") +
125 getContext().BuiltinInfo.getName(builtinID));
126 return mlir::Value{};
127 }
128
130
131 auto *builtinIntrInfo = findARMVectorIntrinsicInMap(
133
134 // The operands of the builtin call
136
137 SVETypeFlags typeFlags(builtinIntrInfo->typeModifier);
139 typeFlags))
140 return mlir::Value{};
141
142 if (typeFlags.isLoad() || typeFlags.isStore() || typeFlags.isGatherLoad() ||
143 typeFlags.isScatterStore() || typeFlags.isPrefetch() ||
144 typeFlags.isGatherPrefetch() || typeFlags.isStructLoad() ||
145 typeFlags.isStructStore() || typeFlags.isTupleSet() ||
146 typeFlags.isTupleGet() || typeFlags.isTupleCreate() ||
147 typeFlags.isUndef())
148 cgm.errorNYI(expr->getSourceRange(),
149 std::string("unimplemented AArch64 builtin call: ") +
150 getContext().BuiltinInfo.getName(builtinID));
151
152 mlir::Location loc = getLoc(expr->getExprLoc());
153
154 // Handle built-ins for which there is a corresponding LLVM Intrinsic.
155 // -------------------------------------------------------------------
156 if (builtinIntrInfo->llvmIntrinsic != 0) {
157 // Emit set FPMR for intrinsics that require it.
158 if (typeFlags.setsFPMR())
159 cgm.errorNYI(expr->getSourceRange(),
160 std::string("unimplemented AArch64 builtin call: ") +
161 getContext().BuiltinInfo.getName(builtinID));
162
163 if (typeFlags.getMergeType() == SVETypeFlags::MergeZeroExp)
164 cgm.errorNYI(expr->getSourceRange(),
165 std::string("unimplemented AArch64 builtin call: ") +
166 getContext().BuiltinInfo.getName(builtinID));
167
168 if (typeFlags.getMergeType() == SVETypeFlags::MergeAnyExp)
169 cgm.errorNYI(expr->getSourceRange(),
170 std::string("unimplemented AArch64 builtin call: ") +
171 getContext().BuiltinInfo.getName(builtinID));
172
173 // Some ACLE builtins leave out the argument to specify the predicate
174 // pattern, which is expected to be expanded to an SV_ALL pattern.
175 if (typeFlags.isAppendSVALL())
176 cgm.errorNYI(expr->getSourceRange(),
177 std::string("unimplemented AArch64 builtin call: ") +
178 getContext().BuiltinInfo.getName(builtinID));
179 if (typeFlags.isInsertOp1SVALL())
180 cgm.errorNYI(expr->getSourceRange(),
181 std::string("unimplemented AArch64 builtin call: ") +
182 getContext().BuiltinInfo.getName(builtinID));
183
184 // Predicates must match the main datatype.
185 for (mlir::Value &op : ops)
186 if (auto predTy = dyn_cast<mlir::VectorType>(op.getType()))
187 if (predTy.getElementType().isInteger(1))
188 cgm.errorNYI(expr->getSourceRange(),
189 std::string("unimplemented AArch64 builtin call: ") +
190 getContext().BuiltinInfo.getName(builtinID));
191
192 // Splat scalar operand to vector (intrinsics with _n infix)
193 if (typeFlags.hasSplatOperand()) {
194 cgm.errorNYI(expr->getSourceRange(),
195 std::string("unimplemented AArch64 builtin call: ") +
196 getContext().BuiltinInfo.getName(builtinID));
197 }
198
199 if (typeFlags.isReverseCompare())
200 cgm.errorNYI(expr->getSourceRange(),
201 std::string("unimplemented AArch64 builtin call: ") +
202 getContext().BuiltinInfo.getName(builtinID));
203 if (typeFlags.isReverseUSDOT())
204 cgm.errorNYI(expr->getSourceRange(),
205 std::string("unimplemented AArch64 builtin call: ") +
206 getContext().BuiltinInfo.getName(builtinID));
207 if (typeFlags.isReverseMergeAnyBinOp() &&
208 typeFlags.getMergeType() == SVETypeFlags::MergeAny)
209 cgm.errorNYI(expr->getSourceRange(),
210 std::string("unimplemented AArch64 builtin call: ") +
211 getContext().BuiltinInfo.getName(builtinID));
212 if (typeFlags.isReverseMergeAnyAccOp() &&
213 typeFlags.getMergeType() == SVETypeFlags::MergeAny)
214 cgm.errorNYI(expr->getSourceRange(),
215 std::string("unimplemented AArch64 builtin call: ") +
216 getContext().BuiltinInfo.getName(builtinID));
217
218 // Predicated intrinsics with _z suffix.
219 if (typeFlags.getMergeType() == SVETypeFlags::MergeZero) {
220 cgm.errorNYI(expr->getSourceRange(),
221 std::string("unimplemented AArch64 builtin call: ") +
222 getContext().BuiltinInfo.getName(builtinID));
223 }
224
225 std::string llvmIntrName(Intrinsic::getBaseName(
226 (llvm::Intrinsic::ID)builtinIntrInfo->llvmIntrinsic));
227
228 llvmIntrName.erase(0, /*std::strlen(".llvm")=*/5);
229
230 auto retTy = convertType(expr->getType());
231
232 auto call = builder.emitIntrinsicCallOp(loc, llvmIntrName, retTy,
233 mlir::ValueRange{ops});
234 if (call.getType() == retTy)
235 return call;
236
237 // Predicate results must be converted to svbool_t.
238 if (isa<mlir::VectorType>(retTy) &&
239 cast<mlir::VectorType>(retTy).isScalable())
240 cgm.errorNYI(expr->getSourceRange(),
241 std::string("unimplemented AArch64 builtin call: ") +
242 getContext().BuiltinInfo.getName(builtinID));
243 // TODO Handle struct types, e.g. svint8x2_t (update the converter first).
244
245 llvm_unreachable("unsupported element count!");
246 }
247
248 // Handle the remaining built-ins.
249 // -------------------------------
250 switch (builtinID) {
251 default:
252 return std::nullopt;
253
254 case SVE::BI__builtin_sve_svreinterpret_b:
255 case SVE::BI__builtin_sve_svreinterpret_c:
256 case SVE::BI__builtin_sve_svpsel_lane_b8:
257 case SVE::BI__builtin_sve_svpsel_lane_b16:
258 case SVE::BI__builtin_sve_svpsel_lane_b32:
259 case SVE::BI__builtin_sve_svpsel_lane_b64:
260 case SVE::BI__builtin_sve_svpsel_lane_c8:
261 case SVE::BI__builtin_sve_svpsel_lane_c16:
262 case SVE::BI__builtin_sve_svpsel_lane_c32:
263 case SVE::BI__builtin_sve_svpsel_lane_c64:
264 case SVE::BI__builtin_sve_svmov_b_z:
265 case SVE::BI__builtin_sve_svnot_b_z:
266 case SVE::BI__builtin_sve_svmovlb_u16:
267 case SVE::BI__builtin_sve_svmovlb_u32:
268 case SVE::BI__builtin_sve_svmovlb_u64:
269 case SVE::BI__builtin_sve_svmovlb_s16:
270 case SVE::BI__builtin_sve_svmovlb_s32:
271 case SVE::BI__builtin_sve_svmovlb_s64:
272 case SVE::BI__builtin_sve_svmovlt_u16:
273 case SVE::BI__builtin_sve_svmovlt_u32:
274 case SVE::BI__builtin_sve_svmovlt_u64:
275 case SVE::BI__builtin_sve_svmovlt_s16:
276 case SVE::BI__builtin_sve_svmovlt_s32:
277 case SVE::BI__builtin_sve_svmovlt_s64:
278 case SVE::BI__builtin_sve_svpmullt_u16:
279 case SVE::BI__builtin_sve_svpmullt_u64:
280 case SVE::BI__builtin_sve_svpmullt_n_u16:
281 case SVE::BI__builtin_sve_svpmullt_n_u64:
282 case SVE::BI__builtin_sve_svpmullb_u16:
283 case SVE::BI__builtin_sve_svpmullb_u64:
284 case SVE::BI__builtin_sve_svpmullb_n_u16:
285 case SVE::BI__builtin_sve_svpmullb_n_u64:
286
287 case SVE::BI__builtin_sve_svdup_n_b8:
288 case SVE::BI__builtin_sve_svdup_n_b16:
289 case SVE::BI__builtin_sve_svdup_n_b32:
290 case SVE::BI__builtin_sve_svdup_n_b64:
291
292 case SVE::BI__builtin_sve_svdupq_n_b8:
293 case SVE::BI__builtin_sve_svdupq_n_b16:
294 case SVE::BI__builtin_sve_svdupq_n_b32:
295 case SVE::BI__builtin_sve_svdupq_n_b64:
296 case SVE::BI__builtin_sve_svdupq_n_u8:
297 case SVE::BI__builtin_sve_svdupq_n_s8:
298 case SVE::BI__builtin_sve_svdupq_n_u64:
299 case SVE::BI__builtin_sve_svdupq_n_f64:
300 case SVE::BI__builtin_sve_svdupq_n_s64:
301 case SVE::BI__builtin_sve_svdupq_n_u16:
302 case SVE::BI__builtin_sve_svdupq_n_f16:
303 case SVE::BI__builtin_sve_svdupq_n_bf16:
304 case SVE::BI__builtin_sve_svdupq_n_s16:
305 case SVE::BI__builtin_sve_svdupq_n_u32:
306 case SVE::BI__builtin_sve_svdupq_n_f32:
307 case SVE::BI__builtin_sve_svdupq_n_s32:
308 case SVE::BI__builtin_sve_svpfalse_b:
309 case SVE::BI__builtin_sve_svpfalse_c:
310 cgm.errorNYI(expr->getSourceRange(),
311 std::string("unimplemented AArch64 builtin call: ") +
312 getContext().BuiltinInfo.getName(builtinID));
313 return mlir::Value{};
314
315 case SVE::BI__builtin_sve_svlen_u8:
316 case SVE::BI__builtin_sve_svlen_s8:
317 return genVscaleTimesFactor(loc, builder, convertType(expr->getType()), 16);
318
319 case SVE::BI__builtin_sve_svlen_u16:
320 case SVE::BI__builtin_sve_svlen_s16:
321 case SVE::BI__builtin_sve_svlen_f16:
322 case SVE::BI__builtin_sve_svlen_bf16:
323 return genVscaleTimesFactor(loc, builder, convertType(expr->getType()), 8);
324
325 case SVE::BI__builtin_sve_svlen_u32:
326 case SVE::BI__builtin_sve_svlen_s32:
327 case SVE::BI__builtin_sve_svlen_f32:
328 return genVscaleTimesFactor(loc, builder, convertType(expr->getType()), 4);
329
330 case SVE::BI__builtin_sve_svlen_u64:
331 case SVE::BI__builtin_sve_svlen_s64:
332 case SVE::BI__builtin_sve_svlen_f64:
333 return genVscaleTimesFactor(loc, builder, convertType(expr->getType()), 2);
334
335 case SVE::BI__builtin_sve_svtbl2_u8:
336 case SVE::BI__builtin_sve_svtbl2_s8:
337 case SVE::BI__builtin_sve_svtbl2_u16:
338 case SVE::BI__builtin_sve_svtbl2_s16:
339 case SVE::BI__builtin_sve_svtbl2_u32:
340 case SVE::BI__builtin_sve_svtbl2_s32:
341 case SVE::BI__builtin_sve_svtbl2_u64:
342 case SVE::BI__builtin_sve_svtbl2_s64:
343 case SVE::BI__builtin_sve_svtbl2_f16:
344 case SVE::BI__builtin_sve_svtbl2_bf16:
345 case SVE::BI__builtin_sve_svtbl2_f32:
346 case SVE::BI__builtin_sve_svtbl2_f64:
347 case SVE::BI__builtin_sve_svset_neonq_s8:
348 case SVE::BI__builtin_sve_svset_neonq_s16:
349 case SVE::BI__builtin_sve_svset_neonq_s32:
350 case SVE::BI__builtin_sve_svset_neonq_s64:
351 case SVE::BI__builtin_sve_svset_neonq_u8:
352 case SVE::BI__builtin_sve_svset_neonq_u16:
353 case SVE::BI__builtin_sve_svset_neonq_u32:
354 case SVE::BI__builtin_sve_svset_neonq_u64:
355 case SVE::BI__builtin_sve_svset_neonq_f16:
356 case SVE::BI__builtin_sve_svset_neonq_f32:
357 case SVE::BI__builtin_sve_svset_neonq_f64:
358 case SVE::BI__builtin_sve_svset_neonq_bf16:
359 case SVE::BI__builtin_sve_svget_neonq_s8:
360 case SVE::BI__builtin_sve_svget_neonq_s16:
361 case SVE::BI__builtin_sve_svget_neonq_s32:
362 case SVE::BI__builtin_sve_svget_neonq_s64:
363 case SVE::BI__builtin_sve_svget_neonq_u8:
364 case SVE::BI__builtin_sve_svget_neonq_u16:
365 case SVE::BI__builtin_sve_svget_neonq_u32:
366 case SVE::BI__builtin_sve_svget_neonq_u64:
367 case SVE::BI__builtin_sve_svget_neonq_f16:
368 case SVE::BI__builtin_sve_svget_neonq_f32:
369 case SVE::BI__builtin_sve_svget_neonq_f64:
370 case SVE::BI__builtin_sve_svget_neonq_bf16:
371 case SVE::BI__builtin_sve_svdup_neonq_s8:
372 case SVE::BI__builtin_sve_svdup_neonq_s16:
373 case SVE::BI__builtin_sve_svdup_neonq_s32:
374 case SVE::BI__builtin_sve_svdup_neonq_s64:
375 case SVE::BI__builtin_sve_svdup_neonq_u8:
376 case SVE::BI__builtin_sve_svdup_neonq_u16:
377 case SVE::BI__builtin_sve_svdup_neonq_u32:
378 case SVE::BI__builtin_sve_svdup_neonq_u64:
379 case SVE::BI__builtin_sve_svdup_neonq_f16:
380 case SVE::BI__builtin_sve_svdup_neonq_f32:
381 case SVE::BI__builtin_sve_svdup_neonq_f64:
382 case SVE::BI__builtin_sve_svdup_neonq_bf16:
383 cgm.errorNYI(expr->getSourceRange(),
384 std::string("unimplemented AArch64 builtin call: ") +
385 getContext().BuiltinInfo.getName(builtinID));
386 return mlir::Value{};
387 }
388
389 // Unreachable: All cases in the switch above return.
390}
391
392std::optional<mlir::Value>
394 const CallExpr *expr) {
396
397 cgm.errorNYI(expr->getSourceRange(),
398 std::string("unimplemented AArch64 builtin call: ") +
399 getContext().BuiltinInfo.getName(builtinID));
400 return mlir::Value{};
401}
402
403// Some intrinsics are equivalent for codegen.
404static const std::pair<unsigned, unsigned> neonEquivalentIntrinsicMap[] = {
405 {
406 NEON::BI__builtin_neon_splat_lane_bf16,
407 NEON::BI__builtin_neon_splat_lane_v,
408 },
409 {
410 NEON::BI__builtin_neon_splat_laneq_bf16,
411 NEON::BI__builtin_neon_splat_laneq_v,
412 },
413 {
414 NEON::BI__builtin_neon_splatq_lane_bf16,
415 NEON::BI__builtin_neon_splatq_lane_v,
416 },
417 {
418 NEON::BI__builtin_neon_splatq_laneq_bf16,
419 NEON::BI__builtin_neon_splatq_laneq_v,
420 },
421 {
422 NEON::BI__builtin_neon_vabd_f16,
423 NEON::BI__builtin_neon_vabd_v,
424 },
425 {
426 NEON::BI__builtin_neon_vabdq_f16,
427 NEON::BI__builtin_neon_vabdq_v,
428 },
429 {
430 NEON::BI__builtin_neon_vabs_f16,
431 NEON::BI__builtin_neon_vabs_v,
432 },
433 {
434 NEON::BI__builtin_neon_vabsq_f16,
435 NEON::BI__builtin_neon_vabsq_v,
436 },
437 {
438 NEON::BI__builtin_neon_vcage_f16,
439 NEON::BI__builtin_neon_vcage_v,
440 },
441 {
442 NEON::BI__builtin_neon_vcageq_f16,
443 NEON::BI__builtin_neon_vcageq_v,
444 },
445 {
446 NEON::BI__builtin_neon_vcagt_f16,
447 NEON::BI__builtin_neon_vcagt_v,
448 },
449 {
450 NEON::BI__builtin_neon_vcagtq_f16,
451 NEON::BI__builtin_neon_vcagtq_v,
452 },
453 {
454 NEON::BI__builtin_neon_vcale_f16,
455 NEON::BI__builtin_neon_vcale_v,
456 },
457 {
458 NEON::BI__builtin_neon_vcaleq_f16,
459 NEON::BI__builtin_neon_vcaleq_v,
460 },
461 {
462 NEON::BI__builtin_neon_vcalt_f16,
463 NEON::BI__builtin_neon_vcalt_v,
464 },
465 {
466 NEON::BI__builtin_neon_vcaltq_f16,
467 NEON::BI__builtin_neon_vcaltq_v,
468 },
469 {
470 NEON::BI__builtin_neon_vceqz_f16,
471 NEON::BI__builtin_neon_vceqz_v,
472 },
473 {
474 NEON::BI__builtin_neon_vceqzq_f16,
475 NEON::BI__builtin_neon_vceqzq_v,
476 },
477 {
478 NEON::BI__builtin_neon_vcgez_f16,
479 NEON::BI__builtin_neon_vcgez_v,
480 },
481 {
482 NEON::BI__builtin_neon_vcgezq_f16,
483 NEON::BI__builtin_neon_vcgezq_v,
484 },
485 {
486 NEON::BI__builtin_neon_vcgtz_f16,
487 NEON::BI__builtin_neon_vcgtz_v,
488 },
489 {
490 NEON::BI__builtin_neon_vcgtzq_f16,
491 NEON::BI__builtin_neon_vcgtzq_v,
492 },
493 {
494 NEON::BI__builtin_neon_vclez_f16,
495 NEON::BI__builtin_neon_vclez_v,
496 },
497 {
498 NEON::BI__builtin_neon_vclezq_f16,
499 NEON::BI__builtin_neon_vclezq_v,
500 },
501 {
502 NEON::BI__builtin_neon_vcltz_f16,
503 NEON::BI__builtin_neon_vcltz_v,
504 },
505 {
506 NEON::BI__builtin_neon_vcltzq_f16,
507 NEON::BI__builtin_neon_vcltzq_v,
508 },
509 {
510 NEON::BI__builtin_neon_vfma_f16,
511 NEON::BI__builtin_neon_vfma_v,
512 },
513 {
514 NEON::BI__builtin_neon_vfma_lane_f16,
515 NEON::BI__builtin_neon_vfma_lane_v,
516 },
517 {
518 NEON::BI__builtin_neon_vfma_laneq_f16,
519 NEON::BI__builtin_neon_vfma_laneq_v,
520 },
521 {
522 NEON::BI__builtin_neon_vfmaq_f16,
523 NEON::BI__builtin_neon_vfmaq_v,
524 },
525 {
526 NEON::BI__builtin_neon_vfmaq_lane_f16,
527 NEON::BI__builtin_neon_vfmaq_lane_v,
528 },
529 {
530 NEON::BI__builtin_neon_vfmaq_laneq_f16,
531 NEON::BI__builtin_neon_vfmaq_laneq_v,
532 },
533 {NEON::BI__builtin_neon_vld1_bf16_x2, NEON::BI__builtin_neon_vld1_x2_v},
534 {NEON::BI__builtin_neon_vld1_bf16_x3, NEON::BI__builtin_neon_vld1_x3_v},
535 {NEON::BI__builtin_neon_vld1_bf16_x4, NEON::BI__builtin_neon_vld1_x4_v},
536 {NEON::BI__builtin_neon_vld1_bf16, NEON::BI__builtin_neon_vld1_v},
537 {NEON::BI__builtin_neon_vld1_dup_bf16, NEON::BI__builtin_neon_vld1_dup_v},
538 {NEON::BI__builtin_neon_vld1_lane_bf16, NEON::BI__builtin_neon_vld1_lane_v},
539 {NEON::BI__builtin_neon_vld1q_bf16_x2, NEON::BI__builtin_neon_vld1q_x2_v},
540 {NEON::BI__builtin_neon_vld1q_bf16_x3, NEON::BI__builtin_neon_vld1q_x3_v},
541 {NEON::BI__builtin_neon_vld1q_bf16_x4, NEON::BI__builtin_neon_vld1q_x4_v},
542 {NEON::BI__builtin_neon_vld1q_bf16, NEON::BI__builtin_neon_vld1q_v},
543 {NEON::BI__builtin_neon_vld1q_dup_bf16, NEON::BI__builtin_neon_vld1q_dup_v},
544 {NEON::BI__builtin_neon_vld1q_lane_bf16,
545 NEON::BI__builtin_neon_vld1q_lane_v},
546 {NEON::BI__builtin_neon_vld2_bf16, NEON::BI__builtin_neon_vld2_v},
547 {NEON::BI__builtin_neon_vld2_dup_bf16, NEON::BI__builtin_neon_vld2_dup_v},
548 {NEON::BI__builtin_neon_vld2_lane_bf16, NEON::BI__builtin_neon_vld2_lane_v},
549 {NEON::BI__builtin_neon_vld2q_bf16, NEON::BI__builtin_neon_vld2q_v},
550 {NEON::BI__builtin_neon_vld2q_dup_bf16, NEON::BI__builtin_neon_vld2q_dup_v},
551 {NEON::BI__builtin_neon_vld2q_lane_bf16,
552 NEON::BI__builtin_neon_vld2q_lane_v},
553 {NEON::BI__builtin_neon_vld3_bf16, NEON::BI__builtin_neon_vld3_v},
554 {NEON::BI__builtin_neon_vld3_dup_bf16, NEON::BI__builtin_neon_vld3_dup_v},
555 {NEON::BI__builtin_neon_vld3_lane_bf16, NEON::BI__builtin_neon_vld3_lane_v},
556 {NEON::BI__builtin_neon_vld3q_bf16, NEON::BI__builtin_neon_vld3q_v},
557 {NEON::BI__builtin_neon_vld3q_dup_bf16, NEON::BI__builtin_neon_vld3q_dup_v},
558 {NEON::BI__builtin_neon_vld3q_lane_bf16,
559 NEON::BI__builtin_neon_vld3q_lane_v},
560 {NEON::BI__builtin_neon_vld4_bf16, NEON::BI__builtin_neon_vld4_v},
561 {NEON::BI__builtin_neon_vld4_dup_bf16, NEON::BI__builtin_neon_vld4_dup_v},
562 {NEON::BI__builtin_neon_vld4_lane_bf16, NEON::BI__builtin_neon_vld4_lane_v},
563 {NEON::BI__builtin_neon_vld4q_bf16, NEON::BI__builtin_neon_vld4q_v},
564 {NEON::BI__builtin_neon_vld4q_dup_bf16, NEON::BI__builtin_neon_vld4q_dup_v},
565 {NEON::BI__builtin_neon_vld4q_lane_bf16,
566 NEON::BI__builtin_neon_vld4q_lane_v},
567 {
568 NEON::BI__builtin_neon_vmax_f16,
569 NEON::BI__builtin_neon_vmax_v,
570 },
571 {
572 NEON::BI__builtin_neon_vmaxnm_f16,
573 NEON::BI__builtin_neon_vmaxnm_v,
574 },
575 {
576 NEON::BI__builtin_neon_vmaxnmq_f16,
577 NEON::BI__builtin_neon_vmaxnmq_v,
578 },
579 {
580 NEON::BI__builtin_neon_vmaxq_f16,
581 NEON::BI__builtin_neon_vmaxq_v,
582 },
583 {
584 NEON::BI__builtin_neon_vmin_f16,
585 NEON::BI__builtin_neon_vmin_v,
586 },
587 {
588 NEON::BI__builtin_neon_vminnm_f16,
589 NEON::BI__builtin_neon_vminnm_v,
590 },
591 {
592 NEON::BI__builtin_neon_vminnmq_f16,
593 NEON::BI__builtin_neon_vminnmq_v,
594 },
595 {
596 NEON::BI__builtin_neon_vminq_f16,
597 NEON::BI__builtin_neon_vminq_v,
598 },
599 {
600 NEON::BI__builtin_neon_vmulx_f16,
601 NEON::BI__builtin_neon_vmulx_v,
602 },
603 {
604 NEON::BI__builtin_neon_vmulxq_f16,
605 NEON::BI__builtin_neon_vmulxq_v,
606 },
607 {
608 NEON::BI__builtin_neon_vpadd_f16,
609 NEON::BI__builtin_neon_vpadd_v,
610 },
611 {
612 NEON::BI__builtin_neon_vpaddq_f16,
613 NEON::BI__builtin_neon_vpaddq_v,
614 },
615 {
616 NEON::BI__builtin_neon_vpmax_f16,
617 NEON::BI__builtin_neon_vpmax_v,
618 },
619 {
620 NEON::BI__builtin_neon_vpmaxnm_f16,
621 NEON::BI__builtin_neon_vpmaxnm_v,
622 },
623 {
624 NEON::BI__builtin_neon_vpmaxnmq_f16,
625 NEON::BI__builtin_neon_vpmaxnmq_v,
626 },
627 {
628 NEON::BI__builtin_neon_vpmaxq_f16,
629 NEON::BI__builtin_neon_vpmaxq_v,
630 },
631 {
632 NEON::BI__builtin_neon_vpmin_f16,
633 NEON::BI__builtin_neon_vpmin_v,
634 },
635 {
636 NEON::BI__builtin_neon_vpminnm_f16,
637 NEON::BI__builtin_neon_vpminnm_v,
638 },
639 {
640 NEON::BI__builtin_neon_vpminnmq_f16,
641 NEON::BI__builtin_neon_vpminnmq_v,
642 },
643 {
644 NEON::BI__builtin_neon_vpminq_f16,
645 NEON::BI__builtin_neon_vpminq_v,
646 },
647 {
648 NEON::BI__builtin_neon_vrecpe_f16,
649 NEON::BI__builtin_neon_vrecpe_v,
650 },
651 {
652 NEON::BI__builtin_neon_vrecpeq_f16,
653 NEON::BI__builtin_neon_vrecpeq_v,
654 },
655 {
656 NEON::BI__builtin_neon_vrecps_f16,
657 NEON::BI__builtin_neon_vrecps_v,
658 },
659 {
660 NEON::BI__builtin_neon_vrecpsq_f16,
661 NEON::BI__builtin_neon_vrecpsq_v,
662 },
663 {
664 NEON::BI__builtin_neon_vrnd_f16,
665 NEON::BI__builtin_neon_vrnd_v,
666 },
667 {
668 NEON::BI__builtin_neon_vrnda_f16,
669 NEON::BI__builtin_neon_vrnda_v,
670 },
671 {
672 NEON::BI__builtin_neon_vrndaq_f16,
673 NEON::BI__builtin_neon_vrndaq_v,
674 },
675 {
676 NEON::BI__builtin_neon_vrndi_f16,
677 NEON::BI__builtin_neon_vrndi_v,
678 },
679 {
680 NEON::BI__builtin_neon_vrndiq_f16,
681 NEON::BI__builtin_neon_vrndiq_v,
682 },
683 {
684 NEON::BI__builtin_neon_vrndm_f16,
685 NEON::BI__builtin_neon_vrndm_v,
686 },
687 {
688 NEON::BI__builtin_neon_vrndmq_f16,
689 NEON::BI__builtin_neon_vrndmq_v,
690 },
691 {
692 NEON::BI__builtin_neon_vrndn_f16,
693 NEON::BI__builtin_neon_vrndn_v,
694 },
695 {
696 NEON::BI__builtin_neon_vrndnq_f16,
697 NEON::BI__builtin_neon_vrndnq_v,
698 },
699 {
700 NEON::BI__builtin_neon_vrndp_f16,
701 NEON::BI__builtin_neon_vrndp_v,
702 },
703 {
704 NEON::BI__builtin_neon_vrndpq_f16,
705 NEON::BI__builtin_neon_vrndpq_v,
706 },
707 {
708 NEON::BI__builtin_neon_vrndq_f16,
709 NEON::BI__builtin_neon_vrndq_v,
710 },
711 {
712 NEON::BI__builtin_neon_vrndx_f16,
713 NEON::BI__builtin_neon_vrndx_v,
714 },
715 {
716 NEON::BI__builtin_neon_vrndxq_f16,
717 NEON::BI__builtin_neon_vrndxq_v,
718 },
719 {
720 NEON::BI__builtin_neon_vrsqrte_f16,
721 NEON::BI__builtin_neon_vrsqrte_v,
722 },
723 {
724 NEON::BI__builtin_neon_vrsqrteq_f16,
725 NEON::BI__builtin_neon_vrsqrteq_v,
726 },
727 {
728 NEON::BI__builtin_neon_vrsqrts_f16,
729 NEON::BI__builtin_neon_vrsqrts_v,
730 },
731 {
732 NEON::BI__builtin_neon_vrsqrtsq_f16,
733 NEON::BI__builtin_neon_vrsqrtsq_v,
734 },
735 {
736 NEON::BI__builtin_neon_vsqrt_f16,
737 NEON::BI__builtin_neon_vsqrt_v,
738 },
739 {
740 NEON::BI__builtin_neon_vsqrtq_f16,
741 NEON::BI__builtin_neon_vsqrtq_v,
742 },
743 {NEON::BI__builtin_neon_vst1_bf16_x2, NEON::BI__builtin_neon_vst1_x2_v},
744 {NEON::BI__builtin_neon_vst1_bf16_x3, NEON::BI__builtin_neon_vst1_x3_v},
745 {NEON::BI__builtin_neon_vst1_bf16_x4, NEON::BI__builtin_neon_vst1_x4_v},
746 {NEON::BI__builtin_neon_vst1_bf16, NEON::BI__builtin_neon_vst1_v},
747 {NEON::BI__builtin_neon_vst1_lane_bf16, NEON::BI__builtin_neon_vst1_lane_v},
748 {NEON::BI__builtin_neon_vst1q_bf16_x2, NEON::BI__builtin_neon_vst1q_x2_v},
749 {NEON::BI__builtin_neon_vst1q_bf16_x3, NEON::BI__builtin_neon_vst1q_x3_v},
750 {NEON::BI__builtin_neon_vst1q_bf16_x4, NEON::BI__builtin_neon_vst1q_x4_v},
751 {NEON::BI__builtin_neon_vst1q_bf16, NEON::BI__builtin_neon_vst1q_v},
752 {NEON::BI__builtin_neon_vst1q_lane_bf16,
753 NEON::BI__builtin_neon_vst1q_lane_v},
754 {NEON::BI__builtin_neon_vst2_bf16, NEON::BI__builtin_neon_vst2_v},
755 {NEON::BI__builtin_neon_vst2_lane_bf16, NEON::BI__builtin_neon_vst2_lane_v},
756 {NEON::BI__builtin_neon_vst2q_bf16, NEON::BI__builtin_neon_vst2q_v},
757 {NEON::BI__builtin_neon_vst2q_lane_bf16,
758 NEON::BI__builtin_neon_vst2q_lane_v},
759 {NEON::BI__builtin_neon_vst3_bf16, NEON::BI__builtin_neon_vst3_v},
760 {NEON::BI__builtin_neon_vst3_lane_bf16, NEON::BI__builtin_neon_vst3_lane_v},
761 {NEON::BI__builtin_neon_vst3q_bf16, NEON::BI__builtin_neon_vst3q_v},
762 {NEON::BI__builtin_neon_vst3q_lane_bf16,
763 NEON::BI__builtin_neon_vst3q_lane_v},
764 {NEON::BI__builtin_neon_vst4_bf16, NEON::BI__builtin_neon_vst4_v},
765 {NEON::BI__builtin_neon_vst4_lane_bf16, NEON::BI__builtin_neon_vst4_lane_v},
766 {NEON::BI__builtin_neon_vst4q_bf16, NEON::BI__builtin_neon_vst4q_v},
767 {NEON::BI__builtin_neon_vst4q_lane_bf16,
768 NEON::BI__builtin_neon_vst4q_lane_v},
769 // The mangling rules cause us to have one ID for each type for
770 // vldap1(q)_lane and vstl1(q)_lane, but codegen is equivalent for all of
771 // them. Choose an arbitrary one to be handled as tha canonical variation.
772 {NEON::BI__builtin_neon_vldap1_lane_u64,
773 NEON::BI__builtin_neon_vldap1_lane_s64},
774 {NEON::BI__builtin_neon_vldap1_lane_f64,
775 NEON::BI__builtin_neon_vldap1_lane_s64},
776 {NEON::BI__builtin_neon_vldap1_lane_p64,
777 NEON::BI__builtin_neon_vldap1_lane_s64},
778 {NEON::BI__builtin_neon_vldap1q_lane_u64,
779 NEON::BI__builtin_neon_vldap1q_lane_s64},
780 {NEON::BI__builtin_neon_vldap1q_lane_f64,
781 NEON::BI__builtin_neon_vldap1q_lane_s64},
782 {NEON::BI__builtin_neon_vldap1q_lane_p64,
783 NEON::BI__builtin_neon_vldap1q_lane_s64},
784 {NEON::BI__builtin_neon_vstl1_lane_u64,
785 NEON::BI__builtin_neon_vstl1_lane_s64},
786 {NEON::BI__builtin_neon_vstl1_lane_f64,
787 NEON::BI__builtin_neon_vstl1_lane_s64},
788 {NEON::BI__builtin_neon_vstl1_lane_p64,
789 NEON::BI__builtin_neon_vstl1_lane_s64},
790 {NEON::BI__builtin_neon_vstl1q_lane_u64,
791 NEON::BI__builtin_neon_vstl1q_lane_s64},
792 {NEON::BI__builtin_neon_vstl1q_lane_f64,
793 NEON::BI__builtin_neon_vstl1q_lane_s64},
794 {NEON::BI__builtin_neon_vstl1q_lane_p64,
795 NEON::BI__builtin_neon_vstl1q_lane_s64},
796};
797
798std::optional<mlir::Value>
801 llvm::Triple::ArchType arch) {
802 if (builtinID >= clang::AArch64::FirstSVEBuiltin &&
804 return emitAArch64SVEBuiltinExpr(builtinID, expr);
805
806 if (builtinID >= clang::AArch64::FirstSMEBuiltin &&
808 return emitAArch64SMEBuiltinExpr(builtinID, expr);
809
810 if (builtinID == Builtin::BI__builtin_cpu_supports) {
811 cgm.errorNYI(expr->getSourceRange(),
812 std::string("unimplemented AArch64 builtin call: ") +
813 getContext().BuiltinInfo.getName(builtinID));
814 return mlir::Value{};
815 }
816
817 switch (builtinID) {
818 default:
819 break;
820 case clang::AArch64::BI__builtin_arm_nop:
821 case clang::AArch64::BI__builtin_arm_yield:
822 case clang::AArch64::BI__yield:
823 case clang::AArch64::BI__builtin_arm_wfe:
824 case clang::AArch64::BI__wfe:
825 case clang::AArch64::BI__builtin_arm_wfi:
826 case clang::AArch64::BI__wfi:
827 case clang::AArch64::BI__builtin_arm_sev:
828 case clang::AArch64::BI__sev:
829 case clang::AArch64::BI__builtin_arm_sevl:
830 case clang::AArch64::BI__sevl:
831 cgm.errorNYI(expr->getSourceRange(),
832 std::string("unimplemented AArch64 builtin call: ") +
833 getContext().BuiltinInfo.getName(builtinID));
834 return mlir::Value{};
835 }
836
837 if (builtinID == clang::AArch64::BI__builtin_arm_trap) {
838 cgm.errorNYI(expr->getSourceRange(),
839 std::string("unimplemented AArch64 builtin call: ") +
840 getContext().BuiltinInfo.getName(builtinID));
841 return mlir::Value{};
842 }
843
844 if (builtinID == clang::AArch64::BI__builtin_arm_get_sme_state) {
845 cgm.errorNYI(expr->getSourceRange(),
846 std::string("unimplemented AArch64 builtin call: ") +
847 getContext().BuiltinInfo.getName(builtinID));
848 return mlir::Value{};
849 }
850
851 if (builtinID == clang::AArch64::BI__builtin_arm_rbit) {
852 cgm.errorNYI(expr->getSourceRange(),
853 std::string("unimplemented AArch64 builtin call: ") +
854 getContext().BuiltinInfo.getName(builtinID));
855 return mlir::Value{};
856 }
857 if (builtinID == clang::AArch64::BI__builtin_arm_rbit64) {
858 cgm.errorNYI(expr->getSourceRange(),
859 std::string("unimplemented AArch64 builtin call: ") +
860 getContext().BuiltinInfo.getName(builtinID));
861 return mlir::Value{};
862 }
863
864 if (builtinID == clang::AArch64::BI__builtin_arm_clz ||
865 builtinID == clang::AArch64::BI__builtin_arm_clz64) {
866 cgm.errorNYI(expr->getSourceRange(),
867 std::string("unimplemented AArch64 builtin call: ") +
868 getContext().BuiltinInfo.getName(builtinID));
869 return mlir::Value{};
870 }
871
872 if (builtinID == clang::AArch64::BI__builtin_arm_cls) {
873 cgm.errorNYI(expr->getSourceRange(),
874 std::string("unimplemented AArch64 builtin call: ") +
875 getContext().BuiltinInfo.getName(builtinID));
876 return mlir::Value{};
877 }
878 if (builtinID == clang::AArch64::BI__builtin_arm_cls64) {
879 cgm.errorNYI(expr->getSourceRange(),
880 std::string("unimplemented AArch64 builtin call: ") +
881 getContext().BuiltinInfo.getName(builtinID));
882 return mlir::Value{};
883 }
884
885 if (builtinID == clang::AArch64::BI__builtin_arm_rint32zf ||
886 builtinID == clang::AArch64::BI__builtin_arm_rint32z) {
887 cgm.errorNYI(expr->getSourceRange(),
888 std::string("unimplemented AArch64 builtin call: ") +
889 getContext().BuiltinInfo.getName(builtinID));
890 return mlir::Value{};
891 }
892
893 if (builtinID == clang::AArch64::BI__builtin_arm_rint64zf ||
894 builtinID == clang::AArch64::BI__builtin_arm_rint64z) {
895 cgm.errorNYI(expr->getSourceRange(),
896 std::string("unimplemented AArch64 builtin call: ") +
897 getContext().BuiltinInfo.getName(builtinID));
898 return mlir::Value{};
899 }
900
901 if (builtinID == clang::AArch64::BI__builtin_arm_rint32xf ||
902 builtinID == clang::AArch64::BI__builtin_arm_rint32x) {
903 cgm.errorNYI(expr->getSourceRange(),
904 std::string("unimplemented AArch64 builtin call: ") +
905 getContext().BuiltinInfo.getName(builtinID));
906 return mlir::Value{};
907 }
908
909 if (builtinID == clang::AArch64::BI__builtin_arm_rint64xf ||
910 builtinID == clang::AArch64::BI__builtin_arm_rint64x) {
911 cgm.errorNYI(expr->getSourceRange(),
912 std::string("unimplemented AArch64 builtin call: ") +
913 getContext().BuiltinInfo.getName(builtinID));
914 return mlir::Value{};
915 }
916
917 if (builtinID == clang::AArch64::BI__builtin_arm_jcvt) {
918 cgm.errorNYI(expr->getSourceRange(),
919 std::string("unimplemented AArch64 builtin call: ") +
920 getContext().BuiltinInfo.getName(builtinID));
921 return mlir::Value{};
922 }
923
924 if (builtinID == clang::AArch64::BI__builtin_arm_ld64b ||
925 builtinID == clang::AArch64::BI__builtin_arm_st64b ||
926 builtinID == clang::AArch64::BI__builtin_arm_st64bv ||
927 builtinID == clang::AArch64::BI__builtin_arm_st64bv0) {
928 cgm.errorNYI(expr->getSourceRange(),
929 std::string("unimplemented AArch64 builtin call: ") +
930 getContext().BuiltinInfo.getName(builtinID));
931 return mlir::Value{};
932 }
933
934 if (builtinID == clang::AArch64::BI__builtin_arm_rndr ||
935 builtinID == clang::AArch64::BI__builtin_arm_rndrrs) {
936 cgm.errorNYI(expr->getSourceRange(),
937 std::string("unimplemented AArch64 builtin call: ") +
938 getContext().BuiltinInfo.getName(builtinID));
939 return mlir::Value{};
940 }
941
942 if (builtinID == clang::AArch64::BI__clear_cache) {
943 cgm.errorNYI(expr->getSourceRange(),
944 std::string("unimplemented AArch64 builtin call: ") +
945 getContext().BuiltinInfo.getName(builtinID));
946 return mlir::Value{};
947 }
948
949 if ((builtinID == clang::AArch64::BI__builtin_arm_ldrex ||
950 builtinID == clang::AArch64::BI__builtin_arm_ldaex) &&
951 getContext().getTypeSize(expr->getType()) == 128) {
952 cgm.errorNYI(expr->getSourceRange(),
953 std::string("unimplemented AArch64 builtin call: ") +
954 getContext().BuiltinInfo.getName(builtinID));
955 return mlir::Value{};
956 }
957 if (builtinID == clang::AArch64::BI__builtin_arm_ldrex ||
958 builtinID == clang::AArch64::BI__builtin_arm_ldaex) {
959 cgm.errorNYI(expr->getSourceRange(),
960 std::string("unimplemented AArch64 builtin call: ") +
961 getContext().BuiltinInfo.getName(builtinID));
962 return mlir::Value{};
963 }
964
965 if ((builtinID == clang::AArch64::BI__builtin_arm_strex ||
966 builtinID == clang::AArch64::BI__builtin_arm_stlex) &&
967 getContext().getTypeSize(expr->getArg(0)->getType()) == 128) {
968 cgm.errorNYI(expr->getSourceRange(),
969 std::string("unimplemented AArch64 builtin call: ") +
970 getContext().BuiltinInfo.getName(builtinID));
971 return mlir::Value{};
972 }
973
974 if (builtinID == clang::AArch64::BI__builtin_arm_strex ||
975 builtinID == clang::AArch64::BI__builtin_arm_stlex) {
976 cgm.errorNYI(expr->getSourceRange(),
977 std::string("unimplemented AArch64 builtin call: ") +
978 getContext().BuiltinInfo.getName(builtinID));
979 return mlir::Value{};
980 }
981
982 if (builtinID == clang::AArch64::BI__getReg) {
983 cgm.errorNYI(expr->getSourceRange(),
984 std::string("unimplemented AArch64 builtin call: ") +
985 getContext().BuiltinInfo.getName(builtinID));
986 return mlir::Value{};
987 }
988
989 if (builtinID == clang::AArch64::BI__break) {
990 cgm.errorNYI(expr->getSourceRange(),
991 std::string("unimplemented AArch64 builtin call: ") +
992 getContext().BuiltinInfo.getName(builtinID));
993 return mlir::Value{};
994 }
995
996 if (builtinID == clang::AArch64::BI__builtin_arm_clrex) {
997 cgm.errorNYI(expr->getSourceRange(),
998 std::string("unimplemented AArch64 builtin call: ") +
999 getContext().BuiltinInfo.getName(builtinID));
1000 return mlir::Value{};
1001 }
1002
1003 if (builtinID == clang::AArch64::BI_ReadWriteBarrier) {
1004 cgm.errorNYI(expr->getSourceRange(),
1005 std::string("unimplemented AArch64 builtin call: ") +
1006 getContext().BuiltinInfo.getName(builtinID));
1007 return mlir::Value{};
1008 }
1009
1010 // CRC32
1011 Intrinsic::ID crcIntrinsicID = Intrinsic::not_intrinsic;
1012 switch (builtinID) {
1013 case clang::AArch64::BI__builtin_arm_crc32b:
1014 crcIntrinsicID = Intrinsic::aarch64_crc32b;
1015 break;
1016 case clang::AArch64::BI__builtin_arm_crc32cb:
1017 crcIntrinsicID = Intrinsic::aarch64_crc32cb;
1018 break;
1019 case clang::AArch64::BI__builtin_arm_crc32h:
1020 crcIntrinsicID = Intrinsic::aarch64_crc32h;
1021 break;
1022 case clang::AArch64::BI__builtin_arm_crc32ch:
1023 crcIntrinsicID = Intrinsic::aarch64_crc32ch;
1024 break;
1025 case clang::AArch64::BI__builtin_arm_crc32w:
1026 crcIntrinsicID = Intrinsic::aarch64_crc32w;
1027 break;
1028 case clang::AArch64::BI__builtin_arm_crc32cw:
1029 crcIntrinsicID = Intrinsic::aarch64_crc32cw;
1030 break;
1031 case clang::AArch64::BI__builtin_arm_crc32d:
1032 crcIntrinsicID = Intrinsic::aarch64_crc32x;
1033 break;
1034 case clang::AArch64::BI__builtin_arm_crc32cd:
1035 crcIntrinsicID = Intrinsic::aarch64_crc32cx;
1036 break;
1037 }
1038
1039 if (crcIntrinsicID != Intrinsic::not_intrinsic) {
1040 cgm.errorNYI(expr->getSourceRange(),
1041 std::string("unimplemented AArch64 builtin call: ") +
1042 getContext().BuiltinInfo.getName(builtinID));
1043 return mlir::Value{};
1044 }
1045
1046 // Memory Operations (MOPS)
1047 if (builtinID == AArch64::BI__builtin_arm_mops_memset_tag) {
1048 cgm.errorNYI(expr->getSourceRange(),
1049 std::string("unimplemented AArch64 builtin call: ") +
1050 getContext().BuiltinInfo.getName(builtinID));
1051 return mlir::Value{};
1052 }
1053
1054 // Memory Tagging Extensions (MTE) Intrinsics
1055 Intrinsic::ID mteIntrinsicID = Intrinsic::not_intrinsic;
1056 switch (builtinID) {
1057 case clang::AArch64::BI__builtin_arm_irg:
1058 mteIntrinsicID = Intrinsic::aarch64_irg;
1059 break;
1060 case clang::AArch64::BI__builtin_arm_addg:
1061 mteIntrinsicID = Intrinsic::aarch64_addg;
1062 break;
1063 case clang::AArch64::BI__builtin_arm_gmi:
1064 mteIntrinsicID = Intrinsic::aarch64_gmi;
1065 break;
1066 case clang::AArch64::BI__builtin_arm_ldg:
1067 mteIntrinsicID = Intrinsic::aarch64_ldg;
1068 break;
1069 case clang::AArch64::BI__builtin_arm_stg:
1070 mteIntrinsicID = Intrinsic::aarch64_stg;
1071 break;
1072 case clang::AArch64::BI__builtin_arm_subp:
1073 mteIntrinsicID = Intrinsic::aarch64_subp;
1074 break;
1075 }
1076
1077 if (mteIntrinsicID != Intrinsic::not_intrinsic) {
1078 cgm.errorNYI(expr->getSourceRange(),
1079 std::string("unimplemented AArch64 builtin call: ") +
1080 getContext().BuiltinInfo.getName(builtinID));
1081 return mlir::Value{};
1082 }
1083
1084 if (builtinID == clang::AArch64::BI__builtin_arm_rsr ||
1085 builtinID == clang::AArch64::BI__builtin_arm_rsr64 ||
1086 builtinID == clang::AArch64::BI__builtin_arm_rsr128 ||
1087 builtinID == clang::AArch64::BI__builtin_arm_rsrp ||
1088 builtinID == clang::AArch64::BI__builtin_arm_wsr ||
1089 builtinID == clang::AArch64::BI__builtin_arm_wsr64 ||
1090 builtinID == clang::AArch64::BI__builtin_arm_wsr128 ||
1091 builtinID == clang::AArch64::BI__builtin_arm_wsrp) {
1092 cgm.errorNYI(expr->getSourceRange(),
1093 std::string("unimplemented AArch64 builtin call: ") +
1094 getContext().BuiltinInfo.getName(builtinID));
1095 return mlir::Value{};
1096 }
1097
1098 if (builtinID == clang::AArch64::BI_ReadStatusReg ||
1099 builtinID == clang::AArch64::BI_WriteStatusReg ||
1100 builtinID == clang::AArch64::BI__sys) {
1101 cgm.errorNYI(expr->getSourceRange(),
1102 std::string("unimplemented AArch64 builtin call: ") +
1103 getContext().BuiltinInfo.getName(builtinID));
1104 return mlir::Value{};
1105 }
1106
1107 if (builtinID == clang::AArch64::BI_AddressOfReturnAddress) {
1108 cgm.errorNYI(expr->getSourceRange(),
1109 std::string("unimplemented AArch64 builtin call: ") +
1110 getContext().BuiltinInfo.getName(builtinID));
1111 return mlir::Value{};
1112 }
1113
1114 if (builtinID == clang::AArch64::BI__builtin_sponentry) {
1115 cgm.errorNYI(expr->getSourceRange(),
1116 std::string("unimplemented AArch64 builtin call: ") +
1117 getContext().BuiltinInfo.getName(builtinID));
1118 return mlir::Value{};
1119 }
1120
1121 if (builtinID == clang::AArch64::BI__mulh ||
1122 builtinID == clang::AArch64::BI__umulh) {
1123 cgm.errorNYI(expr->getSourceRange(),
1124 std::string("unimplemented AArch64 builtin call: ") +
1125 getContext().BuiltinInfo.getName(builtinID));
1126 return mlir::Value{};
1127 }
1128
1129 if (builtinID == AArch64::BI__writex18byte ||
1130 builtinID == AArch64::BI__writex18word ||
1131 builtinID == AArch64::BI__writex18dword ||
1132 builtinID == AArch64::BI__writex18qword) {
1133 cgm.errorNYI(expr->getSourceRange(),
1134 std::string("unimplemented AArch64 builtin call: ") +
1135 getContext().BuiltinInfo.getName(builtinID));
1136 return mlir::Value{};
1137 }
1138
1139 if (builtinID == AArch64::BI__readx18byte ||
1140 builtinID == AArch64::BI__readx18word ||
1141 builtinID == AArch64::BI__readx18dword ||
1142 builtinID == AArch64::BI__readx18qword) {
1143 cgm.errorNYI(expr->getSourceRange(),
1144 std::string("unimplemented AArch64 builtin call: ") +
1145 getContext().BuiltinInfo.getName(builtinID));
1146 return mlir::Value{};
1147 }
1148
1149 if (builtinID == AArch64::BI__addx18byte ||
1150 builtinID == AArch64::BI__addx18word ||
1151 builtinID == AArch64::BI__addx18dword ||
1152 builtinID == AArch64::BI__addx18qword ||
1153 builtinID == AArch64::BI__incx18byte ||
1154 builtinID == AArch64::BI__incx18word ||
1155 builtinID == AArch64::BI__incx18dword ||
1156 builtinID == AArch64::BI__incx18qword) {
1157 cgm.errorNYI(expr->getSourceRange(),
1158 std::string("unimplemented AArch64 builtin call: ") +
1159 getContext().BuiltinInfo.getName(builtinID));
1160 return mlir::Value{};
1161 }
1162
1163 if (builtinID == AArch64::BI_CopyDoubleFromInt64 ||
1164 builtinID == AArch64::BI_CopyFloatFromInt32 ||
1165 builtinID == AArch64::BI_CopyInt32FromFloat ||
1166 builtinID == AArch64::BI_CopyInt64FromDouble) {
1167 cgm.errorNYI(expr->getSourceRange(),
1168 std::string("unimplemented AArch64 builtin call: ") +
1169 getContext().BuiltinInfo.getName(builtinID));
1170 return mlir::Value{};
1171 }
1172
1173 if (builtinID == AArch64::BI_CountLeadingOnes ||
1174 builtinID == AArch64::BI_CountLeadingOnes64 ||
1175 builtinID == AArch64::BI_CountLeadingZeros ||
1176 builtinID == AArch64::BI_CountLeadingZeros64) {
1177 cgm.errorNYI(expr->getSourceRange(),
1178 std::string("unimplemented AArch64 builtin call: ") +
1179 getContext().BuiltinInfo.getName(builtinID));
1180 return mlir::Value{};
1181 }
1182
1183 if (builtinID == AArch64::BI_CountLeadingSigns ||
1184 builtinID == AArch64::BI_CountLeadingSigns64) {
1185 cgm.errorNYI(expr->getSourceRange(),
1186 std::string("unimplemented AArch64 builtin call: ") +
1187 getContext().BuiltinInfo.getName(builtinID));
1188 return mlir::Value{};
1189 }
1190
1191 if (builtinID == AArch64::BI_CountOneBits ||
1192 builtinID == AArch64::BI_CountOneBits64) {
1193 cgm.errorNYI(expr->getSourceRange(),
1194 std::string("unimplemented AArch64 builtin call: ") +
1195 getContext().BuiltinInfo.getName(builtinID));
1196 return mlir::Value{};
1197 }
1198
1199 if (builtinID == AArch64::BI__prefetch) {
1200 cgm.errorNYI(expr->getSourceRange(),
1201 std::string("unimplemented AArch64 builtin call: ") +
1202 getContext().BuiltinInfo.getName(builtinID));
1203 return mlir::Value{};
1204 }
1205
1206 if (builtinID == AArch64::BI__hlt) {
1207 cgm.errorNYI(expr->getSourceRange(),
1208 std::string("unimplemented AArch64 builtin call: ") +
1209 getContext().BuiltinInfo.getName(builtinID));
1210 return mlir::Value{};
1211 }
1212
1213 if (builtinID == NEON::BI__builtin_neon_vcvth_bf16_f32) {
1214 cgm.errorNYI(expr->getSourceRange(),
1215 std::string("unimplemented AArch64 builtin call: ") +
1216 getContext().BuiltinInfo.getName(builtinID));
1217 return mlir::Value{};
1218 }
1219
1220 // Handle MSVC intrinsics before argument evaluation to prevent double
1221 // evaluation.
1223
1224 // Some intrinsics are equivalent - if they are use the base intrinsic ID.
1225 auto it = llvm::find_if(neonEquivalentIntrinsicMap, [builtinID](auto &p) {
1226 return p.first == builtinID;
1227 });
1228 if (it != end(neonEquivalentIntrinsicMap))
1229 builtinID = it->second;
1230
1231 // Find out if any arguments are required to be integer constant
1232 // expressions.
1234
1236
1238 mlir::Location loc = getLoc(expr->getExprLoc());
1239
1240 // Handle non-overloaded intrinsics first.
1241 switch (builtinID) {
1242 default:
1243 break;
1244 case NEON::BI__builtin_neon_vabsh_f16: {
1245 ops.push_back(emitScalarExpr(expr->getArg(0)));
1246 return cir::FAbsOp::create(builder, loc, ops);
1247 }
1248 case NEON::BI__builtin_neon_vaddq_p128:
1249 case NEON::BI__builtin_neon_vldrq_p128:
1250 case NEON::BI__builtin_neon_vstrq_p128:
1251 case NEON::BI__builtin_neon_vcvts_f32_u32:
1252 case NEON::BI__builtin_neon_vcvtd_f64_u64:
1253 case NEON::BI__builtin_neon_vcvts_f32_s32:
1254 case NEON::BI__builtin_neon_vcvtd_f64_s64:
1255 case NEON::BI__builtin_neon_vcvth_f16_u16:
1256 case NEON::BI__builtin_neon_vcvth_f16_u32:
1257 case NEON::BI__builtin_neon_vcvth_f16_u64:
1258 case NEON::BI__builtin_neon_vcvth_f16_s16:
1259 case NEON::BI__builtin_neon_vcvth_f16_s32:
1260 case NEON::BI__builtin_neon_vcvth_f16_s64:
1261 case NEON::BI__builtin_neon_vcvtah_u16_f16:
1262 case NEON::BI__builtin_neon_vcvtmh_u16_f16:
1263 case NEON::BI__builtin_neon_vcvtnh_u16_f16:
1264 case NEON::BI__builtin_neon_vcvtph_u16_f16:
1265 case NEON::BI__builtin_neon_vcvth_u16_f16:
1266 case NEON::BI__builtin_neon_vcvtah_s16_f16:
1267 case NEON::BI__builtin_neon_vcvtmh_s16_f16:
1268 case NEON::BI__builtin_neon_vcvtnh_s16_f16:
1269 case NEON::BI__builtin_neon_vcvtph_s16_f16:
1270 case NEON::BI__builtin_neon_vcvth_s16_f16:
1271 case NEON::BI__builtin_neon_vcaleh_f16:
1272 case NEON::BI__builtin_neon_vcalth_f16:
1273 case NEON::BI__builtin_neon_vcageh_f16:
1274 case NEON::BI__builtin_neon_vcagth_f16:
1275 case NEON::BI__builtin_neon_vcvth_n_s16_f16:
1276 case NEON::BI__builtin_neon_vcvth_n_u16_f16:
1277 case NEON::BI__builtin_neon_vcvth_n_f16_s16:
1278 case NEON::BI__builtin_neon_vcvth_n_f16_u16:
1279 case NEON::BI__builtin_neon_vpaddd_s64:
1280 case NEON::BI__builtin_neon_vpaddd_f64:
1281 case NEON::BI__builtin_neon_vpadds_f32:
1282 case NEON::BI__builtin_neon_vceqzd_s64:
1283 case NEON::BI__builtin_neon_vceqzd_f64:
1284 case NEON::BI__builtin_neon_vceqzs_f32:
1285 case NEON::BI__builtin_neon_vceqzh_f16:
1286 case NEON::BI__builtin_neon_vcgezd_s64:
1287 case NEON::BI__builtin_neon_vcgezd_f64:
1288 case NEON::BI__builtin_neon_vcgezs_f32:
1289 case NEON::BI__builtin_neon_vcgezh_f16:
1290 case NEON::BI__builtin_neon_vclezd_s64:
1291 case NEON::BI__builtin_neon_vclezd_f64:
1292 case NEON::BI__builtin_neon_vclezs_f32:
1293 case NEON::BI__builtin_neon_vclezh_f16:
1294 case NEON::BI__builtin_neon_vcgtzd_s64:
1295 case NEON::BI__builtin_neon_vcgtzd_f64:
1296 case NEON::BI__builtin_neon_vcgtzs_f32:
1297 case NEON::BI__builtin_neon_vcgtzh_f16:
1298 case NEON::BI__builtin_neon_vcltzd_s64:
1299 case NEON::BI__builtin_neon_vcltzd_f64:
1300 case NEON::BI__builtin_neon_vcltzs_f32:
1301 case NEON::BI__builtin_neon_vcltzh_f16:
1302 case NEON::BI__builtin_neon_vceqzd_u64:
1303 case NEON::BI__builtin_neon_vceqd_f64:
1304 case NEON::BI__builtin_neon_vcled_f64:
1305 case NEON::BI__builtin_neon_vcltd_f64:
1306 case NEON::BI__builtin_neon_vcged_f64:
1307 case NEON::BI__builtin_neon_vcgtd_f64:
1308 case NEON::BI__builtin_neon_vceqs_f32:
1309 case NEON::BI__builtin_neon_vcles_f32:
1310 case NEON::BI__builtin_neon_vclts_f32:
1311 case NEON::BI__builtin_neon_vcges_f32:
1312 case NEON::BI__builtin_neon_vcgts_f32:
1313 case NEON::BI__builtin_neon_vceqh_f16:
1314 case NEON::BI__builtin_neon_vcleh_f16:
1315 case NEON::BI__builtin_neon_vclth_f16:
1316 case NEON::BI__builtin_neon_vcgeh_f16:
1317 case NEON::BI__builtin_neon_vcgth_f16:
1318 case NEON::BI__builtin_neon_vceqd_s64:
1319 case NEON::BI__builtin_neon_vceqd_u64:
1320 case NEON::BI__builtin_neon_vcgtd_s64:
1321 case NEON::BI__builtin_neon_vcgtd_u64:
1322 case NEON::BI__builtin_neon_vcltd_s64:
1323 case NEON::BI__builtin_neon_vcltd_u64:
1324 case NEON::BI__builtin_neon_vcged_u64:
1325 case NEON::BI__builtin_neon_vcged_s64:
1326 case NEON::BI__builtin_neon_vcled_u64:
1327 case NEON::BI__builtin_neon_vcled_s64:
1328 case NEON::BI__builtin_neon_vtstd_s64:
1329 case NEON::BI__builtin_neon_vtstd_u64:
1330 case NEON::BI__builtin_neon_vset_lane_i8:
1331 case NEON::BI__builtin_neon_vset_lane_i16:
1332 case NEON::BI__builtin_neon_vset_lane_i32:
1333 case NEON::BI__builtin_neon_vset_lane_i64:
1334 case NEON::BI__builtin_neon_vset_lane_bf16:
1335 case NEON::BI__builtin_neon_vset_lane_f32:
1336 case NEON::BI__builtin_neon_vsetq_lane_i8:
1337 case NEON::BI__builtin_neon_vsetq_lane_i16:
1338 case NEON::BI__builtin_neon_vsetq_lane_i32:
1339 case NEON::BI__builtin_neon_vsetq_lane_i64:
1340 case NEON::BI__builtin_neon_vsetq_lane_bf16:
1341 case NEON::BI__builtin_neon_vsetq_lane_f32:
1342 case NEON::BI__builtin_neon_vset_lane_f64:
1343 case NEON::BI__builtin_neon_vset_lane_mf8:
1344 case NEON::BI__builtin_neon_vsetq_lane_mf8:
1345 case NEON::BI__builtin_neon_vsetq_lane_f64:
1346 case NEON::BI__builtin_neon_vget_lane_i8:
1347 case NEON::BI__builtin_neon_vdupb_lane_i8:
1348 case NEON::BI__builtin_neon_vgetq_lane_i8:
1349 case NEON::BI__builtin_neon_vdupb_laneq_i8:
1350 case NEON::BI__builtin_neon_vget_lane_mf8:
1351 case NEON::BI__builtin_neon_vdupb_lane_mf8:
1352 case NEON::BI__builtin_neon_vgetq_lane_mf8:
1353 case NEON::BI__builtin_neon_vdupb_laneq_mf8:
1354 case NEON::BI__builtin_neon_vget_lane_i16:
1355 case NEON::BI__builtin_neon_vduph_lane_i16:
1356 case NEON::BI__builtin_neon_vgetq_lane_i16:
1357 case NEON::BI__builtin_neon_vduph_laneq_i16:
1358 case NEON::BI__builtin_neon_vget_lane_i32:
1359 case NEON::BI__builtin_neon_vdups_lane_i32:
1360 case NEON::BI__builtin_neon_vdups_lane_f32:
1361 case NEON::BI__builtin_neon_vgetq_lane_i32:
1362 case NEON::BI__builtin_neon_vdups_laneq_i32:
1363 case NEON::BI__builtin_neon_vget_lane_i64:
1364 case NEON::BI__builtin_neon_vdupd_lane_i64:
1365 case NEON::BI__builtin_neon_vdupd_lane_f64:
1366 case NEON::BI__builtin_neon_vgetq_lane_i64:
1367 case NEON::BI__builtin_neon_vdupd_laneq_i64:
1368 case NEON::BI__builtin_neon_vget_lane_f32:
1369 case NEON::BI__builtin_neon_vget_lane_f64:
1370 case NEON::BI__builtin_neon_vgetq_lane_f32:
1371 case NEON::BI__builtin_neon_vdups_laneq_f32:
1372 case NEON::BI__builtin_neon_vgetq_lane_f64:
1373 case NEON::BI__builtin_neon_vdupd_laneq_f64:
1374 case NEON::BI__builtin_neon_vaddh_f16:
1375 case NEON::BI__builtin_neon_vsubh_f16:
1376 case NEON::BI__builtin_neon_vmulh_f16:
1377 case NEON::BI__builtin_neon_vdivh_f16:
1378 case NEON::BI__builtin_neon_vfmah_f16:
1379 case NEON::BI__builtin_neon_vfmsh_f16:
1380 case NEON::BI__builtin_neon_vaddd_s64:
1381 case NEON::BI__builtin_neon_vaddd_u64:
1382 case NEON::BI__builtin_neon_vsubd_s64:
1383 case NEON::BI__builtin_neon_vsubd_u64:
1384 case NEON::BI__builtin_neon_vqdmlalh_s16:
1385 case NEON::BI__builtin_neon_vqdmlslh_s16:
1386 case NEON::BI__builtin_neon_vqshlud_n_s64:
1387 case NEON::BI__builtin_neon_vqshld_n_u64:
1388 case NEON::BI__builtin_neon_vqshld_n_s64:
1389 case NEON::BI__builtin_neon_vrshrd_n_u64:
1390 case NEON::BI__builtin_neon_vrshrd_n_s64:
1391 case NEON::BI__builtin_neon_vrsrad_n_u64:
1392 case NEON::BI__builtin_neon_vrsrad_n_s64:
1393 case NEON::BI__builtin_neon_vshld_n_s64:
1394 case NEON::BI__builtin_neon_vshld_n_u64:
1395 case NEON::BI__builtin_neon_vshrd_n_s64:
1396 case NEON::BI__builtin_neon_vshrd_n_u64:
1397 case NEON::BI__builtin_neon_vsrad_n_s64:
1398 case NEON::BI__builtin_neon_vsrad_n_u64:
1399 case NEON::BI__builtin_neon_vqdmlalh_lane_s16:
1400 case NEON::BI__builtin_neon_vqdmlalh_laneq_s16:
1401 case NEON::BI__builtin_neon_vqdmlslh_lane_s16:
1402 case NEON::BI__builtin_neon_vqdmlslh_laneq_s16:
1403 case NEON::BI__builtin_neon_vqdmlals_s32:
1404 case NEON::BI__builtin_neon_vqdmlsls_s32:
1405 case NEON::BI__builtin_neon_vqdmlals_lane_s32:
1406 case NEON::BI__builtin_neon_vqdmlals_laneq_s32:
1407 case NEON::BI__builtin_neon_vqdmlsls_lane_s32:
1408 case NEON::BI__builtin_neon_vqdmlsls_laneq_s32:
1409 case NEON::BI__builtin_neon_vget_lane_bf16:
1410 case NEON::BI__builtin_neon_vduph_lane_bf16:
1411 case NEON::BI__builtin_neon_vduph_lane_f16:
1412 case NEON::BI__builtin_neon_vgetq_lane_bf16:
1413 case NEON::BI__builtin_neon_vduph_laneq_bf16:
1414 case NEON::BI__builtin_neon_vduph_laneq_f16:
1415 case NEON::BI__builtin_neon_vcvt_bf16_f32:
1416 case NEON::BI__builtin_neon_vcvtq_low_bf16_f32:
1417 case NEON::BI__builtin_neon_vcvtq_high_bf16_f32:
1418 case clang::AArch64::BI_InterlockedAdd:
1419 case clang::AArch64::BI_InterlockedAdd_acq:
1420 case clang::AArch64::BI_InterlockedAdd_rel:
1421 case clang::AArch64::BI_InterlockedAdd_nf:
1422 case clang::AArch64::BI_InterlockedAdd64:
1423 case clang::AArch64::BI_InterlockedAdd64_acq:
1424 case clang::AArch64::BI_InterlockedAdd64_rel:
1425 case clang::AArch64::BI_InterlockedAdd64_nf:
1426 cgm.errorNYI(expr->getSourceRange(),
1427 std::string("unimplemented AArch64 builtin call: ") +
1428 getContext().BuiltinInfo.getName(builtinID));
1429 return mlir::Value{};
1430 }
1431
1432 // Not all intrinsics handled by the common case work for AArch64 yet, so only
1433 // defer to common code if it's been added to our special map.
1435
1437
1438 switch (builtinID) {
1439 default:
1440 return std::nullopt;
1441 case NEON::BI__builtin_neon_vbsl_v:
1442 case NEON::BI__builtin_neon_vbslq_v:
1443 case NEON::BI__builtin_neon_vfma_lane_v:
1444 case NEON::BI__builtin_neon_vfmaq_lane_v:
1445 case NEON::BI__builtin_neon_vfma_laneq_v:
1446 case NEON::BI__builtin_neon_vfmaq_laneq_v:
1447 case NEON::BI__builtin_neon_vfmah_lane_f16:
1448 case NEON::BI__builtin_neon_vfmas_lane_f32:
1449 case NEON::BI__builtin_neon_vfmah_laneq_f16:
1450 case NEON::BI__builtin_neon_vfmas_laneq_f32:
1451 case NEON::BI__builtin_neon_vfmad_lane_f64:
1452 case NEON::BI__builtin_neon_vfmad_laneq_f64:
1453 case NEON::BI__builtin_neon_vmull_v:
1454 case NEON::BI__builtin_neon_vmax_v:
1455 case NEON::BI__builtin_neon_vmaxq_v:
1456 case NEON::BI__builtin_neon_vmaxh_f16:
1457 case NEON::BI__builtin_neon_vmin_v:
1458 case NEON::BI__builtin_neon_vminq_v:
1459 case NEON::BI__builtin_neon_vminh_f16:
1460 case NEON::BI__builtin_neon_vabd_v:
1461 case NEON::BI__builtin_neon_vabdq_v:
1462 case NEON::BI__builtin_neon_vpadal_v:
1463 case NEON::BI__builtin_neon_vpadalq_v:
1464 case NEON::BI__builtin_neon_vpmin_v:
1465 case NEON::BI__builtin_neon_vpminq_v:
1466 case NEON::BI__builtin_neon_vpmax_v:
1467 case NEON::BI__builtin_neon_vpmaxq_v:
1468 case NEON::BI__builtin_neon_vminnm_v:
1469 case NEON::BI__builtin_neon_vminnmq_v:
1470 case NEON::BI__builtin_neon_vminnmh_f16:
1471 case NEON::BI__builtin_neon_vmaxnm_v:
1472 case NEON::BI__builtin_neon_vmaxnmq_v:
1473 case NEON::BI__builtin_neon_vmaxnmh_f16:
1474 case NEON::BI__builtin_neon_vrecpss_f32:
1475 case NEON::BI__builtin_neon_vrecpsd_f64:
1476 case NEON::BI__builtin_neon_vrecpsh_f16:
1477 case NEON::BI__builtin_neon_vqshrun_n_v:
1478 case NEON::BI__builtin_neon_vqrshrun_n_v:
1479 case NEON::BI__builtin_neon_vqshrn_n_v:
1480 case NEON::BI__builtin_neon_vrshrn_n_v:
1481 case NEON::BI__builtin_neon_vqrshrn_n_v:
1482 case NEON::BI__builtin_neon_vrndah_f16:
1483 case NEON::BI__builtin_neon_vrnda_v:
1484 case NEON::BI__builtin_neon_vrndaq_v:
1485 case NEON::BI__builtin_neon_vrndih_f16:
1486 case NEON::BI__builtin_neon_vrndmh_f16:
1487 case NEON::BI__builtin_neon_vrndm_v:
1488 case NEON::BI__builtin_neon_vrndmq_v:
1489 case NEON::BI__builtin_neon_vrndnh_f16:
1490 case NEON::BI__builtin_neon_vrndn_v:
1491 case NEON::BI__builtin_neon_vrndnq_v:
1492 case NEON::BI__builtin_neon_vrndns_f32:
1493 case NEON::BI__builtin_neon_vrndph_f16:
1494 case NEON::BI__builtin_neon_vrndp_v:
1495 case NEON::BI__builtin_neon_vrndpq_v:
1496 case NEON::BI__builtin_neon_vrndxh_f16:
1497 case NEON::BI__builtin_neon_vrndx_v:
1498 case NEON::BI__builtin_neon_vrndxq_v:
1499 case NEON::BI__builtin_neon_vrndh_f16:
1500 case NEON::BI__builtin_neon_vrnd32x_f32:
1501 case NEON::BI__builtin_neon_vrnd32xq_f32:
1502 case NEON::BI__builtin_neon_vrnd32x_f64:
1503 case NEON::BI__builtin_neon_vrnd32xq_f64:
1504 case NEON::BI__builtin_neon_vrnd32z_f32:
1505 case NEON::BI__builtin_neon_vrnd32zq_f32:
1506 case NEON::BI__builtin_neon_vrnd32z_f64:
1507 case NEON::BI__builtin_neon_vrnd32zq_f64:
1508 case NEON::BI__builtin_neon_vrnd64x_f32:
1509 case NEON::BI__builtin_neon_vrnd64xq_f32:
1510 case NEON::BI__builtin_neon_vrnd64x_f64:
1511 case NEON::BI__builtin_neon_vrnd64xq_f64:
1512 case NEON::BI__builtin_neon_vrnd64z_f32:
1513 case NEON::BI__builtin_neon_vrnd64zq_f32:
1514 case NEON::BI__builtin_neon_vrnd64z_f64:
1515 case NEON::BI__builtin_neon_vrnd64zq_f64:
1516 case NEON::BI__builtin_neon_vrnd_v:
1517 case NEON::BI__builtin_neon_vrndq_v:
1518 case NEON::BI__builtin_neon_vcvt_f64_v:
1519 case NEON::BI__builtin_neon_vcvtq_f64_v:
1520 case NEON::BI__builtin_neon_vcvt_f64_f32:
1521 case NEON::BI__builtin_neon_vcvt_f32_f64:
1522 case NEON::BI__builtin_neon_vcvt_s32_v:
1523 case NEON::BI__builtin_neon_vcvt_u32_v:
1524 case NEON::BI__builtin_neon_vcvt_s64_v:
1525 case NEON::BI__builtin_neon_vcvt_u64_v:
1526 case NEON::BI__builtin_neon_vcvt_s16_f16:
1527 case NEON::BI__builtin_neon_vcvt_u16_f16:
1528 case NEON::BI__builtin_neon_vcvtq_s32_v:
1529 case NEON::BI__builtin_neon_vcvtq_u32_v:
1530 case NEON::BI__builtin_neon_vcvtq_s64_v:
1531 case NEON::BI__builtin_neon_vcvtq_u64_v:
1532 case NEON::BI__builtin_neon_vcvtq_s16_f16:
1533 case NEON::BI__builtin_neon_vcvtq_u16_f16:
1534 case NEON::BI__builtin_neon_vcvta_s16_f16:
1535 case NEON::BI__builtin_neon_vcvta_u16_f16:
1536 case NEON::BI__builtin_neon_vcvta_s32_v:
1537 case NEON::BI__builtin_neon_vcvtaq_s16_f16:
1538 case NEON::BI__builtin_neon_vcvtaq_s32_v:
1539 case NEON::BI__builtin_neon_vcvta_u32_v:
1540 case NEON::BI__builtin_neon_vcvtaq_u16_f16:
1541 case NEON::BI__builtin_neon_vcvtaq_u32_v:
1542 case NEON::BI__builtin_neon_vcvta_s64_v:
1543 case NEON::BI__builtin_neon_vcvtaq_s64_v:
1544 case NEON::BI__builtin_neon_vcvta_u64_v:
1545 case NEON::BI__builtin_neon_vcvtaq_u64_v:
1546 case NEON::BI__builtin_neon_vcvtm_s16_f16:
1547 case NEON::BI__builtin_neon_vcvtm_s32_v:
1548 case NEON::BI__builtin_neon_vcvtmq_s16_f16:
1549 case NEON::BI__builtin_neon_vcvtmq_s32_v:
1550 case NEON::BI__builtin_neon_vcvtm_u16_f16:
1551 case NEON::BI__builtin_neon_vcvtm_u32_v:
1552 case NEON::BI__builtin_neon_vcvtmq_u16_f16:
1553 case NEON::BI__builtin_neon_vcvtmq_u32_v:
1554 case NEON::BI__builtin_neon_vcvtm_s64_v:
1555 case NEON::BI__builtin_neon_vcvtmq_s64_v:
1556 case NEON::BI__builtin_neon_vcvtm_u64_v:
1557 case NEON::BI__builtin_neon_vcvtmq_u64_v:
1558 case NEON::BI__builtin_neon_vcvtn_s16_f16:
1559 case NEON::BI__builtin_neon_vcvtn_s32_v:
1560 case NEON::BI__builtin_neon_vcvtnq_s16_f16:
1561 case NEON::BI__builtin_neon_vcvtnq_s32_v:
1562 case NEON::BI__builtin_neon_vcvtn_u16_f16:
1563 case NEON::BI__builtin_neon_vcvtn_u32_v:
1564 case NEON::BI__builtin_neon_vcvtnq_u16_f16:
1565 case NEON::BI__builtin_neon_vcvtnq_u32_v:
1566 case NEON::BI__builtin_neon_vcvtn_s64_v:
1567 case NEON::BI__builtin_neon_vcvtnq_s64_v:
1568 case NEON::BI__builtin_neon_vcvtn_u64_v:
1569 case NEON::BI__builtin_neon_vcvtnq_u64_v:
1570 case NEON::BI__builtin_neon_vcvtp_s16_f16:
1571 case NEON::BI__builtin_neon_vcvtp_s32_v:
1572 case NEON::BI__builtin_neon_vcvtpq_s16_f16:
1573 case NEON::BI__builtin_neon_vcvtpq_s32_v:
1574 case NEON::BI__builtin_neon_vcvtp_u16_f16:
1575 case NEON::BI__builtin_neon_vcvtp_u32_v:
1576 case NEON::BI__builtin_neon_vcvtpq_u16_f16:
1577 case NEON::BI__builtin_neon_vcvtpq_u32_v:
1578 case NEON::BI__builtin_neon_vcvtp_s64_v:
1579 case NEON::BI__builtin_neon_vcvtpq_s64_v:
1580 case NEON::BI__builtin_neon_vcvtp_u64_v:
1581 case NEON::BI__builtin_neon_vcvtpq_u64_v:
1582 case NEON::BI__builtin_neon_vmulx_v:
1583 case NEON::BI__builtin_neon_vmulxq_v:
1584 case NEON::BI__builtin_neon_vmulxh_lane_f16:
1585 case NEON::BI__builtin_neon_vmulxh_laneq_f16:
1586 case NEON::BI__builtin_neon_vmul_lane_v:
1587 case NEON::BI__builtin_neon_vmul_laneq_v:
1588 case NEON::BI__builtin_neon_vnegd_s64:
1589 case NEON::BI__builtin_neon_vnegh_f16:
1590 case NEON::BI__builtin_neon_vpmaxnm_v:
1591 case NEON::BI__builtin_neon_vpmaxnmq_v:
1592 case NEON::BI__builtin_neon_vpminnm_v:
1593 case NEON::BI__builtin_neon_vpminnmq_v:
1594 case NEON::BI__builtin_neon_vsqrth_f16:
1595 case NEON::BI__builtin_neon_vsqrt_v:
1596 case NEON::BI__builtin_neon_vsqrtq_v:
1597 case NEON::BI__builtin_neon_vrbit_v:
1598 case NEON::BI__builtin_neon_vrbitq_v:
1599 case NEON::BI__builtin_neon_vmaxv_f16:
1600 case NEON::BI__builtin_neon_vmaxvq_f16:
1601 case NEON::BI__builtin_neon_vminv_f16:
1602 case NEON::BI__builtin_neon_vminvq_f16:
1603 case NEON::BI__builtin_neon_vmaxnmv_f16:
1604 case NEON::BI__builtin_neon_vmaxnmvq_f16:
1605 case NEON::BI__builtin_neon_vminnmv_f16:
1606 case NEON::BI__builtin_neon_vminnmvq_f16:
1607 case NEON::BI__builtin_neon_vmul_n_f64:
1608 case NEON::BI__builtin_neon_vaddlv_u8:
1609 case NEON::BI__builtin_neon_vaddlv_u16:
1610 case NEON::BI__builtin_neon_vaddlvq_u8:
1611 case NEON::BI__builtin_neon_vaddlvq_u16:
1612 case NEON::BI__builtin_neon_vaddlv_s8:
1613 case NEON::BI__builtin_neon_vaddlv_s16:
1614 case NEON::BI__builtin_neon_vaddlvq_s8:
1615 case NEON::BI__builtin_neon_vaddlvq_s16:
1616 case NEON::BI__builtin_neon_vsri_n_v:
1617 case NEON::BI__builtin_neon_vsriq_n_v:
1618 case NEON::BI__builtin_neon_vsli_n_v:
1619 case NEON::BI__builtin_neon_vsliq_n_v:
1620 case NEON::BI__builtin_neon_vsra_n_v:
1621 case NEON::BI__builtin_neon_vsraq_n_v:
1622 case NEON::BI__builtin_neon_vrsra_n_v:
1623 case NEON::BI__builtin_neon_vrsraq_n_v:
1624 case NEON::BI__builtin_neon_vld1_v:
1625 case NEON::BI__builtin_neon_vld1q_v:
1626 case NEON::BI__builtin_neon_vst1_v:
1627 case NEON::BI__builtin_neon_vst1q_v:
1628 case NEON::BI__builtin_neon_vld1_lane_v:
1629 case NEON::BI__builtin_neon_vld1q_lane_v:
1630 case NEON::BI__builtin_neon_vldap1_lane_s64:
1631 case NEON::BI__builtin_neon_vldap1q_lane_s64:
1632 case NEON::BI__builtin_neon_vld1_dup_v:
1633 case NEON::BI__builtin_neon_vld1q_dup_v:
1634 case NEON::BI__builtin_neon_vst1_lane_v:
1635 case NEON::BI__builtin_neon_vst1q_lane_v:
1636 case NEON::BI__builtin_neon_vstl1_lane_s64:
1637 case NEON::BI__builtin_neon_vstl1q_lane_s64:
1638 case NEON::BI__builtin_neon_vld2_v:
1639 case NEON::BI__builtin_neon_vld2q_v:
1640 case NEON::BI__builtin_neon_vld3_v:
1641 case NEON::BI__builtin_neon_vld3q_v:
1642 case NEON::BI__builtin_neon_vld4_v:
1643 case NEON::BI__builtin_neon_vld4q_v:
1644 case NEON::BI__builtin_neon_vld2_dup_v:
1645 case NEON::BI__builtin_neon_vld2q_dup_v:
1646 case NEON::BI__builtin_neon_vld3_dup_v:
1647 case NEON::BI__builtin_neon_vld3q_dup_v:
1648 case NEON::BI__builtin_neon_vld4_dup_v:
1649 case NEON::BI__builtin_neon_vld4q_dup_v:
1650 case NEON::BI__builtin_neon_vld2_lane_v:
1651 case NEON::BI__builtin_neon_vld2q_lane_v:
1652 case NEON::BI__builtin_neon_vld3_lane_v:
1653 case NEON::BI__builtin_neon_vld3q_lane_v:
1654 case NEON::BI__builtin_neon_vld4_lane_v:
1655 case NEON::BI__builtin_neon_vld4q_lane_v:
1656 case NEON::BI__builtin_neon_vst2_v:
1657 case NEON::BI__builtin_neon_vst2q_v:
1658 case NEON::BI__builtin_neon_vst2_lane_v:
1659 case NEON::BI__builtin_neon_vst2q_lane_v:
1660 case NEON::BI__builtin_neon_vst3_v:
1661 case NEON::BI__builtin_neon_vst3q_v:
1662 case NEON::BI__builtin_neon_vst3_lane_v:
1663 case NEON::BI__builtin_neon_vst3q_lane_v:
1664 case NEON::BI__builtin_neon_vst4_v:
1665 case NEON::BI__builtin_neon_vst4q_v:
1666 case NEON::BI__builtin_neon_vst4_lane_v:
1667 case NEON::BI__builtin_neon_vst4q_lane_v:
1668 case NEON::BI__builtin_neon_vtrn_v:
1669 case NEON::BI__builtin_neon_vtrnq_v:
1670 case NEON::BI__builtin_neon_vuzp_v:
1671 case NEON::BI__builtin_neon_vuzpq_v:
1672 case NEON::BI__builtin_neon_vzip_v:
1673 case NEON::BI__builtin_neon_vzipq_v:
1674 case NEON::BI__builtin_neon_vqtbl1q_v:
1675 case NEON::BI__builtin_neon_vqtbl2q_v:
1676 case NEON::BI__builtin_neon_vqtbl3q_v:
1677 case NEON::BI__builtin_neon_vqtbl4q_v:
1678 case NEON::BI__builtin_neon_vqtbx1q_v:
1679 case NEON::BI__builtin_neon_vqtbx2q_v:
1680 case NEON::BI__builtin_neon_vqtbx3q_v:
1681 case NEON::BI__builtin_neon_vqtbx4q_v:
1682 case NEON::BI__builtin_neon_vsqadd_v:
1683 case NEON::BI__builtin_neon_vsqaddq_v:
1684 case NEON::BI__builtin_neon_vuqadd_v:
1685 case NEON::BI__builtin_neon_vuqaddq_v:
1686 case NEON::BI__builtin_neon_vluti2_laneq_mf8:
1687 case NEON::BI__builtin_neon_vluti2_laneq_bf16:
1688 case NEON::BI__builtin_neon_vluti2_laneq_f16:
1689 case NEON::BI__builtin_neon_vluti2_laneq_p16:
1690 case NEON::BI__builtin_neon_vluti2_laneq_p8:
1691 case NEON::BI__builtin_neon_vluti2_laneq_s16:
1692 case NEON::BI__builtin_neon_vluti2_laneq_s8:
1693 case NEON::BI__builtin_neon_vluti2_laneq_u16:
1694 case NEON::BI__builtin_neon_vluti2_laneq_u8:
1695 case NEON::BI__builtin_neon_vluti2q_laneq_mf8:
1696 case NEON::BI__builtin_neon_vluti2q_laneq_bf16:
1697 case NEON::BI__builtin_neon_vluti2q_laneq_f16:
1698 case NEON::BI__builtin_neon_vluti2q_laneq_p16:
1699 case NEON::BI__builtin_neon_vluti2q_laneq_p8:
1700 case NEON::BI__builtin_neon_vluti2q_laneq_s16:
1701 case NEON::BI__builtin_neon_vluti2q_laneq_s8:
1702 case NEON::BI__builtin_neon_vluti2q_laneq_u16:
1703 case NEON::BI__builtin_neon_vluti2q_laneq_u8:
1704 case NEON::BI__builtin_neon_vluti2_lane_mf8:
1705 case NEON::BI__builtin_neon_vluti2_lane_bf16:
1706 case NEON::BI__builtin_neon_vluti2_lane_f16:
1707 case NEON::BI__builtin_neon_vluti2_lane_p16:
1708 case NEON::BI__builtin_neon_vluti2_lane_p8:
1709 case NEON::BI__builtin_neon_vluti2_lane_s16:
1710 case NEON::BI__builtin_neon_vluti2_lane_s8:
1711 case NEON::BI__builtin_neon_vluti2_lane_u16:
1712 case NEON::BI__builtin_neon_vluti2_lane_u8:
1713 case NEON::BI__builtin_neon_vluti2q_lane_mf8:
1714 case NEON::BI__builtin_neon_vluti2q_lane_bf16:
1715 case NEON::BI__builtin_neon_vluti2q_lane_f16:
1716 case NEON::BI__builtin_neon_vluti2q_lane_p16:
1717 case NEON::BI__builtin_neon_vluti2q_lane_p8:
1718 case NEON::BI__builtin_neon_vluti2q_lane_s16:
1719 case NEON::BI__builtin_neon_vluti2q_lane_s8:
1720 case NEON::BI__builtin_neon_vluti2q_lane_u16:
1721 case NEON::BI__builtin_neon_vluti2q_lane_u8:
1722 case NEON::BI__builtin_neon_vluti4q_lane_mf8:
1723 case NEON::BI__builtin_neon_vluti4q_lane_p8:
1724 case NEON::BI__builtin_neon_vluti4q_lane_s8:
1725 case NEON::BI__builtin_neon_vluti4q_lane_u8:
1726 case NEON::BI__builtin_neon_vluti4q_laneq_mf8:
1727 case NEON::BI__builtin_neon_vluti4q_laneq_p8:
1728 case NEON::BI__builtin_neon_vluti4q_laneq_s8:
1729 case NEON::BI__builtin_neon_vluti4q_laneq_u8:
1730 case NEON::BI__builtin_neon_vluti4q_lane_bf16_x2:
1731 case NEON::BI__builtin_neon_vluti4q_lane_f16_x2:
1732 case NEON::BI__builtin_neon_vluti4q_lane_p16_x2:
1733 case NEON::BI__builtin_neon_vluti4q_lane_s16_x2:
1734 case NEON::BI__builtin_neon_vluti4q_lane_u16_x2:
1735 case NEON::BI__builtin_neon_vluti4q_laneq_bf16_x2:
1736 case NEON::BI__builtin_neon_vluti4q_laneq_f16_x2:
1737 case NEON::BI__builtin_neon_vluti4q_laneq_p16_x2:
1738 case NEON::BI__builtin_neon_vluti4q_laneq_s16_x2:
1739 case NEON::BI__builtin_neon_vluti4q_laneq_u16_x2:
1740 case NEON::BI__builtin_neon_vmmlaq_f16_mf8_fpm:
1741 case NEON::BI__builtin_neon_vmmlaq_f32_mf8_fpm:
1742 case NEON::BI__builtin_neon_vcvt1_low_bf16_mf8_fpm:
1743 case NEON::BI__builtin_neon_vcvt1_bf16_mf8_fpm:
1744 case NEON::BI__builtin_neon_vcvt1_high_bf16_mf8_fpm:
1745 case NEON::BI__builtin_neon_vcvt2_low_bf16_mf8_fpm:
1746 case NEON::BI__builtin_neon_vcvt2_bf16_mf8_fpm:
1747 case NEON::BI__builtin_neon_vcvt2_high_bf16_mf8_fpm:
1748 case NEON::BI__builtin_neon_vcvt1_low_f16_mf8_fpm:
1749 case NEON::BI__builtin_neon_vcvt1_f16_mf8_fpm:
1750 case NEON::BI__builtin_neon_vcvt1_high_f16_mf8_fpm:
1751 case NEON::BI__builtin_neon_vcvt2_low_f16_mf8_fpm:
1752 case NEON::BI__builtin_neon_vcvt2_f16_mf8_fpm:
1753 case NEON::BI__builtin_neon_vcvt2_high_f16_mf8_fpm:
1754 case NEON::BI__builtin_neon_vcvt_mf8_f32_fpm:
1755 case NEON::BI__builtin_neon_vcvt_mf8_f16_fpm:
1756 case NEON::BI__builtin_neon_vcvtq_mf8_f16_fpm:
1757 case NEON::BI__builtin_neon_vcvt_high_mf8_f32_fpm:
1758 case NEON::BI__builtin_neon_vdot_f16_mf8_fpm:
1759 case NEON::BI__builtin_neon_vdotq_f16_mf8_fpm:
1760 case NEON::BI__builtin_neon_vdot_lane_f16_mf8_fpm:
1761 case NEON::BI__builtin_neon_vdotq_lane_f16_mf8_fpm:
1762 case NEON::BI__builtin_neon_vdot_laneq_f16_mf8_fpm:
1763 case NEON::BI__builtin_neon_vdotq_laneq_f16_mf8_fpm:
1764 case NEON::BI__builtin_neon_vdot_f32_mf8_fpm:
1765 case NEON::BI__builtin_neon_vdotq_f32_mf8_fpm:
1766 case NEON::BI__builtin_neon_vdot_lane_f32_mf8_fpm:
1767 case NEON::BI__builtin_neon_vdotq_lane_f32_mf8_fpm:
1768 case NEON::BI__builtin_neon_vdot_laneq_f32_mf8_fpm:
1769 case NEON::BI__builtin_neon_vdotq_laneq_f32_mf8_fpm:
1770 case NEON::BI__builtin_neon_vmlalbq_f16_mf8_fpm:
1771 case NEON::BI__builtin_neon_vmlaltq_f16_mf8_fpm:
1772 case NEON::BI__builtin_neon_vmlallbbq_f32_mf8_fpm:
1773 case NEON::BI__builtin_neon_vmlallbtq_f32_mf8_fpm:
1774 case NEON::BI__builtin_neon_vmlalltbq_f32_mf8_fpm:
1775 case NEON::BI__builtin_neon_vmlallttq_f32_mf8_fpm:
1776 case NEON::BI__builtin_neon_vmlalbq_lane_f16_mf8_fpm:
1777 case NEON::BI__builtin_neon_vmlalbq_laneq_f16_mf8_fpm:
1778 case NEON::BI__builtin_neon_vmlaltq_lane_f16_mf8_fpm:
1779 case NEON::BI__builtin_neon_vmlaltq_laneq_f16_mf8_fpm:
1780 case NEON::BI__builtin_neon_vmlallbbq_lane_f32_mf8_fpm:
1781 case NEON::BI__builtin_neon_vmlallbbq_laneq_f32_mf8_fpm:
1782 case NEON::BI__builtin_neon_vmlallbtq_lane_f32_mf8_fpm:
1783 case NEON::BI__builtin_neon_vmlallbtq_laneq_f32_mf8_fpm:
1784 case NEON::BI__builtin_neon_vmlalltbq_lane_f32_mf8_fpm:
1785 case NEON::BI__builtin_neon_vmlalltbq_laneq_f32_mf8_fpm:
1786 case NEON::BI__builtin_neon_vmlallttq_lane_f32_mf8_fpm:
1787 case NEON::BI__builtin_neon_vmlallttq_laneq_f32_mf8_fpm:
1788 case NEON::BI__builtin_neon_vamin_f16:
1789 case NEON::BI__builtin_neon_vaminq_f16:
1790 case NEON::BI__builtin_neon_vamin_f32:
1791 case NEON::BI__builtin_neon_vaminq_f32:
1792 case NEON::BI__builtin_neon_vaminq_f64:
1793 case NEON::BI__builtin_neon_vamax_f16:
1794 case NEON::BI__builtin_neon_vamaxq_f16:
1795 case NEON::BI__builtin_neon_vamax_f32:
1796 case NEON::BI__builtin_neon_vamaxq_f32:
1797 case NEON::BI__builtin_neon_vamaxq_f64:
1798 case NEON::BI__builtin_neon_vscale_f16:
1799 case NEON::BI__builtin_neon_vscaleq_f16:
1800 case NEON::BI__builtin_neon_vscale_f32:
1801 case NEON::BI__builtin_neon_vscaleq_f32:
1802 case NEON::BI__builtin_neon_vscaleq_f64:
1803 cgm.errorNYI(expr->getSourceRange(),
1804 std::string("unimplemented AArch64 builtin call: ") +
1805 getContext().BuiltinInfo.getName(builtinID));
1806 return mlir::Value{};
1807 }
1808
1809 // Unreachable: All cases in the switch above return.
1810}
Defines enum values for all the target-independent builtin functions.
static bool aarch64SVEIntrinsicsProvenSorted
static const std::pair< unsigned, unsigned > neonEquivalentIntrinsicMap[]
static mlir::Value genVscaleTimesFactor(mlir::Location loc, CIRGenBuilderTy builder, mlir::Type cirTy, int32_t scalingFactor)
static const AArch64BuiltinInfo * findARMVectorIntrinsicInMap(ArrayRef< AArch64BuiltinInfo > intrinsicMap, unsigned builtinID, bool &mapProvenSorted)
static const AArch64BuiltinInfo aarch64SVEIntrinsicMap[]
Enumerates target-specific builtins in their own namespaces within namespace clang.
mlir::Value createNUWAMul(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
QualType GetBuiltinType(unsigned ID, GetBuiltinTypeError &Error, unsigned *IntegerConstantArgs=nullptr) const
Return the type for the specified builtin.
@ GE_None
No error.
cir::ConstantOp getUInt64(uint64_t c, mlir::Location loc)
mlir::Value emitIntrinsicCallOp(mlir::Location loc, const llvm::StringRef str, const mlir::Type &resTy, Operands &&...op)
mlir::Type convertType(clang::QualType t)
mlir::Location getLoc(clang::SourceLocation srcLoc)
Helpers to convert Clang's SourceLocation to a MLIR Location.
bool getAArch64SVEProcessedOperands(unsigned builtinID, const CallExpr *expr, SmallVectorImpl< mlir::Value > &ops, clang::SVETypeFlags typeFlags)
Address returnValue
The temporary alloca to hold the return value.
std::optional< mlir::Value > emitAArch64BuiltinExpr(unsigned builtinID, const CallExpr *expr, ReturnValueSlot returnValue, llvm::Triple::ArchType arch)
std::optional< mlir::Value > emitAArch64SMEBuiltinExpr(unsigned builtinID, const CallExpr *expr)
mlir::Value emitScalarExpr(const clang::Expr *e, bool ignoreResultAssign=false)
Emit the computation of the specified expression of scalar type.
clang::ASTContext & getContext() const
std::optional< mlir::Value > emitAArch64SVEBuiltinExpr(unsigned builtinID, const CallExpr *expr)
Contains the address where the return value of a function can be stored, and whether the address is v...
Definition CIRGenCall.h:256
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition Expr.h:2943
Flags to identify the types for overloaded SVE builtins.
bool isReverseUSDOT() const
bool isGatherLoad() const
bool isPrefetch() const
bool isTupleSet() const
bool isReverseMergeAnyAccOp() const
bool isTupleGet() const
bool isInsertOp1SVALL() const
bool isAppendSVALL() const
bool isReverseMergeAnyBinOp() const
bool isStructStore() const
bool isTupleCreate() const
bool isGatherPrefetch() const
bool hasSplatOperand() const
MergeType getMergeType() const
bool isStructLoad() const
bool isScatterStore() const
bool isReverseCompare() const
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
Definition Address.h:330
bool operator<(DeclarationName LHS, DeclarationName RHS)
Ordering on two declaration names.
U cast(CodeGen::Address addr)
Definition Address.h:327
Diagnostic wrappers for TextAPI types for error reporting.
Definition Dominators.h:30
static bool msvcBuiltins()
static bool neonSISDIntrinsics()
static bool handleBuiltinICEArguments()
static bool aarch64SIMDIntrinsics()
static bool aarch64SVEIntrinsics()
static bool aarch64SMEIntrinsics()
static bool aarch64TblBuiltinExpr()