From 089366af7705f56e61b970701884a8347dd46198 Mon Sep 17 00:00:00 2001 From: mykola2312 <49044616+mykola2312@users.noreply.github.com> Date: Sat, 21 May 2022 08:49:49 +0300 Subject: [PATCH] implement _cu_memset, cu_memzero & cu_memtest in ARMv7, dynamic struct working now --- arch/ARMv7.S | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++- test.c | 4 ++-- 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/arch/ARMv7.S b/arch/ARMv7.S index c859e93..ab05a60 100644 --- a/arch/ARMv7.S +++ b/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: diff --git a/test.c b/test.c index 866c5df..ae6c626 100644 --- a/test.c +++ b/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));