summaryrefslogtreecommitdiffstats
path: root/newlib/libc/machine/rx/strncat.S
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2015-04-09 09:20:00 +0100
committerCorinna Vinschen <corinna@vinschen.de>2015-04-23 21:57:13 +0200
commitcd0d45913525ef09f0494a2f0c8e3d6fe8fface2 (patch)
treedcbb6a0c97dc45cc7df625cbeb4d1a99f503d247 /newlib/libc/machine/rx/strncat.S
parent45d0b17928067ee848aae2cd5bd332129ca35c42 (diff)
downloadcygnal-cd0d45913525ef09f0494a2f0c8e3d6fe8fface2.tar.gz
cygnal-cd0d45913525ef09f0494a2f0c8e3d6fe8fface2.tar.bz2
cygnal-cd0d45913525ef09f0494a2f0c8e3d6fe8fface2.zip
For the RX port, avoid using string instructions when __RX_DISALLOW_STRING_INSNS__ is defined.
* rx/crt0.S (_start): If string instructions are not allowed, avoid using SMOVF. * libc/machine/rx/memchr.S: Add non-string insn using version. * libc/machine/rx/memcpy.S: Likewise. * libc/machine/rx/memmove.S: Likewise. * libc/machine/rx/mempcpy.S: Likewise. * libc/machine/rx/strcat.S: Likewise. * libc/machine/rx/strcmp.S: Likewise. * libc/machine/rx/strcpy.S: Likewise. * libc/machine/rx/strlen.S: Likewise. * libc/machine/rx/strncat.S: Likewise. * libc/machine/rx/strncmp.S: Likewise. * libc/machine/rx/strncpy.S: Likewise.
Diffstat (limited to 'newlib/libc/machine/rx/strncat.S')
-rw-r--r--newlib/libc/machine/rx/strncat.S23
1 files changed, 23 insertions, 0 deletions
diff --git a/newlib/libc/machine/rx/strncat.S b/newlib/libc/machine/rx/strncat.S
index 3bc6b75ae..ba544a43a 100644
--- a/newlib/libc/machine/rx/strncat.S
+++ b/newlib/libc/machine/rx/strncat.S
@@ -7,7 +7,27 @@ _strncat:
;; On entry: r1 => Destination
;; r2 => Source
;; r3 => Max number of bytes to copy
+#ifdef __RX_DISALLOW_STRING_INSNS__
+ cmp #0, r3 ; If max is zero we have nothing to do.
+ beq 2f
+ mov r1, r4 ; Leave the desintation pointer intact for the return value.
+
+1: mov.b [r4+], r5 ; Find the NUL byte at the end of the destination.
+ cmp #0, r5
+ bne 1b
+
+ sub #1, r4
+
+3: mov.b [r2+], r5 ; Copy bytes from the source into the destination ...
+ mov.b r5, [r4+]
+ cmp #0, r5 ; ... until we reach a NUL byte ...
+ beq 2f
+ sub #1, r3
+ bne 3b ; ... or we have copied N bytes.
+
+2: rts
+#else
mov r1, r4 ; Save a copy of the dest pointer.
mov r2, r5 ; Save a copy of the source pointer.
mov r3, r14 ; Save a copy of the byte count.
@@ -33,3 +53,6 @@ _strncat:
1:
mov r4, r1 ; Return the original dest pointer.
rts
+#endif
+ .size _strncat, . - _strncat
+