glibc/sysdeps/i386/strtok.S
Roland McGrath 76060ec0b8 Thu May 30 11:24:05 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* po/header.pot: Replace with exact boilerplate pinard dictates.

	* sysdeps/i386/strtok.S (Lillegal_argument): Remove this code to set
	errno and the check that jumped to it.

	* sysdeps/mach/hurd/Makefile (errnos.d): Use $(sed-remove-objpfx).

Thu May 30 03:21:57 1996  Ulrich Drepper  <drepper@cygnus.com>

	* FAQ: Document need of gperf program for developers.

	* elf/elf.h: Fix typos in comments.

	* libio/stdio.h [!__STRICT_ANSI__ || _POSIX_SOURCE]: Add
        prototypes for `ctermid' and `cuserid'.

	* locale/programs/locale.c: Switch to user selected locale
	before printing variables.

	* math/Makefile [$(long-double-fcts)==yes]: Define long-m-routines
        and long-c-routines.  Only if the `long double' data type is
        available we need to compile the functions.
	(libm-routines): Add $(long-m-routines).
	(routines): Remove isinfl, isnanl.  Use new file s_isinfl and
	s_isnanl instead if `long double' is available.

	* math/math.h: Include <mathcalls.h> again to define `long double'
        functions.

	* math/math_private.h: Define data types, prototypes and access
        macros for `long double'.

	* stdlib/stdlib.h: Add prototypes for `strtoll' and `strtoull'.
	[GCC2 && OPTIMIZE]: Define strto{,u}ll as inline function which
	calls __strto{,u}q_internal.

	* stdlib/strfmon.c: Replace PTR by `void *'.

	* stdlib/strtoq.c: Define strtoll as weak alias.
	* stdlib/strtouq.c: Define strtoull as weak alias.

	* string/tester.c: Correct `strsep' test.

	* sysdeps/generic/strsep.c: Make compatible with BSD version.
        Trailing characters of skip set are not skipped.  In this case
        empty tokens are returned.

	* sysdeps/i386/isinfl.c, sysdeps/i386/isnanl.c,
        sysdeps/ieee754/isinf.c, sysdeps/ieee754/isinfl.c,
        sysdeps/ieee754/isnan.c, sysdeps/ieee754/isnanl.c: Removed.  We
        now use the versions part of libm.

	* sysdeps/i386/strsep.S: Removed.  Generic C version is of
	similar speed.
	* sysdeps/i386/strtok.S: Remove support for `strsep'.

	* sysdeps/libm-i387/e_acosl.S, sysdeps/libm-i387/s_ceill.S,
        sysdeps/libm-i387/s_copysignl.S, sysdeps/libm-i387/s_finitel.S,
        sysdeps/libm-i387/s_floorl.S, sysdeps/libm-i387/s_isinfl.c,
        sysdeps/libm-i387/s_isnanl.c, sysdeps/libm-i387/s_nextafterl.c,
        sysdeps/libm-i387/s_rintl.S, sysdeps/libm-i387/s_significandl.S:
        New i387 specific math functions implementing `long double'
        versions.

	* sysdeps/libm-ieee754/s_ceill.c,
        sysdeps/libm-ieee754/s_copysignl.c,
        sysdeps/libm-ieee754/s_fabsl.c, sysdeps/libm-ieee754/s_finitel.c,
        sysdeps/libm-ieee754/s_floorl.c, sysdeps/libm-ieee754/s_isinfl.c,
        sysdeps/libm-ieee754/s_isnanl.c,
        sysdeps/libm-ieee754/s_nextafterl.c,
        sysdeps/libm-ieee754/s_rintl.c, sysdeps/libm-ieee754/s_scalbnl.c,
        sysdeps/libm-ieee754/s_significandl.c: New generic `long double'
        versions of libm functions.

	* sysdeps/libm-i387/e_exp.S: Add a few comments to explain the
        Intel FPU nonsense.

	* sysdeps/libm-i387/s_ceil.S, sysdeps/libm-i387/s_ceilf.S,
        sysdeps/libm-i387/s_floor.S, sysdeps/libm-i387/s_floorf.S: Correct
        handling of local variables.  The old version created a stack
        frame but stored the values outside.

	* sysdeps/libm-ieee754/s_isinf.c, sysdeps/libm-ieee754/s_isnan.c
        [!NO_LONG_DOUBLE]: Define alias with `long double' versions name.

	* login/pututline_r.c: Include sys/stat.h.  Fix typos.

        according to currently used locale for category LC_CTYPE by
	inet_nsap_ntoa.  Now in <arpa/inet.h>.
        _IO_dup2 to contain complete parameter list.
