[issue1770] Patch for i386 to use bsrl for libc fls().
Venkatesh Srinivas (via DragonFly issue tracker)
sinknull at leaf.dragonflybsd.org
Thu Jun 3 21:38:50 PDT 2010
Venkatesh Srinivas <me at acm.jhu.edu> added the comment:
Correct a whilespace issue when patch is used.
_____________________________________________________
DragonFly issue tracker <bugs at lists.dragonflybsd.org>
<http://bugs.dragonflybsd.org/issue1770>
_____________________________________________________From caaee745a9a98bb794a5eba928de12ab953073ac Mon Sep 17 00:00:00 2001
From: Venkatesh Srinivas <me at 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 at 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
More information about the Submit
mailing list