The library memcpy mentioned earlier:
__rt_memcpy ; unaligned version
CMP R2, #3
BLS loc_59F00
ANDS R12, R0, #3
BEQ loc_59ED2
LDRB R3, [R1],#1
CMP R12, #2
ADD R2, R12
IT LS
LDRBLS R12, [R1],#1
STRB R3, [R0],#1
IT CC
LDRBCC R3, [R1],#1
SUB R2, R2, #4
IT LS
STRBLS R12, [R0],#1
IT CC
STRBCC R3, [R0],#1
loc_59ED2 ; CODE XREF: __rt_memcpy+A↑j
ANDS R3, R1, #3
BEQ __aeabi_memcpy8
SUBS R2, #8
loc_59EDC ; CODE XREF: __rt_memcpy+54↓j
BCC loc_59EF0
LDR R3, [R1],#4
SUBS R2, #8
LDR R12, [R1],#4
STM R0!, {R3,R12}
B loc_59EDC
; ---------------------------------------------------------------------------
loc_59EF0 ; CODE XREF: __rt_memcpy:loc_59EDC↑j
ADDS R2, R2, #4
ITT PL
LDRPL R3, [R1],#4
STRPL R3, [R0],#4
NOP
loc_59F00 ; CODE XREF: __rt_memcpy+2↑j
LSLS R2, R2, #0x1F
ITT CS
LDRBCS R3, [R1],#1
LDRBCS R12, [R1],#1
IT MI
LDRBMI R2, [R1],#1
ITT CS
STRBCS R3, [R0],#1
STRBCS R12, [R0],#1
IT MI
STRBMI R2, [R0],#1
BX LR
; End of function __rt_memcpy
__aeabi_memcpy8 ; 8-byte aligned version
PUSH {R4,LR}
SUBS R2, #0x20
BCC loc_59FC6
loc_59FB0 ; CODE XREF: __aeabi_memcpy8+1A↓j
; 32 bytes per iteration loop
LDM R1!, {R3,R4,R12,LR}
SUBS R2, #0x20
STM R0!, {R3,R4,R12,LR}
LDM R1!, {R3,R4,R12,LR}
STM R0!, {R3,R4,R12,LR}
BCS loc_59FB0
loc_59FC6 ; CODE XREF: __aeabi_memcpy8+4↑j
MOVS R12, R2,LSL#28
; 16-byte remainder
ITT CS
LDMCS R1!, {R3,R4,R12,LR}
STMCS R0!, {R3,R4,R12,LR}
; 8-byte remainder
ITT MI
LDMMI R1!, {R3,R4}
STMMI R0!, {R3,R4}
POP {R4,LR}
MOVS R12, R2,LSL#30
; 4-byte remainder
ITT CS
LDRCS R3, [R1],#4
STRCS R3, [R0],#4
IT EQ
BXEQ LR
LSLS R2, R2, #0x1F
; 2-byte remainder
IT CS
LDRHCS R3, [R1],#2
; 1-byte remainder
IT MI
LDRBMI R2, [R1],#1
IT CS
STRHCS R3, [R0],#2
IT MI
STRBMI R2, [R0],#1
BX LR
; End of function __aeabi_memcpy8
The compiler emits direct __aeabi_memcpy8 calls when it knows the data alignment and __rt_memcpy in all other cases.