This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PING][PATCH 2/2][BZ #16640] Remove strtok assembly implementation.


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)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]