diff --git a/arch/ARMv7.S b/arch/ARMv7.S index 33ea263..c859e93 100644 --- a/arch/ARMv7.S +++ b/arch/ARMv7.S @@ -77,6 +77,35 @@ _cu_memmove: bx lr _cu_memcmp: + push {r4, r5} + + mov r3, r2, lsr #2 + tst r3, r3 + beq .cmp1_ +.cmp4: + ldr r4, [r0], #4 + ldr r5, [r1], #4 + cmp r4, r5 + bne .cmpnot + subs r3, r3, #1 + bne .cmp4 +.cmp1_: + ands r3, r2, #3 + beq .cmpok +.cmp1: + ldrb r4, [r0], #1 + ldrb r5, [r1], #1 + cmp r4, r5 + bne .cmpnot + subs r3, r3, #1 + bne .cmp1 +.cmpok: + eor r0, r0, r0 + pop {r4, r5} + bx lr +.cmpnot: + mov r0, #1 + pop {r4, r5} bx lr _cu_memset: diff --git a/test.c b/test.c index 9bc7553..866c5df 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));