2003-01-26  Andreas Schwab  <schwab@suse.de>

	* sysdeps/wordsize-32/divdi3.c: Export the functions only as
	compatibility symbols.  Remove INTDEF for __divdi3.
	* sysdeps/wordsize-32/lldiv.c: Don't use __divdi3_internal.
	* sysdeps/powerpc/powerpc32/divdi3.c: Remove.
	* sysdeps/powerpc/powerpc32/Makefile (CPPFLAGS-divdi3.c): Don't
	define.
	* sysdeps/powerpc/powerpc32/Dist: Remove divdi3.c.

2003-01-24  Jakub Jelinek  <jakub@redhat.com>

	* elf/tls-macros.h: Add SPARC 32-bit definitions.
	* sysdeps/sparc/sparc32/elf/configure.in: Add TLS check.
	* sysdeps/sparc/sparc32/dl-machine.h: Add dl_machine_h guards
	for the first half of the header.  Include tls.h.
	(elf_machine_type_class): Return ELF_RTYPE_CLASS_PLT for TLS
	relocs too.
	(elf_machine_rela): Handle TLS relocs.
	* sysdeps/sparc/dl-tls.h: New file.

	* sysdeps/unix/sysv/linux/sparc/sparc32/socket.S: Add cancellation
	support.

	* sysdeps/sparc/sparc32/sparcv9/hp-timing.h: Use %g6 instead of %g7.
	* sysdeps/sparc/sparc32/memchr.S: Likewise.
	* sysdeps/sparc/sparc32/memcpy.S: Likewise.
	* sysdeps/sparc/sparc32/strcat.S: Likewise.
	* sysdeps/sparc/sparc32/strchr.S: Likewise.
	* sysdeps/sparc/sparc32/strcmp.S: Likewise.
	* sysdeps/sparc/sparc32/strcpy.S: Likewise.
	* sysdeps/sparc/sparc64/sparcv9b/memcpy.S: Likewise.
	* sysdeps/sparc/sparc64/hp-timing.h: Likewise.
	* sysdeps/sparc/sparc64/memcpy.S: Likewise.
	* sysdeps/sparc/sparc64/stpcpy.S: Likewise.
	* sysdeps/sparc/sparc64/stpncpy.S: Likewise.
	* sysdeps/sparc/sparc64/strcat.S: Likewise.
	* sysdeps/sparc/sparc64/strchr.S: Likewise.
	* sysdeps/sparc/sparc64/strcmp.S: Likewise.
	* sysdeps/sparc/sparc64/strcpy.S: Likewise.
	* sysdeps/sparc/sparc64/strncmp.S: Likewise.
	* sysdeps/sparc/sparc64/strncpy.S: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h: Likewise.

2003-01-24  Andreas Schwab  <schwab@suse.de>

	* elf/dl-close.c (_dl_close): Don't relocate DT_FINI_ARRAY
	elements, and process them backwards.
	* elf/Makefile ($(objpfx)tst-array4): New target.
	($(objpfx)tst-array4.out): Likewise.
	(tests) [$(have-initfini-array) = yes]: Add tst-array4.
	* elf/tst-array4.c: New file.
	* elf/tst-array4.exp: Likewise.

2003-01-24  Steven Munroe  <sjmunroe@us.ibm.com>

	* sysdeps/unix/sysv/linux/powerpc/powerpc64/fe_nomask.c: New file.

2003-01-27  Guido Guenther  <agx@sigxcpu.org>

	* sysdeps/unix/sysv/linux/mips/sysdep.h (SYSCALL_ERROR_LABEL): Define.
	* sysdeps/unix/sysv/linux/mips/pread.c: Add support for
	cancellation handling and handle both __NR_pread64 and __NR_pread.
	* sysdeps/unix/sysv/linux/mips/pread64.c: Likewise.
	* sysdeps/unix/sysv/linux/mips/pwrite.c: Add support for
	cancellation handling and handle both __NR_pwrite64 and __NR_pwrite.
	* sysdeps/unix/sysv/linux/mips/pwrite64.c: Likewise.
	* sysdeps/unix/mips/sysdep.S: Don't set errno in the _LIBC_REENTRANT
	case, use register names consistently.

2003-01-27  Wolfram Gloger  <wg@malloc.de>

	* malloc/hooks.c (mem2chunk_check): Check alignment of mem
	pointer, not of the computed chunk.  Bug report from Carlos
	O'Donell <carlos@baldric.uwo.ca>.
This commit is contained in:
Ulrich Drepper 2003-01-27 21:03:22 +00:00
parent e4e9446ba3
commit 62f29da7cb
49 changed files with 893 additions and 385 deletions

View File

@ -1,3 +1,80 @@
2003-01-26 Andreas Schwab <schwab@suse.de>
* sysdeps/wordsize-32/divdi3.c: Export the functions only as
compatibility symbols. Remove INTDEF for __divdi3.
* sysdeps/wordsize-32/lldiv.c: Don't use __divdi3_internal.
* sysdeps/powerpc/powerpc32/divdi3.c: Remove.
* sysdeps/powerpc/powerpc32/Makefile (CPPFLAGS-divdi3.c): Don't
define.
* sysdeps/powerpc/powerpc32/Dist: Remove divdi3.c.
2003-01-24 Jakub Jelinek <jakub@redhat.com>
* elf/tls-macros.h: Add SPARC 32-bit definitions.
* sysdeps/sparc/sparc32/elf/configure.in: Add TLS check.
* sysdeps/sparc/sparc32/dl-machine.h: Add dl_machine_h guards
for the first half of the header. Include tls.h.
(elf_machine_type_class): Return ELF_RTYPE_CLASS_PLT for TLS
relocs too.
(elf_machine_rela): Handle TLS relocs.
* sysdeps/sparc/dl-tls.h: New file.
* sysdeps/unix/sysv/linux/sparc/sparc32/socket.S: Add cancellation
support.
* sysdeps/sparc/sparc32/sparcv9/hp-timing.h: Use %g6 instead of %g7.
* sysdeps/sparc/sparc32/memchr.S: Likewise.
* sysdeps/sparc/sparc32/memcpy.S: Likewise.
* sysdeps/sparc/sparc32/strcat.S: Likewise.
* sysdeps/sparc/sparc32/strchr.S: Likewise.
* sysdeps/sparc/sparc32/strcmp.S: Likewise.
* sysdeps/sparc/sparc32/strcpy.S: Likewise.
* sysdeps/sparc/sparc64/sparcv9b/memcpy.S: Likewise.
* sysdeps/sparc/sparc64/hp-timing.h: Likewise.
* sysdeps/sparc/sparc64/memcpy.S: Likewise.
* sysdeps/sparc/sparc64/stpcpy.S: Likewise.
* sysdeps/sparc/sparc64/stpncpy.S: Likewise.
* sysdeps/sparc/sparc64/strcat.S: Likewise.
* sysdeps/sparc/sparc64/strchr.S: Likewise.
* sysdeps/sparc/sparc64/strcmp.S: Likewise.
* sysdeps/sparc/sparc64/strcpy.S: Likewise.
* sysdeps/sparc/sparc64/strncmp.S: Likewise.
* sysdeps/sparc/sparc64/strncpy.S: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h: Likewise.
2003-01-24 Andreas Schwab <schwab@suse.de>
* elf/dl-close.c (_dl_close): Don't relocate DT_FINI_ARRAY
elements, and process them backwards.
* elf/Makefile ($(objpfx)tst-array4): New target.
($(objpfx)tst-array4.out): Likewise.
(tests) [$(have-initfini-array) = yes]: Add tst-array4.
* elf/tst-array4.c: New file.
* elf/tst-array4.exp: Likewise.
2003-01-24 Steven Munroe <sjmunroe@us.ibm.com>
* sysdeps/unix/sysv/linux/powerpc/powerpc64/fe_nomask.c: New file.
2003-01-27 Guido Guenther <agx@sigxcpu.org>
* sysdeps/unix/sysv/linux/mips/sysdep.h (SYSCALL_ERROR_LABEL): Define.
* sysdeps/unix/sysv/linux/mips/pread.c: Add support for
cancellation handling and handle both __NR_pread64 and __NR_pread.
* sysdeps/unix/sysv/linux/mips/pread64.c: Likewise.
* sysdeps/unix/sysv/linux/mips/pwrite.c: Add support for
cancellation handling and handle both __NR_pwrite64 and __NR_pwrite.
* sysdeps/unix/sysv/linux/mips/pwrite64.c: Likewise.
* sysdeps/unix/mips/sysdep.S: Don't set errno in the _LIBC_REENTRANT
case, use register names consistently.
2003-01-27 Wolfram Gloger <wg@malloc.de>
* malloc/hooks.c (mem2chunk_check): Check alignment of mem
pointer, not of the computed chunk. Bug report from Carlos
O'Donell <carlos@baldric.uwo.ca>.
2003-01-25 Andreas Schwab <schwab@suse.de>
* sysdeps/m68k/dl-machine.h (_dl_start_user): Use pc-relative

View File

@ -121,7 +121,7 @@ endif
tests = tst-tls1 tst-tls2 tst-tls9
ifeq (yes,$(have-initfini-array))
tests += tst-array1 tst-array2 tst-array3
tests += tst-array1 tst-array2 tst-array3 tst-array4
endif
ifeq (yes,$(build-static))
tests-static = tst-tls1-static tst-tls2-static
@ -594,6 +594,12 @@ $(objpfx)tst-array3.out: $(objpfx)tst-array3
$(objpfx)tst-array3 > $@
cmp $@ tst-array1.exp > /dev/null
$(objpfx)tst-array4: $(libdl)
$(objpfx)tst-array4.out: $(objpfx)tst-array4 $(objpfx)tst-array2dep.so
$(elf-objpfx)$(rtld-installed-name) \
--library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) \
$< > $@
cmp $@ tst-array4.exp > /dev/null
check-textrel-CFLAGS = -O
$(objpfx)check-textrel: check-textrel.c

View File

@ -238,10 +238,9 @@ _dl_close (void *_map)
+ imap->l_info[DT_FINI_ARRAY]->d_un.d_ptr);
unsigned int sz = (imap->l_info[DT_FINI_ARRAYSZ]->d_un.d_val
/ sizeof (ElfW(Addr)));
unsigned int cnt;
for (cnt = 0; cnt < sz; ++cnt)
((fini_t) (imap->l_addr + array[cnt])) ();
while (sz-- > 0)
((fini_t) array[sz]) ();
}
/* Next try the old-style destructor. */

View File

