#include <machine/asm.h>
#include "assym.inc"
.syntax unified
ENTRY(memset)
and r3, r1, #0xff
mov r1, r2
do_memset:
cmp r1, #0x04
mov ip, r0
blt .Lmemset_lessthanfour
ands r2, ip, #0x03
bne .Lmemset_wordunaligned
.Lmemset_wordaligned:
orr r3, r3, r3, lsl #8
tst ip, #0x04
orr r3, r3, r3, lsl #16
subne r1, r1, #0x04
strne r3, [ip], #0x04
cmp r1, #0x10
blt .Lmemset_loop4
mov r2, r3
cmp r1, #0x80
blt .Lmemset_loop32
.Lmemset_loop128:
subs r1, r1, #0x80
strdge r2, [ip], #0x08
strdge r2, [ip], #0x08
strdge r2, [ip], #0x08
strdge r2, [ip], #0x08
strdge r2, [ip], #0x08
strdge r2, [ip], #0x08
strdge r2, [ip], #0x08
strdge r2, [ip], #0x08
strdge r2, [ip], #0x08
strdge r2, [ip], #0x08
strdge r2, [ip], #0x08
strdge r2, [ip], #0x08
strdge r2, [ip], #0x08
strdge r2, [ip], #0x08
strdge r2, [ip], #0x08
strdge r2, [ip], #0x08
bgt .Lmemset_loop128
RETeq
add r1, r1, #0x80
.Lmemset_loop32:
subs r1, r1, #0x20
strdge r2, [ip], #0x08
strdge r2, [ip], #0x08
strdge r2, [ip], #0x08
strdge r2, [ip], #0x08
bgt .Lmemset_loop32
RETeq
adds r1, r1, #0x10
strdge r2, [ip], #0x08
strdge r2, [ip], #0x08
RETeq
addlt r1, r1, #0x10
.Lmemset_loop4:
subs r1, r1, #0x04
strge r3, [ip], #0x04
bgt .Lmemset_loop4
RETeq
adds r1, r1, #0x04
RETeq
cmp r1, #2
strb r3, [ip], #0x01
strbge r3, [ip], #0x01
strbgt r3, [ip]
RET
.Lmemset_wordunaligned:
rsb r2, r2, #0x004
strb r3, [ip], #0x01
cmp r2, #0x02
strbge r3, [ip], #0x01
sub r1, r1, r2
strbgt r3, [ip], #0x01
cmp r1, #0x04
bge .Lmemset_wordaligned
.Lmemset_lessthanfour:
cmp r1, #0x00
RETeq
strb r3, [ip], #0x01
cmp r1, #0x02
strbge r3, [ip], #0x01
strbgt r3, [ip]
RET
END(memset)
ENTRY(memcmp)
mov ip, r0
cmp r2, #0x06
beq .Lmemcmp_6bytes
mov r0, #0x00
cmp r2, #0x00
eorsne r3, ip, r1
RETeq
tst r3, #0x03
subne r2, r2, #0x01
bne .Lmemcmp_bytewise2
sub r3, r1, #0x05
ands r3, r3, #0x03
add r3, r3, r3, lsl #1
addne pc, pc, r3, lsl #3
nop
ldrb r0, [ip], #0x01
ldrb r3, [r1], #0x01
subs r0, r0, r3
RETne
subs r2, r2, #0x01
RETeq
ldrb r0, [ip], #0x01
ldrb r3, [r1], #0x01
subs r0, r0, r3
RETne
subs r2, r2, #0x01
RETeq
ldrb r0, [ip], #0x01
ldrb r3, [r1], #0x01
subs r0, r0, r3
RETne
subs r2, r2, #0x01
RETeq
subs r2, r2, #0x04
bcc .Lmemcmp_bytewise
.Lmemcmp_word_aligned:
ldr r0, [ip], #0x04
ldr r3, [r1], #0x04
subs r2, r2, #0x04
cmpcs r0, r3
beq .Lmemcmp_word_aligned
sub r0, r0, r3
adds r2, r2, #0x04
cmpeq r0, #0x00
RETeq
sub ip, ip, #0x04
sub r1, r1, #0x04
.Lmemcmp_bytewise:
add r2, r2, #0x03
.Lmemcmp_bytewise2:
ldrb r0, [ip], #0x01
ldrb r3, [r1], #0x01
subs r2, r2, #0x01
cmpcs r0, r3
beq .Lmemcmp_bytewise2
sub r0, r0, r3
RET
.align 5
.Lmemcmp_6bytes:
ldrb r3, [r1, #0x00]
ldrb r0, [ip, #0x00]
ldrb r2, [r1, #0x01]
subs r0, r0, r3
ldrbeq r3, [ip, #0x01]
RETne
subs r0, r3, r2
ldrbeq r3, [r1, #0x02]
ldrbeq r0, [ip, #0x02]
RETne
ldrb r2, [r1, #0x03]
subs r0, r0, r3
ldrbeq r3, [ip, #0x03]
RETne
subs r0, r3, r2
ldrbeq r3, [r1, #0x04]
ldrbeq r0, [ip, #0x04]
RETne
ldrb r2, [r1, #0x05]
subs r0, r0, r3
ldrbeq r3, [ip, #0x05]
RETne
sub r0, r3, r2
RET
END(memcmp)
ENTRY(memmove)
cmp r0, r1
RETeq
subcc r3, r0, r1
subcs r3, r1, r0
cmp r3, r2
bcc PIC_SYM(_C_LABEL(memcpy), PLT)
cmp r1, r0
bcc .Lmemmove_backwards
moveq r0, #0
RETeq
stmdb sp!, {r0, lr}
subs r2, r2, #4
blt .Lmemmove_fl4
ands r12, r0, #3
bne .Lmemmove_fdestul
ands r12, r1, #3
bne .Lmemmove_fsrcul
.Lmemmove_ft8:
subs r2, r2, #8
blt .Lmemmove_fl12
subs r2, r2, #0x14
blt .Lmemmove_fl32
stmdb sp!, {r4}
.Lmemmove_floop32:
ldmia r1!, {r3, r4, r12, lr}
stmia r0!, {r3, r4, r12, lr}
ldmia r1!, {r3, r4, r12, lr}
stmia r0!, {r3, r4, r12, lr}
subs r2, r2, #0x20
bge .Lmemmove_floop32
cmn r2, #0x10
ldmiage r1!, {r3, r4, r12, lr}
stmiage r0!, {r3, r4, r12, lr}
subge r2, r2, #0x10
ldmia sp!, {r4}
.Lmemmove_fl32:
adds r2, r2, #0x14
.Lmemmove_floop12:
ldmiage r1!, {r3, r12, lr}
stmiage r0!, {r3, r12, lr}
subsge r2, r2, #0x0c
bge .Lmemmove_floop12
.Lmemmove_fl12:
adds r2, r2, #8
blt .Lmemmove_fl4
subs r2, r2, #4
ldrlt r3, [r1], #4
strlt r3, [r0], #4
ldmiage r1!, {r3, r12}
stmiage r0!, {r3, r12}
subge r2, r2, #4
.Lmemmove_fl4:
adds r2, r2, #4
ldmiaeq sp!, {r0, pc}
cmp r2, #2
ldrb r3, [r1], #1
strb r3, [r0], #1
ldrbge r3, [r1], #1
strbge r3, [r0], #1
ldrbgt r3, [r1], #1
strbgt r3, [r0], #1
ldmia sp!, {r0, pc}
.Lmemmove_fdestul:
rsb r12, r12, #4
cmp r12, #2
ldrb r3, [r1], #1
strb r3, [r0], #1
ldrbge r3, [r1], #1
strbge r3, [r0], #1
ldrbgt r3, [r1], #1
strbgt r3, [r0], #1
subs r2, r2, r12
blt .Lmemmove_fl4
ands r12, r1, #3
beq .Lmemmove_ft8
.Lmemmove_fsrcul:
bic r1, r1, #3
ldr lr, [r1], #4
cmp r12, #2
bgt .Lmemmove_fsrcul3
beq .Lmemmove_fsrcul2
cmp r2, #0x0c
blt .Lmemmove_fsrcul1loop4
sub r2, r2, #0x0c
stmdb sp!, {r4, r5}
.Lmemmove_fsrcul1loop16:
mov r3, lr, lsr #8
ldmia r1!, {r4, r5, r12, lr}
orr r3, r3, r4, lsl #24
mov r4, r4, lsr #8
orr r4, r4, r5, lsl #24
mov r5, r5, lsr #8
orr r5, r5, r12, lsl #24
mov r12, r12, lsr #8
orr r12, r12, lr, lsl #24
stmia r0!, {r3-r5, r12}
subs r2, r2, #0x10
bge .Lmemmove_fsrcul1loop16
ldmia sp!, {r4, r5}
adds r2, r2, #0x0c
blt .Lmemmove_fsrcul1l4
.Lmemmove_fsrcul1loop4:
mov r12, lr, lsr #8
ldr lr, [r1], #4
orr r12, r12, lr, lsl #24
str r12, [r0], #4
subs r2, r2, #4
bge .Lmemmove_fsrcul1loop4
.Lmemmove_fsrcul1l4:
sub r1, r1, #3
b .Lmemmove_fl4
.Lmemmove_fsrcul2:
cmp r2, #0x0c
blt .Lmemmove_fsrcul2loop4
sub r2, r2, #0x0c
stmdb sp!, {r4, r5}
.Lmemmove_fsrcul2loop16:
mov r3, lr, lsr #16
ldmia r1!, {r4, r5, r12, lr}
orr r3, r3, r4, lsl #16
mov r4, r4, lsr #16
orr r4, r4, r5, lsl #16
mov r5, r5, lsr #16
orr r5, r5, r12, lsl #16
mov r12, r12, lsr #16
orr r12, r12, lr, lsl #16
stmia r0!, {r3-r5, r12}
subs r2, r2, #0x10
bge .Lmemmove_fsrcul2loop16
ldmia sp!, {r4, r5}
adds r2, r2, #0x0c
blt .Lmemmove_fsrcul2l4
.Lmemmove_fsrcul2loop4:
mov r12, lr, lsr #16
ldr lr, [r1], #4
orr r12, r12, lr, lsl #16
str r12, [r0], #4
subs r2, r2, #4
bge .Lmemmove_fsrcul2loop4
.Lmemmove_fsrcul2l4:
sub r1, r1, #2
b .Lmemmove_fl4
.Lmemmove_fsrcul3:
cmp r2, #0x0c
blt .Lmemmove_fsrcul3loop4
sub r2, r2, #0x0c
stmdb sp!, {r4, r5}
.Lmemmove_fsrcul3loop16:
mov r3, lr, lsr #24
ldmia r1!, {r4, r5, r12, lr}
orr r3, r3, r4, lsl #8
mov r4, r4, lsr #24
orr r4, r4, r5, lsl #8
mov r5, r5, lsr #24
orr r5, r5, r12, lsl #8
mov r12, r12, lsr #24
orr r12, r12, lr, lsl #8
stmia r0!, {r3-r5, r12}
subs r2, r2, #0x10
bge .Lmemmove_fsrcul3loop16
ldmia sp!, {r4, r5}
adds r2, r2, #0x0c
blt .Lmemmove_fsrcul3l4
.Lmemmove_fsrcul3loop4:
mov r12, lr, lsr #24
ldr lr, [r1], #4
orr r12, r12, lr, lsl #8
str r12, [r0], #4
subs r2, r2, #4
bge .Lmemmove_fsrcul3loop4
.Lmemmove_fsrcul3l4:
sub r1, r1, #1
b .Lmemmove_fl4
.Lmemmove_backwards:
add r1, r1, r2
add r0, r0, r2
subs r2, r2, #4
blt .Lmemmove_bl4
ands r12, r0, #3
bne .Lmemmove_bdestul
ands r12, r1, #3
bne .Lmemmove_bsrcul
.Lmemmove_bt8:
subs r2, r2, #8
blt .Lmemmove_bl12
stmdb sp!, {r4, lr}
subs r2, r2, #0x14
blt .Lmemmove_bl32
.Lmemmove_bloop32:
ldmdb r1!, {r3, r4, r12, lr}
stmdb r0!, {r3, r4, r12, lr}
ldmdb r1!, {r3, r4, r12, lr}
stmdb r0!, {r3, r4, r12, lr}
subs r2, r2, #0x20
bge .Lmemmove_bloop32
.Lmemmove_bl32:
cmn r2, #0x10
ldmdbge r1!, {r3, r4, r12, lr}
stmdbge r0!, {r3, r4, r12, lr}
subge r2, r2, #0x10
adds r2, r2, #0x14
ldmdbge r1!, {r3, r12, lr}
stmdbge r0!, {r3, r12, lr}
subge r2, r2, #0x0c
ldmia sp!, {r4, lr}
.Lmemmove_bl12:
adds r2, r2, #8
blt .Lmemmove_bl4
subs r2, r2, #4
ldrlt r3, [r1, #-4]!
strlt r3, [r0, #-4]!
ldmdbge r1!, {r3, r12}
stmdbge r0!, {r3, r12}
subge r2, r2, #4
.Lmemmove_bl4:
adds r2, r2, #4
RETeq
cmp r2, #2
ldrb r3, [r1, #-1]!
strb r3, [r0, #-1]!
ldrbge r3, [r1, #-1]!
strbge r3, [r0, #-1]!
ldrbgt r3, [r1, #-1]!
strbgt r3, [r0, #-1]!
RET
.Lmemmove_bdestul:
cmp r12, #2
ldrb r3, [r1, #-1]!
strb r3, [r0, #-1]!
ldrbge r3, [r1, #-1]!
strbge r3, [r0, #-1]!
ldrbgt r3, [r1, #-1]!
strbgt r3, [r0, #-1]!
subs r2, r2, r12
blt .Lmemmove_bl4
ands r12, r1, #3
beq .Lmemmove_bt8
.Lmemmove_bsrcul:
bic r1, r1, #3
ldr r3, [r1, #0]
cmp r12, #2
blt .Lmemmove_bsrcul1
beq .Lmemmove_bsrcul2
cmp r2, #0x0c
blt .Lmemmove_bsrcul3loop4
sub r2, r2, #0x0c
stmdb sp!, {r4, r5, lr}
.Lmemmove_bsrcul3loop16:
mov lr, r3, lsl #8
ldmdb r1!, {r3-r5, r12}
orr lr, lr, r12, lsr #24
mov r12, r12, lsl #8
orr r12, r12, r5, lsr #24
mov r5, r5, lsl #8
orr r5, r5, r4, lsr #24
mov r4, r4, lsl #8
orr r4, r4, r3, lsr #24
stmdb r0!, {r4, r5, r12, lr}
subs r2, r2, #0x10
bge .Lmemmove_bsrcul3loop16
ldmia sp!, {r4, r5, lr}
adds r2, r2, #0x0c
blt .Lmemmove_bsrcul3l4
.Lmemmove_bsrcul3loop4:
mov r12, r3, lsl #8
ldr r3, [r1, #-4]!
orr r12, r12, r3, lsr #24
str r12, [r0, #-4]!
subs r2, r2, #4
bge .Lmemmove_bsrcul3loop4
.Lmemmove_bsrcul3l4:
add r1, r1, #3
b .Lmemmove_bl4
.Lmemmove_bsrcul2:
cmp r2, #0x0c
blt .Lmemmove_bsrcul2loop4
sub r2, r2, #0x0c
stmdb sp!, {r4, r5, lr}
.Lmemmove_bsrcul2loop16:
mov lr, r3, lsl #16
ldmdb r1!, {r3-r5, r12}
orr lr, lr, r12, lsr #16
mov r12, r12, lsl #16
orr r12, r12, r5, lsr #16
mov r5, r5, lsl #16
orr r5, r5, r4, lsr #16
mov r4, r4, lsl #16
orr r4, r4, r3, lsr #16
stmdb r0!, {r4, r5, r12, lr}
subs r2, r2, #0x10
bge .Lmemmove_bsrcul2loop16
ldmia sp!, {r4, r5, lr}
adds r2, r2, #0x0c
blt .Lmemmove_bsrcul2l4
.Lmemmove_bsrcul2loop4:
mov r12, r3, lsl #16
ldr r3, [r1, #-4]!
orr r12, r12, r3, lsr #16
str r12, [r0, #-4]!
subs r2, r2, #4
bge .Lmemmove_bsrcul2loop4
.Lmemmove_bsrcul2l4:
add r1, r1, #2
b .Lmemmove_bl4
.Lmemmove_bsrcul1:
cmp r2, #0x0c
blt .Lmemmove_bsrcul1loop4
sub r2, r2, #0x0c
stmdb sp!, {r4, r5, lr}
.Lmemmove_bsrcul1loop32:
mov lr, r3, lsl #24
ldmdb r1!, {r3-r5, r12}
orr lr, lr, r12, lsr #8
mov r12, r12, lsl #24
orr r12, r12, r5, lsr #8
mov r5, r5, lsl #24
orr r5, r5, r4, lsr #8
mov r4, r4, lsl #24
orr r4, r4, r3, lsr #8
stmdb r0!, {r4, r5, r12, lr}
subs r2, r2, #0x10
bge .Lmemmove_bsrcul1loop32
ldmia sp!, {r4, r5, lr}
adds r2, r2, #0x0c
blt .Lmemmove_bsrcul1l4
.Lmemmove_bsrcul1loop4:
mov r12, r3, lsl #24
ldr r3, [r1, #-4]!
orr r12, r12, r3, lsr #8
str r12, [r0, #-4]!
subs r2, r2, #4
bge .Lmemmove_bsrcul1loop4
.Lmemmove_bsrcul1l4:
add r1, r1, #1
b .Lmemmove_bl4
END(memmove)
ENTRY(memcpy)
pld [r1]
cmp r2, #0x0c
ble .Lmemcpy_short
mov r3, r0
ands ip, r3, #0x03
beq .Lmemcpy_wordaligned
cmp ip, #0x02
ldrb ip, [r1], #0x01
sub r2, r2, #0x01
strb ip, [r3], #0x01
ldrble ip, [r1], #0x01
suble r2, r2, #0x01
strble ip, [r3], #0x01
ldrblt ip, [r1], #0x01
sublt r2, r2, #0x01
strblt ip, [r3], #0x01
.Lmemcpy_wordaligned:
ands ip, r1, #0x03
bne .Lmemcpy_bad_align
tst r3, #0x07
ldrne ip, [r1], #0x04
stmfd sp!, {r4-r9}
subne r2, r2, #0x04
strne ip, [r3], #0x04
subs r2, r2, #0x80
blt .Lmemcpy_w_lessthan128
.Lmemcpy_w_loop128:
ldr r4, [r1], #0x04
ldr r5, [r1], #0x04
pld [r1, #0x18]
ldr r6, [r1], #0x04
ldr r7, [r1], #0x04
ldr r8, [r1], #0x04
ldr r9, [r1], #0x04
strd r4, [r3], #0x08
ldr r4, [r1], #0x04
ldr r5, [r1], #0x04
strd r6, [r3], #0x08
ldr r6, [r1], #0x04
ldr r7, [r1], #0x04
pld [r1, #0x18]
strd r8, [r3], #0x08
ldr r8, [r1], #0x04
ldr r9, [r1], #0x04
strd r4, [r3], #0x08
ldr r4, [r1], #0x04
ldr r5, [r1], #0x04
strd r6, [r3], #0x08
ldr r6, [r1], #0x04
ldr r7, [r1], #0x04
strd r8, [r3], #0x08
ldr r8, [r1], #0x04
ldr r9, [r1], #0x04
pld [r1, #0x18]
strd r4, [r3], #0x08
ldr r4, [r1], #0x04
ldr r5, [r1], #0x04
strd r6, [r3], #0x08
ldr r6, [r1], #0x04
ldr r7, [r1], #0x04
strd r8, [r3], #0x08
ldr r8, [r1], #0x04
ldr r9, [r1], #0x04
strd r4, [r3], #0x08
ldr r4, [r1], #0x04
ldr r5, [r1], #0x04
pld [r1, #0x18]
strd r6, [r3], #0x08
ldr r6, [r1], #0x04
ldr r7, [r1], #0x04
strd r8, [r3], #0x08
ldr r8, [r1], #0x04
ldr r9, [r1], #0x04
strd r4, [r3], #0x08
ldr r4, [r1], #0x04
ldr r5, [r1], #0x04
strd r6, [r3], #0x08
strd r8, [r3], #0x08
subs r2, r2, #0x80
strd r4, [r3], #0x08
bge .Lmemcpy_w_loop128
.Lmemcpy_w_lessthan128:
adds r2, r2, #0x80
ldmfdeq sp!, {r4-r9}
RETeq
subs r2, r2, #0x20
blt .Lmemcpy_w_lessthan32
.Lmemcpy_w_loop32:
ldr r4, [r1], #0x04
ldr r5, [r1], #0x04
pld [r1, #0x18]
ldr r6, [r1], #0x04
ldr r7, [r1], #0x04
ldr r8, [r1], #0x04
ldr r9, [r1], #0x04
strd r4, [r3], #0x08
ldr r4, [r1], #0x04
ldr r5, [r1], #0x04
strd r6, [r3], #0x08
strd r8, [r3], #0x08
subs r2, r2, #0x20
strd r4, [r3], #0x08
bge .Lmemcpy_w_loop32
.Lmemcpy_w_lessthan32:
adds r2, r2, #0x20
ldmfdeq sp!, {r4-r9}
RETeq
and r4, r2, #0x18
rsbs r4, r4, #0x18
addne pc, pc, r4, lsl #1
nop
ldr r4, [r1], #0x04
ldr r5, [r1], #0x04
sub r2, r2, #0x08
strd r4, [r3], #0x08
ldr r4, [r1], #0x04
ldr r5, [r1], #0x04
sub r2, r2, #0x08
strd r4, [r3], #0x08
ldr r4, [r1], #0x04
ldr r5, [r1], #0x04
subs r2, r2, #0x08
strd r4, [r3], #0x08
ldmfd sp!, {r4-r9}
RETeq
subs r2, r2, #0x04
ldrge ip, [r1], #0x04
strge ip, [r3], #0x04
RETeq
addlt r2, r2, #0x04
ldrb ip, [r1], #0x01
cmp r2, #0x02
ldrbge r2, [r1], #0x01
strb ip, [r3], #0x01
ldrbgt ip, [r1]
strbge r2, [r3], #0x01
strbgt ip, [r3]
RET
.ltorg
.Lmemcpy_bad_align:
stmfd sp!, {r4-r7}
bic r1, r1, #0x03
cmp ip, #2
ldr ip, [r1], #0x04
bgt .Lmemcpy_bad3
beq .Lmemcpy_bad2
b .Lmemcpy_bad1
.Lmemcpy_bad1_loop16:
mov r4, ip, lsr #8
ldr r5, [r1], #0x04
pld [r1, #0x018]
ldr r6, [r1], #0x04
ldr r7, [r1], #0x04
ldr ip, [r1], #0x04
orr r4, r4, r5, lsl #24
mov r5, r5, lsr #8
orr r5, r5, r6, lsl #24
mov r6, r6, lsr #8
orr r6, r6, r7, lsl #24
mov r7, r7, lsr #8
orr r7, r7, ip, lsl #24
str r4, [r3], #0x04
str r5, [r3], #0x04
str r6, [r3], #0x04
str r7, [r3], #0x04
.Lmemcpy_bad1:
subs r2, r2, #0x10
bge .Lmemcpy_bad1_loop16
adds r2, r2, #0x10
ldmfdeq sp!, {r4-r7}
RETeq
subs r2, r2, #0x04
sublt r1, r1, #0x03
blt .Lmemcpy_bad_done
.Lmemcpy_bad1_loop4:
mov r4, ip, lsr #8
ldr ip, [r1], #0x04
subs r2, r2, #0x04
orr r4, r4, ip, lsl #24
str r4, [r3], #0x04
bge .Lmemcpy_bad1_loop4
sub r1, r1, #0x03
b .Lmemcpy_bad_done
.Lmemcpy_bad2_loop16:
mov r4, ip, lsr #16
ldr r5, [r1], #0x04
pld [r1, #0x018]
ldr r6, [r1], #0x04
ldr r7, [r1], #0x04
ldr ip, [r1], #0x04
orr r4, r4, r5, lsl #16
mov r5, r5, lsr #16
orr r5, r5, r6, lsl #16
mov r6, r6, lsr #16
orr r6, r6, r7, lsl #16
mov r7, r7, lsr #16
orr r7, r7, ip, lsl #16
str r4, [r3], #0x04
str r5, [r3], #0x04
str r6, [r3], #0x04
str r7, [r3], #0x04
.Lmemcpy_bad2:
subs r2, r2, #0x10
bge .Lmemcpy_bad2_loop16
adds r2, r2, #0x10
ldmfdeq sp!, {r4-r7}
RETeq
subs r2, r2, #0x04
sublt r1, r1, #0x02
blt .Lmemcpy_bad_done
.Lmemcpy_bad2_loop4:
mov r4, ip, lsr #16
ldr ip, [r1], #0x04
subs r2, r2, #0x04
orr r4, r4, ip, lsl #16
str r4, [r3], #0x04
bge .Lmemcpy_bad2_loop4
sub r1, r1, #0x02
b .Lmemcpy_bad_done
.Lmemcpy_bad3_loop16:
mov r4, ip, lsr #24
ldr r5, [r1], #0x04
pld [r1, #0x018]
ldr r6, [r1], #0x04
ldr r7, [r1], #0x04
ldr ip, [r1], #0x04
orr r4, r4, r5, lsl #8
mov r5, r5, lsr #24
orr r5, r5, r6, lsl #8
mov r6, r6, lsr #24
orr r6, r6, r7, lsl #8
mov r7, r7, lsr #24
orr r7, r7, ip, lsl #8
str r4, [r3], #0x04
str r5, [r3], #0x04
str r6, [r3], #0x04
str r7, [r3], #0x04
.Lmemcpy_bad3:
subs r2, r2, #0x10
bge .Lmemcpy_bad3_loop16
adds r2, r2, #0x10
ldmfdeq sp!, {r4-r7}
RETeq
subs r2, r2, #0x04
sublt r1, r1, #0x01
blt .Lmemcpy_bad_done
.Lmemcpy_bad3_loop4:
mov r4, ip, lsr #24
ldr ip, [r1], #0x04
subs r2, r2, #0x04
orr r4, r4, ip, lsl #8
str r4, [r3], #0x04
bge .Lmemcpy_bad3_loop4
sub r1, r1, #0x01
.Lmemcpy_bad_done:
ldmfd sp!, {r4-r7}
adds r2, r2, #0x04
RETeq
ldrb ip, [r1], #0x01
cmp r2, #0x02
ldrbge r2, [r1], #0x01
strb ip, [r3], #0x01
ldrbgt ip, [r1]
strbge r2, [r3], #0x01
strbgt ip, [r3]
RET
.Lmemcpy_short:
add pc, pc, r2, lsl #2
nop
RET
b .Lmemcpy_bytewise
b .Lmemcpy_bytewise
b .Lmemcpy_bytewise
b .Lmemcpy_4
b .Lmemcpy_bytewise
b .Lmemcpy_6
b .Lmemcpy_bytewise
b .Lmemcpy_8
b .Lmemcpy_bytewise
b .Lmemcpy_bytewise
b .Lmemcpy_bytewise
b .Lmemcpy_c
.Lmemcpy_bytewise:
mov r3, r0
ldrb ip, [r1], #0x01
1: subs r2, r2, #0x01
strb ip, [r3], #0x01
ldrbne ip, [r1], #0x01
bne 1b
RET
#define LMEMCPY_4_LOG2 6
#define LMEMCPY_4_PAD .align LMEMCPY_4_LOG2
LMEMCPY_4_PAD
.Lmemcpy_4:
and r2, r1, #0x03
orr r2, r2, r0, lsl #2
ands r2, r2, #0x0f
sub r3, pc, #0x14
addne pc, r3, r2, lsl #LMEMCPY_4_LOG2
ldr r2, [r1]
str r2, [r0]
RET
LMEMCPY_4_PAD
ldr r3, [r1, #-1]
ldr r2, [r1, #3]
mov r3, r3, lsr #8
orr r3, r3, r2, lsl #24
str r3, [r0]
RET
LMEMCPY_4_PAD
ldrh r3, [r1, #0x02]
ldrh r2, [r1]
orr r3, r2, r3, lsl #16
str r3, [r0]
RET
LMEMCPY_4_PAD
ldr r3, [r1, #-3]
ldr r2, [r1, #1]
mov r3, r3, lsr #24
orr r3, r3, r2, lsl #8
str r3, [r0]
RET
LMEMCPY_4_PAD
ldr r2, [r1]
strb r2, [r0]
mov r3, r2, lsr #8
mov r1, r2, lsr #24
strb r1, [r0, #0x03]
strh r3, [r0, #0x01]
RET
LMEMCPY_4_PAD
ldrb r2, [r1]
ldrh r3, [r1, #0x01]
ldrb r1, [r1, #0x03]
strb r2, [r0]
strh r3, [r0, #0x01]
strb r1, [r0, #0x03]
RET
LMEMCPY_4_PAD
ldrh r2, [r1]
ldrh r3, [r1, #0x02]
strb r2, [r0]
mov r2, r2, lsr #8
orr r2, r2, r3, lsl #8
mov r3, r3, lsr #8
strh r2, [r0, #0x01]
strb r3, [r0, #0x03]
RET
LMEMCPY_4_PAD
ldrb r2, [r1]
ldrh r3, [r1, #0x01]
ldrb r1, [r1, #0x03]
strb r2, [r0]
strh r3, [r0, #0x01]
strb r1, [r0, #0x03]
RET
LMEMCPY_4_PAD
ldr r2, [r1]
strh r2, [r0]
mov r3, r2, lsr #16
strh r3, [r0, #0x02]
RET
LMEMCPY_4_PAD
ldr r2, [r1, #-1]
ldr r3, [r1, #3]
mov r1, r2, lsr #8
strh r1, [r0]
mov r2, r2, lsr #24
orr r2, r2, r3, lsl #8
strh r2, [r0, #0x02]
RET
LMEMCPY_4_PAD
ldrh r2, [r1]
ldrh r3, [r1, #0x02]
strh r2, [r0]
strh r3, [r0, #0x02]
RET
LMEMCPY_4_PAD
ldr r3, [r1, #1]
ldr r2, [r1, #-3]
mov r1, r3, lsr #8
strh r1, [r0, #0x02]
mov r3, r3, lsl #8
orr r3, r3, r2, lsr #24
strh r3, [r0]
RET
LMEMCPY_4_PAD
ldr r2, [r1]
strb r2, [r0]
mov r3, r2, lsr #8
mov r1, r2, lsr #24
strh r3, [r0, #0x01]
strb r1, [r0, #0x03]
RET
LMEMCPY_4_PAD
ldrb r2, [r1]
ldrh r3, [r1, #0x01]
ldrb r1, [r1, #0x03]
strb r2, [r0]
strh r3, [r0, #0x01]
strb r1, [r0, #0x03]
RET
LMEMCPY_4_PAD
ldrh r2, [r1]
ldrh r3, [r1, #0x02]
strb r2, [r0]
mov r2, r2, lsr #8
orr r2, r2, r3, lsl #8
strh r2, [r0, #0x01]
mov r3, r3, lsr #8
strb r3, [r0, #0x03]
RET
LMEMCPY_4_PAD
ldrb r2, [r1]
ldrh r3, [r1, #0x01]
ldrb r1, [r1, #0x03]
strb r2, [r0]
strh r3, [r0, #0x01]
strb r1, [r0, #0x03]
RET
LMEMCPY_4_PAD
#define LMEMCPY_6_LOG2 6
#define LMEMCPY_6_PAD .align LMEMCPY_6_LOG2
LMEMCPY_6_PAD
.Lmemcpy_6:
and r2, r1, #0x03
orr r2, r2, r0, lsl #2
ands r2, r2, #0x0f
sub r3, pc, #0x14
addne pc, r3, r2, lsl #LMEMCPY_6_LOG2
ldr r2, [r1]
ldrh r3, [r1, #0x04]
str r2, [r0]
strh r3, [r0, #0x04]
RET
LMEMCPY_6_PAD
ldr r2, [r1, #-1]
ldr r3, [r1, #0x03]
mov r2, r2, lsr #8
orr r2, r2, r3, lsl #24
mov r3, r3, lsr #8
str r2, [r0]
strh r3, [r0, #0x04]
RET
LMEMCPY_6_PAD
ldr r3, [r1, #0x02]
ldrh r2, [r1]
mov r1, r3, lsr #16
orr r2, r2, r3, lsl #16
str r2, [r0]
strh r1, [r0, #0x04]
RET
LMEMCPY_6_PAD
ldr r2, [r1, #-3]
ldr r3, [r1, #1]
ldr r1, [r1, #5]
mov r2, r2, lsr #24
orr r2, r2, r3, lsl #8
mov r1, r1, lsl #8
orr r1, r1, r3, lsr #24
str r2, [r0]
strh r1, [r0, #0x04]
RET
LMEMCPY_6_PAD
ldr r3, [r1]
ldrh r2, [r1, #0x04]
mov r1, r3, lsr #8
strh r1, [r0, #0x01]
strb r3, [r0]
mov r3, r3, lsr #24
orr r3, r3, r2, lsl #8
mov r2, r2, lsr #8
strh r3, [r0, #0x03]
strb r2, [r0, #0x05]
RET
LMEMCPY_6_PAD
ldrb r2, [r1]
ldrh r3, [r1, #0x01]
ldrh ip, [r1, #0x03]
ldrb r1, [r1, #0x05]
strb r2, [r0]
strh r3, [r0, #0x01]
strh ip, [r0, #0x03]
strb r1, [r0, #0x05]
RET
LMEMCPY_6_PAD
ldrh r2, [r1]
ldr r1, [r1, #0x02]
strb r2, [r0]
mov r3, r1, lsr #24
strb r3, [r0, #0x05]
mov r3, r1, lsr #8
strh r3, [r0, #0x03]
mov r3, r2, lsr #8
orr r3, r3, r1, lsl #8
strh r3, [r0, #0x01]
RET
LMEMCPY_6_PAD
ldrb r2, [r1]
ldrh r3, [r1, #0x01]
ldrh ip, [r1, #0x03]
ldrb r1, [r1, #0x05]
strb r2, [r0]
strh r3, [r0, #0x01]
strh ip, [r0, #0x03]
strb r1, [r0, #0x05]
RET
LMEMCPY_6_PAD
ldrh r2, [r1, #0x04]
ldr r3, [r1]
mov r2, r2, lsl #16
orr r2, r2, r3, lsr #16
strh r3, [r0]
str r2, [r0, #0x02]
RET
LMEMCPY_6_PAD
ldr r3, [r1, #-1]
ldr r2, [r1, #3]
mov r1, r3, lsr #8
mov r2, r2, lsl #8
orr r2, r2, r3, lsr #24
strh r1, [r0]
str r2, [r0, #0x02]
RET
LMEMCPY_6_PAD
ldrh r2, [r1]
ldr r3, [r1, #0x02]
strh r2, [r0]
str r3, [r0, #0x02]
RET
LMEMCPY_6_PAD
ldrb r3, [r1]
ldr r2, [r1, #0x01]
ldrb r1, [r1, #0x05]
orr r3, r3, r2, lsl #8
mov r1, r1, lsl #24
orr r1, r1, r2, lsr #8
strh r3, [r0]
str r1, [r0, #0x02]
RET
LMEMCPY_6_PAD
ldr r2, [r1]
ldrh r1, [r1, #0x04]
strb r2, [r0]
mov r2, r2, lsr #8
orr r2, r2, r1, lsl #24
mov r1, r1, lsr #8
str r2, [r0, #0x01]
strb r1, [r0, #0x05]
RET
LMEMCPY_6_PAD
ldrb r2, [r1]
ldrh r3, [r1, #0x01]
ldrh ip, [r1, #0x03]
ldrb r1, [r1, #0x05]
strb r2, [r0]
strh r3, [r0, #0x01]
strh ip, [r0, #0x03]
strb r1, [r0, #0x05]
RET
LMEMCPY_6_PAD
ldrh r2, [r1]
ldr r1, [r1, #0x02]
strb r2, [r0]
mov r2, r2, lsr #8
orr r2, r2, r1, lsl #8
mov r1, r1, lsr #24
str r2, [r0, #0x01]
strb r1, [r0, #0x05]
RET
LMEMCPY_6_PAD
ldrb r2, [r1]
ldr r3, [r1, #0x01]
ldrb r1, [r1, #0x05]
strb r2, [r0]
str r3, [r0, #0x01]
strb r1, [r0, #0x05]
RET
LMEMCPY_6_PAD
#define LMEMCPY_8_LOG2 6
#define LMEMCPY_8_PAD .align LMEMCPY_8_LOG2
LMEMCPY_8_PAD
.Lmemcpy_8:
and r2, r1, #0x03
orr r2, r2, r0, lsl #2
ands r2, r2, #0x0f
sub r3, pc, #0x14
addne pc, r3, r2, lsl #LMEMCPY_8_LOG2
ldr r2, [r1]
ldr r3, [r1, #0x04]
str r2, [r0]
str r3, [r0, #0x04]
RET
LMEMCPY_8_PAD
ldr r3, [r1, #-1]
ldr r2, [r1, #0x03]
ldrb r1, [r1, #0x07]
mov r3, r3, lsr #8
orr r3, r3, r2, lsl #24
mov r1, r1, lsl #24
orr r2, r1, r2, lsr #8
str r3, [r0]
str r2, [r0, #0x04]
RET
LMEMCPY_8_PAD
ldrh r2, [r1]
ldr r3, [r1, #0x02]
ldrh r1, [r1, #0x06]
orr r2, r2, r3, lsl #16
mov r3, r3, lsr #16
orr r3, r3, r1, lsl #16
str r2, [r0]
str r3, [r0, #0x04]
RET
LMEMCPY_8_PAD
ldrb r3, [r1]
ldr r2, [r1, #0x01]
ldr r1, [r1, #0x05]
orr r3, r3, r2, lsl #8
mov r2, r2, lsr #24
orr r2, r2, r1, lsl #8
str r3, [r0]
str r2, [r0, #0x04]
RET
LMEMCPY_8_PAD
ldr r3, [r1]
ldr r2, [r1, #0x04]
strb r3, [r0]
mov r1, r2, lsr #24
strb r1, [r0, #0x07]
mov r1, r3, lsr #8
mov r3, r3, lsr #24
orr r3, r3, r2, lsl #8
strh r1, [r0, #0x01]
str r3, [r0, #0x03]
RET
LMEMCPY_8_PAD
ldrb r2, [r1]
ldrh r3, [r1, #0x01]
ldr ip, [r1, #0x03]
ldrb r1, [r1, #0x07]
strb r2, [r0]
strh r3, [r0, #0x01]
str ip, [r0, #0x03]
strb r1, [r0, #0x07]
RET
LMEMCPY_8_PAD
ldrh r2, [r1]
ldr r3, [r1, #0x02]
ldrh r1, [r1, #0x06]
strb r2, [r0]
mov ip, r1, lsr #8
strb ip, [r0, #0x07]
mov ip, r2, lsr #8
orr ip, ip, r3, lsl #8
mov r3, r3, lsr #8
orr r3, r3, r1, lsl #24
strh ip, [r0, #0x01]
str r3, [r0, #0x03]
RET
LMEMCPY_8_PAD
ldrb r3, [r1]
ldr ip, [r1, #0x01]
ldrh r2, [r1, #0x05]
ldrb r1, [r1, #0x07]
strb r3, [r0]
mov r3, ip, lsr #16
strh ip, [r0, #0x01]
orr r2, r3, r2, lsl #16
str r2, [r0, #0x03]
strb r1, [r0, #0x07]
RET
LMEMCPY_8_PAD
ldr r2, [r1]
ldr r3, [r1, #0x04]
mov r1, r2, lsr #16
strh r2, [r0]
orr r2, r1, r3, lsl #16
mov r3, r3, lsr #16
str r2, [r0, #0x02]
strh r3, [r0, #0x06]
RET
LMEMCPY_8_PAD
ldr r2, [r1, #-1]
ldr r3, [r1, #0x03]
ldrb ip, [r1, #0x07]
mov r1, r2, lsr #8
strh r1, [r0]
mov r1, r2, lsr #24
orr r1, r1, r3, lsl #8
mov r3, r3, lsr #24
orr r3, r3, ip, lsl #8
str r1, [r0, #0x02]
strh r3, [r0, #0x06]
RET
LMEMCPY_8_PAD
ldrh r2, [r1]
ldr ip, [r1, #0x02]
ldrh r3, [r1, #0x06]
strh r2, [r0]
str ip, [r0, #0x02]
strh r3, [r0, #0x06]
RET
LMEMCPY_8_PAD
ldr r3, [r1, #0x05]
ldr r2, [r1, #0x01]
ldrb ip, [r1]
mov r1, r3, lsr #8
strh r1, [r0, #0x06]
mov r3, r3, lsl #24
orr r3, r3, r2, lsr #8
orr r2, ip, r2, lsl #8
str r3, [r0, #0x02]
strh r2, [r0]
RET
LMEMCPY_8_PAD
ldr r3, [r1, #0x04]
ldr r2, [r1]
mov r1, r3, lsr #8
strh r1, [r0, #0x05]
strb r2, [r0]
mov r1, r3, lsr #24
strb r1, [r0, #0x07]
mov r2, r2, lsr #8
orr r2, r2, r3, lsl #24
str r2, [r0, #0x01]
RET
LMEMCPY_8_PAD
ldrb r3, [r1]
ldrh r2, [r1, #0x01]
ldr ip, [r1, #0x03]
ldrb r1, [r1, #0x07]
strb r3, [r0]
mov r3, ip, lsr #16
strh r3, [r0, #0x05]
orr r2, r2, ip, lsl #16
str r2, [r0, #0x01]
strb r1, [r0, #0x07]
RET
LMEMCPY_8_PAD
ldrh r2, [r1]
ldr r3, [r1, #0x02]
ldrh r1, [r1, #0x06]
strb r2, [r0]
mov ip, r2, lsr #8
orr ip, ip, r3, lsl #8
mov r2, r1, lsr #8
strb r2, [r0, #0x07]
mov r1, r1, lsl #8
orr r1, r1, r3, lsr #24
str ip, [r0, #0x01]
strh r1, [r0, #0x05]
RET
LMEMCPY_8_PAD
ldrb r2, [r1]
ldr ip, [r1, #0x01]
ldrh r3, [r1, #0x05]
ldrb r1, [r1, #0x07]
strb r2, [r0]
str ip, [r0, #0x01]
strh r3, [r0, #0x05]
strb r1, [r0, #0x07]
RET
LMEMCPY_8_PAD
#define LMEMCPY_C_LOG2 7
#define LMEMCPY_C_PAD .align LMEMCPY_C_LOG2
LMEMCPY_C_PAD
.Lmemcpy_c:
and r2, r1, #0x03
orr r2, r2, r0, lsl #2
ands r2, r2, #0x0f
sub r3, pc, #0x14
addne pc, r3, r2, lsl #LMEMCPY_C_LOG2
ldr r2, [r1]
ldr r3, [r1, #0x04]
ldr r1, [r1, #0x08]
str r2, [r0]
str r3, [r0, #0x04]
str r1, [r0, #0x08]
RET
LMEMCPY_C_PAD
ldrb r2, [r1, #0xb]
ldr ip, [r1, #0x07]
ldr r3, [r1, #0x03]
ldr r1, [r1, #-1]
mov r2, r2, lsl #24
orr r2, r2, ip, lsr #8
str r2, [r0, #0x08]
mov r2, ip, lsl #24
orr r2, r2, r3, lsr #8
mov r1, r1, lsr #8
orr r1, r1, r3, lsl #24
str r2, [r0, #0x04]
str r1, [r0]
RET
LMEMCPY_C_PAD
ldrh r2, [r1]
ldr r3, [r1, #0x02]
ldr ip, [r1, #0x06]
ldrh r1, [r1, #0x0a]
orr r2, r2, r3, lsl #16
str r2, [r0]
mov r3, r3, lsr #16
orr r3, r3, ip, lsl #16
mov r1, r1, lsl #16
orr r1, r1, ip, lsr #16
str r3, [r0, #0x04]
str r1, [r0, #0x08]
RET
LMEMCPY_C_PAD
ldrb r2, [r1]
ldr r3, [r1, #0x01]
ldr ip, [r1, #0x05]
ldr r1, [r1, #0x09]
orr r2, r2, r3, lsl #8
str r2, [r0]
mov r3, r3, lsr #24
orr r3, r3, ip, lsl #8
mov r1, r1, lsl #8
orr r1, r1, ip, lsr #24
str r3, [r0, #0x04]
str r1, [r0, #0x08]
RET
LMEMCPY_C_PAD
ldr r2, [r1]
ldr r3, [r1, #0x04]
ldr ip, [r1, #0x08]
mov r1, r2, lsr #8
strh r1, [r0, #0x01]
strb r2, [r0]
mov r1, r2, lsr #24
orr r2, r1, r3, lsl #8
mov r1, r3, lsr #24
orr r1, r1, ip, lsl #8
mov ip, ip, lsr #24
str r2, [r0, #0x03]
str r1, [r0, #0x07]
strb ip, [r0, #0x0b]
RET
LMEMCPY_C_PAD
ldrb r2, [r1]
ldrh r3, [r1, #0x01]
ldr ip, [r1, #0x03]
strb r2, [r0]
ldr r2, [r1, #0x07]
ldrb r1, [r1, #0x0b]
strh r3, [r0, #0x01]
str ip, [r0, #0x03]
str r2, [r0, #0x07]
strb r1, [r0, #0x0b]
RET
LMEMCPY_C_PAD
ldrh r2, [r1]
ldr r3, [r1, #0x02]
ldr ip, [r1, #0x06]
ldrh r1, [r1, #0x0a]
strb r2, [r0]
mov r2, r2, lsr #8
orr r2, r2, r3, lsl #8
strh r2, [r0, #0x01]
mov r2, r3, lsr #8
orr r3, r2, ip, lsl #24
mov r2, ip, lsr #8
orr r2, r2, r1, lsl #24
mov r1, r1, lsr #8
str r3, [r0, #0x03]
str r2, [r0, #0x07]
strb r1, [r0, #0x0b]
RET
LMEMCPY_C_PAD
ldrb r2, [r1]
ldr r3, [r1, #0x01]
ldr ip, [r1, #0x05]
ldr r1, [r1, #0x09]
strb r2, [r0]
strh r3, [r0, #0x01]
mov r3, r3, lsr #16
orr r3, r3, ip, lsl #16
mov ip, ip, lsr #16
orr ip, ip, r1, lsl #16
mov r1, r1, lsr #16
str r3, [r0, #0x03]
str ip, [r0, #0x07]
strb r1, [r0, #0x0b]
RET
LMEMCPY_C_PAD
ldr ip, [r1]
ldr r3, [r1, #0x04]
ldr r2, [r1, #0x08]
mov r1, ip, lsr #16
strh ip, [r0]
orr r1, r1, r3, lsl #16
mov r3, r3, lsr #16
orr r3, r3, r2, lsl #16
mov r2, r2, lsr #16
str r1, [r0, #0x02]
str r3, [r0, #0x06]
strh r2, [r0, #0x0a]
RET
LMEMCPY_C_PAD
ldr r2, [r1, #-1]
ldr r3, [r1, #0x03]
mov ip, r2, lsr #8
strh ip, [r0]
ldr ip, [r1, #0x07]
ldrb r1, [r1, #0x0b]
mov r2, r2, lsr #24
orr r2, r2, r3, lsl #8
mov r3, r3, lsr #24
orr r3, r3, ip, lsl #8
mov r1, r1, lsl #8
orr r1, r1, ip, lsr #24
str r2, [r0, #0x02]
str r3, [r0, #0x06]
strh r1, [r0, #0x0a]
RET
LMEMCPY_C_PAD
ldrh r2, [r1]
ldr r3, [r1, #0x02]
ldr ip, [r1, #0x06]
ldrh r1, [r1, #0x0a]
strh r2, [r0]
str r3, [r0, #0x02]
str ip, [r0, #0x06]
strh r1, [r0, #0x0a]
RET
LMEMCPY_C_PAD
ldr r2, [r1, #0x09]
ldr r3, [r1, #0x05]
mov ip, r2, lsr #8
strh ip, [r0, #0x0a]
ldr ip, [r1, #0x01]
ldrb r1, [r1]
mov r2, r2, lsl #24
orr r2, r2, r3, lsr #8
mov r3, r3, lsl #24
orr r3, r3, ip, lsr #8
orr r1, r1, ip, lsl #8
str r2, [r0, #0x06]
str r3, [r0, #0x02]
strh r1, [r0]
RET
LMEMCPY_C_PAD
ldr r2, [r1]
ldr ip, [r1, #0x04]
ldr r1, [r1, #0x08]
strb r2, [r0]
mov r3, r2, lsr #8
orr r3, r3, ip, lsl #24
str r3, [r0, #0x01]
mov r3, ip, lsr #8
orr r3, r3, r1, lsl #24
str r3, [r0, #0x05]
mov r1, r1, lsr #8
strh r1, [r0, #0x09]
mov r1, r1, lsr #16
strb r1, [r0, #0x0b]
RET
LMEMCPY_C_PAD
ldrb r2, [r1, #0x0b]
ldr r3, [r1, #0x07]
ldr ip, [r1, #0x03]
ldr r1, [r1, #-1]
strb r2, [r0, #0x0b]
mov r2, r3, lsr #16
strh r2, [r0, #0x09]
mov r3, r3, lsl #16
orr r3, r3, ip, lsr #16
mov ip, ip, lsl #16
orr ip, ip, r1, lsr #16
mov r1, r1, lsr #8
str r3, [r0, #0x05]
str ip, [r0, #0x01]
strb r1, [r0]
RET
LMEMCPY_C_PAD
ldrh r2, [r1]
ldr r3, [r1, #0x02]
ldr ip, [r1, #0x06]
ldrh r1, [r1, #0x0a]
strb r2, [r0]
mov r2, r2, lsr #8
orr r2, r2, r3, lsl #8
mov r3, r3, lsr #24
orr r3, r3, ip, lsl #8
mov ip, ip, lsr #24
orr ip, ip, r1, lsl #8
mov r1, r1, lsr #8
str r2, [r0, #0x01]
str r3, [r0, #0x05]
strh ip, [r0, #0x09]
strb r1, [r0, #0x0b]
RET
LMEMCPY_C_PAD
ldrb r2, [r1]
ldr r3, [r1, #0x01]
ldr ip, [r1, #0x05]
strb r2, [r0]
ldrh r2, [r1, #0x09]
ldrb r1, [r1, #0x0b]
str r3, [r0, #0x01]
str ip, [r0, #0x05]
strh r2, [r0, #0x09]
strb r1, [r0, #0x0b]
RET
END(memcpy)