Skip to content

Commit 8ecbad7

Browse files
committed
[AArch64][GlobalISel] Add fpowi fp128 libcall legalization.
1 parent 3736ef0 commit 8ecbad7

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-1
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
295295
getActionDefinitionsBuilder(G_FPOWI)
296296
.scalarize(0)
297297
.minScalar(0, s32)
298-
.libcallFor({{s32, s32}, {s64, s32}});
298+
.libcallFor({{s32, s32}, {s64, s32}, {s128, s32}});
299299

300300
getActionDefinitionsBuilder(G_INSERT)
301301
.legalIf(all(typeInSet(0, {s32, s64, p0}),

llvm/test/CodeGen/AArch64/fpowi.ll

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,29 @@ entry:
3636
ret half %c
3737
}
3838

39+
define fp128 @powi_fp128(fp128 %a, i32 %b) {
40+
; CHECK-LABEL: powi_fp128:
41+
; CHECK: // %bb.0: // %entry
42+
; CHECK-NEXT: b __powitf2
43+
entry:
44+
%c = call fp128 @llvm.powi.fp128.i32(fp128 %a, i32 %b)
45+
ret fp128 %c
46+
}
47+
48+
define <1 x double> @powi_v1f64(<1 x double> %a, i32 %b) {
49+
; CHECK-LABEL: powi_v1f64:
50+
; CHECK: // %bb.0: // %entry
51+
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
52+
; CHECK-NEXT: .cfi_def_cfa_offset 16
53+
; CHECK-NEXT: .cfi_offset w30, -16
54+
; CHECK-NEXT: bl __powidf2
55+
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
56+
; CHECK-NEXT: ret
57+
entry:
58+
%c = call <1 x double> @llvm.powi.v1f64.i32(<1 x double> %a, i32 %b)
59+
ret <1 x double> %c
60+
}
61+
3962
define <2 x double> @powi_v2f64(<2 x double> %a, i32 %b) {
4063
; CHECK-SD-LABEL: powi_v2f64:
4164
; CHECK-SD: // %bb.0: // %entry
@@ -1406,9 +1429,56 @@ entry:
14061429
ret <16 x half> %c
14071430
}
14081431

1432+
define <2 x fp128> @powi_v2fp128(<2 x fp128> %a, i32 %b) {
1433+
; CHECK-SD-LABEL: powi_v2fp128:
1434+
; CHECK-SD: // %bb.0: // %entry
1435+
; CHECK-SD-NEXT: sub sp, sp, #48
1436+
; CHECK-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill
1437+
; CHECK-SD-NEXT: .cfi_def_cfa_offset 48
1438+
; CHECK-SD-NEXT: .cfi_offset w19, -8
1439+
; CHECK-SD-NEXT: .cfi_offset w30, -16
1440+
; CHECK-SD-NEXT: mov w19, w0
1441+
; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Folded Spill
1442+
; CHECK-SD-NEXT: bl __powitf2
1443+
; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
1444+
; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
1445+
; CHECK-SD-NEXT: mov w0, w19
1446+
; CHECK-SD-NEXT: bl __powitf2
1447+
; CHECK-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload
1448+
; CHECK-SD-NEXT: mov v1.16b, v0.16b
1449+
; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload
1450+
; CHECK-SD-NEXT: add sp, sp, #48
1451+
; CHECK-SD-NEXT: ret
1452+
;
1453+
; CHECK-GI-LABEL: powi_v2fp128:
1454+
; CHECK-GI: // %bb.0: // %entry
1455+
; CHECK-GI-NEXT: sub sp, sp, #48
1456+
; CHECK-GI-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill
1457+
; CHECK-GI-NEXT: .cfi_def_cfa_offset 48
1458+
; CHECK-GI-NEXT: .cfi_offset w19, -8
1459+
; CHECK-GI-NEXT: .cfi_offset w30, -16
1460+
; CHECK-GI-NEXT: str q1, [sp, #16] // 16-byte Folded Spill
1461+
; CHECK-GI-NEXT: mov w19, w0
1462+
; CHECK-GI-NEXT: bl __powitf2
1463+
; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
1464+
; CHECK-GI-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
1465+
; CHECK-GI-NEXT: mov w0, w19
1466+
; CHECK-GI-NEXT: bl __powitf2
1467+
; CHECK-GI-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload
1468+
; CHECK-GI-NEXT: mov v1.16b, v0.16b
1469+
; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
1470+
; CHECK-GI-NEXT: add sp, sp, #48
1471+
; CHECK-GI-NEXT: ret
1472+
entry:
1473+
%c = call <2 x fp128> @llvm.powi.v2fp128.i32(<2 x fp128> %a, i32 %b)
1474+
ret <2 x fp128> %c
1475+
}
1476+
1477+
declare <1 x double> @llvm.powi.v1f64.i32(<1 x double>, i32)
14091478
declare <16 x half> @llvm.powi.v16f16.i32(<16 x half>, i32)
14101479
declare <2 x double> @llvm.powi.v2f64.i32(<2 x double>, i32)
14111480
declare <2 x float> @llvm.powi.v2f32.i32(<2 x float>, i32)
1481+
declare <2 x fp128> @llvm.powi.v2fp128.i32(<2 x fp128>, i32)
14121482
declare <3 x double> @llvm.powi.v3f64.i32(<3 x double>, i32)
14131483
declare <3 x float> @llvm.powi.v3f32.i32(<3 x float>, i32)
14141484
declare <4 x double> @llvm.powi.v4f64.i32(<4 x double>, i32)
@@ -1419,4 +1489,5 @@ declare <8 x float> @llvm.powi.v8f32.i32(<8 x float>, i32)
14191489
declare <8 x half> @llvm.powi.v8f16.i32(<8 x half>, i32)
14201490
declare double @llvm.powi.f64.i32(double, i32)
14211491
declare float @llvm.powi.f32.i32(float, i32)
1492+
declare fp128 @llvm.powi.fp128.i32(fp128, i32)
14221493
declare half @llvm.powi.f16.i32(half, i32)

0 commit comments

Comments
 (0)