.syntax unified
ENTRY(memmove)
ENTRY(bcopy)
eor r0, r1, r0
eor r1, r0, r1
eor r0, r1, r0
cmp r0, r1
it eq
RETeq
ite cc
subcc r3, r0, r1
subcs r3, r1, r0
cmp r3, r2
bcc PIC_SYM(_C_LABEL(memcpy), PLT)
cmp r1, r0
it cc
bcc .Lmemmove_backwards
itt eq
moveq r0,
RETeq
stmdb sp!, {r0, lr}
subs r2, r2,
blt .Lmemmove_fl4
ands r12, r0,
bne .Lmemmove_fdestul
ands r12, r1,
bne .Lmemmove_fsrcul
.Lmemmove_ft8:
subs r2, r2,
blt .Lmemmove_fl12
subs r2, r2,
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,
bge .Lmemmove_floop32
cmn r2,
ittt ge
ldmiage r1!, {r3, r4, r12, lr}
stmiage r0!, {r3, r4, r12, lr}
subge r2, r2,
ldmia sp!, {r4}
.Lmemmove_fl32:
adds r2, r2,
.Lmemmove_floop12:
ittt ge
ldmiage r1!, {r3, r12, lr}
stmiage r0!, {r3, r12, lr}
subsge r2, r2,
bge .Lmemmove_floop12
.Lmemmove_fl12:
adds r2, r2,
blt .Lmemmove_fl4
subs r2, r2,
itt lt
ldrlt r3, [r1],
strlt r3, [r0],
ittt ge
ldmiage r1!, {r3, r12}
stmiage r0!, {r3, r12}
subge r2, r2,
.Lmemmove_fl4:
adds r2, r2,
it eq
ldmiaeq sp!, {r0, pc}
cmp r2,
ldrb r3, [r1],
strb r3, [r0],
itt ge
ldrbge r3, [r1],
strbge r3, [r0],
itt gt
ldrbgt r3, [r1],
strbgt r3, [r0],
ldmia sp!, {r0, pc}
.Lmemmove_fdestul:
rsb r12, r12,
cmp r12,
ldrb r3, [r1],
strb r3, [r0],
itt ge
ldrbge r3, [r1],
strbge r3, [r0],
itt gt
ldrbgt r3, [r1],
strbgt r3, [r0],
subs r2, r2, r12
blt .Lmemmove_fl4
ands r12, r1,
beq .Lmemmove_ft8
.Lmemmove_fsrcul:
bic r1, r1,
ldr lr, [r1],
cmp r12,
bgt .Lmemmove_fsrcul3
beq .Lmemmove_fsrcul2
cmp r2,
blt .Lmemmove_fsrcul1loop4
sub r2, r2,
stmdb sp!, {r4, r5}
.Lmemmove_fsrcul1loop16:
mov r3, lr, lsr
ldmia r1!, {r4, r5, r12, lr}
orr r3, r3, r4, lsl
mov r4, r4, lsr
orr r4, r4, r5, lsl
mov r5, r5, lsr
orr r5, r5, r12, lsl
mov r12, r12, lsr
orr r12, r12, lr, lsl
stmia r0!, {r3-r5, r12}
subs r2, r2,
bge .Lmemmove_fsrcul1loop16
ldmia sp!, {r4, r5}
adds r2, r2,
blt .Lmemmove_fsrcul1l4
.Lmemmove_fsrcul1loop4:
mov r12, lr, lsr
ldr lr, [r1],
orr r12, r12, lr, lsl
str r12, [r0],
subs r2, r2,
bge .Lmemmove_fsrcul1loop4
.Lmemmove_fsrcul1l4:
sub r1, r1,
b .Lmemmove_fl4
.Lmemmove_fsrcul2:
cmp r2,
blt .Lmemmove_fsrcul2loop4
sub r2, r2,
stmdb sp!, {r4, r5}
.Lmemmove_fsrcul2loop16:
mov r3, lr, lsr
ldmia r1!, {r4, r5, r12, lr}
orr r3, r3, r4, lsl
mov r4, r4, lsr
orr r4, r4, r5, lsl
mov r5, r5, lsr
orr r5, r5, r12, lsl
mov r12, r12, lsr
orr r12, r12, lr, lsl
stmia r0!, {r3-r5, r12}
subs r2, r2,
bge .Lmemmove_fsrcul2loop16
ldmia sp!, {r4, r5}
adds r2, r2,
blt .Lmemmove_fsrcul2l4
.Lmemmove_fsrcul2loop4:
mov r12, lr, lsr
ldr lr, [r1],
orr r12, r12, lr, lsl
str r12, [r0],
subs r2, r2,
bge .Lmemmove_fsrcul2loop4
.Lmemmove_fsrcul2l4:
sub r1, r1,
b .Lmemmove_fl4
.Lmemmove_fsrcul3:
cmp r2,
blt .Lmemmove_fsrcul3loop4
sub r2, r2,
stmdb sp!, {r4, r5}
.Lmemmove_fsrcul3loop16:
mov r3, lr, lsr
ldmia r1!, {r4, r5, r12, lr}
orr r3, r3, r4, lsl
mov r4, r4, lsr
orr r4, r4, r5, lsl
mov r5, r5, lsr
orr r5, r5, r12, lsl
mov r12, r12, lsr
orr r12, r12, lr, lsl
stmia r0!, {r3-r5, r12}
subs r2, r2,
bge .Lmemmove_fsrcul3loop16
ldmia sp!, {r4, r5}
adds r2, r2,
blt .Lmemmove_fsrcul3l4
.Lmemmove_fsrcul3loop4:
mov r12, lr, lsr
ldr lr, [r1],
orr r12, r12, lr, lsl
str r12, [r0],
subs r2, r2,
bge .Lmemmove_fsrcul3loop4
.Lmemmove_fsrcul3l4:
sub r1, r1,
b .Lmemmove_fl4
.Lmemmove_backwards:
add r1, r1, r2
add r0, r0, r2
subs r2, r2,
blt .Lmemmove_bl4
ands r12, r0,
bne .Lmemmove_bdestul
ands r12, r1,
bne .Lmemmove_bsrcul
.Lmemmove_bt8:
subs r2, r2,
blt .Lmemmove_bl12
stmdb sp!, {r4, lr}
subs r2, r2,
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,
bge .Lmemmove_bloop32
.Lmemmove_bl32:
cmn r2,
ittt ge
ldmdbge r1!, {r3, r4, r12, lr}
stmdbge r0!, {r3, r4, r12, lr}
subge r2, r2,
adds r2, r2,
ittt ge
ldmdbge r1!, {r3, r12, lr}
stmdbge r0!, {r3, r12, lr}
subge r2, r2,
ldmia sp!, {r4, lr}
.Lmemmove_bl12:
adds r2, r2,
blt .Lmemmove_bl4
subs r2, r2,
itt lt
ldrlt r3, [r1,
strlt r3, [r0,
ittt ge
ldmdbge r1!, {r3, r12}
stmdbge r0!, {r3, r12}
subge r2, r2,
.Lmemmove_bl4:
adds r2, r2,
it eq
RETeq
cmp r2,
ldrb r3, [r1,
strb r3, [r0,
itt ge
ldrbge r3, [r1,
strbge r3, [r0,
itt gt
ldrbgt r3, [r1,
strbgt r3, [r0,
RET
.Lmemmove_bdestul:
cmp r12,
ldrb r3, [r1,
strb r3, [r0,
itt ge
ldrbge r3, [r1,
strbge r3, [r0,
itt gt
ldrbgt r3, [r1,
strbgt r3, [r0,
subs r2, r2, r12
blt .Lmemmove_bl4
ands r12, r1,
beq .Lmemmove_bt8
.Lmemmove_bsrcul:
bic r1, r1,
ldr r3, [r1,
cmp r12,
blt .Lmemmove_bsrcul1
beq .Lmemmove_bsrcul2
cmp r2,
blt .Lmemmove_bsrcul3loop4
sub r2, r2,
stmdb sp!, {r4, r5, lr}
.Lmemmove_bsrcul3loop16:
mov lr, r3, lsl
ldmdb r1!, {r3-r5, r12}
orr lr, lr, r12, lsr
mov r12, r12, lsl
orr r12, r12, r5, lsr
mov r5, r5, lsl
orr r5, r5, r4, lsr
mov r4, r4, lsl
orr r4, r4, r3, lsr
stmdb r0!, {r4, r5, r12, lr}
subs r2, r2,
bge .Lmemmove_bsrcul3loop16
ldmia sp!, {r4, r5, lr}
adds r2, r2,
blt .Lmemmove_bsrcul3l4
.Lmemmove_bsrcul3loop4:
mov r12, r3, lsl
ldr r3, [r1,
orr r12, r12, r3, lsr
str r12, [r0,
subs r2, r2,
bge .Lmemmove_bsrcul3loop4
.Lmemmove_bsrcul3l4:
add r1, r1,
b .Lmemmove_bl4
.Lmemmove_bsrcul2:
cmp r2,
blt .Lmemmove_bsrcul2loop4
sub r2, r2,
stmdb sp!, {r4, r5, lr}
.Lmemmove_bsrcul2loop16:
mov lr, r3, lsl
ldmdb r1!, {r3-r5, r12}
orr lr, lr, r12, lsr
mov r12, r12, lsl
orr r12, r12, r5, lsr
mov r5, r5, lsl
orr r5, r5, r4, lsr
mov r4, r4, lsl
orr r4, r4, r3, lsr
stmdb r0!, {r4, r5, r12, lr}
subs r2, r2,
bge .Lmemmove_bsrcul2loop16
ldmia sp!, {r4, r5, lr}
adds r2, r2,
blt .Lmemmove_bsrcul2l4
.Lmemmove_bsrcul2loop4:
mov r12, r3, lsl
ldr r3, [r1,
orr r12, r12, r3, lsr
str r12, [r0,
subs r2, r2,
bge .Lmemmove_bsrcul2loop4
.Lmemmove_bsrcul2l4:
add r1, r1,
b .Lmemmove_bl4
.Lmemmove_bsrcul1:
cmp r2,
blt .Lmemmove_bsrcul1loop4
sub r2, r2,
stmdb sp!, {r4, r5, lr}
.Lmemmove_bsrcul1loop32:
mov lr, r3, lsl
ldmdb r1!, {r3-r5, r12}
orr lr, lr, r12, lsr
mov r12, r12, lsl
orr r12, r12, r5, lsr
mov r5, r5, lsl
orr r5, r5, r4, lsr
mov r4, r4, lsl
orr r4, r4, r3, lsr
stmdb r0!, {r4, r5, r12, lr}
subs r2, r2,
bge .Lmemmove_bsrcul1loop32
ldmia sp!, {r4, r5, lr}
adds r2, r2,
blt .Lmemmove_bsrcul1l4
.Lmemmove_bsrcul1loop4:
mov r12, r3, lsl
ldr r3, [r1,
orr r12, r12, r3, lsr
str r12, [r0,
subs r2, r2,
bge .Lmemmove_bsrcul1loop4
.Lmemmove_bsrcul1l4:
add r1, r1,
b .Lmemmove_bl4
END(memmove)
END(bcopy)
.section .note.GNU-stack,"",%progbits