implement _cu_memcpy in ARMv7, fix assembly alignment and enable hardware endianness byte-swapping
This commit is contained in:
parent
cbe497ca4d
commit
cae1f56d5e
3 changed files with 39 additions and 4 deletions
25
arch/ARMv7.S
25
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:
|
||||
|
|
|
|||
2
endian.c
2
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);
|
||||
|
|
|
|||
16
test.c
16
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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue