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}
|
||||
bx lr
|
||||
.cmpnot:
|
||||
mov r0, #1
|
||||
pop {r4, r5}
|
||||
bx lr
|
||||
|
||||
_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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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("%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_size\t%u\n", value_size(CU_STRUCT(test_s), 4, &test));
|
||||
uint64_t value;
|
||||
|
|
@ -172,7 +172,7 @@ int main()
|
|||
struct_size(CU_STRUCT(test_s), &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));
|
||||
*/
|
||||
|
||||
char c0 = 0;
|
||||
printf("cu_memset\tc0\t%p\n", cu_memtest(&c0, 1));
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue