Skip to content

Commit 2e4d276

Browse files
authored
[X86][CodeGen] Emit float128 libcalls for math functions (#79611)
Make LLVM emit libcalls to proper float128 variants for float128 types.
1 parent 314ef96 commit 2e4d276

File tree

5 files changed

+78
-38
lines changed

5 files changed

+78
-38
lines changed

llvm/lib/CodeGen/TargetLoweringBase.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,46 @@ void TargetLoweringBase::InitLibcalls(const Triple &TT) {
122122
for (int LC = 0; LC < RTLIB::UNKNOWN_LIBCALL; ++LC)
123123
setLibcallCallingConv((RTLIB::Libcall)LC, CallingConv::C);
124124

125+
// Use the f128 variants of math functions on x86_64
126+
if (TT.getArch() == Triple::ArchType::x86_64) {
127+
setLibcallName(RTLIB::REM_F128, "fmodf128");
128+
setLibcallName(RTLIB::FMA_F128, "fmaf128");
129+
setLibcallName(RTLIB::SQRT_F128, "sqrtf128");
130+
setLibcallName(RTLIB::CBRT_F128, "cbrtf128");
131+
setLibcallName(RTLIB::LOG_F128, "logf128");
132+
setLibcallName(RTLIB::LOG_FINITE_F128, "__logf128_finite");
133+
setLibcallName(RTLIB::LOG2_F128, "log2f128");
134+
setLibcallName(RTLIB::LOG2_FINITE_F128, "__log2f128_finite");
135+
setLibcallName(RTLIB::LOG10_F128, "log10f128");
136+
setLibcallName(RTLIB::LOG10_FINITE_F128, "__log10f128_finite");
137+
setLibcallName(RTLIB::EXP_F128, "expf128");
138+
setLibcallName(RTLIB::EXP_FINITE_F128, "__expf128_finite");
139+
setLibcallName(RTLIB::EXP2_F128, "exp2f128");
140+
setLibcallName(RTLIB::EXP2_FINITE_F128, "__exp2f128_finite");
141+
setLibcallName(RTLIB::EXP10_F128, "exp10f128");
142+
setLibcallName(RTLIB::SIN_F128, "sinf128");
143+
setLibcallName(RTLIB::COS_F128, "cosf128");
144+
setLibcallName(RTLIB::SINCOS_F128, "sincosf128");
145+
setLibcallName(RTLIB::POW_F128, "powf128");
146+
setLibcallName(RTLIB::POW_FINITE_F128, "__powf128_finite");
147+
setLibcallName(RTLIB::CEIL_F128, "ceilf128");
148+
setLibcallName(RTLIB::TRUNC_F128, "truncf128");
149+
setLibcallName(RTLIB::RINT_F128, "rintf128");
150+
setLibcallName(RTLIB::NEARBYINT_F128, "nearbyintf128");
151+
setLibcallName(RTLIB::ROUND_F128, "roundf128");
152+
setLibcallName(RTLIB::ROUNDEVEN_F128, "roundevenf128");
153+
setLibcallName(RTLIB::FLOOR_F128, "floorf128");
154+
setLibcallName(RTLIB::COPYSIGN_F128, "copysignf128");
155+
setLibcallName(RTLIB::FMIN_F128, "fminf128");
156+
setLibcallName(RTLIB::FMAX_F128, "fmaxf128");
157+
setLibcallName(RTLIB::LROUND_F128, "lroundf128");
158+
setLibcallName(RTLIB::LLROUND_F128, "llroundf128");
159+
setLibcallName(RTLIB::LRINT_F128, "lrintf128");
160+
setLibcallName(RTLIB::LLRINT_F128, "llrintf128");
161+
setLibcallName(RTLIB::LDEXP_F128, "ldexpf128");
162+
setLibcallName(RTLIB::FREXP_F128, "frexpf128");
163+
}
164+
125165
// For IEEE quad-precision libcall names, PPC uses "kf" instead of "tf".
126166
if (TT.isPPC()) {
127167
setLibcallName(RTLIB::ADD_F128, "__addkf3");

llvm/test/CodeGen/X86/GlobalISel/roundeven.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ define fp128 @roundeven_f128(fp128 %x) {
4444
; CHECK: # %bb.0:
4545
; CHECK-NEXT: pushq %rax
4646
; CHECK-NEXT: .cfi_def_cfa_offset 16
47-
; CHECK-NEXT: callq roundevenl
47+
; CHECK-NEXT: callq roundevenf128
4848
; CHECK-NEXT: popq %rax
4949
; CHECK-NEXT: .cfi_def_cfa_offset 8
5050
; CHECK-NEXT: retq

llvm/test/CodeGen/X86/fp128-libcalls-strict.ll

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ define fp128 @fma(fp128 %x, fp128 %y, fp128 %z) nounwind strictfp {
163163
; CHECK-LABEL: fma:
164164
; CHECK: # %bb.0: # %entry
165165
; CHECK-NEXT: pushq %rax
166-
; CHECK-NEXT: callq fmal@PLT
166+
; CHECK-NEXT: callq fmaf128
167167
; CHECK-NEXT: popq %rax
168168
; CHECK-NEXT: retq
169169
;
@@ -204,7 +204,7 @@ define fp128 @frem(fp128 %x, fp128 %y) nounwind strictfp {
204204
; CHECK-LABEL: frem:
205205
; CHECK: # %bb.0: # %entry
206206
; CHECK-NEXT: pushq %rax
207-
; CHECK-NEXT: callq fmodl@PLT
207+
; CHECK-NEXT: callq fmodf128
208208
; CHECK-NEXT: popq %rax
209209
; CHECK-NEXT: retq
210210
;
@@ -241,7 +241,7 @@ define fp128 @ceil(fp128 %x) nounwind strictfp {
241241
; CHECK-LABEL: ceil:
242242
; CHECK: # %bb.0: # %entry
243243
; CHECK-NEXT: pushq %rax
244-
; CHECK-NEXT: callq ceill@PLT
244+
; CHECK-NEXT: callq ceilf128
245245
; CHECK-NEXT: popq %rax
246246
; CHECK-NEXT: retq
247247
;
@@ -274,7 +274,7 @@ define fp128 @cos(fp128 %x) nounwind strictfp {
274274
; CHECK-LABEL: cos:
275275
; CHECK: # %bb.0: # %entry
276276
; CHECK-NEXT: pushq %rax
277-
; CHECK-NEXT: callq cosl@PLT
277+
; CHECK-NEXT: callq cosf128
278278
; CHECK-NEXT: popq %rax
279279
; CHECK-NEXT: retq
280280
;
@@ -307,7 +307,7 @@ define fp128 @exp(fp128 %x) nounwind strictfp {
307307
; CHECK-LABEL: exp:
308308
; CHECK: # %bb.0: # %entry
309309
; CHECK-NEXT: pushq %rax
310-
; CHECK-NEXT: callq expl@PLT
310+
; CHECK-NEXT: callq expf128
311311
; CHECK-NEXT: popq %rax
312312
; CHECK-NEXT: retq
313313
;
@@ -340,7 +340,7 @@ define fp128 @exp2(fp128 %x) nounwind strictfp {
340340
; CHECK-LABEL: exp2:
341341
; CHECK: # %bb.0: # %entry
342342
; CHECK-NEXT: pushq %rax
343-
; CHECK-NEXT: callq exp2l@PLT
343+
; CHECK-NEXT: callq exp2f128
344344
; CHECK-NEXT: popq %rax
345345
; CHECK-NEXT: retq
346346
;
@@ -373,7 +373,7 @@ define fp128 @floor(fp128 %x) nounwind strictfp {
373373
; CHECK-LABEL: floor:
374374
; CHECK: # %bb.0: # %entry
375375
; CHECK-NEXT: pushq %rax
376-
; CHECK-NEXT: callq floorl@PLT
376+
; CHECK-NEXT: callq floorf128
377377
; CHECK-NEXT: popq %rax
378378
; CHECK-NEXT: retq
379379
;
@@ -406,7 +406,7 @@ define fp128 @log(fp128 %x) nounwind strictfp {
406406
; CHECK-LABEL: log:
407407
; CHECK: # %bb.0: # %entry
408408
; CHECK-NEXT: pushq %rax
409-
; CHECK-NEXT: callq logl@PLT
409+
; CHECK-NEXT: callq logf128
410410
; CHECK-NEXT: popq %rax
411411
; CHECK-NEXT: retq
412412
;
@@ -439,7 +439,7 @@ define fp128 @log10(fp128 %x) nounwind strictfp {
439439
; CHECK-LABEL: log10:
440440
; CHECK: # %bb.0: # %entry
441441
; CHECK-NEXT: pushq %rax
442-
; CHECK-NEXT: callq log10l@PLT
442+
; CHECK-NEXT: callq log10f128
443443
; CHECK-NEXT: popq %rax
444444
; CHECK-NEXT: retq
445445
;
@@ -472,7 +472,7 @@ define fp128 @log2(fp128 %x) nounwind strictfp {
472472
; CHECK-LABEL: log2:
473473
; CHECK: # %bb.0: # %entry
474474
; CHECK-NEXT: pushq %rax
475-
; CHECK-NEXT: callq log2l@PLT
475+
; CHECK-NEXT: callq log2f128
476476
; CHECK-NEXT: popq %rax
477477
; CHECK-NEXT: retq
478478
;
@@ -505,7 +505,7 @@ define fp128 @maxnum(fp128 %x, fp128 %y) nounwind strictfp {
505505
; CHECK-LABEL: maxnum:
506506
; CHECK: # %bb.0: # %entry
507507
; CHECK-NEXT: pushq %rax
508-
; CHECK-NEXT: callq fmaxl@PLT
508+
; CHECK-NEXT: callq fmaxf128
509509
; CHECK-NEXT: popq %rax
510510
; CHECK-NEXT: retq
511511
;
@@ -542,7 +542,7 @@ define fp128 @minnum(fp128 %x, fp128 %y) nounwind strictfp {
542542
; CHECK-LABEL: minnum:
543543
; CHECK: # %bb.0: # %entry
544544
; CHECK-NEXT: pushq %rax
545-
; CHECK-NEXT: callq fminl@PLT
545+
; CHECK-NEXT: callq fminf128
546546
; CHECK-NEXT: popq %rax
547547
; CHECK-NEXT: retq
548548
;
@@ -579,7 +579,7 @@ define fp128 @nearbyint(fp128 %x) nounwind strictfp {
579579
; CHECK-LABEL: nearbyint:
580580
; CHECK: # %bb.0: # %entry
581581
; CHECK-NEXT: pushq %rax
582-
; CHECK-NEXT: callq nearbyintl@PLT
582+
; CHECK-NEXT: callq nearbyintf128
583583
; CHECK-NEXT: popq %rax
584584
; CHECK-NEXT: retq
585585
;
@@ -612,7 +612,7 @@ define fp128 @pow(fp128 %x, fp128 %y) nounwind strictfp {
612612
; CHECK-LABEL: pow:
613613
; CHECK: # %bb.0: # %entry
614614
; CHECK-NEXT: pushq %rax
615-
; CHECK-NEXT: callq powl@PLT
615+
; CHECK-NEXT: callq powf128
616616
; CHECK-NEXT: popq %rax
617617
; CHECK-NEXT: retq
618618
;
@@ -683,7 +683,7 @@ define fp128 @rint(fp128 %x) nounwind strictfp {
683683
; CHECK-LABEL: rint:
684684
; CHECK: # %bb.0: # %entry
685685
; CHECK-NEXT: pushq %rax
686-
; CHECK-NEXT: callq rintl@PLT
686+
; CHECK-NEXT: callq rintf128
687687
; CHECK-NEXT: popq %rax
688688
; CHECK-NEXT: retq
689689
;
@@ -716,7 +716,7 @@ define fp128 @round(fp128 %x) nounwind strictfp {
716716
; CHECK-LABEL: round:
717717
; CHECK: # %bb.0: # %entry
718718
; CHECK-NEXT: pushq %rax
719-
; CHECK-NEXT: callq roundl@PLT
719+
; CHECK-NEXT: callq roundf128
720720
; CHECK-NEXT: popq %rax
721721
; CHECK-NEXT: retq
722722
;
@@ -749,7 +749,7 @@ define fp128 @roundeven(fp128 %x) nounwind strictfp {
749749
; CHECK-LABEL: roundeven:
750750
; CHECK: # %bb.0: # %entry
751751
; CHECK-NEXT: pushq %rax
752-
; CHECK-NEXT: callq roundevenl@PLT
752+
; CHECK-NEXT: callq roundevenf128
753753
; CHECK-NEXT: popq %rax
754754
; CHECK-NEXT: retq
755755
;
@@ -782,7 +782,7 @@ define fp128 @sin(fp128 %x) nounwind strictfp {
782782
; CHECK-LABEL: sin:
783783
; CHECK: # %bb.0: # %entry
784784
; CHECK-NEXT: pushq %rax
785-
; CHECK-NEXT: callq sinl@PLT
785+
; CHECK-NEXT: callq sinf128
786786
; CHECK-NEXT: popq %rax
787787
; CHECK-NEXT: retq
788788
;
@@ -815,7 +815,7 @@ define fp128 @sqrt(fp128 %x) nounwind strictfp {
815815
; CHECK-LABEL: sqrt:
816816
; CHECK: # %bb.0: # %entry
817817
; CHECK-NEXT: pushq %rax
818-
; CHECK-NEXT: callq sqrtl@PLT
818+
; CHECK-NEXT: callq sqrtf128
819819
; CHECK-NEXT: popq %rax
820820
; CHECK-NEXT: retq
821821
;
@@ -848,7 +848,7 @@ define fp128 @trunc(fp128 %x) nounwind strictfp {
848848
; CHECK-LABEL: trunc:
849849
; CHECK: # %bb.0: # %entry
850850
; CHECK-NEXT: pushq %rax
851-
; CHECK-NEXT: callq truncl@PLT
851+
; CHECK-NEXT: callq truncf128
852852
; CHECK-NEXT: popq %rax
853853
; CHECK-NEXT: retq
854854
;
@@ -881,7 +881,7 @@ define i32 @lrint(fp128 %x) nounwind strictfp {
881881
; CHECK-LABEL: lrint:
882882
; CHECK: # %bb.0: # %entry
883883
; CHECK-NEXT: pushq %rax
884-
; CHECK-NEXT: callq lrintl@PLT
884+
; CHECK-NEXT: callq lrintf128
885885
; CHECK-NEXT: popq %rcx
886886
; CHECK-NEXT: retq
887887
;
@@ -904,7 +904,7 @@ define i64 @llrint(fp128 %x) nounwind strictfp {
904904
; CHECK-LABEL: llrint:
905905
; CHECK: # %bb.0: # %entry
906906
; CHECK-NEXT: pushq %rax
907-
; CHECK-NEXT: callq llrintl@PLT
907+
; CHECK-NEXT: callq llrintf128
908908
; CHECK-NEXT: popq %rcx
909909
; CHECK-NEXT: retq
910910
;
@@ -927,7 +927,7 @@ define i32 @lround(fp128 %x) nounwind strictfp {
927927
; CHECK-LABEL: lround:
928928
; CHECK: # %bb.0: # %entry
929929
; CHECK-NEXT: pushq %rax
930-
; CHECK-NEXT: callq lroundl@PLT
930+
; CHECK-NEXT: callq lroundf128
931931
; CHECK-NEXT: popq %rcx
932932
; CHECK-NEXT: retq
933933
;
@@ -950,7 +950,7 @@ define i64 @llround(fp128 %x) nounwind strictfp {
950950
; CHECK-LABEL: llround:
951951
; CHECK: # %bb.0: # %entry
952952
; CHECK-NEXT: pushq %rax
953-
; CHECK-NEXT: callq llroundl@PLT
953+
; CHECK-NEXT: callq llroundf128
954954
; CHECK-NEXT: popq %rcx
955955
; CHECK-NEXT: retq
956956
;

llvm/test/CodeGen/X86/fp128-libcalls.ll

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ define dso_local void @Test128Rem(fp128 %d1, fp128 %d2) nounwind {
299299
; CHECK-LABEL: Test128Rem:
300300
; CHECK: # %bb.0: # %entry
301301
; CHECK-NEXT: pushq %rax
302-
; CHECK-NEXT: callq fmodl@PLT
302+
; CHECK-NEXT: callq fmodf128
303303
; CHECK-NEXT: movaps %xmm0, vf128(%rip)
304304
; CHECK-NEXT: popq %rax
305305
; CHECK-NEXT: retq
@@ -335,7 +335,7 @@ define dso_local void @Test128_1Rem(fp128 %d1) nounwind {
335335
; CHECK-NEXT: pushq %rax
336336
; CHECK-NEXT: movaps %xmm0, %xmm1
337337
; CHECK-NEXT: movaps vf128(%rip), %xmm0
338-
; CHECK-NEXT: callq fmodl@PLT
338+
; CHECK-NEXT: callq fmodf128
339339
; CHECK-NEXT: movaps %xmm0, vf128(%rip)
340340
; CHECK-NEXT: popq %rax
341341
; CHECK-NEXT: retq
@@ -370,7 +370,7 @@ define dso_local void @Test128Sqrt(fp128 %d1) nounwind {
370370
; CHECK-LABEL: Test128Sqrt:
371371
; CHECK: # %bb.0: # %entry
372372
; CHECK-NEXT: pushq %rax
373-
; CHECK-NEXT: callq sqrtl@PLT
373+
; CHECK-NEXT: callq sqrtf128
374374
; CHECK-NEXT: movaps %xmm0, vf128(%rip)
375375
; CHECK-NEXT: popq %rax
376376
; CHECK-NEXT: retq
@@ -401,7 +401,7 @@ define dso_local void @Test128Sin(fp128 %d1) nounwind {
401401
; CHECK-LABEL: Test128Sin:
402402
; CHECK: # %bb.0: # %entry
403403
; CHECK-NEXT: pushq %rax
404-
; CHECK-NEXT: callq sinl@PLT
404+
; CHECK-NEXT: callq sinf128
405405
; CHECK-NEXT: movaps %xmm0, vf128(%rip)
406406
; CHECK-NEXT: popq %rax
407407
; CHECK-NEXT: retq
@@ -432,7 +432,7 @@ define dso_local void @Test128Cos(fp128 %d1) nounwind {
432432
; CHECK-LABEL: Test128Cos:
433433
; CHECK: # %bb.0: # %entry
434434
; CHECK-NEXT: pushq %rax
435-
; CHECK-NEXT: callq cosl@PLT
435+
; CHECK-NEXT: callq cosf128
436436
; CHECK-NEXT: movaps %xmm0, vf128(%rip)
437437
; CHECK-NEXT: popq %rax
438438
; CHECK-NEXT: retq
@@ -463,7 +463,7 @@ define dso_local void @Test128Ceil(fp128 %d1) nounwind {
463463
; CHECK-LABEL: Test128Ceil:
464464
; CHECK: # %bb.0: # %entry
465465
; CHECK-NEXT: pushq %rax
466-
; CHECK-NEXT: callq ceill@PLT
466+
; CHECK-NEXT: callq ceilf128
467467
; CHECK-NEXT: movaps %xmm0, vf128(%rip)
468468
; CHECK-NEXT: popq %rax
469469
; CHECK-NEXT: retq
@@ -494,7 +494,7 @@ define dso_local void @Test128Floor(fp128 %d1) nounwind {
494494
; CHECK-LABEL: Test128Floor:
495495
; CHECK: # %bb.0: # %entry
496496
; CHECK-NEXT: pushq %rax
497-
; CHECK-NEXT: callq floorl@PLT
497+
; CHECK-NEXT: callq floorf128
498498
; CHECK-NEXT: movaps %xmm0, vf128(%rip)
499499
; CHECK-NEXT: popq %rax
500500
; CHECK-NEXT: retq
@@ -525,7 +525,7 @@ define dso_local void @Test128Trunc(fp128 %d1) nounwind {
525525
; CHECK-LABEL: Test128Trunc:
526526
; CHECK: # %bb.0: # %entry
527527
; CHECK-NEXT: pushq %rax
528-
; CHECK-NEXT: callq truncl@PLT
528+
; CHECK-NEXT: callq truncf128
529529
; CHECK-NEXT: movaps %xmm0, vf128(%rip)
530530
; CHECK-NEXT: popq %rax
531531
; CHECK-NEXT: retq
@@ -556,7 +556,7 @@ define dso_local void @Test128Nearbyint(fp128 %d1) nounwind {
556556
; CHECK-LABEL: Test128Nearbyint:
557557
; CHECK: # %bb.0: # %entry
558558
; CHECK-NEXT: pushq %rax
559-
; CHECK-NEXT: callq nearbyintl@PLT
559+
; CHECK-NEXT: callq nearbyintf128
560560
; CHECK-NEXT: movaps %xmm0, vf128(%rip)
561561
; CHECK-NEXT: popq %rax
562562
; CHECK-NEXT: retq
@@ -587,7 +587,7 @@ define dso_local void @Test128Rint(fp128 %d1) nounwind {
587587
; CHECK-LABEL: Test128Rint:
588588
; CHECK: # %bb.0: # %entry
589589
; CHECK-NEXT: pushq %rax
590-
; CHECK-NEXT: callq rintl@PLT
590+
; CHECK-NEXT: callq rintf128
591591
; CHECK-NEXT: movaps %xmm0, vf128(%rip)
592592
; CHECK-NEXT: popq %rax
593593
; CHECK-NEXT: retq
@@ -618,7 +618,7 @@ define dso_local void @Test128Round(fp128 %d1) nounwind {
618618
; CHECK-LABEL: Test128Round:
619619
; CHECK: # %bb.0: # %entry
620620
; CHECK-NEXT: pushq %rax
621-
; CHECK-NEXT: callq roundl@PLT
621+
; CHECK-NEXT: callq roundf128
622622
; CHECK-NEXT: movaps %xmm0, vf128(%rip)
623623
; CHECK-NEXT: popq %rax
624624
; CHECK-NEXT: retq
@@ -648,7 +648,7 @@ declare fp128 @llvm.round.f128(fp128)
648648
define fp128 @Test128FMA(fp128 %a, fp128 %b, fp128 %c) nounwind {
649649
; CHECK-LABEL: Test128FMA:
650650
; CHECK: # %bb.0: # %entry
651-
; CHECK-NEXT: jmp fmal@PLT # TAILCALL
651+
; CHECK-NEXT: jmp fmaf128@PLT # TAILCALL
652652
;
653653
; X86-LABEL: Test128FMA:
654654
; X86: # %bb.0: # %entry

llvm/test/CodeGen/X86/frem.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ define void @frem_f128(fp128 %a0, fp128 %a1, ptr%p3) nounwind {
8282
; CHECK: # %bb.0:
8383
; CHECK-NEXT: pushq %rbx
8484
; CHECK-NEXT: movq %rdi, %rbx
85-
; CHECK-NEXT: callq fmodl@PLT
85+
; CHECK-NEXT: callq fmodf128
8686
; CHECK-NEXT: vmovaps %xmm0, (%rbx)
8787
; CHECK-NEXT: popq %rbx
8888
; CHECK-NEXT: retq

0 commit comments

Comments
 (0)