@@ -290,6 +290,144 @@ void TargetLoweringBase::InitLibcalls(const Triple &TT) {
290
290
setLibcallName (RTLIB::FREXP_F128, nullptr );
291
291
setLibcallName (RTLIB::FREXP_PPCF128, nullptr );
292
292
}
293
+
294
+ if (TT.isAArch64 ()) {
295
+ if (TT.isOSMSVCRT ()) {
296
+ // MSVCRT doesn't have powi; fall back to pow
297
+ setLibcallName (RTLIB::POWI_F32, nullptr );
298
+ setLibcallName (RTLIB::POWI_F64, nullptr );
299
+ }
300
+ }
301
+
302
+ // Disable most libcalls on AMDGPU.
303
+ if (TT.isAMDGPU ()) {
304
+ for (int I = 0 ; I < RTLIB::UNKNOWN_LIBCALL; ++I) {
305
+ if (I < RTLIB::ATOMIC_LOAD || I > RTLIB::ATOMIC_FETCH_NAND_16)
306
+ setLibcallName (static_cast <RTLIB::Libcall>(I), nullptr );
307
+ }
308
+ }
309
+
310
+ if (TT.isARM () || TT.isThumb ()) {
311
+ // These libcalls are not available in 32-bit.
312
+ setLibcallName (RTLIB::SHL_I128, nullptr );
313
+ setLibcallName (RTLIB::SRL_I128, nullptr );
314
+ setLibcallName (RTLIB::SRA_I128, nullptr );
315
+ setLibcallName (RTLIB::MUL_I128, nullptr );
316
+ setLibcallName (RTLIB::MULO_I64, nullptr );
317
+ setLibcallName (RTLIB::MULO_I128, nullptr );
318
+
319
+ if (TT.isOSMSVCRT ()) {
320
+ // MSVCRT doesn't have powi; fall back to pow
321
+ setLibcallName (RTLIB::POWI_F32, nullptr );
322
+ setLibcallName (RTLIB::POWI_F64, nullptr );
323
+ }
324
+ }
325
+
326
+ if (TT.getArch () == Triple::ArchType::avr) {
327
+ // Division rtlib functions (not supported), use divmod functions instead
328
+ setLibcallName (RTLIB::SDIV_I8, nullptr );
329
+ setLibcallName (RTLIB::SDIV_I16, nullptr );
330
+ setLibcallName (RTLIB::SDIV_I32, nullptr );
331
+ setLibcallName (RTLIB::UDIV_I8, nullptr );
332
+ setLibcallName (RTLIB::UDIV_I16, nullptr );
333
+ setLibcallName (RTLIB::UDIV_I32, nullptr );
334
+
335
+ // Modulus rtlib functions (not supported), use divmod functions instead
336
+ setLibcallName (RTLIB::SREM_I8, nullptr );
337
+ setLibcallName (RTLIB::SREM_I16, nullptr );
338
+ setLibcallName (RTLIB::SREM_I32, nullptr );
339
+ setLibcallName (RTLIB::UREM_I8, nullptr );
340
+ setLibcallName (RTLIB::UREM_I16, nullptr );
341
+ setLibcallName (RTLIB::UREM_I32, nullptr );
342
+ }
343
+
344
+ if (TT.getArch () == Triple::ArchType::hexagon) {
345
+ // These cause problems when the shift amount is non-constant.
346
+ setLibcallName (RTLIB::SHL_I128, nullptr );
347
+ setLibcallName (RTLIB::SRL_I128, nullptr );
348
+ setLibcallName (RTLIB::SRA_I128, nullptr );
349
+ }
350
+
351
+ if (TT.isLoongArch ()) {
352
+ if (!TT.isLoongArch64 ()) {
353
+ // Set libcalls.
354
+ setLibcallName (RTLIB::MUL_I128, nullptr );
355
+ // The MULO libcall is not part of libgcc, only compiler-rt.
356
+ setLibcallName (RTLIB::MULO_I64, nullptr );
357
+ }
358
+ // The MULO libcall is not part of libgcc, only compiler-rt.
359
+ setLibcallName (RTLIB::MULO_I128, nullptr );
360
+ }
361
+
362
+ if (TT.isMIPS32 ()) {
363
+ // These libcalls are not available in 32-bit.
364
+ setLibcallName (RTLIB::SHL_I128, nullptr );
365
+ setLibcallName (RTLIB::SRL_I128, nullptr );
366
+ setLibcallName (RTLIB::SRA_I128, nullptr );
367
+ setLibcallName (RTLIB::MUL_I128, nullptr );
368
+ setLibcallName (RTLIB::MULO_I64, nullptr );
369
+ setLibcallName (RTLIB::MULO_I128, nullptr );
370
+ }
371
+
372
+ if (TT.isPPC ()) {
373
+ if (!TT.isPPC64 ()) {
374
+ // These libcalls are not available in 32-bit.
375
+ setLibcallName (RTLIB::SHL_I128, nullptr );
376
+ setLibcallName (RTLIB::SRL_I128, nullptr );
377
+ setLibcallName (RTLIB::SRA_I128, nullptr );
378
+ setLibcallName (RTLIB::MUL_I128, nullptr );
379
+ setLibcallName (RTLIB::MULO_I64, nullptr );
380
+ }
381
+ setLibcallName (RTLIB::MULO_I128, nullptr );
382
+ }
383
+
384
+ if (TT.isRISCV32 ()) {
385
+ // These libcalls are not available in 32-bit.
386
+ setLibcallName (RTLIB::SHL_I128, nullptr );
387
+ setLibcallName (RTLIB::SRL_I128, nullptr );
388
+ setLibcallName (RTLIB::SRA_I128, nullptr );
389
+ setLibcallName (RTLIB::MUL_I128, nullptr );
390
+ setLibcallName (RTLIB::MULO_I64, nullptr );
391
+ }
392
+
393
+ if (TT.isSPARC ()) {
394
+ if (!TT.isSPARC64 ()) {
395
+ // These libcalls are not available in 32-bit.
396
+ setLibcallName (RTLIB::MULO_I64, nullptr );
397
+ setLibcallName (RTLIB::MUL_I128, nullptr );
398
+ setLibcallName (RTLIB::SHL_I128, nullptr );
399
+ setLibcallName (RTLIB::SRL_I128, nullptr );
400
+ setLibcallName (RTLIB::SRA_I128, nullptr );
401
+ }
402
+ setLibcallName (RTLIB::MULO_I128, nullptr );
403
+ }
404
+
405
+ if (TT.isSystemZ ()) {
406
+ setLibcallName (RTLIB::SRL_I128, nullptr );
407
+ setLibcallName (RTLIB::SHL_I128, nullptr );
408
+ setLibcallName (RTLIB::SRA_I128, nullptr );
409
+ }
410
+
411
+ if (TT.isX86 ()) {
412
+ if (TT.getArch () == Triple::ArchType::x86) {
413
+ // These libcalls are not available in 32-bit.
414
+ setLibcallName (RTLIB::SHL_I128, nullptr );
415
+ setLibcallName (RTLIB::SRL_I128, nullptr );
416
+ setLibcallName (RTLIB::SRA_I128, nullptr );
417
+ setLibcallName (RTLIB::MUL_I128, nullptr );
418
+ // The MULO libcall is not part of libgcc, only compiler-rt.
419
+ setLibcallName (RTLIB::MULO_I64, nullptr );
420
+ }
421
+
422
+ // The MULO libcall is not part of libgcc, only compiler-rt.
423
+ setLibcallName (RTLIB::MULO_I128, nullptr );
424
+
425
+ if (TT.isOSMSVCRT ()) {
426
+ // MSVCRT doesn't have powi; fall back to pow
427
+ setLibcallName (RTLIB::POWI_F32, nullptr );
428
+ setLibcallName (RTLIB::POWI_F64, nullptr );
429
+ }
430
+ }
293
431
}
294
432
295
433
// / GetFPLibCall - Helper to return the right libcall for the given floating
0 commit comments