Displaying 2 results from an estimated 2 matches for "memcpy_alt1".
2020 Jul 20
2
[ARM] Should Use Load and Store with Register Offset
...does not tend to generate load/store
instructions with a register offset (e.g. ldr Rd, [Rn, Rm] form) and
instead prefers the immediate offset form.
When copying a contiguous sequence of bytes, this results in additional
instructions to modify the base address. https://godbolt.org/z/T1xhae
void* memcpy_alt1(void* dst, const void* src, size_t len) {
char* save = (char*)dst;
for (size_t i = 0; i < len; ++i)
*((char*)(dst + i)) = *((char*)(src + i));
return save;
}
clang --target=armv6m-none-eabi -Os -fomit-frame-pointer
memcpy_alt1:
push {r4, lr}
cmp r2, #0...
2020 Jul 21
2
[ARM] Should Use Load and Store with Register Offset
...nk you for your response! I was not aware that -Oz is a closer
equivalent to GCC's -Os. I tried -Oz when compiling with clang and
confirmed that the Clang's generated assembly is equivalent to GCC for the
code snippet I posted above.
clang --target=armv6m-none-eabi -Oz -fomit-frame-pointer
memcpy_alt1:
push {r4, lr}
movs r3, #0
.LBB0_1:
cmp r2, r3
beq .LBB0_3
ldrb r4, [r1, r3]
strb r4, [r0, r3]
adds r3, r3, #1
b .LBB0_1
.LBB0_3:
pop {r4, pc}
On the other hand, -O2 in GCC still uses the regis...