From fc39a426c2aec3b97117a0eb114626854f1d0dae Mon Sep 17 00:00:00 2001 From: Mark Seaborn Date: Sun, 28 Dec 2008 17:49:25 +0000 Subject: [PATCH] Remove more assembler files --- sysdeps/i386/i486/strlen.S | 139 --------------------------------- sysdeps/i386/i586/strlen.S | 189 --------------------------------------------- sysdeps/i386/strlen.c | 36 --------- 3 files changed, 364 deletions(-) delete mode 100644 sysdeps/i386/i486/strlen.S delete mode 100644 sysdeps/i386/i586/strlen.S delete mode 100644 sysdeps/i386/strlen.c diff --git a/sysdeps/i386/i486/strlen.S b/sysdeps/i386/i486/strlen.S deleted file mode 100644 index 7557b2d217..0000000000 --- a/sysdeps/i386/i486/strlen.S +++ /dev/null @@ -1,139 +0,0 @@ -/* strlen(str) -- determine the length of the string STR. - Optimized for Intel 80x86, x>=4. - Copyright (C) 1991-1997, 2000, 2003 Free Software Foundation, Inc. - Contributed by Ulrich Drepper . - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#include -#include "asm-syntax.h" -#include "bp-sym.h" -#include "bp-asm.h" - -#define PARMS LINKAGE /* no space for saved regs */ -#define STR PARMS - - .text -ENTRY (BP_SYM (strlen)) - ENTER - - movl STR(%esp), %ecx - CHECK_BOUNDS_LOW (%ecx, STR(%esp)) - movl %ecx, %eax /* duplicate it */ - - andl $3, %ecx /* mask alignment bits */ - jz L(1) /* aligned => start loop */ - cmpb %ch, (%eax) /* is byte NUL? */ - je L(2) /* yes => return */ - incl %eax /* increment pointer */ - - xorl $3, %ecx /* was alignment = 3? */ - jz L(1) /* yes => now it is aligned and start loop */ - cmpb %ch, (%eax) /* is byte NUL? */ - je L(2) /* yes => return */ - addl $1, %eax /* increment pointer */ - - subl $1, %ecx /* was alignment = 2? */ - jz L(1) /* yes => now it is aligned and start loop */ - cmpb %ch, (%eax) /* is byte NUL? */ - je L(2) /* yes => return */ - -/* Don't change the above `addl $1,%eax' and `subl $1, %ecx' into `incl %eax' - and `decl %ecx' resp. The additional two byte per instruction make the - label 4 to be aligned on a 16 byte boundary with nops. - - The following `sub $15, %eax' is part of this trick, too. Together with - the next instruction (`addl $16, %eax') it is in fact a `incl %eax', just - as expected from the algorithm. But doing so has the advantage that - no jump to label 1 is necessary and so the pipeline is not flushed. */ - - subl $15, %eax /* effectively +1 */ - - -L(4): addl $16, %eax /* adjust pointer for full loop */ - -L(1): movl (%eax), %ecx /* get word (= 4 bytes) in question */ - movl $0xfefefeff, %edx /* magic value */ - addl %ecx, %edx /* add the magic value to the word. We get - carry bits reported for each byte which - is *not* 0 */ - jnc L(3) /* highest byte is NUL => return pointer */ - xorl %ecx, %edx /* (word+magic)^word */ - orl $0xfefefeff, %edx /* set all non-carry bits */ - incl %edx /* add 1: if one carry bit was *not* set - the addition will not result in 0. */ - jnz L(3) /* found NUL => return pointer */ - - movl 4(%eax), %ecx /* get word (= 4 bytes) in question */ - movl $0xfefefeff, %edx /* magic value */ - addl %ecx, %edx /* add the magic value to the word. We get - carry bits reported for each byte which - is *not* 0 */ - jnc L(5) /* highest byte is NUL => return pointer */ - xorl %ecx, %edx /* (word+magic)^word */ - orl $0xfefefeff, %edx /* set all non-carry bits */ - incl %edx /* add 1: if one carry bit was *not* set - the addition will not result in 0. */ - jnz L(5) /* found NUL => return pointer */ - - movl 8(%eax), %ecx /* get word (= 4 bytes) in question */ - movl $0xfefefeff, %edx /* magic value */ - addl %ecx, %edx /* add the magic value to the word. We get - carry bits reported for each byte which - is *not* 0 */ - jnc L(6) /* highest byte is NUL => return pointer */ - xorl %ecx, %edx /* (word+magic)^word */ - orl $0xfefefeff, %edx /* set all non-carry bits */ - incl %edx /* add 1: if one carry bit was *not* set - the addition will not result in 0. */ - jnz L(6) /* found NUL => return pointer */ - - movl 12(%eax), %ecx /* get word (= 4 bytes) in question */ - movl $0xfefefeff, %edx /* magic value */ - addl %ecx, %edx /* add the magic value to the word. We get - carry bits reported for each byte which - is *not* 0 */ - jnc L(7) /* highest byte is NUL => return pointer */ - xorl %ecx, %edx /* (word+magic)^word */ - orl $0xfefefeff, %edx /* set all non-carry bits */ - incl %edx /* add 1: if one carry bit was *not* set - the addition will not result in 0. */ - jz L(4) /* no NUL found => continue loop */ - -L(7): addl $4, %eax /* adjust pointer */ -L(6): addl $4, %eax -L(5): addl $4, %eax - -L(3): testb %cl, %cl /* is first byte NUL? */ - jz L(2) /* yes => return */ - incl %eax /* increment pointer */ - - testb %ch, %ch /* is second byte NUL? */ - jz L(2) /* yes => return */ - incl %eax /* increment pointer */ - - testl $0xff0000, %ecx /* is third byte NUL? */ - jz L(2) /* yes => return pointer */ - incl %eax /* increment pointer */ - -L(2): CHECK_BOUNDS_HIGH (%eax, STR(%esp), jb) - subl STR(%esp), %eax /* compute difference to string start */ - - LEAVE - ret -END (BP_SYM (strlen)) -libc_hidden_builtin_def (strlen) diff --git a/sysdeps/i386/i586/strlen.S b/sysdeps/i386/i586/strlen.S deleted file mode 100644 index 9ef22b0c78..0000000000 --- a/sysdeps/i386/i586/strlen.S +++ /dev/null @@ -1,189 +0,0 @@ -/* strlen -- Compute length of NUL terminated string. - Highly optimized version for ix86, x>=5. - Copyright (C) 1995,1996,1997,2000,2002,2003 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper, . - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#include -#include "asm-syntax.h" -#include "bp-sym.h" -#include "bp-asm.h" - -/* This version is especially optimized for the i586 (and following?) - processors. This is mainly done by using the two pipelines. The - version optimized for i486 is weak in this aspect because to get - as much parallelism we have to execute some *more* instructions. - - The code below is structured to reflect the pairing of the instructions - as *I think* it is. I have no processor data book to verify this. - If you find something you think is incorrect let me know. */ - - -/* The magic value which is used throughout in the whole code. */ -#define magic 0xfefefeff - -#define PARMS LINKAGE /* no space for saved regs */ -#define STR PARMS - - .text -ENTRY (BP_SYM (strlen)) - ENTER - - movl STR(%esp), %eax - CHECK_BOUNDS_LOW (%eax, STR(%esp)) - movl $3, %edx /* load mask (= 3) */ - - andl %eax, %edx /* separate last two bits of address */ - - jz L(1) /* aligned => start loop */ - jp L(0) /* exactly two bits set */ - - cmpb %dh, (%eax) /* is byte NUL? */ - je L(2) /* yes => return */ - - incl %eax /* increment pointer */ - cmpb %dh, (%eax) /* is byte NUL? */ - - je L(2) /* yes => return */ - - incl %eax /* increment pointer */ - xorl $2, %edx - - jz L(1) - -L(0): cmpb %dh, (%eax) /* is byte NUL? */ - je L(2) /* yes => return */ - - incl %eax /* increment pointer */ - xorl %edx, %edx /* We need %edx == 0 for later */ - - /* We exit the loop if adding MAGIC_BITS to LONGWORD fails to - change any of the hole bits of LONGWORD. - - 1) Is this safe? Will it catch all the zero bytes? - Suppose there is a byte with all zeros. Any carry bits - propagating from its left will fall into the hole at its - least significant bit and stop. Since there will be no - carry from its most significant bit, the LSB of the - byte to the left will be unchanged, and the zero will be - detected. - - 2) Is this worthwhile? Will it ignore everything except - zero bytes? Suppose every byte of LONGWORD has a bit set - somewhere. There will be a carry into bit 8. If bit 8 - is set, this will carry into bit 16. If bit 8 is clear, - one of bits 9-15 must be set, so there will be a carry - into bit 16. Similarly, there will be a carry into bit - 24. If one of bits 24-31 is set, there will be a carry - into bit 32 (=carry flag), so all of the hole bits will - be changed. - - Note: %edx == 0 in any case here. */ - -L(1): - movl (%eax), %ecx /* get word (= 4 bytes) in question */ - addl $4, %eax /* adjust pointer for *next* word */ - - subl %ecx, %edx /* first step to negate word */ - addl $magic, %ecx /* add magic word */ - - decl %edx /* complete negation of word */ - jnc L(3) /* previous addl caused overflow? */ - - xorl %ecx, %edx /* (word+magic)^word */ - - andl $~magic, %edx /* any of the carry flags set? */ - - jne L(3) /* yes => determine byte */ - - - movl (%eax), %ecx /* get word (= 4 bytes) in question */ - addl $4, %eax /* adjust pointer for *next* word */ - - subl %ecx, %edx /* first step to negate word */ - addl $magic, %ecx /* add magic word */ - - decl %edx /* complete negation of word */ - jnc L(3) /* previous addl caused overflow? */ - - xorl %ecx, %edx /* (word+magic)^word */ - - andl $~magic, %edx /* any of the carry flags set? */ - - jne L(3) /* yes => determine byte */ - - - movl (%eax), %ecx /* get word (= 4 bytes) in question */ - addl $4, %eax /* adjust pointer for *next* word */ - - subl %ecx, %edx /* first step to negate word */ - addl $magic, %ecx /* add magic word */ - - decl %edx /* complete negation of word */ - jnc L(3) /* previous addl caused overflow? */ - - xorl %ecx, %edx /* (word+magic)^word */ - - andl $~magic, %edx /* any of the carry flags set? */ - - jne L(3) /* yes => determine byte */ - - - movl (%eax), %ecx /* get word (= 4 bytes) in question */ - addl $4, %eax /* adjust pointer for *next* word */ - - subl %ecx, %edx /* first step to negate word */ - addl $magic, %ecx /* add magic word */ - - decl %edx /* complete negation of word */ - jnc L(3) /* previous addl caused overflow? */ - - xorl %ecx, %edx /* (word+magic)^word */ - - andl $~magic, %edx /* any of the carry flags set? */ - - je L(1) /* no => start loop again */ - - -L(3): subl $4, %eax /* correct too early pointer increment */ - subl $magic, %ecx - - cmpb $0, %cl /* lowest byte NUL? */ - jz L(2) /* yes => return */ - - inc %eax /* increment pointer */ - testb %ch, %ch /* second byte NUL? */ - - jz L(2) /* yes => return */ - - shrl $16, %ecx /* make upper bytes accessible */ - incl %eax /* increment pointer */ - - cmpb $0, %cl /* is third byte NUL? */ - jz L(2) /* yes => return */ - - incl %eax /* increment pointer */ - -L(2): CHECK_BOUNDS_HIGH (%eax, STR(%esp), jb) - subl STR(%esp), %eax /* now compute the length as difference - between start and terminating NUL - character */ - LEAVE - ret -END (BP_SYM (strlen)) -libc_hidden_builtin_def (strlen) diff --git a/sysdeps/i386/strlen.c b/sysdeps/i386/strlen.c deleted file mode 100644 index 93bf1506ea..0000000000 --- a/sysdeps/i386/strlen.c +++ /dev/null @@ -1,36 +0,0 @@ -/* Determine the length of a string. For Intel 80x86, x>=3. - Copyright (C) 1991,1992,1993,1996,1997,2003 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Torbjorn Granlund (tege@sics.se). - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#include - -size_t -strlen (const char *str) -{ - int cnt; - - asm("cld\n" /* Search forward. */ - /* Some old versions of gas need `repne' instead of `repnz'. */ - "repnz\n" /* Look for a zero byte. */ - "scasb" /* %0, %1, %3 */ : - "=c" (cnt) : "D" (str), "0" (-1), "a" (0)); - - return -2 - cnt; -} -libc_hidden_builtin_def (strlen) -- 2.11.4.GIT