summaryrefslogtreecommitdiffstats
path: root/sys/lib/libkern/arch/amd64/strcat.S
diff options
context:
space:
mode:
authormickey <mickey@openbsd.org>2004-01-28 01:39:38 +0000
committermickey <mickey@openbsd.org>2004-01-28 01:39:38 +0000
commitf5df1827e930693b77256fbf32ab5050c01d960c (patch)
tree864af18bc7e8bce47743bc121c791bd7c200c097 /sys/lib/libkern/arch/amd64/strcat.S
parentremove unused variable. ok millert@ (diff)
downloadwireguard-openbsd-f5df1827e930693b77256fbf32ab5050c01d960c.tar.xz
wireguard-openbsd-f5df1827e930693b77256fbf32ab5050c01d960c.zip
an amd64 arch support.
hacked by art@ from netbsd sources and then later debugged by me into the shape where it can host itself. no bootloader yet as needs redoing from the recent advanced i386 sources (anyone? ;)
Diffstat (limited to 'sys/lib/libkern/arch/amd64/strcat.S')
-rw-r--r--sys/lib/libkern/arch/amd64/strcat.S65
1 files changed, 65 insertions, 0 deletions
diff --git a/sys/lib/libkern/arch/amd64/strcat.S b/sys/lib/libkern/arch/amd64/strcat.S
new file mode 100644
index 00000000000..7dc71244312
--- /dev/null
+++ b/sys/lib/libkern/arch/amd64/strcat.S
@@ -0,0 +1,65 @@
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ * Adapted for NetBSD/x86_64 by Frank van der Linden <fvdl@wasabisystems.com>
+ */
+
+#include <machine/asm.h>
+
+#if defined(LIBC_SCCS)
+ RCSID("$NetBSD: strcat.S,v 1.1 2001/06/19 00:22:47 fvdl Exp $")
+#endif
+
+/*
+ * NOTE: I've unrolled the loop eight times: large enough to make a
+ * significant difference, and small enough not to totally trash the
+ * cache.
+ */
+
+ENTRY(strcat)
+ movq %rdi,%r11
+
+ cld /* set search forward */
+ xorl %eax,%eax /* set search for null terminator */
+ movq $-1,%rcx /* set search for lots of characters */
+ repne /* search! */
+ scasb
+
+ decq %rdi
+
+L1: movb (%rsi),%al /* unroll loop, but not too much */
+ movb %al,(%rdi)
+ testb %al,%al
+ jz L2
+ movb 1(%rsi),%al
+ movb %al,1(%rdi)
+ testb %al,%al
+ jz L2
+ movb 2(%rsi),%al
+ movb %al,2(%rdi)
+ testb %al,%al
+ jz L2
+ movb 3(%rsi),%al
+ movb %al,3(%rdi)
+ testb %al,%al
+ jz L2
+ movb 4(%rsi),%al
+ movb %al,4(%rdi)
+ testb %al,%al
+ jz L2
+ movb 5(%rsi),%al
+ movb %al,5(%rdi)
+ testb %al,%al
+ jz L2
+ movb 6(%rsi),%al
+ movb %al,6(%rdi)
+ testb %al,%al
+ jz L2
+ movb 7(%rsi),%al
+ movb %al,7(%rdi)
+ addq $8,%rsi
+ addq $8,%rdi
+ testb %al,%al
+ jnz L1
+L2: movq %r11,%rax
+ ret