37 ExceptionModel = TT.getDefaultExceptionHandling();
39 initLibcalls(TT, ExceptionModel,
FloatABI, ABIName,
40 TT.getDefaultLongDoubleFormat());
45 for (RTLIB::LibcallImpl Impl :
46 {RTLIB::impl__ZGVnN2vv_fmod, RTLIB::impl__ZGVnN4vv_fmodf,
47 RTLIB::impl__ZGVsMxvv_fmod, RTLIB::impl__ZGVsMxvv_fmodf,
48 RTLIB::impl__ZGVnN2vl8_modf, RTLIB::impl__ZGVnN4vl4_modff,
49 RTLIB::impl__ZGVsNxvl8_modf, RTLIB::impl__ZGVsNxvl4_modff,
50 RTLIB::impl__ZGVnN2vl8l8_sincos, RTLIB::impl__ZGVnN4vl4l4_sincosf,
51 RTLIB::impl__ZGVsNxvl8l8_sincos, RTLIB::impl__ZGVsNxvl4l4_sincosf,
52 RTLIB::impl__ZGVnN4vl4l4_sincospif, RTLIB::impl__ZGVnN2vl8l8_sincospi,
53 RTLIB::impl__ZGVsNxvl4l4_sincospif,
54 RTLIB::impl__ZGVsNxvl8l8_sincospi})
58 for (RTLIB::LibcallImpl Impl : {RTLIB::impl_armpl_svfmod_f32_x,
59 RTLIB::impl_armpl_svfmod_f64_x,
60 RTLIB::impl_armpl_vfmodq_f32,
61 RTLIB::impl_armpl_vfmodq_f64,
62 RTLIB::impl_armpl_vmodfq_f64,
63 RTLIB::impl_armpl_vmodfq_f32,
64 RTLIB::impl_armpl_svmodf_f64_x,
65 RTLIB::impl_armpl_svmodf_f32_x,
66 RTLIB::impl_armpl_vsincosq_f64,
67 RTLIB::impl_armpl_vsincosq_f32,
68 RTLIB::impl_armpl_svsincos_f64_x,
69 RTLIB::impl_armpl_svsincos_f32_x,
70 RTLIB::impl_armpl_vsincospiq_f32,
71 RTLIB::impl_armpl_vsincospiq_f64,
72 RTLIB::impl_armpl_svsincospi_f32_x,
73 RTLIB::impl_armpl_svsincospi_f64_x,
74 RTLIB::impl_armpl_svpow_f32_x,
75 RTLIB::impl_armpl_svpow_f64_x,
76 RTLIB::impl_armpl_vpowq_f32,
77 RTLIB::impl_armpl_vpowq_f64,
78 RTLIB::impl_armpl_svcbrt_f32_x,
79 RTLIB::impl_armpl_svcbrt_f64_x,
80 RTLIB::impl_armpl_vcbrtq_f32,
81 RTLIB::impl_armpl_vcbrtq_f64})
84 for (RTLIB::LibcallImpl Impl :
85 {RTLIB::impl_armpl_vfmodq_f32, RTLIB::impl_armpl_vfmodq_f64,
86 RTLIB::impl_armpl_vsincosq_f64, RTLIB::impl_armpl_vsincosq_f32,
87 RTLIB::impl_armpl_vpowq_f32, RTLIB::impl_armpl_vpowq_f64,
88 RTLIB::impl_armpl_vcbrtq_f32, RTLIB::impl_armpl_vcbrtq_f64})
92 for (RTLIB::LibcallImpl Impl :
93 {RTLIB::impl_amd_vrd2_sincos, RTLIB::impl_amd_vrd4_sincos,
94 RTLIB::impl_amd_vrd8_sincos, RTLIB::impl_amd_vrs4_sincosf,
95 RTLIB::impl_amd_vrs8_sincosf, RTLIB::impl_amd_vrs16_sincosf})
160 RTLIB::LibcallImpl LibcallImpl)
const {
163 Attribute::NoCallback, Attribute::NoFree, Attribute::NoSync,
164 Attribute::NoUnwind, Attribute::WillReturn};
166 Attribute::NoUnwind, Attribute::WillReturn};
168 Attribute::NoAlias, Attribute::WriteOnly, Attribute::NonNull};
170 switch (LibcallImpl) {
171 case RTLIB::impl___sincos_stret:
172 case RTLIB::impl___sincosf_stret: {
173 if (!darwinHasSinCosStret(TT))
176 Type *ScalarTy = LibcallImpl == RTLIB::impl___sincosf_stret
180 AttrBuilder FuncAttrBuilder(Ctx);
182 FuncAttrBuilder.addAttribute(Attr);
185 TT.isX86_32() || ((TT.isARM() || TT.isThumb()) &&
192 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
195 AttrBuilder AttrBuilder(Ctx);
197 AttrBuilder.addStructRetAttr(StructTy);
198 AttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(StructTy));
202 return {FuncTy, Attrs.addParamAttributes(Ctx, 0, AttrBuilder)};
206 LibcallImpl == RTLIB::impl___sincosf_stret && TT.isX86_64()
212 case RTLIB::impl_malloc:
213 case RTLIB::impl_calloc: {
214 AttrBuilder FuncAttrBuilder(Ctx);
216 FuncAttrBuilder.addAttribute(Attr);
217 FuncAttrBuilder.addAttribute(Attribute::NoFree);
220 if (LibcallImpl == RTLIB::impl_malloc)
224 FuncAttrBuilder.addAllocKindAttr(AllocKind);
225 FuncAttrBuilder.addAttribute(
"alloc-family",
"malloc");
226 FuncAttrBuilder.addAllocSizeAttr(0, LibcallImpl == RTLIB::impl_malloc
228 : std::make_optional(1));
231 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
234 AttrBuilder ArgAttrBuilder(Ctx);
236 ArgAttrBuilder.addAttribute(AK);
238 Attrs = Attrs.addRetAttribute(Ctx, Attribute::NoUndef);
239 Attrs = Attrs.addRetAttribute(Ctx, Attribute::NoAlias);
240 Attrs = Attrs.addParamAttribute(Ctx, 0, Attribute::NoUndef);
241 if (LibcallImpl == RTLIB::impl_calloc)
242 Attrs = Attrs.addParamAttribute(Ctx, 1, Attribute::NoUndef);
248 if (LibcallImpl == RTLIB::impl_calloc)
253 case RTLIB::impl_free: {
255 AttrBuilder FuncAttrBuilder(Ctx);
257 FuncAttrBuilder.addAttribute(Attr);
260 FuncAttrBuilder.addAttribute(
"alloc-family",
"malloc");
263 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
266 AttrBuilder ArgAttrBuilder(Ctx);
267 ArgAttrBuilder.addAttribute(Attribute::NoUndef);
268 ArgAttrBuilder.addAttribute(Attribute::AllocatedPointer);
270 Attrs = Attrs.addParamAttributes(Ctx, 0, ArgAttrBuilder);
277 case RTLIB::impl___aeabi_idivmod:
278 case RTLIB::impl___aeabi_uidivmod:
279 case RTLIB::impl___aeabi_ldivmod:
280 case RTLIB::impl___aeabi_uldivmod:
281 case RTLIB::impl___rt_sdiv:
282 case RTLIB::impl___rt_udiv:
283 case RTLIB::impl___rt_sdiv64:
284 case RTLIB::impl___rt_udiv64: {
291 switch (LibcallImpl) {
292 case RTLIB::impl___aeabi_idivmod:
293 case RTLIB::impl___rt_sdiv:
297 case RTLIB::impl___aeabi_uidivmod:
298 case RTLIB::impl___rt_udiv:
302 case RTLIB::impl___aeabi_ldivmod:
303 case RTLIB::impl___rt_sdiv64:
307 case RTLIB::impl___aeabi_uldivmod:
308 case RTLIB::impl___rt_udiv64:
320 AttrBuilder FuncAttrBuilder(Ctx);
322 FuncAttrBuilder.addAttribute(Attr);
326 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
329 Attrs = Attrs.addRetAttribute(Ctx, Attribute::InReg);
330 Attrs = Attrs.addParamAttribute(Ctx, 0, ExtKind);
331 Attrs = Attrs.addParamAttribute(Ctx, 1, ExtKind);
333 return {FuncTy, Attrs};
335 case RTLIB::impl_sqrtf:
336 case RTLIB::impl_sqrt: {
337 AttrBuilder FuncAttrBuilder(Ctx);
340 FuncAttrBuilder.addAttribute(Attr);
344 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
350 Attrs = Attrs.addRetAttribute(
353 return {FuncTy, Attrs};
355 case RTLIB::impl__ZGVnN2vv_fmod:
356 case RTLIB::impl__ZGVnN4vv_fmodf:
357 case RTLIB::impl__ZGVsMxvv_fmod:
358 case RTLIB::impl__ZGVsMxvv_fmodf:
359 case RTLIB::impl_armpl_vfmodq_f32:
360 case RTLIB::impl_armpl_vfmodq_f64:
361 case RTLIB::impl_armpl_svfmod_f32_x:
362 case RTLIB::impl_armpl_svfmod_f64_x:
363 case RTLIB::impl_armpl_vpowq_f32:
364 case RTLIB::impl_armpl_vpowq_f64:
365 case RTLIB::impl_armpl_svpow_f32_x:
366 case RTLIB::impl_armpl_svpow_f64_x:
367 case RTLIB::impl_armpl_vcbrtq_f32:
368 case RTLIB::impl_armpl_vcbrtq_f64:
369 case RTLIB::impl_armpl_svcbrt_f32_x:
370 case RTLIB::impl_armpl_svcbrt_f64_x: {
371 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vv_fmodf ||
372 LibcallImpl == RTLIB::impl__ZGVsMxvv_fmodf ||
373 LibcallImpl == RTLIB::impl_armpl_svfmod_f32_x ||
374 LibcallImpl == RTLIB::impl_armpl_vfmodq_f32 ||
375 LibcallImpl == RTLIB::impl_armpl_vpowq_f32 ||
376 LibcallImpl == RTLIB::impl_armpl_svpow_f32_x ||
377 LibcallImpl == RTLIB::impl_armpl_vcbrtq_f32 ||
378 LibcallImpl == RTLIB::impl_armpl_svcbrt_f32_x;
380 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsMxvv_fmod ||
381 LibcallImpl == RTLIB::impl__ZGVsMxvv_fmodf ||
382 LibcallImpl == RTLIB::impl_armpl_svfmod_f32_x ||
383 LibcallImpl == RTLIB::impl_armpl_svfmod_f64_x ||
384 LibcallImpl == RTLIB::impl_armpl_svpow_f32_x ||
385 LibcallImpl == RTLIB::impl_armpl_svpow_f64_x ||
386 LibcallImpl == RTLIB::impl_armpl_svcbrt_f32_x ||
387 LibcallImpl == RTLIB::impl_armpl_svcbrt_f64_x;
389 bool HasOneArg = LibcallImpl == RTLIB::impl_armpl_vcbrtq_f32 ||
390 LibcallImpl == RTLIB::impl_armpl_vcbrtq_f64 ||
391 LibcallImpl == RTLIB::impl_armpl_svcbrt_f32_x ||
392 LibcallImpl == RTLIB::impl_armpl_svcbrt_f64_x;
394 AttrBuilder FuncAttrBuilder(Ctx);
397 FuncAttrBuilder.addAttribute(Attr);
400 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
403 unsigned EC = IsF32 ? 4 : 2;
411 return {FuncTy, Attrs};
413 case RTLIB::impl__ZGVnN2vl8_modf:
414 case RTLIB::impl__ZGVnN4vl4_modff:
415 case RTLIB::impl__ZGVsNxvl8_modf:
416 case RTLIB::impl__ZGVsNxvl4_modff:
417 case RTLIB::impl_armpl_vmodfq_f64:
418 case RTLIB::impl_armpl_vmodfq_f32:
419 case RTLIB::impl_armpl_svmodf_f64_x:
420 case RTLIB::impl_armpl_svmodf_f32_x: {
421 AttrBuilder FuncAttrBuilder(Ctx);
423 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4_modff ||
424 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||
425 LibcallImpl == RTLIB::impl_armpl_vmodfq_f32 ||
426 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;
428 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8_modf ||
429 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||
430 LibcallImpl == RTLIB::impl_armpl_svmodf_f64_x ||
431 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;
434 unsigned EC = IsF32 ? 4 : 2;
438 FuncAttrBuilder.addAttribute(Attr);
442 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
445 AttrBuilder ArgAttrBuilder(Ctx);
447 ArgAttrBuilder.addAttribute(AK);
448 ArgAttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(VecTy));
449 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);
459 case RTLIB::impl__ZGVnN2vl8l8_sincos:
460 case RTLIB::impl__ZGVnN4vl4l4_sincosf:
461 case RTLIB::impl__ZGVsNxvl8l8_sincos:
462 case RTLIB::impl__ZGVsNxvl4l4_sincosf:
463 case RTLIB::impl_armpl_vsincosq_f64:
464 case RTLIB::impl_armpl_vsincosq_f32:
465 case RTLIB::impl_armpl_svsincos_f64_x:
466 case RTLIB::impl_armpl_svsincos_f32_x:
467 case RTLIB::impl__ZGVnN4vl4l4_sincospif:
468 case RTLIB::impl__ZGVnN2vl8l8_sincospi:
469 case RTLIB::impl__ZGVsNxvl4l4_sincospif:
470 case RTLIB::impl__ZGVsNxvl8l8_sincospi:
471 case RTLIB::impl_armpl_vsincospiq_f32:
472 case RTLIB::impl_armpl_vsincospiq_f64:
473 case RTLIB::impl_armpl_svsincospi_f32_x:
474 case RTLIB::impl_armpl_svsincospi_f64_x: {
475 AttrBuilder FuncAttrBuilder(Ctx);
477 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincospif ||
478 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||
479 LibcallImpl == RTLIB::impl_armpl_vsincospiq_f32 ||
480 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||
481 LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincosf ||
482 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||
483 LibcallImpl == RTLIB::impl_armpl_vsincosq_f32 ||
484 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x;
487 unsigned EC = IsF32 ? 4 : 2;
489 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincos ||
490 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||
491 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x ||
492 LibcallImpl == RTLIB::impl_armpl_svsincos_f64_x ||
493 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||
494 LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincospi ||
495 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||
496 LibcallImpl == RTLIB::impl_armpl_svsincospi_f64_x;
500 FuncAttrBuilder.addAttribute(Attr);
504 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
507 AttrBuilder ArgAttrBuilder(Ctx);
509 ArgAttrBuilder.addAttribute(AK);
510 ArgAttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(VecTy));
511 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);
512 Attrs = Attrs.addParamAttributes(Ctx, 2, ArgAttrBuilder);