@ -298,6 +298,75 @@ register void *__gp __asm__("$29");
: "=r" (__l) : : "loc0", __TLS_CALL_CLOBBERS); \
__l; })
#elif defined __sparc__ && !defined __arch64__
# define TLS_LE(x) \
({ int *__l; \
asm ("sethi %%tle_hix22(" #x "), %0" : "=r" (__l)); \
asm ("xor %1, %%tle_lox10(" #x "), %0" : "=r" (__l) : "r" (__l)); \
asm ("add %%g7, %1, %0" : "=r" (__l) : "r" (__l)); \
__l; })
# ifdef __PIC__
# define TLS_LOAD_PIC \
({ register long pc __asm__ ("%o7"); \
long got; \
asm ("sethi %%hi(_GLOBAL_OFFSET_TABLE_-4), %1\n\t" \
"call .+8\n\t" \
"add %1, %%lo(_GLOBAL_OFFSET_TABLE_+4), %1\n\t" \
"add %1, %0, %1\n\t" \
: "=r" (pc), "=r" (got)); \
got; })
# else
# define TLS_LOAD_PIC \
({ long got; \
asm (".hidden _GLOBAL_OFFSET_TABLE_\n\t" \
"sethi %%hi(_GLOBAL_OFFSET_TABLE_), %0\n\t" \
"or %0, %%lo(_GLOBAL_OFFSET_TABLE_), %0" \
: "=r" (got)); \
got; })
# endif
# define TLS_IE(x) \
({ int *__l; \
asm ("sethi %%tie_hi22(" #x "), %0" : "=r" (__l)); \
asm ("add %1, %%tie_lo10(" #x "), %0" : "=r" (__l) : "r" (__l)); \
asm ("ld [%1 + %2], %0, %%tie_ld(" #x ")" \
: "=r" (__l) : "r" (TLS_LOAD_PIC), "r" (__l)); \
asm ("add %%g7, %1, %0, %%tie_add(" #x ")" : "=r" (__l) : "r" (__l)); \
__l; })
# define TLS_LD(x) \
({ int *__l; register void *__o0 asm ("%o0"); \
long __o; \
asm ("sethi %%tldm_hi22(" #x "), %0" : "=r" (__l)); \
asm ("add %1, %%tldm_lo10(" #x "), %0" : "=r" (__l) : "r" (__l)); \
asm ("add %1, %2, %0, %%tldm_add(" #x ")" \
: "=r" (__o0) : "r" (TLS_LOAD_PIC), "r" (__l)); \
asm ("call __tls_get_addr, %%tgd_call(" #x ")\n\t" \
" nop" \
: "=r" (__o0) : "0" (__o0) \
: "g1", "g2", "g3", "g4", "g5", "g6", "o1", "o2", "o3", "o4", \
"o5", "o7"); \
asm ("sethi %%tldo_hix22(" #x "), %0" : "=r" (__o)); \
asm ("xor %1, %%tldo_lox10(" #x "), %0" : "=r" (__o) : "r" (__o)); \
asm ("add %1, %2, %0, %%tldo_add(" #x ")" : "=r" (__l) \
: "r" (__o0), "r" (__o)); \
__l; })
# define TLS_GD(x) \
({ int *__l; register void *__o0 asm ("%o0"); \
asm ("sethi %%tgd_hi22(" #x "), %0" : "=r" (__l)); \
asm ("add %1, %%tgd_lo10(" #x "), %0" : "=r" (__l) : "r" (__l)); \
asm ("add %1, %2, %0, %%tgd_add(" #x ")" \
: "=r" (__o0) : "r" (TLS_LOAD_PIC), "r" (__l)); \
asm ("call __tls_get_addr, %%tgd_call(" #x ")\n\t" \
" nop" \
: "=r" (__o0) : "0" (__o0) \
: "g1", "g2", "g3", "g4", "g5", "g6", "o1", "o2", "o3", "o4", \
"o5", "o7"); \
__o0; })
#else
# error "No support for this architecture so far."
#endif

18
elf/tst-array4.c Normal file
View File

@ -0,0 +1,18 @@
#include <dlfcn.h>
#define main array1_main
#include "tst-array1.c"
#undef main
int
main (void)
{
void *handle = dlopen ("tst-array2dep.so", RTLD_LAZY);
array1_main ();
if (handle != NULL)
dlclose (handle);
return 0;
}

19
elf/tst-array4.exp Normal file
View File

@ -0,0 +1,19 @@
preinit array 0
preinit array 1
preinit array 2
init
init array 0
init array 1
init array 2
DSO init
DSO init array 0
DSO init array 1
DSO init array 2
DSO fini array 2
DSO fini array 1
DSO fini array 0
DSO fini
fini array 2
fini array 1
fini array 0
fini

View File

@ -1,3 +1,19 @@
2003-01-24 Jakub Jelinek <jakub@redhat.com>
* sysdeps/sparc/sparc32/pt-machine.h (__thread_self): Change to %g7,
as required by TLS ABI.
* sysdeps/sparc/sparc64/pt-machine.h (__thread_self): Likewise.
* sysdeps/sparc/tls.h [HAVE_TLS_SUPPORT] (USE_TLS, TLS_INIT_TCB_SIZE,
TLS_INIT_TCB_ALIGN, TLS_TCB_SIZE, TLS_TCB_ALIGN, TLS_TCB_AT_TP,
INSTALL_DTV, INSTALL_NEW_DTV, GET_DTV, TLS_INIT_TP, THREAD_DTV):
Define.
[HAVE_TLS_SUPPORT]: Include descr.h and sysdep.h.
* sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: Use %g7
instead of %g6 for thread pointer.
* sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S: Likewise.
2003-01-25 Guido Guenther <agx@sigxcpu.org>
* sysdeps/unix/sysv/linux/mips/sysdep-cancel.h: New file.

View File

@ -1,6 +1,6 @@
/* Machine-dependent pthreads configuration and inline functions.
sparc version.
Copyright (C) 1996,1997,1998,2000,2001,2002 Free Software Foundation, Inc.
Copyright (C) 1996-1998, 2000-2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Richard Henderson <rth@tamu.edu>.
@ -53,10 +53,10 @@ testandset (int *spinlock)
register char *stack_pointer __asm__("%sp");
/* Registers %g6 and %g7 are reserved by the ABI for "system use". It
happens that Solaris uses %g6 for the thread pointer -- we do the same. */
/* Registers %g6 and %g7 are reserved by the ABI for "system use".
%g7 is specified in the TLS ABI as thread pointer -- we do the same. */
struct _pthread_descr_struct;
register struct _pthread_descr_struct *__thread_self __asm__("%g6");
register struct _pthread_descr_struct *__thread_self __asm__("%g7");
/* Return the thread descriptor for the current thread. */
#define THREAD_SELF __thread_self

View File

@ -1,6 +1,6 @@
/* Machine-dependent pthreads configuration and inline functions.
Sparc v9 version.
Copyright (C) 1997,1998,1999,2000,2001,2002 Free Software Foundation, Inc.
Copyright (C) 1997-2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Richard Henderson <rth@tamu.edu>.
@ -59,10 +59,10 @@ testandset (int *spinlock)
register char *stack_pointer __asm__ ("%sp");
/* Registers %g6 and %g7 are reserved by the ABI for "system use". It
happens that Solaris uses %g6 for the thread pointer -- we do the same. */
/* Registers %g6 and %g7 are reserved by the ABI for "system use". The
TLS ABI specifies %g7 as the thread pointer. */
struct _pthread_descr_struct;
register struct _pthread_descr_struct *__thread_self __asm__ ("%g6");
register struct _pthread_descr_struct *__thread_self __asm__ ("%g7");
/* Return the thread descriptor for the current thread. */
#define THREAD_SELF __thread_self

View File

@ -1,5 +1,5 @@
/* Definitions for thread-local data handling. linuxthreads/sparc version.
Copyright (C) 2002 Free Software Foundation, Inc.
Copyright (C) 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -45,9 +45,56 @@ typedef struct
# include <tcb-offsets.h>
#endif /* __ASSEMBLER__ */
#undef USE_TLS
#ifdef HAVE_TLS_SUPPORT
#if USE_TLS
/* Signal that TLS support is available. */
# define USE_TLS 1
# ifndef __ASSEMBLER__
/* Get system call information. */
# include <sysdep.h>
/* Get the thread descriptor definition. */
# include <linuxthreads/descr.h>
/* This is the size of the initial TCB. */
# define TLS_INIT_TCB_SIZE sizeof (tcbhead_t)
/* Alignment requirements for the initial TCB. */
# define TLS_INIT_TCB_ALIGN __alignof__ (tcbhead_t)
/* This is the size of the TCB. */
# define TLS_TCB_SIZE sizeof (struct _pthread_descr_struct)
/* Alignment requirements for the TCB. */
# define TLS_TCB_ALIGN __alignof__ (struct _pthread_descr_struct)
/* The TCB can have any size and the memory following the address the
thread pointer points to is unspecified. Allocate the TCB there. */
# define TLS_TCB_AT_TP 1
/* Install the dtv pointer. The pointer passed is to the element with
index -1 which contain the length. */
# define INSTALL_DTV(descr, dtvp) \
((tcbhead_t *) (descr))->dtv = (dtvp) + 1
/* Install new dtv for current thread. */
# define INSTALL_NEW_DTV(DTV) \
(((tcbhead_t *) __thread_self)->dtv = (DTV))
/* Return dtv of given thread descriptor. */
# define GET_DTV(descr) \
(((tcbhead_t *) (descr))->dtv)
/* Code to initially initialize the thread pointer. */
# define TLS_INIT_TP(descr, secondcall) \
(__thread_self = (__typeof (__thread_self)) (descr), NULL)
/* Return the address of the dtv for the current thread. */
# define THREAD_DTV() \
(((tcbhead_t *) __thread_self)->dtv)
# endif
#else

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2002 Free Software Foundation, Inc.
/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
@ -29,7 +29,7 @@
# define PSEUDO(name, syscall_name, args) \
.text; \
ENTRY(name) \
ld [%g6 + MULTIPLE_THREADS_OFFSET], %g1; \
ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1; \
cmp %g1, 0; \
bne 1f; \
mov SYS_ify(syscall_name), %g1; \
@ -86,7 +86,7 @@ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler2) \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
p_header.data.multiple_threads) == 0, 1)
# else
# define SINGLE_THREAD_P ld [%g6 + MULTIPLE_THREADS_OFFSET], %g1
# define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1
# endif
#elif !defined __ASSEMBLER__

View File

@ -21,7 +21,7 @@
.text
ENTRY(__vfork)
ld [%g6 + MULTIPLE_THREADS_OFFSET], %o0
ld [%g7 + MULTIPLE_THREADS_OFFSET], %o0
cmp %o0, 0
#ifdef SHARED
bne HIDDEN_JUMPTARGET(__fork)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2002 Free Software Foundation, Inc.
/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
@ -29,7 +29,7 @@
# define PSEUDO(name, syscall_name, args) \
.text; \
ENTRY(name) \
ld [%g6 + MULTIPLE_THREADS_OFFSET], %g1; \
ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1; \
brz,pn %g1, 1f; \
mov SYS_ify(syscall_name), %g1; \
ta 0x6d; \
@ -85,7 +85,7 @@ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler2) \
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
p_header.data.multiple_threads) == 0, 1)
# else
# define SINGLE_THREAD_P ld [%g6 + MULTIPLE_THREADS_OFFSET], %g1
# define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1
# endif
#elif !defined __ASSEMBLER__

View File

@ -21,7 +21,7 @@
.text
ENTRY(__vfork)
ld [%g6 + MULTIPLE_THREADS_OFFSET], %o0
ld [%g7 + MULTIPLE_THREADS_OFFSET], %o0
#ifdef SHARED
cmp %o0, 0
bne HIDDEN_JUMPTARGET (__fork)

View File

@ -1,4 +1,3 @@
divdi3.c
dl-machine.c
dl-start.S
libgcc-compat.S

View File

@ -34,7 +34,6 @@ endif
ifeq (yes,$(build-shared))
# Compatibility
ifeq (yes,$(have-protected))
CPPFLAGS-divdi3.c = -DHAVE_DOT_HIDDEN
CPPFLAGS-libgcc-compat.S = -DHAVE_DOT_HIDDEN
endif
sysdep_routines += libgcc-compat

View File

@ -1,5 +1,5 @@
/* 64-bit multiplication and division libgcc routines for 32-bit PowerPC
Copyright (C) 2002 Free Software Foundation, Inc.
/* Thread-local storage handling in the ELF dynamic linker. SPARC version.
Copyright (C) 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -17,27 +17,13 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#define _DIVDI3_C
#include <sysdeps/wordsize-32/divdi3.c>
INTDEF (__udivdi3);
INTDEF (__moddi3);
INTDEF (__umoddi3);
/* Type used for the representation of TLS information in the GOT. */
typedef struct
{
unsigned long int ti_module;
unsigned long int ti_offset;
} tls_index;
#ifdef HAVE_DOT_HIDDEN
asm (".hidden __divdi3");
asm (".hidden __udivdi3");
asm (".hidden __moddi3");
asm (".hidden __umoddi3");
#endif
#include <shlib-compat.h>
#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2_6)
symbol_version (INTUSE (__divdi3), __divdi3, GLIBC_2.0);
symbol_version (INTUSE (__udivdi3), __udivdi3, GLIBC_2.0);
symbol_version (INTUSE (__moddi3), __moddi3, GLIBC_2.0);
symbol_version (INTUSE (__umoddi3), __umoddi3, GLIBC_2.0);
#endif
extern void *__tls_get_addr (tls_index *ti);

View File

@ -1,5 +1,5 @@
/* Machine-dependent ELF dynamic relocation inline functions. SPARC version.
Copyright (C) 1996-2001, 2002 Free Software Foundation, Inc.
Copyright (C) 1996-2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -17,11 +17,15 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#ifndef dl_machine_h
#define dl_machine_h
#define ELF_MACHINE_NAME "sparc"
#include <string.h>
#include <sys/param.h>
#include <ldsodefs.h>
#include <tls.h>
#ifndef VALIDX
# define VALIDX(tag) (DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGNUM \
@ -237,9 +241,17 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
PLT entries should not be allowed to define the value.
ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one
of the main executable's symbols, as for a COPY reloc. */
#define elf_machine_type_class(type) \
((((type) == R_SPARC_JMP_SLOT) * ELF_RTYPE_CLASS_PLT) \
#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD)
# define elf_machine_type_class(type) \
((((type) == R_SPARC_JMP_SLOT \
|| ((type) >= R_SPARC_TLS_GD_HI22 && (type) <= R_SPARC_TLS_TPOFF64)) \
* ELF_RTYPE_CLASS_PLT) \
| (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY))
#else
# define elf_machine_type_class(type) \
((((type) == R_SPARC_JMP_SLOT) * ELF_RTYPE_CLASS_PLT) \
| (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY))
#endif
/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
#define ELF_MACHINE_JMP_SLOT R_SPARC_JMP_SLOT
@ -413,6 +425,8 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc,
return value + reloc->r_addend;
}
#endif /* dl_machine_h */
#ifdef RESOLVE
/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
@ -447,17 +461,30 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
{
#if !defined RTLD_BOOTSTRAP && !defined RESOLVE_CONFLICT_FIND_MAP
const Elf32_Sym *const refsym = sym;
#endif
#if defined USE_TLS && !defined RTLD_BOOTSTRAP
struct link_map *sym_map;
#endif
Elf32_Addr value;
#ifndef RESOLVE_CONFLICT_FIND_MAP
if (sym->st_shndx != SHN_UNDEF &&
ELF32_ST_BIND (sym->st_info) == STB_LOCAL)
value = map->l_addr;
{
value = map->l_addr;
# if defined USE_TLS && !defined RTLD_BOOTSTRAP
sym_map = map;
# endif
}
else
{
# if defined USE_TLS && !defined RTLD_BOOTSTRAP
sym_map = RESOLVE_MAP (&sym, version, r_type);
value = sym == NULL ? 0 : sym_map->l_addr + sym->st_value;
# else
value = RESOLVE (&sym, version, r_type);
if (sym)
value += sym->st_value;
# endif
}
#else
value = 0;
@ -496,6 +523,43 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
so we can optimize the first instruction of .plt out. */
sparc_fixup_plt (reloc, reloc_addr, value, 0);
break;
#if defined USE_TLS && (!defined RTLD_BOOTSTRAP || USE___THREAD) \
&& !defined RESOLVE_CONFLICT_FIND_MAP
case R_SPARC_TLS_DTPMOD32:
/* Get the information from the link map returned by the
resolv function. */
if (sym_map != NULL)
*reloc_addr = sym_map->l_tls_modid;
break;
case R_SPARC_TLS_DTPOFF32:
/* During relocation all TLS symbols are defined and used.
Therefore the offset is already correct. */
*reloc_addr = (sym == NULL ? 0 : sym->st_value) + reloc->r_addend;
break;
case R_SPARC_TLS_TPOFF32:
/* The offset is negative, forward from the thread pointer. */
/* We know the offset of object the symbol is contained in.
It is a negative value which will be added to the
thread pointer. */
CHECK_STATIC_TLS (map, sym_map);
*reloc_addr
= (sym == NULL ? 0 : sym->st_value - sym_map->l_tls_offset)
+ reloc->r_addend;
break;
# ifndef RTLD_BOOTSTRAP
case R_SPARC_TLS_LE_HIX22:
case R_SPARC_TLS_LE_LOX10:
CHECK_STATIC_TLS (map, sym_map);
value = (sym == NULL ? 0 : sym->st_value - sym_map->l_tls_offset)
+ reloc->r_addend;
if (r_type == R_SPARC_TLS_LE_HIX22)
*reloc_addr = (*reloc_addr & 0xffc00000) | ((~value) >> 10);
else
*reloc_addr = (*reloc_addr & 0xffffe000) | (value & 0x3ff)
| 0x1c00;
break;
# endif
#endif
#ifndef RTLD_BOOTSTRAP
case R_SPARC_8:
*(char *) reloc_addr = value;

View File

@ -0,0 +1,43 @@
GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
# Local configure fragment for sysdeps/sparc/sparc32/elf.
if test "$usetls" != no; then
# Check for support of thread-local storage handling in assembler and linker.
AC_CACHE_CHECK(for sparc32 TLS support, libc_cv_sparc32_tls, [dnl
cat > conftest.s <<\EOF
.section ".tdata", "awT", @progbits
.globl foo
foo: .word 1
.section ".tbss", "awT", @nobits
.globl bar
bar: .skip 4
.text
baz: sethi %tgd_hi22(foo), %l1
add %l1, %tgd_lo10(foo), %l1
add %l7, %l1, %o0, %tgd_add(foo)
call __tls_get_addr, %tgd_call(foo)
sethi %tldm_hi22(bar), %l1
add %l1, %tldm_lo10(bar), %l1
add %l7, %l1, %o0, %tldm_add(bar)
call __tls_get_addr, %tldm_call(bar)
sethi %tldo_hix22(bar), %l1
xor %l1, %tldo_lox10(bar), %l1
add %o0, %l1, %l1, %tldo_add(bar)
sethi %tie_hi22(foo), %l1
add %l1, %tie_lo10(foo), %l1
ld [%l7 + %l1], %l1, %tie_ld(foo)
add %g7, %l1, %l1, %tie_add(foo)
sethi %tle_hix22(foo), %l1
xor %l1, %tle_lox10(foo), %l1
EOF
dnl
if AC_TRY_COMMAND(${CC-cc} -c $CFLAGS conftest.s 1>&AS_MESSAGE_LOG_FD); then
libc_cv_sparc32_tls=yes
else
libc_cv_sparc32_tls=no
fi
rm -f conftest*])
if test $libc_cv_sparc32_tls = yes; then
AC_DEFINE(HAVE_TLS_SUPPORT)
fi
fi

View File

@ -1,7 +1,7 @@
/* memchr (str, ch, n) -- Return pointer to first occurrence of CH in STR less
than N.
For SPARC v7.
Copyright (C) 1996,1999, 2000 Free Software Foundation, Inc.
Copyright (C) 1996, 1999, 2000, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jj@ultra.linux.cz> and
David S. Miller <davem@caip.rutgers.edu>.
@ -67,23 +67,23 @@
ENTRY(__memchr)
andcc %o1, 0xff, %o1
sll %o1, 8, %g7
sll %o1, 8, %g6
andcc %o0, 3, %g0
or %o1, %g7, %g7
sll %g7, 16, %o3
or %o1, %g6, %g6
sll %g6, 16, %o3
bne 0b
or %o3, %g7, %g2
or %o3, %g6, %g2
sethi %hi(0x80808080), %o4
or %o4, %lo(0x80808080), %o3
4: sethi %hi(0x01010101), %o5
5: and %o2, 3, %g1
7: andcc %o2, 0xfffffffc, %o2
be 0f
or %o5, %lo(0x01010101), %g7
or %o5, %lo(0x01010101), %g6
ld [%o0], %g4
6: xor %g4, %g2, %g5
add %o0, 4, %o0
sub %g5, %g7, %g5
sub %g5, %g6, %g5
andcc %g5, %o3, %g0
bne 8f
subcc %o2, 4, %o2

View File

@ -1,6 +1,6 @@
/* Copy SIZE bytes from SRC to DEST.
For SPARC v7.
Copyright (C) 1996, 1999 Free Software Foundation, Inc.
Copyright (C) 1996, 1999, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller <davem@caip.rutgers.edu>,
Eddie C. Dost <ecd@skynet.be> and
@ -196,7 +196,7 @@ ENTRY(memmove)
st %o4, [%o0 - 4]
sub %o1, 4, %o1
sub %o0, 4, %o0
2: andcc %g1, 0xffffff80, %g7
2: andcc %g1, 0xffffff80, %g6
be 3f
andcc %o0, 4, %g0
@ -205,23 +205,23 @@ ENTRY(memmove)
RMOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
RMOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
RMOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
subcc %g7, 128, %g7
subcc %g6, 128, %g6
sub %o1, 128, %o1
bne 5b
sub %o0, 128, %o0
3: andcc %g1, 0x70, %g7
3: andcc %g1, 0x70, %g6
be 72f
andcc %g1, 8, %g0
srl %g7, 1, %o4
srl %g6, 1, %o4
mov %o7, %g2
add %g7, %o4, %o4
add %g6, %o4, %o4
101: call 100f
sub %o1, %g7, %o1
sub %o1, %g6, %o1
mov %g2, %o7
jmpl %o5 + (72f - 101b), %g0
sub %o0, %g7, %o0
sub %o0, %g6, %o0
71: RMOVE_LASTCHUNK(o1, o0, 0x60, g2, g3, g4, g5)
RMOVE_LASTCHUNK(o1, o0, 0x50, g2, g3, g4, g5)
@ -264,23 +264,23 @@ ENTRY(memmove)
RMOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
RMOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
RMOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
subcc %g7, 128, %g7
subcc %g6, 128, %g6
sub %o1, 128, %o1
bne 74b
sub %o0, 128, %o0
andcc %g1, 0x70, %g7
andcc %g1, 0x70, %g6
be 72b
andcc %g1, 8, %g0
srl %g7, 1, %o4
srl %g6, 1, %o4
mov %o7, %g2
add %g7, %o4, %o4
add %g6, %o4, %o4
102: call 100f
sub %o1, %g7, %o1
sub %o1, %g6, %o1
mov %g2, %o7
jmpl %o5 + (72b - 102b), %g0
sub %o0, %g7, %o0
sub %o0, %g6, %o0
75: and %o2, 0xe, %o3
mov %o7, %g2
@ -351,7 +351,7 @@ ENTRY(memmove)
sll %g2, 3, %g4
mov 32, %g2
be 4f
sub %g2, %g4, %g7
sub %g2, %g4, %g6
blu 3f
cmp %g3, 8
@ -386,22 +386,22 @@ ENTRY(memmove)
ld [%o1 + 12], %o3
5: sll %o5, %g4, %g2
srl %g1, %g7, %g5
srl %g1, %g6, %g5
or %g2, %g5, %g2
st %g2, [%o0 + 12]
6: ld [%o1 + 8], %o4
sll %o3, %g4, %g2
srl %o5, %g7, %g5
srl %o5, %g6, %g5
or %g2, %g5, %g2
st %g2, [%o0 + 8]
7: ld [%o1 + 4], %g1
sll %o4, %g4, %g2
srl %o3, %g7, %g5
srl %o3, %g6, %g5
or %g2, %g5, %g2
st %g2, [%o0 + 4]
8: ld [%o1], %o5
sll %g1, %g4, %g2
srl %o4, %g7, %g5
srl %o4, %g6, %g5
addcc %g3, -4, %g3
or %g2, %g5, %g2
add %o1, -16, %o1
@ -410,7 +410,7 @@ ENTRY(memmove)
bne,a 5b
ld [%o1 + 12], %o3
sll %o5, %g4, %g2
srl %g1, %g7, %g5
srl %g1, %g6, %g5
srl %g4, 3, %g3
or %g2, %g5, %g2
add %o1, %g3, %o1
@ -471,7 +471,7 @@ ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */
st %o4, [%o0]
add %o1, 4, %o1
add %o0, 4, %o0
2: andcc %g1, 0xffffff80, %g7
2: andcc %g1, 0xffffff80, %g6
be 3f
andcc %o0, 4, %g0
@ -480,20 +480,20 @@ ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */
MOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
MOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
MOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
subcc %g7, 128, %g7
subcc %g6, 128, %g6
add %o1, 128, %o1
bne 5b
add %o0, 128, %o0
3: andcc %g1, 0x70, %g7
3: andcc %g1, 0x70, %g6
be 80f
andcc %g1, 8, %g0
srl %g7, 1, %o4
srl %g6, 1, %o4
mov %o7, %g2
add %g7, %o4, %o4
add %o1, %g7, %o1
add %g6, %o4, %o4
add %o1, %g6, %o1
104: call 100f
add %o0, %g7, %o0
add %o0, %g6, %o0
jmpl %o5 + (80f - 104b), %g0
mov %g2, %o7
@ -541,21 +541,21 @@ ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */
MOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
MOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
MOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
subcc %g7, 128, %g7
subcc %g6, 128, %g6
add %o1, 128, %o1
bne 82b
add %o0, 128, %o0
andcc %g1, 0x70, %g7
andcc %g1, 0x70, %g6
be 84f
andcc %g1, 8, %g0
mov %o7, %g2
111: call 110f
add %o1, %g7, %o1
add %o1, %g6, %o1
mov %g2, %o7
jmpl %o5 + (84f - 111b), %g0
add %o0, %g7, %o0
add %o0, %g6, %o0
83: MOVE_LASTALIGNCHUNK(o1, o0, 0x60, g2, g3, g4, g5)
MOVE_LASTALIGNCHUNK(o1, o0, 0x50, g2, g3, g4, g5)
@ -626,7 +626,7 @@ ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */
sll %g2, 3, %g4
mov 32, %g2
be 4f
sub %g2, %g4, %g7
sub %g2, %g4, %g6
blu 3f
cmp %g3, 0x8
@ -661,22 +661,22 @@ ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */
ld [%o1], %o3
add %g3, -1, %g3
5: sll %o5, %g4, %g2
srl %g1, %g7, %g5
srl %g1, %g6, %g5
or %g2, %g5, %g2
st %g2, [%o0]
7: ld [%o1 + 4], %o4
sll %g1, %g4, %g2
srl %o3, %g7, %g5
srl %o3, %g6, %g5
or %g2, %g5, %g2
st %g2, [%o0 + 4]
8: ld [%o1 + 8], %o5
sll %o3, %g4, %g2
srl %o4, %g7, %g5
srl %o4, %g6, %g5
or %g2, %g5, %g2
st %g2, [%o0 + 8]
9: ld [%o1 + 12], %g1
sll %o4, %g4, %g2
srl %o5, %g7, %g5
srl %o5, %g6, %g5
addcc %g3, -4, %g3
or %g2, %g5, %g2
add %o1, 16, %o1
@ -685,8 +685,8 @@ ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */
bne,a 5b
ld [%o1], %o3
10: sll %o5, %g4, %g2
srl %g1, %g7, %g5
srl %g7, 3, %g3
srl %g1, %g6, %g5
srl %g6, 3, %g3
or %g2, %g5, %g2
sub %o1, %g3, %o1
andcc %o2, 2, %g0
@ -758,10 +758,10 @@ ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */
be 41f
and %o2, 0xffffffc0, %o3
ld [%o0 - 7], %o4
4: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
4: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
subcc %o3, 64, %o3
add %o1, 64, %o1
bne 4b
@ -770,7 +770,7 @@ ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */
andcc %o2, 0x30, %o3
be,a 1f
srl %g1, 16, %g2
4: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
4: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
subcc %o3, 16, %o3
add %o1, 16, %o1
bne 4b
@ -793,10 +793,10 @@ ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */
be 42f
and %o2, 0xffffffc0, %o3
ld [%o0 - 6], %o4
4: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
4: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
subcc %o3, 64, %o3
add %o1, 64, %o1
bne 4b
@ -805,7 +805,7 @@ ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */
andcc %o2, 0x30, %o3
be,a 1f
srl %g1, 16, %g2
4: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
4: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
subcc %o3, 16, %o3
add %o1, 16, %o1
bne 4b
@ -830,10 +830,10 @@ ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */
ld [%o0 - 1], %o4
add %o0, 4, %o0
4: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1)
SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1)
SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1)
SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1)
4: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1)
SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1)
SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1)
SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1)
subcc %o3, 64, %o3
add %o1, 64, %o1
bne 4b
@ -842,7 +842,7 @@ ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */
andcc %o2, 0x30, %o3
be,a 1f
srl %g1, 24, %g2
4: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1)
4: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1)
subcc %o3, 16, %o3
add %o1, 16, %o1
bne 4b
@ -852,10 +852,10 @@ ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */
1: st %o4, [%o0 - 5]
b 88f
stb %g2, [%o0 - 1]
41: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
41: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
subcc %o3, 64, %o3
add %o1, 64, %o1
bne 41b
@ -864,7 +864,7 @@ ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */
andcc %o2, 0x30, %o3
be,a 1f
srl %g1, 16, %g2
4: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
4: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
subcc %o3, 16, %o3
add %o1, 16, %o1
bne 4b
@ -875,10 +875,10 @@ ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */
srl %g1, 8, %g4
b 88f
stb %g4, [%o0 - 1]
43: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3)
SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3)
SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3)
SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3)
43: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3)
SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3)
SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3)
SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3)
subcc %o3, 64, %o3
add %o1, 64, %o1
bne 43b
@ -887,7 +887,7 @@ ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */
andcc %o2, 0x30, %o3
be,a 1f
srl %g1, 24, %g2
4: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3)
4: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3)
subcc %o3, 16, %o3
add %o1, 16, %o1
bne 4b
@ -897,10 +897,10 @@ ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */
1: stb %g2, [%o0 + 3]
b 88f
add %o0, 4, %o0
42: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
42: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
subcc %o3, 64, %o3
add %o1, 64, %o1
bne 42b
@ -909,7 +909,7 @@ ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */
andcc %o2, 0x30, %o3
be,a 1f
srl %g1, 16, %g2
4: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
4: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
subcc %o3, 16, %o3
add %o1, 16, %o1
bne 4b
@ -964,5 +964,5 @@ ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */
100: retl
sub %o7, %o4, %o5
110: retl
sub %o7, %g7, %o5
sub %o7, %g6, %o5
END(memcpy)

