Skip to content

Commit bed214c

Browse files
committed
[AArch64][SME] Add intrinsics for enabling/disabling ZA.
This adds the intrinsics: * void @llvm.aarch64.sme.za.enable() -> smstart za * void @llvm.aarch64.sme.za.disable() -> smstop za Reviewed By: aemerson Differential Revision: https://reviews.llvm.org/D133894
1 parent 5fae000 commit bed214c

File tree

3 files changed

+38
-0
lines changed

3 files changed

+38
-0
lines changed

llvm/include/llvm/IR/IntrinsicsAArch64.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2700,6 +2700,12 @@ let TargetPrefix = "aarch64" in {
27002700
def int_aarch64_sme_set_tpidr2
27012701
: DefaultAttrsIntrinsic<[], [llvm_i64_ty],
27022702
[IntrNoMem, IntrHasSideEffects]>;
2703+
2704+
def int_aarch64_sme_za_enable
2705+
: DefaultAttrsIntrinsic<[], [], [IntrNoMem, IntrHasSideEffects]>;
2706+
def int_aarch64_sme_za_disable
2707+
: DefaultAttrsIntrinsic<[], [], [IntrNoMem, IntrHasSideEffects]>;
2708+
27032709
// Clamp
27042710
//
27052711

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1157,6 +1157,9 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
11571157
}
11581158
}
11591159

1160+
if (Subtarget->hasSME())
1161+
setOperationAction(ISD::INTRINSIC_VOID, MVT::Other, Custom);
1162+
11601163
if (Subtarget->hasSVE()) {
11611164
for (auto VT : {MVT::nxv16i8, MVT::nxv8i16, MVT::nxv4i32, MVT::nxv2i64}) {
11621165
setOperationAction(ISD::BITREVERSE, VT, Custom);
@@ -4565,6 +4568,18 @@ SDValue AArch64TargetLowering::LowerINTRINSIC_W_CHAIN(SDValue Op,
45654568
SDValue PStateSM = getPStateSM(DAG, Chain, Attrs, DL, Op.getValueType());
45664569
return DAG.getMergeValues({PStateSM, Chain}, DL);
45674570
}
4571+
case Intrinsic::aarch64_sme_za_enable:
4572+
return DAG.getNode(
4573+
AArch64ISD::SMSTART, DL, MVT::Other,
4574+
Op->getOperand(0), // Chain
4575+
DAG.getTargetConstant((int32_t)(AArch64SVCR::SVCRZA), DL, MVT::i32),
4576+
DAG.getConstant(0, DL, MVT::i64), DAG.getConstant(1, DL, MVT::i64));
4577+
case Intrinsic::aarch64_sme_za_disable:
4578+
return DAG.getNode(
4579+
AArch64ISD::SMSTOP, DL, MVT::Other,
4580+
Op->getOperand(0), // Chain
4581+
DAG.getTargetConstant((int32_t)(AArch64SVCR::SVCRZA), DL, MVT::i32),
4582+
DAG.getConstant(0, DL, MVT::i64), DAG.getConstant(1, DL, MVT::i64));
45684583
}
45694584
}
45704585

@@ -5639,6 +5654,7 @@ SDValue AArch64TargetLowering::LowerOperation(SDValue Op,
56395654
return LowerToPredicatedOp(Op, DAG, AArch64ISD::MULHS_PRED);
56405655
case ISD::MULHU:
56415656
return LowerToPredicatedOp(Op, DAG, AArch64ISD::MULHU_PRED);
5657+
case ISD::INTRINSIC_VOID:
56425658
case ISD::INTRINSIC_W_CHAIN:
56435659
return LowerINTRINSIC_W_CHAIN(Op, DAG);
56445660
case ISD::INTRINSIC_WO_CHAIN:
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=aarch64 -mattr=+sme -verify-machineinstrs < %s | FileCheck %s
3+
4+
define void @toggle_pstate_za() {
5+
; CHECK-LABEL: toggle_pstate_za:
6+
; CHECK: // %bb.0:
7+
; CHECK-NEXT: smstart za
8+
; CHECK-NEXT: smstop za
9+
; CHECK-NEXT: ret
10+
call void @llvm.aarch64.sme.za.enable()
11+
call void @llvm.aarch64.sme.za.disable()
12+
ret void
13+
}
14+
15+
declare void @llvm.aarch64.sme.za.enable()
16+
declare void @llvm.aarch64.sme.za.disable()

0 commit comments

Comments
 (0)