diff options
Diffstat (limited to 'newlib/libc/machine/rx/memcpy.S')
-rw-r--r-- | newlib/libc/machine/rx/memcpy.S | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/newlib/libc/machine/rx/memcpy.S b/newlib/libc/machine/rx/memcpy.S index 3e0d50001..eb671c0ae 100644 --- a/newlib/libc/machine/rx/memcpy.S +++ b/newlib/libc/machine/rx/memcpy.S @@ -4,7 +4,28 @@ .global _memcpy .type _memcpy,@function _memcpy: +#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. */ + + ;; FIXME: It would be more space efficient to just branch to _memmove... + + cmp #0, r3 ; If the count is zero, do nothing + beq 1f + + mov r1, r14 ; Save a copy of DEST + +2: mov.b [r2+], r5 + mov.b r5, [r14+] + sub #1, r3 + bne 2b + +1: rts +#else mov r1, r4 ; Save a copy of DEST smovf ; Copy R2 (source) to R1 (dest). Stop after R3 bytes. mov r4, r1 ; Return DEST rts +#endif + .size _memcpy, . - _memcpy |