.text
.align 5
ENTRY(__memset)
ENTRY(mmioset)
WEAK(memset)
UNWIND( .fnstart )
and r1, r1,
ands r3, r0,
mov ip, r0 @ preserve r0 as return value
bne 6f @ 1
1: orr r1, r1, r1, lsl
orr r1, r1, r1, lsl
mov r3, r1
7: cmp r2,
blt 4f
UNWIND( .fnend )
UNWIND( .fnstart )
UNWIND( .save {r8, lr} )
stmfd sp!, {r8, lr}
mov r8, r1
mov lr, r3
2: subs r2, r2,
stmiage ip!, {r1, r3, r8, lr} @ 64 bytes at a time.
stmiage ip!, {r1, r3, r8, lr}
stmiage ip!, {r1, r3, r8, lr}
stmiage ip!, {r1, r3, r8, lr}
bgt 2b
ldmfdeq sp!, {r8, pc} @ Now <64 bytes to go.
tst r2,
stmiane ip!, {r1, r3, r8, lr}
stmiane ip!, {r1, r3, r8, lr}
tst r2,
stmiane ip!, {r1, r3, r8, lr}
ldmfd sp!, {r8, lr}
UNWIND( .fnend )
UNWIND( .fnstart )
UNWIND( .save {r4-r8, lr} )
stmfd sp!, {r4-r8, lr}
mov r4, r1
mov r5, r3
mov r6, r1
mov r7, r3
mov r8, r1
mov lr, r3
cmp r2,
tstgt ip,
ble 3f
and r8, ip,
rsb r8, r8,
sub r2, r2, r8
movs r8, r8, lsl
stmiacs ip!, {r4, r5, r6, r7}
stmiami ip!, {r4, r5}
tst r8,
mov r8, r1
strne r1, [ip],
3: subs r2, r2,
stmiage ip!, {r1, r3-r8, lr}
stmiage ip!, {r1, r3-r8, lr}
bgt 3b
ldmfdeq sp!, {r4-r8, pc}
tst r2,
stmiane ip!, {r1, r3-r8, lr}
tst r2,
stmiane ip!, {r4-r7}
ldmfd sp!, {r4-r8, lr}
UNWIND( .fnend )
UNWIND( .fnstart )
4: tst r2,
stmiane ip!, {r1, r3}
tst r2,
strne r1, [ip],
5: tst r2,
strbne r1, [ip],
strbne r1, [ip],
tst r2,
strbne r1, [ip],
ret lr
6: subs r2, r2,
blt 5b @ 1 bytes to align with?
cmp r3,
strblt r1, [ip],
strble r1, [ip],
strb r1, [ip],
add r2, r2, r3 @ 1 (r2 = r2 - (4 - r3))
b 1b
UNWIND( .fnend )
ENDPROC(memset)
ENDPROC(mmioset)
ENDPROC(__memset)
ENTRY(__memset32)
UNWIND( .fnstart )
mov r3, r1 @ copy r1 to r3 and fall into memset64
UNWIND( .fnend )
ENDPROC(__memset32)
ENTRY(__memset64)
UNWIND( .fnstart )
mov ip, r0 @ preserve r0 as return value
b 7b @ jump into the middle of memset
UNWIND( .fnend )
ENDPROC(__memset64)