Add machine-specific, optimized implementations of bcmp and memcmp.
PR: 73111 Submitted by: Ville-Pertti Keinonen <will@iki.fi> (taken from NetBSD) MFC after: 3 weeks
This commit is contained in:
parent
e76ce25370
commit
26f6218be9
@ -1,3 +1,3 @@
|
||||
# $FreeBSD$
|
||||
|
||||
MDSRCS+= bcopy.S bzero.S memcpy.S memmove.S memset.S
|
||||
MDSRCS+= bcmp.S bcopy.S bzero.S memcmp.S memcpy.S memmove.S memset.S
|
||||
|
25
lib/libc/amd64/string/bcmp.S
Normal file
25
lib/libc/amd64/string/bcmp.S
Normal file
@ -0,0 +1,25 @@
|
||||
#include <machine/asm.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#if 0
|
||||
RCSID("$NetBSD: bcmp.S,v 1.1 2001/06/19 00:25:04 fvdl Exp $")
|
||||
#endif
|
||||
|
||||
ENTRY(bcmp)
|
||||
xorl %eax,%eax /* clear return value */
|
||||
cld /* set compare direction forward */
|
||||
|
||||
movq %rdx,%rcx /* compare by words */
|
||||
shrq $3,%rcx
|
||||
repe
|
||||
cmpsq
|
||||
jne L1
|
||||
|
||||
movq %rdx,%rcx /* compare remainder by bytes */
|
||||
andq $7,%rcx
|
||||
repe
|
||||
cmpsb
|
||||
je L2
|
||||
|
||||
L1: incl %eax
|
||||
L2: ret
|
41
lib/libc/amd64/string/memcmp.S
Normal file
41
lib/libc/amd64/string/memcmp.S
Normal file
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* 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>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#if 0
|
||||
RCSID("$NetBSD: memcmp.S,v 1.2 2003/07/26 19:24:39 salo 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
|
Loading…
Reference in New Issue
Block a user