LLVM: lib/IR/RuntimeLibcalls.cpp Source File (original) (raw)
34
35
36
37
39 ExceptionModel = TT.getDefaultExceptionHandling();
40
41 initLibcalls(TT, ExceptionModel, FloatABI, EABIVersion, ABIName);
42
43
44 switch (VecLib) {
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})
57 break;
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})
70
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})
75 break;
76 default:
77 break;
78 }
79}
141 return DL.getIndexType(Ctx, 0);
142}
147 RTLIB::LibcallImpl LibcallImpl) const {
148
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};
156
157 switch (LibcallImpl) {
158 case RTLIB::impl___sincos_stret:
159 case RTLIB::impl___sincosf_stret: {
160 if (!darwinHasSinCosStret(TT))
161 return {};
162
163 Type *ScalarTy = LibcallImpl == RTLIB::impl___sincosf_stret
166
167 AttrBuilder FuncAttrBuilder(Ctx);
169 FuncAttrBuilder.addAttribute(Attr);
170
171 const bool UseSret =
172 TT.isX86_32() || ((TT.isARM() || TT.isThumb()) &&
174
177
178 AttributeList Attrs;
179 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
180
181 if (UseSret) {
182 AttrBuilder AttrBuilder(Ctx);
184 AttrBuilder.addStructRetAttr(StructTy);
185 AttrBuilder.addAlignmentAttr(DL.getABITypeAlign(StructTy));
187 Type::getVoidTy(Ctx), {DL.getAllocaPtrType(Ctx), ScalarTy}, false);
188
189 return {FuncTy, Attrs.addParamAttributes(Ctx, 0, AttrBuilder)};
190 }
191
192 Type *RetTy =
193 LibcallImpl == RTLIB::impl___sincosf_stret && TT.isX86_64()
196
198 }
199 case RTLIB::impl_malloc:
200 case RTLIB::impl_calloc: {
201 AttrBuilder FuncAttrBuilder(Ctx);
203 FuncAttrBuilder.addAttribute(Attr);
204 FuncAttrBuilder.addAttribute(Attribute::NoFree);
205
207 if (LibcallImpl == RTLIB::impl_malloc)
209
210
211 FuncAttrBuilder.addAllocKindAttr(AllocKind);
212 FuncAttrBuilder.addAttribute("alloc-family", "malloc");
213 FuncAttrBuilder.addAllocSizeAttr(0, LibcallImpl == RTLIB::impl_malloc
214 ? std::nullopt
215 : std::make_optional(1));
216
217 AttributeList Attrs;
218 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
219
220 {
221 AttrBuilder ArgAttrBuilder(Ctx);
223 ArgAttrBuilder.addAttribute(AK);
224
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);
230 }
231
235 if (LibcallImpl == RTLIB::impl_calloc)
237
239 }
240 case RTLIB::impl_free: {
241
242 AttrBuilder FuncAttrBuilder(Ctx);
244 FuncAttrBuilder.addAttribute(Attr);
245
247 FuncAttrBuilder.addAttribute("alloc-family", "malloc");
248
249 AttributeList Attrs;
250 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
251
252 {
253 AttrBuilder ArgAttrBuilder(Ctx);
254 ArgAttrBuilder.addAttribute(Attribute::NoUndef);
255 ArgAttrBuilder.addAttribute(Attribute::AllocatedPointer);
257 Attrs = Attrs.addParamAttributes(Ctx, 0, ArgAttrBuilder);
258 }
259
261 false),
262 Attrs};
263 }
264 case RTLIB::impl_sqrtf:
265 case RTLIB::impl_sqrt: {
266 AttrBuilder FuncAttrBuilder(Ctx);
267
269 FuncAttrBuilder.addAttribute(Attr);
271
272 AttributeList Attrs;
273 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
274
278
279 Attrs = Attrs.addRetAttribute(
282 return {FuncTy, Attrs};
283 }
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;
296
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;
301
302 AttrBuilder FuncAttrBuilder(Ctx);
303
305 FuncAttrBuilder.addAttribute(Attr);
306
307 AttributeList Attrs;
308 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
309
311 unsigned EC = IsF32 ? 4 : 2;
313
317
319 return {FuncTy, Attrs};
320 }
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);
330
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;
335
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;
340
342 unsigned EC = IsF32 ? 4 : 2;
344
346 FuncAttrBuilder.addAttribute(Attr);
348
349 AttributeList Attrs;
350 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
351
352 {
353 AttrBuilder ArgAttrBuilder(Ctx);
355 ArgAttrBuilder.addAttribute(AK);
356 ArgAttrBuilder.addAlignmentAttr(DL.getABITypeAlign(VecTy));
357 Attrs = Attrs.addParamAttributes(Ctx, 1, ArgAttrBuilder);
358 }
359
364
366 }
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);
384
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;
393
395 unsigned EC = IsF32 ? 4 : 2;
396
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;
406
408 FuncAttrBuilder.addAttribute(Attr);
410
411 AttributeList Attrs;
412 Attrs = Attrs.addFnAttributes(Ctx, FuncAttrBuilder);
413
414 {
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);
421 }
422
427
429 }
430 default:
431 return {};
432 }
433
434 return {};
435}
438
439
440 switch (Impl) {
441 case RTLIB::impl_armpl_svfmod_f32_x:
442 case RTLIB::impl_armpl_svfmod_f64_x:
443 case RTLIB::impl_armpl_svmodf_f64_x:
444 case RTLIB::impl_armpl_svmodf_f32_x:
445 case RTLIB::impl_armpl_svsincos_f32_x:
446 case RTLIB::impl_armpl_svsincos_f64_x:
447 case RTLIB::impl_armpl_svsincospi_f32_x:
448 case RTLIB::impl_armpl_svsincospi_f64_x:
449 case RTLIB::impl__ZGVsMxvv_fmod:
450 case RTLIB::impl__ZGVsMxvv_fmodf:
451 return true;
452 default:
453 return false;
454 }
455}