Skip to content

Commit efaf313

Browse files
committed
[IR] Use long double functions for fp128 intrinsics where possible
Functions such as `sinf128` are not always available. For targets where `long double` is `f128`, use functions such as `sinfl` instead.
1 parent 639f761 commit efaf313

File tree

2 files changed

+105
-69
lines changed

2 files changed

+105
-69
lines changed

llvm/lib/CodeGen/TargetLoweringBase.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,44 @@ void TargetLoweringBase::InitLibcalls(const Triple &TT) {
221221
setLibcallName(RTLIB::FREXP_F128, nullptr);
222222
setLibcallName(RTLIB::FREXP_PPCF128, nullptr);
223223
}
224+
225+
if (TT.isLongDoubleF128()) {
226+
// Use the more available long double functions for fp128 if possible
227+
setLibcallName(RTLIB::REM_F128, "fmodl");
228+
setLibcallName(RTLIB::FMA_F128, "fmal");
229+
setLibcallName(RTLIB::SQRT_F128, "sqrtl");
230+
setLibcallName(RTLIB::CBRT_F128, "cbrtl");
231+
setLibcallName(RTLIB::LOG_F128, "logl");
232+
setLibcallName(RTLIB::LOG_FINITE_F128, "__logl_finite");
233+
setLibcallName(RTLIB::LOG2_F128, "log2l");
234+
setLibcallName(RTLIB::LOG2_FINITE_F128, "__log2l_finite");
235+
setLibcallName(RTLIB::LOG10_F128, "log10l");
236+
setLibcallName(RTLIB::LOG10_FINITE_F128, "__log10l_finite");
237+
setLibcallName(RTLIB::EXP_F128, "expl");
238+
setLibcallName(RTLIB::EXP_FINITE_F128, "__expl_finite");
239+
setLibcallName(RTLIB::EXP2_F128, "exp2l");
240+
setLibcallName(RTLIB::EXP2_FINITE_F128, "__exp2l_finite");
241+
setLibcallName(RTLIB::SIN_F128, "sinl");
242+
setLibcallName(RTLIB::COS_F128, "cosl");
243+
setLibcallName(RTLIB::POW_F128, "powl");
244+
setLibcallName(RTLIB::POW_FINITE_F128, "__powl_finite");
245+
setLibcallName(RTLIB::CEIL_F128, "ceill");
246+
setLibcallName(RTLIB::TRUNC_F128, "truncl");
247+
setLibcallName(RTLIB::RINT_F128, "rintl");
248+
setLibcallName(RTLIB::NEARBYINT_F128, "nearbyintl");
249+
setLibcallName(RTLIB::ROUND_F128, "roundl");
250+
setLibcallName(RTLIB::ROUNDEVEN_F128, "roundevenl");
251+
setLibcallName(RTLIB::FLOOR_F128, "floorl");
252+
setLibcallName(RTLIB::COPYSIGN_F128, "copysignl");
253+
setLibcallName(RTLIB::FMIN_F128, "fminl");
254+
setLibcallName(RTLIB::FMAX_F128, "fmaxl");
255+
setLibcallName(RTLIB::LROUND_F128, "lroundl");
256+
setLibcallName(RTLIB::LLROUND_F128, "llroundl");
257+
setLibcallName(RTLIB::LRINT_F128, "lrintl");
258+
setLibcallName(RTLIB::LLRINT_F128, "llrintl");
259+
setLibcallName(RTLIB::LDEXP_F128, "ldexpl");
260+
setLibcallName(RTLIB::FREXP_F128, "frexpl");
261+
}
224262
}
225263

226264
/// GetFPLibCall - Helper to return the right libcall for the given floating

llvm/test/CodeGen/Generic/f128-math-lowering.ll

Lines changed: 67 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313
; We test on x86 and x64 which have 80-bit ld, as well as aarch64 (ld == f128),
1414
; riscv32 (ld == f64), and s380x (ld == f128 with different alignment from
1515
; x64/aarch64 f128).
16-
;
17-
; FIXME: these emit calls to long double functions but should emit f128 calls
1816