View File

@ -1,5 +1,5 @@
/* High precision, low overhead timing functions. sparcv9 version.
Copyright (C) 2001, 2002 Free Software Foundation, Inc.
Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller <davem@redhat.com>, 2001.
@ -58,17 +58,17 @@ typedef unsigned long long int hp_timing_t;
do { \
hp_timing_t __diff = (Diff) - GL(dl_hp_timing_overhead); \
__asm__ __volatile__("srl %L0, 0, %%g1\n\t" \
"sllx %H0, 32, %%g7\n\t" \
"or %%g1, %%g7, %%g1\n\t" \
"sllx %H0, 32, %%g6\n\t" \
"or %%g1, %%g6, %%g1\n\t" \
"1: ldx [%1], %%g5\n\t" \
"add %%g5, %%g1, %%g7\n\t" \
"casx [%1], %%g5, %%g7\n\t" \
"cmp %%g5, %%g7\n\t" \
"add %%g5, %%g1, %%g6\n\t" \
"casx [%1], %%g5, %%g6\n\t" \
"cmp %%g5, %%g6\n\t" \
"bne,pn %%xcc, 1b\n\t" \
" nop" \
: /* no outputs */ \
: "r" (__diff), "r" (&(Sum)) \
: "memory", "g1", "g5", "g7"); \
: "memory", "g1", "g5", "g6"); \
} while(0)
#define HP_TIMING_ACCUM_NT(Sum, Diff) (Sum) += (Diff)

View File

