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