implement _cu_memcpy in ARMv7, fix assembly alignment and enable hardware endianness byte-swapping

This commit is contained in:
mykola2312 2022-05-21 05:41:13 +03:00
parent cbe497ca4d
commit cae1f56d5e
3 changed files with 39 additions and 4 deletions

View file

@ -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:

View file

@ -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);

16
test.c
View file

@ -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;