@@ -114,6 +114,9 @@ void *T_memmove(void *dest, const void *src, size_t n)
114114void * T_mempcpy (void * __restrict dest , const void * __restrict src , size_t n )
115115 __attribute__((nonnull (1 , 2 )));
116116
117+ void * T_memchr (const void * s , int c , size_t n )
118+ __attribute__((nonnull (1 )));
119+
117120void * T_memrchr (const void * s , int c , size_t n )
118121 __attribute__((nonnull (1 )));
119122
@@ -187,6 +190,7 @@ char *T_strtok_r(char *__restrict s, const char *__restrict delim, char **__rest
187190#define T_memmem memmem
188191#define T_memmove memmove
189192#define T_mempcpy mempcpy
193+ #define T_memchr memchr
190194#define T_memrchr memrchr
191195#define T_memrmem memrmem
192196#define T_memset memset
@@ -1465,6 +1469,53 @@ int strtok_test(void) {
14651469
14661470 C (T_memcmp (str , truth_str , sizeof (truth_str )) == 0 );
14671471 }
1472+ return 0 ;
1473+ }
1474+
1475+ int mem65536_test (void ) {
1476+ void fill_mem32 (void * dst , size_t bytes , uint32_t pattern );
1477+
1478+ uint8_t * const dst = (uint8_t * )0xD40000 ;
1479+ const size_t screen_size = 320 * 240 * 2 ;
1480+ memset (dst , 0 , screen_size );
1481+ const size_t B16 = 65536 ;
1482+ const size_t B17 = 131072 ;
1483+
1484+ /* test return values */
1485+
1486+ C (T_memcpy (SINK , SINK , B16 ) == SINK );
1487+ C (T_memcpy (SINK , SINK , B17 ) == SINK );
1488+
1489+ C (T_memmove (SINK , SINK , B16 ) == SINK );
1490+ C (T_memmove (SINK , SINK , B17 ) == SINK );
1491+
1492+ C (T_memmove (SINK + 16 , SINK , B16 ) == SINK + 16 );
1493+ C (T_memmove (SINK + 16 , SINK , B17 ) == SINK + 16 );
1494+
1495+ C (T_memmove (SINK , SINK + 16 , B16 ) == SINK );
1496+ C (T_memmove (SINK , SINK + 16 , B17 ) == SINK );
1497+
1498+ /* test memcpy and memmove when size is a non-zero multiple of 65536 */
1499+
1500+ fill_mem32 (dst + screen_size - B16 , B16 , 0x78563412 );
1501+ C (T_memcpy (dst + 32 , dst + screen_size - B16 , B16 ) == dst + 32 );
1502+ C (T_memchr (dst , 0x00 , 32 ) == dst );
1503+ C (T_memchr (dst , 0x12 , 32 ) == NULL_ptr );
1504+ C (T_memchr (dst , 0x12 , 33 ) == dst + 32 );
1505+ C (T_memrchr (dst , 0x78 , 32 + B16 + 32 ) == dst + 32 + B16 - 1 );
1506+ const uint32_t pattern_1 = 0xA3A0A1A0 ;
1507+ const uint32_t pattern_2 = 0xFECDAB89 ;
1508+ fill_mem32 (dst , 32 , pattern_1 );
1509+ fill_mem32 (dst + 24576 , B16 , pattern_2 );
1510+
1511+ C (T_memmove (dst + 61 , dst , B16 ) == dst + 61 );
1512+ C (T_memmem (dst , B17 , & pattern_1 , sizeof (pattern_1 )) == dst );
1513+ C (T_memrmem (dst , B17 , & pattern_1 , sizeof (pattern_1 )) == dst + 61 - 4 + 32 );
1514+ C (T_memmove (dst + 24578 , dst , B16 ) == dst + 24578 );
1515+ C (T_memmem (dst , B16 , & pattern_1 , sizeof (pattern_1 )) == dst + 0 );
1516+ C (T_memrmem (dst , B16 , & pattern_1 , sizeof (pattern_1 )) == dst + 24578 + 61 + 32 - 4 );
1517+ C (T_memmem (dst , B16 , & pattern_2 , sizeof (pattern_2 )) == dst + 24576 + 24578 + 61 );
1518+ C (T_memrmem (dst , B16 , & pattern_2 , sizeof (pattern_2 )) == dst + B16 - 4u - (((24578u - 24576u ) - 61u ) % 4u ));
14681519
14691520 return 0 ;
14701521}
@@ -1509,6 +1560,9 @@ int run_tests(void) {
15091560 TEST (strchrnul_test ());
15101561 TEST (strtok_test ());
15111562
1563+ TEST (mem65536_test ());
1564+ os_ClrHome ();
1565+
15121566 return 0 ;
15131567}
15141568
0 commit comments