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/memcmp.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/memcmp.S')
-rw-r--r-- | sys/lib/libkern/arch/amd64/memcmp.S | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/sys/lib/libkern/arch/amd64/memcmp.S b/sys/lib/libkern/arch/amd64/memcmp.S new file mode 100644 index 00000000000..722a2a2c304 --- /dev/null +++ b/sys/lib/libkern/arch/amd64/memcmp.S @@ -0,0 +1,40 @@ +/* + * 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: memcmp.S,v 1.1 2001/06/19 00:22:46 fvdl Exp $") +#endif + +ENTRY(memcmp) + cld /* set compare direction forward */ + movq %rdx,%rcx /* compare by longs */ + shrq $3,%rcx + repe + cmpsq + jne L5 /* do we match so far? */ + + movq %rdx,%rcx /* compare remainder by bytes */ + andq $7,%rcx + repe + cmpsb + jne L6 /* do we match? */ + + xorl %eax,%eax /* we match, return zero */ + ret + +L5: movl $8,%ecx /* We know that one of the next */ + subq %rcx,%rdi /* eight pairs of bytes do not */ + subq %rcx,%rsi /* match. */ + repe + cmpsb +L6: xorl %eax,%eax /* Perform unsigned comparison */ + movb -1(%rdi),%al + xorl %edx,%edx + movb -1(%rsi),%dl + subl %edx,%eax + ret |