@@ -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+
3962define <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 )
14091478declare <16 x half > @llvm.powi.v16f16.i32 (<16 x half >, i32 )
14101479declare <2 x double > @llvm.powi.v2f64.i32 (<2 x double >, i32 )
14111480declare <2 x float > @llvm.powi.v2f32.i32 (<2 x float >, i32 )
1481+ declare <2 x fp128 > @llvm.powi.v2fp128.i32 (<2 x fp128 >, i32 )
14121482declare <3 x double > @llvm.powi.v3f64.i32 (<3 x double >, i32 )
14131483declare <3 x float > @llvm.powi.v3f32.i32 (<3 x float >, i32 )
14141484declare <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)
14191489declare <8 x half > @llvm.powi.v8f16.i32 (<8 x half >, i32 )
14201490declare double @llvm.powi.f64.i32 (double , i32 )
14211491declare float @llvm.powi.f32.i32 (float , i32 )
1492+ declare fp128 @llvm.powi.fp128.i32 (fp128 , i32 )
14221493declare half @llvm.powi.f16.i32 (half , i32 )
0 commit comments