38 ExceptionModel = TT.getDefaultExceptionHandling();
40 initLibcalls(TT, ExceptionModel,
FloatABI, ABIName,
41 TT.getDefaultLongDoubleFormat());
46 for (RTLIB::LibcallImpl Impl :
47 {RTLIB::impl__ZGVnN2vv_fmod, RTLIB::impl__ZGVnN4vv_fmodf,
48 RTLIB::impl__ZGVsMxvv_fmod, RTLIB::impl__ZGVsMxvv_fmodf,
49 RTLIB::impl__ZGVnN2vl8_modf, RTLIB::impl__ZGVnN4vl4_modff,
50 RTLIB::impl__ZGVsNxvl8_modf, RTLIB::impl__ZGVsNxvl4_modff,
51 RTLIB::impl__ZGVnN2vl8l8_sincos, RTLIB::impl__ZGVnN4vl4l4_sincosf,
52 RTLIB::impl__ZGVsNxvl8l8_sincos, RTLIB::impl__ZGVsNxvl4l4_sincosf,
53 RTLIB::impl__ZGVnN4vl4l4_sincospif, RTLIB::impl__ZGVnN2vl8l8_sincospi,
54 RTLIB::impl__ZGVsNxvl4l4_sincospif,
55 RTLIB::impl__ZGVsNxvl8l8_sincospi})
59 for (RTLIB::LibcallImpl Impl : {RTLIB::impl_armpl_svfmod_f32_x,
60 RTLIB::impl_armpl_svfmod_f64_x,
61 RTLIB::impl_armpl_vfmodq_f32,
62 RTLIB::impl_armpl_vfmodq_f64,
63 RTLIB::impl_armpl_vmodfq_f64,
64 RTLIB::impl_armpl_vmodfq_f32,
65 RTLIB::impl_armpl_svmodf_f64_x,
66 RTLIB::impl_armpl_svmodf_f32_x,
67 RTLIB::impl_armpl_vsincosq_f64,
68 RTLIB::impl_armpl_vsincosq_f32,
69 RTLIB::impl_armpl_svsincos_f64_x,
70 RTLIB::impl_armpl_svsincos_f32_x,
71 RTLIB::impl_armpl_vsincospiq_f32,
72 RTLIB::impl_armpl_vsincospiq_f64,
73 RTLIB::impl_armpl_svsincospi_f32_x,
74 RTLIB::impl_armpl_svsincospi_f64_x,
75 RTLIB::impl_armpl_svpow_f32_x,
76 RTLIB::impl_armpl_svpow_f64_x,
77 RTLIB::impl_armpl_vpowq_f32,
78 RTLIB::impl_armpl_vpowq_f64,
79 RTLIB::impl_armpl_svcbrt_f32_x,
80 RTLIB::impl_armpl_svcbrt_f64_x,
81 RTLIB::impl_armpl_vcbrtq_f32,
82 RTLIB::impl_armpl_vcbrtq_f64})
85 for (RTLIB::LibcallImpl Impl :
86 {RTLIB::impl_armpl_vfmodq_f32, RTLIB::impl_armpl_vfmodq_f64,
87 RTLIB::impl_armpl_vsincosq_f64, RTLIB::impl_armpl_vsincosq_f32,
88 RTLIB::impl_armpl_vpowq_f32, RTLIB::impl_armpl_vpowq_f64,
89 RTLIB::impl_armpl_vcbrtq_f32, RTLIB::impl_armpl_vcbrtq_f64})
93 for (RTLIB::LibcallImpl Impl :
94 {RTLIB::impl_amd_vrd2_sincos, RTLIB::impl_amd_vrd4_sincos,
95 RTLIB::impl_amd_vrd8_sincos, RTLIB::impl_amd_vrs4_sincosf,
96 RTLIB::impl_amd_vrs8_sincosf, RTLIB::impl_amd_vrs16_sincosf})
259 RTLIB::LibcallImpl LibcallImpl)
const {
262 Attribute::NoCallback, Attribute::NoFree, Attribute::NoSync,
263 Attribute::NoUnwind, Attribute::WillReturn};
265 Attribute::NoUnwind, Attribute::WillReturn};
267 Attribute::NoAlias, Attribute::WriteOnly, Attribute::NonNull};
269 switch (LibcallImpl) {
270 case RTLIB::impl___sincos_stret:
271 case RTLIB::impl___sincosf_stret: {
272 if (!darwinHasSinCosStret(TT))
275 Type *ScalarTy = LibcallImpl == RTLIB::impl___sincosf_stret
279 AttrBuilder FuncAttrBuilder(Ctx);
281 FuncAttrBuilder.addAttribute(Attr);
284 TT.isX86_32() || ((TT.isARM() || TT.isThumb()) &&
291 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
294 AttrBuilder AttrBuilder(Ctx);
296 AttrBuilder.addStructRetAttr(StructTy);
297 AttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(StructTy));
301 return {FuncTy, Attrs.addParamAttributes(Ctx, 0, AttrBuilder)};
305 LibcallImpl == RTLIB::impl___sincosf_stret && TT.isX86_64()
311 case RTLIB::impl_malloc:
312 case RTLIB::impl_calloc: {
313 AttrBuilder FuncAttrBuilder(Ctx);
315 FuncAttrBuilder.addAttribute(Attr);
316 FuncAttrBuilder.addAttribute(Attribute::NoFree);
319 if (LibcallImpl == RTLIB::impl_malloc)
323 FuncAttrBuilder.addAllocKindAttr(AllocKind);
324 FuncAttrBuilder.addAttribute(
"alloc-family",
"malloc");
325 FuncAttrBuilder.addAllocSizeAttr(0, LibcallImpl == RTLIB::impl_malloc
327 : std::make_optional(1));
330 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
333 AttrBuilder ArgAttrBuilder(Ctx);
335 ArgAttrBuilder.addAttribute(AK);
337 Attrs = Attrs.addRetAttribute(Ctx, Attribute::NoUndef);
338 Attrs = Attrs.addRetAttribute(Ctx, Attribute::NoAlias);
339 Attrs = Attrs.addParamAttribute(Ctx, 0, Attribute::NoUndef);
340 if (LibcallImpl == RTLIB::impl_calloc)
341 Attrs = Attrs.addParamAttribute(Ctx, 1, Attribute::NoUndef);
347 if (LibcallImpl == RTLIB::impl_calloc)
352 case RTLIB::impl_free: {
354 AttrBuilder FuncAttrBuilder(Ctx);
356 FuncAttrBuilder.addAttribute(Attr);
359 FuncAttrBuilder.addAttribute(
"alloc-family",
"malloc");
362 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
365 AttrBuilder ArgAttrBuilder(Ctx);
366 ArgAttrBuilder.addAttribute(Attribute::NoUndef);
367 ArgAttrBuilder.addAttribute(Attribute::AllocatedPointer);
369 Attrs = Attrs.addParamAttributes(Ctx, 0, ArgAttrBuilder);
376 case RTLIB::impl___aeabi_idivmod:
377 case RTLIB::impl___aeabi_uidivmod:
378 case RTLIB::impl___aeabi_ldivmod:
379 case RTLIB::impl___aeabi_uldivmod:
380 case RTLIB::impl___rt_sdiv:
381 case RTLIB::impl___rt_udiv:
382 case RTLIB::impl___rt_sdiv64:
383 case RTLIB::impl___rt_udiv64: {
390 switch (LibcallImpl) {
391 case RTLIB::impl___aeabi_idivmod:
392 case RTLIB::impl___rt_sdiv:
396 case RTLIB::impl___aeabi_uidivmod:
397 case RTLIB::impl___rt_udiv:
401 case RTLIB::impl___aeabi_ldivmod:
402 case RTLIB::impl___rt_sdiv64:
406 case RTLIB::impl___aeabi_uldivmod:
407 case RTLIB::impl___rt_udiv64:
419 AttrBuilder FuncAttrBuilder(Ctx);
421 FuncAttrBuilder.addAttribute(Attr);
425 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
428 Attrs = Attrs.addRetAttribute(Ctx, Attribute::InReg);
429 Attrs = Attrs.addParamAttribute(Ctx, 0, ExtKind);
430 Attrs = Attrs.addParamAttribute(Ctx, 1, ExtKind);
432 return {FuncTy, Attrs};
434 case RTLIB::impl_sqrtf:
435 case RTLIB::impl_sqrt: {
436 AttrBuilder FuncAttrBuilder(Ctx);
439 FuncAttrBuilder.addAttribute(Attr);
443 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
449 Attrs = Attrs.addRetAttribute(
452 return {FuncTy, Attrs};
454 case RTLIB::impl__ZGVnN2vv_fmod:
455 case RTLIB::impl__ZGVnN4vv_fmodf:
456 case RTLIB::impl__ZGVsMxvv_fmod:
457 case RTLIB::impl__ZGVsMxvv_fmodf:
458 case RTLIB::impl_armpl_vfmodq_f32:
459 case RTLIB::impl_armpl_vfmodq_f64:
460 case RTLIB::impl_armpl_svfmod_f32_x:
461 case RTLIB::impl_armpl_svfmod_f64_x:
462 case RTLIB::impl_armpl_vpowq_f32:
463 case RTLIB::impl_armpl_vpowq_f64:
464 case RTLIB::impl_armpl_svpow_f32_x:
465 case RTLIB::impl_armpl_svpow_f64_x:
466 case RTLIB::impl_armpl_vcbrtq_f32:
467 case RTLIB::impl_armpl_vcbrtq_f64:
468 case RTLIB::impl_armpl_svcbrt_f32_x:
469 case RTLIB::impl_armpl_svcbrt_f64_x: {
470 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vv_fmodf ||
471 LibcallImpl == RTLIB::impl__ZGVsMxvv_fmodf ||
472 LibcallImpl == RTLIB::impl_armpl_svfmod_f32_x ||
473 LibcallImpl == RTLIB::impl_armpl_vfmodq_f32 ||
474 LibcallImpl == RTLIB::impl_armpl_vpowq_f32 ||
475 LibcallImpl == RTLIB::impl_armpl_svpow_f32_x ||
476 LibcallImpl == RTLIB::impl_armpl_vcbrtq_f32 ||
477 LibcallImpl == RTLIB::impl_armpl_svcbrt_f32_x;
479 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsMxvv_fmod ||
480 LibcallImpl == RTLIB::impl__ZGVsMxvv_fmodf ||
481 LibcallImpl == RTLIB::impl_armpl_svfmod_f32_x ||
482 LibcallImpl == RTLIB::impl_armpl_svfmod_f64_x ||
483 LibcallImpl == RTLIB::impl_armpl_svpow_f32_x ||
484 LibcallImpl == RTLIB::impl_armpl_svpow_f64_x ||
485 LibcallImpl == RTLIB::impl_armpl_svcbrt_f32_x ||
486 LibcallImpl == RTLIB::impl_armpl_svcbrt_f64_x;
488 bool HasOneArg = LibcallImpl == RTLIB::impl_armpl_vcbrtq_f32 ||
489 LibcallImpl == RTLIB::impl_armpl_vcbrtq_f64 ||
490 LibcallImpl == RTLIB::impl_armpl_svcbrt_f32_x ||
491 LibcallImpl == RTLIB::impl_armpl_svcbrt_f64_x;
493 AttrBuilder FuncAttrBuilder(Ctx);
496 FuncAttrBuilder.addAttribute(Attr);
499 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
502 unsigned EC = IsF32 ? 4 : 2;
510 return {FuncTy, Attrs};
512 case RTLIB::impl__ZGVnN2vl8_modf:
513 case RTLIB::impl__ZGVnN4vl4_modff:
514 case RTLIB::impl__ZGVsNxvl8_modf:
515 case RTLIB::impl__ZGVsNxvl4_modff:
516 case RTLIB::impl_armpl_vmodfq_f64:
517 case RTLIB::impl_armpl_vmodfq_f32:
518 case RTLIB::impl_armpl_svmodf_f64_x:
519 case RTLIB::impl_armpl_svmodf_f32_x: {
520 AttrBuilder FuncAttrBuilder(Ctx);
522 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4_modff ||
523 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||
524 LibcallImpl == RTLIB::impl_armpl_vmodfq_f32 ||
525 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;
527 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8_modf ||
528 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||
529 LibcallImpl == RTLIB::impl_armpl_svmodf_f64_x ||
530 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;
533 unsigned EC = IsF32 ? 4 : 2;
537 FuncAttrBuilder.addAttribute(Attr);
541 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
544 AttrBuilder ArgAttrBuilder(Ctx);
546 ArgAttrBuilder.addAttribute(AK);
547 ArgAttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(VecTy));
548 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);
558 case RTLIB::impl__ZGVnN2vl8l8_sincos:
559 case RTLIB::impl__ZGVnN4vl4l4_sincosf:
560 case RTLIB::impl__ZGVsNxvl8l8_sincos:
561 case RTLIB::impl__ZGVsNxvl4l4_sincosf:
562 case RTLIB::impl_armpl_vsincosq_f64:
563 case RTLIB::impl_armpl_vsincosq_f32:
564 case RTLIB::impl_armpl_svsincos_f64_x:
565 case RTLIB::impl_armpl_svsincos_f32_x:
566 case RTLIB::impl__ZGVnN4vl4l4_sincospif:
567 case RTLIB::impl__ZGVnN2vl8l8_sincospi:
568 case RTLIB::impl__ZGVsNxvl4l4_sincospif:
569 case RTLIB::impl__ZGVsNxvl8l8_sincospi:
570 case RTLIB::impl_armpl_vsincospiq_f32:
571 case RTLIB::impl_armpl_vsincospiq_f64:
572 case RTLIB::impl_armpl_svsincospi_f32_x:
573 case RTLIB::impl_armpl_svsincospi_f64_x: {
574 AttrBuilder FuncAttrBuilder(Ctx);
576 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincospif ||
577 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||
578 LibcallImpl == RTLIB::impl_armpl_vsincospiq_f32 ||
579 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||
580 LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincosf ||
581 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||
582 LibcallImpl == RTLIB::impl_armpl_vsincosq_f32 ||
583 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x;
586 unsigned EC = IsF32 ? 4 : 2;
588 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincos ||
589 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||
590 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x ||
591 LibcallImpl == RTLIB::impl_armpl_svsincos_f64_x ||
592 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||
593 LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincospi ||
594 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||
595 LibcallImpl == RTLIB::impl_armpl_svsincospi_f64_x;
599 FuncAttrBuilder.addAttribute(Attr);
603 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
606 AttrBuilder ArgAttrBuilder(Ctx);
608 ArgAttrBuilder.addAttribute(AK);
609 ArgAttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(VecTy));
610 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);
611 Attrs = Attrs.addParamAttributes(Ctx, 2, ArgAttrBuilder);