diff options
author | 2004-01-28 01:39:38 +0000 | |
---|---|---|
committer | 2004-01-28 01:39:38 +0000 | |
commit | f5df1827e930693b77256fbf32ab5050c01d960c (patch) | |
tree | 864af18bc7e8bce47743bc121c791bd7c200c097 /sys/lib/libkern/arch/amd64/strcat.S | |
parent | remove unused variable. ok millert@ (diff) | |
download | wireguard-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.S | 65 |
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 |