@ -1,6 +1,6 @@
/* strcat (dest, src) -- Append SRC on the end of DEST.
For SPARC v7.
Copyright (C) 1996, 1999 Free Software Foundation, Inc.
Copyright (C) 1996, 1999, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jj@ultra.linux.cz>.
@ -183,7 +183,7 @@ ENTRY(strcat)
srl %o5, 8, %g5
sth %g5, [%o0 + 2]
1: add %o0, 4, %o0
4: sll %o5, 24, %g7
4: sll %o5, 24, %g6
ld [%o1], %o5
add %o1, 4, %o1
srl %o5, 8, %g5
@ -191,7 +191,7 @@ ENTRY(strcat)
#ifdef EIGHTBIT_NOT_RARE
andn %o4, %o5, %o4
#endif
or %g5, %g7, %g5
or %g5, %g6, %g5
andcc %o4, %o3, %g0
be,a 1b
st %g5, [%o0]
@ -249,7 +249,7 @@ ENTRY(strcat)
sth %g5, [%o0]
sub %o0, 2, %o0
1: add %o0, 4, %o0
4: sll %o5, 16, %g7
4: sll %o5, 16, %g6
ld [%o1], %o5
add %o1, 4, %o1
srl %o5, 16, %g5
@ -257,7 +257,7 @@ ENTRY(strcat)
#ifdef EIGHTBIT_NOT_RARE
andn %o4, %o5, %o4
#endif
or %g5, %g7, %g5
or %g5, %g6, %g5
andcc %o4, %o3, %g0
be,a 1b
st %g5, [%o0]
@ -305,7 +305,7 @@ ENTRY(strcat)
stb %g5, [%o0]
sub %o0, 3, %o0
1: add %o0, 4, %o0
4: sll %o5, 8, %g7
4: sll %o5, 8, %g6
ld [%o1], %o5
add %o1, 4, %o1
srl %o5, 24, %g5
@ -313,7 +313,7 @@ ENTRY(strcat)
#ifdef EIGHTBIT_NOT_RARE
andn %o4, %o5, %o4
#endif
or %g5, %g7, %g5
or %g5, %g6, %g5
andcc %o4, %o3, %g0
be 1b
st %g5, [%o0]

View File

@ -1,6 +1,6 @@
/* strchr (str, ch) -- Return pointer to first occurrence of CH in STR.
For SPARC v7.
Copyright (C) 1996, 1999 Free Software Foundation, Inc.
Copyright (C) 1996, 1999, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jj@ultra.linux.cz> and
David S. Miller <davem@caip.rutgers.edu>.
@ -86,9 +86,9 @@ ENTRY(strchr)
6: xor %g4, %g2, %g5
sub %g4, %o2, %o4
#ifdef EIGHTBIT_NOT_RARE
sub %g5, %o2, %g7
sub %g5, %o2, %g6
andn %o4, %g4, %o4
andn %g7, %g5, %g5
andn %g6, %g5, %g5
#else
sub %g5, %o2, %g5
#endif
@ -237,9 +237,9 @@ ENTRY(strrchr)
7: xor %g4, %g2, %g5
sub %g4, %o2, %o4
#ifdef EIGHTBIT_NOT_RARE
sub %g5, %o2, %g7
sub %g5, %o2, %g6
andn %o4, %g4, %o4
andn %g7, %g5, %g5
andn %g6, %g5, %g5
#else
sub %g5, %o2, %g5
#endif

View File

@ -1,6 +1,6 @@
/* Compare two strings for differences.
For SPARC v7.
Copyright (C) 1996, 97, 99 Free Software Foundation, Inc.
Copyright (C) 1996, 97, 99, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jj@ultra.linux.cz>.
@ -144,13 +144,13 @@ ENTRY(strcmp)
andn %i1, 3, %i1
mov 32, %l1
ld [%i1], %l2
mov -1, %g7
mov -1, %g6
add %i1, 4, %i1
sub %l1, %g3, %l1
sll %g7, %g3, %g7
sll %g6, %g3, %g6
1: sll %l2, %g3, %g5
and %i4, %g7, %l3
and %i4, %g6, %l3
sub %i4, %i2, %g1
#ifdef EIGHTBIT_NOT_RARE
andn %g1, %i4, %g1

View File

@ -1,6 +1,6 @@
/* Copy SRC to DEST returning DEST.
For SPARC v7.
Copyright (C) 1996, 1999 Free Software Foundation, Inc.
Copyright (C) 1996, 1999, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jj@ultra.linux.cz>.
@ -125,12 +125,12 @@ ENTRY(strcpy)
srl %o5, 8, %g5
sth %g5, [%o0 + 2]
1: add %o0, 4, %o0
4: sll %o5, 24, %g7
4: sll %o5, 24, %g6
ld [%o1], %o5
add %o1, 4, %o1
srl %o5, 8, %g5
sub %o5, %o2, %o4
or %g5, %g7, %g5
or %g5, %g6, %g5
andcc %o4, %o3, %g0
be,a 1b
st %g5, [%o0]
@ -184,12 +184,12 @@ ENTRY(strcpy)
sth %g5, [%o0]
sub %o0, 2, %o0
1: add %o0, 4, %o0
4: sll %o5, 16, %g7
4: sll %o5, 16, %g6
ld [%o1], %o5
add %o1, 4, %o1
srl %o5, 16, %g5
sub %o5, %o2, %o4
or %g5, %g7, %g5
or %g5, %g6, %g5
andcc %o4, %o3, %g0
be,a 1b
st %g5, [%o0]
@ -234,12 +234,12 @@ ENTRY(strcpy)
stb %g5, [%o0]
sub %o0, 3, %o0
1: add %o0, 4, %o0
4: sll %o5, 8, %g7
4: sll %o5, 8, %g6
ld [%o1], %o5
add %o1, 4, %o1
srl %o5, 24, %g5
sub %o5, %o2, %o4
or %g5, %g7, %g5
or %g5, %g6, %g5
andcc %o4, %o3, %g0
be 1b
st %g5, [%o0]

View File

@ -1,5 +1,5 @@
/* High precision, low overhead timing functions. sparc64 version.
Copyright (C) 2001, 2002 Free Software Foundation, Inc.
Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller <davem@redhat.com>, 2001.
@ -63,7 +63,7 @@ do { \
" nop" \
: "=&r" (tmp1), "=&r" (tmp2) \
: "r" (__diff), "r" (&(Sum)) \
: "memory", "g1", "g5", "g7"); \
: "memory", "g1", "g5", "g6"); \
} while(0)
#define HP_TIMING_ACCUM_NT(Sum, Diff) (Sum) += (Diff)

View File

@ -1,6 +1,6 @@
/* Copy SIZE bytes from SRC to DEST.
For UltraSPARC.
Copyright (C) 1996, 97, 98, 99 Free Software Foundation, Inc.
Copyright (C) 1996, 97, 98, 99, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller (davem@caip.rutgers.edu) and
Jakub Jelinek (jakub@redhat.com).
@ -26,7 +26,7 @@
#define USE_BPR
.register %g2, #scratch
.register %g3, #scratch
.register %g7, #scratch
.register %g6, #scratch
#define XCC xcc
#endif
#define FPRS_FEF 4
@ -256,24 +256,24 @@ END(bcopy)
add %o0, 8, %o0 /* IEU0 */
202: membar #LoadStore | #StoreStore | #StoreLoad /* LSU Group */
wr %g0, ASI_BLK_P, %asi /* LSU Group */
subcc %o2, 0x40, %g7 /* IEU1 Group */
subcc %o2, 0x40, %g6 /* IEU1 Group */
mov %o1, %g1 /* IEU0 */
andncc %g7, (0x40 - 1), %g7 /* IEU1 Group */
andncc %g6, (0x40 - 1), %g6 /* IEU1 Group */
srl %g1, 3, %g2 /* IEU0 */
sub %o2, %g7, %g3 /* IEU0 Group */
sub %o2, %g6, %g3 /* IEU0 Group */
andn %o1, (0x40 - 1), %o1 /* IEU1 */
and %g2, 7, %g2 /* IEU0 Group */
andncc %g3, 0x7, %g3 /* IEU1 */
fmovd %f0, %f2 /* FPU */
sub %g3, 0x10, %g3 /* IEU0 Group */
sub %o2, %g7, %o2 /* IEU1 */
sub %o2, %g6, %o2 /* IEU1 */
alignaddr %g1, %g0, %g0 /* GRU Group */
add %g1, %g7, %g1 /* IEU0 Group */
add %g1, %g6, %g1 /* IEU0 Group */
subcc %o2, %g3, %o2 /* IEU1 */
ldda [%o1 + 0x00] %asi, %f0 /* LSU Group */
add %g1, %g3, %g1 /* IEU0 */
ldda [%o1 + 0x40] %asi, %f16 /* LSU Group */
sub %g7, 0x80, %g7 /* IEU0 */
sub %g6, 0x80, %g6 /* IEU0 */
ldda [%o1 + 0x80] %asi, %f32 /* LSU Group */
/* Clk1 Group 8-( */
/* Clk2 Group 8-( */
@ -286,9 +286,9 @@ END(bcopy)
addcc %o1, 0xc0, %o1 /* IEU1 Group */
.align 512 /* OK, here comes the fun part... */
300: FREG_FROB(f0, f2, f4, f6, f8, f10,f12,f14,f16) LOOP_CHUNK1(o1, o0, g7, 301f)
FREG_FROB(f16,f18,f20,f22,f24,f26,f28,f30,f32) LOOP_CHUNK2(o1, o0, g7, 302f)
FREG_FROB(f32,f34,f36,f38,f40,f42,f44,f46,f0) LOOP_CHUNK3(o1, o0, g7, 303f)
300: FREG_FROB(f0, f2, f4, f6, f8, f10,f12,f14,f16) LOOP_CHUNK1(o1, o0, g6, 301f)
FREG_FROB(f16,f18,f20,f22,f24,f26,f28,f30,f32) LOOP_CHUNK2(o1, o0, g6, 302f)
FREG_FROB(f32,f34,f36,f38,f40,f42,f44,f46,f0) LOOP_CHUNK3(o1, o0, g6, 303f)
b,pt %xcc, 300b+4; faligndata %f0, %f2, %f48
301: FREG_FROB(f16,f18,f20,f22,f24,f26,f28,f30,f32) STORE_SYNC(o0, f48) membar #Sync
FREG_FROB(f32,f34,f36,f38,f40,f42,f44,f46,f0) STORE_JUMP(o0, f48, 400f) membar #Sync
@ -297,9 +297,9 @@ END(bcopy)
303: FREG_FROB(f0, f2, f4, f6, f8, f10,f12,f14,f16) STORE_SYNC(o0, f48) membar #Sync
FREG_FROB(f16,f18,f20,f22,f24,f26,f28,f30,f32) STORE_JUMP(o0, f48, 432f) membar #Sync
VISLOOP_PAD
310: FREG_FROB(f2, f4, f6, f8, f10,f12,f14,f16,f18) LOOP_CHUNK1(o1, o0, g7, 311f)
FREG_FROB(f18,f20,f22,f24,f26,f28,f30,f32,f34) LOOP_CHUNK2(o1, o0, g7, 312f)
FREG_FROB(f34,f36,f38,f40,f42,f44,f46,f0, f2) LOOP_CHUNK3(o1, o0, g7, 313f)
310: FREG_FROB(f2, f4, f6, f8, f10,f12,f14,f16,f18) LOOP_CHUNK1(o1, o0, g6, 311f)
FREG_FROB(f18,f20,f22,f24,f26,f28,f30,f32,f34) LOOP_CHUNK2(o1, o0, g6, 312f)
FREG_FROB(f34,f36,f38,f40,f42,f44,f46,f0, f2) LOOP_CHUNK3(o1, o0, g6, 313f)
b,pt %xcc, 310b+4; faligndata %f2, %f4, %f48
311: FREG_FROB(f18,f20,f22,f24,f26,f28,f30,f32,f34) STORE_SYNC(o0, f48) membar #Sync
FREG_FROB(f34,f36,f38,f40,f42,f44,f46,f0, f2) STORE_JUMP(o0, f48, 402f) membar #Sync
@ -308,9 +308,9 @@ END(bcopy)
313: FREG_FROB(f2, f4, f6, f8, f10,f12,f14,f16,f18) STORE_SYNC(o0, f48) membar #Sync
FREG_FROB(f18,f20,f22,f24,f26,f28,f30,f32,f34) STORE_JUMP(o0, f48, 434f) membar #Sync
VISLOOP_PAD
320: FREG_FROB(f4, f6, f8, f10,f12,f14,f16,f18,f20) LOOP_CHUNK1(o1, o0, g7, 321f)
FREG_FROB(f20,f22,f24,f26,f28,f30,f32,f34,f36) LOOP_CHUNK2(o1, o0, g7, 322f)
FREG_FROB(f36,f38,f40,f42,f44,f46,f0, f2, f4) LOOP_CHUNK3(o1, o0, g7, 323f)
320: FREG_FROB(f4, f6, f8, f10,f12,f14,f16,f18,f20) LOOP_CHUNK1(o1, o0, g6, 321f)
FREG_FROB(f20,f22,f24,f26,f28,f30,f32,f34,f36) LOOP_CHUNK2(o1, o0, g6, 322f)
FREG_FROB(f36,f38,f40,f42,f44,f46,f0, f2, f4) LOOP_CHUNK3(o1, o0, g6, 323f)
b,pt %xcc, 320b+4; faligndata %f4, %f6, %f48
321: FREG_FROB(f20,f22,f24,f26,f28,f30,f32,f34,f36) STORE_SYNC(o0, f48) membar #Sync
FREG_FROB(f36,f38,f40,f42,f44,f46,f0, f2, f4) STORE_JUMP(o0, f48, 404f) membar #Sync
@ -319,9 +319,9 @@ END(bcopy)
323: FREG_FROB(f4, f6, f8, f10,f12,f14,f16,f18,f20) STORE_SYNC(o0, f48) membar #Sync
FREG_FROB(f20,f22,f24,f26,f28,f30,f32,f34,f36) STORE_JUMP(o0, f48, 436f) membar #Sync
VISLOOP_PAD
330: FREG_FROB(f6, f8, f10,f12,f14,f16,f18,f20,f22) LOOP_CHUNK1(o1, o0, g7, 331f)
FREG_FROB(f22,f24,f26,f28,f30,f32,f34,f36,f38) LOOP_CHUNK2(o1, o0, g7, 332f)
FREG_FROB(f38,f40,f42,f44,f46,f0, f2, f4, f6) LOOP_CHUNK3(o1, o0, g7, 333f)
330: FREG_FROB(f6, f8, f10,f12,f14,f16,f18,f20,f22) LOOP_CHUNK1(o1, o0, g6, 331f)
FREG_FROB(f22,f24,f26,f28,f30,f32,f34,f36,f38) LOOP_CHUNK2(o1, o0, g6, 332f)
FREG_FROB(f38,f40,f42,f44,f46,f0, f2, f4, f6) LOOP_CHUNK3(o1, o0, g6, 333f)
b,pt %xcc, 330b+4; faligndata %f6, %f8, %f48
331: FREG_FROB(f22,f24,f26,f28,f30,f32,f34,f36,f38) STORE_SYNC(o0, f48) membar #Sync
FREG_FROB(f38,f40,f42,f44,f46,f0, f2, f4, f6) STORE_JUMP(o0, f48, 406f) membar #Sync
@ -330,9 +330,9 @@ END(bcopy)
333: FREG_FROB(f6, f8, f10,f12,f14,f16,f18,f20,f22) STORE_SYNC(o0, f48) membar #Sync
FREG_FROB(f22,f24,f26,f28,f30,f32,f34,f36,f38) STORE_JUMP(o0, f48, 438f) membar #Sync
VISLOOP_PAD
340: FREG_FROB(f8, f10,f12,f14,f16,f18,f20,f22,f24) LOOP_CHUNK1(o1, o0, g7, 341f)
FREG_FROB(f24,f26,f28,f30,f32,f34,f36,f38,f40) LOOP_CHUNK2(o1, o0, g7, 342f)
FREG_FROB(f40,f42,f44,f46,f0, f2, f4, f6, f8) LOOP_CHUNK3(o1, o0, g7, 343f)
340: FREG_FROB(f8, f10,f12,f14,f16,f18,f20,f22,f24) LOOP_CHUNK1(o1, o0, g6, 341f)
FREG_FROB(f24,f26,f28,f30,f32,f34,f36,f38,f40) LOOP_CHUNK2(o1, o0, g6, 342f)
FREG_FROB(f40,f42,f44,f46,f0, f2, f4, f6, f8) LOOP_CHUNK3(o1, o0, g6, 343f)
b,pt %xcc, 340b+4; faligndata %f8, %f10, %f48
341: FREG_FROB(f24,f26,f28,f30,f32,f34,f36,f38,f40) STORE_SYNC(o0, f48) membar #Sync
FREG_FROB(f40,f42,f44,f46,f0, f2, f4, f6, f8) STORE_JUMP(o0, f48, 408f) membar #Sync
@ -341,9 +341,9 @@ END(bcopy)
343: FREG_FROB(f8, f10,f12,f14,f16,f18,f20,f22,f24) STORE_SYNC(o0, f48) membar #Sync
FREG_FROB(f24,f26,f28,f30,f32,f34,f36,f38,f40) STORE_JUMP(o0, f48, 440f) membar #Sync
VISLOOP_PAD
350: FREG_FROB(f10,f12,f14,f16,f18,f20,f22,f24,f26) LOOP_CHUNK1(o1, o0, g7, 351f)
FREG_FROB(f26,f28,f30,f32,f34,f36,f38,f40,f42) LOOP_CHUNK2(o1, o0, g7, 352f)
FREG_FROB(f42,f44,f46,f0, f2, f4, f6, f8, f10) LOOP_CHUNK3(o1, o0, g7, 353f)
350: FREG_FROB(f10,f12,f14,f16,f18,f20,f22,f24,f26) LOOP_CHUNK1(o1, o0, g6, 351f)
FREG_FROB(f26,f28,f30,f32,f34,f36,f38,f40,f42) LOOP_CHUNK2(o1, o0, g6, 352f)
FREG_FROB(f42,f44,f46,f0, f2, f4, f6, f8, f10) LOOP_CHUNK3(o1, o0, g6, 353f)
b,pt %xcc, 350b+4; faligndata %f10, %f12, %f48
351: FREG_FROB(f26,f28,f30,f32,f34,f36,f38,f40,f42) STORE_SYNC(o0, f48) membar #Sync
FREG_FROB(f42,f44,f46,f0, f2, f4, f6, f8, f10) STORE_JUMP(o0, f48, 410f) membar #Sync
@ -352,9 +352,9 @@ END(bcopy)
353: FREG_FROB(f10,f12,f14,f16,f18,f20,f22,f24,f26) STORE_SYNC(o0, f48) membar #Sync
FREG_FROB(f26,f28,f30,f32,f34,f36,f38,f40,f42) STORE_JUMP(o0, f48, 442f) membar #Sync
VISLOOP_PAD
360: FREG_FROB(f12,f14,f16,f18,f20,f22,f24,f26,f28) LOOP_CHUNK1(o1, o0, g7, 361f)
FREG_FROB(f28,f30,f32,f34,f36,f38,f40,f42,f44) LOOP_CHUNK2(o1, o0, g7, 362f)
FREG_FROB(f44,f46,f0, f2, f4, f6, f8, f10,f12) LOOP_CHUNK3(o1, o0, g7, 363f)
360: FREG_FROB(f12,f14,f16,f18,f20,f22,f24,f26,f28) LOOP_CHUNK1(o1, o0, g6, 361f)
FREG_FROB(f28,f30,f32,f34,f36,f38,f40,f42,f44) LOOP_CHUNK2(o1, o0, g6, 362f)
FREG_FROB(f44,f46,f0, f2, f4, f6, f8, f10,f12) LOOP_CHUNK3(o1, o0, g6, 363f)
b,pt %xcc, 360b+4; faligndata %f12, %f14, %f48
361: FREG_FROB(f28,f30,f32,f34,f36,f38,f40,f42,f44) STORE_SYNC(o0, f48) membar #Sync
FREG_FROB(f44,f46,f0, f2, f4, f6, f8, f10,f12) STORE_JUMP(o0, f48, 412f) membar #Sync
@ -363,9 +363,9 @@ END(bcopy)
363: FREG_FROB(f12,f14,f16,f18,f20,f22,f24,f26,f28) STORE_SYNC(o0, f48) membar #Sync
FREG_FROB(f28,f30,f32,f34,f36,f38,f40,f42,f44) STORE_JUMP(o0, f48, 444f) membar #Sync
VISLOOP_PAD
370: FREG_FROB(f14,f16,f18,f20,f22,f24,f26,f28,f30) LOOP_CHUNK1(o1, o0, g7, 371f)
FREG_FROB(f30,f32,f34,f36,f38,f40,f42,f44,f46) LOOP_CHUNK2(o1, o0, g7, 372f)
FREG_FROB(f46,f0, f2, f4, f6, f8, f10,f12,f14) LOOP_CHUNK3(o1, o0, g7, 373f)
370: FREG_FROB(f14,f16,f18,f20,f22,f24,f26,f28,f30) LOOP_CHUNK1(o1, o0, g6, 371f)
FREG_FROB(f30,f32,f34,f36,f38,f40,f42,f44,f46) LOOP_CHUNK2(o1, o0, g6, 372f)
FREG_FROB(f46,f0, f2, f4, f6, f8, f10,f12,f14) LOOP_CHUNK3(o1, o0, g6, 373f)
b,pt %xcc, 370b+4; faligndata %f14, %f16, %f48
371: FREG_FROB(f30,f32,f34,f36,f38,f40,f42,f44,f46) STORE_SYNC(o0, f48) membar #Sync
FREG_FROB(f46,f0, f2, f4, f6, f8, f10,f12,f14) STORE_JUMP(o0, f48, 414f) membar #Sync
@ -476,11 +476,11 @@ ENTRY(__align_cpy_8)
cmp %o2, (64 * 6) /* IEU1 Group */
bgeu,pn %xcc, 201b /* CTI */
andcc %o0, 0x38, %g5 /* IEU1 Group */
andcc %o2, -128, %g7 /* IEU1 Group */
andcc %o2, -128, %g6 /* IEU1 Group */
bne,a,pt %xcc, 82f + 4 /* CTI */
ldx [%o1], %g1 /* Load */
ba,pt %xcc, 41f /* CTI Group */
andcc %o2, 0x70, %g7 /* IEU1 */
andcc %o2, 0x70, %g6 /* IEU1 */
END(__align_cpy_8)
/* void *__align_cpy_16(void *dest, void *src, size_t n)
@ -494,11 +494,11 @@ ENTRY(__align_cpy_16)
cmp %o2, (64 * 6) /* IEU1 */
bgeu,pn %xcc, 201b /* CTI */
andcc %o0, 0x38, %g5 /* IEU1 Group */
andcc %o2, -128, %g7 /* IEU1 Group */
andcc %o2, -128, %g6 /* IEU1 Group */
bne,a,pt %xcc, 82f + 4 /* CTI */
ldx [%o1], %g1 /* Load */
ba,pt %xcc, 41f /* CTI Group */
andcc %o2, 0x70, %g7 /* IEU1 */
andcc %o2, 0x70, %g6 /* IEU1 */
END(__align_cpy_16)
#endif
@ -538,13 +538,13 @@ ENTRY(memcpy)
sth %g2, [%o0 - 2] /* Store Group + bubble */
5: andcc %o1, 4, %g0 /* IEU1 */
216: be,a,pn %xcc, 2f /* CTI */
andcc %o2, -128, %g7 /* IEU1 Group */
andcc %o2, -128, %g6 /* IEU1 Group */
lduw [%o1], %g5 /* Load Group */
add %o1, 4, %o1 /* IEU0 */
add %o0, 4, %o0 /* IEU1 */
sub %o2, 4, %o2 /* IEU0 Group */
stw %g5, [%o0 - 4] /* Store */
andcc %o2, -128, %g7 /* IEU1 Group */
andcc %o2, -128, %g6 /* IEU1 Group */
2: be,pn %xcc, 215f /* CTI */
andcc %o0, 4, %g0 /* IEU1 Group */
be,pn %xcc, 82f + 4 /* CTI Group */
@ -552,11 +552,11 @@ ENTRY(memcpy)
MOVE_BIGCHUNK(o1, o0, 0x20, g1, g3, g5, o5)
MOVE_BIGCHUNK(o1, o0, 0x40, g1, g3, g5, o5)
MOVE_BIGCHUNK(o1, o0, 0x60, g1, g3, g5, o5)
35: subcc %g7, 128, %g7 /* IEU1 Group */
35: subcc %g6, 128, %g6 /* IEU1 Group */
add %o1, 128, %o1 /* IEU0 */
bne,pt %xcc, 5b /* CTI */
add %o0, 128, %o0 /* IEU0 Group */
215: andcc %o2, 0x70, %g7 /* IEU1 Group */
215: andcc %o2, 0x70, %g6 /* IEU1 Group */
41: be,pn %xcc, 80f /* CTI */
andcc %o2, 8, %g0 /* IEU1 Group */
/* Clk1 8-( */
@ -564,11 +564,11 @@ ENTRY(memcpy)
/* Clk3 8-( */
/* Clk4 8-( */
79: rd %pc, %o5 /* PDU Group */
sll %g7, 1, %g5 /* IEU0 Group */
add %o1, %g7, %o1 /* IEU1 */
sll %g6, 1, %g5 /* IEU0 Group */
add %o1, %g6, %o1 /* IEU1 */
sub %o5, %g5, %o5 /* IEU0 Group */
jmpl %o5 + %lo(80f - 79b), %g0 /* CTI Group brk forced*/
add %o0, %g7, %o0 /* IEU0 Group */
add %o0, %g6, %o0 /* IEU0 Group */
36: MOVE_LASTCHUNK(o1, o0, 0x60, g2, g3, g5, o5)
MOVE_LASTCHUNK(o1, o0, 0x50, g2, g3, g5, o5)
MOVE_LASTCHUNK(o1, o0, 0x40, g2, g3, g5, o5)
@ -605,11 +605,11 @@ ENTRY(memcpy)
82: MOVE_BIGALIGNCHUNK(o1, o0, 0x00, g1, g3, g5, o5)
MOVE_BIGALIGNCHUNK(o1, o0, 0x40, g1, g3, g5, o5)
37: subcc %g7, 128, %g7 /* IEU1 Group */
37: subcc %g6, 128, %g6 /* IEU1 Group */
add %o1, 128, %o1 /* IEU0 */
bne,pt %xcc, 82b /* CTI */
add %o0, 128, %o0 /* IEU0 Group */
andcc %o2, 0x70, %g7 /* IEU1 */
andcc %o2, 0x70, %g6 /* IEU1 */
be,pn %xcc, 84f /* CTI */
andcc %o2, 8, %g0 /* IEU1 Group */
/* Clk1 8-( */
@ -617,10 +617,10 @@ ENTRY(memcpy)
/* Clk3 8-( */
/* Clk4 8-( */
83: rd %pc, %o5 /* PDU Group */
add %o1, %g7, %o1 /* IEU0 Group */
sub %o5, %g7, %o5 /* IEU1 */
add %o1, %g6, %o1 /* IEU0 Group */
sub %o5, %g6, %o5 /* IEU1 */
jmpl %o5 + %lo(84f - 83b), %g0 /* CTI Group brk forced*/
add %o0, %g7, %o0 /* IEU0 Group */
add %o0, %g6, %o0 /* IEU0 Group */
38: MOVE_LASTALIGNCHUNK(o1, o0, 0x60, g2, g3)
MOVE_LASTALIGNCHUNK(o1, o0, 0x50, g2, g3)
MOVE_LASTALIGNCHUNK(o1, o0, 0x40, g2, g3)
@ -756,13 +756,13 @@ ENTRY(memmove)
sth %g2, [%o0] /* Store Group + bubble */
5: andcc %o1, 4, %g0 /* IEU1 */
236: be,a,pn %xcc, 2f /* CTI */
andcc %o2, -128, %g7 /* IEU1 Group */
andcc %o2, -128, %g6 /* IEU1 Group */
lduw [%o1 - 4], %g5 /* Load Group */
sub %o1, 4, %o1 /* IEU0 */
sub %o0, 4, %o0 /* IEU1 */
sub %o2, 4, %o2 /* IEU0 Group */
stw %g5, [%o0] /* Store */
andcc %o2, -128, %g7 /* IEU1 Group */
andcc %o2, -128, %g6 /* IEU1 Group */
2: be,pn %xcc, 235f /* CTI */
andcc %o0, 4, %g0 /* IEU1 Group */
be,pn %xcc, 282f + 4 /* CTI Group */
@ -770,11 +770,11 @@ ENTRY(memmove)
RMOVE_BIGCHUNK(o1, o0, 0x20, g1, g3, g5, o5)
RMOVE_BIGCHUNK(o1, o0, 0x40, g1, g3, g5, o5)
RMOVE_BIGCHUNK(o1, o0, 0x60, g1, g3, g5, o5)
subcc %g7, 128, %g7 /* IEU1 Group */
subcc %g6, 128, %g6 /* IEU1 Group */
sub %o1, 128, %o1 /* IEU0 */
bne,pt %xcc, 5b /* CTI */
sub %o0, 128, %o0 /* IEU0 Group */
235: andcc %o2, 0x70, %g7 /* IEU1 Group */
235: andcc %o2, 0x70, %g6 /* IEU1 Group */
41: be,pn %xcc, 280f /* CTI */
andcc %o2, 8, %g0 /* IEU1 Group */
/* Clk1 8-( */
@ -782,11 +782,11 @@ ENTRY(memmove)
/* Clk3 8-( */
/* Clk4 8-( */
279: rd %pc, %o5 /* PDU Group */
sll %g7, 1, %g5 /* IEU0 Group */
sub %o1, %g7, %o1 /* IEU1 */
sll %g6, 1, %g5 /* IEU0 Group */
sub %o1, %g6, %o1 /* IEU1 */
sub %o5, %g5, %o5 /* IEU0 Group */
jmpl %o5 + %lo(280f - 279b), %g0 /* CTI Group brk forced*/
sub %o0, %g7, %o0 /* IEU0 Group */
sub %o0, %g6, %o0 /* IEU0 Group */
RMOVE_LASTCHUNK(o1, o0, 0x60, g2, g3, g5, o5)
RMOVE_LASTCHUNK(o1, o0, 0x50, g2, g3, g5, o5)
RMOVE_LASTCHUNK(o1, o0, 0x40, g2, g3, g5, o5)
@ -823,11 +823,11 @@ ENTRY(memmove)
282: RMOVE_BIGALIGNCHUNK(o1, o0, 0x00, g1, g3, g5, o5)
RMOVE_BIGALIGNCHUNK(o1, o0, 0x40, g1, g3, g5, o5)
subcc %g7, 128, %g7 /* IEU1 Group */
subcc %g6, 128, %g6 /* IEU1 Group */
sub %o1, 128, %o1 /* IEU0 */
bne,pt %xcc, 282b /* CTI */
sub %o0, 128, %o0 /* IEU0 Group */
andcc %o2, 0x70, %g7 /* IEU1 */
andcc %o2, 0x70, %g6 /* IEU1 */
be,pn %xcc, 284f /* CTI */
andcc %o2, 8, %g0 /* IEU1 Group */
/* Clk1 8-( */
@ -835,10 +835,10 @@ ENTRY(memmove)
/* Clk3 8-( */
/* Clk4 8-( */
283: rd %pc, %o5 /* PDU Group */
sub %o1, %g7, %o1 /* IEU0 Group */
sub %o5, %g7, %o5 /* IEU1 */
sub %o1, %g6, %o1 /* IEU0 Group */
sub %o5, %g6, %o5 /* IEU1 */
jmpl %o5 + %lo(284f - 283b), %g0 /* CTI Group brk forced*/
sub %o0, %g7, %o0 /* IEU0 Group */
sub %o0, %g6, %o0 /* IEU0 Group */
RMOVE_LASTALIGNCHUNK(o1, o0, 0x60, g2, g3)
RMOVE_LASTALIGNCHUNK(o1, o0, 0x50, g2, g3)
RMOVE_LASTALIGNCHUNK(o1, o0, 0x40, g2, g3)

