From cae1f56d5e044f7c99eff7a8aacba8f96cd0c98e Mon Sep 17 00:00:00 2001 From: mykola2312 <49044616+mykola2312@users.noreply.github.com> Date: Sat, 21 May 2022 05:41:13 +0300 Subject: [PATCH] implement _cu_memcpy in ARMv7, fix assembly alignment and enable hardware endianness byte-swapping --- arch/ARMv7.S | 25 +++++++++++++++++++++++++ endian.c | 2 +- test.c | 16 +++++++++++++--- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/arch/ARMv7.S b/arch/ARMv7.S index 9b70cdf..df0ed5b 100644 --- a/arch/ARMv7.S +++ b/arch/ARMv7.S @@ -11,6 +11,7 @@ .globl cu_va_arg .text +.align 16 hw_bswap16: rev r0, r0 @@ -22,9 +23,33 @@ hw_bswap32: bx lr hw_bswap64: + rev r2, r0 + rev r0, r1 + mov r0, r2 bx lr _cu_memcpy: + // r0 - dst, r1 - src, r2 - size + str r4, [sp, #-4]! + + mov r3, r2, lsr #2 + tst r3, r3 + beq .cpy1_ +.cpy4: + ldr r4, [r1], #4 + str r4, [r0], #4 + subs r3, r3, #1 + bne .cpy4 +.cpy1_: + ands r3, r2, #3 + beq .cpy0 +.cpy1: + ldrb r4, [r1], #1 + strb r4, [r0], #1 + subs r3, r3, #1 + bne .cpy1 +.cpy0: + ldr r4, [sp], #4 bx lr _cu_memmove: diff --git a/endian.c b/endian.c index 3c32fcf..45802bb 100644 --- a/endian.c +++ b/endian.c @@ -60,7 +60,7 @@ extern u64 hw_bswap64(u64 val); bswap16_t cu_bswap16 = hw_bswap16; bswap32_t cu_bswap32 = hw_bswap32; bswap64_t cu_bswap64 = hw_bswap64; -#elif (CU_ARCH == AARCH64) +#elif (defined(CU_ARCH_ARM)) extern u16 hw_bswap16(u16 val); extern u32 hw_bswap32(u32 val); extern u64 hw_bswap64(u64 val); diff --git a/test.c b/test.c index 02a81b2..9bc7553 100644 --- a/test.c +++ b/test.c @@ -48,11 +48,19 @@ void va_test(int fixed, ...) printf("\t%lu\n", cu_va_arg(&va, i)); } +u64 u64_test(u64 first, u64 second) +{ + return first + second; +} + u8 internal_heap[4096]; int main() { cutil_init(internal_heap, 4096); + cu_malloc = malloc; + cu_realloc = realloc; + cu_free = free; printf("[list]\n"); list_t list; @@ -102,6 +110,8 @@ int main() printf("[cutypes]\n"); printf("uword\t%u\n", sizeof(uword) * 8); printf("uint\t%u\n", sizeof(uint) * 8); + printf("u64\t%u\n", sizeof(u64) * 8); + printf("u64_test\t%lu\n", u64_test(3, 4)); printf("[bitmap]\n"); printf("bit_align2\t%u\n", bit_align2(354, 3)); @@ -167,7 +177,7 @@ int main() printf("cu_memset\tc0\t%p\n", cu_memtest(&c0, 1)); printf("[va_list]\n"); - va_test(1337, 1, 2, 3, 4, 5); + //va_test(1337, 1, 2, 3, 4, 5); printf("[string]\n"); printf("cu_memcmp\t%u\n", cu_memcmp(val3, val3, sizeof(val3))); @@ -178,7 +188,7 @@ int main() printf("cu_strcpy\tstr2\t\"%s\"\n", str2); printf("cu_strcmp\t%u\n", cu_strcmp(str2, str1)); - char str3[64] = {0}; + /*char str3[64] = {0}; cu_sprintf(str3, 64, "hello %u world \"%s\"", 2312, "test"); printf("cu_sprintf\t%s\n", str3); @@ -203,7 +213,7 @@ int main() printf("heap_alloc\t%p\n", m3); printf("heap_alloc\t%p\n", m4); void* m5 = heap_realloc(&heap, m4, 10); - printf("heap_realloc\t%p\t%p\n", m4, m5); + printf("heap_realloc\t%p\t%p\n", m4, m5);*/ cutil_exit(); return 0;