1996-05-30 16:12:42 +00:00

285 lines
6.9 KiB
ArmAsm

/* strtok (str, delim) -- Return next DELIM separated token from STR.
For Intel 80x86, x>=3.
Copyright (C) 1996 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 Library General Public License as
published by the Free Software Foundation; either version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <sysdep.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. */
#ifndef USE_AS_STRTOK_R
.bss
.local save_ptr
ASM_TYPE_DIRECTIVE (save_ptr, @object)
.size save_ptr, 4
save_ptr:
.space 4
#define FUNCTION strtok
#endif
.text
ENTRY (FUNCTION)
movl 4(%esp), %edx /* Get start of string. */
movl 8(%esp), %eax /* Get start of delimiter set. */
#if !defined (USE_AS_STRTOK_R) && defined (PIC)
pushl %ebx /* Save PIC register. */
call Lhere
Lhere: popl %ebx
addl $_GLOBAL_OFFSET_TABLE_+[.-Lhere], %ebx
#endif
/* If the pointer is NULL we have to use the stored value of
the last run. */
cmpl $0, %edx
jne L0
#ifdef USE_AS_STRTOK_R
/* The value is stored in the third argument. */
movl 12(%esp), %edx
movl (%edx), %edx
#else
/* The value is in the local variable defined above. But
we have to take care for PIC code. */
# ifndef PIC
movl save_ptr, %edx
# else
movl save_ptr@GOTOFF(%ebx), %edx
# endif
#endif
L0:
/* 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 */
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl %ecx
pushl $0 /* These immediate values make the label 2 */
pushl $0 /* to be aligned on a 16 byte boundary to */
pushl $0 /* get a better performance of the loop. */
pushl $0
pushl $0
pushl $0
/* 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. */
L2: movb (%eax), %cl /* get byte from stopset */
testb %cl, %cl /* is NUL char? */
jz L1 /* 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 L1 /* 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 L1 /* 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 L2 /* no => process next dword from stopset */
L1: 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. */
L3: 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 L4 /* no => start of token */
movb 1(%eax), %cl /* get byte from string */
testb %cl, (%esp,%ecx) /* is it contained in stopset? */
jz L5 /* no => start of token */
movb 2(%eax), %cl /* get byte from string */
testb %cl, (%esp,%ecx) /* is it contained in stopset? */
jz L6 /* no => start of token */
movb 3(%eax), %cl /* get byte from string */
testb %cl, (%esp,%ecx) /* is it contained in stopset? */
jnz L3 /* yes => start of loop */
incl %eax /* adjust pointer */
L6: incl %eax
L5: incl %eax
/* Now we have to terminate the string. */
L4: leal -4(%eax), %edx /* We use %EDX for the next run. */
L7: 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 L8 /* yes => return */
movb 1(%edx), %cl /* get byte from string */
cmpb %cl, (%esp,%ecx) /* is it contained in skipset? */
je L9 /* yes => return */
movb 2(%edx), %cl /* get byte from string */
cmpb %cl, (%esp,%ecx) /* is it contained in skipset? */
je L10 /* yes => return */
movb 3(%edx), %cl /* get byte from string */
cmpb %cl, (%esp,%ecx) /* is it contained in skipset? */
jne L7 /* no => start loop again */
incl %edx /* adjust pointer */
L10: incl %edx
L9: incl %edx
L8: /* Remove the stopset table. */
addl $256, %esp
cmpl %eax, %edx
je LreturnNULL /* There was no token anymore. */
movb $0, (%edx) /* Terminate string. */
/* Are we at end of string? */
cmpb $0, %cl
je L11
incl %edx
L11:
/* Store the pointer to the next character. */
#ifdef USE_AS_STRTOK_R
movl 12(%esp), %ecx
movl %edx, (%ecx)
#else
# ifndef PIC
movl %edx, save_ptr
# else
movl %edx, save_ptr@GOTOFF(%ebx)
popl %ebx
# endif
#endif
ret
LreturnNULL:
xorl %eax, %eax
/* Store NULL as pointer to the next character. */
#ifdef USE_AS_STRTOK_R
movl 12(%esp), %ecx
movl %eax, (%ecx)
#else
# ifndef PIC
movl %eax, save_ptr
# else
movl %eax, save_ptr@GOTOFF(%ebx)
popl %ebx
# endif
#endif
ret