implement _cu_memset, cu_memzero & cu_memtest in ARMv7, dynamic struct working now
This commit is contained in:
parent
13b40a44d3
commit
089366af77
2 changed files with 67 additions and 3 deletions
66
arch/ARMv7.S
66
arch/ARMv7.S
|
|
@ -104,17 +104,81 @@ _cu_memcmp:
|
||||||
pop {r4, r5}
|
pop {r4, r5}
|
||||||
bx lr
|
bx lr
|
||||||
.cmpnot:
|
.cmpnot:
|
||||||
mov r0, #1
|
|
||||||
pop {r4, r5}
|
pop {r4, r5}
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
_cu_memset:
|
_cu_memset:
|
||||||
|
// r0 - dst, r1 - val, r2 - size
|
||||||
|
push {r4}
|
||||||
|
|
||||||
|
orr r4, r1, r1, lsl #0
|
||||||
|
orr r4, r4, r1, lsl #8
|
||||||
|
orr r4, r4, r1, lsl #16
|
||||||
|
orr r4, r4, r1, lsl #24
|
||||||
|
|
||||||
|
mov r3, r2, lsr #2
|
||||||
|
tst r3, r3
|
||||||
|
beq .set1_
|
||||||
|
.set4:
|
||||||
|
str r4, [r0], #4
|
||||||
|
subs r3, r3, #1
|
||||||
|
bne .set4
|
||||||
|
.set1_:
|
||||||
|
ands r3, r2, #3
|
||||||
|
beq .set0
|
||||||
|
.set1:
|
||||||
|
strb r4, [r0], #1
|
||||||
|
subs r3, r3, #1
|
||||||
|
bne .set1
|
||||||
|
.set0:
|
||||||
|
pop {r4}
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
cu_memzero:
|
cu_memzero:
|
||||||
|
// r0 - dst, r1 - size
|
||||||
|
eor r3, r3, r3
|
||||||
|
|
||||||
|
mov r2, r1, lsr #2
|
||||||
|
tst r2, r2
|
||||||
|
beq .zero1_
|
||||||
|
.zero4:
|
||||||
|
str r3, [r0], #4
|
||||||
|
subs r2, r2, #1
|
||||||
|
bne .zero4
|
||||||
|
.zero1_:
|
||||||
|
ands r2, r1, #3
|
||||||
|
beq .zero0
|
||||||
|
.zero1:
|
||||||
|
strb r3, [r0], #1
|
||||||
|
subs r2, r2, #1
|
||||||
|
bne .zero1
|
||||||
|
.zero0:
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
cu_memtest:
|
cu_memtest:
|
||||||
|
// r0 - src, r1 - size
|
||||||
|
mov r2, r1, lsr #2
|
||||||
|
tst r2, r2
|
||||||
|
beq .test1_
|
||||||
|
.test4:
|
||||||
|
ldr r3, [r0], #4
|
||||||
|
tst r3, r3
|
||||||
|
bne .testnot
|
||||||
|
subs r2, r2, #1
|
||||||
|
bne .test4
|
||||||
|
.test1_:
|
||||||
|
ands r2, r1, #3
|
||||||
|
beq .testok
|
||||||
|
.test1:
|
||||||
|
ldrb r3, [r0], #1
|
||||||
|
tst r3, r3
|
||||||
|
bne .testnot
|
||||||
|
subs r2, r2, #1
|
||||||
|
bne .test1
|
||||||
|
.testok:
|
||||||
|
eor r0, r0, r0
|
||||||
|
bx lr
|
||||||
|
.testnot:
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
cu_va_start:
|
cu_va_start:
|
||||||
|
|
|
||||||
4
test.c
4
test.c
|
|
@ -162,7 +162,7 @@ int main()
|
||||||
printf("%x\t%x\n", 0x12345678, cu_bswap32(0x12345678));
|
printf("%x\t%x\n", 0x12345678, cu_bswap32(0x12345678));
|
||||||
printf("%lx\t%lx\n", 0x12345678abcd8765, cu_bswap64(0x12345678abcd8765));
|
printf("%lx\t%lx\n", 0x12345678abcd8765, cu_bswap64(0x12345678abcd8765));
|
||||||
|
|
||||||
/*printf("[struct]\n");
|
printf("[struct]\n");
|
||||||
printf("value_offset\t%u\n", value_offset(CU_STRUCT(test_s), 4, &test));
|
printf("value_offset\t%u\n", value_offset(CU_STRUCT(test_s), 4, &test));
|
||||||
printf("value_size\t%u\n", value_size(CU_STRUCT(test_s), 4, &test));
|
printf("value_size\t%u\n", value_size(CU_STRUCT(test_s), 4, &test));
|
||||||
uint64_t value;
|
uint64_t value;
|
||||||
|
|
@ -172,7 +172,7 @@ int main()
|
||||||
struct_size(CU_STRUCT(test_s), &test));
|
struct_size(CU_STRUCT(test_s), &test));
|
||||||
printf("value_offset\t%u\n", value_offset(CU_STRUCT(test_s), 5, &test));
|
printf("value_offset\t%u\n", value_offset(CU_STRUCT(test_s), 5, &test));
|
||||||
printf("value_size\t%u\n", value_size(CU_STRUCT(test_s), 5, &test));
|
printf("value_size\t%u\n", value_size(CU_STRUCT(test_s), 5, &test));
|
||||||
*/
|
|
||||||
char c0 = 0;
|
char c0 = 0;
|
||||||
printf("cu_memset\tc0\t%p\n", cu_memtest(&c0, 1));
|
printf("cu_memset\tc0\t%p\n", cu_memtest(&c0, 1));
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue