DragonFly BSD
DragonFly submit List (threaded) for 2010-06
[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]

[issue1770] Patch for i386 to use bsrl for libc fls().


From: "Venkatesh Srinivas \(via DragonFly issue tracker\)" <sinknull@xxxxxxxxxxxxxxxxxxxxx>
Date: Fri, 04 Jun 2010 04:38:37 +0000

Venkatesh Srinivas <me@acm.jhu.edu> added the comment:

Correct a whilespace issue when patch is used.

_____________________________________________________
DragonFly issue tracker <bugs@lists.dragonflybsd.org>
<http://bugs.dragonflybsd.org/issue1770>
_____________________________________________________
From caaee745a9a98bb794a5eba928de12ab953073ac Mon Sep 17 00:00:00 2001
From: Venkatesh Srinivas <me@endeavour.zapto.org>
Date: Wed, 26 May 2010 01:08:54 -0400
Subject: [PATCH] libc: Add assembler ffs, ffsl, fls, flsl to i386 and x86_64.

---
 lib/libc/i386/string/Makefile.inc   |    6 ++--
 lib/libc/i386/string/ffs.S          |    4 +++
 lib/libc/i386/string/ffsl.S         |    2 +
 lib/libc/i386/string/fls.S          |   46 +++++++++++++++++++++++++++++++++++
 lib/libc/i386/string/flsl.S         |    2 +
 lib/libc/x86_64/string/Makefile.inc |    4 +-
 lib/libc/x86_64/string/ffs.S        |   38 ++++++++++++++++++++++++++++
 lib/libc/x86_64/string/ffsl.S       |   38 ++++++++++++++++++++++++++++
 lib/libc/x86_64/string/fls.S        |   38 ++++++++++++++++++++++++++++
 lib/libc/x86_64/string/flsl.S       |   38 ++++++++++++++++++++++++++++
 10 files changed, 211 insertions(+), 5 deletions(-)
 create mode 100644 lib/libc/i386/string/ffsl.S
 create mode 100644 lib/libc/i386/string/fls.S
 create mode 100644 lib/libc/i386/string/flsl.S
 create mode 100644 lib/libc/x86_64/string/ffs.S
 create mode 100644 lib/libc/x86_64/string/ffsl.S
 create mode 100644 lib/libc/x86_64/string/fls.S
 create mode 100644 lib/libc/x86_64/string/flsl.S

diff --git a/lib/libc/i386/string/Makefile.inc b/lib/libc/i386/string/Makefile.inc
index 7a1498a..f3494ca 100644
--- a/lib/libc/i386/string/Makefile.inc
+++ b/lib/libc/i386/string/Makefile.inc
@@ -2,6 +2,6 @@
 # $FreeBSD: src/lib/libc/i386/string/Makefile.inc,v 1.9 1999/08/27 23:59:29 peter Exp $
 # $DragonFly: src/lib/libc/i386/string/Makefile.inc,v 1.2 2003/06/17 04:26:43 dillon Exp $
 
-MDSRCS+=bcmp.S bcopy.S bzero.S ffs.S index.S memchr.S memcmp.S memcpy.S \
-	memmove.S memset.S rindex.S strcat.S strchr.S strcmp.S strcpy.S \
-	strlen.S strncmp.S strrchr.S swab.S
+MDSRCS+=bcmp.S bcopy.S bzero.S ffs.S ffsl.S fls.S flsl.S index.S memchr.S \
+	memcmp.S memcpy.S memmove.S memset.S rindex.S strcat.S strchr.S \
+	strcmp.S strcpy.S strlen.S strncmp.S strrchr.S swab.S
diff --git a/lib/libc/i386/string/ffs.S b/lib/libc/i386/string/ffs.S
index 5287a16..dbed8dc 100644
--- a/lib/libc/i386/string/ffs.S
+++ b/lib/libc/i386/string/ffs.S
@@ -44,7 +44,11 @@
  *	J.T. Conklin (jtc@wimsey.com), Winning Strategies, Inc.
  */
 
+#ifdef FFSL
+ENTRY(ffsl)
+#else
 ENTRY(ffs)
+#endif
 	bsfl	4(%esp),%eax
 	jz	L1	 		/* ZF is set if all bits are 0 */
 	incl	%eax			/* bits numbered from 1, not 0 */
