Skip to content

Commit b0b1a11

Browse files
committed
[AArch64] Add libcall for fp128 pow/log/sin/cos/etc.
As with other operations, this adds libcall support for fp128 G_FPOW, G_FLOG/G_FEXP/etc, and G_FSIN/G_FCOS/etc operations.
1 parent 6c25604 commit b0b1a11

File tree

4 files changed

+311
-18
lines changed

4 files changed

+311
-18
lines changed

llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
291291
.scalarize(0)
292292
// Regardless of FP16 support, widen 16-bit elements to 32-bits.
293293
.minScalar(0, s32)
294-
.libcallFor({s32, s64});
294+
.libcallFor({s32, s64, s128});
295295
getActionDefinitionsBuilder(G_FPOWI)
296296
.scalarize(0)
297297
.minScalar(0, s32)

llvm/test/CodeGen/AArch64/fexplog.ll

Lines changed: 190 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,26 @@ entry:
3636
ret half %c
3737
}
3838

39-
define <1 x double> @exp_v1f64(<1 x double> %x) {
39+
define fp128 @exp_fp128(fp128 %a) {
40+
; CHECK-LABEL: exp_fp128:
41+
; CHECK: // %bb.0: // %entry
42+
; CHECK-NEXT: b expl
43+
entry:
44+
%c = call fp128 @llvm.exp.fp128(fp128 %a)
45+
ret fp128 %c
46+
}
47+
48+
define <1 x double> @exp_v1f64(<1 x double> %a) {
4049
; CHECK-LABEL: exp_v1f64:
41-
; CHECK: // %bb.0:
50+
; CHECK: // %bb.0: // %entry
4251
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
4352
; CHECK-NEXT: .cfi_def_cfa_offset 16
4453
; CHECK-NEXT: .cfi_offset w30, -16
4554
; CHECK-NEXT: bl exp
4655
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
4756
; CHECK-NEXT: ret
48-
%c = call <1 x double> @llvm.exp.v1f64(<1 x double> %x)
57+
entry:
58+
%c = call <1 x double> @llvm.exp.v1f64(<1 x double> %a)
4959
ret <1 x double> %c
5060
}
5161

@@ -1273,6 +1283,28 @@ entry:
12731283
ret <16 x half> %c
12741284
}
12751285

