Skip to content

Commit ae5575d

Browse files
authored
[mlir][ArmSME] Add arm_sme.intr.cnts(b|h|w|d) intrinsics (#77319)
This adds MLIR versions of the Arm streaming vector length intrinsics. These allow reading the streaming vector length regardless of the streaming mode.
1 parent db78c30 commit ae5575d

File tree

3 files changed

+35
-0
lines changed

3 files changed

+35
-0
lines changed

mlir/include/mlir/Dialect/ArmSME/IR/ArmSMEIntrinsicOps.td

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,4 +187,17 @@ def LLVM_aarch64_sme_write_vert : LLVM_aarch64_sme_write<"vert">;
187187
def LLVM_aarch64_sme_read_horiz : LLVM_aarch64_sme_read<"horiz">;
188188
def LLVM_aarch64_sme_read_vert : LLVM_aarch64_sme_read<"vert">;
189189

190+
class ArmSME_IntrCountOp<string mnemonic>
191+
: ArmSME_IntrOp<mnemonic,
192+
/*immArgPositions=*/[],
193+
/*immArgAttrNames=*/[],
194+
/*overloadedOperands=*/[],
195+
/*traits*/[PredOpTrait<"`res` is i64", TypeIsPred<"res", I64>>],
196+
/*numResults=*/1, /*overloadedResults=*/[]>;
197+
198+
def LLVM_aarch64_sme_cntsb : ArmSME_IntrCountOp<"cntsb">;
199+
def LLVM_aarch64_sme_cntsh : ArmSME_IntrCountOp<"cntsh">;
200+
def LLVM_aarch64_sme_cntsw : ArmSME_IntrCountOp<"cntsw">;
201+
def LLVM_aarch64_sme_cntsd : ArmSME_IntrCountOp<"cntsd">;
202+
190203
#endif // ARMSME_INTRINSIC_OPS

mlir/test/Target/LLVMIR/arm-sme-invalid.mlir

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,11 @@ llvm.func @arm_sme_tile_slice_to_vector_invalid_element_types(
3131
(vector<[4]xf32>, vector<[4]xi1>, i32) -> vector<[4]xi32>
3232
llvm.return %res : vector<[4]xi32>
3333
}
34+
35+
// -----
36+
37+
llvm.func @arm_sme_streaming_vl_invalid_return_type() -> i32 {
38+
// expected-error @+1 {{failed to verify that `res` is i64}}
39+
%res = "arm_sme.intr.cntsb"() : () -> i32
40+
llvm.return %res : i32
41+
}

mlir/test/Target/LLVMIR/arm-sme.mlir

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,3 +403,17 @@ llvm.func @arm_sme_tile_slice_to_vector_vert(%tileslice : i32,
403403
: (vector<[2]xf64>, vector<[2]xi1>, i32) -> vector<[2]xf64>
404404
llvm.return
405405
}
406+
407+
// -----
408+
409+
llvm.func @arm_sme_streaming_vl() {
410+
// CHECK: call i64 @llvm.aarch64.sme.cntsb()
411+
%svl_b = "arm_sme.intr.cntsb"() : () -> i64
412+
// CHECK: call i64 @llvm.aarch64.sme.cntsh()
413+
%svl_h = "arm_sme.intr.cntsh"() : () -> i64
414+
// CHECK: call i64 @llvm.aarch64.sme.cntsw()
415+
%svl_w = "arm_sme.intr.cntsw"() : () -> i64
416+
// CHECK: call i64 @llvm.aarch64.sme.cntsd()
417+
%svl_d = "arm_sme.intr.cntsd"() : () -> i64
418+
llvm.return
419+
}

0 commit comments

Comments
 (0)