39 ExceptionModel = TT.getDefaultExceptionHandling();
41 initLibcalls(TT, ExceptionModel,
FloatABI, EABIVersion, ABIName);
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})
170 RTLIB::LibcallImpl LibcallImpl)
const {
173 Attribute::NoCallback, Attribute::NoFree, Attribute::NoSync,
174 Attribute::NoUnwind, Attribute::WillReturn};
176 Attribute::NoUnwind, Attribute::WillReturn};
178 Attribute::NoAlias, Attribute::WriteOnly, Attribute::NonNull};
180 switch (LibcallImpl) {
181 case RTLIB::impl___sincos_stret:
182 case RTLIB::impl___sincosf_stret: {
183 if (!darwinHasSinCosStret(TT))
186 Type *ScalarTy = LibcallImpl == RTLIB::impl___sincosf_stret
190 AttrBuilder FuncAttrBuilder(Ctx);
192 FuncAttrBuilder.addAttribute(Attr);
195 TT.isX86_32() || ((TT.isARM() || TT.isThumb()) &&
202 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
205 AttrBuilder AttrBuilder(Ctx);
207 AttrBuilder.addStructRetAttr(StructTy);
208 AttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(StructTy));
212 return {FuncTy, Attrs.addParamAttributes(Ctx, 0, AttrBuilder)};
216 LibcallImpl == RTLIB::impl___sincosf_stret && TT.isX86_64()
222 case RTLIB::impl_malloc:
223 case RTLIB::impl_calloc: {
224 AttrBuilder FuncAttrBuilder(Ctx);
226 FuncAttrBuilder.addAttribute(Attr);
227 FuncAttrBuilder.addAttribute(Attribute::NoFree);
230 if (LibcallImpl == RTLIB::impl_malloc)
234 FuncAttrBuilder.addAllocKindAttr(AllocKind);
235 FuncAttrBuilder.addAttribute(
"alloc-family",
"malloc");
236 FuncAttrBuilder.addAllocSizeAttr(0, LibcallImpl == RTLIB::impl_malloc
238 : std::make_optional(1));
241 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
244 AttrBuilder ArgAttrBuilder(Ctx);
246 ArgAttrBuilder.addAttribute(AK);
248 Attrs = Attrs.addRetAttribute(Ctx, Attribute::NoUndef);
249 Attrs = Attrs.addRetAttribute(Ctx, Attribute::NoAlias);
250 Attrs = Attrs.addParamAttribute(Ctx, 0, Attribute::NoUndef);
251 if (LibcallImpl == RTLIB::impl_calloc)
252 Attrs = Attrs.addParamAttribute(Ctx, 1, Attribute::NoUndef);
258 if (LibcallImpl == RTLIB::impl_calloc)
263 case RTLIB::impl_free: {
265 AttrBuilder FuncAttrBuilder(Ctx);
267 FuncAttrBuilder.addAttribute(Attr);
270 FuncAttrBuilder.addAttribute(
"alloc-family",
"malloc");
273 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
276 AttrBuilder ArgAttrBuilder(Ctx);
277 ArgAttrBuilder.addAttribute(Attribute::NoUndef);
278 ArgAttrBuilder.addAttribute(Attribute::AllocatedPointer);
280 Attrs = Attrs.addParamAttributes(Ctx, 0, ArgAttrBuilder);
287 case RTLIB::impl_sqrtf:
288 case RTLIB::impl_sqrt: {
289 AttrBuilder FuncAttrBuilder(Ctx);
292 FuncAttrBuilder.addAttribute(Attr);
296 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
302 Attrs = Attrs.addRetAttribute(
305 return {FuncTy, Attrs};
307 case RTLIB::impl__ZGVnN2vv_fmod:
308 case RTLIB::impl__ZGVnN4vv_fmodf:
309 case RTLIB::impl__ZGVsMxvv_fmod:
310 case RTLIB::impl__ZGVsMxvv_fmodf:
311 case RTLIB::impl_armpl_vfmodq_f32:
312 case RTLIB::impl_armpl_vfmodq_f64:
313 case RTLIB::impl_armpl_svfmod_f32_x:
314 case RTLIB::impl_armpl_svfmod_f64_x:
315 case RTLIB::impl_armpl_vpowq_f32:
316 case RTLIB::impl_armpl_vpowq_f64:
317 case RTLIB::impl_armpl_svpow_f32_x:
318 case RTLIB::impl_armpl_svpow_f64_x:
319 case RTLIB::impl_armpl_vcbrtq_f32:
320 case RTLIB::impl_armpl_vcbrtq_f64:
321 case RTLIB::impl_armpl_svcbrt_f32_x:
322 case RTLIB::impl_armpl_svcbrt_f64_x: {
323 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vv_fmodf ||
324 LibcallImpl == RTLIB::impl__ZGVsMxvv_fmodf ||
325 LibcallImpl == RTLIB::impl_armpl_svfmod_f32_x ||
326 LibcallImpl == RTLIB::impl_armpl_vfmodq_f32 ||
327 LibcallImpl == RTLIB::impl_armpl_vpowq_f32 ||
328 LibcallImpl == RTLIB::impl_armpl_svpow_f32_x ||
329 LibcallImpl == RTLIB::impl_armpl_vcbrtq_f32 ||
330 LibcallImpl == RTLIB::impl_armpl_svcbrt_f32_x;
332 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsMxvv_fmod ||
333 LibcallImpl == RTLIB::impl__ZGVsMxvv_fmodf ||
334 LibcallImpl == RTLIB::impl_armpl_svfmod_f32_x ||
335 LibcallImpl == RTLIB::impl_armpl_svfmod_f64_x ||
336 LibcallImpl == RTLIB::impl_armpl_svpow_f32_x ||
337 LibcallImpl == RTLIB::impl_armpl_svpow_f64_x ||
338 LibcallImpl == RTLIB::impl_armpl_svcbrt_f32_x ||
339 LibcallImpl == RTLIB::impl_armpl_svcbrt_f64_x;
341 bool HasOneArg = LibcallImpl == RTLIB::impl_armpl_vcbrtq_f32 ||
342 LibcallImpl == RTLIB::impl_armpl_vcbrtq_f64 ||
343 LibcallImpl == RTLIB::impl_armpl_svcbrt_f32_x ||
344 LibcallImpl == RTLIB::impl_armpl_svcbrt_f64_x;
346 AttrBuilder FuncAttrBuilder(Ctx);
349 FuncAttrBuilder.addAttribute(Attr);
352 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
355 unsigned EC = IsF32 ? 4 : 2;
363 return {FuncTy, Attrs};
365 case RTLIB::impl__ZGVnN2vl8_modf:
366 case RTLIB::impl__ZGVnN4vl4_modff:
367 case RTLIB::impl__ZGVsNxvl8_modf:
368 case RTLIB::impl__ZGVsNxvl4_modff:
369 case RTLIB::impl_armpl_vmodfq_f64:
370 case RTLIB::impl_armpl_vmodfq_f32:
371 case RTLIB::impl_armpl_svmodf_f64_x:
372 case RTLIB::impl_armpl_svmodf_f32_x: {
373 AttrBuilder FuncAttrBuilder(Ctx);
375 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4_modff ||
376 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||
377 LibcallImpl == RTLIB::impl_armpl_vmodfq_f32 ||
378 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;
380 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8_modf ||
381 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||
382 LibcallImpl == RTLIB::impl_armpl_svmodf_f64_x ||
383 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;
386 unsigned EC = IsF32 ? 4 : 2;
390 FuncAttrBuilder.addAttribute(Attr);
394 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
397 AttrBuilder ArgAttrBuilder(Ctx);
399 ArgAttrBuilder.addAttribute(AK);
400 ArgAttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(VecTy));
401 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);
411 case RTLIB::impl__ZGVnN2vl8l8_sincos:
412 case RTLIB::impl__ZGVnN4vl4l4_sincosf:
413 case RTLIB::impl__ZGVsNxvl8l8_sincos:
414 case RTLIB::impl__ZGVsNxvl4l4_sincosf:
415 case RTLIB::impl_armpl_vsincosq_f64:
416 case RTLIB::impl_armpl_vsincosq_f32:
417 case RTLIB::impl_armpl_svsincos_f64_x:
418 case RTLIB::impl_armpl_svsincos_f32_x:
419 case RTLIB::impl__ZGVnN4vl4l4_sincospif:
420 case RTLIB::impl__ZGVnN2vl8l8_sincospi:
421 case RTLIB::impl__ZGVsNxvl4l4_sincospif:
422 case RTLIB::impl__ZGVsNxvl8l8_sincospi:
423 case RTLIB::impl_armpl_vsincospiq_f32:
424 case RTLIB::impl_armpl_vsincospiq_f64:
425 case RTLIB::impl_armpl_svsincospi_f32_x:
426 case RTLIB::impl_armpl_svsincospi_f64_x: {
427 AttrBuilder FuncAttrBuilder(Ctx);
429 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincospif ||
430 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||
431 LibcallImpl == RTLIB::impl_armpl_vsincospiq_f32 ||
432 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||
433 LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincosf ||
434 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||
435 LibcallImpl == RTLIB::impl_armpl_vsincosq_f32 ||
436 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x;
439 unsigned EC = IsF32 ? 4 : 2;
441 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincos ||
442 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||
443 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x ||
444 LibcallImpl == RTLIB::impl_armpl_svsincos_f64_x ||
445 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||
446 LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincospi ||
447 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||
448 LibcallImpl == RTLIB::impl_armpl_svsincospi_f64_x;
452 FuncAttrBuilder.addAttribute(Attr);
456 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
459 AttrBuilder ArgAttrBuilder(Ctx);
461 ArgAttrBuilder.addAttribute(AK);
462 ArgAttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(VecTy));
463 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);
464 Attrs = Attrs.addParamAttributes(Ctx, 2, ArgAttrBuilder);