diff --git a/lib/libc/i386/string/ffsl.S b/lib/libc/i386/string/ffsl.S
new file mode 100644
index 0000000..afa375b
--- /dev/null
+++ b/lib/libc/i386/string/ffsl.S
@@ -0,0 +1,2 @@
+#define FFSL
+#include "ffs.S"
diff --git a/lib/libc/i386/string/fls.S b/lib/libc/i386/string/fls.S
new file mode 100644
index 0000000..5647bd4
--- /dev/null
+++ b/lib/libc/i386/string/fls.S
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2010 The DragonFly Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software withough specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "DEFS.h"
+
+/*
+ * fls(value)
+ * 	Finds the highest set bit in a word. Bits are numbered from 1;
+ *	a return of 0 indicates that the word was 0.
+ */
+#ifdef FLSL
+ENTRY(flsl)
+#else
+ENTRY(fls)
+#endif
+	bsrl	4(%esp),%eax
+	jz	L1
+	addl	$1,%eax
+	ret
+
+L1:	xorl	%eax, %eax
+	ret
diff --git a/lib/libc/i386/string/flsl.S b/lib/libc/i386/string/flsl.S
new file mode 100644
index 0000000..c06c485
--- /dev/null
+++ b/lib/libc/i386/string/flsl.S
@@ -0,0 +1,2 @@
+#define FLSL
+#include "fls.S"
diff --git a/lib/libc/x86_64/string/Makefile.inc b/lib/libc/x86_64/string/Makefile.inc
index ac585a4..d00b461 100644
--- a/lib/libc/x86_64/string/Makefile.inc
+++ b/lib/libc/x86_64/string/Makefile.inc
@@ -1,4 +1,4 @@
 # $FreeBSD: src/lib/libc/amd64/string/Makefile.inc,v 1.5 2005/04/10 18:58:49 alc Exp $
 
-MDSRCS+= bcmp.S bcopy.S bzero.S memcmp.S memcpy.S memmove.S memset.S \
-	strcat.S strcmp.S strcpy.S
+MDSRCS+= bcmp.S bcopy.S bzero.S ffs.S ffsl.S fls.S flsl.S memcmp.S memcpy.S \
+	memmove.S memset.S strcat.S strcmp.S strcpy.S 
diff --git a/lib/libc/x86_64/string/ffs.S b/lib/libc/x86_64/string/ffs.S
new file mode 100644
index 0000000..6e6eb82
--- /dev/null
+++ b/lib/libc/x86_64/string/ffs.S
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2010 The DragonFly Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software withough specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * ffs(value)
+ * 	Finds the lowest set bit in a word. Bits are numbered from 1;
+ *	a return of 0 indicates that the word was 0.
+ */
+ENTRY(ffs)
+	movl	$-1, %ecx
+	bsfl	%edi,%eax
+	cmovzl	%ecx, %eax
+	addl	$1, %eax
+	ret
diff --git a/lib/libc/x86_64/string/ffsl.S b/lib/libc/x86_64/string/ffsl.S
new file mode 100644
index 0000000..78796cb
--- /dev/null
+++ b/lib/libc/x86_64/string/ffsl.S
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2010 The DragonFly Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software withough specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * ffsl(value)
+ * 	Finds the highest set bit in a word. Bits are numbered from 1;
+ *	a return of 0 indicates that the word was 0.
+ */
+ENTRY(ffsl)
+	movq	$-1, %rcx
+	bsfq	%rdi,%rax
+	cmovzq	%rcx, %rax
+	addq	$1, %rax
+	ret
diff --git a/lib/libc/x86_64/string/fls.S b/lib/libc/x86_64/string/fls.S
new file mode 100644
index 0000000..e716bb6
--- /dev/null
+++ b/lib/libc/x86_64/string/fls.S
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2010 The DragonFly Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software withough specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * fls(value)
+ * 	Finds the highest set bit in a word. Bits are numbered from 1;
+ *	a return of 0 indicates that the word was 0.
+ */
+ENTRY(fls)
+	movl	$-1, %ecx
+	bsrl	%edi,%eax
+	cmovzl	%ecx, %eax
+	addl	$1, %eax
+	ret
diff --git a/lib/libc/x86_64/string/flsl.S b/lib/libc/x86_64/string/flsl.S
new file mode 100644
index 0000000..526404a
--- /dev/null
+++ b/lib/libc/x86_64/string/flsl.S
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2010 The DragonFly Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software withough specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * flsl(value)
+ * 	Finds the highest set bit in a word. Bits are numbered from 1;
+ *	a return of 0 indicates that the word was 0.
+ */
+ENTRY(flsl)
+	movq	$-1, %rcx
+	bsrq	%rdi,%rax
+	cmovzq	%rcx, %rax
+	addq	$1, %rax
+	ret
-- 
1.6.0.4



[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]