View File

@ -1,6 +1,6 @@
/* Copy SIZE bytes from SRC to DEST.
For UltraSPARC-III.
Copyright (C) 2001 Free Software Foundation, Inc.
Copyright (C) 2001, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller (davem@redhat.com)
@ -547,13 +547,13 @@ ENTRY(memmove)
sth %g2, [%o0] /* Store Group + bubble */
5: andcc %o1, 4, %g0 /* IEU1 */
236: be,a,pn %xcc, 2f /* CTI */
andcc %o2, -128, %g7 /* IEU1 Group */
andcc %o2, -128, %g6 /* IEU1 Group */
lduw [%o1 - 4], %g5 /* Load Group */
sub %o1, 4, %o1 /* IEU0 */
sub %o0, 4, %o0 /* IEU1 */
sub %o2, 4, %o2 /* IEU0 Group */
stw %g5, [%o0] /* Store */
andcc %o2, -128, %g7 /* IEU1 Group */
andcc %o2, -128, %g6 /* IEU1 Group */
2: be,pn %xcc, 235f /* CTI */
andcc %o0, 4, %g0 /* IEU1 Group */
be,pn %xcc, 282f + 4 /* CTI Group */
@ -561,11 +561,11 @@ ENTRY(memmove)
RMOVE_BIGCHUNK(o1, o0, 0x20, g1, g3, g5, o5)
RMOVE_BIGCHUNK(o1, o0, 0x40, g1, g3, g5, o5)
RMOVE_BIGCHUNK(o1, o0, 0x60, g1, g3, g5, o5)
subcc %g7, 128, %g7 /* IEU1 Group */
subcc %g6, 128, %g6 /* IEU1 Group */
sub %o1, 128, %o1 /* IEU0 */
bne,pt %xcc, 5b /* CTI */
sub %o0, 128, %o0 /* IEU0 Group */
235: andcc %o2, 0x70, %g7 /* IEU1 Group */
235: andcc %o2, 0x70, %g6 /* IEU1 Group */
41: be,pn %xcc, 280f /* CTI */
andcc %o2, 8, %g0 /* IEU1 Group */
/* Clk1 8-( */
@ -573,11 +573,11 @@ ENTRY(memmove)
/* Clk3 8-( */
/* Clk4 8-( */
279: rd %pc, %o5 /* PDU Group */
sll %g7, 1, %g5 /* IEU0 Group */
sub %o1, %g7, %o1 /* IEU1 */
sll %g6, 1, %g5 /* IEU0 Group */
sub %o1, %g6, %o1 /* IEU1 */
sub %o5, %g5, %o5 /* IEU0 Group */
jmpl %o5 + %lo(280f - 279b), %g0 /* CTI Group brk forced*/
sub %o0, %g7, %o0 /* IEU0 Group */
sub %o0, %g6, %o0 /* IEU0 Group */
RMOVE_LASTCHUNK(o1, o0, 0x60, g2, g3, g5, o5)
RMOVE_LASTCHUNK(o1, o0, 0x50, g2, g3, g5, o5)
RMOVE_LASTCHUNK(o1, o0, 0x40, g2, g3, g5, o5)
@ -614,11 +614,11 @@ ENTRY(memmove)
282: RMOVE_BIGALIGNCHUNK(o1, o0, 0x00, g1, g3, g5, o5)
RMOVE_BIGALIGNCHUNK(o1, o0, 0x40, g1, g3, g5, o5)
subcc %g7, 128, %g7 /* IEU1 Group */
subcc %g6, 128, %g6 /* IEU1 Group */
sub %o1, 128, %o1 /* IEU0 */
bne,pt %xcc, 282b /* CTI */
sub %o0, 128, %o0 /* IEU0 Group */
andcc %o2, 0x70, %g7 /* IEU1 */
andcc %o2, 0x70, %g6 /* IEU1 */
be,pn %xcc, 284f /* CTI */
andcc %o2, 8, %g0 /* IEU1 Group */
/* Clk1 8-( */
@ -626,10 +626,10 @@ ENTRY(memmove)
/* Clk3 8-( */
/* Clk4 8-( */
283: rd %pc, %o5 /* PDU Group */
sub %o1, %g7, %o1 /* IEU0 Group */
sub %o5, %g7, %o5 /* IEU1 */
sub %o1, %g6, %o1 /* IEU0 Group */
sub %o5, %g6, %o5 /* IEU1 */
jmpl %o5 + %lo(284f - 283b), %g0 /* CTI Group brk forced*/
sub %o0, %g7, %o0 /* IEU0 Group */
sub %o0, %g6, %o0 /* IEU0 Group */
RMOVE_LASTALIGNCHUNK(o1, o0, 0x60, g2, g3)
RMOVE_LASTALIGNCHUNK(o1, o0, 0x50, g2, g3)
RMOVE_LASTALIGNCHUNK(o1, o0, 0x40, g2, g3)

