Wed Mar 27 14:52:11 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>

* elf/rtld.c (dl_main): Call _dl_sysdep_start_cleanup after
	_dl_relocate_object loop.  Avoid relocating RTLD_MAP in that loop, and
	do it individually if necessary after _dl_sysdep_start_cleanup call.

	* stdlib/Makefile (mpn-routines): Add divrem.

Tue Mar 26 22:54:14  Ulrich Drepper  <drepper@gnu.ai.mit.edu>

	* stdio-common/printf_fp.c (__printf_fp): Use mpn_divmod
	instead of __mpn_divmod.

Wed Mar 27 10:26:21 1996  David Mosberger-Tang  <davidm@azstarnet.com>

	* sysdeps/alpha/setjmp.S: Must establish global pointer before
 	address of __sigsetjmp_aux can be loaded.

Wed Mar 27 02:23:19 1996 Ulrich Drepper <drepper@gnu.ai.mit.edu>

	* sysdeps/i386/i586/memset.S: New file.  Highly optimized
	version for i586 contributed by Torbjorn Granlund.
	Adapted for use as bzero.
	* sysdeps/i386/i586/bzero.S: Use sysdeps/i386/i586/memset.S
	code to implement bzero().

Tue Mar 26 20:01:17 1996  Roland McGrath  <roland@charlie-brown.gnu.ai.mit.edu>

	* stdlib/Makefile (mpn-routines): Remove divmod.
This commit is contained in:
Roland McGrath 1996-03-27 23:23:59 +00:00
parent 3ef987a23c
commit 53f770e0f9
7 changed files with 158 additions and 11 deletions

View File

@ -1,3 +1,33 @@
Wed Mar 27 14:52:11 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
* elf/rtld.c (dl_main): Call _dl_sysdep_start_cleanup after
_dl_relocate_object loop. Avoid relocating RTLD_MAP in that loop, and
do it individually if necessary after _dl_sysdep_start_cleanup call.
* stdlib/Makefile (mpn-routines): Add divrem.
Tue Mar 26 22:54:14 Ulrich Drepper <drepper@gnu.ai.mit.edu>
* stdio-common/printf_fp.c (__printf_fp): Use mpn_divmod
instead of __mpn_divmod.
Wed Mar 27 10:26:21 1996 David Mosberger-Tang <davidm@azstarnet.com>
* sysdeps/alpha/setjmp.S: Must establish global pointer before
address of __sigsetjmp_aux can be loaded.
Wed Mar 27 02:23:19 1996 Ulrich Drepper <drepper@gnu.ai.mit.edu>
* sysdeps/i386/i586/memset.S: New file. Highly optimized
version for i586 contributed by Torbjorn Granlund.
Adapted for use as bzero.
* sysdeps/i386/i586/bzero.S: Use sysdeps/i386/i586/memset.S
code to implement bzero().
Tue Mar 26 20:01:17 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
* stdlib/Makefile (mpn-routines): Remove divmod.
Tue Mar 26 15:40:14 1996 Brendan Kehoe <brendan@zen.org>
* sysdeps/unix/sysv/sysv4/solaris2/sparc/sysdep.h (NO_UNDERSCORES): Use

View File

@ -339,23 +339,36 @@ of this helper program; chances are you did not intend to run this program.\n",
lazy = !_dl_secure && *(getenv ("LD_BIND_NOW") ?: "") == '\0';
/* Do any necessary cleanups for the startup OS interface code.
We do these now so that no calls are made after real relocation
which might be resolved to different functions than we expect. */
_dl_sysdep_start_cleanup ();
/* Now we have all the objects loaded. Relocate them all.
We do this in reverse order so that copy relocs of earlier
objects overwrite the data written by later objects. */
/* Now we have all the objects loaded. Relocate them all except for
the dynamic linker itself. We do this in reverse order so that
copy relocs of earlier objects overwrite the data written by later
objects. We do not re-relocate the dynamic linker itself in this
loop because that could result in the GOT entries for functions we
call being changed, and that would break us. It is safe to
relocate the dynamic linker out of order because it has no copy
relocs (we know that because it is self-contained). */
l = _dl_loaded;
while (l->l_next)
l = l->l_next;
do
{
_dl_relocate_object (l, lazy);
if (l != &rtld_map)
_dl_relocate_object (l, lazy);
l = l->l_prev;
} while (l);
/* Do any necessary cleanups for the startup OS interface code.
We do these now so that no calls are made after rtld re-relocation
which might be resolved to different functions than we expect.
We cannot do this before relocating the other objects because
_dl_relocate_object might need to call `mprotect' for DT_TEXTREL. */
_dl_sysdep_start_cleanup ();
if (rtld_map.l_opencount > 0)
/* There was an explicit ref to the dynamic linker as a shared lib.
Re-relocate ourselves with user-controlled symbol definitions. */
_dl_relocate_object (&rtld_map, lazy);
/* Tell the debugger where to find the map of loaded objects. */
dl_r_debug.r_version = 1 /* R_DEBUG_VERSION XXX */;
dl_r_debug.r_ldbase = rtld_map.l_addr; /* Record our load address. */

