From caaee745a9a98bb794a5eba928de12ab953073ac Mon Sep 17 00:00:00 2001 From: Venkatesh Srinivas 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