4 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 * See https://llvm.org/LICENSE.txt for license information.
6 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
14 #include "stringlib.h"
16 static const struct fun
19 char *(*fun
)(const char *s
, int c
);
25 # if __ARM_FEATURE_SVE
26 F(__strrchr_aarch64_sve
)
33 static int test_status
;
34 #define ERR(...) (test_status=1, printf(__VA_ARGS__))
39 static char sbuf
[LEN
+2*A
];
41 static void *alignup(void *p
)
43 return (void*)(((uintptr_t)p
+ A
-1) & -A
);
46 static void test(const struct fun
*fun
, int align
, int seekpos
, int len
)
48 char *src
= alignup(sbuf
);
49 char *s
= src
+ align
;
50 char *f
= seekpos
!= -1 ? s
+ seekpos
: 0;
54 if (len
> LEN
|| seekpos
>= len
- 1 || align
>= A
)
56 if (seekchar
>= 'a' && seekchar
<= 'a' + 23)
59 for (int i
= 0; i
< len
+ A
; i
++)
61 for (int i
= 0; i
< len
- 2; i
++)
64 s
[seekpos
/2] = s
[seekpos
] = seekchar
;
67 p
= fun
->fun(s
, seekchar
);
70 ERR("%s(%p,0x%02x,%d) returned %p\n", fun
->name
, s
, seekchar
, len
, p
);
71 ERR("expected: %p\n", f
);
79 for (int i
=0; funtab
[i
].name
; i
++) {
81 for (int a
= 0; a
< A
; a
++) {
83 for (n
= 1; n
< 100; n
++) {
84 for (int sp
= 0; sp
< n
- 1; sp
++)
85 test(funtab
+i
, a
, sp
, n
);
86 test(funtab
+i
, a
, -1, n
);
88 for (; n
< LEN
; n
*= 2) {
89 test(funtab
+i
, a
, -1, n
);
90 test(funtab
+i
, a
, n
/ 2, n
);
93 printf("%s %s\n", test_status
? "FAIL" : "PASS", funtab
[i
].name
);