View File

@ -1,6 +1,6 @@
/* Copy SRC to DEST returning the address of the terminating '\0' in DEST.
For SPARC v9.
Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz> and
Jakub Jelinek <jj@ultra.linux.cz>.
@ -25,7 +25,7 @@
#ifndef XCC
.register %g2, #scratch
.register %g3, #scratch
.register %g7, #scratch
.register %g6, #scratch
#endif
/* Normally, this uses
@ -111,8 +111,8 @@ ENTRY(__stpcpy)
.align 16
6: ba,pt %xcc, 23f /* CTI Group */
sub %o0, 3, %g7 /* IEU0 */
5: sub %o0, 2, %g7 /* IEU0 Group */
sub %o0, 3, %g6 /* IEU0 */
5: sub %o0, 2, %g6 /* IEU0 Group */
stb %g5, [%o0 - 2] /* Store */
srlx %g3, 16, %g4 /* IEU0 Group */
@ -121,27 +121,27 @@ ENTRY(__stpcpy)
stw %g4, [%o0 - 8] /* Store */
retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
8: ba,pt %xcc, 24f /* CTI Group */
sub %o0, 5, %g7 /* IEU0 */
sub %o0, 5, %g6 /* IEU0 */
7: sub %o0, 4, %g7 /* IEU0 Group */
7: sub %o0, 4, %g6 /* IEU0 Group */
stb %g5, [%o0 - 4] /* Store */
srlx %g3, 32, %g4 /* IEU0 Group */
24: stw %g4, [%o0 - 8] /* Store */
retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
10: ba,pt %xcc, 25f /* CTI Group */
sub %o0, 7, %g7 /* IEU0 */
sub %o0, 7, %g6 /* IEU0 */
9: sub %o0, 6, %g7 /* IEU0 Group */
9: sub %o0, 6, %g6 /* IEU0 Group */
stb %g5, [%o0 - 6] /* Store */
srlx %g3, 48, %g4 /* IEU0 */
25: sth %g4, [%o0 - 8] /* Store Group */
retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
11: stb %g5, [%o0 - 8] /* Store Group */
retl /* CTI+IEU1 Group */
@ -230,13 +230,13 @@ ENTRY(__stpcpy)
.align 16
17: ba,pt %xcc, 26f /* CTI Group */
subcc %o0, 3, %g7 /* IEU1 */
subcc %o0, 3, %g6 /* IEU1 */
18: ba,pt %xcc, 27f /* CTI Group */
subcc %o0, 4, %g7 /* IEU1 */
subcc %o0, 4, %g6 /* IEU1 */
19: ba,pt %xcc, 28f /* CTI Group */
subcc %o0, 5, %g7 /* IEU1 */
16: subcc %o0, 2, %g7 /* IEU1 Group */
subcc %o0, 5, %g6 /* IEU1 */
16: subcc %o0, 2, %g6 /* IEU1 Group */
srlx %o3, 8, %o4 /* IEU0 */
stb %o4, [%o0 - 2] /* Store */
@ -249,15 +249,15 @@ ENTRY(__stpcpy)
stw %o4, [%o0 - 8] /* Store */
retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
.align 16
21: ba,pt %xcc, 29f /* CTI Group */
subcc %o0, 7, %g7 /* IEU1 */
subcc %o0, 7, %g6 /* IEU1 */
22: ba,pt %xcc, 30f /* CTI Group */
subcc %o0, 8, %g7 /* IEU1 */
subcc %o0, 8, %g6 /* IEU1 */
20: subcc %o0, 6, %g7 /* IEU1 Group */
20: subcc %o0, 6, %g6 /* IEU1 Group */
srlx %o3, 40, %o4 /* IEU0 */
stb %o4, [%o0 - 6] /* Store */
29: srlx %o3, 48, %o4 /* IEU0 Group */
@ -267,7 +267,7 @@ ENTRY(__stpcpy)
stb %o4, [%o0 - 8] /* Store */
retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
END(__stpcpy)
weak_alias (__stpcpy, stpcpy)

View File

@ -2,7 +2,7 @@
SRC to DEST, returning the address of the terminating '\0' in
DEST, if any, or else DEST + N.
For SPARC v9.
Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jj@ultra.linux.cz> and
Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz>.
@ -29,7 +29,7 @@
#define USE_BPR
.register %g2, #scratch
.register %g3, #scratch
.register %g7, #scratch
.register %g6, #scratch
#endif
/* Normally, this uses
@ -112,7 +112,7 @@ ENTRY(__stpncpy)
srlx %g3, 8, %g5 /* IEU0 */
andcc %g5, 0xff, %g0 /* IEU1 Group */
be,pn %icc, 10f /* CTI */
sub %o0, 1, %g7 /* IEU0 */
sub %o0, 1, %g6 /* IEU0 */
andcc %g3, 0xff, %g0 /* IEU1 Group */
bne,pt %icc, 2b /* CTI */
@ -156,31 +156,31 @@ ENTRY(__stpncpy)
stb %g0, [%o0] /* Store */
9: retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
10: subcc %o0, 2, %g7 /* IEU1 Group */
mov %g6, %o0 /* IEU0 */
10: subcc %o0, 2, %g6 /* IEU1 Group */
ba,pt %xcc, 3b /* CTI */
sllx %g5, 8, %g3 /* IEU0 */
11: subcc %o0, 3, %g7 /* IEU1 Group */
11: subcc %o0, 3, %g6 /* IEU1 Group */
ba,pt %xcc, 3b /* CTI */
sllx %g4, 16, %g3 /* IEU0 */
12: subcc %o0, 4, %g7 /* IEU1 Group */
12: subcc %o0, 4, %g6 /* IEU1 Group */
ba,pt %xcc, 3b /* CTI */
sllx %g5, 24, %g3 /* IEU0 */
13: subcc %o0, 5, %g7 /* IEU1 Group */
13: subcc %o0, 5, %g6 /* IEU1 Group */
ba,pt %xcc, 3b /* CTI */
sllx %g4, 32, %g3 /* IEU0 */
14: subcc %o0, 6, %g7 /* IEU1 Group */
14: subcc %o0, 6, %g6 /* IEU1 Group */
ba,pt %xcc, 3b /* CTI */
sllx %g5, 40, %g3 /* IEU0 */
15: subcc %o0, 7, %g7 /* IEU1 Group */
15: subcc %o0, 7, %g6 /* IEU1 Group */
ba,pt %xcc, 3b /* CTI */
sllx %g4, 48, %g3 /* IEU0 */
16: subcc %o0, 8, %g7 /* IEU1 Group */
16: subcc %o0, 8, %g6 /* IEU1 Group */
ba,pt %xcc, 3b /* CTI */
clr %g3 /* IEU0 */
@ -255,7 +255,7 @@ ENTRY(__stpncpy)
19: retl /* CTI+IEU1 Group */
nop /* IEU0 */
20: mov %o0, %g7 /* IEU0 Group */
20: mov %o0, %g6 /* IEU0 Group */
subcc %o2, 1, %o2 /* IEU1 */
be,pn %XCC, 51f /* CTI */
add %o0, 1, %o0 /* IEU0 Group */
@ -266,7 +266,7 @@ ENTRY(__stpncpy)
add %o0, 1, %o0 /* IEU0 */
51: retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
.align 16
21: andcc %o2, 4, %g0 /* IEU1 Group */
@ -295,7 +295,7 @@ ENTRY(__stpncpy)
add %o0, 1, %o0 /* IEU0 */
.align 16
55: sub %o0, 1, %g7 /* IEU0 Group */
55: sub %o0, 1, %g6 /* IEU0 Group */
25: andcc %o0, 7, %g0 /* IEU1 */
be,a,pn %icc, 4b /* CTI */
andncc %o2, 31, %g3 /* IEU1 Group */
@ -306,7 +306,7 @@ ENTRY(__stpncpy)
add %o0, 1, %o0 /* IEU0 Group */
retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
.align 16
26: ldub [%o1], %o3 /* Load */
@ -363,23 +363,23 @@ ENTRY(__stpncpy)
andcc %o4, 0xff, %g0 /* IEU1 Group */
be,pn %icc, 36f /* CTI */
srlx %o3, 48, %g7 /* IEU0 */
andcc %g7, 0xff, %g0 /* IEU1 Group */
srlx %o3, 48, %g6 /* IEU0 */
andcc %g6, 0xff, %g0 /* IEU1 Group */
be,pn %icc, 35f /* CTI */
srlx %o3, 40, %o4 /* IEU0 */
andcc %o4, 0xff, %g0 /* IEU1 Group */
be,pn %icc, 34f /* CTI */
srlx %o3, 32, %g7 /* IEU0 */
srlx %o3, 32, %g6 /* IEU0 */
andcc %g7, 0xff, %g0 /* IEU1 Group */
andcc %g6, 0xff, %g0 /* IEU1 Group */
be,pn %icc, 33f /* CTI */
srlx %o3, 24, %o4 /* IEU0 */
andcc %o4, 0xff, %g0 /* IEU1 Group */
be,pn %icc, 32f /* CTI */
srlx %o3, 16, %g7 /* IEU0 */
andcc %g7, 0xff, %g0 /* IEU1 Group */
srlx %o3, 16, %g6 /* IEU0 */
andcc %g6, 0xff, %g0 /* IEU1 Group */
be,pn %icc, 31f /* CTI */
srlx %o3, 8, %o4 /* IEU0 */
@ -389,33 +389,33 @@ ENTRY(__stpncpy)
bne,pn %icc, 29b /* CTI */
stx %o3, [%o0-8] /* Store */
sub %o0, 1, %g7 /* IEU0 Group */
sub %o0, 1, %g6 /* IEU0 Group */
ba,pt %xcc, 4b /* CTI */
andncc %o2, 31, %g3 /* IEU1 */
30: subcc %o0, 2, %g7 /* IEU0 */
30: subcc %o0, 2, %g6 /* IEU0 */
ba,pt %xcc, 3b /* CTI */
sllx %o4, 8, %g3 /* IEU0 Group */
31: sllx %g7, 16, %g3 /* IEU0 Group */
31: sllx %g6, 16, %g3 /* IEU0 Group */
ba,pt %xcc, 3b /* CTI */
sub %o0, 3, %g7 /* IEU1 */
32: subcc %o0, 4, %g7 /* IEU1 Group */
sub %o0, 3, %g6 /* IEU1 */
32: subcc %o0, 4, %g6 /* IEU1 Group */
ba,pt %xcc, 3b /* CTI */
sllx %o4, 24, %g3 /* IEU0 */
33: sllx %g7, 32, %g3 /* IEU0 Group */
33: sllx %g6, 32, %g3 /* IEU0 Group */
ba,pt %xcc, 3b /* CTI */
sub %o0, 5, %g7 /* IEU1 */
34: subcc %o0, 6, %g7 /* IEU1 Group */
sub %o0, 5, %g6 /* IEU1 */
34: subcc %o0, 6, %g6 /* IEU1 Group */
ba,pt %xcc, 3b /* CTI */
sllx %o4, 40, %g3 /* IEU0 */
35: sllx %g7, 48, %g3 /* IEU0 Group */
35: sllx %g6, 48, %g3 /* IEU0 Group */
ba,pt %xcc, 3b /* CTI */
sub %o0, 7, %g7 /* IEU1 */
36: subcc %o0, 8, %g7 /* IEU1 Group */
sub %o0, 7, %g6 /* IEU1 */
36: subcc %o0, 8, %g6 /* IEU1 Group */
ba,pt %xcc, 3b /* CTI */
sllx %o4, 56, %g3 /* IEU0 */

