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 :
60 {RTLIB::impl_armpl_svfmod_f32_x, RTLIB::impl_armpl_svfmod_f64_x,
61 RTLIB::impl_armpl_vfmodq_f32, RTLIB::impl_armpl_vfmodq_f64,
62 RTLIB::impl_armpl_vmodfq_f64, RTLIB::impl_armpl_vmodfq_f32,
63 RTLIB::impl_armpl_svmodf_f64_x, RTLIB::impl_armpl_svmodf_f32_x,
64 RTLIB::impl_armpl_vsincosq_f64, RTLIB::impl_armpl_vsincosq_f32,
65 RTLIB::impl_armpl_svsincos_f64_x, RTLIB::impl_armpl_svsincos_f32_x,
66 RTLIB::impl_armpl_vsincospiq_f32, RTLIB::impl_armpl_vsincospiq_f64,
67 RTLIB::impl_armpl_svsincospi_f32_x,
68 RTLIB::impl_armpl_svsincospi_f64_x, RTLIB::impl_armpl_svpow_f32_x,
69 RTLIB::impl_armpl_svpow_f64_x, RTLIB::impl_armpl_vpowq_f32,
70 RTLIB::impl_armpl_vpowq_f64})
73 for (RTLIB::LibcallImpl Impl :
74 {RTLIB::impl_armpl_vfmodq_f32, RTLIB::impl_armpl_vfmodq_f64,
75 RTLIB::impl_armpl_vsincosq_f64, RTLIB::impl_armpl_vsincosq_f32,
76 RTLIB::impl_armpl_vpowq_f32, RTLIB::impl_armpl_vpowq_f64})
150 RTLIB::LibcallImpl LibcallImpl)
const {
153 Attribute::MustProgress, Attribute::NoCallback, Attribute::NoFree,
154 Attribute::NoSync, Attribute::NoUnwind, Attribute::WillReturn};
156 Attribute::MustProgress, Attribute::NoUnwind, Attribute::WillReturn};
158 Attribute::NoAlias, Attribute::WriteOnly, Attribute::NonNull};
160 switch (LibcallImpl) {
161 case RTLIB::impl___sincos_stret:
162 case RTLIB::impl___sincosf_stret: {
163 if (!darwinHasSinCosStret(TT))
166 Type *ScalarTy = LibcallImpl == RTLIB::impl___sincosf_stret
170 AttrBuilder FuncAttrBuilder(Ctx);
172 FuncAttrBuilder.addAttribute(Attr);
175 TT.isX86_32() || ((TT.isARM() || TT.isThumb()) &&
182 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
185 AttrBuilder AttrBuilder(Ctx);
187 AttrBuilder.addStructRetAttr(StructTy);
188 AttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(StructTy));
192 return {FuncTy, Attrs.addParamAttributes(Ctx, 0, AttrBuilder)};
196 LibcallImpl == RTLIB::impl___sincosf_stret && TT.isX86_64()
202 case RTLIB::impl_malloc:
203 case RTLIB::impl_calloc: {
204 AttrBuilder FuncAttrBuilder(Ctx);
206 FuncAttrBuilder.addAttribute(Attr);
207 FuncAttrBuilder.addAttribute(Attribute::NoFree);
210 if (LibcallImpl == RTLIB::impl_malloc)
214 FuncAttrBuilder.addAllocKindAttr(AllocKind);
215 FuncAttrBuilder.addAttribute(
"alloc-family",
"malloc");
216 FuncAttrBuilder.addAllocSizeAttr(0, LibcallImpl == RTLIB::impl_malloc
218 : std::make_optional(1));
221 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
224 AttrBuilder ArgAttrBuilder(Ctx);
226 ArgAttrBuilder.addAttribute(AK);
228 Attrs = Attrs.addRetAttribute(Ctx, Attribute::NoUndef);
229 Attrs = Attrs.addRetAttribute(Ctx, Attribute::NoAlias);
230 Attrs = Attrs.addParamAttribute(Ctx, 0, Attribute::NoUndef);
231 if (LibcallImpl == RTLIB::impl_calloc)
232 Attrs = Attrs.addParamAttribute(Ctx, 1, Attribute::NoUndef);
238 if (LibcallImpl == RTLIB::impl_calloc)
243 case RTLIB::impl_free: {
245 AttrBuilder FuncAttrBuilder(Ctx);
247 FuncAttrBuilder.addAttribute(Attr);
250 FuncAttrBuilder.addAttribute(
"alloc-family",
"malloc");
253 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
256 AttrBuilder ArgAttrBuilder(Ctx);
257 ArgAttrBuilder.addAttribute(Attribute::NoUndef);
258 ArgAttrBuilder.addAttribute(Attribute::AllocatedPointer);
260 Attrs = Attrs.addParamAttributes(Ctx, 0, ArgAttrBuilder);
267 case RTLIB::impl_sqrtf:
268 case RTLIB::impl_sqrt: {
269 AttrBuilder FuncAttrBuilder(Ctx);
272 FuncAttrBuilder.addAttribute(Attr);
276 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
282 Attrs = Attrs.addRetAttribute(
285 return {FuncTy, Attrs};
287 case RTLIB::impl__ZGVnN2vv_fmod:
288 case RTLIB::impl__ZGVnN4vv_fmodf:
289 case RTLIB::impl__ZGVsMxvv_fmod:
290 case RTLIB::impl__ZGVsMxvv_fmodf:
291 case RTLIB::impl_armpl_vfmodq_f32:
292 case RTLIB::impl_armpl_vfmodq_f64:
293 case RTLIB::impl_armpl_svfmod_f32_x:
294 case RTLIB::impl_armpl_svfmod_f64_x:
295 case RTLIB::impl_armpl_vpowq_f32:
296 case RTLIB::impl_armpl_vpowq_f64:
297 case RTLIB::impl_armpl_svpow_f32_x:
298 case RTLIB::impl_armpl_svpow_f64_x: {
299 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vv_fmodf ||
300 LibcallImpl == RTLIB::impl__ZGVsMxvv_fmodf ||
301 LibcallImpl == RTLIB::impl_armpl_svfmod_f32_x ||
302 LibcallImpl == RTLIB::impl_armpl_vfmodq_f32 ||
303 LibcallImpl == RTLIB::impl_armpl_vpowq_f32 ||
304 LibcallImpl == RTLIB::impl_armpl_svpow_f32_x;
306 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsMxvv_fmod ||
307 LibcallImpl == RTLIB::impl__ZGVsMxvv_fmodf ||
308 LibcallImpl == RTLIB::impl_armpl_svfmod_f32_x ||
309 LibcallImpl == RTLIB::impl_armpl_svfmod_f64_x ||
310 LibcallImpl == RTLIB::impl_armpl_svpow_f32_x ||
311 LibcallImpl == RTLIB::impl_armpl_svpow_f64_x;
313 AttrBuilder FuncAttrBuilder(Ctx);
316 FuncAttrBuilder.addAttribute(Attr);
319 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
322 unsigned EC = IsF32 ? 4 : 2;
330 return {FuncTy, Attrs};
332 case RTLIB::impl__ZGVnN2vl8_modf:
333 case RTLIB::impl__ZGVnN4vl4_modff:
334 case RTLIB::impl__ZGVsNxvl8_modf:
335 case RTLIB::impl__ZGVsNxvl4_modff:
336 case RTLIB::impl_armpl_vmodfq_f64:
337 case RTLIB::impl_armpl_vmodfq_f32:
338 case RTLIB::impl_armpl_svmodf_f64_x:
339 case RTLIB::impl_armpl_svmodf_f32_x: {
340 AttrBuilder FuncAttrBuilder(Ctx);
342 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4_modff ||
343 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||
344 LibcallImpl == RTLIB::impl_armpl_vmodfq_f32 ||
345 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;
347 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8_modf ||
348 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||
349 LibcallImpl == RTLIB::impl_armpl_svmodf_f64_x ||
350 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;
353 unsigned EC = IsF32 ? 4 : 2;
357 FuncAttrBuilder.addAttribute(Attr);
361 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
364 AttrBuilder ArgAttrBuilder(Ctx);
366 ArgAttrBuilder.addAttribute(AK);
367 ArgAttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(VecTy));
368 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);
378 case RTLIB::impl__ZGVnN2vl8l8_sincos:
379 case RTLIB::impl__ZGVnN4vl4l4_sincosf:
380 case RTLIB::impl__ZGVsNxvl8l8_sincos:
381 case RTLIB::impl__ZGVsNxvl4l4_sincosf:
382 case RTLIB::impl_armpl_vsincosq_f64:
383 case RTLIB::impl_armpl_vsincosq_f32:
384 case RTLIB::impl_armpl_svsincos_f64_x:
385 case RTLIB::impl_armpl_svsincos_f32_x:
386 case RTLIB::impl__ZGVnN4vl4l4_sincospif:
387 case RTLIB::impl__ZGVnN2vl8l8_sincospi:
388 case RTLIB::impl__ZGVsNxvl4l4_sincospif:
389 case RTLIB::impl__ZGVsNxvl8l8_sincospi:
390 case RTLIB::impl_armpl_vsincospiq_f32:
391 case RTLIB::impl_armpl_vsincospiq_f64:
392 case RTLIB::impl_armpl_svsincospi_f32_x:
393 case RTLIB::impl_armpl_svsincospi_f64_x: {
394 AttrBuilder FuncAttrBuilder(Ctx);
396 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincospif ||
397 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||
398 LibcallImpl == RTLIB::impl_armpl_vsincospiq_f32 ||
399 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||
400 LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincosf ||
401 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||
402 LibcallImpl == RTLIB::impl_armpl_vsincosq_f32 ||
403 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x;
406 unsigned EC = IsF32 ? 4 : 2;
408 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincos ||
409 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||
410 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x ||
411 LibcallImpl == RTLIB::impl_armpl_svsincos_f64_x ||
412 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||
413 LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincospi ||
414 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||
415 LibcallImpl == RTLIB::impl_armpl_svsincospi_f64_x;
419 FuncAttrBuilder.addAttribute(Attr);
423 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
426 AttrBuilder ArgAttrBuilder(Ctx);
428 ArgAttrBuilder.addAttribute(AK);
429 ArgAttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(VecTy));
430 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);
431 Attrs = Attrs.addParamAttributes(Ctx, 2, ArgAttrBuilder);