This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PING][PATCH 2/2][BZ #16640] Remove strtok assembly implementation.
- From: OndÅej BÃlka <neleai at seznam dot cz>
- To: libc-alpha at sourceware dot org
- Date: Wed, 5 Mar 2014 10:13:57 +0100
- Subject: [PING][PATCH 2/2][BZ #16640] Remove strtok assembly implementation.
- Authentication-results: sourceware.org; auth=none
- References: <20140227123238 dot GA26291 at domone dot podge> <20140227124206 dot GA26474 at domone dot podge>
ping
On Thu, Feb 27, 2014 at 01:42:06PM +0100, OndÅej BÃlka wrote:
> As followup this patch removes strtok assembly implementation as it is
> around 2-4 times slower on sse4_2 capable machines which is a majority,
> as previous benchtest demonstrated.
>
> You could try to gain some cycles on older machines by using ifuncs but
> is a strtok important enough to complicate matters?
>
> OK to commit?
>
> * sysdeps/i386/i686/strtok.S: Remove.
> * sysdeps/i386/i686/strtok_r.S: Likewise.
> * sysdeps/i386/strtok.S: Likewise.
> * sysdeps/i386/strtok_r.S: Likewise.
> * sysdeps/x86_64/strtok.S: Likewise.
> * sysdeps/x86_64/strtok_r.S: Likewise.
>
> ---
> sysdeps/i386/i686/strtok.S | 244 -----------------------------
> sysdeps/i386/i686/strtok_r.S | 5 -
> sysdeps/i386/strtok.S | 358 -------------------------------------------
> sysdeps/i386/strtok_r.S | 5 -
> sysdeps/x86_64/strtok.S | 208 -------------------------
> sysdeps/x86_64/strtok_r.S | 5 -
> 6 files changed, 825 deletions(-)
> delete mode 100644 sysdeps/i386/i686/strtok.S
> delete mode 100644 sysdeps/i386/i686/strtok_r.S
> delete mode 100644 sysdeps/i386/strtok.S
> delete mode 100644 sysdeps/i386/strtok_r.S
> delete mode 100644 sysdeps/x86_64/strtok.S
> delete mode 100644 sysdeps/x86_64/strtok_r.S
>
> diff --git a/sysdeps/i386/i686/strtok.S b/sysdeps/i386/i686/strtok.S
> deleted file mode 100644
> index 6cb76dc..0000000
> --- a/sysdeps/i386/i686/strtok.S
> +++ /dev/null
> @@ -1,244 +0,0 @@
> -/* strtok (str, delim) -- Return next DELIM separated token from STR.
> - For Intel 80686.
> - Copyright (C) 1998-2014 Free Software Foundation, Inc.
> - This file is part of the GNU C Library.
> - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
> -
> - 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, see
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <sysdep.h>
> -#include "asm-syntax.h"
> -
> -/* This file can be used for three variants of the strtok function:
> -
> - strtok:
> - INPUT PARAMETER:
> - str (sp + 4)
> - delim (sp + 8)
> -
> - strtok_r:
> - INPUT PARAMETER:
> - str (sp + 4)
> - delim (sp + 8)
> - save_ptr (sp + 12)
> -
> - We do a common implementation here. */
> -
> -#ifdef USE_AS_STRTOK_R
> -# define SAVE_PTR 0(%ecx)
> -#else
> - .bss
> - .local save_ptr
> - .type save_ptr, @object
> - .size save_ptr, 4
> -save_ptr:
> - .space 4
> -
> -# ifdef PIC
> -# define SAVE_PTR save_ptr@GOTOFF(%ebx)
> -# else
> -# define SAVE_PTR save_ptr
> -# endif
> -
> -# define FUNCTION strtok
> -#endif
> -
> -#if !defined USE_AS_STRTOK_R && defined PIC
> -# define PARMS 4+256+4 /* space for table and saved PIC register */
> -#else
> -# define PARMS 4+256 /* space for table */
> -#endif
> -#define RTN PARMS
> -#define STR RTN
> -#define DELIM STR+4
> -#ifdef USE_AS_STRTOK_R
> -# define SAVE DELIM+4
> -#endif
> -
> - .text
> -
> -#if !defined USE_AS_STRTOK_R && defined PIC
> -0: movl (%esp), %ebx
> - ret
> -#endif
> -
> -ENTRY (FUNCTION)
> -
> -#if !defined USE_AS_STRTOK_R && defined PIC
> - pushl %ebx /* Save PIC register. */
> - cfi_adjust_cfa_offset (4)
> - cfi_rel_offset (ebx, 0)
> - call 0b
> - addl $_GLOBAL_OFFSET_TABLE_, %ebx
> -#endif
> -
> - /* First we create a table with flags for all possible characters.
> - For the ASCII (7bit/8bit) or ISO-8859-X character sets which are
> - supported by the C string functions we have 256 characters.
> - Before inserting marks for the stop characters we clear the whole
> - table. */
> - movl %edi, %edx
> - subl $256, %esp
> - cfi_adjust_cfa_offset (256)
> - movl $64, %ecx
> - movl %esp, %edi
> - xorl %eax, %eax
> - cld
> - rep
> - stosl
> -
> - /* Note: %ecx = 0 !!! */
> - movl %edx, %edi
> -
> - movl STR(%esp), %edx /* Get start of string. */
> -
> -#ifdef USE_AS_STRTOK_R
> - /* The value is stored in the third argument. */
> - movl SAVE(%esp), %eax
> - movl (%eax), %eax
> -#else
> - /* The value is in the local variable defined above. But
> - we have to take care for PIC code. */
> - movl SAVE_PTR, %eax
> -#endif
> -
> - /* If the pointer is NULL we have to use the stored value of
> - the last run. */
> - cmpl $0, %edx
> - cmove %eax, %edx
> - testl %edx, %edx
> - jz L(returnNULL)
> - movl DELIM(%esp), %eax /* Get start of delimiter set. */
> -
> -/* For understanding the following code remember that %ecx == 0 now.
> - Although all the following instruction only modify %cl we always
> - have a correct zero-extended 32-bit value in %ecx. */
> -
> -L(2): movb (%eax), %cl /* get byte from stopset */
> - testb %cl, %cl /* is NUL char? */
> - jz L(1) /* yes => start compare loop */
> - movb %cl, (%esp,%ecx) /* set corresponding byte in stopset table */
> -
> - movb 1(%eax), %cl /* get byte from stopset */
> - testb $0xff, %cl /* is NUL char? */
> - jz L(1) /* yes => start compare loop */
> - movb %cl, (%esp,%ecx) /* set corresponding byte in stopset table */
> -
> - movb 2(%eax), %cl /* get byte from stopset */
> - testb $0xff, %cl /* is NUL char? */
> - jz L(1) /* yes => start compare loop */
> - movb %cl, (%esp,%ecx) /* set corresponding byte in stopset table */
> -
> - movb 3(%eax), %cl /* get byte from stopset */
> - addl $4, %eax /* increment stopset pointer */
> - movb %cl, (%esp,%ecx) /* set corresponding byte in stopset table */
> - testb $0xff, %cl /* is NUL char? */
> - jnz L(2) /* no => process next dword from stopset */
> -
> -L(1): leal -4(%edx), %eax /* prepare loop */
> -
> - /* We use a neat trick for the following loop. Normally we would
> - have to test for two termination conditions
> - 1. a character in the stopset was found
> - and
> - 2. the end of the string was found
> - As a sign that the character is in the stopset we store its
> - value in the table. The value of NUL is NUL so the loop
> - terminates for NUL in every case. */
> -
> -L(3): addl $4, %eax /* adjust pointer for full loop round */
> -
> - movb (%eax), %cl /* get byte from string */
> - testb %cl, (%esp,%ecx) /* is it contained in stopset? */
> - jz L(4) /* no => start of token */
> -
> - movb 1(%eax), %cl /* get byte from string */
> - testb %cl, (%esp,%ecx) /* is it contained in stopset? */
> - jz L(5) /* no => start of token */
> -
> - movb 2(%eax), %cl /* get byte from string */
> - testb %cl, (%esp,%ecx) /* is it contained in stopset? */
> - jz L(6) /* no => start of token */
> -
> - movb 3(%eax), %cl /* get byte from string */
> - testb %cl, (%esp,%ecx) /* is it contained in stopset? */
> - jnz L(3) /* yes => start of loop */
> -
> - incl %eax /* adjust pointer */
> -L(6): incl %eax
> -L(5): incl %eax
> -
> - /* Now we have to terminate the string. */
> -
> -L(4): leal -4(%eax), %edx /* We use %EDX for the next run. */
> -
> -L(7): addl $4, %edx /* adjust pointer for full loop round */
> -
> - movb (%edx), %cl /* get byte from string */
> - cmpb %cl, (%esp,%ecx) /* is it contained in skipset? */
> - je L(8) /* yes => return */
> -
> - movb 1(%edx), %cl /* get byte from string */
> - cmpb %cl, (%esp,%ecx) /* is it contained in skipset? */
> - je L(9) /* yes => return */
> -
> - movb 2(%edx), %cl /* get byte from string */
> - cmpb %cl, (%esp,%ecx) /* is it contained in skipset? */
> - je L(10) /* yes => return */
> -
> - movb 3(%edx), %cl /* get byte from string */
> - cmpb %cl, (%esp,%ecx) /* is it contained in skipset? */
> - jne L(7) /* no => start loop again */
> -
> - incl %edx /* adjust pointer */
> -L(10): incl %edx
> -L(9): incl %edx
> -
> -L(8): cmpl %eax, %edx
> - je L(returnNULL) /* There was no token anymore. */
> -
> - movb $0, (%edx) /* Terminate string. */
> -
> - /* Are we at end of string? */
> - cmpb $0, %cl
> - leal 1(%edx), %ecx
> - cmovne %ecx, %edx
> -
> - /* Store the pointer to the next character. */
> -#ifdef USE_AS_STRTOK_R
> - movl SAVE(%esp), %ecx
> -#endif
> - movl %edx, SAVE_PTR
> -
> -L(epilogue):
> - /* Remove the stopset table. */
> - addl $256, %esp
> - cfi_adjust_cfa_offset (-256)
> -#if !defined USE_AS_STRTOK_R && defined PIC
> - popl %ebx
> - cfi_adjust_cfa_offset (-4)
> - cfi_restore (ebx)
> -#endif
> - ret
> -
> -L(returnNULL):
> - xorl %eax, %eax
> -#ifdef USE_AS_STRTOK_R
> - movl SAVE(%esp), %ecx
> -#endif
> - movl %edx, SAVE_PTR
> - jmp L(epilogue)
> -
> -END (FUNCTION)
> diff --git a/sysdeps/i386/i686/strtok_r.S b/sysdeps/i386/i686/strtok_r.S
> deleted file mode 100644
> index 353e076..0000000
> --- a/sysdeps/i386/i686/strtok_r.S
> +++ /dev/null
> @@ -1,5 +0,0 @@
> -#define FUNCTION __strtok_r
> -#define USE_AS_STRTOK_R 1
> -#include <sysdeps/i386/i686/strtok.S>
> -weak_alias (__strtok_r, strtok_r)
> -strong_alias (__strtok_r, __GI___strtok_r)
> diff --git a/sysdeps/i386/strtok.S b/sysdeps/i386/strtok.S
> deleted file mode 100644
> index 70ec8bb..0000000
> --- a/sysdeps/i386/strtok.S
> +++ /dev/null
> @@ -1,358 +0,0 @@
> -/* strtok (str, delim) -- Return next DELIM separated token from STR.
> - For Intel 80x86, x>=3.
> - Copyright (C) 1996-2014 Free Software Foundation, Inc.
> - This file is part of the GNU C Library.
> - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
> -
> - 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, see
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <sysdep.h>
> -#include "asm-syntax.h"
> -
> -/* This file can be used for three variants of the strtok function:
> -
> - strtok:
> - INPUT PARAMETER:
> - str (sp + 4)
> - delim (sp + 8)
> -
> - strtok_r:
> - INPUT PARAMETER:
> - str (sp + 4)
> - delim (sp + 8)
> - save_ptr (sp + 12)
> -
> - We do a common implementation here. */
> -
> -#ifdef USE_AS_STRTOK_R
> -# define SAVE_PTR 0(%ecx)
> -#else
> - .bss
> - .local save_ptr
> - .type save_ptr, @object
> - .size save_ptr, 4
> -save_ptr:
> - .space 4
> -
> -# ifdef PIC
> -# define SAVE_PTR save_ptr@GOTOFF(%ebx)
> -# else
> -# define SAVE_PTR save_ptr
> -# endif
> -
> -# define FUNCTION strtok
> -#endif
> -
> -#define PARMS 4 /* no space for saved regs */
> -#define RTN PARMS
> -#define STR RTN
> -#define DELIM STR+4
> -#define SAVE DELIM+4
> -
> - .text
> -ENTRY (FUNCTION)
> -
> - movl STR(%esp), %edx
> - movl DELIM(%esp), %eax
> -
> -#if !defined USE_AS_STRTOK_R && defined PIC
> - pushl %ebx /* Save PIC register. */
> - cfi_adjust_cfa_offset (4)
> - call L(here)
> - cfi_adjust_cfa_offset (4)
> - cfi_rel_offset (ebx, 0)
> -L(here):
> - popl %ebx
> - cfi_adjust_cfa_offset (-4)
> - addl $_GLOBAL_OFFSET_TABLE_+[.-L(here)], %ebx
> -#endif
> -
> - /* If the pointer is NULL we have to use the stored value of
> - the last run. */
> - cmpl $0, %edx
> - jne L(1)
> -
> -#ifdef USE_AS_STRTOK_R
> - /* The value is stored in the third argument. */
> - movl SAVE(%esp), %edx
> - movl (%edx), %edx
> -#else
> - /* The value is in the local variable defined above. But
> - we have to take care for PIC code. */
> - movl SAVE_PTR, %edx
> -#endif
> - testl %edx, %edx
> - jz L(returnNULL)
> -
> -L(1):
> - /* First we create a table with flags for all possible characters.
> - For the ASCII (7bit/8bit) or ISO-8859-X character sets which are
> - supported by the C string functions we have 256 characters.
> - Before inserting marks for the stop characters we clear the whole
> - table. The unrolled form is much faster than a loop. */
> - xorl %ecx, %ecx /* %ecx = 0 !!! */
> -
> - pushl %ecx /* make a 256 bytes long block filled with 0 */
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl %ecx
> - cfi_adjust_cfa_offset (4)
> - pushl $0 /* These immediate values make the label 2 */
> - cfi_adjust_cfa_offset (4)
> - pushl $0 /* to be aligned on a 16 byte boundary to */
> - cfi_adjust_cfa_offset (4)
> - pushl $0 /* get a better performance of the loop. */
> - cfi_adjust_cfa_offset (4)
> - pushl $0
> - cfi_adjust_cfa_offset (4)
> - pushl $0
> - cfi_adjust_cfa_offset (4)
> - pushl $0
> - cfi_adjust_cfa_offset (4)
> -
> -/* For understanding the following code remember that %ecx == 0 now.
> - Although all the following instruction only modify %cl we always
> - have a correct zero-extended 32-bit value in %ecx. */
> -
> -L(2): movb (%eax), %cl /* get byte from stopset */
> - testb %cl, %cl /* is NUL char? */
> - jz L(1_1) /* yes => start compare loop */
> - movb %cl, (%esp,%ecx) /* set corresponding byte in stopset table */
> -
> - movb 1(%eax), %cl /* get byte from stopset */
> - testb $0xff, %cl /* is NUL char? */
> - jz L(1_1) /* yes => start compare loop */
> - movb %cl, (%esp,%ecx) /* set corresponding byte in stopset table */
> -
> - movb 2(%eax), %cl /* get byte from stopset */
> - testb $0xff, %cl /* is NUL char? */
> - jz L(1_1) /* yes => start compare loop */
> - movb %cl, (%esp,%ecx) /* set corresponding byte in stopset table */
> -
> - movb 3(%eax), %cl /* get byte from stopset */
> - addl $4, %eax /* increment stopset pointer */
> - movb %cl, (%esp,%ecx) /* set corresponding byte in stopset table */
> - testb $0xff, %cl /* is NUL char? */
> - jnz L(2) /* no => process next dword from stopset */
> -
> -L(1_1): leal -4(%edx), %eax /* prepare loop */
> -
> - /* We use a neat trick for the following loop. Normally we would
> - have to test for two termination conditions
> - 1. a character in the stopset was found
> - and
> - 2. the end of the string was found
> - As a sign that the character is in the stopset we store its
> - value in the table. The value of NUL is NUL so the loop
> - terminates for NUL in every case. */
> -
> -L(3): addl $4, %eax /* adjust pointer for full loop round */
> -
> - movb (%eax), %cl /* get byte from string */
> - testb %cl, (%esp,%ecx) /* is it contained in stopset? */
> - jz L(4) /* no => start of token */
> -
> - movb 1(%eax), %cl /* get byte from string */
> - testb %cl, (%esp,%ecx) /* is it contained in stopset? */
> - jz L(5) /* no => start of token */
> -
> - movb 2(%eax), %cl /* get byte from string */
> - testb %cl, (%esp,%ecx) /* is it contained in stopset? */
> - jz L(6) /* no => start of token */
> -
> - movb 3(%eax), %cl /* get byte from string */
> - testb %cl, (%esp,%ecx) /* is it contained in stopset? */
> - jnz L(3) /* yes => start of loop */
> -
> - incl %eax /* adjust pointer */
> -L(6): incl %eax
> -L(5): incl %eax
> -
> - /* Now we have to terminate the string. */
> -
> -L(4): leal -4(%eax), %edx /* We use %EDX for the next run. */
> -
> -L(7): addl $4, %edx /* adjust pointer for full loop round */
> -
> - movb (%edx), %cl /* get byte from string */
> - cmpb %cl, (%esp,%ecx) /* is it contained in skipset? */
> - je L(8) /* yes => return */
> -
> - movb 1(%edx), %cl /* get byte from string */
> - cmpb %cl, (%esp,%ecx) /* is it contained in skipset? */
> - je L(9) /* yes => return */
> -
> - movb 2(%edx), %cl /* get byte from string */
> - cmpb %cl, (%esp,%ecx) /* is it contained in skipset? */
> - je L(10) /* yes => return */
> -
> - movb 3(%edx), %cl /* get byte from string */
> - cmpb %cl, (%esp,%ecx) /* is it contained in skipset? */
> - jne L(7) /* no => start loop again */
> -
> - incl %edx /* adjust pointer */
> -L(10): incl %edx
> -L(9): incl %edx
> -
> -L(8): /* Remove the stopset table. */
> - addl $256, %esp
> - cfi_adjust_cfa_offset (-256)
> -
> - cmpl %eax, %edx
> - je L(returnNULL) /* There was no token anymore. */
> -
> - movb $0, (%edx) /* Terminate string. */
> -
> - /* Are we at end of string? */
> - cmpb $0, %cl
> - je L(11)
> -
> - incl %edx
> -L(11):
> -
> - /* Store the pointer to the next character. */
> -#ifdef USE_AS_STRTOK_R
> - movl SAVE(%esp), %ecx
> -#endif
> - movl %edx, SAVE_PTR
> -
> -L(epilogue):
> -#if !defined USE_AS_STRTOK_R && defined PIC
> - popl %ebx
> - cfi_adjust_cfa_offset (-4)
> - cfi_restore (ebx)
> -#endif
> - ret
> -
> -L(returnNULL):
> - xorl %eax, %eax
> -#ifdef USE_AS_STRTOK_R
> - movl SAVE(%esp), %ecx
> -#endif
> - movl %edx, SAVE_PTR
> - jmp L(epilogue)
> -
> -END (FUNCTION)
> diff --git a/sysdeps/i386/strtok_r.S b/sysdeps/i386/strtok_r.S
> deleted file mode 100644
> index 5087293..0000000
> --- a/sysdeps/i386/strtok_r.S
> +++ /dev/null
> @@ -1,5 +0,0 @@
> -#define FUNCTION __strtok_r
> -#define USE_AS_STRTOK_R 1
> -#include <sysdeps/i386/strtok.S>
> -weak_alias (__strtok_r, strtok_r)
> -strong_alias (__strtok_r, __GI___strtok_r)
> diff --git a/sysdeps/x86_64/strtok.S b/sysdeps/x86_64/strtok.S
> deleted file mode 100644
> index bb5ba2e..0000000
> --- a/sysdeps/x86_64/strtok.S
> +++ /dev/null
> @@ -1,208 +0,0 @@
> -/* strtok (str, delim) -- Return next DELIM separated token from STR.
> - For AMD x86-64.
> - Copyright (C) 1998-2014 Free Software Foundation, Inc.
> - This file is part of the GNU C Library.
> - Based on i686 version contributed by Ulrich Drepper
> - <drepper@cygnus.com>, 1998.
> -
> - 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, see
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <sysdep.h>
> -#include "asm-syntax.h"
> -
> -/* This file can be used for the strtok and strtok_r functions:
> -
> - strtok:
> - INPUT PARAMETER:
> - str %rdi
> - delim %rsi
> -
> - strtok_r:
> - INPUT PARAMETER:
> - str %rdi
> - delim %rsi
> - save_ptr %rdx
> -
> - We do a common implementation here. */
> -
> -#ifdef USE_AS_STRTOK_R
> -# define SAVE_PTR (%r9)
> -#else
> - .bss
> - .local save_ptr
> - .type save_ptr, @object
> - .size save_ptr, LP_SIZE
> -save_ptr:
> - .space LP_SIZE
> -
> -# ifdef PIC
> -# define SAVE_PTR save_ptr(%rip)
> -# else
> -# define SAVE_PTR save_ptr
> -# endif
> -
> -# define FUNCTION strtok
> -#endif
> -
> - .text
> -ENTRY (FUNCTION)
> - /* First we create a table with flags for all possible characters.
> - For the ASCII (7bit/8bit) or ISO-8859-X character sets which are
> - supported by the C string functions we have 256 characters.
> - Before inserting marks for the stop characters we clear the whole
> - table. */
> - movq %rdi, %r8 /* Save value. */
> - subq $256, %rsp /* Make space for 256 bytes. */
> - cfi_adjust_cfa_offset(256)
> - movl $32, %ecx /* 32*8 bytes = 256 bytes. */
> - movq %rsp, %rdi
> - xorl %eax, %eax /* We store 0s. */
> - cld
> - rep
> - stosq
> -
> - /* Note: %rcx = 0 !!! */
> -
> -#ifdef USE_AS_STRTOK_R
> - /* The value is stored in the third argument. */
> - mov %RDX_LP, %R9_LP /* Save value - see def. of SAVE_PTR. */
> - mov (%rdx), %RAX_LP
> -#else
> - /* The value is in the local variable defined above. But
> - we have to take care for PIC code. */
> - mov SAVE_PTR, %RAX_LP
> -#endif
> - movq %r8, %rdx /* Get start of string. */
> -
> - /* If the pointer is NULL we have to use the stored value of
> - the last run. */
> - cmpq $0, %rdx
> - cmove %rax, %rdx
> - testq %rdx, %rdx
> - jz L(returnNULL)
> - movq %rsi, %rax /* Get start of delimiter set. */
> -
> -/* For understanding the following code remember that %rcx == 0 now.
> - Although all the following instruction only modify %cl we always
> - have a correct zero-extended 64-bit value in %rcx. */
> -
> -L(2): movb (%rax), %cl /* get byte from stopset */
> - testb %cl, %cl /* is NUL char? */
> - jz L(1) /* yes => start compare loop */
> - movb %cl, (%rsp,%rcx) /* set corresponding byte in stopset table */
> -
> - movb 1(%rax), %cl /* get byte from stopset */
> - testb $0xff, %cl /* is NUL char? */
> - jz L(1) /* yes => start compare loop */
> - movb %cl, (%rsp,%rcx) /* set corresponding byte in stopset table */
> -
> - movb 2(%rax), %cl /* get byte from stopset */
> - testb $0xff, %cl /* is NUL char? */
> - jz L(1) /* yes => start compare loop */
> - movb %cl, (%rsp,%rcx) /* set corresponding byte in stopset table */
> -
> - movb 3(%rax), %cl /* get byte from stopset */
> - addq $4, %rax /* increment stopset pointer */
> - movb %cl, (%rsp,%rcx) /* set corresponding byte in stopset table */
> - testb $0xff, %cl /* is NUL char? */
> - jnz L(2) /* no => process next dword from stopset */
> -
> -L(1):
> -
> - leaq -4(%rdx), %rax /* prepare loop */
> -
> - /* We use a neat trick for the following loop. Normally we would
> - have to test for two termination conditions
> - 1. a character in the stopset was found
> - and
> - 2. the end of the string was found
> - As a sign that the character is in the stopset we store its
> - value in the table. The value of NUL is NUL so the loop
> - terminates for NUL in every case. */
> -
> -L(3): addq $4, %rax /* adjust pointer for full loop round */
> -
> - movb (%rax), %cl /* get byte from string */
> - testb %cl, (%rsp,%rcx) /* is it contained in stopset? */
> - jz L(4) /* no => start of token */
> -
> - movb 1(%rax), %cl /* get byte from string */
> - testb %cl, (%rsp,%rcx) /* is it contained in stopset? */
> - jz L(5) /* no => start of token */
> -
> - movb 2(%rax), %cl /* get byte from string */
> - testb %cl, (%rsp,%rcx) /* is it contained in stopset? */
> - jz L(6) /* no => start of token */
> -
> - movb 3(%rax), %cl /* get byte from string */
> - testb %cl, (%rsp,%rcx) /* is it contained in stopset? */
> - jnz L(3) /* yes => start of loop */
> -
> - incq %rax /* adjust pointer */
> -L(6): incq %rax
> -L(5): incq %rax
> -
> - /* Now we have to terminate the string. */
> -
> -L(4): leaq -4(%rax), %rdx /* We use %rDX for the next run. */
> -
> -L(7): addq $4, %rdx /* adjust pointer for full loop round */
> -
> - movb (%rdx), %cl /* get byte from string */
> - cmpb %cl, (%rsp,%rcx) /* is it contained in skipset? */
> - je L(8) /* yes => return */
> -
> - movb 1(%rdx), %cl /* get byte from string */
> - cmpb %cl, (%rsp,%rcx) /* is it contained in skipset? */
> - je L(9) /* yes => return */
> -
> - movb 2(%rdx), %cl /* get byte from string */
> - cmpb %cl, (%rsp,%rcx) /* is it contained in skipset? */
> - je L(10) /* yes => return */
> -
> - movb 3(%rdx), %cl /* get byte from string */
> - cmpb %cl, (%rsp,%rcx) /* is it contained in skipset? */
> - jne L(7) /* no => start loop again */
> -
> - incq %rdx /* adjust pointer */
> -L(10): incq %rdx
> -L(9): incq %rdx
> -
> -L(8): cmpq %rax, %rdx
> - je L(returnNULL) /* There was no token anymore. */
> -
> - movb $0, (%rdx) /* Terminate string. */
> -
> - /* Are we at end of string? */
> - cmpb $0, %cl
> - leaq 1(%rdx), %rcx
> - cmovne %rcx, %rdx
> -
> - /* Store the pointer to the next character. */
> - mov %RDX_LP, SAVE_PTR
> -
> -L(epilogue):
> - /* Remove the stopset table. */
> - addq $256, %rsp
> - cfi_adjust_cfa_offset(-256)
> - retq
> -
> -L(returnNULL):
> - xorl %eax, %eax
> - /* Store the pointer to the next character. */
> - mov %RDX_LP, SAVE_PTR
> - jmp L(epilogue)
> -
> -END (FUNCTION)
> diff --git a/sysdeps/x86_64/strtok_r.S b/sysdeps/x86_64/strtok_r.S
> deleted file mode 100644
> index f0db78c..0000000
> --- a/sysdeps/x86_64/strtok_r.S
> +++ /dev/null
> @@ -1,5 +0,0 @@
> -#define FUNCTION __strtok_r
> -#define USE_AS_STRTOK_R 1
> -#include <sysdeps/x86_64/strtok.S>
> -weak_alias (__strtok_r, strtok_r)
> -strong_alias (__strtok_r, __GI___strtok_r)
> --
> 1.8.4.rc3
--
It must have been the lightning storm we had (yesterday) (last week) (last month)