42 ExceptionModel = TT.getDefaultExceptionHandling();
44 initLibcalls(TT, ExceptionModel,
FloatABI, EABIVersion, ABIName,
45 TT.getDefaultLongDoubleFormat());
50 for (RTLIB::LibcallImpl Impl :
51 {RTLIB::impl__ZGVnN2vv_fmod, RTLIB::impl__ZGVnN4vv_fmodf,
52 RTLIB::impl__ZGVsMxvv_fmod, RTLIB::impl__ZGVsMxvv_fmodf,
53 RTLIB::impl__ZGVnN2vl8_modf, RTLIB::impl__ZGVnN4vl4_modff,
54 RTLIB::impl__ZGVsNxvl8_modf, RTLIB::impl__ZGVsNxvl4_modff,
55 RTLIB::impl__ZGVnN2vl8l8_sincos, RTLIB::impl__ZGVnN4vl4l4_sincosf,
56 RTLIB::impl__ZGVsNxvl8l8_sincos, RTLIB::impl__ZGVsNxvl4l4_sincosf,
57 RTLIB::impl__ZGVnN4vl4l4_sincospif, RTLIB::impl__ZGVnN2vl8l8_sincospi,
58 RTLIB::impl__ZGVsNxvl4l4_sincospif,
59 RTLIB::impl__ZGVsNxvl8l8_sincospi})
63 for (RTLIB::LibcallImpl Impl : {RTLIB::impl_armpl_svfmod_f32_x,
64 RTLIB::impl_armpl_svfmod_f64_x,
65 RTLIB::impl_armpl_vfmodq_f32,
66 RTLIB::impl_armpl_vfmodq_f64,
67 RTLIB::impl_armpl_vmodfq_f64,
68 RTLIB::impl_armpl_vmodfq_f32,
69 RTLIB::impl_armpl_svmodf_f64_x,
70 RTLIB::impl_armpl_svmodf_f32_x,
71 RTLIB::impl_armpl_vsincosq_f64,
72 RTLIB::impl_armpl_vsincosq_f32,
73 RTLIB::impl_armpl_svsincos_f64_x,
74 RTLIB::impl_armpl_svsincos_f32_x,
75 RTLIB::impl_armpl_vsincospiq_f32,
76 RTLIB::impl_armpl_vsincospiq_f64,
77 RTLIB::impl_armpl_svsincospi_f32_x,
78 RTLIB::impl_armpl_svsincospi_f64_x,
79 RTLIB::impl_armpl_svpow_f32_x,
80 RTLIB::impl_armpl_svpow_f64_x,
81 RTLIB::impl_armpl_vpowq_f32,
82 RTLIB::impl_armpl_vpowq_f64,
83 RTLIB::impl_armpl_svcbrt_f32_x,
84 RTLIB::impl_armpl_svcbrt_f64_x,
85 RTLIB::impl_armpl_vcbrtq_f32,
86 RTLIB::impl_armpl_vcbrtq_f64})
89 for (RTLIB::LibcallImpl Impl :
90 {RTLIB::impl_armpl_vfmodq_f32, RTLIB::impl_armpl_vfmodq_f64,
91 RTLIB::impl_armpl_vsincosq_f64, RTLIB::impl_armpl_vsincosq_f32,
92 RTLIB::impl_armpl_vpowq_f32, RTLIB::impl_armpl_vpowq_f64,
93 RTLIB::impl_armpl_vcbrtq_f32, RTLIB::impl_armpl_vcbrtq_f64})
97 for (RTLIB::LibcallImpl Impl :
98 {RTLIB::impl_amd_vrd2_sincos, RTLIB::impl_amd_vrd4_sincos,
99 RTLIB::impl_amd_vrd8_sincos, RTLIB::impl_amd_vrs4_sincosf,
100 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_sqrtf:
278 case RTLIB::impl_sqrt: {
279 AttrBuilder FuncAttrBuilder(Ctx);
282 FuncAttrBuilder.addAttribute(Attr);
286 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
292 Attrs = Attrs.addRetAttribute(
295 return {FuncTy, Attrs};
297 case RTLIB::impl__ZGVnN2vv_fmod:
298 case RTLIB::impl__ZGVnN4vv_fmodf:
299 case RTLIB::impl__ZGVsMxvv_fmod:
300 case RTLIB::impl__ZGVsMxvv_fmodf:
301 case RTLIB::impl_armpl_vfmodq_f32:
302 case RTLIB::impl_armpl_vfmodq_f64:
303 case RTLIB::impl_armpl_svfmod_f32_x:
304 case RTLIB::impl_armpl_svfmod_f64_x:
305 case RTLIB::impl_armpl_vpowq_f32:
306 case RTLIB::impl_armpl_vpowq_f64:
307 case RTLIB::impl_armpl_svpow_f32_x:
308 case RTLIB::impl_armpl_svpow_f64_x:
309 case RTLIB::impl_armpl_vcbrtq_f32:
310 case RTLIB::impl_armpl_vcbrtq_f64:
311 case RTLIB::impl_armpl_svcbrt_f32_x:
312 case RTLIB::impl_armpl_svcbrt_f64_x: {
313 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vv_fmodf ||
314 LibcallImpl == RTLIB::impl__ZGVsMxvv_fmodf ||
315 LibcallImpl == RTLIB::impl_armpl_svfmod_f32_x ||
316 LibcallImpl == RTLIB::impl_armpl_vfmodq_f32 ||
317 LibcallImpl == RTLIB::impl_armpl_vpowq_f32 ||
318 LibcallImpl == RTLIB::impl_armpl_svpow_f32_x ||
319 LibcallImpl == RTLIB::impl_armpl_vcbrtq_f32 ||
320 LibcallImpl == RTLIB::impl_armpl_svcbrt_f32_x;
322 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsMxvv_fmod ||
323 LibcallImpl == RTLIB::impl__ZGVsMxvv_fmodf ||
324 LibcallImpl == RTLIB::impl_armpl_svfmod_f32_x ||
325 LibcallImpl == RTLIB::impl_armpl_svfmod_f64_x ||
326 LibcallImpl == RTLIB::impl_armpl_svpow_f32_x ||
327 LibcallImpl == RTLIB::impl_armpl_svpow_f64_x ||
328 LibcallImpl == RTLIB::impl_armpl_svcbrt_f32_x ||
329 LibcallImpl == RTLIB::impl_armpl_svcbrt_f64_x;
331 bool HasOneArg = LibcallImpl == RTLIB::impl_armpl_vcbrtq_f32 ||
332 LibcallImpl == RTLIB::impl_armpl_vcbrtq_f64 ||
333 LibcallImpl == RTLIB::impl_armpl_svcbrt_f32_x ||
334 LibcallImpl == RTLIB::impl_armpl_svcbrt_f64_x;
336 AttrBuilder FuncAttrBuilder(Ctx);
339 FuncAttrBuilder.addAttribute(Attr);
342 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
345 unsigned EC = IsF32 ? 4 : 2;
353 return {FuncTy, Attrs};
355 case RTLIB::impl__ZGVnN2vl8_modf:
356 case RTLIB::impl__ZGVnN4vl4_modff:
357 case RTLIB::impl__ZGVsNxvl8_modf:
358 case RTLIB::impl__ZGVsNxvl4_modff:
359 case RTLIB::impl_armpl_vmodfq_f64:
360 case RTLIB::impl_armpl_vmodfq_f32:
361 case RTLIB::impl_armpl_svmodf_f64_x:
362 case RTLIB::impl_armpl_svmodf_f32_x: {
363 AttrBuilder FuncAttrBuilder(Ctx);
365 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4_modff ||
366 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||
367 LibcallImpl == RTLIB::impl_armpl_vmodfq_f32 ||
368 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;
370 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8_modf ||
371 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||
372 LibcallImpl == RTLIB::impl_armpl_svmodf_f64_x ||
373 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;
376 unsigned EC = IsF32 ? 4 : 2;
380 FuncAttrBuilder.addAttribute(Attr);
384 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
387 AttrBuilder ArgAttrBuilder(Ctx);
389 ArgAttrBuilder.addAttribute(AK);
390 ArgAttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(VecTy));
391 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);
401 case RTLIB::impl__ZGVnN2vl8l8_sincos:
402 case RTLIB::impl__ZGVnN4vl4l4_sincosf:
403 case RTLIB::impl__ZGVsNxvl8l8_sincos:
404 case RTLIB::impl__ZGVsNxvl4l4_sincosf:
405 case RTLIB::impl_armpl_vsincosq_f64:
406 case RTLIB::impl_armpl_vsincosq_f32:
407 case RTLIB::impl_armpl_svsincos_f64_x:
408 case RTLIB::impl_armpl_svsincos_f32_x:
409 case RTLIB::impl__ZGVnN4vl4l4_sincospif:
410 case RTLIB::impl__ZGVnN2vl8l8_sincospi:
411 case RTLIB::impl__ZGVsNxvl4l4_sincospif:
412 case RTLIB::impl__ZGVsNxvl8l8_sincospi:
413 case RTLIB::impl_armpl_vsincospiq_f32:
414 case RTLIB::impl_armpl_vsincospiq_f64:
415 case RTLIB::impl_armpl_svsincospi_f32_x:
416 case RTLIB::impl_armpl_svsincospi_f64_x: {
417 AttrBuilder FuncAttrBuilder(Ctx);
419 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincospif ||
420 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||
421 LibcallImpl == RTLIB::impl_armpl_vsincospiq_f32 ||
422 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||
423 LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincosf ||
424 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||
425 LibcallImpl == RTLIB::impl_armpl_vsincosq_f32 ||
426 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x;
429 unsigned EC = IsF32 ? 4 : 2;
431 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincos ||
432 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||
433 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x ||
434 LibcallImpl == RTLIB::impl_armpl_svsincos_f64_x ||
435 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||
436 LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincospi ||
437 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||
438 LibcallImpl == RTLIB::impl_armpl_svsincospi_f64_x;
442 FuncAttrBuilder.addAttribute(Attr);
446 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
449 AttrBuilder ArgAttrBuilder(Ctx);
451 ArgAttrBuilder.addAttribute(AK);
452 ArgAttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(VecTy));
453 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);
454 Attrs = Attrs.addParamAttributes(Ctx, 2, ArgAttrBuilder);