2009-10-26 18:05:23 +08:00
|
|
|
.file "memmove.S"
|
|
|
|
|
|
|
|
.section .text
|
|
|
|
.global _memmove
|
|
|
|
.type _memmove,@function
|
|
|
|
_memmove:
|
2015-04-09 16:20:00 +08:00
|
|
|
;; R1: DEST
|
|
|
|
;; R2: SRC
|
|
|
|
;; R3: COUNT
|
|
|
|
#ifdef __RX_DISALLOW_STRING_INSNS__
|
|
|
|
/* Do not use the string instructions - they might prefetch
|
|
|
|
bytes from outside of valid memory. This is particularly
|
|
|
|
dangerous in I/O space. */
|
|
|
|
|
|
|
|
cmp #0, r3 ; If the count is zero, do nothing
|
|
|
|
beq 4f
|
|
|
|
|
|
|
|
cmp r1, r2
|
|
|
|
blt 3f ; If SRC < DEST copy backwards
|
|
|
|
|
|
|
|
mov r1, r14 ; Save a copy of DEST
|
|
|
|
|
|
|
|
5: mov.b [r2+], r5
|
|
|
|
mov.b r5, [r14+]
|
|
|
|
sub #1, r3
|
|
|
|
bne 5b
|
|
|
|
|
|
|
|
4: rts
|
|
|
|
|
|
|
|
3: add r3, r1
|
|
|
|
add r3, r2
|
|
|
|
|
|
|
|
6: mov.b [-r2], r5
|
|
|
|
mov.b r5, [-r1]
|
|
|
|
sub #1, r3
|
|
|
|
bne 6b
|
|
|
|
|
|
|
|
rts
|
|
|
|
#else
|
2009-10-26 18:05:23 +08:00
|
|
|
mov r1, r4 ; Save a copy of DEST
|
|
|
|
cmp r1, r2
|
|
|
|
blt 2f ; If SRC (r2) is less than DEST (r1) then copy backwards
|
|
|
|
smovf
|
|
|
|
1:
|
|
|
|
mov r4, r1 ; Return DEST
|
|
|
|
rts
|
|
|
|
2:
|
|
|
|
add r3, r1 ; The SMOVB instructions requires the DEST in r1 and the
|
|
|
|
add r3, r2 ; SRC in r2 but it needs them to point the last bytes of
|
|
|
|
sub #1, r2 ; the regions involved not the first bytes, hence these
|
|
|
|
sub #1, r1 ; additions and subtractions.
|
|
|
|
smovb
|
|
|
|
bra 1b
|
2015-04-09 16:20:00 +08:00
|
|
|
|
|
|
|
#endif /* SMOVF allowed. */
|
|
|
|
|
|
|
|
.size _memmove, . - _memmove
|