@@ -71,7 +71,7 @@ do_one_test (impl_t *impl, const CHAR *s, int c, size_t n, CHAR *exp_res)
}
static void
-do_test (size_t align, size_t pos, size_t len, int seek_char)
+do_test (size_t align, size_t pos, size_t len, size_t n, int seek_char)
{
size_t i;
CHAR *result;
@@ -103,7 +103,7 @@ do_test (size_t align, size_t pos, size_t len, int seek_char)
}
FOR_EACH_IMPL (impl, 0)
- do_one_test (impl, (CHAR *) (buf + align), seek_char, len, result);
+ do_one_test (impl, (CHAR *) (buf + align), seek_char, n, result);
}
static void
@@ -167,7 +167,7 @@ do_random_tests (void)
int
test_main (void)
{
- size_t i;
+ size_t i, j;
test_init ();
@@ -178,15 +178,35 @@ test_main (void)
for (i = 1; i < 8; ++i)
{
- do_test (0, 16 << i, 2048, 23);
- do_test (i, 64, 256, 23);
- do_test (0, 16 << i, 2048, 0);
- do_test (i, 64, 256, 0);
+ do_test (0, 16 << i, 2048, 2048, 23);
+ do_test (i, 64, 256, 256, 23);
+ do_test (0, 16 << i, 2048, 2048, 0);
+ do_test (i, 64, 256, 256, 0);
+
+ /* Check for large input sizes and for these cases we need to
+ make sure the bye is within the size range (that's why
+ 7 << i must be smaller than 2048. */
+ do_test (0, 7 << i, 2048, SIZE_MAX, 23);
+ do_test (0, 2048 - i, 2048, SIZE_MAX, 23);
+ do_test (i, 64, 256, SIZE_MAX, 23);
+ do_test (0, 7 << i, 2048, SIZE_MAX, 0);
+ do_test (0, 2048 - i, 2048, SIZE_MAX, 0);
+ do_test (i, 64, 256, SIZE_MAX, 0);
}
+
+ for (i = 1; i < 16; ++i)
+ {
+ for (j = 1; j < 16; j++)
+ {
+ do_test (0, 16 - j, 32, SIZE_MAX, 23);
+ do_test (i, 16 - j, 32, SIZE_MAX, 23);
+ }
+ }
+
for (i = 1; i < 32; ++i)
{
- do_test (0, i, i + 1, 23);
- do_test (0, i, i + 1, 0);
+ do_test (0, i, i + 1, i + 1, 23);
+ do_test (0, i, i + 1, i + 1, 0);
}
do_random_tests ();
@@ -26,7 +26,17 @@ ENTRY (__memchr)
dcbt 0,r3
clrrdi r8,r3,3
insrdi r4,r4,8,48
- add r7,r3,r5 /* Calculate the last acceptable address. */
+
+ /* Calculate the last acceptable address and check for possible
+ addition overflow by using satured math:
+ r7 = r3 + r5
+ r7 |= -(r7 < x) */
+ add r7,r3,r5
+ subfc r6,r3,r7
+ subfe r9,r9,r9
+ extsw r6,r9
+ or r7,r7,r6
+
insrdi r4,r4,16,32
cmpldi r5,32
li r9, -1