Skip to content

Commit f290590

Browse files
committed
added memcpy/memmove tests for non-zero multiples of 65536
1 parent 6f3f17c commit f290590

File tree

3 files changed

+81
-1
lines changed

3 files changed

+81
-1
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
.assume adl = 1
2+
3+
.section .text
4+
5+
.global _fill_mem32
6+
7+
; void fill_mem32(void *dst, size_t bytes, uint32_t pattern)
8+
_fill_mem32:
9+
ld iy, 0
10+
add iy, sp
11+
ld de, (iy + 3)
12+
ld hl, (iy + 6)
13+
ld bc, 4
14+
sbc hl, bc
15+
; return if bytes <= pattern_size
16+
ret c
17+
ret z
18+
push hl
19+
; copy pattern once
20+
lea hl, iy + 9
21+
ldir
22+
pop bc
23+
; now copy (bytes - pattern_size)
24+
ld hl, (iy + 3)
25+
ldir
26+
ret

test/standalone/asprintf_fprintf/src/main.c

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ void *T_memmove(void *dest, const void *src, size_t n)
114114
void *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+
117120
void *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

Comments
 (0)