View File

@ -1,6 +1,6 @@
/* strcat (dest, src) -- Append SRC on the end of DEST.
For SPARC v9.
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jj@ultra.linux.cz> and
Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz>.
@ -27,7 +27,7 @@
#define USE_BPR
.register %g2, #scratch
.register %g3, #scratch
.register %g7, #scratch
.register %g6, #scratch
#endif
/* Normally, this uses
@ -52,7 +52,7 @@ ENTRY(strcat)
sethi %hi(0x01010101), %g1 /* IEU0 Group */
ldub [%o0], %o3 /* Load */
or %g1, %lo(0x01010101), %g1 /* IEU0 Group */
mov %o0, %g7 /* IEU1 */
mov %o0, %g6 /* IEU1 */
sllx %g1, 32, %g2 /* IEU0 Group */
andcc %o0, 7, %g0 /* IEU1 */
@ -192,7 +192,7 @@ ENTRY(strcat)
bne,pt %icc, 3b /* CTI */
mov %o3, %g3 /* IEU0 Group */
4: retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
.align 16
5: stb %g5, [%o0 - 2] /* Store Group */
@ -202,23 +202,23 @@ ENTRY(strcat)
stw %g4, [%o0 - 8] /* Store Group */
retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
7: stb %g5, [%o0 - 4] /* Store Group */
srlx %g3, 32, %g4 /* IEU0 */
8: stw %g4, [%o0 - 8] /* Store Group */
retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
9: stb %g5, [%o0 - 6] /* Store Group */
srlx %g3, 48, %g4 /* IEU0 */
10: sth %g4, [%o0 - 8] /* Store Group */
retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
11: stb %g5, [%o0 - 8] /* Store Group */
retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
.align 16
32: andcc %o0, 7, %g0 /* IEU1 Group */
@ -309,7 +309,7 @@ ENTRY(strcat)
stx %o3, [%o0 - 8] /* Store */
retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
.align 16
16: srlx %o3, 8, %o4 /* IEU0 Group */
@ -323,7 +323,7 @@ ENTRY(strcat)
stw %o4, [%o0 - 8] /* Store */
retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
nop
nop
@ -335,5 +335,5 @@ ENTRY(strcat)
22: srlx %o3, 56, %o4 /* IEU0 Group */
stb %o4, [%o0 - 8] /* Store */
retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
END(strcat)

View File

@ -1,6 +1,6 @@
/* strchr (str, ch) -- Return pointer to first occurrence of CH in STR.
For SPARC v9.
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz> and
Jakub Jelinek <jj@ultra.linux.cz>.
@ -27,7 +27,7 @@
#define USE_BPR
.register %g2, #scratch
.register %g3, #scratch
.register %g7, #scratch
.register %g6, #scratch
#endif
/* Normally, this uses
@ -86,10 +86,10 @@ ENTRY(strchr)
sub %o4, %g1, %o5 /* IEU1 */
#ifdef EIGHTBIT_NOT_RARE
andn %o2, %o3, %g7 /* IEU0 Group */
andn %o2, %o3, %g6 /* IEU0 Group */
andn %o5, %o4, %o5 /* IEU1 */
ldxa [%o0] ASI_PNF, %o3 /* Load */
or %o5, %g7, %o5 /* IEU0 Group */
or %o5, %g6, %o5 /* IEU0 Group */
#else
ldxa [%o0] ASI_PNF, %o3 /* Load */
or %o5, %o2, %o5 /* IEU0 Group */
@ -240,9 +240,9 @@ ENTRY(strchr)
19: sub %o3, %g1, %o2 /* IEU0 Group */
#ifdef EIGHTBIT_NOT_RARE
andn %o2, %o3, %g7 /* IEU0 Group */
andn %o2, %o3, %g6 /* IEU0 Group */
ldxa [%o0] ASI_PNF, %o3 /* Load */
andcc %g7, %g2, %g0 /* IEU1 Group */
andcc %g6, %g2, %g0 /* IEU1 Group */
#else
ldxa [%o0] ASI_PNF, %o3 /* Load */
andcc %o2, %g2, %g0 /* IEU1 Group */
@ -364,11 +364,11 @@ ENTRY(strrchr)
3: sub %o4, %g1, %o5 /* IEU1 */
#ifdef EIGHTBIT_NOT_RARE
andn %o2, %o3, %g7 /* IEU0 Group */
andn %o2, %o3, %g6 /* IEU0 Group */
andn %o5, %o4, %o5 /* IEU1 */
ldxa [%o0] ASI_PNF, %o3 /* Load */
or %o5, %g7, %o5 /* IEU0 Group */
or %o5, %g6, %o5 /* IEU0 Group */
#else
ldxa [%o0] ASI_PNF, %o3 /* Load */

View File

@ -1,6 +1,6 @@
/* Compare two strings for differences.
For SPARC v9.
Copyright (C) 1997, 1999 Free Software Foundation, Inc.
Copyright (C) 1997, 1999, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz> and
Jakub Jelinek <jj@ultra.linux.cz>.
@ -25,7 +25,7 @@
#ifndef XCC
.register %g2, #scratch
.register %g3, #scratch
.register %g7, #scratch
.register %g6, #scratch
#endif
/* Normally, this uses
@ -117,7 +117,7 @@ ENTRY(strcmp)
clr %o0 /* IEU0 */
.align 32
13: mov 0xff, %g7 /* IEU0 Group */
13: mov 0xff, %g6 /* IEU0 Group */
#ifdef EIGHTBIT_NOT_RARE
andcc %g4, %g2, %g0 /* IEU1 */
#else
@ -129,34 +129,34 @@ ENTRY(strcmp)
srlx %g3, 32, %g3 /* IEU0 */
andcc %g3, %g2, %g0 /* IEU1 Group */
be,pt %xcc, 23f /* CTI */
sllx %g7, 56, %o5 /* IEU0 */
sllx %g6, 56, %o5 /* IEU0 */
andcc %o4, %o5, %g0 /* IEU1 Group */
be,pn %xcc, 24f /* CTI */
sllx %g7, 48, %o5 /* IEU0 */
sllx %g6, 48, %o5 /* IEU0 */
andcc %o4, %o5, %g0 /* IEU1 Group */
be,pn %xcc, 24f /* CTI */
sllx %g7, 40, %o5 /* IEU0 */
sllx %g6, 40, %o5 /* IEU0 */
andcc %o4, %o5, %g0 /* IEU1 Group */
be,pn %xcc, 24f /* CTI */
sllx %g7, 32, %o5 /* IEU0 */
sllx %g6, 32, %o5 /* IEU0 */
andcc %o4, %o5, %g0 /* IEU1 Group */
be,pn %xcc, 24f /* CTI */
23: sllx %g7, 24, %o5 /* IEU0 */
23: sllx %g6, 24, %o5 /* IEU0 */
andcc %o4, %o5, %g0 /* IEU1 Group */
be,pn %icc, 24f /* CTI */
sllx %g7, 16, %o5 /* IEU0 */
sllx %g6, 16, %o5 /* IEU0 */
andcc %o4, %o5, %g0 /* IEU1 Group */
be,pn %icc, 24f /* CTI */
sllx %g7, 8, %o5 /* IEU0 */
sllx %g6, 8, %o5 /* IEU0 */
andcc %o4, %o5, %g0 /* IEU1 Group */
be,pn %icc, 24f /* CTI */
mov %g7, %o5 /* IEU0 */
mov %g6, %o5 /* IEU0 */
25: cmp %o4, %o3 /* IEU1 Group */
5: mov -1, %o0 /* IEU0 */
retl /* CTI+IEU1 Group */
@ -164,9 +164,9 @@ ENTRY(strcmp)
movgu %xcc, 1, %o0 /* Single Group */
.align 16
24: sub %o5, 1, %g7 /* IEU0 Group */
24: sub %o5, 1, %g6 /* IEU0 Group */
clr %o0 /* IEU1 */
or %o5, %g7, %o5 /* IEU0 Group */
or %o5, %g6, %o5 /* IEU0 Group */
andn %o4, %o5, %o4 /* IEU0 Group */
andn %o3, %o5, %o3 /* IEU1 */
@ -205,7 +205,7 @@ ENTRY(strcmp)
sub %o1, %g3, %o1 /* IEU0 Group */
sub %o5, %g5, %o5 /* IEU1 */
ldxa [%o1] ASI_PNF, %g7 /* Load Group */
ldxa [%o1] ASI_PNF, %g6 /* Load Group */
or %g1, %g2, %g1 /* IEU0 */
sub %o1, %o0, %o1 /* IEU1 */
@ -215,10 +215,10 @@ ENTRY(strcmp)
* %g2 = 8080808080800880
* %g5 = number of bits to shift left
* %o5 = number of bits to shift right */
10: sllx %g7, %g5, %o3 /* IEU0 Group */
ldxa [%o1 + %o0] ASI_PNF, %g7 /* Load */
10: sllx %g6, %g5, %o3 /* IEU0 Group */
ldxa [%o1 + %o0] ASI_PNF, %g6 /* Load */
11: srlx %g7, %o5, %o4 /* IEU0 Group */
11: srlx %g6, %o5, %o4 /* IEU0 Group */
ldxa [%o0] ASI_PNF, %o2 /* Load */
or %o3, %o4, %o3 /* IEU1 */
add %o0, 8, %o0 /* IEU0 Group */
@ -272,8 +272,8 @@ ENTRY(strcmp)
be,pn %icc, 4b /* CTI */
andcc %o2, 0xff, %g0 /* IEU1 Group */
be,pn %icc, 4b /* CTI */
sllx %g7, %g5, %o3 /* IEU0 */
sllx %g6, %g5, %o3 /* IEU0 */
ba,pt %xcc, 11b /* CTI Group */
ldxa [%o1 + %o0] ASI_PNF, %g7 /* Load */
ldxa [%o1 + %o0] ASI_PNF, %g6 /* Load */
END(strcmp)

View File

@ -1,6 +1,6 @@
/* Copy SRC to DEST returning DEST.
For SPARC v9.
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz> and
Jakub Jelinek <jj@ultra.linux.cz>.
@ -25,7 +25,7 @@
#ifndef XCC
.register %g2, #scratch
.register %g3, #scratch
.register %g7, #scratch
.register %g6, #scratch
#endif
/* Normally, this uses
@ -48,7 +48,7 @@
.align 32
ENTRY(strcpy)
sethi %hi(0x01010101), %g1 /* IEU0 Group */
mov %o0, %g7 /* IEU1 */
mov %o0, %g6 /* IEU1 */
or %g1, %lo(0x01010101), %g1 /* IEU0 Group */
andcc %o0, 7, %g0 /* IEU1 */
@ -108,7 +108,7 @@ ENTRY(strcpy)
bne,pt %icc, 3b /* CTI */
mov %o3, %g3 /* IEU0 Group */
4: retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
.align 16
5: stb %g5, [%o0 - 2] /* Store Group */
@ -118,23 +118,23 @@ ENTRY(strcpy)
stw %g4, [%o0 - 8] /* Store Group */
retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
7: stb %g5, [%o0 - 4] /* Store Group */
srlx %g3, 32, %g4 /* IEU0 */
8: stw %g4, [%o0 - 8] /* Store Group */
retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
9: stb %g5, [%o0 - 6] /* Store Group */
srlx %g3, 48, %g4 /* IEU0 */
10: sth %g4, [%o0 - 8] /* Store Group */
retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
11: stb %g5, [%o0 - 8] /* Store Group */
retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
12: or %g1, %g2, %g1 /* IEU0 Group */
ldub [%o1], %o3 /* Load */
@ -214,7 +214,7 @@ ENTRY(strcpy)
stx %o3, [%o0 - 8] /* Store */
retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
.align 16
16: srlx %o3, 8, %o4 /* IEU0 Group */
@ -228,7 +228,7 @@ ENTRY(strcpy)
stw %o4, [%o0 - 8] /* Store */
retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
nop
nop
@ -240,5 +240,5 @@ ENTRY(strcpy)
22: srlx %o3, 56, %o4 /* IEU0 Group */
stb %o4, [%o0 - 8] /* Store */
retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
END(strcpy)

View File

@ -2,7 +2,7 @@
equal to or greater than zero if S1 is lexicographically less than,
equal to or greater than S2.
For SPARC v9.
Copyright (C) 1997, 1999 Free Software Foundation, Inc.
Copyright (C) 1997, 1999, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz> and
Jakub Jelinek <jj@ultra.linux.cz>.
@ -29,7 +29,7 @@
#define USE_BPR
.register %g2, #scratch
.register %g3, #scratch
.register %g7, #scratch
.register %g6, #scratch
#endif
/* Normally, this uses
@ -79,14 +79,14 @@ ENTRY(strncmp)
sub %g4, %g1, %g3 /* IEU0 Group */
subcc %g4, %o3, %o4 /* IEU1 */
#ifdef EIGHTBIT_NOT_RARE
andn %g3, %g4, %g7 /* IEU0 Group */
andn %g3, %g4, %g6 /* IEU0 Group */
#endif
bne,pn %xcc, 6f /* CTI */
ldxa [%o0] ASI_PNF, %g4 /* Load Group */
add %o0, 8, %o0 /* IEU0 */
#ifdef EIGHTBIT_NOT_RARE
andcc %g7, %g2, %g0 /* IEU1 */
andcc %g6, %g2, %g0 /* IEU1 */
#else
andcc %g3, %g2, %g0 /* IEU1 */
#endif
@ -95,8 +95,8 @@ ENTRY(strncmp)
addcc %g3, %g1, %o4 /* IEU1 */
#ifdef EIGHTBIT_NOT_RARE
srlx %g7, 32, %g7 /* IEU0 */
andcc %g7, %g2, %g0 /* IEU1 Group */
srlx %g6, 32, %g6 /* IEU0 */
andcc %g6, %g2, %g0 /* IEU1 Group */
#else
srlx %g3, 32, %g3 /* IEU0 */
andcc %g3, %g2, %g0 /* IEU1 Group */
@ -289,11 +289,11 @@ ENTRY(strncmp)
ldxa [%o0] ASI_PNF, %g4 /* Load */
11: sllx %g3, 3, %g5 /* IEU0 Group */
mov 64, %g7 /* IEU1 */
mov 64, %g6 /* IEU1 */
or %g1, %g2, %g1 /* IEU0 Group */
sub %o1, %g3, %o1 /* IEU1 */
sub %g7, %g5, %g7 /* IEU0 Group */
sub %g6, %g5, %g6 /* IEU0 Group */
ldxa [%o1] ASI_PNF, %o4 /* Load */
sllx %g1, 7, %g2 /* IEU1 */
add %o1, 8, %o1 /* IEU0 Group */
@ -301,7 +301,7 @@ ENTRY(strncmp)
%g2 = 8080808080808080
%g3 = %o1 alignment
%g5 = number of bits to shift left
%g7 = number of bits to shift right */
%g6 = number of bits to shift right */
12: sllx %o4, %g5, %o3 /* IEU0 Group */
ldxa [%o1] ASI_PNF, %o4 /* Load */
@ -309,7 +309,7 @@ ENTRY(strncmp)
13: ldxa [%o0] ASI_PNF, %g4 /* Load Group */
addcc %o0, 8, %o0 /* IEU1 */
srlx %o4, %g7, %o5 /* IEU0 */
srlx %o4, %g6, %o5 /* IEU0 */
subcc %o2, 8, %o2 /* IEU1 Group */
bl,pn %XCC, 5b /* CTI */

