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})
71 for (RTLIB::LibcallImpl Impl :
72 {RTLIB::impl_armpl_vfmodq_f32, RTLIB::impl_armpl_vfmodq_f64,
73 RTLIB::impl_armpl_vsincosq_f64, RTLIB::impl_armpl_vsincosq_f32})
147 RTLIB::LibcallImpl LibcallImpl)
const {
150 Attribute::MustProgress, Attribute::NoCallback, Attribute::NoFree,
151 Attribute::NoSync, Attribute::NoUnwind, Attribute::WillReturn};
153 Attribute::MustProgress, Attribute::NoUnwind, Attribute::WillReturn};
155 Attribute::NoAlias, Attribute::WriteOnly, Attribute::NonNull};
157 switch (LibcallImpl) {
158 case RTLIB::impl___sincos_stret:
159 case RTLIB::impl___sincosf_stret: {
160 if (!darwinHasSinCosStret(TT))
163 Type *ScalarTy = LibcallImpl == RTLIB::impl___sincosf_stret
167 AttrBuilder FuncAttrBuilder(Ctx);
169 FuncAttrBuilder.addAttribute(Attr);
172 TT.isX86_32() || ((TT.isARM() || TT.isThumb()) &&
179 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
182 AttrBuilder AttrBuilder(Ctx);
184 AttrBuilder.addStructRetAttr(StructTy);
185 AttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(StructTy));
189 return {FuncTy, Attrs.addParamAttributes(Ctx, 0, AttrBuilder)};
193 LibcallImpl == RTLIB::impl___sincosf_stret && TT.isX86_64()
199 case RTLIB::impl_malloc:
200 case RTLIB::impl_calloc: {
201 AttrBuilder FuncAttrBuilder(Ctx);
203 FuncAttrBuilder.addAttribute(Attr);
204 FuncAttrBuilder.addAttribute(Attribute::NoFree);
207 if (LibcallImpl == RTLIB::impl_malloc)
211 FuncAttrBuilder.addAllocKindAttr(AllocKind);
212 FuncAttrBuilder.addAttribute(
"alloc-family",
"malloc");
213 FuncAttrBuilder.addAllocSizeAttr(0, LibcallImpl == RTLIB::impl_malloc
215 : std::make_optional(1));
218 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
221 AttrBuilder ArgAttrBuilder(Ctx);
223 ArgAttrBuilder.addAttribute(AK);
225 Attrs = Attrs.addRetAttribute(Ctx, Attribute::NoUndef);
226 Attrs = Attrs.addRetAttribute(Ctx, Attribute::NoAlias);
227 Attrs = Attrs.addParamAttribute(Ctx, 0, Attribute::NoUndef);
228 if (LibcallImpl == RTLIB::impl_calloc)
229 Attrs = Attrs.addParamAttribute(Ctx, 1, Attribute::NoUndef);
235 if (LibcallImpl == RTLIB::impl_calloc)
240 case RTLIB::impl_free: {
242 AttrBuilder FuncAttrBuilder(Ctx);
244 FuncAttrBuilder.addAttribute(Attr);
247 FuncAttrBuilder.addAttribute(
"alloc-family",
"malloc");
250 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
253 AttrBuilder ArgAttrBuilder(Ctx);
254 ArgAttrBuilder.addAttribute(Attribute::NoUndef);
255 ArgAttrBuilder.addAttribute(Attribute::AllocatedPointer);
257 Attrs = Attrs.addParamAttributes(Ctx, 0, ArgAttrBuilder);
264 case RTLIB::impl_sqrtf:
265 case RTLIB::impl_sqrt: {
266 AttrBuilder FuncAttrBuilder(Ctx);
269 FuncAttrBuilder.addAttribute(Attr);
273 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
279 Attrs = Attrs.addRetAttribute(
282 return {FuncTy, Attrs};
284 case RTLIB::impl__ZGVnN2vv_fmod:
285 case RTLIB::impl__ZGVnN4vv_fmodf:
286 case RTLIB::impl__ZGVsMxvv_fmod:
287 case RTLIB::impl__ZGVsMxvv_fmodf:
288 case RTLIB::impl_armpl_vfmodq_f32:
289 case RTLIB::impl_armpl_vfmodq_f64:
290 case RTLIB::impl_armpl_svfmod_f32_x:
291 case RTLIB::impl_armpl_svfmod_f64_x: {
292 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vv_fmodf ||
293 LibcallImpl == RTLIB::impl__ZGVsMxvv_fmodf ||
294 LibcallImpl == RTLIB::impl_armpl_svfmod_f32_x ||
295 LibcallImpl == RTLIB::impl_armpl_vfmodq_f32;
297 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsMxvv_fmod ||
298 LibcallImpl == RTLIB::impl__ZGVsMxvv_fmodf ||
299 LibcallImpl == RTLIB::impl_armpl_svfmod_f32_x ||
300 LibcallImpl == RTLIB::impl_armpl_svfmod_f64_x;
302 AttrBuilder FuncAttrBuilder(Ctx);
305 FuncAttrBuilder.addAttribute(Attr);
308 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
311 unsigned EC = IsF32 ? 4 : 2;
319 return {FuncTy, Attrs};
321 case RTLIB::impl__ZGVnN2vl8_modf:
322 case RTLIB::impl__ZGVnN4vl4_modff:
323 case RTLIB::impl__ZGVsNxvl8_modf:
324 case RTLIB::impl__ZGVsNxvl4_modff:
325 case RTLIB::impl_armpl_vmodfq_f64:
326 case RTLIB::impl_armpl_vmodfq_f32:
327 case RTLIB::impl_armpl_svmodf_f64_x:
328 case RTLIB::impl_armpl_svmodf_f32_x: {
329 AttrBuilder FuncAttrBuilder(Ctx);
331 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4_modff ||
332 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||
333 LibcallImpl == RTLIB::impl_armpl_vmodfq_f32 ||
334 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;
336 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8_modf ||
337 LibcallImpl == RTLIB::impl__ZGVsNxvl4_modff ||
338 LibcallImpl == RTLIB::impl_armpl_svmodf_f64_x ||
339 LibcallImpl == RTLIB::impl_armpl_svmodf_f32_x;
342 unsigned EC = IsF32 ? 4 : 2;
346 FuncAttrBuilder.addAttribute(Attr);
350 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
353 AttrBuilder ArgAttrBuilder(Ctx);
355 ArgAttrBuilder.addAttribute(AK);
356 ArgAttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(VecTy));
357 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);
367 case RTLIB::impl__ZGVnN2vl8l8_sincos:
368 case RTLIB::impl__ZGVnN4vl4l4_sincosf:
369 case RTLIB::impl__ZGVsNxvl8l8_sincos:
370 case RTLIB::impl__ZGVsNxvl4l4_sincosf:
371 case RTLIB::impl_armpl_vsincosq_f64:
372 case RTLIB::impl_armpl_vsincosq_f32:
373 case RTLIB::impl_armpl_svsincos_f64_x:
374 case RTLIB::impl_armpl_svsincos_f32_x:
375 case RTLIB::impl__ZGVnN4vl4l4_sincospif:
376 case RTLIB::impl__ZGVnN2vl8l8_sincospi:
377 case RTLIB::impl__ZGVsNxvl4l4_sincospif:
378 case RTLIB::impl__ZGVsNxvl8l8_sincospi:
379 case RTLIB::impl_armpl_vsincospiq_f32:
380 case RTLIB::impl_armpl_vsincospiq_f64:
381 case RTLIB::impl_armpl_svsincospi_f32_x:
382 case RTLIB::impl_armpl_svsincospi_f64_x: {
383 AttrBuilder FuncAttrBuilder(Ctx);
385 bool IsF32 = LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincospif ||
386 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||
387 LibcallImpl == RTLIB::impl_armpl_vsincospiq_f32 ||
388 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||
389 LibcallImpl == RTLIB::impl__ZGVnN4vl4l4_sincosf ||
390 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||
391 LibcallImpl == RTLIB::impl_armpl_vsincosq_f32 ||
392 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x;
395 unsigned EC = IsF32 ? 4 : 2;
397 bool IsScalable = LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincos ||
398 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincosf ||
399 LibcallImpl == RTLIB::impl_armpl_svsincos_f32_x ||
400 LibcallImpl == RTLIB::impl_armpl_svsincos_f64_x ||
401 LibcallImpl == RTLIB::impl__ZGVsNxvl4l4_sincospif ||
402 LibcallImpl == RTLIB::impl__ZGVsNxvl8l8_sincospi ||
403 LibcallImpl == RTLIB::impl_armpl_svsincospi_f32_x ||
404 LibcallImpl == RTLIB::impl_armpl_svsincospi_f64_x;
408 FuncAttrBuilder.addAttribute(Attr);
412 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
415 AttrBuilder ArgAttrBuilder(Ctx);
417 ArgAttrBuilder.addAttribute(AK);
418 ArgAttrBuilder.addAlignmentAttr(
DL.getABITypeAlign(VecTy));
419 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);
420 Attrs = Attrs.addParamAttributes(Ctx, 2, ArgAttrBuilder);