Skip to content

Commit 3c90fce

Browse files
[Clang][AArch64] Add missing prototypes for streaming-compatible routines (#82649)
1 parent 22734e1 commit 3c90fce

File tree

2 files changed

+63
-2
lines changed

2 files changed

+63
-2
lines changed

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

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@ bool test_in_streaming_mode(void) __arm_streaming_compatible {
2828

2929
// CHECK-LABEL: @test_za_disable(
3030
// CHECK-NEXT: entry:
31-
// CHECK-NEXT: tail call void @__arm_za_disable() #[[ATTR4:[0-9]+]]
31+
// CHECK-NEXT: tail call void @__arm_za_disable() #[[ATTR3]]
3232
// CHECK-NEXT: ret void
3333
//
3434
// CPP-CHECK-LABEL: @_Z15test_za_disablev(
3535
// CPP-CHECK-NEXT: entry:
36-
// CPP-CHECK-NEXT: tail call void @__arm_za_disable() #[[ATTR4:[0-9]+]]
36+
// CPP-CHECK-NEXT: tail call void @__arm_za_disable() #[[ATTR3]]
3737
// CPP-CHECK-NEXT: ret void
3838
//
3939
void test_za_disable(void) __arm_streaming_compatible {
@@ -70,3 +70,58 @@ void test_svundef_za(void) __arm_streaming_compatible __arm_out("za") {
7070
svundef_za();
7171
}
7272

73+
// CHECK-LABEL: @test_sc_memcpy(
74+
// CHECK-NEXT: entry:
75+
// CHECK-NEXT: [[CALL:%.*]] = tail call ptr @__arm_sc_memcpy(ptr noundef [[DEST:%.*]], ptr noundef [[SRC:%.*]], i64 noundef [[N:%.*]]) #[[ATTR3]]
76+
// CHECK-NEXT: ret ptr [[CALL]]
77+
//
78+
// CPP-CHECK-LABEL: @_Z14test_sc_memcpyPvPKvm(
79+
// CPP-CHECK-NEXT: entry:
80+
// CPP-CHECK-NEXT: [[CALL:%.*]] = tail call ptr @__arm_sc_memcpy(ptr noundef [[DEST:%.*]], ptr noundef [[SRC:%.*]], i64 noundef [[N:%.*]]) #[[ATTR3]]
81+
// CPP-CHECK-NEXT: ret ptr [[CALL]]
82+
//
83+
void *test_sc_memcpy(void *dest, const void *src, size_t n) __arm_streaming_compatible {
84+
return __arm_sc_memcpy(dest, src, n);
85+
}
86+
87+
// CHECK-LABEL: @test_sc_memmove(
88+
// CHECK-NEXT: entry:
89+
// CHECK-NEXT: [[CALL:%.*]] = tail call ptr @__arm_sc_memmove(ptr noundef [[DEST:%.*]], ptr noundef [[SRC:%.*]], i64 noundef [[N:%.*]]) #[[ATTR3]]
90+
// CHECK-NEXT: ret ptr [[CALL]]
91+
//
92+
// CPP-CHECK-LABEL: @_Z15test_sc_memmovePvPKvm(
93+
// CPP-CHECK-NEXT: entry:
94+
// CPP-CHECK-NEXT: [[CALL:%.*]] = tail call ptr @__arm_sc_memmove(ptr noundef [[DEST:%.*]], ptr noundef [[SRC:%.*]], i64 noundef [[N:%.*]]) #[[ATTR3]]
95+
// CPP-CHECK-NEXT: ret ptr [[CALL]]
96+
//
97+
void *test_sc_memmove(void *dest, const void *src, size_t n) __arm_streaming_compatible {
98+
return __arm_sc_memmove(dest, src, n);
99+
}
100+
101+
// CHECK-LABEL: @test_sc_memset(
102+
// CHECK-NEXT: entry:
103+
// CHECK-NEXT: [[CALL:%.*]] = tail call ptr @__arm_sc_memset(ptr noundef [[S:%.*]], i32 noundef [[C:%.*]], i64 noundef [[N:%.*]]) #[[ATTR3]]
104+
// CHECK-NEXT: ret ptr [[CALL]]
105+
//
106+
// CPP-CHECK-LABEL: @_Z14test_sc_memsetPvim(
107+
// CPP-CHECK-NEXT: entry:
108+
// CPP-CHECK-NEXT: [[CALL:%.*]] = tail call ptr @__arm_sc_memset(ptr noundef [[S:%.*]], i32 noundef [[C:%.*]], i64 noundef [[N:%.*]]) #[[ATTR3]]
109+
// CPP-CHECK-NEXT: ret ptr [[CALL]]
110+
//
111+
void *test_sc_memset(void *s, int c, size_t n) __arm_streaming_compatible {
112+
return __arm_sc_memset(s, c, n);
113+
}
114+
115+
// CHECK-LABEL: @test_sc_memchr(
116+
// CHECK-NEXT: entry:
117+
// CHECK-NEXT: [[CALL:%.*]] = tail call ptr @__arm_sc_memchr(ptr noundef [[S:%.*]], i32 noundef [[C:%.*]], i64 noundef [[N:%.*]]) #[[ATTR3]]
118+
// CHECK-NEXT: ret ptr [[CALL]]
119+
//
120+
// CPP-CHECK-LABEL: @_Z14test_sc_memchrPvim(
121+
// CPP-CHECK-NEXT: entry:
122+
// CPP-CHECK-NEXT: [[CALL:%.*]] = tail call ptr @__arm_sc_memchr(ptr noundef [[S:%.*]], i32 noundef [[C:%.*]], i64 noundef [[N:%.*]]) #[[ATTR3]]
123+
// CPP-CHECK-NEXT: ret ptr [[CALL]]
124+
//
125+
void *test_sc_memchr(void *s, int c, size_t n) __arm_streaming_compatible {
126+
return __arm_sc_memchr(s, c, n);
127+
}

clang/utils/TableGen/SveEmitter.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1579,6 +1579,7 @@ void SVEEmitter::createSMEHeader(raw_ostream &OS) {
15791579
OS << "#endif\n";
15801580

15811581
OS << "#include <arm_sve.h>\n\n";
1582+
OS << "#include <stddef.h>\n\n";
15821583

15831584
OS << "/* Function attributes */\n";
15841585
OS << "#define __ai static __inline__ __attribute__((__always_inline__, "
@@ -1605,6 +1606,11 @@ void SVEEmitter::createSMEHeader(raw_ostream &OS) {
16051606
OS << " return x0 & 1;\n";
16061607
OS << "}\n\n";
16071608

1609+
OS << "void *__arm_sc_memcpy(void *dest, const void *src, size_t n) __arm_streaming_compatible;\n";
1610+
OS << "void *__arm_sc_memmove(void *dest, const void *src, size_t n) __arm_streaming_compatible;\n";
1611+
OS << "void *__arm_sc_memset(void *s, int c, size_t n) __arm_streaming_compatible;\n";
1612+
OS << "void *__arm_sc_memchr(void *s, int c, size_t n) __arm_streaming_compatible;\n\n";
1613+
16081614
OS << "__ai __attribute__((target(\"sme\"))) void svundef_za(void) "
16091615
"__arm_streaming_compatible __arm_out(\"za\") "
16101616
"{ }\n\n";

0 commit comments

Comments
 (0)