View File

@ -2,7 +2,7 @@
null-terminated string from SRC to DST. If SRC does not cover all of
COUNT, the balance is zeroed.
For SPARC v9.
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz> and
Jakub Jelinek <jj@ultra.linux.cz>.
@ -29,7 +29,7 @@
#define USE_BPR
.register %g2, #scratch
.register %g3, #scratch
.register %g7, #scratch
.register %g6, #scratch
#endif
/* Normally, this uses
@ -58,7 +58,7 @@ ENTRY(strncpy)
tst %o2 /* IEU1 */
be,pn %XCC, 19f /* CTI */
#endif
mov %o0, %g7 /* IEU0 Group */
mov %o0, %g6 /* IEU0 Group */
or %g1, %lo(0x01010101), %g1 /* IEU1 */
andcc %o0, 7, %g0 /* IEU1 Group */
@ -156,7 +156,7 @@ ENTRY(strncpy)
stb %g0, [%o0] /* Store */
9: retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
.align 16
10: ba,pt %xcc, 3b /* CTI */
@ -240,14 +240,14 @@ ENTRY(strncpy)
stb %g5, [%o0] /* Store */
19: retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
50: stb %g0, [%o0] /* Store Group */
20: subcc %o2, 1, %o2 /* IEU1 Group */
bne,pt %XCC, 50b /* CTI */
add %o0, 1, %o0 /* IEU0 */
retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
21: andcc %o2, 4, %g0 /* IEU1 Group */
be,pn %icc, 22f /* CTI */
@ -270,7 +270,7 @@ ENTRY(strncpy)
stb %g4, [%o0] /* Store Group */
24: retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
25: andcc %o0, 7, %g0 /* IEU1 Group */
be,a,pn %icc, 4b /* CTI */
@ -281,7 +281,7 @@ ENTRY(strncpy)
add %o0, 1, %o0 /* IEU0 Group */
retl /* CTI+IEU1 Group */
mov %g7, %o0 /* IEU0 */
mov %g6, %o0 /* IEU0 */
.align 16
26: ldub [%o1], %o3 /* Load */

View File

@ -27,11 +27,11 @@ ENTRY(__syscall_error)
#ifdef __PIC__
.set noreorder
.set noat
move $1, $31
bltzal $0, 0f
move AT, ra
bltzal zero, 0f
nop
0: .cpload $31
move $31, $1
0: .cpload ra
move ra, AT
.set at
.set reorder
#endif
@ -51,9 +51,6 @@ ENTRY(__syscall_error)
li v0, EAGAIN
skip:
#endif
/* Store it in the "real" variable ... */
sw v0, errno
/* Find our per-thread errno address */
jal __errno_location
@ -75,11 +72,11 @@ ENTRY(__syscall_error)
#ifdef __PIC__
.set noreorder
.set noat
move $1, $31
bltzal $0, 0f
move AT, ra
bltzal zero, 0f
nop
0: .cpload $31
move $31, $1
0: .cpload ra
move ra, AT
.set at
.set reorder
#endif

View File

@ -22,12 +22,19 @@
#include <unistd.h>
#include <endian.h>
#include <sysdep.h>
#include <sysdep-cancel.h>
#include <sys/syscall.h>
#include <bp-checks.h>
#include <kernel-features.h>
#ifdef __NR_pread64 /* Newer kernels renamed but it's the same. */
# ifdef __NR_pread
# error "__NR_pread and __NR_pread64 both defined???"
# endif
# define __NR_pread __NR_pread64
#endif
#if defined __NR_pread || __ASSUME_PREAD_SYSCALL > 0
# if __ASSUME_PREAD_SYSCALL == 0
@ -48,6 +55,22 @@ __libc_pread (fd, buf, count, offset)
{
ssize_t result;
if (SINGLE_THREAD_P)
{
/* First try the syscall. */
assert (sizeof (offset) == 4);
result = INLINE_SYSCALL (pread, 6, fd, CHECK_N (buf, count), count, 0,
__LONG_LONG_PAIR (offset >> 31, offset));
# if __ASSUME_PREAD_SYSCALL == 0
if (result == -1 && errno == ENOSYS)
/* No system call available. Use the emulation. */
result = __emulate_pread (fd, buf, count, offset);
# endif
return result;
}
int oldtype = LIBC_CANCEL_ASYNC ();
/* First try the syscall. */
assert (sizeof (offset) == 4);
result = INLINE_SYSCALL (pread, 6, fd, CHECK_N (buf, count), count, 0,
@ -57,6 +80,9 @@ __libc_pread (fd, buf, count, offset)
/* No system call available. Use the emulation. */
result = __emulate_pread (fd, buf, count, offset);
# endif
LIBC_CANCEL_RESET (oldtype);
return result;
}

View File

@ -21,12 +21,19 @@
#include <unistd.h>
#include <endian.h>
#include <sysdep.h>
#include <sysdep-cancel.h>
#include <sys/syscall.h>
#include <bp-checks.h>
#include <kernel-features.h>
#ifdef __NR_pread64 /* Newer kernels renamed but it's the same. */
# ifdef __NR_pread
# error "__NR_pread and __NR_pread64 both defined???"
# endif
# define __NR_pread __NR_pread64
#endif
#if defined __NR_pread || __ASSUME_PREAD_SYSCALL > 0
# if __ASSUME_PREAD_SYSCALL == 0
@ -48,6 +55,23 @@ __libc_pread64 (fd, buf, count, offset)
{
ssize_t result;
if (SINGLE_THREAD_P)
{
/* First try the syscall. */
result = INLINE_SYSCALL (pread, 6, fd, CHECK_N (buf, count), count, 0,
__LONG_LONG_PAIR ((off_t) (offset >> 32),
(off_t) (offset & 0xffffffff)));
# if __ASSUME_PREAD_SYSCALL == 0
if (result == -1 && errno == ENOSYS)
/* No system call available. Use the emulation. */
result = __emulate_pread64 (fd, buf, count, offset);
# endif
return result;
}
int oldtype = LIBC_CANCEL_ASYNC ();
/* First try the syscall. */
result = INLINE_SYSCALL (pread, 6, fd, CHECK_N (buf, count), count, 0,
__LONG_LONG_PAIR ((off_t) (offset >> 32),
@ -57,6 +81,9 @@ __libc_pread64 (fd, buf, count, offset)
/* No system call available. Use the emulation. */
result = __emulate_pread64 (fd, buf, count, offset);
# endif
LIBC_CANCEL_RESET (oldtype);
return result;
}

View File

@ -22,12 +22,19 @@
#include <unistd.h>
#include <endian.h>
#include <sysdep.h>
#include <sysdep-cancel.h>
#include <sys/syscall.h>
#include <bp-checks.h>
#include <kernel-features.h>
#ifdef __NR_pwrite64 /* Newer kernels renamed but it's the same. */
# ifdef __NR_pwrite
# error "__NR_pwrite and __NR_pwrite64 both defined???"
# endif
# define __NR_pwrite __NR_pwrite64
#endif
#if defined __NR_pwrite || __ASSUME_PWRITE_SYSCALL > 0
extern ssize_t __syscall_pwrite (int fd, const void *__unbounded buf, size_t count,
@ -47,16 +54,35 @@ __libc_pwrite (fd, buf, count, offset)
{
ssize_t result;
if (SINGLE_THREAD_P)
{
/* First try the syscall. */
assert (sizeof (offset) == 4);
result = INLINE_SYSCALL (pwrite, 6, fd, CHECK_N (buf, count), count, 0,
__LONG_LONG_PAIR (offset >> 31, offset));
# if __ASSUME_PWRITE_SYSCALL == 0
if (result == -1 && errno == ENOSYS)
/* No system call available. Use the emulation. */
result = __emulate_pwrite (fd, buf, count, offset);
# endif
return result;
}
int oldtype = LIBC_CANCEL_ASYNC ();
/* First try the syscall. */
assert (sizeof (offset) == 4);
result = INLINE_SYSCALL (pwrite, 6, fd, CHECK_N (buf, count), count, 0,
__LONG_LONG_PAIR (offset >> 31, offset));
__LONG_LONG_PAIR (offset >> 31, offset));
# if __ASSUME_PWRITE_SYSCALL == 0
if (result == -1 && errno == ENOSYS)
/* No system call available. Use the emulation. */
result = __emulate_pwrite (fd, buf, count, offset);
# endif
LIBC_CANCEL_RESET (oldtype);
return result;
}

View File

@ -21,12 +21,19 @@
#include <unistd.h>
#include <endian.h>
#include <sysdep.h>
#include <sysdep-cancel.h>
#include <sys/syscall.h>
#include <bp-checks.h>
#include <kernel-features.h>
#ifdef __NR_pwrite64 /* Newer kernels renamed but it's the same. */
# ifdef __NR_pwrite
# error "__NR_pwrite and __NR_pwrite64 both defined???"
# endif
# define __NR_pwrite __NR_pwrite64
#endif
#if defined __NR_pwrite || __ASSUME_PWRITE_SYSCALL > 0
extern ssize_t __syscall_pwrite (int fd, const void *__unbounded buf, size_t count,
@ -46,6 +53,23 @@ __libc_pwrite64 (fd, buf, count, offset)
{
ssize_t result;
if (SINGLE_THREAD_P)
{
/* First try the syscall. */
result = INLINE_SYSCALL (pwrite, 6, fd, CHECK_N (buf, count), count, 0,
__LONG_LONG_PAIR ((off_t) (offset >> 32),
(off_t) (offset & 0xffffffff)));
# if __ASSUME_PWRITE_SYSCALL == 0
if (result == -1 && errno == ENOSYS)
/* No system call available. Use the emulation. */
result = __emulate_pwrite64 (fd, buf, count, offset);
# endif
return result;
}
int oldtype = LIBC_CANCEL_ASYNC ();
/* First try the syscall. */
result = INLINE_SYSCALL (pwrite, 6, fd, CHECK_N (buf, count), count, 0,
__LONG_LONG_PAIR ((off_t) (offset >> 32),
@ -56,6 +80,8 @@ __libc_pwrite64 (fd, buf, count, offset)
result = __emulate_pwrite64 (fd, buf, count, offset);
# endif
LIBC_CANCEL_RESET (oldtype);
return result;
}

View File

@ -33,7 +33,15 @@
# define SYS_ify(syscall_name) __NR_/**/syscall_name
#endif
#ifndef __ASSEMBLER__
#ifdef __ASSEMBLER__
/* We don't want the label for the error handler to be visible in the symbol
table when we define it here. */
#ifdef __PIC__
# define SYSCALL_ERROR_LABEL 99b
#endif
#else /* ! __ASSEMBLER__ */
/* Define a macro which expands into the inline wrapper code for a system
call. */

View File

@ -0,0 +1,30 @@
/* Procedure definition for FE_NOMASK_ENV for Linux/ppc64.
Copyright (C) 2003 Free Software Foundation, Inc.
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 <fenv.h>
#include <errno.h>
#include <sys/prctl.h>
const fenv_t *
__fe_nomask_env (void)
{
prctl (PR_SET_FPEXC, PR_FP_EXC_PRECISE);
return FE_ENABLED_ENV;
}

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1997, 1998, 2002 Free Software Foundation, Inc.
/* Copyright (C) 1997, 1998, 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Miguel de Icaza <miguel@gnu.ai.mit.edu>, 1997.
@ -17,7 +17,7 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <sysdep.h>
#include <sysdep-cancel.h>
#include <socketcall.h>
#define P(a, b) P2(a, b)
@ -63,7 +63,12 @@ ENTRY (__socket)
#endif
#endif
mov P(SOCKOP_,socket), %o0 /* arg 1: socket subfunction */
#if defined NEED_CANCELLATION && defined CENABLE
SINGLE_THREAD_P
cmp %g1, 0
bne .Lsocket_cancel
#endif
mov P(SOCKOP_,socket), %o0 /* arg 1: socket subfunction */
add %sp, 68, %o1 /* arg 2: parameter block */
LOADSYSCALL(socketcall)
t 0x10
@ -72,6 +77,25 @@ ENTRY (__socket)
retl
nop
#if defined NEED_CANCELLATION && defined CENABLE
.Lsocket_cancel:
save %sp, -96, %sp
CENABLE
nop
mov %o0, %l0
add %sp, 68 + 96, %o1
mov P(SOCKOP_,socket), %o0
LOADSYSCALL(socketcall)
t 0x10
bcs __syscall_error_handler2
mov %o0, %l1
CDISABLE
mov %l0, %o0
jmpl %i7 + 8, %g0
restore %g0, %l1, %o0
SYSCALL_ERROR_HANDLER2
#endif
SYSCALL_ERROR_HANDLER
END (__socket)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1997, 2002 Free Software Foundation, Inc.
/* Copyright (C) 1997, 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Miguel de Icaza <miguel@gnu.ai.mit.edu>, January 1997.
@ -131,7 +131,7 @@ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler) \
" sub %%g0, %%o0, %%o0;" \
"1:"
#define __SYSCALL_CLOBBERS "g2", "g3", "g4", "g5", "g7", \
#define __SYSCALL_CLOBBERS "g2", "g3", "g4", "g5", "g6", \
"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \
"f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \
"f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", \

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1997, 2000, 2002 Free Software Foundation, Inc.
/* Copyright (C) 1997, 2000, 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Richard Henderson <richard@gnu.ai.mit.edu>, 1997.
@ -134,7 +134,7 @@ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler) \
" sub %%g0, %%o0, %%o0;" \
"1:"
#define __SYSCALL_CLOBBERS "g2", "g3", "g4", "g5", "g7", \
#define __SYSCALL_CLOBBERS "g2", "g3", "g4", "g5", "g6", \
"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \
"f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \
"f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", \

View File

@ -1,5 +1,5 @@
/* 64-bit multiplication and division
Copyright (C) 1989, 1992-1999, 2000, 2001, 2002
Copyright (C) 1989, 1992-1999, 2000, 2001, 2002, 2003
Free Software Foundation, Inc.
This file is part of the GNU C Library.
@ -294,7 +294,6 @@ __divdi3 (DWtype u, DWtype v)
w = -w;
return w;
}
INTDEF(__divdi3)
DWtype
__moddi3 (DWtype u, DWtype v)
@ -329,3 +328,13 @@ __umoddi3 (UDWtype u, UDWtype v)
__udivmoddi4 (u, v, &w);
return w;
}
/* We declare these with compat_symbol so that they are not visible at
link time. Programs must use the functions from libgcc. */
#if defined HAVE_ELF && defined SHARED && defined DO_VERSIONING
# include <shlib-compat.h>
compat_symbol (libc, __divdi3, __divdi3, GLIBC_2_0);
compat_symbol (libc, __moddi3, __moddi3, GLIBC_2_0);
compat_symbol (libc, __udivdi3, __udivdi3, GLIBC_2_0);
compat_symbol (libc, __umoddi3, __umoddi3, GLIBC_2_0);
#endif

View File

@ -21,13 +21,6 @@
#include <inttypes.h>
#ifdef SHARED
/* This is an ugly trick. We cause the C code generated for the code
in lldiv.c to use __divdi3_internal instead of __divdi3 by defining
an alias on the assembler level. */
asm ("__divdi3 = __divdi3_internal");
#endif
#include <sysdeps/generic/lldiv.c>
#undef imaxdiv