View File

@ -204,7 +204,7 @@ __printf_fp (FILE *fp,
hi = 0;
else
{
hi = __mpn_divmod (tmp, frac, fracsize, scale, scalesize);
hi = mpn_divmod (tmp, frac, fracsize, scale, scalesize);
tmp[fracsize - scalesize] = hi;
hi = tmp[0];

View File

@ -49,7 +49,7 @@ tests := tst-strtol tst-strtod testmb testrand testsort testdiv
# Several mpn functions from GNU MP are used by the strtod function.
mpn-routines := add_1 add_n addmul_1 cmp divmod divmod_1 udiv_qrnnd \
mpn-routines := add_1 add_n addmul_1 cmp divrem divmod_1 udiv_qrnnd \
lshift rshift mod_1 mul mul_1 mul_n sub_n submul_1
mpn-headers = longlong.h gmp.h gmp-impl.h gmp-mparam.h asm-syntax.h

View File

@ -22,6 +22,7 @@ Cambridge, MA 02139, USA. */
reliably access the stack or frame pointers, so we pass them in as
extra arguments. */
ENTRY (__sigsetjmp)
ldgp $29, 0($27)
lda $27, __sigsetjmp_aux/* Load address to jump to. */
bis $30, $30, $18 /* Pass SP as 3rd arg. */
bis $15, $15, $19 /* Pass FP as 4th arg. */

View File

@ -0,0 +1,2 @@
#define memset bzero
#include <sysdeps/i386/i586/memset.S>

101
sysdeps/i386/i586/memset.S Normal file
View File

@ -0,0 +1,101 @@
/* memset/bzero -- set memory area to CH/0
Highly optimized version for ix85, x>=5.
Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Torbjorn Granlund, <tege@matematik.su.se>
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>
/*
INPUT PARAMETERS:
(memset) (bzero)
dst (sp + 4) dst (sp + 4)
ch (sp + 8) len (sp + 8)
len (sp + 12)
*/
.text
ENTRY (memset)
pushl %edi
movl 8(%esp), %edi /* destination pointer */
#ifdef memset
xorl %eax, %eax /* we fill with 0 */
movl 12(%esp), %edx /* size (in 8-bit words) */
#else
movb 12(%esp), %al /* use CH to fill */
movl 16(%esp), %edx /* size (in 8-bit words) */
movb %al, %ah
movl %eax, %ecx
shll $16, %eax
movw %cx, %ax
#endif
cld
/* If less than 36 bytes to write, skip tricky code (it wouldn't work). */
cmpl $36, %edx
movl %edx, %ecx /* needed when branch is taken! */
jl L2
/* First write 0-3 bytes to make the pointer 32-bit aligned. */
movl %edi, %ecx /* Copy ptr to ecx... */
negl %ecx /* ...and negate that and... */
andl $3, %ecx /* ...mask to get byte count. */
subl %ecx, %edx /* adjust global byte count */
rep
stosb
subl $32, %edx /* offset count for unrolled loop */
movl (%edi), %ecx /* Fetch destination cache line */
.align 2, 0x90 /* supply 0x90 for broken assemblers */
L1: movl 28(%edi), %ecx /* allocate cache line for destination */
subl $32, %edx /* decr loop count */
movl %eax, 0(%edi) /* store words pairwise */
movl %eax, 4(%edi)
movl %eax, 8(%edi)
movl %eax, 12(%edi)
movl %eax, 16(%edi)
movl %eax, 20(%edi)
movl %eax, 24(%edi)
movl %eax, 28(%edi)
leal 32(%edi), %edi /* update destination pointer */
jge L1
leal 32(%edx), %ecx /* reset offset count */
/* Write last 0-7 full 32-bit words (up to 8 words if loop was skipped). */
L2: shrl $2, %ecx /* convert byte count to longword count */
rep
stosl
/* Finally write the last 0-3 bytes. */
movl %edx, %ecx
andl $3, %ecx
rep
stosb
/* Load result (only if used as memset). */
#ifndef memset
movl 8(%esp), %eax
#endif
popl %edi
ret