39 ExceptionModel = TT.getDefaultExceptionHandling();
41 initLibcalls(TT, ExceptionModel,
FloatABI, EABIVersion, ABIName,
42 TT.getDefaultLongDoubleFormat());
47 for (RTLIB::LibcallImpl Impl :
48 {RTLIB::impl__ZGVnN2vv_fmod, RTLIB::impl__ZGVnN4vv_fmodf,
49 RTLIB::impl__ZGVsMxvv_fmod, RTLIB::impl__ZGVsMxvv_fmodf,
50 RTLIB::impl__ZGVnN2vl8_modf, RTLIB::impl__ZGVnN4vl4_modff,
51 RTLIB::impl__ZGVsNxvl8_modf, RTLIB::impl__ZGVsNxvl4_modff,
52 RTLIB::impl__ZGVnN2vl8l8_sincos, RTLIB::impl__ZGVnN4vl4l4_sincosf,
53 RTLIB::impl__ZGVsNxvl8l8_sincos, RTLIB::impl__ZGVsNxvl4l4_sincosf,
54 RTLIB::impl__ZGVnN4vl4l4_sincospif, RTLIB::impl__ZGVnN2vl8l8_sincospi,
55 RTLIB::impl__ZGVsNxvl4l4_sincospif,
56 RTLIB::impl__ZGVsNxvl8l8_sincospi})
60 for (RTLIB::LibcallImpl Impl : {RTLIB::impl_armpl_svfmod_f32_x,
61 RTLIB::impl_armpl_svfmod_f64_x,
62 RTLIB::impl_armpl_vfmodq_f32,
63 RTLIB::impl_armpl_vfmodq_f64,
64 RTLIB::impl_armpl_vmodfq_f64,
65 RTLIB::impl_armpl_vmodfq_f32,
66 RTLIB::impl_armpl_svmodf_f64_x,
67 RTLIB::impl_armpl_svmodf_f32_x,
68 RTLIB::impl_armpl_vsincosq_f64,
69 RTLIB::impl_armpl_vsincosq_f32,
70 RTLIB::impl_armpl_svsincos_f64_x,
71 RTLIB::impl_armpl_svsincos_f32_x,
72 RTLIB::impl_armpl_vsincospiq_f32,
73 RTLIB::impl_armpl_vsincospiq_f64,
74 RTLIB::impl_armpl_svsincospi_f32_x,
75 RTLIB::impl_armpl_svsincospi_f64_x,
76 RTLIB::impl_armpl_svpow_f32_x,
77 RTLIB::impl_armpl_svpow_f64_x,
78 RTLIB::impl_armpl_vpowq_f32,
79 RTLIB::impl_armpl_vpowq_f64,
80 RTLIB::impl_armpl_svcbrt_f32_x,
81 RTLIB::impl_armpl_svcbrt_f64_x,
82 RTLIB::impl_armpl_vcbrtq_f32,
83 RTLIB::impl_armpl_vcbrtq_f64})
86 for (RTLIB::LibcallImpl Impl :
87 {RTLIB::impl_armpl_vfmodq_f32, RTLIB::impl_armpl_vfmodq_f64,
88 RTLIB::impl_armpl_vsincosq_f64, RTLIB::impl_armpl_vsincosq_f32,
89 RTLIB::impl_armpl_vpowq_f32, RTLIB::impl_armpl_vpowq_f64,
90 RTLIB::impl_armpl_vcbrtq_f32, RTLIB::impl_armpl_vcbrtq_f64})
94 for (RTLIB::LibcallImpl Impl :
95 {RTLIB::impl_amd_vrd2_sincos, RTLIB::impl_amd_vrd4_sincos,
96 RTLIB::impl_amd_vrd8_sincos, RTLIB::impl_amd_vrs4_sincosf,
97 RTLIB::impl_amd_vrs8_sincosf, RTLIB::impl_amd_vrs16_sincosf})
164 RTLIB::LibcallImpl LibcallImpl)
const {
167 Attribute::NoCallback, Attribute::NoFree, Attribute::NoSync,
168 Attribute::NoUnwind, Attribute::WillReturn};
170 Attribute::NoUnwind, Attribute::WillReturn};
172 Attribute::NoAlias, Attribute::WriteOnly, Attribute::NonNull};
174 switch (LibcallImpl) {
175 case RTLIB::impl___sincos_stret:
176 case RTLIB::impl___sincosf_stret: {
177 if (!darwinHasSinCosStret(TT))
180 Type *ScalarTy = LibcallImpl == RTLIB::impl___sincosf_stret
184 AttrBuilder FuncAttrBuilder(Ctx);
186 FuncAttrBuilder.addAttribute(Attr);
189 TT.isX86_32() || ((TT.isARM() || TT.isThumb()) &&
196 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
199 AttrBuilder AttrBuilder(Ctx);
201 AttrBuilder.addStructRetAttr(StructTy);
202 AttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(StructTy));
206 return {FuncTy, Attrs.addParamAttributes(Ctx, 0, AttrBuilder)};
210 LibcallImpl == RTLIB::impl___sincosf_stret && TT.isX86_64()
216 case RTLIB::impl_malloc:
217 case RTLIB::impl_calloc: {
218 AttrBuilder FuncAttrBuilder(Ctx);
220 FuncAttrBuilder.addAttribute(Attr);
221 FuncAttrBuilder.addAttribute(Attribute::NoFree);
224 if (LibcallImpl == RTLIB::impl_malloc)
228 FuncAttrBuilder.addAllocKindAttr(AllocKind);
229 FuncAttrBuilder.addAttribute(
"alloc-family",
"malloc");
230 FuncAttrBuilder.addAllocSizeAttr(0, LibcallImpl == RTLIB::impl_malloc
232 : std::make_optional(1));
235 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
238 AttrBuilder ArgAttrBuilder(Ctx);
240 ArgAttrBuilder.addAttribute(AK);
242 Attrs = Attrs.addRetAttribute(Ctx, Attribute::NoUndef);
243 Attrs = Attrs.addRetAttribute(Ctx, Attribute::NoAlias);
244 Attrs = Attrs.addParamAttribute(Ctx, 0, Attribute::NoUndef);
245 if (LibcallImpl == RTLIB::impl_calloc)
246 Attrs = Attrs.addParamAttribute(Ctx, 1, Attribute::NoUndef);
252 if (LibcallImpl == RTLIB::impl_calloc)
257 case RTLIB::impl_free: {
259 AttrBuilder FuncAttrBuilder(Ctx);
261 FuncAttrBuilder.addAttribute(Attr);
264 FuncAttrBuilder.addAttribute(
"alloc-family",
"malloc");
267 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
270 AttrBuilder ArgAttrBuilder(Ctx);
271 ArgAttrBuilder.addAttribute(Attribute::NoUndef);
272 ArgAttrBuilder.addAttribute(Attribute::AllocatedPointer);
274 Attrs = Attrs.addParamAttributes(Ctx, 0, ArgAttrBuilder);
281 case RTLIB::impl_sqrtf:
282 case RTLIB::impl_sqrt: {
283 AttrBuilder FuncAttrBuilder(Ctx);
286 FuncAttrBuilder.addAttribute(Attr);
290 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
296 Attrs = Attrs.addRetAttribute(
299 return {FuncTy, Attrs};
301 case RTLIB::impl__ZGVnN2vv_fmod:
302 case RTLIB::impl__ZGVnN4vv_fmodf:
303 case RTLIB::impl__ZGVsMxvv_fmod:
304 case RTLIB::impl__ZGVsMxvv_fmodf:
305 case RTLIB::impl_armpl_vfmodq_f32:
306 case RTLIB::impl_armpl_vfmodq_f64:
307 case RTLIB::impl_armpl_svfmod_f32_x:
308 case RTLIB::impl_armpl_svfmod_f64_x:
309 case RTLIB::impl_armpl_vpowq_f32:
310 case RTLIB::impl_armpl_vpowq_f64:
311 case RTLIB::impl_armpl_svpow_f32_x:
312 case RTLIB::impl_armpl_svpow_f64_x:
313 case RTLIB::impl_armpl_vcbrtq_f32:
314 case RTLIB::impl_armpl_vcbrtq_f64:
315 case RTLIB::impl_armpl_svcbrt_f32_x:
316 case RTLIB::impl_armpl_svcbrt_f64_x: {
317 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vv_fmodf ||
318 LibcallImpl == RTLIB::impl__ZGVsMxvv_fmodf ||
319 LibcallImpl == RTLIB::impl_armpl_svfmod_f32_x ||
320 LibcallImpl == RTLIB::impl_armpl_vfmodq_f32 ||
321 LibcallImpl == RTLIB::impl_armpl_vpowq_f32 ||
322 LibcallImpl == RTLIB::impl_armpl_svpow_f32_x ||
323 LibcallImpl == RTLIB::impl_armpl_vcbrtq_f32 ||
324 LibcallImpl == RTLIB::impl_armpl_svcbrt_f32_x;
326 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsMxvv_fmod ||
327 LibcallImpl == RTLIB::impl__ZGVsMxvv_fmodf ||
328 LibcallImpl == RTLIB::impl_armpl_svfmod_f32_x ||
329 LibcallImpl == RTLIB::impl_armpl_svfmod_f64_x ||
330 LibcallImpl == RTLIB::impl_armpl_svpow_f32_x ||
331 LibcallImpl == RTLIB::impl_armpl_svpow_f64_x ||
332 LibcallImpl == RTLIB::impl_armpl_svcbrt_f32_x ||
333 LibcallImpl == RTLIB::impl_armpl_svcbrt_f64_x;
335 bool HasOneArg = LibcallImpl == RTLIB::impl_armpl_vcbrtq_f32 ||
336 LibcallImpl == RTLIB::impl_armpl_vcbrtq_f64 ||
337 LibcallImpl == RTLIB::impl_armpl_svcbrt_f32_x ||
338 LibcallImpl == RTLIB::impl_armpl_svcbrt_f64_x;
340 AttrBuilder FuncAttrBuilder(Ctx);
343 FuncAttrBuilder.addAttribute(Attr);
346 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
349 unsigned EC = IsF32 ? 4 : 2;
357 return {FuncTy, Attrs};
359 case RTLIB::impl__ZGVnN2vl8_modf:
360 case RTLIB::impl__ZGVnN4vl4_modff:
361 case RTLIB::impl__ZGVsNxvl8_modf:
362 case RTLIB::impl__ZGVsNxvl4_modff:
363 case RTLIB::impl_armpl_vmodfq_f64:
364 case RTLIB::impl_armpl_vmodfq_f32:
365 case RTLIB::impl_armpl_svmodf_f64_x:
366 case RTLIB::impl_armpl_svmodf_f32_x: {
367 AttrBuilder FuncAttrBuilder(Ctx);
369 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4_modff ||
370 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||
371 LibcallImpl == RTLIB::impl_armpl_vmodfq_f32 ||
372 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;
374 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8_modf ||
375 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||
376 LibcallImpl == RTLIB::impl_armpl_svmodf_f64_x ||
377 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;
380 unsigned EC = IsF32 ? 4 : 2;
384 FuncAttrBuilder.addAttribute(Attr);
388 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
391 AttrBuilder ArgAttrBuilder(Ctx);
393 ArgAttrBuilder.addAttribute(AK);
394 ArgAttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(VecTy));
395 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);
405 case RTLIB::impl__ZGVnN2vl8l8_sincos:
406 case RTLIB::impl__ZGVnN4vl4l4_sincosf:
407 case RTLIB::impl__ZGVsNxvl8l8_sincos:
408 case RTLIB::impl__ZGVsNxvl4l4_sincosf:
409 case RTLIB::impl_armpl_vsincosq_f64:
410 case RTLIB::impl_armpl_vsincosq_f32:
411 case RTLIB::impl_armpl_svsincos_f64_x:
412 case RTLIB::impl_armpl_svsincos_f32_x:
413 case RTLIB::impl__ZGVnN4vl4l4_sincospif:
414 case RTLIB::impl__ZGVnN2vl8l8_sincospi:
415 case RTLIB::impl__ZGVsNxvl4l4_sincospif:
416 case RTLIB::impl__ZGVsNxvl8l8_sincospi:
417 case RTLIB::impl_armpl_vsincospiq_f32:
418 case RTLIB::impl_armpl_vsincospiq_f64:
419 case RTLIB::impl_armpl_svsincospi_f32_x:
420 case RTLIB::impl_armpl_svsincospi_f64_x: {
421 AttrBuilder FuncAttrBuilder(Ctx);
423 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincospif ||
424 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||
425 LibcallImpl == RTLIB::impl_armpl_vsincospiq_f32 ||
426 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||
427 LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincosf ||
428 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||
429 LibcallImpl == RTLIB::impl_armpl_vsincosq_f32 ||
430 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x;
433 unsigned EC = IsF32 ? 4 : 2;
435 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincos ||
436 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||
437 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x ||
438 LibcallImpl == RTLIB::impl_armpl_svsincos_f64_x ||
439 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||
440 LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincospi ||
441 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||
442 LibcallImpl == RTLIB::impl_armpl_svsincospi_f64_x;
446 FuncAttrBuilder.addAttribute(Attr);
450 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
453 AttrBuilder ArgAttrBuilder(Ctx);
455 ArgAttrBuilder.addAttribute(AK);
456 ArgAttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(VecTy));
457 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);
458 Attrs = Attrs.addParamAttributes(Ctx, 2, ArgAttrBuilder);