1286+
define <2 x fp128> @exp_v2fp128(<2 x fp128> %a) {
1287+
; CHECK-LABEL: exp_v2fp128:
1288+
; CHECK: // %bb.0: // %entry
1289+
; CHECK-NEXT: sub sp, sp, #48
1290+
; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
1291+
; CHECK-NEXT: .cfi_def_cfa_offset 48
1292+
; CHECK-NEXT: .cfi_offset w30, -16
1293+
; CHECK-NEXT: str q1, [sp, #16] // 16-byte Folded Spill
1294+
; CHECK-NEXT: bl expl
1295+
; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
1296+
; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
1297+
; CHECK-NEXT: bl expl
1298+
; CHECK-NEXT: mov v1.16b, v0.16b
1299+
; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload
1300+
; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
1301+
; CHECK-NEXT: add sp, sp, #48
1302+
; CHECK-NEXT: ret
1303+
entry:
1304+
%c = call <2 x fp128> @llvm.exp.v2fp128(<2 x fp128> %a)
1305+
ret <2 x fp128> %c
1306+
}
1307+
12761308
define double @exp2_f64(double %a) {
12771309
; CHECK-LABEL: exp2_f64:
12781310
; CHECK: // %bb.0: // %entry
@@ -1307,16 +1339,26 @@ entry:
13071339
ret half %c
13081340
}
13091341

1310-
define <1 x double> @exp2_v1f64(<1 x double> %x) {
1342+
define fp128 @exp2_fp128(fp128 %a) {
1343+
; CHECK-LABEL: exp2_fp128:
1344+
; CHECK: // %bb.0: // %entry
1345+
; CHECK-NEXT: b exp2l
1346+
entry:
1347+
%c = call fp128 @llvm.exp2.fp128(fp128 %a)
1348+
ret fp128 %c
1349+
}
1350+
1351+
define <1 x double> @exp2_v1f64(<1 x double> %a) {
13111352
; CHECK-LABEL: exp2_v1f64:
1312-
; CHECK: // %bb.0:
1353+
; CHECK: // %bb.0: // %entry
13131354
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
13141355
; CHECK-NEXT: .cfi_def_cfa_offset 16
13151356
; CHECK-NEXT: .cfi_offset w30, -16
13161357
; CHECK-NEXT: bl exp2
13171358
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
13181359
; CHECK-NEXT: ret
1319-
%c = call <1 x double> @llvm.exp2.v1f64(<1 x double> %x)
1360+
entry:
1361+
%c = call <1 x double> @llvm.exp2.v1f64(<1 x double> %a)
13201362
ret <1 x double> %c
13211363
}
13221364

@@ -2544,6 +2586,28 @@ entry:
25442586
ret <16 x half> %c
25452587
}
25462588

2589+
define <2 x fp128> @exp2_v2fp128(<2 x fp128> %a) {
2590+
; CHECK-LABEL: exp2_v2fp128:
2591+
; CHECK: // %bb.0: // %entry
2592+
; CHECK-NEXT: sub sp, sp, #48
2593+
; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
2594+
; CHECK-NEXT: .cfi_def_cfa_offset 48
2595+
; CHECK-NEXT: .cfi_offset w30, -16
2596+
; CHECK-NEXT: str q1, [sp, #16] // 16-byte Folded Spill
2597+
; CHECK-NEXT: bl exp2l
2598+
; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
2599+
; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
2600+
; CHECK-NEXT: bl exp2l
2601+
; CHECK-NEXT: mov v1.16b, v0.16b
2602+
; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload
2603+
; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
2604+
; CHECK-NEXT: add sp, sp, #48
2605+
; CHECK-NEXT: ret
2606+
entry:
2607+
%c = call <2 x fp128> @llvm.exp2.v2fp128(<2 x fp128> %a)
2608+
ret <2 x fp128> %c
2609+
}
2610+
25472611
define double @log_f64(double %a) {
25482612
; CHECK-LABEL: log_f64:
25492613
; CHECK: // %bb.0: // %entry
@@ -2578,16 +2642,26 @@ entry:
25782642
ret half %c
25792643
}
25802644

2581-
define <1 x double> @log_v1f64(<1 x double> %x) {
2645+
define fp128 @log_fp128(fp128 %a) {
2646+
; CHECK-LABEL: log_fp128:
2647+
; CHECK: // %bb.0: // %entry
2648+
; CHECK-NEXT: b logl
2649+
entry:
2650+
%c = call fp128 @llvm.log.fp128(fp128 %a)
2651+
ret fp128 %c
2652+
}
2653+
2654+
define <1 x double> @log_v1f64(<1 x double> %a) {
25822655
; CHECK-LABEL: log_v1f64:
2583-
; CHECK: // %bb.0:
2656+
; CHECK: // %bb.0: // %entry
25842657
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
25852658
; CHECK-NEXT: .cfi_def_cfa_offset 16
25862659
; CHECK-NEXT: .cfi_offset w30, -16
25872660
; CHECK-NEXT: bl log
25882661
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
25892662
; CHECK-NEXT: ret
2590-
%c = call <1 x double> @llvm.log.v1f64(<1 x double> %x)
2663+
entry:
2664+
%c = call <1 x double> @llvm.log.v1f64(<1 x double> %a)
25912665
ret <1 x double> %c
25922666
}
25932667

@@ -3815,6 +3889,28 @@ entry:
38153889
ret <16 x half> %c
38163890
}
38173891

3892+
define <2 x fp128> @log_v2fp128(<2 x fp128> %a) {
3893+
; CHECK-LABEL: log_v2fp128:
3894+
; CHECK: // %bb.0: // %entry
3895+
; CHECK-NEXT: sub sp, sp, #48
3896+
; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
3897+
; CHECK-NEXT: .cfi_def_cfa_offset 48
3898+
; CHECK-NEXT: .cfi_offset w30, -16
3899+
; CHECK-NEXT: str q1, [sp, #16] // 16-byte Folded Spill
3900+
; CHECK-NEXT: bl logl
3901+
; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
3902+
; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
3903+
; CHECK-NEXT: bl logl
3904+
; CHECK-NEXT: mov v1.16b, v0.16b
3905+
; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload
3906+
; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
3907+
; CHECK-NEXT: add sp, sp, #48
3908+
; CHECK-NEXT: ret
3909+
entry:
3910+
%c = call <2 x fp128> @llvm.log.v2fp128(<2 x fp128> %a)
3911+
ret <2 x fp128> %c
3912+
}
3913+
38183914
define double @log2_f64(double %a) {
38193915
; CHECK-LABEL: log2_f64:
38203916
; CHECK: // %bb.0: // %entry
@@ -3849,16 +3945,26 @@ entry:
38493945
ret half %c
38503946
}
38513947

3852-
define <1 x double> @log2_v1f64(<1 x double> %x) {
3948+
define fp128 @log2_fp128(fp128 %a) {
3949+
; CHECK-LABEL: log2_fp128:
3950+
; CHECK: // %bb.0: // %entry
3951+
; CHECK-NEXT: b log2l
3952+
entry:
3953+
%c = call fp128 @llvm.log2.fp128(fp128 %a)
3954+
ret fp128 %c
3955+
}
3956+
3957+
define <1 x double> @log2_v1f64(<1 x double> %a) {
38533958
; CHECK-LABEL: log2_v1f64:
3854-
; CHECK: // %bb.0:
3959+
; CHECK: // %bb.0: // %entry
38553960
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
38563961
; CHECK-NEXT: .cfi_def_cfa_offset 16
38573962
; CHECK-NEXT: .cfi_offset w30, -16
38583963
; CHECK-NEXT: bl log2
38593964
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
38603965
; CHECK-NEXT: ret
3861-
%c = call <1 x double> @llvm.log2.v1f64(<1 x double> %x)
3966+
entry:
3967+
%c = call <1 x double> @llvm.log2.v1f64(<1 x double> %a)
38623968
ret <1 x double> %c
38633969
}
38643970

@@ -5086,6 +5192,28 @@ entry:
50865192
ret <16 x half> %c
50875193
}
50885194

5195+
define <2 x fp128> @log2_v2fp128(<2 x fp128> %a) {
5196+
; CHECK-LABEL: log2_v2fp128:
5197+
; CHECK: // %bb.0: // %entry
5198+
; CHECK-NEXT: sub sp, sp, #48
5199+
; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
5200+
; CHECK-NEXT: .cfi_def_cfa_offset 48
5201+
; CHECK-NEXT: .cfi_offset w30, -16
5202+
; CHECK-NEXT: str q1, [sp, #16] // 16-byte Folded Spill
5203+
; CHECK-NEXT: bl log2l
5204+
; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
5205+
; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
5206+
; CHECK-NEXT: bl log2l
5207+
; CHECK-NEXT: mov v1.16b, v0.16b
5208+
; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload
5209+
; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
5210+
; CHECK-NEXT: add sp, sp, #48
5211+
; CHECK-NEXT: ret
5212+
entry:
5213+
%c = call <2 x fp128> @llvm.log2.v2fp128(<2 x fp128> %a)
5214+
ret <2 x fp128> %c
5215+
}
5216+
50895217
define double @log10_f64(double %a) {
50905218
; CHECK-LABEL: log10_f64:
50915219
; CHECK: // %bb.0: // %entry
@@ -5120,16 +5248,26 @@ entry:
51205248
ret half %c
51215249
}
51225250

5123-
define <1 x double> @log10_v1f64(<1 x double> %x) {
5251+
define fp128 @log10_fp128(fp128 %a) {
5252+
; CHECK-LABEL: log10_fp128:
5253+
; CHECK: // %bb.0: // %entry
5254+
; CHECK-NEXT: b log10l
5255+
entry:
5256+
%c = call fp128 @llvm.log10.fp128(fp128 %a)
5257+
ret fp128 %c
5258+
}
5259+
5260+
define <1 x double> @log10_v1f64(<1 x double> %a) {
51245261
; CHECK-LABEL: log10_v1f64:
5125-
; CHECK: // %bb.0:
5262+
; CHECK: // %bb.0: // %entry
51265263
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
51275264
; CHECK-NEXT: .cfi_def_cfa_offset 16
51285265
; CHECK-NEXT: .cfi_offset w30, -16
51295266
; CHECK-NEXT: bl log10
51305267
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
51315268
; CHECK-NEXT: ret
5132-
%c = call <1 x double> @llvm.log10.v1f64(<1 x double> %x)
5269+
entry:
5270+
%c = call <1 x double> @llvm.log10.v1f64(<1 x double> %a)
51335271
ret <1 x double> %c
51345272
}
51355273

@@ -6357,6 +6495,33 @@ entry:
63576495
ret <16 x half> %c
63586496
}
63596497

6498+
define <2 x fp128> @log10_v2fp128(<2 x fp128> %a) {
6499+
; CHECK-LABEL: log10_v2fp128:
6500+
; CHECK: // %bb.0: // %entry
6501+
; CHECK-NEXT: sub sp, sp, #48
6502+
; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
6503+
; CHECK-NEXT: .cfi_def_cfa_offset 48
6504+
; CHECK-NEXT: .cfi_offset w30, -16
6505+
; CHECK-NEXT: str q1, [sp, #16] // 16-byte Folded Spill
6506+
; CHECK-NEXT: bl log10l
6507+
; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
6508+
; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
6509+
; CHECK-NEXT: bl log10l
6510+
; CHECK-NEXT: mov v1.16b, v0.16b
6511+
; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload
6512+
; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
6513+
; CHECK-NEXT: add sp, sp, #48
6514+
; CHECK-NEXT: ret
6515+
entry:
6516+
%c = call <2 x fp128> @llvm.log10.v2fp128(<2 x fp128> %a)
6517+
ret <2 x fp128> %c
6518+
}
6519+
6520+
declare <1 x double> @llvm.exp.v1f64(<1 x double>)
6521+
declare <1 x double> @llvm.exp2.v1f64(<1 x double>)
6522+
declare <1 x double> @llvm.log.v1f64(<1 x double>)
6523+
declare <1 x double> @llvm.log10.v1f64(<1 x double>)
6524+
declare <1 x double> @llvm.log2.v1f64(<1 x double>)
63606525
declare <16 x half> @llvm.exp.v16f16(<16 x half>)
63616526
declare <16 x half> @llvm.exp2.v16f16(<16 x half>)
63626527
declare <16 x half> @llvm.log.v16f16(<16 x half>)
@@ -6372,6 +6537,11 @@ declare <2 x float> @llvm.exp2.v2f32(<2 x float>)
63726537
declare <2 x float> @llvm.log.v2f32(<2 x float>)
63736538
declare <2 x float> @llvm.log10.v2f32(<2 x float>)
63746539
declare <2 x float> @llvm.log2.v2f32(<2 x float>)
6540+
declare <2 x fp128> @llvm.exp.v2fp128(<2 x fp128>)
6541+
declare <2 x fp128> @llvm.exp2.v2fp128(<2 x fp128>)
6542+
declare <2 x fp128> @llvm.log.v2fp128(<2 x fp128>)
6543+
declare <2 x fp128> @llvm.log10.v2fp128(<2 x fp128>)
6544+
declare <2 x fp128> @llvm.log2.v2fp128(<2 x fp128>)
63756545
declare <3 x double> @llvm.exp.v3f64(<3 x double>)
63766546
declare <3 x double> @llvm.exp2.v3f64(<3 x double>)
63776547
declare <3 x double> @llvm.log.v3f64(<3 x double>)
@@ -6422,6 +6592,11 @@ declare float @llvm.exp2.f32(float)
64226592
declare float @llvm.log.f32(float)
64236593
declare float @llvm.log10.f32(float)
64246594
declare float @llvm.log2.f32(float)
6595+
declare fp128 @llvm.exp.fp128(fp128)
6596+
declare fp128 @llvm.exp2.fp128(fp128)
6597+
declare fp128 @llvm.log.fp128(fp128)
6598+
declare fp128 @llvm.log10.fp128(fp128)
6599+
declare fp128 @llvm.log2.fp128(fp128)
64256600
declare half @llvm.exp.f16(half)
64266601
declare half @llvm.exp2.f16(half)
64276602
declare half @llvm.log.f16(half)

0 commit comments

Comments
 (0)