1917
define fp128 @test_cbrtf128(fp128 %a) {
2018
; CHECK-LABEL: test_cbrtf128:
@@ -33,9 +31,9 @@ declare fp128 @llvm.cbrt.f128(fp128)
3331

3432
define fp128 @test_ceilf128(fp128 %a) {
3533
; CHECK-LABEL: test_ceilf128:
36-
; CHECK-AARCH64: b ceilf128
37-
; CHECK-RISCV32: call ceilf128@plt
38-
; CHECK-S390X: brasl {{%.*}} ceilf128@PLT
34+
; CHECK-AARCH64: b ceill
35+
; CHECK-RISCV32: call ceill@plt
36+
; CHECK-S390X: brasl {{%.*}} ceill@PLT
3937
; CHECK-X64: jmp ceilf128@PLT
4038
; CHECK-X86: calll ceilf128
4139
start:
@@ -138,9 +136,9 @@ declare fp128 @llvm.copysign.f128(fp128, fp128)
138136

139137
define fp128 @test_cosf128(fp128 %a) {
140138
; CHECK-LABEL: test_cosf128:
141-
; CHECK-AARCH64: b cosf128
142-
; CHECK-RISCV32: call cosf128@plt
143-
; CHECK-S390X: brasl {{%.*}} cosf128@PLT
139+
; CHECK-AARCH64: b cosl
140+
; CHECK-RISCV32: call cosl@plt
141+
; CHECK-S390X: brasl {{%.*}} cosl@PLT
144142
; CHECK-X64: jmp cosf128@PLT
145143
; CHECK-X86: calll cosf128
146144
start:
@@ -153,9 +151,9 @@ declare fp128 @llvm.cos.f128(fp128)
153151

154152
define fp128 @test_exp2f128(fp128 %a) {
155153
; CHECK-LABEL: test_exp2f128:
156-
; CHECK-AARCH64: b exp2f128
157-
; CHECK-RISCV32: call exp2f128@plt
158-
; CHECK-S390X: brasl {{%.*}} exp2f128@PLT
154+
; CHECK-AARCH64: b exp2l
155+
; CHECK-RISCV32: call exp2l@plt
156+
; CHECK-S390X: brasl {{%.*}} exp2l@PLT
159157
; CHECK-X64: jmp exp2f128@PLT
160158
; CHECK-X86: calll exp2f128
161159
start:
@@ -183,9 +181,9 @@ declare fp128 @llvm.__exp2f128_finite.f128(fp128)
183181

184182
define fp128 @test_expf128(fp128 %a) {
185183
; CHECK-LABEL: test_expf128:
186-
; CHECK-AARCH64: b expf128
187-
; CHECK-RISCV32: call expf128@plt
188-
; CHECK-S390X: brasl {{%.*}} expf128@PLT
184+
; CHECK-AARCH64: b expl
185+
; CHECK-RISCV32: call expl@plt
186+
; CHECK-S390X: brasl {{%.*}} expl@PLT
189187
; CHECK-X64: jmp expf128@PLT
190188
; CHECK-X86: calll expf128
191189
start:
@@ -213,9 +211,9 @@ declare fp128 @llvm.__expf128_finite.f128(fp128)
213211

214212
define fp128 @test_floorf128(fp128 %a) {
215213
; CHECK-LABEL: test_floorf128:
216-
; CHECK-AARCH64: b floorf128
217-
; CHECK-RISCV32: call floorf128@plt
218-
; CHECK-S390X: brasl {{%.*}} floorf128@PLT
214+
; CHECK-AARCH64: b floorl
215+
; CHECK-RISCV32: call floorl@plt
216+
; CHECK-S390X: brasl {{%.*}} floorl@PLT
219217
; CHECK-X64: jmp floorf128@PLT
220218
; CHECK-X86: calll floorf128
221219
start:
@@ -228,9 +226,9 @@ declare fp128 @llvm.floor.f128(fp128)
228226

229227
define fp128 @test_fmaf128(fp128 %a, fp128 %b, fp128 %c) {
230228
; CHECK-LABEL: test_fmaf128:
231-
; CHECK-AARCH64: b fmaf128
232-
; CHECK-RISCV32: call fmaf128@plt
233-
; CHECK-S390X: brasl {{%.*}} fmaf128@PLT
229+
; CHECK-AARCH64: b fmal
230+
; CHECK-RISCV32: call fmal@plt
231+
; CHECK-S390X: brasl {{%.*}} fmal@PLT
234232
; CHECK-X64: jmp fmaf128@PLT
235233
; CHECK-X86: calll fmaf128
236234
start:
@@ -288,9 +286,9 @@ declare fp128 @llvm.fmod.f128(fp128, fp128)
288286

289287
define { fp128, i32 } @test_frexpf128(fp128 %a) {
290288
; CHECK-LABEL: test_frexpf128:
291-
; CHECK-AARCH64: bl frexpf128
292-
; CHECK-RISCV32: call frexpf128@plt
293-
; CHECK-S390X: brasl {{%.*}} frexpf128@PLT
289+
; CHECK-AARCH64: bl frexpl
290+
; CHECK-RISCV32: call frexpl@plt
291+
; CHECK-S390X: brasl {{%.*}} frexpl@PLT
294292
; CHECK-X64: callq frexpf128@PLT
295293
; CHECK-X86: calll frexpf128
296294
start:
@@ -303,9 +301,9 @@ declare { fp128, i32 } @llvm.frexp.f128(fp128)
303301

304302
define fp128 @test_ldexpf128(fp128 %a, i32 %b) {
305303
; CHECK-LABEL: test_ldexpf128:
306-
; CHECK-AARCH64: b ldexpf128
307-
; CHECK-RISCV32: call ldexpf128@plt
308-
; CHECK-S390X: brasl {{%.*}} ldexpf128@PLT
304+
; CHECK-AARCH64: b ldexpl
305+
; CHECK-RISCV32: call ldexpl@plt
306+
; CHECK-S390X: brasl {{%.*}} ldexpl@PLT
309307
; CHECK-X64: jmp ldexpf128@PLT
310308
; CHECK-X86: calll ldexpf128
311309
start:
@@ -318,9 +316,9 @@ declare fp128 @llvm.ldexp.f128(fp128, i32)
318316

319317
define i64 @test_llrintf128(fp128 %a) {
320318
; CHECK-LABEL: test_llrintf128:
321-
; CHECK-AARCH64: b llrintf128
322-
; CHECK-RISCV32: call llrintf128@plt
323-
; CHECK-S390X: brasl {{%.*}} llrintf128@PLT
319+
; CHECK-AARCH64: b llrintl
320+
; CHECK-RISCV32: call llrintl@plt
321+
; CHECK-S390X: brasl {{%.*}} llrintl@PLT
324322
; CHECK-X64: jmp llrintf128@PLT
325323
; CHECK-X86: calll llrintf128
326324
start:
@@ -333,9 +331,9 @@ declare i64 @llvm.llrint.f128(fp128)
333331

334332
define i64 @test_llroundf128(fp128 %a) {
335333
; CHECK-LABEL: test_llroundf128:
336-
; CHECK-AARCH64: b llroundf128
337-
; CHECK-RISCV32: call llroundf128@plt
338-
; CHECK-S390X: brasl {{%.*}} llroundf128@PLT
334+
; CHECK-AARCH64: b llroundl
335+
; CHECK-RISCV32: call llroundl@plt
336+
; CHECK-S390X: brasl {{%.*}} llroundl@PLT
339337
; CHECK-X64: jmp llroundf128@PLT
340338
; CHECK-X86: calll llroundf128
341339
start:
@@ -348,9 +346,9 @@ declare i64 @llvm.llround.i64.f128(fp128)
348346

349347
define fp128 @test_log10f128(fp128 %a) {
350348
; CHECK-LABEL: test_log10f128:
351-
; CHECK-AARCH64: b log10f128
352-
; CHECK-RISCV32: call log10f128@plt
353-
; CHECK-S390X: brasl {{%.*}} log10f128@PLT
349+
; CHECK-AARCH64: b log10l
350+
; CHECK-RISCV32: call log10l@plt
351+
; CHECK-S390X: brasl {{%.*}} log10l@PLT
354352
; CHECK-X64: jmp log10f128@PLT
355353
; CHECK-X86: calll log10f128
356354
start:
@@ -378,9 +376,9 @@ declare fp128 @llvm.__log10f128_finite.f128(fp128)
378376

379377
define fp128 @test_log2f128(fp128 %a) {
380378
; CHECK-LABEL: test_log2f128:
381-
; CHECK-AARCH64: b log2f128
382-
; CHECK-RISCV32: call log2f128@plt
383-
; CHECK-S390X: brasl {{%.*}} log2f128@PLT
379+
; CHECK-AARCH64: b log2l
380+
; CHECK-RISCV32: call log2l@plt
381+
; CHECK-S390X: brasl {{%.*}} log2l@PLT
384382
; CHECK-X64: jmp log2f128@PLT
385383
; CHECK-X86: calll log2f128
386384
start:
@@ -408,9 +406,9 @@ declare fp128 @llvm.__log2f128_finite.f128(fp128)
408406

409407
define fp128 @test_logf128(fp128 %a) {
410408
; CHECK-LABEL: test_logf128:
411-
; CHECK-AARCH64: b logf128
412-
; CHECK-RISCV32: call logf128@plt
413-
; CHECK-S390X: brasl {{%.*}} logf128@PLT
409+
; CHECK-AARCH64: b logl
410+
; CHECK-RISCV32: call logl@plt
411+
; CHECK-S390X: brasl {{%.*}} logl@PLT
414412
; CHECK-X64: jmp logf128@PLT
415413
; CHECK-X86: calll logf128
416414
start:
@@ -438,9 +436,9 @@ declare fp128 @llvm.__logf128_finite.f128(fp128)
438436

439437
define i64 @test_lrintf128(fp128 %a) {
440438
; CHECK-LABEL: test_lrintf128:
441-
; CHECK-AARCH64: b lrintf128
442-
; CHECK-RISCV32: call lrintf128@plt
443-
; CHECK-S390X: brasl {{%.*}} lrintf128@PLT
439+
; CHECK-AARCH64: b lrintl
440+
; CHECK-RISCV32: call lrintl@plt
441+
; CHECK-S390X: brasl {{%.*}} lrintl@PLT
444442
; CHECK-X64: jmp lrintf128@PLT
445443
; CHECK-X86: calll lrintf128
446444
start:
@@ -453,9 +451,9 @@ declare i64 @llvm.lrint.f128(fp128)
453451

454452
define i64 @test_lroundf128(fp128 %a) {
455453
; CHECK-LABEL: test_lroundf128:
456-
; CHECK-AARCH64: b lroundf128
457-
; CHECK-RISCV32: call lroundf128@plt
458-
; CHECK-S390X: brasl {{%.*}} lroundf128@PLT
454+
; CHECK-AARCH64: b lroundl
455+
; CHECK-RISCV32: call lroundl@plt
456+
; CHECK-S390X: brasl {{%.*}} lroundl@PLT
459457
; CHECK-X64: jmp lroundf128@PLT
460458
; CHECK-X86: calll lroundf128
461459
start:
@@ -468,9 +466,9 @@ declare i64 @llvm.lround.i64.f128(fp128)
468466

469467
define fp128 @test_nearbyintf128(fp128 %a) {
470468
; CHECK-LABEL: test_nearbyintf128:
471-
; CHECK-AARCH64: b nearbyintf128
472-
; CHECK-RISCV32: call nearbyintf128@plt
473-
; CHECK-S390X: brasl {{%.*}} nearbyintf128@PLT
469+
; CHECK-AARCH64: b nearbyintl
470+
; CHECK-RISCV32: call nearbyintl@plt
471+
; CHECK-S390X: brasl {{%.*}} nearbyintl@PLT
474472
; CHECK-X64: jmp nearbyintf128@PLT
475473
; CHECK-X86: calll nearbyintf128
476474
start:
@@ -483,9 +481,9 @@ declare fp128 @llvm.nearbyint.f128(fp128)
483481

484482
define fp128 @test_powf128(fp128 %a, fp128 %b) {
485483
; CHECK-LABEL: test_powf128:
486-
; CHECK-AARCH64: b powf128
487-
; CHECK-RISCV32: call powf128@plt
488-
; CHECK-S390X: brasl {{%.*}} powf128@PLT
484+
; CHECK-AARCH64: b powl
485+
; CHECK-RISCV32: call powl@plt
486+
; CHECK-S390X: brasl {{%.*}} powl@PLT
489487
; CHECK-X64: jmp powf128@PLT
490488
; CHECK-X86: calll powf128
491489
start:
@@ -513,8 +511,8 @@ declare fp128 @llvm.__powf128_finite.f128(fp128, fp128)
513511

514512
define fp128 @test_rintf128(fp128 %a) {
515513
; CHECK-LABEL: test_rintf128:
516-
; CHECK-AARCH64: b rintf128
517-
; CHECK-RISCV32: call rintf128@plt
514+
; CHECK-AARCH64: b rintl
515+
; CHECK-RISCV32: call rintl@plt
518516
;
519517
; CHECK-S390X-LABEL: test_rintf128:
520518
; CHECK-S390X: # %bb.0: # %start
@@ -537,9 +535,9 @@ declare fp128 @llvm.rint.f128(fp128)
537535

538536
define fp128 @test_roundevenf128(fp128 %a) {
539537
; CHECK-LABEL: test_roundevenf128:
540-
; CHECK-AARCH64: b roundevenf128
541-
; CHECK-RISCV32: call roundevenf128@plt
542-
; CHECK-S390X: brasl {{%.*}} roundevenf128@PLT
538+
; CHECK-AARCH64: b roundevenl
539+
; CHECK-RISCV32: call roundevenl@plt
540+
; CHECK-S390X: brasl {{%.*}} roundevenl@PLT
543541
; CHECK-X64: jmp roundevenf128@PLT
544542
; CHECK-X86: calll roundevenf128
545543
start:
@@ -552,9 +550,9 @@ declare fp128 @llvm.roundeven.f128(fp128)
552550

553551
define fp128 @test_roundf128(fp128 %a) {
554552
; CHECK-LABEL: test_roundf128:
555-
; CHECK-AARCH64: b roundf128
556-
; CHECK-RISCV32: call roundf128@plt
557-
; CHECK-S390X: brasl {{%.*}} roundf128@PLT
553+
; CHECK-AARCH64: b roundl
554+
; CHECK-RISCV32: call roundl@plt
555+
; CHECK-S390X: brasl {{%.*}} roundl@PLT
558556
; CHECK-X64: jmp roundf128@PLT
559557
; CHECK-X86: calll roundf128
560558
start:
@@ -567,9 +565,9 @@ declare fp128 @llvm.round.f128(fp128)
567565

568566
define fp128 @test_sinf128(fp128 %a) {
569567
; CHECK-LABEL: test_sinf128:
570-
; CHECK-AARCH64: b sinf128
571-
; CHECK-RISCV32: call sinf128@plt
572-
; CHECK-S390X: brasl {{%.*}} sinf128@PLT
568+
; CHECK-AARCH64: b sinl
569+
; CHECK-RISCV32: call sinl@plt
570+
; CHECK-S390X: brasl {{%.*}} sinl@PLT
573571
; CHECK-X64: jmp sinf128@PLT
574572
; CHECK-X86: calll sinf128
575573
start:
@@ -582,8 +580,8 @@ declare fp128 @llvm.sin.f128(fp128)
582580

583581
define fp128 @test_sqrtf128(fp128 %a) {
584582
; CHECK-LABEL: test_sqrtf128:
585-
; CHECK-AARCH64: b sqrtf128
586-
; CHECK-RISCV32: call sqrtf128@plt
583+
; CHECK-AARCH64: b sqrtl
584+
; CHECK-RISCV32: call sqrtl@plt
587585
; CHECK-S390X: sqxbr {{%.*}} {{%.*}}
588586
; CHECK-X64: jmp sqrtf128@PLT
589587
; CHECK-X86: calll sqrtf128
@@ -597,9 +595,9 @@ declare fp128 @llvm.sqrt.f128(fp128)
597595

598596
define fp128 @test_truncf128(fp128 %a) {
599597
; CHECK-LABEL: test_truncf128:
600-
; CHECK-AARCH64: b truncf128
601-
; CHECK-RISCV32: call truncf128@plt
602-
; CHECK-S390X: brasl {{%.*}} truncf128@PLT
598+
; CHECK-AARCH64: b truncl
599+
; CHECK-RISCV32: call truncl@plt
600+
; CHECK-S390X: brasl {{%.*}} truncl@PLT
603601
; CHECK-X64: jmp truncf128@PLT
604602
; CHECK-X86: calll truncf128
605603
start:

0 commit comments

Comments
 (0)