Skip to content

Commit 0cac331

Browse files
CarolineConcattowwwatermiao
authored andcommitted
[AArch64][SME]Update intrinsic interface for ldr/str (#65593)
The new ACLE PR#225[1] now combines the slice parameters for some builtins. [1]https://github.com/ARM-software/acle/pull/225/files Signed-off-by: chenmiao <[email protected]> Signed-off-by: chenmiao <[email protected]>
1 parent 7652572 commit 0cac331

File tree

5 files changed

+54
-22
lines changed

5 files changed

+54
-22
lines changed

clang/include/clang/Basic/arm_sme.td

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,14 @@ defm SVLD1_ZA32 : ZALoad<"za32", "i", "aarch64_sme_ld1w", [ImmCheck<0, ImmCheck0
4444
defm SVLD1_ZA64 : ZALoad<"za64", "l", "aarch64_sme_ld1d", [ImmCheck<0, ImmCheck0_7>, ImmCheck<2, ImmCheck0_1>]>;
4545
defm SVLD1_ZA128 : ZALoad<"za128", "q", "aarch64_sme_ld1q", [ImmCheck<0, ImmCheck0_15>, ImmCheck<2, ImmCheck0_0>]>;
4646

47-
def SVLDR_VNUM_ZA : MInst<"svldr_vnum_za", "vmiQ", "",
47+
def SVLDR_VNUM_ZA : MInst<"svldr_vnum_za", "vmQi", "",
4848
[IsOverloadNone, IsStreamingCompatible, IsSharedZA],
4949
MemEltTyDefault, "aarch64_sme_ldr",
50-
[ImmCheck<1, ImmCheck0_15>]>;
50+
[ImmCheck<2, ImmCheck0_15>]>;
51+
52+
def SVLDR_ZA : MInst<"svldr_za", "vmQ", "",
53+
[IsOverloadNone, IsStreamingCompatible, IsSharedZA],
54+
MemEltTyDefault, "aarch64_sme_ldr", []>;
5155

5256
////////////////////////////////////////////////////////////////////////////////
5357
// Stores
@@ -78,10 +82,14 @@ defm SVST1_ZA32 : ZAStore<"za32", "i", "aarch64_sme_st1w", [ImmCheck<0, ImmCheck
7882
defm SVST1_ZA64 : ZAStore<"za64", "l", "aarch64_sme_st1d", [ImmCheck<0, ImmCheck0_7>, ImmCheck<2, ImmCheck0_1>]>;
7983
defm SVST1_ZA128 : ZAStore<"za128", "q", "aarch64_sme_st1q", [ImmCheck<0, ImmCheck0_15>, ImmCheck<2, ImmCheck0_0>]>;
8084

81-
def SVSTR_VNUM_ZA : MInst<"svstr_vnum_za", "vmi%", "",
85+
def SVSTR_VNUM_ZA : MInst<"svstr_vnum_za", "vm%i", "",
8286
[IsOverloadNone, IsStreamingCompatible, IsSharedZA, IsPreservesZA],
8387
MemEltTyDefault, "aarch64_sme_str",
84-
[ImmCheck<1, ImmCheck0_15>]>;
88+
[ImmCheck<2, ImmCheck0_15>]>;
89+
90+
def SVSTR_ZA : MInst<"svstr_za", "vm%", "",
91+
[IsOverloadNone, IsStreamingCompatible, IsSharedZA, IsPreservesZA],
92+
MemEltTyDefault, "aarch64_sme_str", []>;
8593

8694
////////////////////////////////////////////////////////////////////////////////
8795
// Read horizontal/vertical ZA slices

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9521,15 +9521,18 @@ Value *CodeGenFunction::EmitSMEZero(SVETypeFlags TypeFlags,
95219521
Value *CodeGenFunction::EmitSMELdrStr(SVETypeFlags TypeFlags,
95229522
SmallVectorImpl<Value *> &Ops,
95239523
unsigned IntID) {
9524-
Function *Cntsb = CGM.getIntrinsic(Intrinsic::aarch64_sme_cntsb);
9525-
llvm::Value *CntsbCall = Builder.CreateCall(Cntsb, {}, "svlb");
9526-
llvm::Value *MulVL = Builder.CreateMul(
9527-
CntsbCall,
9528-
Builder.getInt64(cast<llvm::ConstantInt>(Ops[1])->getZExtValue()),
9529-
"mulvl");
9530-
Ops[2] = Builder.CreateGEP(Int8Ty, Ops[2], MulVL);
9531-
Ops[0] = EmitTileslice(Ops[1], Ops[0]);
9532-
Ops.erase(&Ops[1]);
9524+
if (Ops.size() == 3) {
9525+
Function *Cntsb = CGM.getIntrinsic(Intrinsic::aarch64_sme_cntsb);
9526+
llvm::Value *CntsbCall = Builder.CreateCall(Cntsb, {}, "svlb");
9527+
llvm::Value *MulVL = Builder.CreateMul(
9528+
CntsbCall,
9529+
Builder.getInt64(cast<llvm::ConstantInt>(Ops[2])->getZExtValue()),
9530+
"mulvl");
9531+
9532+
Ops[1] = Builder.CreateGEP(Int8Ty, Ops[1], MulVL);
9533+
Ops[0] = EmitTileslice(Ops[0], Ops[2]);
9534+
Ops.erase(&Ops[2]);
9535+
}
95339536
Function *F = CGM.getIntrinsic(IntID, {});
95349537
return Builder.CreateCall(F, Ops);
95359538
}
@@ -9999,7 +10002,9 @@ Value *CodeGenFunction::EmitAArch64SMEBuiltinExpr(unsigned BuiltinID,
999910002
BuiltinID == SME::BI__builtin_sme_svzero_za)
1000010003
return EmitSMEZero(TypeFlags, Ops, Builtin->LLVMIntrinsic);
1000110004
else if (BuiltinID == SME::BI__builtin_sme_svldr_vnum_za ||
10002-
BuiltinID == SME::BI__builtin_sme_svstr_vnum_za)
10005+
BuiltinID == SME::BI__builtin_sme_svstr_vnum_za ||
10006+
BuiltinID == SME::BI__builtin_sme_svldr_za ||
10007+
BuiltinID == SME::BI__builtin_sme_svstr_za)
1000310008
return EmitSMELdrStr(TypeFlags, Ops, Builtin->LLVMIntrinsic);
1000410009
else if (Builtin->LLVMIntrinsic != 0) {
1000510010
// Predicates must match the main datatype.

clang/test/CodeGen/aarch64-sme-intrinsics/acle_sme_ldr.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
// CHECK-NEXT: ret void
1313
//
1414
void test_svldr_vnum_za(uint32_t slice_base, const void *ptr) {
15-
svldr_vnum_za(slice_base, 0, ptr);
15+
svldr_vnum_za(slice_base, ptr, 0);
1616
}
1717

1818
// CHECK-C-LABEL: @test_svldr_vnum_za_1(
@@ -26,5 +26,14 @@ void test_svldr_vnum_za(uint32_t slice_base, const void *ptr) {
2626
// CHECK-NEXT: ret void
2727
//
2828
void test_svldr_vnum_za_1(uint32_t slice_base, const void *ptr) {
29-
svldr_vnum_za(slice_base, 15, ptr);
29+
svldr_vnum_za(slice_base, ptr, 15);
30+
}
31+
32+
// CHECK-C-LABEL: @test_svldr_za(
33+
// CHECK-CXX-LABEL: @_Z13test_svldr_zajPKv(
34+
// CHECK-NEXT: entry:
35+
// CHECK-NEXT: tail call void @llvm.aarch64.sme.ldr(i32 [[SLICE_BASE:%.*]], ptr [[PTR:%.*]])
36+
// CHECK-NEXT: ret void
37+
void test_svldr_za(uint32_t slice_base, const void *ptr) {
38+
svldr_za(slice_base, ptr);
3039
}

clang/test/CodeGen/aarch64-sme-intrinsics/acle_sme_str.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
// CHECK-NEXT: ret void
1313
//
1414
void test_svstr_vnum_za(uint32_t slice_base, void *ptr) {
15-
svstr_vnum_za(slice_base, 0, ptr);
15+
svstr_vnum_za(slice_base, ptr, 0);
1616
}
1717

1818
// CHECK-C-LABEL: @test_svstr_vnum_za_1(
@@ -26,5 +26,15 @@ void test_svstr_vnum_za(uint32_t slice_base, void *ptr) {
2626
// CHECK-NEXT: ret void
2727
//
2828
void test_svstr_vnum_za_1(uint32_t slice_base, void *ptr) {
29-
svstr_vnum_za(slice_base, 15, ptr);
29+
svstr_vnum_za(slice_base, ptr, 15);
30+
}
31+
32+
// CHECK-C-LABEL: @test_svstr_za(
33+
// CHECK-CXX-LABEL: @_Z13test_svstr_zajPv(
34+
// CHECK-NEXT: entry:
35+
// CHECK-NEXT: tail call void @llvm.aarch64.sme.str(i32 [[SLICE_BASE:%.*]], ptr [[PTR:%.*]])
36+
// CHECK-NEXT: ret void
37+
//
38+
void test_svstr_za(uint32_t slice_base, void *ptr) {
39+
svstr_za(slice_base, ptr);
3040
}

clang/test/Sema/aarch64-sme-intrinsics/acle_sme_imm.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -211,9 +211,9 @@ void test_range_0_15(svbool_t pg, void *ptr) {
211211
SVE_ACLE_FUNC(svst1_ver_vnum_za8,,,)(0, -1, 16, pg, ptr, 1);
212212

213213
// expected-error@+1 {{argument value 16 is outside the valid range [0, 15]}}
214-
SVE_ACLE_FUNC(svldr_vnum_za,,,)(-1, 16, ptr);
214+
SVE_ACLE_FUNC(svldr_vnum_za,,,)(-1, ptr, 16);
215215
// expected-error@+1 {{argument value 18446744073709551615 is outside the valid range [0, 15]}}
216-
SVE_ACLE_FUNC(svstr_vnum_za,,,)(-1, -1, ptr);
216+
SVE_ACLE_FUNC(svstr_vnum_za,,,)(-1, ptr, -1);
217217

218218
// expected-error@+1 {{argument value 18446744073709551615 is outside the valid range [0, 15]}}
219219
SVE_ACLE_FUNC(svread_hor_za128, _s8, _m,)(svundef_s8(), pg, -1, -1, 0);
@@ -250,8 +250,8 @@ void test_constant(uint64_t u64, svbool_t pg, void *ptr) {
250250
SVE_ACLE_FUNC(svst1_hor_vnum_za32,,,)(u64, u64, 0, pg, ptr, u64); // expected-error {{argument to 'svst1_hor_vnum_za32' must be a constant integer}}
251251
SVE_ACLE_FUNC(svst1_ver_vnum_za64,,,)(0, u64, u64, pg, ptr, u64); // expected-error {{argument to 'svst1_ver_vnum_za64' must be a constant integer}}
252252

253-
SVE_ACLE_FUNC(svldr_vnum_za,,,)(u64, u64, ptr); // expected-error {{argument to 'svldr_vnum_za' must be a constant integer}}
254-
SVE_ACLE_FUNC(svstr_vnum_za,,,)(u64, u64, ptr); // expected-error {{argument to 'svstr_vnum_za' must be a constant integer}}
253+
SVE_ACLE_FUNC(svldr_vnum_za,,,)(u64, ptr, u64); // expected-error {{argument to 'svldr_vnum_za' must be a constant integer}}
254+
SVE_ACLE_FUNC(svstr_vnum_za,,,)(u64, ptr, u64); // expected-error {{argument to 'svstr_vnum_za' must be a constant integer}}
255255

256256
SVE_ACLE_FUNC(svread_hor_za8, _s8, _m,)(svundef_s8(), pg, 0, u64, u64); // expected-error-re {{argument to 'svread_hor_za8{{.*}}_m' must be a constant integer}}
257257
SVE_ACLE_FUNC(svread_ver_za16, _s16, _m,)(svundef_s16(), pg, u64, u64, 0); // expected-error-re {{argument to 'svread_ver_za16{{.*}}_m' must be a constant integer}}

0 commit comments

Comments
 (0)