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})
153 RTLIB::LibcallImpl LibcallImpl)
const {
156 Attribute::NoCallback, Attribute::NoFree, Attribute::NoSync,
157 Attribute::NoUnwind, Attribute::WillReturn};
159 Attribute::NoUnwind, Attribute::WillReturn};
161 Attribute::NoAlias, Attribute::WriteOnly, Attribute::NonNull};
163 switch (LibcallImpl) {
164 case RTLIB::impl___sincos_stret:
165 case RTLIB::impl___sincosf_stret: {
166 if (!darwinHasSinCosStret(TT))
169 Type *ScalarTy = LibcallImpl == RTLIB::impl___sincosf_stret
173 AttrBuilder FuncAttrBuilder(Ctx);
175 FuncAttrBuilder.addAttribute(Attr);
178 TT.isX86_32() || ((TT.isARM() || TT.isThumb()) &&
185 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
188 AttrBuilder AttrBuilder(Ctx);
190 AttrBuilder.addStructRetAttr(StructTy);
191 AttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(StructTy));
195 return {FuncTy, Attrs.addParamAttributes(Ctx, 0, AttrBuilder)};
199 LibcallImpl == RTLIB::impl___sincosf_stret && TT.isX86_64()
205 case RTLIB::impl_malloc:
206 case RTLIB::impl_calloc: {
207 AttrBuilder FuncAttrBuilder(Ctx);
209 FuncAttrBuilder.addAttribute(Attr);
210 FuncAttrBuilder.addAttribute(Attribute::NoFree);
213 if (LibcallImpl == RTLIB::impl_malloc)
217 FuncAttrBuilder.addAllocKindAttr(AllocKind);
218 FuncAttrBuilder.addAttribute(
"alloc-family",
"malloc");
219 FuncAttrBuilder.addAllocSizeAttr(0, LibcallImpl == RTLIB::impl_malloc
221 : std::make_optional(1));
224 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
227 AttrBuilder ArgAttrBuilder(Ctx);
229 ArgAttrBuilder.addAttribute(AK);
231 Attrs = Attrs.addRetAttribute(Ctx, Attribute::NoUndef);
232 Attrs = Attrs.addRetAttribute(Ctx, Attribute::NoAlias);
233 Attrs = Attrs.addParamAttribute(Ctx, 0, Attribute::NoUndef);
234 if (LibcallImpl == RTLIB::impl_calloc)
235 Attrs = Attrs.addParamAttribute(Ctx, 1, Attribute::NoUndef);
241 if (LibcallImpl == RTLIB::impl_calloc)
246 case RTLIB::impl_free: {
248 AttrBuilder FuncAttrBuilder(Ctx);
250 FuncAttrBuilder.addAttribute(Attr);
253 FuncAttrBuilder.addAttribute(
"alloc-family",
"malloc");
256 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
259 AttrBuilder ArgAttrBuilder(Ctx);
260 ArgAttrBuilder.addAttribute(Attribute::NoUndef);
261 ArgAttrBuilder.addAttribute(Attribute::AllocatedPointer);
263 Attrs = Attrs.addParamAttributes(Ctx, 0, ArgAttrBuilder);
270 case RTLIB::impl_sqrtf:
271 case RTLIB::impl_sqrt: {
272 AttrBuilder FuncAttrBuilder(Ctx);
275 FuncAttrBuilder.addAttribute(Attr);
279 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
285 Attrs = Attrs.addRetAttribute(
288 return {FuncTy, Attrs};
290 case RTLIB::impl__ZGVnN2vv_fmod:
291 case RTLIB::impl__ZGVnN4vv_fmodf:
292 case RTLIB::impl__ZGVsMxvv_fmod:
293 case RTLIB::impl__ZGVsMxvv_fmodf:
294 case RTLIB::impl_armpl_vfmodq_f32:
295 case RTLIB::impl_armpl_vfmodq_f64:
296 case RTLIB::impl_armpl_svfmod_f32_x:
297 case RTLIB::impl_armpl_svfmod_f64_x:
298 case RTLIB::impl_armpl_vpowq_f32:
299 case RTLIB::impl_armpl_vpowq_f64:
300 case RTLIB::impl_armpl_svpow_f32_x:
301 case RTLIB::impl_armpl_svpow_f64_x:
302 case RTLIB::impl_armpl_vcbrtq_f32:
303 case RTLIB::impl_armpl_vcbrtq_f64:
304 case RTLIB::impl_armpl_svcbrt_f32_x:
305 case RTLIB::impl_armpl_svcbrt_f64_x: {
306 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vv_fmodf ||
307 LibcallImpl == RTLIB::impl__ZGVsMxvv_fmodf ||
308 LibcallImpl == RTLIB::impl_armpl_svfmod_f32_x ||
309 LibcallImpl == RTLIB::impl_armpl_vfmodq_f32 ||
310 LibcallImpl == RTLIB::impl_armpl_vpowq_f32 ||
311 LibcallImpl == RTLIB::impl_armpl_svpow_f32_x ||
312 LibcallImpl == RTLIB::impl_armpl_vcbrtq_f32 ||
313 LibcallImpl == RTLIB::impl_armpl_svcbrt_f32_x;
315 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsMxvv_fmod ||
316 LibcallImpl == RTLIB::impl__ZGVsMxvv_fmodf ||
317 LibcallImpl == RTLIB::impl_armpl_svfmod_f32_x ||
318 LibcallImpl == RTLIB::impl_armpl_svfmod_f64_x ||
319 LibcallImpl == RTLIB::impl_armpl_svpow_f32_x ||
320 LibcallImpl == RTLIB::impl_armpl_svpow_f64_x ||
321 LibcallImpl == RTLIB::impl_armpl_svcbrt_f32_x ||
322 LibcallImpl == RTLIB::impl_armpl_svcbrt_f64_x;
324 bool HasOneArg = LibcallImpl == RTLIB::impl_armpl_vcbrtq_f32 ||
325 LibcallImpl == RTLIB::impl_armpl_vcbrtq_f64 ||
326 LibcallImpl == RTLIB::impl_armpl_svcbrt_f32_x ||
327 LibcallImpl == RTLIB::impl_armpl_svcbrt_f64_x;
329 AttrBuilder FuncAttrBuilder(Ctx);
332 FuncAttrBuilder.addAttribute(Attr);
335 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
338 unsigned EC = IsF32 ? 4 : 2;
346 return {FuncTy, Attrs};
348 case RTLIB::impl__ZGVnN2vl8_modf:
349 case RTLIB::impl__ZGVnN4vl4_modff:
350 case RTLIB::impl__ZGVsNxvl8_modf:
351 case RTLIB::impl__ZGVsNxvl4_modff:
352 case RTLIB::impl_armpl_vmodfq_f64:
353 case RTLIB::impl_armpl_vmodfq_f32:
354 case RTLIB::impl_armpl_svmodf_f64_x:
355 case RTLIB::impl_armpl_svmodf_f32_x: {
356 AttrBuilder FuncAttrBuilder(Ctx);
358 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4_modff ||
359 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||
360 LibcallImpl == RTLIB::impl_armpl_vmodfq_f32 ||
361 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;
363 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8_modf ||
364 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||
365 LibcallImpl == RTLIB::impl_armpl_svmodf_f64_x ||
366 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;
369 unsigned EC = IsF32 ? 4 : 2;
373 FuncAttrBuilder.addAttribute(Attr);
377 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
380 AttrBuilder ArgAttrBuilder(Ctx);
382 ArgAttrBuilder.addAttribute(AK);
383 ArgAttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(VecTy));
384 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);
394 case RTLIB::impl__ZGVnN2vl8l8_sincos:
395 case RTLIB::impl__ZGVnN4vl4l4_sincosf:
396 case RTLIB::impl__ZGVsNxvl8l8_sincos:
397 case RTLIB::impl__ZGVsNxvl4l4_sincosf:
398 case RTLIB::impl_armpl_vsincosq_f64:
399 case RTLIB::impl_armpl_vsincosq_f32:
400 case RTLIB::impl_armpl_svsincos_f64_x:
401 case RTLIB::impl_armpl_svsincos_f32_x:
402 case RTLIB::impl__ZGVnN4vl4l4_sincospif:
403 case RTLIB::impl__ZGVnN2vl8l8_sincospi:
404 case RTLIB::impl__ZGVsNxvl4l4_sincospif:
405 case RTLIB::impl__ZGVsNxvl8l8_sincospi:
406 case RTLIB::impl_armpl_vsincospiq_f32:
407 case RTLIB::impl_armpl_vsincospiq_f64:
408 case RTLIB::impl_armpl_svsincospi_f32_x:
409 case RTLIB::impl_armpl_svsincospi_f64_x: {
410 AttrBuilder FuncAttrBuilder(Ctx);
412 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincospif ||
413 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||
414 LibcallImpl == RTLIB::impl_armpl_vsincospiq_f32 ||
415 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||
416 LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincosf ||
417 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||
418 LibcallImpl == RTLIB::impl_armpl_vsincosq_f32 ||
419 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x;
422 unsigned EC = IsF32 ? 4 : 2;
424 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincos ||
425 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||
426 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x ||
427 LibcallImpl == RTLIB::impl_armpl_svsincos_f64_x ||
428 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||
429 LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincospi ||
430 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||
431 LibcallImpl == RTLIB::impl_armpl_svsincospi_f64_x;
435 FuncAttrBuilder.addAttribute(Attr);
439 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
442 AttrBuilder ArgAttrBuilder(Ctx);
444 ArgAttrBuilder.addAttribute(AK);
445 ArgAttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(VecTy));
446 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);
447 Attrs = Attrs.addParamAttributes(Ctx, 2, ArgAttrBuilder);