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
|
.globl cu_va_arg
|
||||||
|
|
||||||
.text
|
.text
|
||||||
|
.align 16
|
||||||
|
|
||||||
hw_bswap16:
|
hw_bswap16:
|
||||||
rev r0, r0
|
rev r0, r0
|
||||||
|
|
@ -22,9 +23,33 @@ hw_bswap32:
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
hw_bswap64:
|
hw_bswap64:
|
||||||
|
rev r2, r0
|
||||||
|
rev r0, r1
|
||||||
|
mov r0, r2
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
_cu_memcpy:
|
_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
|
bx lr
|
||||||
|
|
||||||
_cu_memmove:
|
_cu_memmove:
|
||||||
|
|
|
||||||
2
endian.c
2
endian.c
|
|
@ -60,7 +60,7 @@ extern u64 hw_bswap64(u64 val);
|
||||||
bswap16_t cu_bswap16 = hw_bswap16;
|
bswap16_t cu_bswap16 = hw_bswap16;
|
||||||
bswap32_t cu_bswap32 = hw_bswap32;
|
bswap32_t cu_bswap32 = hw_bswap32;
|
||||||
bswap64_t cu_bswap64 = hw_bswap64;
|
bswap64_t cu_bswap64 = hw_bswap64;
|
||||||
#elif (CU_ARCH == AARCH64)
|
#elif (defined(CU_ARCH_ARM))
|
||||||
extern u16 hw_bswap16(u16 val);
|
extern u16 hw_bswap16(u16 val);
|
||||||
extern u32 hw_bswap32(u32 val);
|
extern u32 hw_bswap32(u32 val);
|
||||||
extern u64 hw_bswap64(u64 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));
|
printf("\t%lu\n", cu_va_arg(&va, i));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u64 u64_test(u64 first, u64 second)
|
||||||
|
{
|
||||||
|
return first + second;
|
||||||
|
}
|
||||||
|
|
||||||
u8 internal_heap[4096];
|
u8 internal_heap[4096];
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
cutil_init(internal_heap, 4096);
|
cutil_init(internal_heap, 4096);
|
||||||
|
cu_malloc = malloc;
|
||||||
|
cu_realloc = realloc;
|
||||||
|
cu_free = free;
|
||||||
|
|
||||||
printf("[list]\n");
|
printf("[list]\n");
|
||||||
list_t list;
|
list_t list;
|
||||||
|
|
@ -102,6 +110,8 @@ int main()
|
||||||
printf("[cutypes]\n");
|
printf("[cutypes]\n");
|
||||||
printf("uword\t%u\n", sizeof(uword) * 8);
|
printf("uword\t%u\n", sizeof(uword) * 8);
|
||||||
printf("uint\t%u\n", sizeof(uint) * 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("[bitmap]\n");
|
||||||
printf("bit_align2\t%u\n", bit_align2(354, 3));
|
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("cu_memset\tc0\t%p\n", cu_memtest(&c0, 1));
|
||||||
|
|
||||||
printf("[va_list]\n");
|
printf("[va_list]\n");
|
||||||
va_test(1337, 1, 2, 3, 4, 5);
|
//va_test(1337, 1, 2, 3, 4, 5);
|
||||||
|
|
||||||
printf("[string]\n");
|
printf("[string]\n");
|
||||||
printf("cu_memcmp\t%u\n", cu_memcmp(val3, val3, sizeof(val3)));
|
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_strcpy\tstr2\t\"%s\"\n", str2);
|
||||||
printf("cu_strcmp\t%u\n", cu_strcmp(str2, str1));
|
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");
|
cu_sprintf(str3, 64, "hello %u world \"%s\"", 2312, "test");
|
||||||
printf("cu_sprintf\t%s\n", str3);
|
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", m3);
|
||||||
printf("heap_alloc\t%p\n", m4);
|
printf("heap_alloc\t%p\n", m4);
|
||||||
void* m5 = heap_realloc(&heap, m4, 10);
|
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();
|
cutil_exit();
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue