|
@@ -0,0 +1,8657 @@
|
|
|
+From b0baf143cc3f8f081254e6073b47eeb837ca4470 Mon Sep 17 00:00:00 2001
|
|
|
+From: Waldemar Brodkorb <wbx@openadk.org>
|
|
|
+Date: Sun, 31 Aug 2014 10:48:39 +0200
|
|
|
+Subject: [PATCH 4/4] sparc: remove sparc64/sparcv9 code
|
|
|
+
|
|
|
+The sparc64/sparcv9 code is incomplete. Furthermore there is
|
|
|
+no real embedded hardware for sparc64 available, so better remove
|
|
|
+it until someone comes up with a complete port.
|
|
|
+
|
|
|
+Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
|
|
|
+---
|
|
|
+ extra/Configs/Config.sparc | 6 -
|
|
|
+ libc/string/sparc/sparc64/memchr.S | 258 ------
|
|
|
+ libc/string/sparc/sparc64/memcpy.S | 922 ---------------------
|
|
|
+ libc/string/sparc/sparc64/memset.S | 316 -------
|
|
|
+ libc/string/sparc/sparc64/sparcv9b/memcpy.S | 611 --------------
|
|
|
+ libc/string/sparc/sparc64/stpcpy.S | 270 ------
|
|
|
+ libc/string/sparc/sparc64/strcat.S | 338 --------
|
|
|
+ libc/string/sparc/sparc64/strchr.S | 485 -----------
|
|
|
+ libc/string/sparc/sparc64/strcmp.S | 278 -------
|
|
|
+ libc/string/sparc/sparc64/strcpy.S | 244 ------
|
|
|
+ libc/string/sparc/sparc64/strlen.S | 172 ----
|
|
|
+ libc/sysdeps/linux/sparc/bits/setjmp.h | 31 -
|
|
|
+ libc/sysdeps/linux/sparc/bits/sigcontext.h | 35 -
|
|
|
+ libc/sysdeps/linux/sparc/crt1.S | 11 -
|
|
|
+ libc/sysdeps/linux/sparc/jmpbuf-unwind.h | 18 -
|
|
|
+ libc/sysdeps/linux/sparc/qp_ops.c | 8 -
|
|
|
+ libc/sysdeps/linux/sparc/sparcv9/clone.S | 101 ---
|
|
|
+ libc/sysdeps/linux/sparc/sparcv9/rem.S | 20 -
|
|
|
+ libc/sysdeps/linux/sparc/sparcv9/sdiv.S | 18 -
|
|
|
+ libc/sysdeps/linux/sparc/sparcv9/udiv.S | 15 -
|
|
|
+ libc/sysdeps/linux/sparc/sparcv9/umul.S | 15 -
|
|
|
+ libc/sysdeps/linux/sparc/sparcv9/urem.S | 17 -
|
|
|
+ libc/sysdeps/linux/sparc/sys/procfs.h | 88 --
|
|
|
+ .../linuxthreads.old/sysdeps/sparc/pt-machine.h | 86 +-
|
|
|
+ .../sysdeps/sparc/sparc32/pt-machine.h | 82 --
|
|
|
+ .../sysdeps/sparc/sparc64/pt-machine.h | 104 ---
|
|
|
+ libpthread/linuxthreads/sysdeps/sparc/pspinlock.c | 95 ++-
|
|
|
+ libpthread/linuxthreads/sysdeps/sparc/pt-machine.h | 86 +-
|
|
|
+ .../linuxthreads/sysdeps/sparc/sparc32/pspinlock.c | 87 --
|
|
|
+ .../sysdeps/sparc/sparc32/pt-machine.h | 82 --
|
|
|
+ .../sysdeps/sparc/sparc32/sparcv9/pspinlock.c | 93 ---
|
|
|
+ .../linuxthreads/sysdeps/sparc/sparc64/pspinlock.c | 92 --
|
|
|
+ .../sysdeps/sparc/sparc64/pt-machine.h | 104 ---
|
|
|
+ .../unix/sysv/linux/sparc/sparc32/sysdep-cancel.h | 100 ---
|
|
|
+ .../sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S | 64 --
|
|
|
+ .../unix/sysv/linux/sparc/sparc64/pt-sigsuspend.c | 1 -
|
|
|
+ .../unix/sysv/linux/sparc/sparc64/sysdep-cancel.h | 99 ---
|
|
|
+ .../sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S | 63 --
|
|
|
+ .../sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h | 102 ++-
|
|
|
+ .../sysdeps/unix/sysv/linux/sparc/vfork.S | 64 ++
|
|
|
+ libpthread/nptl/sysdeps/jmpbuf-unwind.h | 27 +
|
|
|
+ libpthread/nptl/sysdeps/pthread_spin_lock.c | 39 +
|
|
|
+ libpthread/nptl/sysdeps/pthread_spin_trylock.c | 28 +
|
|
|
+ libpthread/nptl/sysdeps/pthreaddef.h | 39 +
|
|
|
+ libpthread/nptl/sysdeps/sparc/jmpbuf-unwind.h | 32 +-
|
|
|
+ libpthread/nptl/sysdeps/sparc/pthread_spin_lock.c | 44 +-
|
|
|
+ .../nptl/sysdeps/sparc/pthread_spin_trylock.c | 33 +-
|
|
|
+ libpthread/nptl/sysdeps/sparc/pthreaddef.h | 44 +-
|
|
|
+ .../nptl/sysdeps/sparc/sparc32/jmpbuf-unwind.h | 27 -
|
|
|
+ .../nptl/sysdeps/sparc/sparc32/pthread_spin_lock.c | 39 -
|
|
|
+ .../sysdeps/sparc/sparc32/pthread_spin_trylock.c | 28 -
|
|
|
+ libpthread/nptl/sysdeps/sparc/sparc32/pthreaddef.h | 39 -
|
|
|
+ .../sparc/sparc32/sparcv9/pthread_spin_lock.c | 38 -
|
|
|
+ .../sparc/sparc32/sparcv9/pthread_spin_trylock.c | 1 -
|
|
|
+ .../sparc/sparc32/sparcv9/pthread_spin_unlock.c | 1 -
|
|
|
+ .../nptl/sysdeps/sparc/sparc64/jmpbuf-unwind.h | 27 -
|
|
|
+ .../nptl/sysdeps/sparc/sparc64/pthread_spin_lock.c | 38 -
|
|
|
+ .../sysdeps/sparc/sparc64/pthread_spin_trylock.c | 33 -
|
|
|
+ .../sysdeps/sparc/sparc64/pthread_spin_unlock.c | 29 -
|
|
|
+ libpthread/nptl/sysdeps/sparc/sparc64/pthreaddef.h | 39 -
|
|
|
+ .../nptl/sysdeps/unix/sysv/linux/sparc/clone.S | 7 +-
|
|
|
+ .../nptl/sysdeps/unix/sysv/linux/sparc/pt-vfork.S | 49 +-
|
|
|
+ .../unix/sysv/linux/sparc/pthread_barrier_wait.c | 94 ++-
|
|
|
+ .../nptl/sysdeps/unix/sysv/linux/sparc/sem_post.c | 52 ++
|
|
|
+ .../sysdeps/unix/sysv/linux/sparc/sem_timedwait.c | 147 ++++
|
|
|
+ .../sysdeps/unix/sysv/linux/sparc/sem_trywait.c | 51 ++
|
|
|
+ .../nptl/sysdeps/unix/sysv/linux/sparc/sem_wait.c | 124 +++
|
|
|
+ .../sysdeps/unix/sysv/linux/sparc/sparc32/clone.S | 2 -
|
|
|
+ .../unix/sysv/linux/sparc/sparc32/pt-vfork.S | 44 -
|
|
|
+ .../linux/sparc/sparc32/pthread_barrier_wait.c | 93 ---
|
|
|
+ .../unix/sysv/linux/sparc/sparc32/sem_post.c | 52 --
|
|
|
+ .../unix/sysv/linux/sparc/sparc32/sem_timedwait.c | 147 ----
|
|
|
+ .../unix/sysv/linux/sparc/sparc32/sem_trywait.c | 51 --
|
|
|
+ .../unix/sysv/linux/sparc/sparc32/sem_wait.c | 124 ---
|
|
|
+ .../unix/sysv/linux/sparc/sparc32/sysdep-cancel.h | 111 ---
|
|
|
+ .../sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S | 48 --
|
|
|
+ .../sysdeps/unix/sysv/linux/sparc/sparc64/clone.S | 2 -
|
|
|
+ .../unix/sysv/linux/sparc/sparc64/pt-vfork.S | 44 -
|
|
|
+ .../unix/sysv/linux/sparc/sparc64/sysdep-cancel.h | 109 ---
|
|
|
+ .../unix/sysv/linux/sparc/sparc64/timer_create.c | 1 -
|
|
|
+ .../unix/sysv/linux/sparc/sparc64/timer_delete.c | 1 -
|
|
|
+ .../unix/sysv/linux/sparc/sparc64/timer_getoverr.c | 1 -
|
|
|
+ .../unix/sysv/linux/sparc/sparc64/timer_gettime.c | 1 -
|
|
|
+ .../unix/sysv/linux/sparc/sparc64/timer_settime.c | 1 -
|
|
|
+ .../sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S | 48 --
|
|
|
+ .../sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h | 114 ++-
|
|
|
+ .../nptl/sysdeps/unix/sysv/linux/sparc/vfork.S | 53 +-
|
|
|
+ 87 files changed, 1341 insertions(+), 6536 deletions(-)
|
|
|
+ delete mode 100644 libc/string/sparc/sparc64/memchr.S
|
|
|
+ delete mode 100644 libc/string/sparc/sparc64/memcpy.S
|
|
|
+ delete mode 100644 libc/string/sparc/sparc64/memset.S
|
|
|
+ delete mode 100644 libc/string/sparc/sparc64/sparcv9b/memcpy.S
|
|
|
+ delete mode 100644 libc/string/sparc/sparc64/stpcpy.S
|
|
|
+ delete mode 100644 libc/string/sparc/sparc64/strcat.S
|
|
|
+ delete mode 100644 libc/string/sparc/sparc64/strchr.S
|
|
|
+ delete mode 100644 libc/string/sparc/sparc64/strcmp.S
|
|
|
+ delete mode 100644 libc/string/sparc/sparc64/strcpy.S
|
|
|
+ delete mode 100644 libc/string/sparc/sparc64/strlen.S
|
|
|
+ delete mode 100644 libc/sysdeps/linux/sparc/sparcv9/clone.S
|
|
|
+ delete mode 100644 libc/sysdeps/linux/sparc/sparcv9/rem.S
|
|
|
+ delete mode 100644 libc/sysdeps/linux/sparc/sparcv9/sdiv.S
|
|
|
+ delete mode 100644 libc/sysdeps/linux/sparc/sparcv9/udiv.S
|
|
|
+ delete mode 100644 libc/sysdeps/linux/sparc/sparcv9/umul.S
|
|
|
+ delete mode 100644 libc/sysdeps/linux/sparc/sparcv9/urem.S
|
|
|
+ delete mode 100644 libpthread/linuxthreads.old/sysdeps/sparc/sparc32/pt-machine.h
|
|
|
+ delete mode 100644 libpthread/linuxthreads.old/sysdeps/sparc/sparc64/pt-machine.h
|
|
|
+ delete mode 100644 libpthread/linuxthreads/sysdeps/sparc/sparc32/pspinlock.c
|
|
|
+ delete mode 100644 libpthread/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h
|
|
|
+ delete mode 100644 libpthread/linuxthreads/sysdeps/sparc/sparc32/sparcv9/pspinlock.c
|
|
|
+ delete mode 100644 libpthread/linuxthreads/sysdeps/sparc/sparc64/pspinlock.c
|
|
|
+ delete mode 100644 libpthread/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h
|
|
|
+ delete mode 100644 libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
|
|
|
+ delete mode 100644 libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S
|
|
|
+ delete mode 100644 libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/pt-sigsuspend.c
|
|
|
+ delete mode 100644 libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
|
|
|
+ delete mode 100644 libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S
|
|
|
+ create mode 100644 libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/vfork.S
|
|
|
+ create mode 100644 libpthread/nptl/sysdeps/jmpbuf-unwind.h
|
|
|
+ create mode 100644 libpthread/nptl/sysdeps/pthread_spin_lock.c
|
|
|
+ create mode 100644 libpthread/nptl/sysdeps/pthread_spin_trylock.c
|
|
|
+ create mode 100644 libpthread/nptl/sysdeps/pthreaddef.h
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/sparc/sparc32/jmpbuf-unwind.h
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/sparc/sparc32/pthread_spin_lock.c
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/sparc/sparc32/pthread_spin_trylock.c
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/sparc/sparc32/pthreaddef.h
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_lock.c
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_trylock.c
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_unlock.c
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/sparc/sparc64/jmpbuf-unwind.h
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/sparc/sparc64/pthread_spin_lock.c
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/sparc/sparc64/pthread_spin_trylock.c
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/sparc/sparc64/pthread_spin_unlock.c
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/sparc/sparc64/pthreaddef.h
|
|
|
+ create mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_post.c
|
|
|
+ create mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_timedwait.c
|
|
|
+ create mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_trywait.c
|
|
|
+ create mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_wait.c
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/pt-vfork.S
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/pthread_barrier_wait.c
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_post.c
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_trywait.c
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/pt-vfork.S
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_create.c
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_delete.c
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_getoverr.c
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_gettime.c
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_settime.c
|
|
|
+ delete mode 100644 libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S
|
|
|
+
|
|
|
+diff --git a/extra/Configs/Config.sparc b/extra/Configs/Config.sparc
|
|
|
+index c6180c8..47c8ac2 100644
|
|
|
+--- a/extra/Configs/Config.sparc
|
|
|
++++ b/extra/Configs/Config.sparc
|
|
|
+@@ -26,10 +26,4 @@ config CONFIG_SPARC_V7
|
|
|
+ config CONFIG_SPARC_V8
|
|
|
+ bool "SPARC v8"
|
|
|
+
|
|
|
+-config CONFIG_SPARC_V9
|
|
|
+- bool "SPARC v9"
|
|
|
+-
|
|
|
+-config CONFIG_SPARC_V9B
|
|
|
+- bool "SPARC v9b"
|
|
|
+-
|
|
|
+ endchoice
|
|
|
+diff --git a/libc/string/sparc/sparc64/memchr.S b/libc/string/sparc/sparc64/memchr.S
|
|
|
+deleted file mode 100644
|
|
|
+index 6467f7f..0000000
|
|
|
+--- a/libc/string/sparc/sparc64/memchr.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,258 +0,0 @@
|
|
|
+-/* memchr (str, ch, n) -- Return pointer to first occurrence of CH in STR less
|
|
|
+- than N.
|
|
|
+- For SPARC v9.
|
|
|
+- Copyright (C) 1998, 1999, 2000, 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>.
|
|
|
+- This version is developed using the same algorithm as the fast C
|
|
|
+- version which carries the following introduction:
|
|
|
+- Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
|
|
|
+- with help from Dan Sahlin (dan@sics.se) and
|
|
|
+- commentary by Jim Blandy (jimb@ai.mit.edu);
|
|
|
+- adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu),
|
|
|
+- and implemented by Roland McGrath (roland@ai.mit.edu).
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <asm/asi.h>
|
|
|
+-#ifndef XCC
|
|
|
+-#define XCC xcc
|
|
|
+-#define USE_BPR
|
|
|
+- .register %g2, #scratch
|
|
|
+- .register %g3, #scratch
|
|
|
+-#endif
|
|
|
+-
|
|
|
+- /* Normally, this uses
|
|
|
+- ((xword - 0x0101010101010101) & 0x8080808080808080) test
|
|
|
+- to find out if any byte in xword could be zero. This is fast, but
|
|
|
+- also gives false alarm for any byte in range 0x81-0xff. It does
|
|
|
+- not matter for correctness, as if this test tells us there could
|
|
|
+- be some zero byte, we check it byte by byte, but if bytes with
|
|
|
+- high bits set are common in the strings, then this will give poor
|
|
|
+- performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
|
|
+- will use one tick slower, but more precise test
|
|
|
+- ((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
|
|
|
+- which does not give any false alarms (but if some bits are set,
|
|
|
+- one cannot assume from it which bytes are zero and which are not).
|
|
|
+- It is yet to be measured, what is the correct default for glibc
|
|
|
+- in these days for an average user.
|
|
|
+- */
|
|
|
+-
|
|
|
+- .text
|
|
|
+- .align 32
|
|
|
+-ENTRY(memchr)
|
|
|
+- and %o1, 0xff, %o1 /* IEU0 Group */
|
|
|
+-#ifdef USE_BPR
|
|
|
+- brz,pn %o2, 12f /* CTI+IEU1 */
|
|
|
+-#else
|
|
|
+- tst %o2 /* IEU1 */
|
|
|
+- be,pn %XCC, 12f /* CTI */
|
|
|
+-#endif
|
|
|
+- sll %o1, 8, %g3 /* IEU0 Group */
|
|
|
+- add %o0, %o2, %o2 /* IEU1 */
|
|
|
+-
|
|
|
+- sethi %hi(0x01010101), %g1 /* IEU0 Group */
|
|
|
+- or %g3, %o1, %g3 /* IEU1 */
|
|
|
+- ldub [%o0], %o3 /* Load */
|
|
|
+- sllx %g3, 16, %g5 /* IEU0 Group */
|
|
|
+-
|
|
|
+- or %g1, %lo(0x01010101), %g1 /* IEU1 */
|
|
|
+- sllx %g1, 32, %g2 /* IEU0 Group */
|
|
|
+- or %g3, %g5, %g3 /* IEU1 */
|
|
|
+- sllx %g3, 32, %g5 /* IEU0 Group */
|
|
|
+-
|
|
|
+- cmp %o3, %o1 /* IEU1 */
|
|
|
+- be,pn %xcc, 13f /* CTI */
|
|
|
+- or %g1, %g2, %g1 /* IEU0 Group */
|
|
|
+- andcc %o0, 7, %g0 /* IEU1 */
|
|
|
+-
|
|
|
+- bne,a,pn %icc, 21f /* CTI */
|
|
|
+- add %o0, 1, %o0 /* IEU0 Group */
|
|
|
+- ldx [%o0], %o3 /* Load Group */
|
|
|
+- sllx %g1, 7, %g2 /* IEU0 */
|
|
|
+-
|
|
|
+- or %g3, %g5, %g3 /* IEU1 */
|
|
|
+-1: add %o0, 8, %o0 /* IEU0 Group */
|
|
|
+- xor %o3, %g3, %o4 /* IEU1 */
|
|
|
+- /* %g1 = 0101010101010101 *
|
|
|
+- * %g2 = 8080088080808080 *
|
|
|
+- * %g3 = c c c c c c c c *
|
|
|
+- * %o3 = value *
|
|
|
+- * %o4 = value XOR c */
|
|
|
+-2: cmp %o0, %o2 /* IEU1 Group */
|
|
|
+-
|
|
|
+- bg,pn %XCC, 11f /* CTI */
|
|
|
+- ldxa [%o0] ASI_PNF, %o3 /* Load */
|
|
|
+- sub %o4, %g1, %o5 /* IEU0 Group */
|
|
|
+- add %o0, 8, %o0 /* IEU1 */
|
|
|
+-#ifdef EIGHTBIT_NOT_RARE
|
|
|
+- andn %o5, %o4, %o5 /* IEU0 Group */
|
|
|
+-#endif
|
|
|
+-
|
|
|
+- andcc %o5, %g2, %g0 /* IEU1 Group */
|
|
|
+- be,a,pt %xcc, 2b /* CTI */
|
|
|
+- xor %o3, %g3, %o4 /* IEU0 */
|
|
|
+- srlx %o4, 56, %g5 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 3f /* CTI */
|
|
|
+- srlx %o4, 48, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 4f /* CTI */
|
|
|
+- srlx %o4, 40, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 5f /* CTI */
|
|
|
+-
|
|
|
+- srlx %o4, 32, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 6f /* CTI */
|
|
|
+- srlx %o4, 24, %g5 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 7f /* CTI */
|
|
|
+- srlx %o4, 16, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 8f /* CTI */
|
|
|
+- srlx %o4, 8, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 9f /* CTI */
|
|
|
+-
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- bne,pt %icc, 2b /* CTI */
|
|
|
+- xor %o3, %g3, %o4 /* IEU0 */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+-
|
|
|
+- add %o0, -9, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+- .align 16
|
|
|
+-3: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -16, %o0 /* IEU0 */
|
|
|
+-4: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -15, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+-5: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -14, %o0 /* IEU0 */
|
|
|
+-6: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -13, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+-7: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -12, %o0 /* IEU0 */
|
|
|
+-8: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -11, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+-9: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -10, %o0 /* IEU0 */
|
|
|
+-11: sub %o4, %g1, %o5 /* IEU0 Group */
|
|
|
+- sub %o0, 8, %o0 /* IEU1 */
|
|
|
+-
|
|
|
+- andcc %o5, %g2, %g0 /* IEU1 Group */
|
|
|
+- be,pt %xcc, 12f /* CTI */
|
|
|
+- sub %o2, %o0, %o2 /* IEU0 */
|
|
|
+- tst %o2 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %XCC, 12f /* CTI */
|
|
|
+- srlx %o4, 56, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 13f /* CTI */
|
|
|
+-
|
|
|
+- cmp %o2, 1 /* IEU0 */
|
|
|
+- be,pn %XCC, 12f /* CTI Group */
|
|
|
+- srlx %o4, 48, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 14f /* CTI */
|
|
|
+- cmp %o2, 2 /* IEU1 Group */
|
|
|
+- be,pn %XCC, 12f /* CTI */
|
|
|
+- srlx %o4, 40, %g5 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 15f /* CTI */
|
|
|
+- cmp %o2, 3 /* IEU1 Group */
|
|
|
+- be,pn %XCC, 12f /* CTI */
|
|
|
+-
|
|
|
+- srlx %o4, 32, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 16f /* CTI */
|
|
|
+- cmp %o2, 4 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %XCC, 12f /* CTI */
|
|
|
+- srlx %o4, 24, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 17f /* CTI */
|
|
|
+-
|
|
|
+- cmp %o2, 5 /* IEU1 Group */
|
|
|
+- be,pn %XCC, 12f /* CTI */
|
|
|
+- srlx %o4, 16, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 18f /* CTI */
|
|
|
+- cmp %o2, 6 /* IEU1 Group */
|
|
|
+- be,pn %XCC, 12f /* CTI */
|
|
|
+- srlx %o4, 8, %g5 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 19f /* CTI */
|
|
|
+- nop /* IEU0 */
|
|
|
+-12: retl /* CTI+IEU1 Group */
|
|
|
+-
|
|
|
+- clr %o0 /* IEU0 */
|
|
|
+- nop /* Stub */
|
|
|
+-13: retl /* CTI+IEU1 Group */
|
|
|
+- nop /* IEU0 */
|
|
|
+-
|
|
|
+-14: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, 1, %o0 /* IEU0 */
|
|
|
+-15: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, 2, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+-16: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, 3, %o0 /* IEU0 */
|
|
|
+-17: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, 4, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+-18: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, 5, %o0 /* IEU0 */
|
|
|
+-19: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, 6, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+-21: cmp %o0, %o2 /* IEU1 */
|
|
|
+- be,pn %XCC, 12b /* CTI */
|
|
|
+- sllx %g1, 7, %g2 /* IEU0 Group */
|
|
|
+- ldub [%o0], %o3 /* Load */
|
|
|
+-
|
|
|
+- or %g3, %g5, %g3 /* IEU1 */
|
|
|
+-22: andcc %o0, 7, %g0 /* IEU1 Group */
|
|
|
+- be,a,pn %icc, 1b /* CTI */
|
|
|
+- ldx [%o0], %o3 /* Load */
|
|
|
+-
|
|
|
+- cmp %o3, %o1 /* IEU1 Group */
|
|
|
+- be,pn %xcc, 23f /* CTI */
|
|
|
+- add %o0, 1, %o0 /* IEU0 */
|
|
|
+- cmp %o0, %o2 /* IEU1 Group */
|
|
|
+-
|
|
|
+- bne,a,pt %XCC, 22b /* CTI */
|
|
|
+- ldub [%o0], %o3 /* Load */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+- clr %o0 /* IEU0 */
|
|
|
+-
|
|
|
+-23: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -1, %o0 /* IEU0 */
|
|
|
+-END(memchr)
|
|
|
+-
|
|
|
+-libc_hidden_def(memchr)
|
|
|
+-weak_alias(memchr,__ubp_memchr)
|
|
|
+diff --git a/libc/string/sparc/sparc64/memcpy.S b/libc/string/sparc/sparc64/memcpy.S
|
|
|
+deleted file mode 100644
|
|
|
+index df3e2d3..0000000
|
|
|
+--- a/libc/string/sparc/sparc64/memcpy.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,922 +0,0 @@
|
|
|
+-/* Copy SIZE bytes from SRC to DEST.
|
|
|
+- For UltraSPARC.
|
|
|
+- 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).
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <features.h>
|
|
|
+-#include <asm/asi.h>
|
|
|
+-#ifndef XCC
|
|
|
+-#define USE_BPR
|
|
|
+- .register %g2, #scratch
|
|
|
+- .register %g3, #scratch
|
|
|
+- .register %g6, #scratch
|
|
|
+-#define XCC xcc
|
|
|
+-#endif
|
|
|
+-#define FPRS_FEF 4
|
|
|
+-
|
|
|
+-#define FREG_FROB(f1, f2, f3, f4, f5, f6, f7, f8, f9) \
|
|
|
+- faligndata %f1, %f2, %f48; \
|
|
|
+- faligndata %f2, %f3, %f50; \
|
|
|
+- faligndata %f3, %f4, %f52; \
|
|
|
+- faligndata %f4, %f5, %f54; \
|
|
|
+- faligndata %f5, %f6, %f56; \
|
|
|
+- faligndata %f6, %f7, %f58; \
|
|
|
+- faligndata %f7, %f8, %f60; \
|
|
|
+- faligndata %f8, %f9, %f62;
|
|
|
+-
|
|
|
+-#define MAIN_LOOP_CHUNK(src, dest, fdest, fsrc, len, jmptgt) \
|
|
|
+- ldda [%src] %asi, %fdest; \
|
|
|
+- add %src, 0x40, %src; \
|
|
|
+- add %dest, 0x40, %dest; \
|
|
|
+- subcc %len, 0x40, %len; \
|
|
|
+- be,pn %xcc, jmptgt; \
|
|
|
+- stda %fsrc, [%dest - 0x40] %asi;
|
|
|
+-
|
|
|
+-#define LOOP_CHUNK1(src, dest, len, branch_dest) \
|
|
|
+- MAIN_LOOP_CHUNK(src, dest, f0, f48, len, branch_dest)
|
|
|
+-#define LOOP_CHUNK2(src, dest, len, branch_dest) \
|
|
|
+- MAIN_LOOP_CHUNK(src, dest, f16, f48, len, branch_dest)
|
|
|
+-#define LOOP_CHUNK3(src, dest, len, branch_dest) \
|
|
|
+- MAIN_LOOP_CHUNK(src, dest, f32, f48, len, branch_dest)
|
|
|
+-
|
|
|
+-#define STORE_SYNC(dest, fsrc) \
|
|
|
+- stda %fsrc, [%dest] %asi; \
|
|
|
+- add %dest, 0x40, %dest;
|
|
|
+-
|
|
|
+-#define STORE_JUMP(dest, fsrc, target) \
|
|
|
+- stda %fsrc, [%dest] %asi; \
|
|
|
+- add %dest, 0x40, %dest; \
|
|
|
+- ba,pt %xcc, target;
|
|
|
+-
|
|
|
+-#define VISLOOP_PAD nop; nop; nop; nop; \
|
|
|
+- nop; nop; nop; nop; \
|
|
|
+- nop; nop; nop; nop; \
|
|
|
+- nop; nop; nop;
|
|
|
+-
|
|
|
+-#define FINISH_VISCHUNK(dest, f0, f1, left) \
|
|
|
+- subcc %left, 8, %left; \
|
|
|
+- bl,pn %xcc, 205f; \
|
|
|
+- faligndata %f0, %f1, %f48; \
|
|
|
+- std %f48, [%dest]; \
|
|
|
+- add %dest, 8, %dest;
|
|
|
+-
|
|
|
+-#define UNEVEN_VISCHUNK(dest, f0, f1, left) \
|
|
|
+- subcc %left, 8, %left; \
|
|
|
+- bl,pn %xcc, 205f; \
|
|
|
+- fsrc1 %f0, %f1; \
|
|
|
+- ba,a,pt %xcc, 204f;
|
|
|
+-
|
|
|
+- /* Macros for non-VIS memcpy code. */
|
|
|
+-#define MOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3) \
|
|
|
+- ldx [%src + offset + 0x00], %t0; \
|
|
|
+- ldx [%src + offset + 0x08], %t1; \
|
|
|
+- ldx [%src + offset + 0x10], %t2; \
|
|
|
+- ldx [%src + offset + 0x18], %t3; \
|
|
|
+- stw %t0, [%dst + offset + 0x04]; \
|
|
|
+- srlx %t0, 32, %t0; \
|
|
|
+- stw %t0, [%dst + offset + 0x00]; \
|
|
|
+- stw %t1, [%dst + offset + 0x0c]; \
|
|
|
+- srlx %t1, 32, %t1; \
|
|
|
+- stw %t1, [%dst + offset + 0x08]; \
|
|
|
+- stw %t2, [%dst + offset + 0x14]; \
|
|
|
+- srlx %t2, 32, %t2; \
|
|
|
+- stw %t2, [%dst + offset + 0x10]; \
|
|
|
+- stw %t3, [%dst + offset + 0x1c]; \
|
|
|
+- srlx %t3, 32, %t3; \
|
|
|
+- stw %t3, [%dst + offset + 0x18];
|
|
|
+-
|
|
|
+-#define MOVE_BIGALIGNCHUNK(src, dst, offset, t0, t1, t2, t3) \
|
|
|
+- ldx [%src + offset + 0x00], %t0; \
|
|
|
+- ldx [%src + offset + 0x08], %t1; \
|
|
|
+- ldx [%src + offset + 0x10], %t2; \
|
|
|
+- ldx [%src + offset + 0x18], %t3; \
|
|
|
+- stx %t0, [%dst + offset + 0x00]; \
|
|
|
+- stx %t1, [%dst + offset + 0x08]; \
|
|
|
+- stx %t2, [%dst + offset + 0x10]; \
|
|
|
+- stx %t3, [%dst + offset + 0x18]; \
|
|
|
+- ldx [%src + offset + 0x20], %t0; \
|
|
|
+- ldx [%src + offset + 0x28], %t1; \
|
|
|
+- ldx [%src + offset + 0x30], %t2; \
|
|
|
+- ldx [%src + offset + 0x38], %t3; \
|
|
|
+- stx %t0, [%dst + offset + 0x20]; \
|
|
|
+- stx %t1, [%dst + offset + 0x28]; \
|
|
|
+- stx %t2, [%dst + offset + 0x30]; \
|
|
|
+- stx %t3, [%dst + offset + 0x38];
|
|
|
+-
|
|
|
+-#define MOVE_LASTCHUNK(src, dst, offset, t0, t1, t2, t3) \
|
|
|
+- ldx [%src - offset - 0x10], %t0; \
|
|
|
+- ldx [%src - offset - 0x08], %t1; \
|
|
|
+- stw %t0, [%dst - offset - 0x0c]; \
|
|
|
+- srlx %t0, 32, %t2; \
|
|
|
+- stw %t2, [%dst - offset - 0x10]; \
|
|
|
+- stw %t1, [%dst - offset - 0x04]; \
|
|
|
+- srlx %t1, 32, %t3; \
|
|
|
+- stw %t3, [%dst - offset - 0x08];
|
|
|
+-
|
|
|
+-#define MOVE_LASTALIGNCHUNK(src, dst, offset, t0, t1) \
|
|
|
+- ldx [%src - offset - 0x10], %t0; \
|
|
|
+- ldx [%src - offset - 0x08], %t1; \
|
|
|
+- stx %t0, [%dst - offset - 0x10]; \
|
|
|
+- stx %t1, [%dst - offset - 0x08];
|
|
|
+-
|
|
|
+- /* Macros for non-VIS memmove code. */
|
|
|
+-#define RMOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3) \
|
|
|
+- ldx [%src - offset - 0x20], %t0; \
|
|
|
+- ldx [%src - offset - 0x18], %t1; \
|
|
|
+- ldx [%src - offset - 0x10], %t2; \
|
|
|
+- ldx [%src - offset - 0x08], %t3; \
|
|
|
+- stw %t0, [%dst - offset - 0x1c]; \
|
|
|
+- srlx %t0, 32, %t0; \
|
|
|
+- stw %t0, [%dst - offset - 0x20]; \
|
|
|
+- stw %t1, [%dst - offset - 0x14]; \
|
|
|
+- srlx %t1, 32, %t1; \
|
|
|
+- stw %t1, [%dst - offset - 0x18]; \
|
|
|
+- stw %t2, [%dst - offset - 0x0c]; \
|
|
|
+- srlx %t2, 32, %t2; \
|
|
|
+- stw %t2, [%dst - offset - 0x10]; \
|
|
|
+- stw %t3, [%dst - offset - 0x04]; \
|
|
|
+- srlx %t3, 32, %t3; \
|
|
|
+- stw %t3, [%dst - offset - 0x08];
|
|
|
+-
|
|
|
+-#define RMOVE_BIGALIGNCHUNK(src, dst, offset, t0, t1, t2, t3) \
|
|
|
+- ldx [%src - offset - 0x20], %t0; \
|
|
|
+- ldx [%src - offset - 0x18], %t1; \
|
|
|
+- ldx [%src - offset - 0x10], %t2; \
|
|
|
+- ldx [%src - offset - 0x08], %t3; \
|
|
|
+- stx %t0, [%dst - offset - 0x20]; \
|
|
|
+- stx %t1, [%dst - offset - 0x18]; \
|
|
|
+- stx %t2, [%dst - offset - 0x10]; \
|
|
|
+- stx %t3, [%dst - offset - 0x08]; \
|
|
|
+- ldx [%src - offset - 0x40], %t0; \
|
|
|
+- ldx [%src - offset - 0x38], %t1; \
|
|
|
+- ldx [%src - offset - 0x30], %t2; \
|
|
|
+- ldx [%src - offset - 0x28], %t3; \
|
|
|
+- stx %t0, [%dst - offset - 0x40]; \
|
|
|
+- stx %t1, [%dst - offset - 0x38]; \
|
|
|
+- stx %t2, [%dst - offset - 0x30]; \
|
|
|
+- stx %t3, [%dst - offset - 0x28];
|
|
|
+-
|
|
|
+-#define RMOVE_LASTCHUNK(src, dst, offset, t0, t1, t2, t3) \
|
|
|
+- ldx [%src + offset + 0x00], %t0; \
|
|
|
+- ldx [%src + offset + 0x08], %t1; \
|
|
|
+- stw %t0, [%dst + offset + 0x04]; \
|
|
|
+- srlx %t0, 32, %t2; \
|
|
|
+- stw %t2, [%dst + offset + 0x00]; \
|
|
|
+- stw %t1, [%dst + offset + 0x0c]; \
|
|
|
+- srlx %t1, 32, %t3; \
|
|
|
+- stw %t3, [%dst + offset + 0x08];
|
|
|
+-
|
|
|
+-#define RMOVE_LASTALIGNCHUNK(src, dst, offset, t0, t1) \
|
|
|
+- ldx [%src + offset + 0x00], %t0; \
|
|
|
+- ldx [%src + offset + 0x08], %t1; \
|
|
|
+- stx %t0, [%dst + offset + 0x00]; \
|
|
|
+- stx %t1, [%dst + offset + 0x08];
|
|
|
+-
|
|
|
+- .text
|
|
|
+- .align 32
|
|
|
+-
|
|
|
+-#ifdef __UCLIBC_SUSV3_LEGACY__
|
|
|
+-ENTRY(bcopy)
|
|
|
+- sub %o1, %o0, %o4 /* IEU0 Group */
|
|
|
+- mov %o0, %g3 /* IEU1 */
|
|
|
+- cmp %o4, %o2 /* IEU1 Group */
|
|
|
+- mov %o1, %o0 /* IEU0 */
|
|
|
+- bgeu,pt %XCC, 210f /* CTI */
|
|
|
+- mov %g3, %o1 /* IEU0 Group */
|
|
|
+-#ifndef USE_BPR
|
|
|
+- srl %o2, 0, %o2 /* IEU1 */
|
|
|
+-#endif
|
|
|
+- brnz,pn %o2, 220f /* CTI Group */
|
|
|
+- add %o0, %o2, %o0 /* IEU0 */
|
|
|
+- retl
|
|
|
+- nop
|
|
|
+-END(bcopy)
|
|
|
+-#endif
|
|
|
+-
|
|
|
+- .align 32
|
|
|
+-200: be,pt %xcc, 201f /* CTI */
|
|
|
+- andcc %o0, 0x38, %g5 /* IEU1 Group */
|
|
|
+- mov 8, %g1 /* IEU0 */
|
|
|
+- sub %g1, %g2, %g2 /* IEU0 Group */
|
|
|
+- andcc %o0, 1, %g0 /* IEU1 */
|
|
|
+- be,pt %icc, 2f /* CTI */
|
|
|
+- sub %o2, %g2, %o2 /* IEU0 Group */
|
|
|
+-1: ldub [%o1], %o5 /* Load Group */
|
|
|
+- add %o1, 1, %o1 /* IEU0 */
|
|
|
+- add %o0, 1, %o0 /* IEU1 */
|
|
|
+- subcc %g2, 1, %g2 /* IEU1 Group */
|
|
|
+- be,pn %xcc, 3f /* CTI */
|
|
|
+- stb %o5, [%o0 - 1] /* Store */
|
|
|
+-2: ldub [%o1], %o5 /* Load Group */
|
|
|
+- add %o0, 2, %o0 /* IEU0 */
|
|
|
+- ldub [%o1 + 1], %g3 /* Load Group */
|
|
|
+- subcc %g2, 2, %g2 /* IEU1 Group */
|
|
|
+- stb %o5, [%o0 - 2] /* Store */
|
|
|
+- add %o1, 2, %o1 /* IEU0 */
|
|
|
+- bne,pt %xcc, 2b /* CTI Group */
|
|
|
+- stb %g3, [%o0 - 1] /* Store */
|
|
|
+-3: andcc %o0, 0x38, %g5 /* IEU1 Group */
|
|
|
+-201: be,pt %icc, 202f /* CTI */
|
|
|
+- mov 64, %g1 /* IEU0 */
|
|
|
+- fmovd %f0, %f2 /* FPU */
|
|
|
+- sub %g1, %g5, %g5 /* IEU0 Group */
|
|
|
+- alignaddr %o1, %g0, %g1 /* GRU Group */
|
|
|
+- ldd [%g1], %f4 /* Load Group */
|
|
|
+- sub %o2, %g5, %o2 /* IEU0 */
|
|
|
+-1: ldd [%g1 + 0x8], %f6 /* Load Group */
|
|
|
+- add %g1, 0x8, %g1 /* IEU0 Group */
|
|
|
+- subcc %g5, 8, %g5 /* IEU1 */
|
|
|
+- faligndata %f4, %f6, %f0 /* GRU Group */
|
|
|
+- std %f0, [%o0] /* Store */
|
|
|
+- add %o1, 8, %o1 /* IEU0 Group */
|
|
|
+- be,pn %xcc, 202f /* CTI */
|
|
|
+- add %o0, 8, %o0 /* IEU1 */
|
|
|
+- ldd [%g1 + 0x8], %f4 /* Load Group */
|
|
|
+- add %g1, 8, %g1 /* IEU0 */
|
|
|
+- subcc %g5, 8, %g5 /* IEU1 */
|
|
|
+- faligndata %f6, %f4, %f0 /* GRU Group */
|
|
|
+- std %f0, [%o0] /* Store */
|
|
|
+- add %o1, 8, %o1 /* IEU0 */
|
|
|
+- bne,pt %xcc, 1b /* CTI Group */
|
|
|
+- add %o0, 8, %o0 /* IEU0 */
|
|
|
+-202: membar #LoadStore | #StoreStore | #StoreLoad /* LSU Group */
|
|
|
+- wr %g0, ASI_BLK_P, %asi /* LSU Group */
|
|
|
+- subcc %o2, 0x40, %g6 /* IEU1 Group */
|
|
|
+- mov %o1, %g1 /* IEU0 */
|
|
|
+- andncc %g6, (0x40 - 1), %g6 /* IEU1 Group */
|
|
|
+- srl %g1, 3, %g2 /* IEU0 */
|
|
|
+- 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, %g6, %o2 /* IEU1 */
|
|
|
+- alignaddr %g1, %g0, %g0 /* GRU 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 %g6, 0x80, %g6 /* IEU0 */
|
|
|
+- ldda [%o1 + 0x80] %asi, %f32 /* LSU Group */
|
|
|
+- /* Clk1 Group 8-( */
|
|
|
+- /* Clk2 Group 8-( */
|
|
|
+- /* Clk3 Group 8-( */
|
|
|
+- /* Clk4 Group 8-( */
|
|
|
+-203: rd %pc, %g5 /* PDU Group 8-( */
|
|
|
+- addcc %g5, %lo(300f - 203b), %g5 /* IEU1 Group */
|
|
|
+- sll %g2, 9, %g2 /* IEU0 */
|
|
|
+- jmpl %g5 + %g2, %g0 /* CTI Group brk forced*/
|
|
|
+- 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, 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
|
|
|
+-302: FREG_FROB(f32,f34,f36,f38,f40,f42,f44,f46,f0) STORE_SYNC(o0, f48) membar #Sync
|
|
|
+- FREG_FROB(f0, f2, f4, f6, f8, f10,f12,f14,f16) STORE_JUMP(o0, f48, 416f) membar #Sync
|
|
|
+-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, 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
|
|
|
+-312: FREG_FROB(f34,f36,f38,f40,f42,f44,f46,f0, f2) STORE_SYNC(o0, f48) membar #Sync
|
|
|
+- FREG_FROB(f2, f4, f6, f8, f10,f12,f14,f16,f18) STORE_JUMP(o0, f48, 418f) membar #Sync
|
|
|
+-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, 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
|
|
|
+-322: FREG_FROB(f36,f38,f40,f42,f44,f46,f0, f2, f4) STORE_SYNC(o0, f48) membar #Sync
|
|
|
+- FREG_FROB(f4, f6, f8, f10,f12,f14,f16,f18,f20) STORE_JUMP(o0, f48, 420f) membar #Sync
|
|
|
+-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, 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
|
|
|
+-332: FREG_FROB(f38,f40,f42,f44,f46,f0, f2, f4, f6) STORE_SYNC(o0, f48) membar #Sync
|
|
|
+- FREG_FROB(f6, f8, f10,f12,f14,f16,f18,f20,f22) STORE_JUMP(o0, f48, 422f) membar #Sync
|
|
|
+-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, 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
|
|
|
+-342: FREG_FROB(f40,f42,f44,f46,f0, f2, f4, f6, f8) STORE_SYNC(o0, f48) membar #Sync
|
|
|
+- FREG_FROB(f8, f10,f12,f14,f16,f18,f20,f22,f24) STORE_JUMP(o0, f48, 424f) membar #Sync
|
|
|
+-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, 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: FREG_FROB(f42,f44,f46,f0, f2, f4, f6, f8, f10) STORE_SYNC(o0, f48) membar #Sync
|
|
|
+- FREG_FROB(f10,f12,f14,f16,f18,f20,f22,f24,f26) STORE_JUMP(o0, f48, 426f) membar #Sync
|
|
|
+-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, 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
|
|
|
+-362: FREG_FROB(f44,f46,f0, f2, f4, f6, f8, f10,f12) STORE_SYNC(o0, f48) membar #Sync
|
|
|
+- FREG_FROB(f12,f14,f16,f18,f20,f22,f24,f26,f28) STORE_JUMP(o0, f48, 428f) membar #Sync
|
|
|
+-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, 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
|
|
|
+-372: FREG_FROB(f46,f0, f2, f4, f6, f8, f10,f12,f14) STORE_SYNC(o0, f48) membar #Sync
|
|
|
+- FREG_FROB(f14,f16,f18,f20,f22,f24,f26,f28,f30) STORE_JUMP(o0, f48, 430f) membar #Sync
|
|
|
+-373: FREG_FROB(f14,f16,f18,f20,f22,f24,f26,f28,f30) STORE_SYNC(o0, f48) membar #Sync
|
|
|
+- FREG_FROB(f30,f32,f34,f36,f38,f40,f42,f44,f46) STORE_JUMP(o0, f48, 446f) membar #Sync
|
|
|
+- VISLOOP_PAD
|
|
|
+-400: FINISH_VISCHUNK(o0, f0, f2, g3)
|
|
|
+-402: FINISH_VISCHUNK(o0, f2, f4, g3)
|
|
|
+-404: FINISH_VISCHUNK(o0, f4, f6, g3)
|
|
|
+-406: FINISH_VISCHUNK(o0, f6, f8, g3)
|
|
|
+-408: FINISH_VISCHUNK(o0, f8, f10, g3)
|
|
|
+-410: FINISH_VISCHUNK(o0, f10, f12, g3)
|
|
|
+-412: FINISH_VISCHUNK(o0, f12, f14, g3)
|
|
|
+-414: UNEVEN_VISCHUNK(o0, f14, f0, g3)
|
|
|
+-416: FINISH_VISCHUNK(o0, f16, f18, g3)
|
|
|
+-418: FINISH_VISCHUNK(o0, f18, f20, g3)
|
|
|
+-420: FINISH_VISCHUNK(o0, f20, f22, g3)
|
|
|
+-422: FINISH_VISCHUNK(o0, f22, f24, g3)
|
|
|
+-424: FINISH_VISCHUNK(o0, f24, f26, g3)
|
|
|
+-426: FINISH_VISCHUNK(o0, f26, f28, g3)
|
|
|
+-428: FINISH_VISCHUNK(o0, f28, f30, g3)
|
|
|
+-430: UNEVEN_VISCHUNK(o0, f30, f0, g3)
|
|
|
+-432: FINISH_VISCHUNK(o0, f32, f34, g3)
|
|
|
+-434: FINISH_VISCHUNK(o0, f34, f36, g3)
|
|
|
+-436: FINISH_VISCHUNK(o0, f36, f38, g3)
|
|
|
+-438: FINISH_VISCHUNK(o0, f38, f40, g3)
|
|
|
+-440: FINISH_VISCHUNK(o0, f40, f42, g3)
|
|
|
+-442: FINISH_VISCHUNK(o0, f42, f44, g3)
|
|
|
+-444: FINISH_VISCHUNK(o0, f44, f46, g3)
|
|
|
+-446: UNEVEN_VISCHUNK(o0, f46, f0, g3)
|
|
|
+-204: ldd [%o1], %f2 /* Load Group */
|
|
|
+- add %o1, 8, %o1 /* IEU0 */
|
|
|
+- subcc %g3, 8, %g3 /* IEU1 */
|
|
|
+- faligndata %f0, %f2, %f8 /* GRU Group */
|
|
|
+- std %f8, [%o0] /* Store */
|
|
|
+- bl,pn %xcc, 205f /* CTI */
|
|
|
+- add %o0, 8, %o0 /* IEU0 Group */
|
|
|
+- ldd [%o1], %f0 /* Load Group */
|
|
|
+- add %o1, 8, %o1 /* IEU0 */
|
|
|
+- subcc %g3, 8, %g3 /* IEU1 */
|
|
|
+- faligndata %f2, %f0, %f8 /* GRU Group */
|
|
|
+- std %f8, [%o0] /* Store */
|
|
|
+- bge,pt %xcc, 204b /* CTI */
|
|
|
+- add %o0, 8, %o0 /* IEU0 Group */
|
|
|
+-205: brz,pt %o2, 207f /* CTI Group */
|
|
|
+- mov %g1, %o1 /* IEU0 */
|
|
|
+-206: ldub [%o1], %g5 /* LOAD */
|
|
|
+- add %o1, 1, %o1 /* IEU0 */
|
|
|
+- add %o0, 1, %o0 /* IEU1 */
|
|
|
+- subcc %o2, 1, %o2 /* IEU1 */
|
|
|
+- bne,pt %xcc, 206b /* CTI */
|
|
|
+- stb %g5, [%o0 - 1] /* Store Group */
|
|
|
+-207: membar #StoreLoad | #StoreStore /* LSU Group */
|
|
|
+- wr %g0, FPRS_FEF, %fprs
|
|
|
+- retl
|
|
|
+- mov %g4, %o0
|
|
|
+-
|
|
|
+-208: andcc %o2, 1, %g0 /* IEU1 Group */
|
|
|
+- be,pt %icc, 2f+4 /* CTI */
|
|
|
+-1: ldub [%o1], %g5 /* LOAD Group */
|
|
|
+- add %o1, 1, %o1 /* IEU0 */
|
|
|
+- add %o0, 1, %o0 /* IEU1 */
|
|
|
+- subcc %o2, 1, %o2 /* IEU1 Group */
|
|
|
+- be,pn %xcc, 209f /* CTI */
|
|
|
+- stb %g5, [%o0 - 1] /* Store */
|
|
|
+-2: ldub [%o1], %g5 /* LOAD Group */
|
|
|
+- add %o0, 2, %o0 /* IEU0 */
|
|
|
+- ldub [%o1 + 1], %o5 /* LOAD Group */
|
|
|
+- add %o1, 2, %o1 /* IEU0 */
|
|
|
+- subcc %o2, 2, %o2 /* IEU1 Group */
|
|
|
+- stb %g5, [%o0 - 2] /* Store */
|
|
|
+- bne,pt %xcc, 2b /* CTI */
|
|
|
+- stb %o5, [%o0 - 1] /* Store */
|
|
|
+-209: retl
|
|
|
+- mov %g4, %o0
|
|
|
+-
|
|
|
+-#ifdef USE_BPR
|
|
|
+-
|
|
|
+- /* void *__align_cpy_4(void *dest, void *src, size_t n)
|
|
|
+- * SPARC v9 SYSV ABI
|
|
|
+- * Like memcpy, but results are undefined if (!n || ((dest | src | n) & 3))
|
|
|
+- */
|
|
|
+-
|
|
|
+- .align 32
|
|
|
+-ENTRY(__align_cpy_4)
|
|
|
+- mov %o0, %g4 /* IEU0 Group */
|
|
|
+- cmp %o2, 15 /* IEU1 */
|
|
|
+- bleu,pn %xcc, 208b /* CTI */
|
|
|
+- cmp %o2, (64 * 6) /* IEU1 Group */
|
|
|
+- bgeu,pn %xcc, 200b /* CTI */
|
|
|
+- andcc %o0, 7, %g2 /* IEU1 Group */
|
|
|
+- ba,pt %xcc, 216f /* CTI */
|
|
|
+- andcc %o1, 4, %g0 /* IEU1 Group */
|
|
|
+-END(__align_cpy_4)
|
|
|
+-
|
|
|
+- /* void *__align_cpy_8(void *dest, void *src, size_t n)
|
|
|
+- * SPARC v9 SYSV ABI
|
|
|
+- * Like memcpy, but results are undefined if (!n || ((dest | src | n) & 7))
|
|
|
+- */
|
|
|
+-
|
|
|
+- .align 32
|
|
|
+-ENTRY(__align_cpy_8)
|
|
|
+- mov %o0, %g4 /* IEU0 Group */
|
|
|
+- cmp %o2, 15 /* IEU1 */
|
|
|
+- bleu,pn %xcc, 208b /* CTI */
|
|
|
+- cmp %o2, (64 * 6) /* IEU1 Group */
|
|
|
+- bgeu,pn %xcc, 201b /* CTI */
|
|
|
+- andcc %o0, 0x38, %g5 /* 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, %g6 /* IEU1 */
|
|
|
+-END(__align_cpy_8)
|
|
|
+-
|
|
|
+- /* void *__align_cpy_16(void *dest, void *src, size_t n)
|
|
|
+- * SPARC v9 SYSV ABI
|
|
|
+- * Like memcpy, but results are undefined if (!n || ((dest | src | n) & 15))
|
|
|
+- */
|
|
|
+-
|
|
|
+- .align 32
|
|
|
+-ENTRY(__align_cpy_16)
|
|
|
+- mov %o0, %g4 /* IEU0 Group */
|
|
|
+- cmp %o2, (64 * 6) /* IEU1 */
|
|
|
+- bgeu,pn %xcc, 201b /* CTI */
|
|
|
+- andcc %o0, 0x38, %g5 /* 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, %g6 /* IEU1 */
|
|
|
+-END(__align_cpy_16)
|
|
|
+-
|
|
|
+-#endif
|
|
|
+-
|
|
|
+- .align 32
|
|
|
+-ENTRY(memcpy)
|
|
|
+-210:
|
|
|
+-#ifndef USE_BPR
|
|
|
+- srl %o2, 0, %o2 /* IEU1 Group */
|
|
|
+-#endif
|
|
|
+- brz,pn %o2, 209b /* CTI Group */
|
|
|
+- mov %o0, %g4 /* IEU0 */
|
|
|
+-218: cmp %o2, 15 /* IEU1 Group */
|
|
|
+- bleu,pn %xcc, 208b /* CTI */
|
|
|
+- cmp %o2, (64 * 6) /* IEU1 Group */
|
|
|
+- bgeu,pn %xcc, 200b /* CTI */
|
|
|
+- andcc %o0, 7, %g2 /* IEU1 Group */
|
|
|
+- sub %o0, %o1, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 3, %o5 /* IEU1 Group */
|
|
|
+- bne,pn %xcc, 212f /* CTI */
|
|
|
+- andcc %o1, 3, %g0 /* IEU1 Group */
|
|
|
+- be,a,pt %xcc, 216f /* CTI */
|
|
|
+- andcc %o1, 4, %g0 /* IEU1 Group */
|
|
|
+- andcc %o1, 1, %g0 /* IEU1 Group */
|
|
|
+- be,pn %xcc, 4f /* CTI */
|
|
|
+- andcc %o1, 2, %g0 /* IEU1 Group */
|
|
|
+- ldub [%o1], %g2 /* Load Group */
|
|
|
+- add %o1, 1, %o1 /* IEU0 */
|
|
|
+- add %o0, 1, %o0 /* IEU1 */
|
|
|
+- sub %o2, 1, %o2 /* IEU0 Group */
|
|
|
+- bne,pn %xcc, 5f /* CTI Group */
|
|
|
+- stb %g2, [%o0 - 1] /* Store */
|
|
|
+-4: lduh [%o1], %g2 /* Load Group */
|
|
|
+- add %o1, 2, %o1 /* IEU0 */
|
|
|
+- add %o0, 2, %o0 /* IEU1 */
|
|
|
+- sub %o2, 2, %o2 /* IEU0 */
|
|
|
+- sth %g2, [%o0 - 2] /* Store Group + bubble */
|
|
|
+-5: andcc %o1, 4, %g0 /* IEU1 */
|
|
|
+-216: be,a,pn %xcc, 2f /* CTI */
|
|
|
+- 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, %g6 /* IEU1 Group */
|
|
|
+-2: be,pn %xcc, 215f /* CTI */
|
|
|
+- andcc %o0, 4, %g0 /* IEU1 Group */
|
|
|
+- be,pn %xcc, 82f + 4 /* CTI Group */
|
|
|
+-5: MOVE_BIGCHUNK(o1, o0, 0x00, g1, g3, g5, o5)
|
|
|
+- 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 %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, %g6 /* IEU1 Group */
|
|
|
+-41: be,pn %xcc, 80f /* CTI */
|
|
|
+- andcc %o2, 8, %g0 /* IEU1 Group */
|
|
|
+- /* Clk1 8-( */
|
|
|
+- /* Clk2 8-( */
|
|
|
+- /* Clk3 8-( */
|
|
|
+- /* Clk4 8-( */
|
|
|
+-79: rd %pc, %o5 /* PDU Group */
|
|
|
+- 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, %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)
|
|
|
+- MOVE_LASTCHUNK(o1, o0, 0x30, g2, g3, g5, o5)
|
|
|
+- MOVE_LASTCHUNK(o1, o0, 0x20, g2, g3, g5, o5)
|
|
|
+- MOVE_LASTCHUNK(o1, o0, 0x10, g2, g3, g5, o5)
|
|
|
+- MOVE_LASTCHUNK(o1, o0, 0x00, g2, g3, g5, o5)
|
|
|
+-80: be,pt %xcc, 81f /* CTI */
|
|
|
+- andcc %o2, 4, %g0 /* IEU1 */
|
|
|
+- ldx [%o1], %g2 /* Load Group */
|
|
|
+- add %o0, 8, %o0 /* IEU0 */
|
|
|
+- stw %g2, [%o0 - 0x4] /* Store Group */
|
|
|
+- add %o1, 8, %o1 /* IEU1 */
|
|
|
+- srlx %g2, 32, %g2 /* IEU0 Group */
|
|
|
+- stw %g2, [%o0 - 0x8] /* Store */
|
|
|
+-81: be,pt %xcc, 1f /* CTI */
|
|
|
+- andcc %o2, 2, %g0 /* IEU1 Group */
|
|
|
+- lduw [%o1], %g2 /* Load Group */
|
|
|
+- add %o1, 4, %o1 /* IEU0 */
|
|
|
+- stw %g2, [%o0] /* Store Group */
|
|
|
+- add %o0, 4, %o0 /* IEU0 */
|
|
|
+-1: be,pt %xcc, 1f /* CTI */
|
|
|
+- andcc %o2, 1, %g0 /* IEU1 Group */
|
|
|
+- lduh [%o1], %g2 /* Load Group */
|
|
|
+- add %o1, 2, %o1 /* IEU0 */
|
|
|
+- sth %g2, [%o0] /* Store Group */
|
|
|
+- add %o0, 2, %o0 /* IEU0 */
|
|
|
+-1: be,pt %xcc, 211f /* CTI */
|
|
|
+- nop /* IEU1 */
|
|
|
+- ldub [%o1], %g2 /* Load Group */
|
|
|
+- stb %g2, [%o0] /* Store Group + bubble */
|
|
|
+-211: retl
|
|
|
+- mov %g4, %o0
|
|
|
+-
|
|
|
+-82: MOVE_BIGALIGNCHUNK(o1, o0, 0x00, g1, g3, g5, o5)
|
|
|
+- MOVE_BIGALIGNCHUNK(o1, o0, 0x40, g1, g3, g5, o5)
|
|
|
+-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, %g6 /* IEU1 */
|
|
|
+- be,pn %xcc, 84f /* CTI */
|
|
|
+- andcc %o2, 8, %g0 /* IEU1 Group */
|
|
|
+- /* Clk1 8-( */
|
|
|
+- /* Clk2 8-( */
|
|
|
+- /* Clk3 8-( */
|
|
|
+- /* Clk4 8-( */
|
|
|
+-83: rd %pc, %o5 /* PDU Group */
|
|
|
+- add %o1, %g6, %o1 /* IEU0 Group */
|
|
|
+- sub %o5, %g6, %o5 /* IEU1 */
|
|
|
+- jmpl %o5 + %lo(84f - 83b), %g0 /* CTI Group brk forced*/
|
|
|
+- 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)
|
|
|
+- MOVE_LASTALIGNCHUNK(o1, o0, 0x30, g2, g3)
|
|
|
+- MOVE_LASTALIGNCHUNK(o1, o0, 0x20, g2, g3)
|
|
|
+- MOVE_LASTALIGNCHUNK(o1, o0, 0x10, g2, g3)
|
|
|
+- MOVE_LASTALIGNCHUNK(o1, o0, 0x00, g2, g3)
|
|
|
+-84: be,pt %xcc, 85f /* CTI Group */
|
|
|
+- andcc %o2, 4, %g0 /* IEU1 */
|
|
|
+- ldx [%o1], %g2 /* Load Group */
|
|
|
+- add %o0, 8, %o0 /* IEU0 */
|
|
|
+- add %o1, 8, %o1 /* IEU0 Group */
|
|
|
+- stx %g2, [%o0 - 0x8] /* Store */
|
|
|
+-85: be,pt %xcc, 1f /* CTI */
|
|
|
+- andcc %o2, 2, %g0 /* IEU1 Group */
|
|
|
+- lduw [%o1], %g2 /* Load Group */
|
|
|
+- add %o0, 4, %o0 /* IEU0 */
|
|
|
+- add %o1, 4, %o1 /* IEU0 Group */
|
|
|
+- stw %g2, [%o0 - 0x4] /* Store */
|
|
|
+-1: be,pt %xcc, 1f /* CTI */
|
|
|
+- andcc %o2, 1, %g0 /* IEU1 Group */
|
|
|
+- lduh [%o1], %g2 /* Load Group */
|
|
|
+- add %o0, 2, %o0 /* IEU0 */
|
|
|
+- add %o1, 2, %o1 /* IEU0 Group */
|
|
|
+- sth %g2, [%o0 - 0x2] /* Store */
|
|
|
+-1: be,pt %xcc, 1f /* CTI */
|
|
|
+- nop /* IEU0 Group */
|
|
|
+- ldub [%o1], %g2 /* Load Group */
|
|
|
+- stb %g2, [%o0] /* Store Group + bubble */
|
|
|
+-1: retl
|
|
|
+- mov %g4, %o0
|
|
|
+-
|
|
|
+-212: brz,pt %g2, 2f /* CTI Group */
|
|
|
+- mov 8, %g1 /* IEU0 */
|
|
|
+- sub %g1, %g2, %g2 /* IEU0 Group */
|
|
|
+- sub %o2, %g2, %o2 /* IEU0 Group */
|
|
|
+-1: ldub [%o1], %g5 /* Load Group */
|
|
|
+- add %o1, 1, %o1 /* IEU0 */
|
|
|
+- add %o0, 1, %o0 /* IEU1 */
|
|
|
+- subcc %g2, 1, %g2 /* IEU1 Group */
|
|
|
+- bne,pt %xcc, 1b /* CTI */
|
|
|
+- stb %g5, [%o0 - 1] /* Store */
|
|
|
+-2: andn %o2, 7, %g5 /* IEU0 Group */
|
|
|
+- and %o2, 7, %o2 /* IEU1 */
|
|
|
+- fmovd %f0, %f2 /* FPU */
|
|
|
+- alignaddr %o1, %g0, %g1 /* GRU Group */
|
|
|
+- ldd [%g1], %f4 /* Load Group */
|
|
|
+-1: ldd [%g1 + 0x8], %f6 /* Load Group */
|
|
|
+- add %g1, 0x8, %g1 /* IEU0 Group */
|
|
|
+- subcc %g5, 8, %g5 /* IEU1 */
|
|
|
+- faligndata %f4, %f6, %f0 /* GRU Group */
|
|
|
+- std %f0, [%o0] /* Store */
|
|
|
+- add %o1, 8, %o1 /* IEU0 Group */
|
|
|
+- be,pn %xcc, 213f /* CTI */
|
|
|
+- add %o0, 8, %o0 /* IEU1 */
|
|
|
+- ldd [%g1 + 0x8], %f4 /* Load Group */
|
|
|
+- add %g1, 8, %g1 /* IEU0 */
|
|
|
+- subcc %g5, 8, %g5 /* IEU1 */
|
|
|
+- faligndata %f6, %f4, %f0 /* GRU Group */
|
|
|
+- std %f0, [%o0] /* Store */
|
|
|
+- add %o1, 8, %o1 /* IEU0 */
|
|
|
+- bne,pn %xcc, 1b /* CTI Group */
|
|
|
+- add %o0, 8, %o0 /* IEU0 */
|
|
|
+-213: brz,pn %o2, 214f /* CTI Group */
|
|
|
+- nop /* IEU0 */
|
|
|
+- ldub [%o1], %g5 /* LOAD */
|
|
|
+- add %o1, 1, %o1 /* IEU0 */
|
|
|
+- add %o0, 1, %o0 /* IEU1 */
|
|
|
+- subcc %o2, 1, %o2 /* IEU1 */
|
|
|
+- bne,pt %xcc, 206b /* CTI */
|
|
|
+- stb %g5, [%o0 - 1] /* Store Group */
|
|
|
+-214: wr %g0, FPRS_FEF, %fprs
|
|
|
+- retl
|
|
|
+- mov %g4, %o0
|
|
|
+-END(memcpy)
|
|
|
+-libc_hidden_def(memcpy)
|
|
|
+-
|
|
|
+- .align 32
|
|
|
+-228: andcc %o2, 1, %g0 /* IEU1 Group */
|
|
|
+- be,pt %icc, 2f+4 /* CTI */
|
|
|
+-1: ldub [%o1 - 1], %o5 /* LOAD Group */
|
|
|
+- sub %o1, 1, %o1 /* IEU0 */
|
|
|
+- sub %o0, 1, %o0 /* IEU1 */
|
|
|
+- subcc %o2, 1, %o2 /* IEU1 Group */
|
|
|
+- be,pn %xcc, 229f /* CTI */
|
|
|
+- stb %o5, [%o0] /* Store */
|
|
|
+-2: ldub [%o1 - 1], %o5 /* LOAD Group */
|
|
|
+- sub %o0, 2, %o0 /* IEU0 */
|
|
|
+- ldub [%o1 - 2], %g5 /* LOAD Group */
|
|
|
+- sub %o1, 2, %o1 /* IEU0 */
|
|
|
+- subcc %o2, 2, %o2 /* IEU1 Group */
|
|
|
+- stb %o5, [%o0 + 1] /* Store */
|
|
|
+- bne,pt %xcc, 2b /* CTI */
|
|
|
+- stb %g5, [%o0] /* Store */
|
|
|
+-229: retl
|
|
|
+- mov %g4, %o0
|
|
|
+-219: retl
|
|
|
+- nop
|
|
|
+-
|
|
|
+- .align 32
|
|
|
+-ENTRY(memmove)
|
|
|
+-#ifndef USE_BPR
|
|
|
+- srl %o2, 0, %o2 /* IEU1 Group */
|
|
|
+-#endif
|
|
|
+- brz,pn %o2, 219b /* CTI Group */
|
|
|
+- sub %o0, %o1, %o4 /* IEU0 */
|
|
|
+- cmp %o4, %o2 /* IEU1 Group */
|
|
|
+- bgeu,pt %XCC, 218b /* CTI */
|
|
|
+- mov %o0, %g4 /* IEU0 */
|
|
|
+- add %o0, %o2, %o0 /* IEU0 Group */
|
|
|
+-220: add %o1, %o2, %o1 /* IEU1 */
|
|
|
+- cmp %o2, 15 /* IEU1 Group */
|
|
|
+- bleu,pn %xcc, 228b /* CTI */
|
|
|
+- andcc %o0, 7, %g2 /* IEU1 Group */
|
|
|
+- sub %o0, %o1, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 3, %o5 /* IEU1 Group */
|
|
|
+- bne,pn %xcc, 232f /* CTI */
|
|
|
+- andcc %o1, 3, %g0 /* IEU1 Group */
|
|
|
+- be,a,pt %xcc, 236f /* CTI */
|
|
|
+- andcc %o1, 4, %g0 /* IEU1 Group */
|
|
|
+- andcc %o1, 1, %g0 /* IEU1 Group */
|
|
|
+- be,pn %xcc, 4f /* CTI */
|
|
|
+- andcc %o1, 2, %g0 /* IEU1 Group */
|
|
|
+- ldub [%o1 - 1], %g2 /* Load Group */
|
|
|
+- sub %o1, 1, %o1 /* IEU0 */
|
|
|
+- sub %o0, 1, %o0 /* IEU1 */
|
|
|
+- sub %o2, 1, %o2 /* IEU0 Group */
|
|
|
+- be,pn %xcc, 5f /* CTI Group */
|
|
|
+- stb %g2, [%o0] /* Store */
|
|
|
+-4: lduh [%o1 - 2], %g2 /* Load Group */
|
|
|
+- sub %o1, 2, %o1 /* IEU0 */
|
|
|
+- sub %o0, 2, %o0 /* IEU1 */
|
|
|
+- sub %o2, 2, %o2 /* IEU0 */
|
|
|
+- sth %g2, [%o0] /* Store Group + bubble */
|
|
|
+-5: andcc %o1, 4, %g0 /* IEU1 */
|
|
|
+-236: be,a,pn %xcc, 2f /* CTI */
|
|
|
+- 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, %g6 /* IEU1 Group */
|
|
|
+-2: be,pn %xcc, 235f /* CTI */
|
|
|
+- andcc %o0, 4, %g0 /* IEU1 Group */
|
|
|
+- be,pn %xcc, 282f + 4 /* CTI Group */
|
|
|
+-5: RMOVE_BIGCHUNK(o1, o0, 0x00, g1, g3, g5, o5)
|
|
|
+- 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 %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, %g6 /* IEU1 Group */
|
|
|
+-41: be,pn %xcc, 280f /* CTI */
|
|
|
+- andcc %o2, 8, %g0 /* IEU1 Group */
|
|
|
+- /* Clk1 8-( */
|
|
|
+- /* Clk2 8-( */
|
|
|
+- /* Clk3 8-( */
|
|
|
+- /* Clk4 8-( */
|
|
|
+-279: rd %pc, %o5 /* PDU Group */
|
|
|
+- 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, %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)
|
|
|
+- RMOVE_LASTCHUNK(o1, o0, 0x30, g2, g3, g5, o5)
|
|
|
+- RMOVE_LASTCHUNK(o1, o0, 0x20, g2, g3, g5, o5)
|
|
|
+- RMOVE_LASTCHUNK(o1, o0, 0x10, g2, g3, g5, o5)
|
|
|
+- RMOVE_LASTCHUNK(o1, o0, 0x00, g2, g3, g5, o5)
|
|
|
+-280: be,pt %xcc, 281f /* CTI */
|
|
|
+- andcc %o2, 4, %g0 /* IEU1 */
|
|
|
+- ldx [%o1 - 8], %g2 /* Load Group */
|
|
|
+- sub %o0, 8, %o0 /* IEU0 */
|
|
|
+- stw %g2, [%o0 + 4] /* Store Group */
|
|
|
+- sub %o1, 8, %o1 /* IEU1 */
|
|
|
+- srlx %g2, 32, %g2 /* IEU0 Group */
|
|
|
+- stw %g2, [%o0] /* Store */
|
|
|
+-281: be,pt %xcc, 1f /* CTI */
|
|
|
+- andcc %o2, 2, %g0 /* IEU1 Group */
|
|
|
+- lduw [%o1 - 4], %g2 /* Load Group */
|
|
|
+- sub %o1, 4, %o1 /* IEU0 */
|
|
|
+- stw %g2, [%o0 - 4] /* Store Group */
|
|
|
+- sub %o0, 4, %o0 /* IEU0 */
|
|
|
+-1: be,pt %xcc, 1f /* CTI */
|
|
|
+- andcc %o2, 1, %g0 /* IEU1 Group */
|
|
|
+- lduh [%o1 - 2], %g2 /* Load Group */
|
|
|
+- sub %o1, 2, %o1 /* IEU0 */
|
|
|
+- sth %g2, [%o0 - 2] /* Store Group */
|
|
|
+- sub %o0, 2, %o0 /* IEU0 */
|
|
|
+-1: be,pt %xcc, 211f /* CTI */
|
|
|
+- nop /* IEU1 */
|
|
|
+- ldub [%o1 - 1], %g2 /* Load Group */
|
|
|
+- stb %g2, [%o0 - 1] /* Store Group + bubble */
|
|
|
+-211: retl
|
|
|
+- mov %g4, %o0
|
|
|
+-
|
|
|
+-282: RMOVE_BIGALIGNCHUNK(o1, o0, 0x00, g1, g3, g5, o5)
|
|
|
+- RMOVE_BIGALIGNCHUNK(o1, o0, 0x40, g1, g3, g5, o5)
|
|
|
+- 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, %g6 /* IEU1 */
|
|
|
+- be,pn %xcc, 284f /* CTI */
|
|
|
+- andcc %o2, 8, %g0 /* IEU1 Group */
|
|
|
+- /* Clk1 8-( */
|
|
|
+- /* Clk2 8-( */
|
|
|
+- /* Clk3 8-( */
|
|
|
+- /* Clk4 8-( */
|
|
|
+-283: rd %pc, %o5 /* PDU Group */
|
|
|
+- sub %o1, %g6, %o1 /* IEU0 Group */
|
|
|
+- sub %o5, %g6, %o5 /* IEU1 */
|
|
|
+- jmpl %o5 + %lo(284f - 283b), %g0 /* CTI Group brk forced*/
|
|
|
+- 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)
|
|
|
+- RMOVE_LASTALIGNCHUNK(o1, o0, 0x30, g2, g3)
|
|
|
+- RMOVE_LASTALIGNCHUNK(o1, o0, 0x20, g2, g3)
|
|
|
+- RMOVE_LASTALIGNCHUNK(o1, o0, 0x10, g2, g3)
|
|
|
+- RMOVE_LASTALIGNCHUNK(o1, o0, 0x00, g2, g3)
|
|
|
+-284: be,pt %xcc, 285f /* CTI Group */
|
|
|
+- andcc %o2, 4, %g0 /* IEU1 */
|
|
|
+- ldx [%o1 - 8], %g2 /* Load Group */
|
|
|
+- sub %o0, 8, %o0 /* IEU0 */
|
|
|
+- sub %o1, 8, %o1 /* IEU0 Group */
|
|
|
+- stx %g2, [%o0] /* Store */
|
|
|
+-285: be,pt %xcc, 1f /* CTI */
|
|
|
+- andcc %o2, 2, %g0 /* IEU1 Group */
|
|
|
+- lduw [%o1 - 4], %g2 /* Load Group */
|
|
|
+- sub %o0, 4, %o0 /* IEU0 */
|
|
|
+- sub %o1, 4, %o1 /* IEU0 Group */
|
|
|
+- stw %g2, [%o0] /* Store */
|
|
|
+-1: be,pt %xcc, 1f /* CTI */
|
|
|
+- andcc %o2, 1, %g0 /* IEU1 Group */
|
|
|
+- lduh [%o1 - 2], %g2 /* Load Group */
|
|
|
+- sub %o0, 2, %o0 /* IEU0 */
|
|
|
+- sub %o1, 2, %o1 /* IEU0 Group */
|
|
|
+- sth %g2, [%o0] /* Store */
|
|
|
+-1: be,pt %xcc, 1f /* CTI */
|
|
|
+- nop /* IEU0 Group */
|
|
|
+- ldub [%o1 - 1], %g2 /* Load Group */
|
|
|
+- stb %g2, [%o0 - 1] /* Store Group + bubble */
|
|
|
+-1: retl
|
|
|
+- mov %g4, %o0
|
|
|
+-
|
|
|
+-232: brz,pt %g2, 2f /* CTI Group */
|
|
|
+- sub %o2, %g2, %o2 /* IEU0 Group */
|
|
|
+-1: ldub [%o1 - 1], %g5 /* Load Group */
|
|
|
+- sub %o1, 1, %o1 /* IEU0 */
|
|
|
+- sub %o0, 1, %o0 /* IEU1 */
|
|
|
+- subcc %g2, 1, %g2 /* IEU1 Group */
|
|
|
+- bne,pt %xcc, 1b /* CTI */
|
|
|
+- stb %g5, [%o0] /* Store */
|
|
|
+-2: andn %o2, 7, %g5 /* IEU0 Group */
|
|
|
+- and %o2, 7, %o2 /* IEU1 */
|
|
|
+- fmovd %f0, %f2 /* FPU */
|
|
|
+- alignaddr %o1, %g0, %g1 /* GRU Group */
|
|
|
+- ldd [%g1], %f4 /* Load Group */
|
|
|
+-1: ldd [%g1 - 8], %f6 /* Load Group */
|
|
|
+- sub %g1, 8, %g1 /* IEU0 Group */
|
|
|
+- subcc %g5, 8, %g5 /* IEU1 */
|
|
|
+- faligndata %f6, %f4, %f0 /* GRU Group */
|
|
|
+- std %f0, [%o0 - 8] /* Store */
|
|
|
+- sub %o1, 8, %o1 /* IEU0 Group */
|
|
|
+- be,pn %xcc, 233f /* CTI */
|
|
|
+- sub %o0, 8, %o0 /* IEU1 */
|
|
|
+- ldd [%g1 - 8], %f4 /* Load Group */
|
|
|
+- sub %g1, 8, %g1 /* IEU0 */
|
|
|
+- subcc %g5, 8, %g5 /* IEU1 */
|
|
|
+- faligndata %f4, %f6, %f0 /* GRU Group */
|
|
|
+- std %f0, [%o0 - 8] /* Store */
|
|
|
+- sub %o1, 8, %o1 /* IEU0 */
|
|
|
+- bne,pn %xcc, 1b /* CTI Group */
|
|
|
+- sub %o0, 8, %o0 /* IEU0 */
|
|
|
+-233: brz,pn %o2, 234f /* CTI Group */
|
|
|
+- nop /* IEU0 */
|
|
|
+-237: ldub [%o1 - 1], %g5 /* LOAD */
|
|
|
+- sub %o1, 1, %o1 /* IEU0 */
|
|
|
+- sub %o0, 1, %o0 /* IEU1 */
|
|
|
+- subcc %o2, 1, %o2 /* IEU1 */
|
|
|
+- bne,pt %xcc, 237b /* CTI */
|
|
|
+- stb %g5, [%o0] /* Store Group */
|
|
|
+-234: wr %g0, FPRS_FEF, %fprs
|
|
|
+- retl
|
|
|
+- mov %g4, %o0
|
|
|
+-END(memmove)
|
|
|
+-libc_hidden_def(memmove)
|
|
|
+-
|
|
|
+-#ifdef USE_BPR
|
|
|
+-weak_alias(memcpy,__align_cpy_1)
|
|
|
+-weak_alias(memcpy,__align_cpy_2)
|
|
|
+-#endif
|
|
|
+diff --git a/libc/string/sparc/sparc64/memset.S b/libc/string/sparc/sparc64/memset.S
|
|
|
+deleted file mode 100644
|
|
|
+index f76a637..0000000
|
|
|
+--- a/libc/string/sparc/sparc64/memset.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,316 +0,0 @@
|
|
|
+-/* Set a block of memory to some byte value.
|
|
|
+- For UltraSPARC.
|
|
|
+- 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 (jj@ultra.linux.cz).
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <features.h>
|
|
|
+-#include <asm/asi.h>
|
|
|
+-#ifndef XCC
|
|
|
+-#define XCC xcc
|
|
|
+-#define USE_BPR
|
|
|
+-#endif
|
|
|
+-#define FPRS_FEF 4
|
|
|
+-
|
|
|
+-#define SET_BLOCKS(base, offset, source) \
|
|
|
+- stx source, [base - offset - 0x18]; \
|
|
|
+- stx source, [base - offset - 0x10]; \
|
|
|
+- stx source, [base - offset - 0x08]; \
|
|
|
+- stx source, [base - offset - 0x00];
|
|
|
+-
|
|
|
+- /* Well, memset is a lot easier to get right than bcopy... */
|
|
|
+- .text
|
|
|
+- .align 32
|
|
|
+-ENTRY(memset)
|
|
|
+- andcc %o1, 0xff, %o1
|
|
|
+- mov %o0, %o5
|
|
|
+- be,a,pt %icc, 50f
|
|
|
+-#ifndef USE_BPR
|
|
|
+- srl %o2, 0, %o1
|
|
|
+-#else
|
|
|
+- mov %o2, %o1
|
|
|
+-#endif
|
|
|
+- cmp %o2, 7
|
|
|
+-#ifndef USE_BPR
|
|
|
+- srl %o2, 0, %o2
|
|
|
+-#endif
|
|
|
+- bleu,pn %XCC, 17f
|
|
|
+- andcc %o0, 3, %g5
|
|
|
+- be,pt %xcc, 4f
|
|
|
+- and %o1, 0xff, %o1
|
|
|
+- cmp %g5, 3
|
|
|
+- be,pn %xcc, 2f
|
|
|
+- stb %o1, [%o0 + 0x00]
|
|
|
+- cmp %g5, 2
|
|
|
+- be,pt %xcc, 2f
|
|
|
+- stb %o1, [%o0 + 0x01]
|
|
|
+- stb %o1, [%o0 + 0x02]
|
|
|
+-2: sub %g5, 4, %g5
|
|
|
+- sub %o0, %g5, %o0
|
|
|
+- add %o2, %g5, %o2
|
|
|
+-4: sllx %o1, 8, %g1
|
|
|
+- andcc %o0, 4, %g0
|
|
|
+- or %o1, %g1, %o1
|
|
|
+- sllx %o1, 16, %g1
|
|
|
+- or %o1, %g1, %o1
|
|
|
+- be,pt %xcc, 2f
|
|
|
+- sllx %o1, 32, %g1
|
|
|
+- stw %o1, [%o0]
|
|
|
+- sub %o2, 4, %o2
|
|
|
+- add %o0, 4, %o0
|
|
|
+-2: cmp %o2, 128
|
|
|
+- or %o1, %g1, %o1
|
|
|
+- blu,pn %xcc, 9f
|
|
|
+- andcc %o0, 0x38, %g5
|
|
|
+- be,pn %icc, 6f
|
|
|
+- mov 64, %o4
|
|
|
+- andcc %o0, 8, %g0
|
|
|
+- be,pn %icc, 1f
|
|
|
+- sub %o4, %g5, %o4
|
|
|
+- stx %o1, [%o0]
|
|
|
+- add %o0, 8, %o0
|
|
|
+-1: andcc %o4, 16, %g0
|
|
|
+- be,pn %icc, 1f
|
|
|
+- sub %o2, %o4, %o2
|
|
|
+- stx %o1, [%o0]
|
|
|
+- stx %o1, [%o0 + 8]
|
|
|
+- add %o0, 16, %o0
|
|
|
+-1: andcc %o4, 32, %g0
|
|
|
+- be,pn %icc, 7f
|
|
|
+- andncc %o2, 0x3f, %o3
|
|
|
+- stw %o1, [%o0]
|
|
|
+- stw %o1, [%o0 + 4]
|
|
|
+- stw %o1, [%o0 + 8]
|
|
|
+- stw %o1, [%o0 + 12]
|
|
|
+- stw %o1, [%o0 + 16]
|
|
|
+- stw %o1, [%o0 + 20]
|
|
|
+- stw %o1, [%o0 + 24]
|
|
|
+- stw %o1, [%o0 + 28]
|
|
|
+- add %o0, 32, %o0
|
|
|
+-7: be,pn %xcc, 9f
|
|
|
+- nop
|
|
|
+- ldd [%o0 - 8], %f0
|
|
|
+-18: wr %g0, ASI_BLK_P, %asi
|
|
|
+- membar #StoreStore | #LoadStore
|
|
|
+- andcc %o3, 0xc0, %g5
|
|
|
+- and %o2, 0x3f, %o2
|
|
|
+- fmovd %f0, %f2
|
|
|
+- fmovd %f0, %f4
|
|
|
+- andn %o3, 0xff, %o3
|
|
|
+- fmovd %f0, %f6
|
|
|
+- cmp %g5, 64
|
|
|
+- fmovd %f0, %f8
|
|
|
+- fmovd %f0, %f10
|
|
|
+- fmovd %f0, %f12
|
|
|
+- brz,pn %g5, 10f
|
|
|
+- fmovd %f0, %f14
|
|
|
+- be,pn %icc, 2f
|
|
|
+- stda %f0, [%o0 + 0x00] %asi
|
|
|
+- cmp %g5, 128
|
|
|
+- be,pn %icc, 2f
|
|
|
+- stda %f0, [%o0 + 0x40] %asi
|
|
|
+- stda %f0, [%o0 + 0x80] %asi
|
|
|
+-2: brz,pn %o3, 12f
|
|
|
+- add %o0, %g5, %o0
|
|
|
+-10: stda %f0, [%o0 + 0x00] %asi
|
|
|
+- stda %f0, [%o0 + 0x40] %asi
|
|
|
+- stda %f0, [%o0 + 0x80] %asi
|
|
|
+- stda %f0, [%o0 + 0xc0] %asi
|
|
|
+-11: subcc %o3, 256, %o3
|
|
|
+- bne,pt %xcc, 10b
|
|
|
+- add %o0, 256, %o0
|
|
|
+-12: wr %g0, FPRS_FEF, %fprs
|
|
|
+- membar #StoreLoad | #StoreStore
|
|
|
+-9: andcc %o2, 0x78, %g5
|
|
|
+- be,pn %xcc, 13f
|
|
|
+- andcc %o2, 7, %o2
|
|
|
+-14: rd %pc, %o4
|
|
|
+- srl %g5, 1, %o3
|
|
|
+- sub %o4, %o3, %o4
|
|
|
+- jmpl %o4 + (13f - 14b), %g0
|
|
|
+- add %o0, %g5, %o0
|
|
|
+-12: SET_BLOCKS (%o0, 0x68, %o1)
|
|
|
+- SET_BLOCKS (%o0, 0x48, %o1)
|
|
|
+- SET_BLOCKS (%o0, 0x28, %o1)
|
|
|
+- SET_BLOCKS (%o0, 0x08, %o1)
|
|
|
+-13: be,pn %xcc, 8f
|
|
|
+- andcc %o2, 4, %g0
|
|
|
+- be,pn %xcc, 1f
|
|
|
+- andcc %o2, 2, %g0
|
|
|
+- stw %o1, [%o0]
|
|
|
+- add %o0, 4, %o0
|
|
|
+-1: be,pn %xcc, 1f
|
|
|
+- andcc %o2, 1, %g0
|
|
|
+- sth %o1, [%o0]
|
|
|
+- add %o0, 2, %o0
|
|
|
+-1: bne,a,pn %xcc, 8f
|
|
|
+- stb %o1, [%o0]
|
|
|
+-8: retl
|
|
|
+- mov %o5, %o0
|
|
|
+-17: brz,pn %o2, 0f
|
|
|
+-8: add %o0, 1, %o0
|
|
|
+- subcc %o2, 1, %o2
|
|
|
+- bne,pt %xcc, 8b
|
|
|
+- stb %o1, [%o0 - 1]
|
|
|
+-0: retl
|
|
|
+- mov %o5, %o0
|
|
|
+-
|
|
|
+-6: stx %o1, [%o0]
|
|
|
+- andncc %o2, 0x3f, %o3
|
|
|
+- be,pn %xcc, 9b
|
|
|
+- nop
|
|
|
+- ba,pt %xcc, 18b
|
|
|
+- ldd [%o0], %f0
|
|
|
+-END(memset)
|
|
|
+-libc_hidden_def(memset)
|
|
|
+-
|
|
|
+-#define ZERO_BLOCKS(base, offset, source) \
|
|
|
+- stx source, [base - offset - 0x38]; \
|
|
|
+- stx source, [base - offset - 0x30]; \
|
|
|
+- stx source, [base - offset - 0x28]; \
|
|
|
+- stx source, [base - offset - 0x20]; \
|
|
|
+- stx source, [base - offset - 0x18]; \
|
|
|
+- stx source, [base - offset - 0x10]; \
|
|
|
+- stx source, [base - offset - 0x08]; \
|
|
|
+- stx source, [base - offset - 0x00];
|
|
|
+-
|
|
|
+- .text
|
|
|
+- .align 32
|
|
|
+-#ifdef __UCLIBC_SUSV3_LEGACY__
|
|
|
+-ENTRY(bzero)
|
|
|
+-#ifndef USE_BPR
|
|
|
+- srl %o1, 0, %o1
|
|
|
+-#endif
|
|
|
+- mov %o0, %o5
|
|
|
+-#endif
|
|
|
+-50: cmp %o1, 7
|
|
|
+- bleu,pn %xcc, 17f
|
|
|
+- andcc %o0, 3, %o2
|
|
|
+- be,a,pt %xcc, 4f
|
|
|
+- andcc %o0, 4, %g0
|
|
|
+- cmp %o2, 3
|
|
|
+- be,pn %xcc, 2f
|
|
|
+- stb %g0, [%o0 + 0x00]
|
|
|
+- cmp %o2, 2
|
|
|
+- be,pt %xcc, 2f
|
|
|
+- stb %g0, [%o0 + 0x01]
|
|
|
+- stb %g0, [%o0 + 0x02]
|
|
|
+-2: sub %o2, 4, %o2
|
|
|
+- sub %o0, %o2, %o0
|
|
|
+- add %o1, %o2, %o1
|
|
|
+- andcc %o0, 4, %g0
|
|
|
+-4: be,pt %xcc, 2f
|
|
|
+- cmp %o1, 128
|
|
|
+- stw %g0, [%o0]
|
|
|
+- sub %o1, 4, %o1
|
|
|
+- add %o0, 4, %o0
|
|
|
+-2: blu,pn %xcc, 9f
|
|
|
+- andcc %o0, 0x38, %o2
|
|
|
+- be,pn %icc, 6f
|
|
|
+- mov 64, %o4
|
|
|
+- andcc %o0, 8, %g0
|
|
|
+- be,pn %icc, 1f
|
|
|
+- sub %o4, %o2, %o4
|
|
|
+- stx %g0, [%o0]
|
|
|
+- add %o0, 8, %o0
|
|
|
+-1: andcc %o4, 16, %g0
|
|
|
+- be,pn %icc, 1f
|
|
|
+- sub %o1, %o4, %o1
|
|
|
+- stx %g0, [%o0]
|
|
|
+- stx %g0, [%o0 + 8]
|
|
|
+- add %o0, 16, %o0
|
|
|
+-1: andcc %o4, 32, %g0
|
|
|
+- be,pn %icc, 7f
|
|
|
+- andncc %o1, 0x3f, %o3
|
|
|
+- stx %g0, [%o0]
|
|
|
+- stx %g0, [%o0 + 8]
|
|
|
+- stx %g0, [%o0 + 16]
|
|
|
+- stx %g0, [%o0 + 24]
|
|
|
+- add %o0, 32, %o0
|
|
|
+-6: andncc %o1, 0x3f, %o3
|
|
|
+-7: be,pn %xcc, 9f
|
|
|
+- wr %g0, ASI_BLK_P, %asi
|
|
|
+- membar #StoreLoad | #StoreStore | #LoadStore
|
|
|
+- fzero %f0
|
|
|
+- andcc %o3, 0xc0, %o2
|
|
|
+- and %o1, 0x3f, %o1
|
|
|
+- fzero %f2
|
|
|
+- andn %o3, 0xff, %o3
|
|
|
+- faddd %f0, %f2, %f4
|
|
|
+- fmuld %f0, %f2, %f6
|
|
|
+- cmp %o2, 64
|
|
|
+- faddd %f0, %f2, %f8
|
|
|
+- fmuld %f0, %f2, %f10
|
|
|
+- faddd %f0, %f2, %f12
|
|
|
+- brz,pn %o2, 10f
|
|
|
+- fmuld %f0, %f2, %f14
|
|
|
+- be,pn %icc, 2f
|
|
|
+- stda %f0, [%o0 + 0x00] %asi
|
|
|
+- cmp %o2, 128
|
|
|
+- be,pn %icc, 2f
|
|
|
+- stda %f0, [%o0 + 0x40] %asi
|
|
|
+- stda %f0, [%o0 + 0x80] %asi
|
|
|
+-2: brz,pn %o3, 12f
|
|
|
+- add %o0, %o2, %o0
|
|
|
+-10: stda %f0, [%o0 + 0x00] %asi
|
|
|
+- stda %f0, [%o0 + 0x40] %asi
|
|
|
+- stda %f0, [%o0 + 0x80] %asi
|
|
|
+- stda %f0, [%o0 + 0xc0] %asi
|
|
|
+-11: subcc %o3, 256, %o3
|
|
|
+- bne,pt %xcc, 10b
|
|
|
+- add %o0, 256, %o0
|
|
|
+-12: wr %g0, FPRS_FEF, %fprs
|
|
|
+- membar #StoreLoad | #StoreStore
|
|
|
+-9: andcc %o1, 0xf8, %o2
|
|
|
+- be,pn %xcc, 13f
|
|
|
+- andcc %o1, 7, %o1
|
|
|
+-14: rd %pc, %o4
|
|
|
+- srl %o2, 1, %o3
|
|
|
+- sub %o4, %o3, %o4
|
|
|
+- jmpl %o4 + (13f - 14b), %g0
|
|
|
+- add %o0, %o2, %o0
|
|
|
+-12: ZERO_BLOCKS (%o0, 0xc8, %g0)
|
|
|
+- ZERO_BLOCKS (%o0, 0x88, %g0)
|
|
|
+- ZERO_BLOCKS (%o0, 0x48, %g0)
|
|
|
+- ZERO_BLOCKS (%o0, 0x08, %g0)
|
|
|
+-13: be,pn %xcc, 8f
|
|
|
+- andcc %o1, 4, %g0
|
|
|
+- be,pn %xcc, 1f
|
|
|
+- andcc %o1, 2, %g0
|
|
|
+- stw %g0, [%o0]
|
|
|
+- add %o0, 4, %o0
|
|
|
+-1: be,pn %xcc, 1f
|
|
|
+- andcc %o1, 1, %g0
|
|
|
+- sth %g0, [%o0]
|
|
|
+- add %o0, 2, %o0
|
|
|
+-1: bne,a,pn %xcc, 8f
|
|
|
+- stb %g0, [%o0]
|
|
|
+-8: retl
|
|
|
+- mov %o5, %o0
|
|
|
+-17: be,pn %xcc, 13b
|
|
|
+- orcc %o1, 0, %g0
|
|
|
+- be,pn %xcc, 0f
|
|
|
+-8: add %o0, 1, %o0
|
|
|
+- subcc %o1, 1, %o1
|
|
|
+- bne,pt %xcc, 8b
|
|
|
+- stb %g0, [%o0 - 1]
|
|
|
+-0: retl
|
|
|
+- mov %o5, %o0
|
|
|
+-#ifdef __UCLIBC_SUSV3_LEGACY__
|
|
|
+-END(bzero)
|
|
|
+-#endif
|
|
|
+diff --git a/libc/string/sparc/sparc64/sparcv9b/memcpy.S b/libc/string/sparc/sparc64/sparcv9b/memcpy.S
|
|
|
+deleted file mode 100644
|
|
|
+index 8bbdc84..0000000
|
|
|
+--- a/libc/string/sparc/sparc64/sparcv9b/memcpy.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,611 +0,0 @@
|
|
|
+-/* Copy SIZE bytes from SRC to DEST.
|
|
|
+- For UltraSPARC-III.
|
|
|
+- 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)
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <features.h>
|
|
|
+-
|
|
|
+-#define ASI_BLK_P 0xf0
|
|
|
+-#define FPRS_FEF 0x04
|
|
|
+-#define VISEntryHalf rd %fprs, %o5; wr %g0, FPRS_FEF, %fprs
|
|
|
+-#define VISExitHalf and %o5, FPRS_FEF, %o5; wr %o5, 0x0, %fprs
|
|
|
+-
|
|
|
+-#ifndef XCC
|
|
|
+-#define USE_BPR
|
|
|
+-#define XCC xcc
|
|
|
+-#endif
|
|
|
+-
|
|
|
+- .register %g2,#scratch
|
|
|
+- .register %g3,#scratch
|
|
|
+- .register %g6,#scratch
|
|
|
+-
|
|
|
+- .text
|
|
|
+- .align 32
|
|
|
+-
|
|
|
+-#ifdef __UCLIBC_SUSV3_LEGACY__
|
|
|
+-ENTRY(bcopy)
|
|
|
+- sub %o1, %o0, %o4
|
|
|
+- mov %o0, %g4
|
|
|
+- cmp %o4, %o2
|
|
|
+- mov %o1, %o0
|
|
|
+- bgeu,pt %XCC, 100f
|
|
|
+- mov %g4, %o1
|
|
|
+-#ifndef USE_BPR
|
|
|
+- srl %o2, 0, %o2
|
|
|
+-#endif
|
|
|
+- brnz,pn %o2, 220f
|
|
|
+- add %o0, %o2, %o0
|
|
|
+- retl
|
|
|
+- nop
|
|
|
+-END(bcopy)
|
|
|
+-#endif
|
|
|
+-
|
|
|
+- /* Special/non-trivial issues of this code:
|
|
|
+- *
|
|
|
+- * 1) %o5 is preserved from VISEntryHalf to VISExitHalf
|
|
|
+- * 2) Only low 32 FPU registers are used so that only the
|
|
|
+- * lower half of the FPU register set is dirtied by this
|
|
|
+- * code. This is especially important in the kernel.
|
|
|
+- * 3) This code never prefetches cachelines past the end
|
|
|
+- * of the source buffer.
|
|
|
+- *
|
|
|
+- * The cheetah's flexible spine, oversized liver, enlarged heart,
|
|
|
+- * slender muscular body, and claws make it the swiftest hunter
|
|
|
+- * in Africa and the fastest animal on land. Can reach speeds
|
|
|
+- * of up to 2.4GB per second.
|
|
|
+- */
|
|
|
+- .align 32
|
|
|
+-ENTRY(memcpy)
|
|
|
+-
|
|
|
+-100: /* %o0=dst, %o1=src, %o2=len */
|
|
|
+- mov %o0, %g5
|
|
|
+- cmp %o2, 0
|
|
|
+- be,pn %XCC, out
|
|
|
+-218: or %o0, %o1, %o3
|
|
|
+- cmp %o2, 16
|
|
|
+- bleu,a,pn %XCC, small_copy
|
|
|
+- or %o3, %o2, %o3
|
|
|
+-
|
|
|
+- cmp %o2, 256
|
|
|
+- blu,pt %XCC, medium_copy
|
|
|
+- andcc %o3, 0x7, %g0
|
|
|
+-
|
|
|
+- ba,pt %xcc, enter
|
|
|
+- andcc %o0, 0x3f, %g2
|
|
|
+-
|
|
|
+- /* Here len >= 256 and condition codes reflect execution
|
|
|
+- * of "andcc %o0, 0x7, %g2", done by caller.
|
|
|
+- */
|
|
|
+- .align 64
|
|
|
+-enter:
|
|
|
+- /* Is 'dst' already aligned on an 64-byte boundary? */
|
|
|
+- be,pt %XCC, 2f
|
|
|
+-
|
|
|
+- /* Compute abs((dst & 0x3f) - 0x40) into %g2. This is the number
|
|
|
+- * of bytes to copy to make 'dst' 64-byte aligned. We pre-
|
|
|
+- * subtract this from 'len'.
|
|
|
+- */
|
|
|
+- sub %g2, 0x40, %g2
|
|
|
+- sub %g0, %g2, %g2
|
|
|
+- sub %o2, %g2, %o2
|
|
|
+-
|
|
|
+- /* Copy %g2 bytes from src to dst, one byte at a time. */
|
|
|
+-1: ldub [%o1 + 0x00], %o3
|
|
|
+- add %o1, 0x1, %o1
|
|
|
+- add %o0, 0x1, %o0
|
|
|
+- subcc %g2, 0x1, %g2
|
|
|
+-
|
|
|
+- bg,pt %XCC, 1b
|
|
|
+- stb %o3, [%o0 + -1]
|
|
|
+-
|
|
|
+-2: VISEntryHalf
|
|
|
+- and %o1, 0x7, %g1
|
|
|
+- ba,pt %xcc, begin
|
|
|
+- alignaddr %o1, %g0, %o1
|
|
|
+-
|
|
|
+- .align 64
|
|
|
+-begin:
|
|
|
+- prefetch [%o1 + 0x000], #one_read
|
|
|
+- prefetch [%o1 + 0x040], #one_read
|
|
|
+- andn %o2, (0x40 - 1), %o4
|
|
|
+- prefetch [%o1 + 0x080], #one_read
|
|
|
+- prefetch [%o1 + 0x0c0], #one_read
|
|
|
+- ldd [%o1 + 0x000], %f0
|
|
|
+- prefetch [%o1 + 0x100], #one_read
|
|
|
+- ldd [%o1 + 0x008], %f2
|
|
|
+- prefetch [%o1 + 0x140], #one_read
|
|
|
+- ldd [%o1 + 0x010], %f4
|
|
|
+- prefetch [%o1 + 0x180], #one_read
|
|
|
+- faligndata %f0, %f2, %f16
|
|
|
+- ldd [%o1 + 0x018], %f6
|
|
|
+- faligndata %f2, %f4, %f18
|
|
|
+- ldd [%o1 + 0x020], %f8
|
|
|
+- faligndata %f4, %f6, %f20
|
|
|
+- ldd [%o1 + 0x028], %f10
|
|
|
+- faligndata %f6, %f8, %f22
|
|
|
+-
|
|
|
+- ldd [%o1 + 0x030], %f12
|
|
|
+- faligndata %f8, %f10, %f24
|
|
|
+- ldd [%o1 + 0x038], %f14
|
|
|
+- faligndata %f10, %f12, %f26
|
|
|
+- ldd [%o1 + 0x040], %f0
|
|
|
+-
|
|
|
+- sub %o4, 0x80, %o4
|
|
|
+- add %o1, 0x40, %o1
|
|
|
+- ba,pt %xcc, loop
|
|
|
+- srl %o4, 6, %o3
|
|
|
+-
|
|
|
+- .align 64
|
|
|
+-loop:
|
|
|
+- ldd [%o1 + 0x008], %f2
|
|
|
+- faligndata %f12, %f14, %f28
|
|
|
+- ldd [%o1 + 0x010], %f4
|
|
|
+- faligndata %f14, %f0, %f30
|
|
|
+- stda %f16, [%o0] ASI_BLK_P
|
|
|
+- ldd [%o1 + 0x018], %f6
|
|
|
+- faligndata %f0, %f2, %f16
|
|
|
+-
|
|
|
+- ldd [%o1 + 0x020], %f8
|
|
|
+- faligndata %f2, %f4, %f18
|
|
|
+- ldd [%o1 + 0x028], %f10
|
|
|
+- faligndata %f4, %f6, %f20
|
|
|
+- ldd [%o1 + 0x030], %f12
|
|
|
+- faligndata %f6, %f8, %f22
|
|
|
+- ldd [%o1 + 0x038], %f14
|
|
|
+- faligndata %f8, %f10, %f24
|
|
|
+-
|
|
|
+- ldd [%o1 + 0x040], %f0
|
|
|
+- prefetch [%o1 + 0x180], #one_read
|
|
|
+- faligndata %f10, %f12, %f26
|
|
|
+- subcc %o3, 0x01, %o3
|
|
|
+- add %o1, 0x40, %o1
|
|
|
+- bg,pt %XCC, loop
|
|
|
+- add %o0, 0x40, %o0
|
|
|
+-
|
|
|
+- /* Finally we copy the last full 64-byte block. */
|
|
|
+-loopfini:
|
|
|
+- ldd [%o1 + 0x008], %f2
|
|
|
+- faligndata %f12, %f14, %f28
|
|
|
+- ldd [%o1 + 0x010], %f4
|
|
|
+- faligndata %f14, %f0, %f30
|
|
|
+- stda %f16, [%o0] ASI_BLK_P
|
|
|
+- ldd [%o1 + 0x018], %f6
|
|
|
+- faligndata %f0, %f2, %f16
|
|
|
+- ldd [%o1 + 0x020], %f8
|
|
|
+- faligndata %f2, %f4, %f18
|
|
|
+- ldd [%o1 + 0x028], %f10
|
|
|
+- faligndata %f4, %f6, %f20
|
|
|
+- ldd [%o1 + 0x030], %f12
|
|
|
+- faligndata %f6, %f8, %f22
|
|
|
+- ldd [%o1 + 0x038], %f14
|
|
|
+- faligndata %f8, %f10, %f24
|
|
|
+- cmp %g1, 0
|
|
|
+- be,pt %XCC, 1f
|
|
|
+- add %o0, 0x40, %o0
|
|
|
+- ldd [%o1 + 0x040], %f0
|
|
|
+-1: faligndata %f10, %f12, %f26
|
|
|
+- faligndata %f12, %f14, %f28
|
|
|
+- faligndata %f14, %f0, %f30
|
|
|
+- stda %f16, [%o0] ASI_BLK_P
|
|
|
+- add %o0, 0x40, %o0
|
|
|
+- add %o1, 0x40, %o1
|
|
|
+- membar #Sync
|
|
|
+-
|
|
|
+- /* Now we copy the (len modulo 64) bytes at the end.
|
|
|
+- * Note how we borrow the %f0 loaded above.
|
|
|
+- *
|
|
|
+- * Also notice how this code is careful not to perform a
|
|
|
+- * load past the end of the src buffer.
|
|
|
+- */
|
|
|
+-loopend:
|
|
|
+- and %o2, 0x3f, %o2
|
|
|
+- andcc %o2, 0x38, %g2
|
|
|
+- be,pn %XCC, endcruft
|
|
|
+- subcc %g2, 0x8, %g2
|
|
|
+- be,pn %XCC, endcruft
|
|
|
+- cmp %g1, 0
|
|
|
+-
|
|
|
+- be,a,pt %XCC, 1f
|
|
|
+- ldd [%o1 + 0x00], %f0
|
|
|
+-
|
|
|
+-1: ldd [%o1 + 0x08], %f2
|
|
|
+- add %o1, 0x8, %o1
|
|
|
+- sub %o2, 0x8, %o2
|
|
|
+- subcc %g2, 0x8, %g2
|
|
|
+- faligndata %f0, %f2, %f8
|
|
|
+- std %f8, [%o0 + 0x00]
|
|
|
+- be,pn %XCC, endcruft
|
|
|
+- add %o0, 0x8, %o0
|
|
|
+- ldd [%o1 + 0x08], %f0
|
|
|
+- add %o1, 0x8, %o1
|
|
|
+- sub %o2, 0x8, %o2
|
|
|
+- subcc %g2, 0x8, %g2
|
|
|
+- faligndata %f2, %f0, %f8
|
|
|
+- std %f8, [%o0 + 0x00]
|
|
|
+- bne,pn %XCC, 1b
|
|
|
+- add %o0, 0x8, %o0
|
|
|
+-
|
|
|
+- /* If anything is left, we copy it one byte at a time.
|
|
|
+- * Note that %g1 is (src & 0x3) saved above before the
|
|
|
+- * alignaddr was performed.
|
|
|
+- */
|
|
|
+-endcruft:
|
|
|
+- cmp %o2, 0
|
|
|
+- add %o1, %g1, %o1
|
|
|
+- VISExitHalf
|
|
|
+- be,pn %XCC, out
|
|
|
+- sub %o0, %o1, %o3
|
|
|
+-
|
|
|
+- andcc %g1, 0x7, %g0
|
|
|
+- bne,pn %icc, small_copy_unaligned
|
|
|
+- andcc %o2, 0x8, %g0
|
|
|
+- be,pt %icc, 1f
|
|
|
+- nop
|
|
|
+- ldx [%o1], %o5
|
|
|
+- stx %o5, [%o1 + %o3]
|
|
|
+- add %o1, 0x8, %o1
|
|
|
+-
|
|
|
+-1: andcc %o2, 0x4, %g0
|
|
|
+- be,pt %icc, 1f
|
|
|
+- nop
|
|
|
+- lduw [%o1], %o5
|
|
|
+- stw %o5, [%o1 + %o3]
|
|
|
+- add %o1, 0x4, %o1
|
|
|
+-
|
|
|
+-1: andcc %o2, 0x2, %g0
|
|
|
+- be,pt %icc, 1f
|
|
|
+- nop
|
|
|
+- lduh [%o1], %o5
|
|
|
+- sth %o5, [%o1 + %o3]
|
|
|
+- add %o1, 0x2, %o1
|
|
|
+-
|
|
|
+-1: andcc %o2, 0x1, %g0
|
|
|
+- be,pt %icc, out
|
|
|
+- nop
|
|
|
+- ldub [%o1], %o5
|
|
|
+- ba,pt %xcc, out
|
|
|
+- stb %o5, [%o1 + %o3]
|
|
|
+-
|
|
|
+-medium_copy: /* 16 < len <= 64 */
|
|
|
+- bne,pn %XCC, small_copy_unaligned
|
|
|
+- sub %o0, %o1, %o3
|
|
|
+-
|
|
|
+-medium_copy_aligned:
|
|
|
+- andn %o2, 0x7, %o4
|
|
|
+- and %o2, 0x7, %o2
|
|
|
+-1: subcc %o4, 0x8, %o4
|
|
|
+- ldx [%o1], %o5
|
|
|
+- stx %o5, [%o1 + %o3]
|
|
|
+- bgu,pt %XCC, 1b
|
|
|
+- add %o1, 0x8, %o1
|
|
|
+- andcc %o2, 0x4, %g0
|
|
|
+- be,pt %XCC, 1f
|
|
|
+- nop
|
|
|
+- sub %o2, 0x4, %o2
|
|
|
+- lduw [%o1], %o5
|
|
|
+- stw %o5, [%o1 + %o3]
|
|
|
+- add %o1, 0x4, %o1
|
|
|
+-1: cmp %o2, 0
|
|
|
+- be,pt %XCC, out
|
|
|
+- nop
|
|
|
+- ba,pt %xcc, small_copy_unaligned
|
|
|
+- nop
|
|
|
+-
|
|
|
+-small_copy: /* 0 < len <= 16 */
|
|
|
+- andcc %o3, 0x3, %g0
|
|
|
+- bne,pn %XCC, small_copy_unaligned
|
|
|
+- sub %o0, %o1, %o3
|
|
|
+-
|
|
|
+-small_copy_aligned:
|
|
|
+- subcc %o2, 4, %o2
|
|
|
+- lduw [%o1], %g1
|
|
|
+- stw %g1, [%o1 + %o3]
|
|
|
+- bgu,pt %XCC, small_copy_aligned
|
|
|
+- add %o1, 4, %o1
|
|
|
+-
|
|
|
+-out: retl
|
|
|
+- mov %g5, %o0
|
|
|
+-
|
|
|
+- .align 32
|
|
|
+-small_copy_unaligned:
|
|
|
+- subcc %o2, 1, %o2
|
|
|
+- ldub [%o1], %g1
|
|
|
+- stb %g1, [%o1 + %o3]
|
|
|
+- bgu,pt %XCC, small_copy_unaligned
|
|
|
+- add %o1, 1, %o1
|
|
|
+- retl
|
|
|
+- mov %g5, %o0
|
|
|
+-
|
|
|
+-END(memcpy)
|
|
|
+-libc_hidden_def(memcpy)
|
|
|
+-
|
|
|
+-#define RMOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3) \
|
|
|
+- ldx [%src - offset - 0x20], %t0; \
|
|
|
+- ldx [%src - offset - 0x18], %t1; \
|
|
|
+- ldx [%src - offset - 0x10], %t2; \
|
|
|
+- ldx [%src - offset - 0x08], %t3; \
|
|
|
+- stw %t0, [%dst - offset - 0x1c]; \
|
|
|
+- srlx %t0, 32, %t0; \
|
|
|
+- stw %t0, [%dst - offset - 0x20]; \
|
|
|
+- stw %t1, [%dst - offset - 0x14]; \
|
|
|
+- srlx %t1, 32, %t1; \
|
|
|
+- stw %t1, [%dst - offset - 0x18]; \
|
|
|
+- stw %t2, [%dst - offset - 0x0c]; \
|
|
|
+- srlx %t2, 32, %t2; \
|
|
|
+- stw %t2, [%dst - offset - 0x10]; \
|
|
|
+- stw %t3, [%dst - offset - 0x04]; \
|
|
|
+- srlx %t3, 32, %t3; \
|
|
|
+- stw %t3, [%dst - offset - 0x08];
|
|
|
+-
|
|
|
+-#define RMOVE_BIGALIGNCHUNK(src, dst, offset, t0, t1, t2, t3) \
|
|
|
+- ldx [%src - offset - 0x20], %t0; \
|
|
|
+- ldx [%src - offset - 0x18], %t1; \
|
|
|
+- ldx [%src - offset - 0x10], %t2; \
|
|
|
+- ldx [%src - offset - 0x08], %t3; \
|
|
|
+- stx %t0, [%dst - offset - 0x20]; \
|
|
|
+- stx %t1, [%dst - offset - 0x18]; \
|
|
|
+- stx %t2, [%dst - offset - 0x10]; \
|
|
|
+- stx %t3, [%dst - offset - 0x08]; \
|
|
|
+- ldx [%src - offset - 0x40], %t0; \
|
|
|
+- ldx [%src - offset - 0x38], %t1; \
|
|
|
+- ldx [%src - offset - 0x30], %t2; \
|
|
|
+- ldx [%src - offset - 0x28], %t3; \
|
|
|
+- stx %t0, [%dst - offset - 0x40]; \
|
|
|
+- stx %t1, [%dst - offset - 0x38]; \
|
|
|
+- stx %t2, [%dst - offset - 0x30]; \
|
|
|
+- stx %t3, [%dst - offset - 0x28];
|
|
|
+-
|
|
|
+-#define RMOVE_LASTCHUNK(src, dst, offset, t0, t1, t2, t3) \
|
|
|
+- ldx [%src + offset + 0x00], %t0; \
|
|
|
+- ldx [%src + offset + 0x08], %t1; \
|
|
|
+- stw %t0, [%dst + offset + 0x04]; \
|
|
|
+- srlx %t0, 32, %t2; \
|
|
|
+- stw %t2, [%dst + offset + 0x00]; \
|
|
|
+- stw %t1, [%dst + offset + 0x0c]; \
|
|
|
+- srlx %t1, 32, %t3; \
|
|
|
+- stw %t3, [%dst + offset + 0x08];
|
|
|
+-
|
|
|
+-#define RMOVE_LASTALIGNCHUNK(src, dst, offset, t0, t1) \
|
|
|
+- ldx [%src + offset + 0x00], %t0; \
|
|
|
+- ldx [%src + offset + 0x08], %t1; \
|
|
|
+- stx %t0, [%dst + offset + 0x00]; \
|
|
|
+- stx %t1, [%dst + offset + 0x08];
|
|
|
+-
|
|
|
+- .align 32
|
|
|
+-228: andcc %o2, 1, %g0 /* IEU1 Group */
|
|
|
+- be,pt %icc, 2f+4 /* CTI */
|
|
|
+-1: ldub [%o1 - 1], %o5 /* LOAD Group */
|
|
|
+- sub %o1, 1, %o1 /* IEU0 */
|
|
|
+- sub %o0, 1, %o0 /* IEU1 */
|
|
|
+- subcc %o2, 1, %o2 /* IEU1 Group */
|
|
|
+- be,pn %xcc, 229f /* CTI */
|
|
|
+- stb %o5, [%o0] /* Store */
|
|
|
+-2: ldub [%o1 - 1], %o5 /* LOAD Group */
|
|
|
+- sub %o0, 2, %o0 /* IEU0 */
|
|
|
+- ldub [%o1 - 2], %g5 /* LOAD Group */
|
|
|
+- sub %o1, 2, %o1 /* IEU0 */
|
|
|
+- subcc %o2, 2, %o2 /* IEU1 Group */
|
|
|
+- stb %o5, [%o0 + 1] /* Store */
|
|
|
+- bne,pt %xcc, 2b /* CTI */
|
|
|
+- stb %g5, [%o0] /* Store */
|
|
|
+-229: retl
|
|
|
+- mov %g4, %o0
|
|
|
+-
|
|
|
+- .align 32
|
|
|
+-ENTRY(memmove)
|
|
|
+- mov %o0, %g5
|
|
|
+-#ifndef USE_BPR
|
|
|
+- srl %o2, 0, %o2 /* IEU1 Group */
|
|
|
+-#endif
|
|
|
+- brz,pn %o2, out /* CTI Group */
|
|
|
+- sub %o0, %o1, %o4 /* IEU0 */
|
|
|
+- cmp %o4, %o2 /* IEU1 Group */
|
|
|
+- bgeu,pt %XCC, 218b /* CTI */
|
|
|
+- mov %o0, %g4 /* IEU0 */
|
|
|
+- add %o0, %o2, %o0 /* IEU0 Group */
|
|
|
+-220: add %o1, %o2, %o1 /* IEU1 */
|
|
|
+- cmp %o2, 15 /* IEU1 Group */
|
|
|
+- bleu,pn %xcc, 228b /* CTI */
|
|
|
+- andcc %o0, 7, %g2 /* IEU1 Group */
|
|
|
+- sub %o0, %o1, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 3, %o5 /* IEU1 Group */
|
|
|
+- bne,pn %xcc, 232f /* CTI */
|
|
|
+- andcc %o1, 3, %g0 /* IEU1 Group */
|
|
|
+- be,a,pt %xcc, 236f /* CTI */
|
|
|
+- andcc %o1, 4, %g0 /* IEU1 Group */
|
|
|
+- andcc %o1, 1, %g0 /* IEU1 Group */
|
|
|
+- be,pn %xcc, 4f /* CTI */
|
|
|
+- andcc %o1, 2, %g0 /* IEU1 Group */
|
|
|
+- ldub [%o1 - 1], %g2 /* Load Group */
|
|
|
+- sub %o1, 1, %o1 /* IEU0 */
|
|
|
+- sub %o0, 1, %o0 /* IEU1 */
|
|
|
+- sub %o2, 1, %o2 /* IEU0 Group */
|
|
|
+- be,pn %xcc, 5f /* CTI Group */
|
|
|
+- stb %g2, [%o0] /* Store */
|
|
|
+-4: lduh [%o1 - 2], %g2 /* Load Group */
|
|
|
+- sub %o1, 2, %o1 /* IEU0 */
|
|
|
+- sub %o0, 2, %o0 /* IEU1 */
|
|
|
+- sub %o2, 2, %o2 /* IEU0 */
|
|
|
+- sth %g2, [%o0] /* Store Group + bubble */
|
|
|
+-5: andcc %o1, 4, %g0 /* IEU1 */
|
|
|
+-236: be,a,pn %xcc, 2f /* CTI */
|
|
|
+- 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, %g6 /* IEU1 Group */
|
|
|
+-2: be,pn %xcc, 235f /* CTI */
|
|
|
+- andcc %o0, 4, %g0 /* IEU1 Group */
|
|
|
+- be,pn %xcc, 282f + 4 /* CTI Group */
|
|
|
+-5: RMOVE_BIGCHUNK(o1, o0, 0x00, g1, g3, g5, o5)
|
|
|
+- 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 %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, %g6 /* IEU1 Group */
|
|
|
+-41: be,pn %xcc, 280f /* CTI */
|
|
|
+- andcc %o2, 8, %g0 /* IEU1 Group */
|
|
|
+- /* Clk1 8-( */
|
|
|
+- /* Clk2 8-( */
|
|
|
+- /* Clk3 8-( */
|
|
|
+- /* Clk4 8-( */
|
|
|
+-279: rd %pc, %o5 /* PDU Group */
|
|
|
+- 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, %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)
|
|
|
+- RMOVE_LASTCHUNK(o1, o0, 0x30, g2, g3, g5, o5)
|
|
|
+- RMOVE_LASTCHUNK(o1, o0, 0x20, g2, g3, g5, o5)
|
|
|
+- RMOVE_LASTCHUNK(o1, o0, 0x10, g2, g3, g5, o5)
|
|
|
+- RMOVE_LASTCHUNK(o1, o0, 0x00, g2, g3, g5, o5)
|
|
|
+-280: be,pt %xcc, 281f /* CTI */
|
|
|
+- andcc %o2, 4, %g0 /* IEU1 */
|
|
|
+- ldx [%o1 - 8], %g2 /* Load Group */
|
|
|
+- sub %o0, 8, %o0 /* IEU0 */
|
|
|
+- stw %g2, [%o0 + 4] /* Store Group */
|
|
|
+- sub %o1, 8, %o1 /* IEU1 */
|
|
|
+- srlx %g2, 32, %g2 /* IEU0 Group */
|
|
|
+- stw %g2, [%o0] /* Store */
|
|
|
+-281: be,pt %xcc, 1f /* CTI */
|
|
|
+- andcc %o2, 2, %g0 /* IEU1 Group */
|
|
|
+- lduw [%o1 - 4], %g2 /* Load Group */
|
|
|
+- sub %o1, 4, %o1 /* IEU0 */
|
|
|
+- stw %g2, [%o0 - 4] /* Store Group */
|
|
|
+- sub %o0, 4, %o0 /* IEU0 */
|
|
|
+-1: be,pt %xcc, 1f /* CTI */
|
|
|
+- andcc %o2, 1, %g0 /* IEU1 Group */
|
|
|
+- lduh [%o1 - 2], %g2 /* Load Group */
|
|
|
+- sub %o1, 2, %o1 /* IEU0 */
|
|
|
+- sth %g2, [%o0 - 2] /* Store Group */
|
|
|
+- sub %o0, 2, %o0 /* IEU0 */
|
|
|
+-1: be,pt %xcc, 211f /* CTI */
|
|
|
+- nop /* IEU1 */
|
|
|
+- ldub [%o1 - 1], %g2 /* Load Group */
|
|
|
+- stb %g2, [%o0 - 1] /* Store Group + bubble */
|
|
|
+-211: retl
|
|
|
+- mov %g4, %o0
|
|
|
+-
|
|
|
+-282: RMOVE_BIGALIGNCHUNK(o1, o0, 0x00, g1, g3, g5, o5)
|
|
|
+- RMOVE_BIGALIGNCHUNK(o1, o0, 0x40, g1, g3, g5, o5)
|
|
|
+- 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, %g6 /* IEU1 */
|
|
|
+- be,pn %xcc, 284f /* CTI */
|
|
|
+- andcc %o2, 8, %g0 /* IEU1 Group */
|
|
|
+- /* Clk1 8-( */
|
|
|
+- /* Clk2 8-( */
|
|
|
+- /* Clk3 8-( */
|
|
|
+- /* Clk4 8-( */
|
|
|
+-283: rd %pc, %o5 /* PDU Group */
|
|
|
+- sub %o1, %g6, %o1 /* IEU0 Group */
|
|
|
+- sub %o5, %g6, %o5 /* IEU1 */
|
|
|
+- jmpl %o5 + %lo(284f - 283b), %g0 /* CTI Group brk forced*/
|
|
|
+- 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)
|
|
|
+- RMOVE_LASTALIGNCHUNK(o1, o0, 0x30, g2, g3)
|
|
|
+- RMOVE_LASTALIGNCHUNK(o1, o0, 0x20, g2, g3)
|
|
|
+- RMOVE_LASTALIGNCHUNK(o1, o0, 0x10, g2, g3)
|
|
|
+- RMOVE_LASTALIGNCHUNK(o1, o0, 0x00, g2, g3)
|
|
|
+-284: be,pt %xcc, 285f /* CTI Group */
|
|
|
+- andcc %o2, 4, %g0 /* IEU1 */
|
|
|
+- ldx [%o1 - 8], %g2 /* Load Group */
|
|
|
+- sub %o0, 8, %o0 /* IEU0 */
|
|
|
+- sub %o1, 8, %o1 /* IEU0 Group */
|
|
|
+- stx %g2, [%o0] /* Store */
|
|
|
+-285: be,pt %xcc, 1f /* CTI */
|
|
|
+- andcc %o2, 2, %g0 /* IEU1 Group */
|
|
|
+- lduw [%o1 - 4], %g2 /* Load Group */
|
|
|
+- sub %o0, 4, %o0 /* IEU0 */
|
|
|
+- sub %o1, 4, %o1 /* IEU0 Group */
|
|
|
+- stw %g2, [%o0] /* Store */
|
|
|
+-1: be,pt %xcc, 1f /* CTI */
|
|
|
+- andcc %o2, 1, %g0 /* IEU1 Group */
|
|
|
+- lduh [%o1 - 2], %g2 /* Load Group */
|
|
|
+- sub %o0, 2, %o0 /* IEU0 */
|
|
|
+- sub %o1, 2, %o1 /* IEU0 Group */
|
|
|
+- sth %g2, [%o0] /* Store */
|
|
|
+-1: be,pt %xcc, 1f /* CTI */
|
|
|
+- nop /* IEU0 Group */
|
|
|
+- ldub [%o1 - 1], %g2 /* Load Group */
|
|
|
+- stb %g2, [%o0 - 1] /* Store Group + bubble */
|
|
|
+-1: retl
|
|
|
+- mov %g4, %o0
|
|
|
+-
|
|
|
+-232: brz,pt %g2, 2f /* CTI Group */
|
|
|
+- sub %o2, %g2, %o2 /* IEU0 Group */
|
|
|
+-1: ldub [%o1 - 1], %g5 /* Load Group */
|
|
|
+- sub %o1, 1, %o1 /* IEU0 */
|
|
|
+- sub %o0, 1, %o0 /* IEU1 */
|
|
|
+- subcc %g2, 1, %g2 /* IEU1 Group */
|
|
|
+- bne,pt %xcc, 1b /* CTI */
|
|
|
+- stb %g5, [%o0] /* Store */
|
|
|
+-2: andn %o2, 7, %g5 /* IEU0 Group */
|
|
|
+- and %o2, 7, %o2 /* IEU1 */
|
|
|
+- fmovd %f0, %f2 /* FPU */
|
|
|
+- alignaddr %o1, %g0, %g1 /* GRU Group */
|
|
|
+- ldd [%g1], %f4 /* Load Group */
|
|
|
+-1: ldd [%g1 - 8], %f6 /* Load Group */
|
|
|
+- sub %g1, 8, %g1 /* IEU0 Group */
|
|
|
+- subcc %g5, 8, %g5 /* IEU1 */
|
|
|
+- faligndata %f6, %f4, %f0 /* GRU Group */
|
|
|
+- std %f0, [%o0 - 8] /* Store */
|
|
|
+- sub %o1, 8, %o1 /* IEU0 Group */
|
|
|
+- be,pn %xcc, 233f /* CTI */
|
|
|
+- sub %o0, 8, %o0 /* IEU1 */
|
|
|
+- ldd [%g1 - 8], %f4 /* Load Group */
|
|
|
+- sub %g1, 8, %g1 /* IEU0 */
|
|
|
+- subcc %g5, 8, %g5 /* IEU1 */
|
|
|
+- faligndata %f4, %f6, %f0 /* GRU Group */
|
|
|
+- std %f0, [%o0 - 8] /* Store */
|
|
|
+- sub %o1, 8, %o1 /* IEU0 */
|
|
|
+- bne,pn %xcc, 1b /* CTI Group */
|
|
|
+- sub %o0, 8, %o0 /* IEU0 */
|
|
|
+-233: brz,pn %o2, 234f /* CTI Group */
|
|
|
+- nop /* IEU0 */
|
|
|
+-237: ldub [%o1 - 1], %g5 /* LOAD */
|
|
|
+- sub %o1, 1, %o1 /* IEU0 */
|
|
|
+- sub %o0, 1, %o0 /* IEU1 */
|
|
|
+- subcc %o2, 1, %o2 /* IEU1 */
|
|
|
+- bne,pt %xcc, 237b /* CTI */
|
|
|
+- stb %g5, [%o0] /* Store Group */
|
|
|
+-234: wr %g0, FPRS_FEF, %fprs
|
|
|
+- retl
|
|
|
+- mov %g4, %o0
|
|
|
+-END(memmove)
|
|
|
+-libc_hidden_def(memmove)
|
|
|
+-
|
|
|
+-#ifdef USE_BPR
|
|
|
+-weak_alias(memcpy,__align_cpy_1)
|
|
|
+-weak_alias(memcpy,__align_cpy_2)
|
|
|
+-weak_alias(memcpy,__align_cpy_4)
|
|
|
+-weak_alias(memcpy,__align_cpy_8)
|
|
|
+-weak_alias(memcpy,__align_cpy_16)
|
|
|
+-#endif
|
|
|
+diff --git a/libc/string/sparc/sparc64/stpcpy.S b/libc/string/sparc/sparc64/stpcpy.S
|
|
|
+deleted file mode 100644
|
|
|
+index 9af0d56..0000000
|
|
|
+--- a/libc/string/sparc/sparc64/stpcpy.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,270 +0,0 @@
|
|
|
+-/* Copy SRC to DEST returning the address of the terminating '\0' in DEST.
|
|
|
+- For SPARC v9.
|
|
|
+- Copyright (C) 1998, 1999, 2002, 2003, 2004 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>.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <asm/asi.h>
|
|
|
+-#ifndef XCC
|
|
|
+- .register %g2, #scratch
|
|
|
+- .register %g3, #scratch
|
|
|
+- .register %g6, #scratch
|
|
|
+-#endif
|
|
|
+-
|
|
|
+- /* Normally, this uses
|
|
|
+- ((xword - 0x0101010101010101) & 0x8080808080808080) test
|
|
|
+- to find out if any byte in xword could be zero. This is fast, but
|
|
|
+- also gives false alarm for any byte in range 0x81-0xff. It does
|
|
|
+- not matter for correctness, as if this test tells us there could
|
|
|
+- be some zero byte, we check it byte by byte, but if bytes with
|
|
|
+- high bits set are common in the strings, then this will give poor
|
|
|
+- performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
|
|
+- will use one tick slower, but more precise test
|
|
|
+- ((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
|
|
|
+- which does not give any false alarms (but if some bits are set,
|
|
|
+- one cannot assume from it which bytes are zero and which are not).
|
|
|
+- It is yet to be measured, what is the correct default for glibc
|
|
|
+- in these days for an average user.
|
|
|
+- */
|
|
|
+-
|
|
|
+- .text
|
|
|
+- .align 32
|
|
|
+-ENTRY(stpcpy)
|
|
|
+- sethi %hi(0x01010101), %g1 /* IEU0 Group */
|
|
|
+- or %g1, %lo(0x01010101), %g1 /* IEU0 Group */
|
|
|
+- andcc %o0, 7, %g0 /* IEU1 */
|
|
|
+- sllx %g1, 32, %g2 /* IEU0 Group */
|
|
|
+-
|
|
|
+- bne,pn %icc, 12f /* CTI */
|
|
|
+- andcc %o1, 7, %g3 /* IEU1 */
|
|
|
+- or %g1, %g2, %g1 /* IEU0 Group */
|
|
|
+- bne,pn %icc, 14f /* CTI */
|
|
|
+-
|
|
|
+- sllx %g1, 7, %g2 /* IEU0 Group */
|
|
|
+-1: ldx [%o1], %o3 /* Load */
|
|
|
+- add %o1, 8, %o1 /* IEU1 */
|
|
|
+-2: mov %o3, %g3 /* IEU0 Group */
|
|
|
+-
|
|
|
+- sub %o3, %g1, %o2 /* IEU1 */
|
|
|
+-3: ldxa [%o1] ASI_PNF, %o3 /* Load */
|
|
|
+-#ifdef EIGHTBIT_NOT_RARE
|
|
|
+- andn %o2, %g3, %o2 /* IEU0 Group */
|
|
|
+-#endif
|
|
|
+- add %o0, 8, %o0 /* IEU0 Group */
|
|
|
+- andcc %o2, %g2, %g0 /* IEU1 */
|
|
|
+-
|
|
|
+- add %o1, 8, %o1 /* IEU0 Group */
|
|
|
+- be,a,pt %xcc, 2b /* CTI */
|
|
|
+- stx %g3, [%o0 - 8] /* Store */
|
|
|
+- srlx %g3, 56, %g5 /* IEU0 Group */
|
|
|
+-
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 11f /* CTI */
|
|
|
+- srlx %g3, 48, %g4 /* IEU0 */
|
|
|
+- andcc %g4, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 10f /* CTI */
|
|
|
+- srlx %g3, 40, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 9f /* CTI */
|
|
|
+-
|
|
|
+- srlx %g3, 32, %g4 /* IEU0 */
|
|
|
+- andcc %g4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 8f /* CTI */
|
|
|
+- srlx %g3, 24, %g5 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 7f /* CTI */
|
|
|
+- srlx %g3, 16, %g4 /* IEU0 */
|
|
|
+- andcc %g4, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 6f /* CTI */
|
|
|
+- srlx %g3, 8, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 5f /* CTI */
|
|
|
+-
|
|
|
+- sub %o3, %g1, %o2 /* IEU0 */
|
|
|
+- stx %g3, [%o0 - 8] /* Store Group */
|
|
|
+- andcc %g3, 0xff, %g0 /* IEU1 */
|
|
|
+- bne,pt %icc, 3b /* CTI */
|
|
|
+-
|
|
|
+- mov %o3, %g3 /* IEU0 Group */
|
|
|
+-4: retl /* CTI+IEU1 Group */
|
|
|
+- sub %o0, 1, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+- .align 16
|
|
|
+-6: ba,pt %xcc, 23f /* CTI Group */
|
|
|
+- sub %o0, 3, %g6 /* IEU0 */
|
|
|
+-5: sub %o0, 2, %g6 /* IEU0 Group */
|
|
|
+- stb %g5, [%o0 - 2] /* Store */
|
|
|
+-
|
|
|
+- srlx %g3, 16, %g4 /* IEU0 Group */
|
|
|
+-23: sth %g4, [%o0 - 4] /* Store */
|
|
|
+- srlx %g3, 32, %g4 /* IEU0 Group */
|
|
|
+- stw %g4, [%o0 - 8] /* Store */
|
|
|
+-
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+- mov %g6, %o0 /* IEU0 */
|
|
|
+-8: ba,pt %xcc, 24f /* CTI Group */
|
|
|
+- sub %o0, 5, %g6 /* IEU0 */
|
|
|
+-
|
|
|
+-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 %g6, %o0 /* IEU0 */
|
|
|
+-10: ba,pt %xcc, 25f /* CTI Group */
|
|
|
+- sub %o0, 7, %g6 /* IEU0 */
|
|
|
+-
|
|
|
+-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 %g6, %o0 /* IEU0 */
|
|
|
+-11: stb %g5, [%o0 - 8] /* Store Group */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+-
|
|
|
+- sub %o0, 8, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+- .align 16
|
|
|
+-12: or %g1, %g2, %g1 /* IEU0 Group */
|
|
|
+- ldub [%o1], %o3 /* Load */
|
|
|
+- sllx %g1, 7, %g2 /* IEU0 Group */
|
|
|
+- stb %o3, [%o0] /* Store Group */
|
|
|
+-
|
|
|
+-13: add %o0, 1, %o0 /* IEU0 */
|
|
|
+- add %o1, 1, %o1 /* IEU1 */
|
|
|
+- andcc %o3, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 4b /* CTI */
|
|
|
+-
|
|
|
+- lduba [%o1] ASI_PNF, %o3 /* Load */
|
|
|
+- andcc %o0, 7, %g0 /* IEU1 Group */
|
|
|
+- bne,a,pt %icc, 13b /* CTI */
|
|
|
+- stb %o3, [%o0] /* Store */
|
|
|
+-
|
|
|
+- andcc %o1, 7, %g3 /* IEU1 Group */
|
|
|
+- be,a,pt %icc, 1b /* CTI */
|
|
|
+- ldx [%o1], %o3 /* Load */
|
|
|
+-14: orcc %g0, 64, %g4 /* IEU1 Group */
|
|
|
+-
|
|
|
+- sllx %g3, 3, %g5 /* IEU0 */
|
|
|
+- sub %o1, %g3, %o1 /* IEU0 Group */
|
|
|
+- sub %g4, %g5, %g4 /* IEU1 */
|
|
|
+- /* %g1 = 0101010101010101 *
|
|
|
+- * %g2 = 8080808080808080 *
|
|
|
+- * %g3 = source alignment *
|
|
|
+- * %g5 = number of bits to shift left *
|
|
|
+- * %g4 = number of bits to shift right */
|
|
|
+- ldxa [%o1] ASI_PNF, %o5 /* Load Group */
|
|
|
+-
|
|
|
+- addcc %o1, 8, %o1 /* IEU1 */
|
|
|
+-15: sllx %o5, %g5, %o3 /* IEU0 Group */
|
|
|
+- ldxa [%o1] ASI_PNF, %o5 /* Load */
|
|
|
+- srlx %o5, %g4, %o4 /* IEU0 Group */
|
|
|
+-
|
|
|
+- add %o0, 8, %o0 /* IEU1 */
|
|
|
+- or %o3, %o4, %o3 /* IEU0 Group */
|
|
|
+- add %o1, 8, %o1 /* IEU1 */
|
|
|
+- sub %o3, %g1, %o4 /* IEU0 Group */
|
|
|
+-
|
|
|
+-#ifdef EIGHTBIT_NOT_RARE
|
|
|
+- andn %o4, %o3, %o4 /* IEU0 Group */
|
|
|
+-#endif
|
|
|
+- andcc %o4, %g2, %g0 /* IEU1 Group */
|
|
|
+- be,a,pt %xcc, 15b /* CTI */
|
|
|
+- stx %o3, [%o0 - 8] /* Store */
|
|
|
+- srlx %o3, 56, %o4 /* IEU0 Group */
|
|
|
+-
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 22f /* CTI */
|
|
|
+- srlx %o3, 48, %o4 /* IEU0 */
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 21f /* CTI */
|
|
|
+- srlx %o3, 40, %o4 /* IEU0 */
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 20f /* CTI */
|
|
|
+-
|
|
|
+- srlx %o3, 32, %o4 /* IEU0 */
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 19f /* CTI */
|
|
|
+- srlx %o3, 24, %o4 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 18f /* CTI */
|
|
|
+- srlx %o3, 16, %o4 /* IEU0 */
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 17f /* CTI */
|
|
|
+- srlx %o3, 8, %o4 /* IEU0 */
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 16f /* CTI */
|
|
|
+-
|
|
|
+- andcc %o3, 0xff, %g0 /* IEU1 Group */
|
|
|
+- bne,pn %icc, 15b /* CTI */
|
|
|
+- stx %o3, [%o0 - 8] /* Store */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+-
|
|
|
+- sub %o0, 1, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+- .align 16
|
|
|
+-17: ba,pt %xcc, 26f /* CTI Group */
|
|
|
+- subcc %o0, 3, %g6 /* IEU1 */
|
|
|
+-18: ba,pt %xcc, 27f /* CTI Group */
|
|
|
+- subcc %o0, 4, %g6 /* IEU1 */
|
|
|
+-
|
|
|
+-19: ba,pt %xcc, 28f /* CTI Group */
|
|
|
+- subcc %o0, 5, %g6 /* IEU1 */
|
|
|
+-16: subcc %o0, 2, %g6 /* IEU1 Group */
|
|
|
+- srlx %o3, 8, %o4 /* IEU0 */
|
|
|
+-
|
|
|
+- stb %o4, [%o0 - 2] /* Store */
|
|
|
+-26: srlx %o3, 16, %o4 /* IEU0 Group */
|
|
|
+- stb %o4, [%o0 - 3] /* Store */
|
|
|
+-27: srlx %o3, 24, %o4 /* IEU0 Group */
|
|
|
+-
|
|
|
+- stb %o4, [%o0 - 4] /* Store */
|
|
|
+-28: srlx %o3, 32, %o4 /* IEU0 Group */
|
|
|
+- stw %o4, [%o0 - 8] /* Store */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+-
|
|
|
+- mov %g6, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+- .align 16
|
|
|
+-21: ba,pt %xcc, 29f /* CTI Group */
|
|
|
+- subcc %o0, 7, %g6 /* IEU1 */
|
|
|
+-22: ba,pt %xcc, 30f /* CTI Group */
|
|
|
+- subcc %o0, 8, %g6 /* IEU1 */
|
|
|
+-
|
|
|
+-20: subcc %o0, 6, %g6 /* IEU1 Group */
|
|
|
+- srlx %o3, 40, %o4 /* IEU0 */
|
|
|
+- stb %o4, [%o0 - 6] /* Store */
|
|
|
+-29: srlx %o3, 48, %o4 /* IEU0 Group */
|
|
|
+-
|
|
|
+- stb %o4, [%o0 - 7] /* Store */
|
|
|
+-30: srlx %o3, 56, %o4 /* IEU0 Group */
|
|
|
+- stb %o4, [%o0 - 8] /* Store */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+-
|
|
|
+- mov %g6, %o0 /* IEU0 */
|
|
|
+-END(stpcpy)
|
|
|
+-libc_hidden_def(stpcpy)
|
|
|
+diff --git a/libc/string/sparc/sparc64/strcat.S b/libc/string/sparc/sparc64/strcat.S
|
|
|
+deleted file mode 100644
|
|
|
+index 56725cc..0000000
|
|
|
+--- a/libc/string/sparc/sparc64/strcat.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,338 +0,0 @@
|
|
|
+-/* strcat (dest, src) -- Append SRC on the end of DEST.
|
|
|
+- For SPARC v9.
|
|
|
+- 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>.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <asm/asi.h>
|
|
|
+-#ifndef XCC
|
|
|
+-#define XCC xcc
|
|
|
+-#define USE_BPR
|
|
|
+- .register %g2, #scratch
|
|
|
+- .register %g3, #scratch
|
|
|
+- .register %g6, #scratch
|
|
|
+-#endif
|
|
|
+-
|
|
|
+- /* Normally, this uses
|
|
|
+- ((xword - 0x0101010101010101) & 0x8080808080808080) test
|
|
|
+- to find out if any byte in xword could be zero. This is fast, but
|
|
|
+- also gives false alarm for any byte in range 0x81-0xff. It does
|
|
|
+- not matter for correctness, as if this test tells us there could
|
|
|
+- be some zero byte, we check it byte by byte, but if bytes with
|
|
|
+- high bits set are common in the strings, then this will give poor
|
|
|
+- performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
|
|
+- will use one tick slower, but more precise test
|
|
|
+- ((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
|
|
|
+- which does not give any false alarms (but if some bits are set,
|
|
|
+- one cannot assume from it which bytes are zero and which are not).
|
|
|
+- It is yet to be measured, what is the correct default for glibc
|
|
|
+- in these days for an average user.
|
|
|
+- */
|
|
|
+-
|
|
|
+- .text
|
|
|
+- .align 32
|
|
|
+-ENTRY(strcat)
|
|
|
+- sethi %hi(0x01010101), %g1 /* IEU0 Group */
|
|
|
+- ldub [%o0], %o3 /* Load */
|
|
|
+- or %g1, %lo(0x01010101), %g1 /* IEU0 Group */
|
|
|
+- mov %o0, %g6 /* IEU1 */
|
|
|
+-
|
|
|
+- sllx %g1, 32, %g2 /* IEU0 Group */
|
|
|
+- andcc %o0, 7, %g0 /* IEU1 */
|
|
|
+- or %g1, %g2, %g1 /* IEU0 Group */
|
|
|
+- bne,pn %icc, 32f /* CTI */
|
|
|
+-
|
|
|
+- sllx %g1, 7, %g2 /* IEU0 Group */
|
|
|
+- brz,pn %o3, 30f /* CTI+IEU1 */
|
|
|
+- ldx [%o0], %o3 /* Load */
|
|
|
+-48: add %o0, 8, %o0 /* IEU0 Group */
|
|
|
+-
|
|
|
+-49: sub %o3, %g1, %o2 /* IEU0 Group */
|
|
|
+-#ifdef EIGHTBIT_NOT_RARE
|
|
|
+- andn %o2, %o3, %g5 /* IEU0 Group */
|
|
|
+- ldxa [%o0] ASI_PNF, %o3 /* Load */
|
|
|
+- andcc %g5, %g2, %g0 /* IEU1 Group */
|
|
|
+-#else
|
|
|
+- ldxa [%o0] ASI_PNF, %o3 /* Load */
|
|
|
+- andcc %o2, %g2, %g0 /* IEU1 Group */
|
|
|
+-#endif
|
|
|
+- be,pt %xcc, 49b /* CTI */
|
|
|
+-
|
|
|
+- add %o0, 8, %o0 /* IEU0 */
|
|
|
+- addcc %o2, %g1, %g3 /* IEU1 Group */
|
|
|
+- srlx %o2, 32, %o2 /* IEU0 */
|
|
|
+-50: andcc %o2, %g2, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %xcc, 51f /* CTI */
|
|
|
+- srlx %g3, 56, %o2 /* IEU0 */
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 29f /* CTI */
|
|
|
+-
|
|
|
+- srlx %g3, 48, %o2 /* IEU0 */
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 28f /* CTI */
|
|
|
+- srlx %g3, 40, %o2 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 27f /* CTI */
|
|
|
+- srlx %g3, 32, %o2 /* IEU0 */
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 26f /* CTI */
|
|
|
+-51: srlx %g3, 24, %o2 /* IEU0 */
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 25f /* CTI */
|
|
|
+-
|
|
|
+- srlx %g3, 16, %o2 /* IEU0 */
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 24f /* CTI */
|
|
|
+- srlx %g3, 8, %o2 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 23f /* CTI */
|
|
|
+- sub %o3, %g1, %o2 /* IEU0 */
|
|
|
+- andcc %g3, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 52f /* CTI */
|
|
|
+- ldxa [%o0] ASI_PNF, %o3 /* Load */
|
|
|
+- andcc %o2, %g2, %g0 /* IEU1 Group */
|
|
|
+- be,pt %xcc, 49b /* CTI */
|
|
|
+-
|
|
|
+- add %o0, 8, %o0 /* IEU0 */
|
|
|
+- addcc %o2, %g1, %g3 /* IEU1 Group */
|
|
|
+- ba,pt %xcc, 50b /* CTI */
|
|
|
+- srlx %o2, 32, %o2 /* IEU0 */
|
|
|
+-
|
|
|
+- .align 16
|
|
|
+-52: ba,pt %xcc, 12f /* CTI Group */
|
|
|
+- add %o0, -9, %o0 /* IEU0 */
|
|
|
+-23: ba,pt %xcc, 12f /* CTI Group */
|
|
|
+- add %o0, -10, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+-24: ba,pt %xcc, 12f /* CTI Group */
|
|
|
+- add %o0, -11, %o0 /* IEU0 */
|
|
|
+-25: ba,pt %xcc, 12f /* CTI Group */
|
|
|
+- add %o0, -12, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+-26: ba,pt %xcc, 12f /* CTI Group */
|
|
|
+- add %o0, -13, %o0 /* IEU0 */
|
|
|
+-27: ba,pt %xcc, 12f /* CTI Group */
|
|
|
+- add %o0, -14, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+-28: ba,pt %xcc, 12f /* CTI Group */
|
|
|
+- add %o0, -15, %o0 /* IEU0 */
|
|
|
+-29: add %o0, -16, %o0 /* IEU0 Group */
|
|
|
+-30: andcc %o1, 7, %g3 /* IEU1 */
|
|
|
+-
|
|
|
+-31: bne,pn %icc, 14f /* CTI */
|
|
|
+- orcc %g0, 64, %g4 /* IEU1 Group */
|
|
|
+-1: ldx [%o1], %o3 /* Load */
|
|
|
+- add %o1, 8, %o1 /* IEU1 */
|
|
|
+-
|
|
|
+-2: mov %o3, %g3 /* IEU0 Group */
|
|
|
+-3: sub %o3, %g1, %o2 /* IEU1 */
|
|
|
+- ldxa [%o1] ASI_PNF, %o3 /* Load */
|
|
|
+-#ifdef EIGHTBIT_NOT_RARE
|
|
|
+- andn %o2, %g3, %o2 /* IEU0 Group */
|
|
|
+-#endif
|
|
|
+- add %o0, 8, %o0 /* IEU0 Group */
|
|
|
+-
|
|
|
+- andcc %o2, %g2, %g0 /* IEU1 */
|
|
|
+- add %o1, 8, %o1 /* IEU0 Group */
|
|
|
+- be,a,pt %xcc, 2b /* CTI */
|
|
|
+- stx %g3, [%o0 - 8] /* Store */
|
|
|
+-
|
|
|
+- srlx %g3, 56, %g5 /* IEU0 Group */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 11f /* CTI */
|
|
|
+- srlx %g3, 48, %g4 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %g4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 10f /* CTI */
|
|
|
+- srlx %g3, 40, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 9f /* CTI */
|
|
|
+- srlx %g3, 32, %g4 /* IEU0 */
|
|
|
+- andcc %g4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 8f /* CTI */
|
|
|
+-
|
|
|
+- srlx %g3, 24, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 7f /* CTI */
|
|
|
+- srlx %g3, 16, %g4 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %g4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 6f /* CTI */
|
|
|
+- srlx %g3, 8, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 5f /* CTI */
|
|
|
+- sub %o3, %g1, %o2 /* IEU0 */
|
|
|
+- stx %g3, [%o0 - 8] /* Store Group */
|
|
|
+- andcc %g3, 0xff, %g0 /* IEU1 */
|
|
|
+-
|
|
|
+- bne,pt %icc, 3b /* CTI */
|
|
|
+- mov %o3, %g3 /* IEU0 Group */
|
|
|
+-4: retl /* CTI+IEU1 Group */
|
|
|
+- mov %g6, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+- .align 16
|
|
|
+-5: stb %g5, [%o0 - 2] /* Store Group */
|
|
|
+- srlx %g3, 16, %g4 /* IEU0 */
|
|
|
+-6: sth %g4, [%o0 - 4] /* Store Group */
|
|
|
+- srlx %g3, 32, %g4 /* IEU0 */
|
|
|
+-
|
|
|
+- stw %g4, [%o0 - 8] /* Store Group */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+- 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 %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 %g6, %o0 /* IEU0 */
|
|
|
+-11: stb %g5, [%o0 - 8] /* Store Group */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+- mov %g6, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+- .align 16
|
|
|
+-32: andcc %o0, 7, %g0 /* IEU1 Group */
|
|
|
+- be,a,pn %icc, 48b /* CTI */
|
|
|
+- ldx [%o0], %o3 /* Load */
|
|
|
+- add %o0, 1, %o0 /* IEU0 Group */
|
|
|
+-
|
|
|
+- brnz,a,pt %o3, 32b /* CTI+IEU1 */
|
|
|
+- lduba [%o0] ASI_PNF, %o3 /* Load */
|
|
|
+- add %o0, -1, %o0 /* IEU0 Group */
|
|
|
+- andcc %o0, 7, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,a,pn %icc, 31b /* CTI */
|
|
|
+- andcc %o1, 7, %g3 /* IEU1 Group */
|
|
|
+-12: ldub [%o1], %o3 /* Load */
|
|
|
+- stb %o3, [%o0] /* Store Group */
|
|
|
+-
|
|
|
+-13: add %o0, 1, %o0 /* IEU0 */
|
|
|
+- add %o1, 1, %o1 /* IEU1 */
|
|
|
+- andcc %o3, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 4b /* CTI */
|
|
|
+-
|
|
|
+- lduba [%o1] ASI_PNF, %o3 /* Load */
|
|
|
+- andcc %o0, 7, %g0 /* IEU1 Group */
|
|
|
+- bne,a,pt %icc, 13b /* CTI */
|
|
|
+- stb %o3, [%o0] /* Store */
|
|
|
+-
|
|
|
+- andcc %o1, 7, %g3 /* IEU1 Group */
|
|
|
+- be,a,pt %icc, 1b /* CTI */
|
|
|
+- ldx [%o1], %o3 /* Load */
|
|
|
+- orcc %g0, 64, %g4 /* IEU1 Group */
|
|
|
+-
|
|
|
+-14: sllx %g3, 3, %g5 /* IEU0 */
|
|
|
+- sub %o1, %g3, %o1 /* IEU0 Group */
|
|
|
+- sub %g4, %g5, %g4 /* IEU1 */
|
|
|
+- /* %g1 = 0101010101010101 *
|
|
|
+- * %g2 = 8080808080808080 *
|
|
|
+- * %g3 = source alignment *
|
|
|
+- * %g5 = number of bits to shift left *
|
|
|
+- * %g4 = number of bits to shift right */
|
|
|
+- ldxa [%o1] ASI_PNF, %o5 /* Load Group */
|
|
|
+-
|
|
|
+- addcc %o1, 8, %o1 /* IEU1 */
|
|
|
+-15: sllx %o5, %g5, %o3 /* IEU0 Group */
|
|
|
+- ldxa [%o1] ASI_PNF, %o5 /* Load */
|
|
|
+- srlx %o5, %g4, %o4 /* IEU0 Group */
|
|
|
+-
|
|
|
+- add %o0, 8, %o0 /* IEU1 */
|
|
|
+- or %o3, %o4, %o3 /* IEU0 Group */
|
|
|
+- add %o1, 8, %o1 /* IEU1 */
|
|
|
+- sub %o3, %g1, %o4 /* IEU0 Group */
|
|
|
+-
|
|
|
+-#ifdef EIGHTBIT_NOT_RARE
|
|
|
+- andn %o4, %o3, %o4 /* IEU0 Group */
|
|
|
+-#endif
|
|
|
+- andcc %o4, %g2, %g0 /* IEU1 Group */
|
|
|
+- be,a,pt %xcc, 15b /* CTI */
|
|
|
+- stx %o3, [%o0 - 8] /* Store */
|
|
|
+- srlx %o3, 56, %o4 /* IEU0 Group */
|
|
|
+-
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 22f /* CTI */
|
|
|
+- srlx %o3, 48, %o4 /* IEU0 */
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 21f /* CTI */
|
|
|
+- srlx %o3, 40, %o4 /* IEU0 */
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 20f /* CTI */
|
|
|
+-
|
|
|
+- srlx %o3, 32, %o4 /* IEU0 */
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 19f /* CTI */
|
|
|
+- srlx %o3, 24, %o4 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 18f /* CTI */
|
|
|
+- srlx %o3, 16, %o4 /* IEU0 */
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 17f /* CTI */
|
|
|
+- srlx %o3, 8, %o4 /* IEU0 */
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 16f /* CTI */
|
|
|
+-
|
|
|
+- andcc %o3, 0xff, %g0 /* IEU1 Group */
|
|
|
+- bne,pn %icc, 15b /* CTI */
|
|
|
+- stx %o3, [%o0 - 8] /* Store */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+-
|
|
|
+- mov %g6, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+- .align 16
|
|
|
+-16: srlx %o3, 8, %o4 /* IEU0 Group */
|
|
|
+- stb %o4, [%o0 - 2] /* Store */
|
|
|
+-17: srlx %o3, 16, %o4 /* IEU0 Group */
|
|
|
+- stb %o4, [%o0 - 3] /* Store */
|
|
|
+-
|
|
|
+-18: srlx %o3, 24, %o4 /* IEU0 Group */
|
|
|
+- stb %o4, [%o0 - 4] /* Store */
|
|
|
+-19: srlx %o3, 32, %o4 /* IEU0 Group */
|
|
|
+- stw %o4, [%o0 - 8] /* Store */
|
|
|
+-
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+- mov %g6, %o0 /* IEU0 */
|
|
|
+- nop
|
|
|
+- nop
|
|
|
+-
|
|
|
+-20: srlx %o3, 40, %o4 /* IEU0 Group */
|
|
|
+- stb %o4, [%o0 - 6] /* Store */
|
|
|
+-21: srlx %o3, 48, %o4 /* IEU0 Group */
|
|
|
+- stb %o4, [%o0 - 7] /* Store */
|
|
|
+-
|
|
|
+-22: srlx %o3, 56, %o4 /* IEU0 Group */
|
|
|
+- stb %o4, [%o0 - 8] /* Store */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+- mov %g6, %o0 /* IEU0 */
|
|
|
+-END(strcat)
|
|
|
+-libc_hidden_def(strcat)
|
|
|
+diff --git a/libc/string/sparc/sparc64/strchr.S b/libc/string/sparc/sparc64/strchr.S
|
|
|
+deleted file mode 100644
|
|
|
+index 25810fd..0000000
|
|
|
+--- a/libc/string/sparc/sparc64/strchr.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,485 +0,0 @@
|
|
|
+-/* strchr (str, ch) -- Return pointer to first occurrence of CH in STR.
|
|
|
+- For SPARC v9.
|
|
|
+- 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>.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <features.h>
|
|
|
+-#include <asm/asi.h>
|
|
|
+-#ifndef XCC
|
|
|
+-#define XCC xcc
|
|
|
+-#define USE_BPR
|
|
|
+- .register %g2, #scratch
|
|
|
+- .register %g3, #scratch
|
|
|
+- .register %g6, #scratch
|
|
|
+-#endif
|
|
|
+-
|
|
|
+- /* Normally, this uses
|
|
|
+- ((xword - 0x0101010101010101) & 0x8080808080808080) test
|
|
|
+- to find out if any byte in xword could be zero. This is fast, but
|
|
|
+- also gives false alarm for any byte in range 0x81-0xff. It does
|
|
|
+- not matter for correctness, as if this test tells us there could
|
|
|
+- be some zero byte, we check it byte by byte, but if bytes with
|
|
|
+- high bits set are common in the strings, then this will give poor
|
|
|
+- performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
|
|
+- will use one tick slower, but more precise test
|
|
|
+- ((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
|
|
|
+- which does not give any false alarms (but if some bits are set,
|
|
|
+- one cannot assume from it which bytes are zero and which are not).
|
|
|
+- It is yet to be measured, what is the correct default for glibc
|
|
|
+- in these days for an average user.
|
|
|
+- */
|
|
|
+-
|
|
|
+- .text
|
|
|
+- .align 32
|
|
|
+-ENTRY(strchr)
|
|
|
+- andcc %o1, 0xff, %o1 /* IEU1 Group */
|
|
|
+- be,pn %icc, 17f /* CTI */
|
|
|
+- sllx %o1, 8, %g3 /* IEU0 Group */
|
|
|
+- sethi %hi(0x01010101), %g1 /* IEU1 */
|
|
|
+-
|
|
|
+- or %g3, %o1, %g3 /* IEU0 Group */
|
|
|
+- ldub [%o0], %o3 /* Load */
|
|
|
+- sllx %g3, 16, %g5 /* IEU0 Group */
|
|
|
+- or %g1, %lo(0x01010101), %g1 /* IEU1 */
|
|
|
+-
|
|
|
+- sllx %g1, 32, %g2 /* IEU0 Group */
|
|
|
+- brz,pn %o3, 5f /* CTI+IEU1 */
|
|
|
+- orcc %g3, %g5, %g3 /* IEU1 Group */
|
|
|
+- sllx %g3, 32, %g5 /* IEU0 */
|
|
|
+-
|
|
|
+- cmp %o3, %o1 /* IEU1 Group */
|
|
|
+- be,pn %xcc, 14f /* CTI */
|
|
|
+- or %g1, %g2, %g1 /* IEU0 */
|
|
|
+- andcc %o0, 7, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- bne,a,pn %icc, 15f /* CTI */
|
|
|
+- add %o0, 1, %o0 /* IEU0 */
|
|
|
+- ldx [%o0], %o3 /* Load Group */
|
|
|
+-1: sllx %g1, 7, %g2 /* IEU0 */
|
|
|
+-
|
|
|
+- or %g3, %g5, %g3 /* IEU1 */
|
|
|
+- add %o0, 8, %o0 /* IEU0 Group */
|
|
|
+- xor %o3, %g3, %o4 /* IEU1 */
|
|
|
+- /* %g1 = 0101010101010101 *
|
|
|
+- * %g2 = 8080088080808080 *
|
|
|
+- * %g3 = c c c c c c c c *
|
|
|
+- * %o3 = value *
|
|
|
+- * %o4 = value XOR c */
|
|
|
+-2: sub %o3, %g1, %o2 /* IEU0 Group */
|
|
|
+-
|
|
|
+- sub %o4, %g1, %o5 /* IEU1 */
|
|
|
+-#ifdef EIGHTBIT_NOT_RARE
|
|
|
+- andn %o2, %o3, %g6 /* IEU0 Group */
|
|
|
+- andn %o5, %o4, %o5 /* IEU1 */
|
|
|
+- ldxa [%o0] ASI_PNF, %o3 /* Load */
|
|
|
+- or %o5, %g6, %o5 /* IEU0 Group */
|
|
|
+-#else
|
|
|
+- ldxa [%o0] ASI_PNF, %o3 /* Load */
|
|
|
+- or %o5, %o2, %o5 /* IEU0 Group */
|
|
|
+-#endif
|
|
|
+- add %o0, 8, %o0 /* IEU1 */
|
|
|
+-
|
|
|
+- andcc %o5, %g2, %g0 /* IEU1 Group */
|
|
|
+- be,a,pt %xcc, 2b /* CTI */
|
|
|
+- xor %o3, %g3, %o4 /* IEU0 */
|
|
|
+- srlx %o5, 32, %g5 /* IEU0 Group */
|
|
|
+-
|
|
|
+- add %o2, %g1, %o2 /* IEU1 */
|
|
|
+-3: andcc %g5, %g2, %g0 /* IEU1 Group */
|
|
|
+- be,pn %xcc, 4f /* CTI */
|
|
|
+- srlx %o2, 56, %g5 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 5f /* CTI */
|
|
|
+- srlx %o4, 56, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 6f /* CTI */
|
|
|
+- srlx %o2, 48, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 5f /* CTI */
|
|
|
+-
|
|
|
+- srlx %o4, 48, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 7f /* CTI */
|
|
|
+- srlx %o2, 40, %g5 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 5f /* CTI */
|
|
|
+- srlx %o4, 40, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 8f /* CTI */
|
|
|
+- srlx %o2, 32, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 5f /* CTI */
|
|
|
+-
|
|
|
+- srlx %o4, 32, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 9f /* CTI */
|
|
|
+-4: srlx %o2, 24, %g5 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 5f /* CTI */
|
|
|
+- srlx %o4, 24, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 10f /* CTI */
|
|
|
+- srlx %o2, 16, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 5f /* CTI */
|
|
|
+-
|
|
|
+- srlx %o4, 16, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 11f /* CTI */
|
|
|
+- srlx %o2, 8, %g5 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 5f /* CTI */
|
|
|
+- srlx %o4, 8, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 12f /* CTI */
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 5f /* CTI */
|
|
|
+- sub %o3, %g1, %o2 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 13f /* CTI */
|
|
|
+- xor %o3, %g3, %o4 /* IEU0 */
|
|
|
+- ldxa [%o0] ASI_PNF, %o3 /* Load Group */
|
|
|
+-
|
|
|
+- sub %o4, %g1, %o5 /* IEU0 */
|
|
|
+- or %o5, %o2, %o5 /* IEU1 */
|
|
|
+- add %o0, 8, %o0 /* IEU0 Group */
|
|
|
+- andcc %o5, %g2, %g0 /* IEU1 */
|
|
|
+-
|
|
|
+- be,a,pt %xcc, 2b /* CTI */
|
|
|
+- xor %o3, %g3, %o4 /* IEU0 Group */
|
|
|
+- srlx %o5, 32, %g5 /* IEU0 Group */
|
|
|
+- ba,pt %xcc, 3b /* CTI */
|
|
|
+-
|
|
|
+- add %o2, %g1, %o2 /* IEU1 */
|
|
|
+-
|
|
|
+- .align 16
|
|
|
+-5: retl /* CTI+IEU1 Group */
|
|
|
+- clr %o0 /* IEU0 */
|
|
|
+-6: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -16, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+-7: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -15, %o0 /* IEU0 */
|
|
|
+-8: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -14, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+-9: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -13, %o0 /* IEU0 */
|
|
|
+-10: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -12, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+-11: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -11, %o0 /* IEU0 */
|
|
|
+-12: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -10, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+-13: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -9, %o0 /* IEU0 */
|
|
|
+-14: retl /* CTI+IEU1 Group */
|
|
|
+- nop /* IEU0 */
|
|
|
+-
|
|
|
+- .align 16
|
|
|
+-15: ldub [%o0], %o3 /* Load Group */
|
|
|
+-16: andcc %o0, 7, %g0 /* IEU1 */
|
|
|
+- be,a,pn %icc, 1b /* CTI */
|
|
|
+- ldx [%o0], %o3 /* Load Group */
|
|
|
+-
|
|
|
+- andcc %o3, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 5b /* CTI */
|
|
|
+- add %o0, 1, %o0 /* IEU0 */
|
|
|
+- cmp %o3, %o1 /* IEU1 Group */
|
|
|
+-
|
|
|
+- bne,a,pn %icc, 16b /* CTI */
|
|
|
+- ldub [%o0], %o3 /* Load */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -1, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+- /* strchr (str, 0) */
|
|
|
+- .align 32
|
|
|
+- nop
|
|
|
+- .align 16
|
|
|
+-17: sethi %hi(0x01010101), %g1 /* IEU0 Group */
|
|
|
+- ldub [%o0], %o3 /* Load */
|
|
|
+- or %g1, %lo(0x01010101), %g1 /* IEU0 Group */
|
|
|
+- sllx %g1, 32, %g2 /* IEU0 Group */
|
|
|
+-
|
|
|
+- andcc %o0, 7, %g0 /* IEU1 */
|
|
|
+- or %g1, %g2, %g1 /* IEU0 Group */
|
|
|
+- bne,pn %icc, 32f /* CTI */
|
|
|
+- sllx %g1, 7, %g2 /* IEU0 Group */
|
|
|
+-
|
|
|
+- brz,pn %o3, 30f /* CTI+IEU1 */
|
|
|
+- ldx [%o0], %o3 /* Load */
|
|
|
+-18: add %o0, 8, %o0 /* IEU0 Group */
|
|
|
+-19: sub %o3, %g1, %o2 /* IEU0 Group */
|
|
|
+-
|
|
|
+-#ifdef EIGHTBIT_NOT_RARE
|
|
|
+- andn %o2, %o3, %g6 /* IEU0 Group */
|
|
|
+- ldxa [%o0] ASI_PNF, %o3 /* Load */
|
|
|
+- andcc %g6, %g2, %g0 /* IEU1 Group */
|
|
|
+-#else
|
|
|
+- ldxa [%o0] ASI_PNF, %o3 /* Load */
|
|
|
+- andcc %o2, %g2, %g0 /* IEU1 Group */
|
|
|
+-#endif
|
|
|
+- be,pt %xcc, 19b /* CTI */
|
|
|
+- add %o0, 8, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+- addcc %o2, %g1, %g3 /* IEU1 Group */
|
|
|
+- srlx %o2, 32, %o2 /* IEU0 */
|
|
|
+-20: andcc %o2, %g2, %g0 /* IEU1 Group */
|
|
|
+- be,pn %xcc, 21f /* CTI */
|
|
|
+-
|
|
|
+- srlx %g3, 56, %o2 /* IEU0 */
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 29f /* CTI */
|
|
|
+- srlx %g3, 48, %o2 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 28f /* CTI */
|
|
|
+- srlx %g3, 40, %o2 /* IEU0 */
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 27f /* CTI */
|
|
|
+- srlx %g3, 32, %o2 /* IEU0 */
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 26f /* CTI */
|
|
|
+-
|
|
|
+-21: srlx %g3, 24, %o2 /* IEU0 */
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 25f /* CTI */
|
|
|
+- srlx %g3, 16, %o2 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 24f /* CTI */
|
|
|
+- srlx %g3, 8, %o2 /* IEU0 */
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 23f /* CTI */
|
|
|
+- sub %o3, %g1, %o2 /* IEU0 */
|
|
|
+- andcc %g3, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 22f /* CTI */
|
|
|
+-
|
|
|
+- ldxa [%o0] ASI_PNF, %o3 /* Load */
|
|
|
+- andcc %o2, %g2, %g0 /* IEU1 Group */
|
|
|
+- be,pt %xcc, 19b /* CTI */
|
|
|
+- add %o0, 8, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+- addcc %o2, %g1, %g3 /* IEU1 Group */
|
|
|
+- ba,pt %xcc, 20b /* CTI */
|
|
|
+- srlx %o2, 32, %o2 /* IEU0 */
|
|
|
+-
|
|
|
+- .align 16
|
|
|
+-22: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -9, %o0 /* IEU0 */
|
|
|
+-23: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -10, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+-24: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -11, %o0 /* IEU0 */
|
|
|
+-25: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -12, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+-26: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -13, %o0 /* IEU0 */
|
|
|
+-27: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -14, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+-28: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -15, %o0 /* IEU0 */
|
|
|
+-29: retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -16, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+-30: retl /* CTI+IEU1 Group */
|
|
|
+- nop /* IEU0 */
|
|
|
+-
|
|
|
+- .align 16
|
|
|
+-32: andcc %o0, 7, %g0 /* IEU1 Group */
|
|
|
+- be,a,pn %icc, 18b /* CTI */
|
|
|
+- ldx [%o0], %o3 /* Load */
|
|
|
+- add %o0, 1, %o0 /* IEU0 Group */
|
|
|
+-
|
|
|
+- brnz,a,pt %o3, 32b /* CTI+IEU1 */
|
|
|
+- lduba [%o0] ASI_PNF, %o3 /* Load */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+- add %o0, -1, %o0 /* IEU0 */
|
|
|
+-END(strchr)
|
|
|
+-libc_hidden_def(strchr)
|
|
|
+-#ifdef __UCLIBC_SUSV3_LEGACY__
|
|
|
+-strong_alias(strchr,index)
|
|
|
+-#endif
|
|
|
+-
|
|
|
+- .align 32
|
|
|
+-ENTRY(strrchr)
|
|
|
+- andcc %o1, 0xff, %o1 /* IEU1 Group */
|
|
|
+- be,pn %icc, 17b /* CTI */
|
|
|
+- clr %g4 /* IEU0 */
|
|
|
+- andcc %o0, 7, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- bne,pn %icc, 13f /* CTI */
|
|
|
+- sllx %o1, 8, %g3 /* IEU0 */
|
|
|
+- ldx [%o0], %o3 /* Load Group */
|
|
|
+-1: sethi %hi(0x01010101), %g1 /* IEU0 */
|
|
|
+-
|
|
|
+- or %g3, %o1, %g3 /* IEU1 */
|
|
|
+- sllx %g3, 16, %g5 /* IEU0 Group */
|
|
|
+- or %g1, %lo(0x01010101), %g1 /* IEU1 */
|
|
|
+- sllx %g1, 32, %g2 /* IEU0 Group */
|
|
|
+-
|
|
|
+- or %g3, %g5, %g3 /* IEU1 */
|
|
|
+- sllx %g3, 32, %g5 /* IEU0 Group */
|
|
|
+- or %g1, %g2, %g1 /* IEU1 */
|
|
|
+- sllx %g1, 7, %g2 /* IEU0 Group */
|
|
|
+-
|
|
|
+- or %g3, %g5, %g3 /* IEU1 */
|
|
|
+- add %o0, 8, %o0 /* IEU0 Group */
|
|
|
+- xor %o3, %g3, %o4 /* IEU1 */
|
|
|
+- /* %g1 = 0101010101010101 *
|
|
|
+- * %g2 = 8080088080808080 *
|
|
|
+- * %g3 = c c c c c c c c *
|
|
|
+- * %o3 = value *
|
|
|
+- * %o4 = value XOR c */
|
|
|
+-2: sub %o3, %g1, %o2 /* IEU0 Group */
|
|
|
+-
|
|
|
+-3: sub %o4, %g1, %o5 /* IEU1 */
|
|
|
+-#ifdef EIGHTBIT_NOT_RARE
|
|
|
+- andn %o2, %o3, %g6 /* IEU0 Group */
|
|
|
+- andn %o5, %o4, %o5 /* IEU1 */
|
|
|
+- ldxa [%o0] ASI_PNF, %o3 /* Load */
|
|
|
+-
|
|
|
+- or %o5, %g6, %o5 /* IEU0 Group */
|
|
|
+-#else
|
|
|
+- ldxa [%o0] ASI_PNF, %o3 /* Load */
|
|
|
+-
|
|
|
+- or %o5, %o2, %o5 /* IEU0 Group */
|
|
|
+-#endif
|
|
|
+- add %o0, 8, %o0 /* IEU1 */
|
|
|
+- andcc %o5, %g2, %g0 /* IEU1 Group */
|
|
|
+- be,a,pt %xcc, 2b /* CTI */
|
|
|
+-
|
|
|
+- xor %o3, %g3, %o4 /* IEU0 */
|
|
|
+- srlx %o5, 32, %g5 /* IEU0 Group */
|
|
|
+- add %o2, %g1, %o2 /* IEU1 */
|
|
|
+- andcc %g5, %g2, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %xcc, 7f /* CTI */
|
|
|
+- srlx %o2, 56, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 12f /* CTI */
|
|
|
+-
|
|
|
+- srlx %o4, 56, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- srlx %o2, 48, %g5 /* IEU0 */
|
|
|
+- be,a,pn %icc, 4f /* CTI */
|
|
|
+-
|
|
|
+- add %o0, -16, %g4 /* IEU0 Group */
|
|
|
+-4: andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 12f /* CTI */
|
|
|
+- srlx %o4, 48, %g5 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- srlx %o2, 40, %g5 /* IEU0 */
|
|
|
+- be,a,pn %icc, 5f /* CTI */
|
|
|
+- add %o0, -15, %g4 /* IEU0 Group */
|
|
|
+-
|
|
|
+-5: andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 12f /* CTI */
|
|
|
+- srlx %o4, 40, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- srlx %o2, 32, %g5 /* IEU0 */
|
|
|
+- be,a,pn %icc, 6f /* CTI */
|
|
|
+- add %o0, -14, %g4 /* IEU0 Group */
|
|
|
+-6: andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 12f /* CTI */
|
|
|
+- srlx %o4, 32, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,a,pn %icc, 7f /* CTI */
|
|
|
+-
|
|
|
+- add %o0, -13, %g4 /* IEU0 */
|
|
|
+-7: srlx %o2, 24, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 12f /* CTI */
|
|
|
+-
|
|
|
+- srlx %o4, 24, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- srlx %o2, 16, %g5 /* IEU0 */
|
|
|
+- be,a,pn %icc, 8f /* CTI */
|
|
|
+-
|
|
|
+- add %o0, -12, %g4 /* IEU0 Group */
|
|
|
+-8: andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 12f /* CTI */
|
|
|
+- srlx %o4, 16, %g5 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- srlx %o2, 8, %g5 /* IEU0 */
|
|
|
+- be,a,pn %icc, 9f /* CTI */
|
|
|
+- add %o0, -11, %g4 /* IEU0 Group */
|
|
|
+-
|
|
|
+-9: andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 12f /* CTI */
|
|
|
+- srlx %o4, 8, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,a,pn %icc, 10f /* CTI */
|
|
|
+- add %o0, -10, %g4 /* IEU0 */
|
|
|
+-10: andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 12f /* CTI */
|
|
|
+-
|
|
|
+- sub %o3, %g1, %o2 /* IEU0 */
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,a,pn %icc, 11f /* CTI */
|
|
|
+- add %o0, -9, %g4 /* IEU0 */
|
|
|
+-
|
|
|
+-11: ba,pt %xcc, 3b /* CTI Group */
|
|
|
+- xor %o3, %g3, %o4 /* IEU0 Group */
|
|
|
+-12: retl /* CTI+IEU1 Group */
|
|
|
+- mov %g4, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+- .align 16
|
|
|
+-13: ldub [%o0], %o3 /* Load Group */
|
|
|
+- add %o0, 1, %o0 /* IEU0 */
|
|
|
+-14: andcc %o3, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 12b /* CTI */
|
|
|
+-
|
|
|
+- cmp %o3, %o1 /* IEU1 Group */
|
|
|
+- ldub [%o0], %o3 /* Load */
|
|
|
+- be,a,pn %icc, 15f /* CTI */
|
|
|
+- add %o0, -1, %g4 /* IEU0 Group */
|
|
|
+-
|
|
|
+-15: andcc %o0, 7, %g0 /* IEU1 Group */
|
|
|
+- bne,a,pt %icc, 14b /* CTI */
|
|
|
+- add %o0, 1, %o0 /* IEU0 */
|
|
|
+- ba,pt %xcc, 1b /* CTI Group */
|
|
|
+-
|
|
|
+- ldx [%o0], %o3 /* Load */
|
|
|
+-END(strrchr)
|
|
|
+-libc_hidden_def(strrchr)
|
|
|
+-#ifdef __UCLIBC_SUSV3_LEGACY__
|
|
|
+-strong_alias(strrchr,rindex)
|
|
|
+-#endif
|
|
|
+diff --git a/libc/string/sparc/sparc64/strcmp.S b/libc/string/sparc/sparc64/strcmp.S
|
|
|
+deleted file mode 100644
|
|
|
+index 7b85007..0000000
|
|
|
+--- a/libc/string/sparc/sparc64/strcmp.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,278 +0,0 @@
|
|
|
+-/* Compare two strings for differences.
|
|
|
+- For SPARC v9.
|
|
|
+- 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>.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <asm/asi.h>
|
|
|
+-#ifndef XCC
|
|
|
+- .register %g2, #scratch
|
|
|
+- .register %g3, #scratch
|
|
|
+- .register %g6, #scratch
|
|
|
+-#endif
|
|
|
+-
|
|
|
+- /* Normally, this uses
|
|
|
+- ((xword - 0x0101010101010101) & 0x8080808080808080) test
|
|
|
+- to find out if any byte in xword could be zero. This is fast, but
|
|
|
+- also gives false alarm for any byte in range 0x81-0xff. It does
|
|
|
+- not matter for correctness, as if this test tells us there could
|
|
|
+- be some zero byte, we check it byte by byte, but if bytes with
|
|
|
+- high bits set are common in the strings, then this will give poor
|
|
|
+- performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
|
|
+- will use one tick slower, but more precise test
|
|
|
+- ((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
|
|
|
+- which does not give any false alarms (but if some bits are set,
|
|
|
+- one cannot assume from it which bytes are zero and which are not).
|
|
|
+- It is yet to be measured, what is the correct default for glibc
|
|
|
+- in these days for an average user.
|
|
|
+- */
|
|
|
+-
|
|
|
+- .text
|
|
|
+- .align 32
|
|
|
+-ENTRY(strcmp)
|
|
|
+- sethi %hi(0x01010101), %g1 /* IEU0 Group */
|
|
|
+- andcc %o0, 7, %g0 /* IEU1 */
|
|
|
+- bne,pn %icc, 7f /* CTI */
|
|
|
+- or %g1, %lo(0x01010101), %g1 /* IEU0 Group */
|
|
|
+-
|
|
|
+- andcc %o1, 7, %g3 /* IEU1 */
|
|
|
+- bne,pn %icc, 9f /* CTI */
|
|
|
+- sllx %g1, 32, %g2 /* IEU0 Group */
|
|
|
+- ldx [%o0], %o2 /* Load */
|
|
|
+-
|
|
|
+- or %g1, %g2, %g1 /* IEU0 Group */
|
|
|
+-1: ldx [%o1], %o3 /* Load */
|
|
|
+- sub %o1, %o0, %o1 /* IEU1 */
|
|
|
+- sllx %g1, 7, %g2 /* IEU0 Group */
|
|
|
+-
|
|
|
+-2: add %o0, 8, %o0 /* IEU1 */
|
|
|
+- sub %o2, %g1, %g3 /* IEU0 Group */
|
|
|
+- subcc %o2, %o3, %g0 /* IEU1 */
|
|
|
+- bne,pn %xcc, 13f /* CTI */
|
|
|
+-
|
|
|
+-#ifdef EIGHTBIT_NOT_RARE
|
|
|
+- andn %g3, %o2, %g4 /* IEU0 Group */
|
|
|
+- ldxa [%o0] ASI_PNF, %o2 /* Load */
|
|
|
+- andcc %g4, %g2, %g0 /* IEU1 Group */
|
|
|
+-#else
|
|
|
+- ldxa [%o0] ASI_PNF, %o2 /* Load Group */
|
|
|
+- andcc %g3, %g2, %g0 /* IEU1 */
|
|
|
+-#endif
|
|
|
+- be,a,pt %xcc, 2b /* CTI */
|
|
|
+- ldxa [%o1 + %o0] ASI_PNF, %o3 /* Load Group */
|
|
|
+-
|
|
|
+- addcc %g3, %g1, %o4 /* IEU1 */
|
|
|
+- srlx %g3, 32, %g3 /* IEU0 */
|
|
|
+- andcc %g3, %g2, %g0 /* IEU1 Group */
|
|
|
+- be,pt %xcc, 3f /* CTI */
|
|
|
+-
|
|
|
+- srlx %o4, 56, %o5 /* IEU0 */
|
|
|
+- andcc %o5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 4f /* CTI */
|
|
|
+- srlx %o4, 48, %o5 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %o5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 4f /* CTI */
|
|
|
+- srlx %o4, 40, %o5 /* IEU0 */
|
|
|
+- andcc %o5, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 4f /* CTI */
|
|
|
+- srlx %o4, 32, %o5 /* IEU0 */
|
|
|
+- andcc %o5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 4f /* CTI */
|
|
|
+-
|
|
|
+-3: srlx %o4, 24, %o5 /* IEU0 */
|
|
|
+- andcc %o5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 4f /* CTI */
|
|
|
+- srlx %o4, 16, %o5 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %o5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 4f /* CTI */
|
|
|
+- srlx %o4, 8, %o5 /* IEU0 */
|
|
|
+- andcc %o5, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 4f /* CTI */
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- bne,a,pn %icc, 2b /* CTI */
|
|
|
+- ldxa [%o1 + %o0] ASI_PNF, %o3 /* Load */
|
|
|
+-
|
|
|
+-4: retl /* CTI+IEU1 Group */
|
|
|
+- clr %o0 /* IEU0 */
|
|
|
+-
|
|
|
+- .align 32
|
|
|
+-13: mov 0xff, %g6 /* IEU0 Group */
|
|
|
+-#ifdef EIGHTBIT_NOT_RARE
|
|
|
+- andcc %g4, %g2, %g0 /* IEU1 */
|
|
|
+-#else
|
|
|
+- andcc %g3, %g2, %g0 /* IEU1 */
|
|
|
+-#endif
|
|
|
+- be,pt %xcc, 25f /* CTI */
|
|
|
+- addcc %g3, %g1, %o4 /* IEU1 Group */
|
|
|
+-
|
|
|
+- srlx %g3, 32, %g3 /* IEU0 */
|
|
|
+- andcc %g3, %g2, %g0 /* IEU1 Group */
|
|
|
+- be,pt %xcc, 23f /* CTI */
|
|
|
+- sllx %g6, 56, %o5 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %o4, %o5, %g0 /* IEU1 Group */
|
|
|
+- be,pn %xcc, 24f /* CTI */
|
|
|
+- sllx %g6, 48, %o5 /* IEU0 */
|
|
|
+- andcc %o4, %o5, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %xcc, 24f /* CTI */
|
|
|
+- sllx %g6, 40, %o5 /* IEU0 */
|
|
|
+- andcc %o4, %o5, %g0 /* IEU1 Group */
|
|
|
+- be,pn %xcc, 24f /* CTI */
|
|
|
+-
|
|
|
+- sllx %g6, 32, %o5 /* IEU0 */
|
|
|
+- andcc %o4, %o5, %g0 /* IEU1 Group */
|
|
|
+- be,pn %xcc, 24f /* CTI */
|
|
|
+-23: sllx %g6, 24, %o5 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %o4, %o5, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 24f /* CTI */
|
|
|
+- sllx %g6, 16, %o5 /* IEU0 */
|
|
|
+- andcc %o4, %o5, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 24f /* CTI */
|
|
|
+- sllx %g6, 8, %o5 /* IEU0 */
|
|
|
+- andcc %o4, %o5, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 24f /* CTI */
|
|
|
+-
|
|
|
+- mov %g6, %o5 /* IEU0 */
|
|
|
+-25: cmp %o4, %o3 /* IEU1 Group */
|
|
|
+-5: mov -1, %o0 /* IEU0 */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+-
|
|
|
+- movgu %xcc, 1, %o0 /* Single Group */
|
|
|
+-
|
|
|
+- .align 16
|
|
|
+-24: sub %o5, 1, %g6 /* IEU0 Group */
|
|
|
+- clr %o0 /* IEU1 */
|
|
|
+- or %o5, %g6, %o5 /* IEU0 Group */
|
|
|
+- andn %o4, %o5, %o4 /* IEU0 Group */
|
|
|
+-
|
|
|
+- andn %o3, %o5, %o3 /* IEU1 */
|
|
|
+- cmp %o4, %o3 /* IEU1 Group */
|
|
|
+- movgu %xcc, 1, %o0 /* Single Group */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+-
|
|
|
+- movlu %xcc, -1, %o0 /* Single Group */
|
|
|
+-6: retl /* CTI+IEU1 Group */
|
|
|
+- mov %o4, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+- .align 16
|
|
|
+-7: ldub [%o0], %o2 /* Load */
|
|
|
+- add %o0, 1, %o0 /* IEU1 */
|
|
|
+- ldub [%o1], %o3 /* Load Group */
|
|
|
+- sllx %g1, 32, %g2 /* IEU0 */
|
|
|
+-
|
|
|
+-8: add %o1, 1, %o1 /* IEU1 */
|
|
|
+- subcc %o2, %o3, %o4 /* IEU1 Group */
|
|
|
+- bne,pn %xcc, 6b /* CTI */
|
|
|
+- lduba [%o0] ASI_PNF, %o2 /* Load */
|
|
|
+-
|
|
|
+- brz,pn %o3, 4b /* CTI+IEU1 Group */
|
|
|
+- lduba [%o1] ASI_PNF, %o3 /* Load */
|
|
|
+- andcc %o0, 7, %g0 /* IEU1 Group */
|
|
|
+- bne,a,pn %icc, 8b /* CTI */
|
|
|
+-
|
|
|
+- add %o0, 1, %o0 /* IEU0 */
|
|
|
+- or %g1, %g2, %g1 /* IEU0 Group */
|
|
|
+- andcc %o1, 7, %g3 /* IEU1 */
|
|
|
+- be,a,pn %icc, 1b /* CTI */
|
|
|
+-
|
|
|
+- ldxa [%o0] ASI_PNF, %o2 /* Load Group */
|
|
|
+-9: sllx %g3, 3, %g5 /* IEU0 */
|
|
|
+- mov 64, %o5 /* IEU1 */
|
|
|
+- sub %o1, %g3, %o1 /* IEU0 Group */
|
|
|
+-
|
|
|
+- sub %o5, %g5, %o5 /* IEU1 */
|
|
|
+- ldxa [%o1] ASI_PNF, %g6 /* Load Group */
|
|
|
+- or %g1, %g2, %g1 /* IEU0 */
|
|
|
+- sub %o1, %o0, %o1 /* IEU1 */
|
|
|
+-
|
|
|
+- sllx %g1, 7, %g2 /* IEU0 Group */
|
|
|
+- add %o1, 8, %o1 /* IEU1 */
|
|
|
+- /* %g1 = 0101010101010101
|
|
|
+- * %g2 = 8080808080800880
|
|
|
+- * %g5 = number of bits to shift left
|
|
|
+- * %o5 = number of bits to shift right */
|
|
|
+-10: sllx %g6, %g5, %o3 /* IEU0 Group */
|
|
|
+- ldxa [%o1 + %o0] ASI_PNF, %g6 /* Load */
|
|
|
+-
|
|
|
+-11: srlx %g6, %o5, %o4 /* IEU0 Group */
|
|
|
+- ldxa [%o0] ASI_PNF, %o2 /* Load */
|
|
|
+- or %o3, %o4, %o3 /* IEU1 */
|
|
|
+- add %o0, 8, %o0 /* IEU0 Group */
|
|
|
+-
|
|
|
+- subcc %o2, %o3, %g0 /* IEU1 */
|
|
|
+-#ifdef EIGHTBIT_NOT_RARE
|
|
|
+- sub %o2, %g1, %g3 /* IEU0 Group */
|
|
|
+- bne,pn %xcc, 13b /* CTI */
|
|
|
+- andn %g3, %o2, %g4 /* IEU0 Group */
|
|
|
+-
|
|
|
+- andcc %g4, %g2, %g0 /* IEU1 Group */
|
|
|
+- be,pt %xcc, 10b /* CTI */
|
|
|
+- srlx %g4, 32, %g4 /* IEU0 */
|
|
|
+- andcc %g4, %g2, %g0 /* IEU1 Group */
|
|
|
+-#else
|
|
|
+- bne,pn %xcc, 13b /* CTI */
|
|
|
+- sub %o2, %g1, %g3 /* IEU0 Group */
|
|
|
+- andcc %g3, %g2, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pt %xcc, 10b /* CTI */
|
|
|
+- srlx %g3, 32, %g3 /* IEU0 */
|
|
|
+- andcc %g3, %g2, %g0 /* IEU1 Group */
|
|
|
+-#endif
|
|
|
+- be,pt %xcc, 12f /* CTI */
|
|
|
+-
|
|
|
+- srlx %o2, 56, %g3 /* IEU0 */
|
|
|
+- andcc %g3, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 4b /* CTI */
|
|
|
+- srlx %o2, 48, %g3 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %g3, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 4b /* CTI */
|
|
|
+- srlx %o2, 40, %g3 /* IEU0 */
|
|
|
+- andcc %g3, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 4b /* CTI */
|
|
|
+- srlx %o2, 32, %g3 /* IEU0 */
|
|
|
+- andcc %g3, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 4b /* CTI */
|
|
|
+-
|
|
|
+-12: srlx %o2, 24, %g3 /* IEU0 */
|
|
|
+- andcc %g3, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 4b /* CTI */
|
|
|
+- srlx %o2, 16, %g3 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %g3, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 4b /* CTI */
|
|
|
+- srlx %o2, 8, %g3 /* IEU0 */
|
|
|
+- andcc %g3, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 4b /* CTI */
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 4b /* CTI */
|
|
|
+- sllx %g6, %g5, %o3 /* IEU0 */
|
|
|
+-
|
|
|
+- ba,pt %xcc, 11b /* CTI Group */
|
|
|
+- ldxa [%o1 + %o0] ASI_PNF, %g6 /* Load */
|
|
|
+-END(strcmp)
|
|
|
+-libc_hidden_def(strcmp)
|
|
|
+diff --git a/libc/string/sparc/sparc64/strcpy.S b/libc/string/sparc/sparc64/strcpy.S
|
|
|
+deleted file mode 100644
|
|
|
+index 28799e4..0000000
|
|
|
+--- a/libc/string/sparc/sparc64/strcpy.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,244 +0,0 @@
|
|
|
+-/* Copy SRC to DEST returning DEST.
|
|
|
+- For SPARC v9.
|
|
|
+- 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>.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <asm/asi.h>
|
|
|
+-#ifndef XCC
|
|
|
+- .register %g2, #scratch
|
|
|
+- .register %g3, #scratch
|
|
|
+- .register %g6, #scratch
|
|
|
+-#endif
|
|
|
+-
|
|
|
+- /* Normally, this uses
|
|
|
+- ((xword - 0x0101010101010101) & 0x8080808080808080) test
|
|
|
+- to find out if any byte in xword could be zero. This is fast, but
|
|
|
+- also gives false alarm for any byte in range 0x81-0xff. It does
|
|
|
+- not matter for correctness, as if this test tells us there could
|
|
|
+- be some zero byte, we check it byte by byte, but if bytes with
|
|
|
+- high bits set are common in the strings, then this will give poor
|
|
|
+- performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
|
|
+- will use one tick slower, but more precise test
|
|
|
+- ((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
|
|
|
+- which does not give any false alarms (but if some bits are set,
|
|
|
+- one cannot assume from it which bytes are zero and which are not).
|
|
|
+- It is yet to be measured, what is the correct default for glibc
|
|
|
+- in these days for an average user.
|
|
|
+- */
|
|
|
+-
|
|
|
+- .text
|
|
|
+- .align 32
|
|
|
+-ENTRY(strcpy)
|
|
|
+- sethi %hi(0x01010101), %g1 /* IEU0 Group */
|
|
|
+- mov %o0, %g6 /* IEU1 */
|
|
|
+- or %g1, %lo(0x01010101), %g1 /* IEU0 Group */
|
|
|
+- andcc %o0, 7, %g0 /* IEU1 */
|
|
|
+-
|
|
|
+- sllx %g1, 32, %g2 /* IEU0 Group */
|
|
|
+- bne,pn %icc, 12f /* CTI */
|
|
|
+- andcc %o1, 7, %g3 /* IEU1 */
|
|
|
+- or %g1, %g2, %g1 /* IEU0 Group */
|
|
|
+-
|
|
|
+- bne,pn %icc, 14f /* CTI */
|
|
|
+- sllx %g1, 7, %g2 /* IEU0 Group */
|
|
|
+-1: ldx [%o1], %o3 /* Load */
|
|
|
+- add %o1, 8, %o1 /* IEU1 */
|
|
|
+-
|
|
|
+-2: mov %o3, %g3 /* IEU0 Group */
|
|
|
+-3: sub %o3, %g1, %o2 /* IEU1 */
|
|
|
+- ldxa [%o1] ASI_PNF, %o3 /* Load */
|
|
|
+-#ifdef EIGHTBIT_NOT_RARE
|
|
|
+- andn %o2, %g3, %o2 /* IEU0 Group */
|
|
|
+-#endif
|
|
|
+- add %o0, 8, %o0 /* IEU0 Group */
|
|
|
+-
|
|
|
+- andcc %o2, %g2, %g0 /* IEU1 */
|
|
|
+- add %o1, 8, %o1 /* IEU0 Group */
|
|
|
+- be,a,pt %xcc, 2b /* CTI */
|
|
|
+- stx %g3, [%o0 - 8] /* Store */
|
|
|
+-
|
|
|
+- srlx %g3, 56, %g5 /* IEU0 Group */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 11f /* CTI */
|
|
|
+- srlx %g3, 48, %g4 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %g4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 10f /* CTI */
|
|
|
+- srlx %g3, 40, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 9f /* CTI */
|
|
|
+- srlx %g3, 32, %g4 /* IEU0 */
|
|
|
+- andcc %g4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 8f /* CTI */
|
|
|
+-
|
|
|
+- srlx %g3, 24, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 7f /* CTI */
|
|
|
+- srlx %g3, 16, %g4 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %g4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 6f /* CTI */
|
|
|
+- srlx %g3, 8, %g5 /* IEU0 */
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 5f /* CTI */
|
|
|
+- sub %o3, %g1, %o2 /* IEU0 */
|
|
|
+- stx %g3, [%o0 - 8] /* Store Group */
|
|
|
+- andcc %g3, 0xff, %g0 /* IEU1 */
|
|
|
+-
|
|
|
+- bne,pt %icc, 3b /* CTI */
|
|
|
+- mov %o3, %g3 /* IEU0 Group */
|
|
|
+-4: retl /* CTI+IEU1 Group */
|
|
|
+- mov %g6, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+- .align 16
|
|
|
+-5: stb %g5, [%o0 - 2] /* Store Group */
|
|
|
+- srlx %g3, 16, %g4 /* IEU0 */
|
|
|
+-6: sth %g4, [%o0 - 4] /* Store Group */
|
|
|
+- srlx %g3, 32, %g4 /* IEU0 */
|
|
|
+-
|
|
|
+- stw %g4, [%o0 - 8] /* Store Group */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+- 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 %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 %g6, %o0 /* IEU0 */
|
|
|
+-11: stb %g5, [%o0 - 8] /* Store Group */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+- mov %g6, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+-12: or %g1, %g2, %g1 /* IEU0 Group */
|
|
|
+- ldub [%o1], %o3 /* Load */
|
|
|
+- sllx %g1, 7, %g2 /* IEU0 Group */
|
|
|
+- stb %o3, [%o0] /* Store Group */
|
|
|
+-
|
|
|
+-13: add %o0, 1, %o0 /* IEU0 */
|
|
|
+- add %o1, 1, %o1 /* IEU1 */
|
|
|
+- andcc %o3, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 4b /* CTI */
|
|
|
+-
|
|
|
+- lduba [%o1] ASI_PNF, %o3 /* Load */
|
|
|
+- andcc %o0, 7, %g0 /* IEU1 Group */
|
|
|
+- bne,a,pt %icc, 13b /* CTI */
|
|
|
+- stb %o3, [%o0] /* Store */
|
|
|
+-
|
|
|
+- andcc %o1, 7, %g3 /* IEU1 Group */
|
|
|
+- be,a,pt %icc, 1b /* CTI */
|
|
|
+- ldx [%o1], %o3 /* Load */
|
|
|
+-14: orcc %g0, 64, %g4 /* IEU1 Group */
|
|
|
+-
|
|
|
+- sllx %g3, 3, %g5 /* IEU0 */
|
|
|
+- sub %o1, %g3, %o1 /* IEU0 Group */
|
|
|
+- sub %g4, %g5, %g4 /* IEU1 */
|
|
|
+- /* %g1 = 0101010101010101 *
|
|
|
+- * %g2 = 8080808080808080 *
|
|
|
+- * %g3 = source alignment *
|
|
|
+- * %g5 = number of bits to shift left *
|
|
|
+- * %g4 = number of bits to shift right */
|
|
|
+- ldxa [%o1] ASI_PNF, %o5 /* Load Group */
|
|
|
+-
|
|
|
+- addcc %o1, 8, %o1 /* IEU1 */
|
|
|
+-15: sllx %o5, %g5, %o3 /* IEU0 Group */
|
|
|
+- ldxa [%o1] ASI_PNF, %o5 /* Load */
|
|
|
+- srlx %o5, %g4, %o4 /* IEU0 Group */
|
|
|
+-
|
|
|
+- add %o0, 8, %o0 /* IEU1 */
|
|
|
+- or %o3, %o4, %o3 /* IEU0 Group */
|
|
|
+- add %o1, 8, %o1 /* IEU1 */
|
|
|
+- sub %o3, %g1, %o4 /* IEU0 Group */
|
|
|
+-
|
|
|
+-#ifdef EIGHTBIT_NOT_RARE
|
|
|
+- andn %o4, %o3, %o4 /* IEU0 Group */
|
|
|
+-#endif
|
|
|
+- andcc %o4, %g2, %g0 /* IEU1 Group */
|
|
|
+- be,a,pt %xcc, 15b /* CTI */
|
|
|
+- stx %o3, [%o0 - 8] /* Store */
|
|
|
+- srlx %o3, 56, %o4 /* IEU0 Group */
|
|
|
+-
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 22f /* CTI */
|
|
|
+- srlx %o3, 48, %o4 /* IEU0 */
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 21f /* CTI */
|
|
|
+- srlx %o3, 40, %o4 /* IEU0 */
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 20f /* CTI */
|
|
|
+-
|
|
|
+- srlx %o3, 32, %o4 /* IEU0 */
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 19f /* CTI */
|
|
|
+- srlx %o3, 24, %o4 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 18f /* CTI */
|
|
|
+- srlx %o3, 16, %o4 /* IEU0 */
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 17f /* CTI */
|
|
|
+- srlx %o3, 8, %o4 /* IEU0 */
|
|
|
+- andcc %o4, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 16f /* CTI */
|
|
|
+-
|
|
|
+- andcc %o3, 0xff, %g0 /* IEU1 Group */
|
|
|
+- bne,pn %icc, 15b /* CTI */
|
|
|
+- stx %o3, [%o0 - 8] /* Store */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+-
|
|
|
+- mov %g6, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+- .align 16
|
|
|
+-16: srlx %o3, 8, %o4 /* IEU0 Group */
|
|
|
+- stb %o4, [%o0 - 2] /* Store */
|
|
|
+-17: srlx %o3, 16, %o4 /* IEU0 Group */
|
|
|
+- stb %o4, [%o0 - 3] /* Store */
|
|
|
+-
|
|
|
+-18: srlx %o3, 24, %o4 /* IEU0 Group */
|
|
|
+- stb %o4, [%o0 - 4] /* Store */
|
|
|
+-19: srlx %o3, 32, %o4 /* IEU0 Group */
|
|
|
+- stw %o4, [%o0 - 8] /* Store */
|
|
|
+-
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+- mov %g6, %o0 /* IEU0 */
|
|
|
+- nop
|
|
|
+- nop
|
|
|
+-
|
|
|
+-20: srlx %o3, 40, %o4 /* IEU0 Group */
|
|
|
+- stb %o4, [%o0 - 6] /* Store */
|
|
|
+-21: srlx %o3, 48, %o4 /* IEU0 Group */
|
|
|
+- stb %o4, [%o0 - 7] /* Store */
|
|
|
+-
|
|
|
+-22: srlx %o3, 56, %o4 /* IEU0 Group */
|
|
|
+- stb %o4, [%o0 - 8] /* Store */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+- mov %g6, %o0 /* IEU0 */
|
|
|
+-END(strcpy)
|
|
|
+-
|
|
|
+-libc_hidden_def(strcpy)
|
|
|
+diff --git a/libc/string/sparc/sparc64/strlen.S b/libc/string/sparc/sparc64/strlen.S
|
|
|
+deleted file mode 100644
|
|
|
+index f58c1c2..0000000
|
|
|
+--- a/libc/string/sparc/sparc64/strlen.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,172 +0,0 @@
|
|
|
+-/* Determine the length of a string. For SPARC v9.
|
|
|
+- 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>.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <asm/asi.h>
|
|
|
+-
|
|
|
+- /* Normally, this uses
|
|
|
+- ((xword - 0x0101010101010101) & 0x8080808080808080) test
|
|
|
+- to find out if any byte in xword could be zero. This is fast, but
|
|
|
+- also gives false alarm for any byte in range 0x81-0xff. It does
|
|
|
+- not matter for correctness, as if this test tells us there could
|
|
|
+- be some zero byte, we check it byte by byte, but if bytes with
|
|
|
+- high bits set are common in the strings, then this will give poor
|
|
|
+- performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
|
|
+- will use one tick slower, but more precise test
|
|
|
+- ((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
|
|
|
+- which does not give any false alarms (but if some bits are set,
|
|
|
+- one cannot assume from it which bytes are zero and which are not).
|
|
|
+- It is yet to be measured, what is the correct default for glibc
|
|
|
+- in these days for an average user.
|
|
|
+- */
|
|
|
+-
|
|
|
+- .text
|
|
|
+- .align 32
|
|
|
+-ENTRY(strlen)
|
|
|
+- sethi %hi(0x01010101), %g1 /* IEU0 Group */
|
|
|
+- ldub [%o0], %o3 /* Load */
|
|
|
+- or %g1, %lo(0x01010101), %g1 /* IEU0 Group */
|
|
|
+- mov %o0, %o1 /* IEU1 */
|
|
|
+-
|
|
|
+- sllx %g1, 32, %g4 /* IEU0 Group */
|
|
|
+- andcc %o0, 7, %g0 /* IEU1 */
|
|
|
+- or %g1, %g4, %g1 /* IEU0 Group */
|
|
|
+- brz,pn %o3, 13f /* CTI+IEU1 */
|
|
|
+-
|
|
|
+- sllx %g1, 7, %g4 /* IEU0 Group */
|
|
|
+- bne,a,pn %icc, 15f /* CTI */
|
|
|
+- add %o0, 1, %o0 /* IEU1 */
|
|
|
+- /* %g1 = 0x0101010101010101 *
|
|
|
+- * %g4 = 0x8080808080808080 *
|
|
|
+- * %o0 = string pointer *
|
|
|
+- * %o1 = start of string */
|
|
|
+-1: ldx [%o0], %o3 /* Load Group */
|
|
|
+-
|
|
|
+- add %o0, 8, %o0 /* IEU1 */
|
|
|
+-2: sub %o3, %g1, %o2 /* IEU0 Group */
|
|
|
+-#ifdef EIGHTBIT_NOT_RARE
|
|
|
+- andn %o2, %o3, %o5 /* IEU0 Group */
|
|
|
+- ldxa [%o0] ASI_PNF, %o3 /* Load */
|
|
|
+- andcc %o5, %g4, %g0 /* IEU1 Group */
|
|
|
+-#else
|
|
|
+- ldxa [%o0] ASI_PNF, %o3 /* Load */
|
|
|
+- andcc %o2, %g4, %g0 /* IEU1 Group */
|
|
|
+-#endif
|
|
|
+-
|
|
|
+- be,pt %xcc, 2b /* CTI */
|
|
|
+- add %o0, 8, %o0 /* IEU0 */
|
|
|
+- addcc %o2, %g1, %g5 /* IEU1 Group */
|
|
|
+-#ifdef EIGHTBIT_NOT_RARE
|
|
|
+- srlx %o5, 32, %o5 /* IEU0 */
|
|
|
+-
|
|
|
+-3: andcc %o5, %g4, %g0 /* IEU1 Group */
|
|
|
+-#else
|
|
|
+- srlx %o2, 32, %o2 /* IEU0 */
|
|
|
+-
|
|
|
+-3: andcc %o2, %g4, %g0 /* IEU1 Group */
|
|
|
+-#endif
|
|
|
+- be,pn %xcc, 4f /* CTI */
|
|
|
+- srlx %g5, 56, %o2 /* IEU0 */
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 12f /* CTI */
|
|
|
+- srlx %g5, 48, %o2 /* IEU0 */
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 11f /* CTI */
|
|
|
+-
|
|
|
+- srlx %g5, 40, %o2 /* IEU0 */
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 10f /* CTI */
|
|
|
+- srlx %g5, 32, %o2 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 9f /* CTI */
|
|
|
+-4: srlx %g5, 24, %o2 /* IEU0 */
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pn %icc, 8f /* CTI */
|
|
|
+- srlx %g5, 16, %o2 /* IEU0 */
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 7f /* CTI */
|
|
|
+-
|
|
|
+- srlx %g5, 8, %o2 /* IEU0 */
|
|
|
+- andcc %o2, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 6f /* CTI */
|
|
|
+- sub %o3, %g1, %o2 /* IEU0 */
|
|
|
+-
|
|
|
+- andcc %g5, 0xff, %g0 /* IEU1 Group */
|
|
|
+- be,pn %icc, 5f /* CTI */
|
|
|
+- ldxa [%o0] ASI_PNF, %o3 /* Load */
|
|
|
+- andcc %o2, %g4, %g0 /* IEU1 Group */
|
|
|
+-
|
|
|
+- be,pt %xcc, 2b /* CTI */
|
|
|
+- add %o0, 8, %o0 /* IEU0 */
|
|
|
+- addcc %o2, %g1, %g5 /* IEU1 Group */
|
|
|
+- ba,pt %xcc, 3b /* CTI */
|
|
|
+-
|
|
|
+- srlx %o2, 32, %o2 /* IEU0 */
|
|
|
+-5: add %o0, -9, %o0 /* IEU0 Group */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+- sub %o0, %o1, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+-6: add %o0, -10, %o0 /* IEU0 Group */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+- sub %o0, %o1, %o0 /* IEU0 */
|
|
|
+-7: add %o0, -11, %o0 /* IEU0 Group */
|
|
|
+-
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+- sub %o0, %o1, %o0 /* IEU0 */
|
|
|
+-8: add %o0, -12, %o0 /* IEU0 Group */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+-
|
|
|
+- sub %o0, %o1, %o0 /* IEU0 */
|
|
|
+-9: add %o0, -13, %o0 /* IEU0 Group */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+- sub %o0, %o1, %o0 /* IEU0 */
|
|
|
+-
|
|
|
+-10: add %o0, -14, %o0 /* IEU0 Group */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+- sub %o0, %o1, %o0 /* IEU0 */
|
|
|
+-11: add %o0, -15, %o0 /* IEU0 Group */
|
|
|
+-
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+- sub %o0, %o1, %o0 /* IEU0 */
|
|
|
+-12: add %o0, -16, %o0 /* IEU0 Group */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+-
|
|
|
+- sub %o0, %o1, %o0 /* IEU0 */
|
|
|
+-13: retl /* CTI+IEU1 Group */
|
|
|
+- mov 0, %o0 /* IEU0 */
|
|
|
+- nop
|
|
|
+-
|
|
|
+-15: ldub [%o0], %o3 /* Load Group */
|
|
|
+-16: andcc %o0, 7, %g0 /* IEU1 */
|
|
|
+- be,pn %icc, 1b /* CTI */
|
|
|
+- nop /* IEU0 Group */
|
|
|
+-
|
|
|
+- add %o0, 1, %o0 /* IEU1 */
|
|
|
+- andcc %o3, 0xff, %g0 /* IEU1 Group */
|
|
|
+- bne,a,pt %icc, 16b /* CTI */
|
|
|
+- lduba [%o0] ASI_PNF, %o3 /* Load */
|
|
|
+-
|
|
|
+- add %o0, -1, %o0 /* IEU0 Group */
|
|
|
+- retl /* CTI+IEU1 Group */
|
|
|
+- sub %o0, %o1, %o0 /* IEU0 */
|
|
|
+-END(strlen)
|
|
|
+-libc_hidden_def(strlen)
|
|
|
+diff --git a/libc/sysdeps/linux/sparc/bits/setjmp.h b/libc/sysdeps/linux/sparc/bits/setjmp.h
|
|
|
+index 5ec4da5..26f6212 100644
|
|
|
+--- a/libc/sysdeps/linux/sparc/bits/setjmp.h
|
|
|
++++ b/libc/sysdeps/linux/sparc/bits/setjmp.h
|
|
|
+@@ -25,37 +25,6 @@
|
|
|
+
|
|
|
+ #include <bits/wordsize.h>
|
|
|
+
|
|
|
+-#if 0 /*__WORDSIZE == 64*/
|
|
|
+-
|
|
|
+-typedef struct __sparc64_jmp_buf
|
|
|
+- {
|
|
|
+- struct __sparc64_jmp_buf *uc_link;
|
|
|
+- unsigned long uc_flags;
|
|
|
+- unsigned long uc_sigmask;
|
|
|
+- struct __sparc64_jmp_buf_mcontext
|
|
|
+- {
|
|
|
+- unsigned long mc_gregs[19];
|
|
|
+- unsigned long mc_fp;
|
|
|
+- unsigned long mc_i7;
|
|
|
+- struct __sparc64_jmp_buf_fpu
|
|
|
+- {
|
|
|
+- union
|
|
|
+- {
|
|
|
+- unsigned int sregs[32];
|
|
|
+- unsigned long dregs[32];
|
|
|
+- long double qregs[16];
|
|
|
+- } mcfpu_fpregs;
|
|
|
+- unsigned long mcfpu_fprs;
|
|
|
+- unsigned long mcfpu_gsr;
|
|
|
+- void *mcfpu_fq;
|
|
|
+- unsigned char mcfpu_qcnt;
|
|
|
+- unsigned char mcfpu_qentsz;
|
|
|
+- unsigned char mcfpu_enab;
|
|
|
+- } mc_fpregs;
|
|
|
+- } uc_mcontext;
|
|
|
+- } __jmp_buf[1];
|
|
|
+-#else
|
|
|
+ typedef int __jmp_buf[3];
|
|
|
+-#endif
|
|
|
+
|
|
|
+ #endif /* bits/setjmp.h */
|
|
|
+diff --git a/libc/sysdeps/linux/sparc/bits/sigcontext.h b/libc/sysdeps/linux/sparc/bits/sigcontext.h
|
|
|
+index 9435485..251032f 100644
|
|
|
+--- a/libc/sysdeps/linux/sparc/bits/sigcontext.h
|
|
|
++++ b/libc/sysdeps/linux/sparc/bits/sigcontext.h
|
|
|
+@@ -21,8 +21,6 @@
|
|
|
+
|
|
|
+ #include <bits/wordsize.h>
|
|
|
+
|
|
|
+-#if __WORDSIZE == 32
|
|
|
+-
|
|
|
+ /* It is quite hard to choose what to put here, because
|
|
|
+ Linux/sparc32 had at least 3 totally incompatible
|
|
|
+ signal stack layouts.
|
|
|
+@@ -42,36 +40,3 @@ struct sigcontext
|
|
|
+ int si_mask;
|
|
|
+ };
|
|
|
+
|
|
|
+-#else /* sparc64 */
|
|
|
+-
|
|
|
+-typedef struct
|
|
|
+- {
|
|
|
+- unsigned int si_float_regs [64];
|
|
|
+- unsigned long si_fsr;
|
|
|
+- unsigned long si_gsr;
|
|
|
+- unsigned long si_fprs;
|
|
|
+- } __siginfo_fpu_t;
|
|
|
+-
|
|
|
+-struct sigcontext
|
|
|
+- {
|
|
|
+- char sigc_info[128];
|
|
|
+- struct
|
|
|
+- {
|
|
|
+- unsigned long u_regs[16]; /* globals and ins */
|
|
|
+- unsigned long tstate;
|
|
|
+- unsigned long tpc;
|
|
|
+- unsigned long tnpc;
|
|
|
+- unsigned int y;
|
|
|
+- unsigned int fprs;
|
|
|
+- } sigc_regs;
|
|
|
+- __siginfo_fpu_t * sigc_fpu_save;
|
|
|
+- struct
|
|
|
+- {
|
|
|
+- void * ss_sp;
|
|
|
+- int ss_flags;
|
|
|
+- unsigned long ss_size;
|
|
|
+- } sigc_stack;
|
|
|
+- unsigned long sigc_mask;
|
|
|
+-};
|
|
|
+-
|
|
|
+-#endif /* sparc64 */
|
|
|
+diff --git a/libc/sysdeps/linux/sparc/crt1.S b/libc/sysdeps/linux/sparc/crt1.S
|
|
|
+index 25b5ee5..77e9147 100644
|
|
|
+--- a/libc/sysdeps/linux/sparc/crt1.S
|
|
|
++++ b/libc/sysdeps/linux/sparc/crt1.S
|
|
|
+@@ -39,16 +39,9 @@
|
|
|
+ #include <features.h>
|
|
|
+ #include <bits/wordsize.h>
|
|
|
+
|
|
|
+-/* macro out the 32 / 64 bit differences */
|
|
|
+-#if __WORDSIZE == 32
|
|
|
+ # define STACK_BIAS 0
|
|
|
+ # define ELE_SIZE 4
|
|
|
+ # define LD ld
|
|
|
+-#else
|
|
|
+-# define STACK_BIAS 2047 /* see glibc/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h */
|
|
|
+-# define ELE_SIZE 8
|
|
|
+-# define LD ldx
|
|
|
+-#endif
|
|
|
+
|
|
|
+ .text
|
|
|
+ .align 4
|
|
|
+@@ -116,11 +109,7 @@ _start:
|
|
|
+ nop
|
|
|
+
|
|
|
+ /* Die very horribly if exit returns. */
|
|
|
+-#if __WORDSIZE == 32
|
|
|
+ unimp
|
|
|
+-#else
|
|
|
+- illtrap 0
|
|
|
+-#endif
|
|
|
+
|
|
|
+ .size _start,.-_start
|
|
|
+
|
|
|
+diff --git a/libc/sysdeps/linux/sparc/jmpbuf-unwind.h b/libc/sysdeps/linux/sparc/jmpbuf-unwind.h
|
|
|
+index 40303f0..eabfad8 100644
|
|
|
+--- a/libc/sysdeps/linux/sparc/jmpbuf-unwind.h
|
|
|
++++ b/libc/sysdeps/linux/sparc/jmpbuf-unwind.h
|
|
|
+@@ -6,26 +6,8 @@
|
|
|
+ #include <setjmp.h>
|
|
|
+ #include <jmpbuf-offsets.h>
|
|
|
+
|
|
|
+-#if __WORDSIZE == 64
|
|
|
+-
|
|
|
+-/* Test if longjmp to JMPBUF would unwind the frame
|
|
|
+- containing a local variable at ADDRESS. */
|
|
|
+-#define _JMPBUF_UNWINDS(jmpbuf, address) \
|
|
|
+- ((unsigned long int) (address) < (jmpbuf)->uc_mcontext.mc_fp)
|
|
|
+-
|
|
|
+-#else
|
|
|
+-
|
|
|
+ /* Test if longjmp to JMPBUF would unwind the frame
|
|
|
+ containing a local variable at ADDRESS. */
|
|
|
+ #define _JMPBUF_UNWINDS(jmpbuf, address) \
|
|
|
+ ((int) (address) < (jmpbuf)[JB_SP])
|
|
|
+
|
|
|
+-#endif
|
|
|
+-
|
|
|
+-#ifdef __UCLIBC_HAS_THREADS_NATIVE__
|
|
|
+-#if defined(__arch64__)
|
|
|
+-#include "sparc64/jmpbuf-unwind.h"
|
|
|
+-#else
|
|
|
+-#include "sparc32/jmpbuf-unwind.h"
|
|
|
+-#endif
|
|
|
+-#endif
|
|
|
+diff --git a/libc/sysdeps/linux/sparc/qp_ops.c b/libc/sysdeps/linux/sparc/qp_ops.c
|
|
|
+index 123be53..97f98da 100644
|
|
|
+--- a/libc/sysdeps/linux/sparc/qp_ops.c
|
|
|
++++ b/libc/sysdeps/linux/sparc/qp_ops.c
|
|
|
+@@ -1,5 +1,3 @@
|
|
|
+-/* XXX add ops from glibc sysdeps/sparc/sparc64/soft-fp */
|
|
|
+-
|
|
|
+ #include <stdio.h>
|
|
|
+ #include <stdlib.h>
|
|
|
+
|
|
|
+@@ -9,11 +7,7 @@ static void fakedef(void)
|
|
|
+ exit(-1);
|
|
|
+ }
|
|
|
+
|
|
|
+-#ifdef __sparc_v9__
|
|
|
+-# define fakedef(sym) strong_alias(fakedef, _Qp_##sym)
|
|
|
+-#else
|
|
|
+ # define fakedef(sym) strong_alias(fakedef, _Q_##sym)
|
|
|
+-#endif
|
|
|
+
|
|
|
+ fakedef(fne)
|
|
|
+ fakedef(feq)
|
|
|
+@@ -31,7 +25,6 @@ fakedef(qtos)
|
|
|
+ fakedef(stoq)
|
|
|
+ fakedef(itoq)
|
|
|
+ fakedef(add)
|
|
|
+-#ifndef __sparc_v9__
|
|
|
+ fakedef(qtou)
|
|
|
+ fakedef(utoq)
|
|
|
+ fakedef(cmp)
|
|
|
+@@ -44,4 +37,3 @@ fakedef(qtoll)
|
|
|
+ fakedef(qtoull)
|
|
|
+ fakedef(sqrt)
|
|
|
+ fakedef(ulltoq)
|
|
|
+-#endif
|
|
|
+diff --git a/libc/sysdeps/linux/sparc/sparcv9/clone.S b/libc/sysdeps/linux/sparc/sparcv9/clone.S
|
|
|
+deleted file mode 100644
|
|
|
+index 2ee62a0..0000000
|
|
|
+--- a/libc/sysdeps/linux/sparc/sparcv9/clone.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,101 +0,0 @@
|
|
|
+-/* Copyright (C) 1997, 2000, 2007 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Richard Henderson (rth@tamu.edu).
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-/* clone() is even more special than fork() as it mucks with stacks
|
|
|
+- and invokes a function in the right context after its all over. */
|
|
|
+-
|
|
|
+-#include <asm/errno.h>
|
|
|
+-#include <asm/unistd.h>
|
|
|
+-#include <tcb-offsets.h>
|
|
|
+-#include <sysdep.h>
|
|
|
+-
|
|
|
+-#define CLONE_VM 0x00000100
|
|
|
+-#define CLONE_THREAD 0x00010000
|
|
|
+-
|
|
|
+-/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg,
|
|
|
+- pid_t *ptid, void *tls, pid_t *ctid); */
|
|
|
+-
|
|
|
+- .register %g2,#scratch
|
|
|
+- .register %g3,#scratch
|
|
|
+-
|
|
|
+- .text
|
|
|
+-
|
|
|
+-ENTRY (__clone)
|
|
|
+- save %sp, -192, %sp
|
|
|
+- cfi_def_cfa_register(%fp)
|
|
|
+- cfi_window_save
|
|
|
+- cfi_register(%o7, %i7)
|
|
|
+-
|
|
|
+- /* sanity check arguments */
|
|
|
+- brz,pn %i0, 99f /* fn non-NULL? */
|
|
|
+- mov %i0, %g2
|
|
|
+- brz,pn %i1, 99f /* child_stack non-NULL? */
|
|
|
+- mov %i2, %o0 /* clone flags */
|
|
|
+-
|
|
|
+- /* The child_stack is the top of the stack, allocate one
|
|
|
+- whole stack frame from that as this is what the kernel
|
|
|
+- expects. Also, subtract STACK_BIAS. */
|
|
|
+- sub %i1, 192 + 0x7ff, %o1
|
|
|
+- mov %i3, %g3
|
|
|
+- mov %i2, %g4
|
|
|
+-
|
|
|
+- mov %i4,%o2 /* PTID */
|
|
|
+- mov %i5,%o3 /* TLS */
|
|
|
+- ldx [%fp+0x7ff+176],%o4 /* CTID */
|
|
|
+-
|
|
|
+- /* Do the system call */
|
|
|
+- set __NR_clone, %g1
|
|
|
+- ta 0x6d
|
|
|
+- bcs,pn %xcc, 98f
|
|
|
+- nop
|
|
|
+- brnz,pn %o1, __thread_start
|
|
|
+- nop
|
|
|
+- jmpl %i7 + 8, %g0
|
|
|
+- restore %o0, %g0, %o0
|
|
|
+-99: mov EINVAL, %o0
|
|
|
+-98: call HIDDEN_JUMPTARGET(__errno_location)
|
|
|
+- mov %o0, %i0
|
|
|
+- st %i0, [%o0]
|
|
|
+- jmpl %i7 + 8, %g0
|
|
|
+- restore %g0,-1,%o0
|
|
|
+-END(__clone)
|
|
|
+-
|
|
|
+- .type __thread_start,@function
|
|
|
+-__thread_start:
|
|
|
+-#ifdef RESET_PID
|
|
|
+- sethi %hi(CLONE_THREAD), %l0
|
|
|
+- andcc %g4, %l0, %g0
|
|
|
+- bne,pt %icc, 1f
|
|
|
+- andcc %g4, CLONE_VM, %g0
|
|
|
+- bne,a,pn %icc, 2f
|
|
|
+- mov -1,%o0
|
|
|
+- set __NR_getpid,%g1
|
|
|
+- ta 0x6d
|
|
|
+-2: st %o0,[%g7 + PID]
|
|
|
+- st %o0,[%g7 + TID]
|
|
|
+-1:
|
|
|
+-#endif
|
|
|
+- mov %g0, %fp /* terminate backtrace */
|
|
|
+- call %g2
|
|
|
+- mov %g3,%o0
|
|
|
+- call HIDDEN_JUMPTARGET(_exit),0
|
|
|
+- nop
|
|
|
+-
|
|
|
+- .size __thread_start, .-__thread_start
|
|
|
+-
|
|
|
+-weak_alias (__clone, clone)
|
|
|
+diff --git a/libc/sysdeps/linux/sparc/sparcv9/rem.S b/libc/sysdeps/linux/sparc/sparcv9/rem.S
|
|
|
+deleted file mode 100644
|
|
|
+index 1474e32..0000000
|
|
|
+--- a/libc/sysdeps/linux/sparc/sparcv9/rem.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,20 +0,0 @@
|
|
|
+-/*
|
|
|
+- * Sparc v9 has divide.
|
|
|
+- * As divx takes 68 cycles and sdivcc only 36,
|
|
|
+- * we use sdivcc eventhough it is deprecated.
|
|
|
+- */
|
|
|
+-
|
|
|
+- .text
|
|
|
+- .align 32
|
|
|
+-ENTRY(.rem)
|
|
|
+-
|
|
|
+- sra %o0, 31, %o2
|
|
|
+- wr %o2, 0, %y
|
|
|
+- sdivcc %o0, %o1, %o2
|
|
|
+- xnor %o2, %g0, %o3
|
|
|
+- movvs %icc, %o3, %o2
|
|
|
+- smul %o2, %o1, %o2
|
|
|
+- retl
|
|
|
+- sub %o0, %o2, %o0
|
|
|
+-
|
|
|
+-END(.rem)
|
|
|
+diff --git a/libc/sysdeps/linux/sparc/sparcv9/sdiv.S b/libc/sysdeps/linux/sparc/sparcv9/sdiv.S
|
|
|
+deleted file mode 100644
|
|
|
+index 45535bb..0000000
|
|
|
+--- a/libc/sysdeps/linux/sparc/sparcv9/sdiv.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,18 +0,0 @@
|
|
|
+-/*
|
|
|
+- * Sparc v9 has divide.
|
|
|
+- * As divx takes 68 cycles and sdivcc only 36,
|
|
|
+- * we use sdivcc eventhough it is deprecated.
|
|
|
+- */
|
|
|
+-
|
|
|
+- .text
|
|
|
+- .align 32
|
|
|
+-ENTRY(.div)
|
|
|
+-
|
|
|
+- sra %o0, 31, %o2
|
|
|
+- wr %o2, 0, %y
|
|
|
+- sdivcc %o0, %o1, %o0
|
|
|
+- xnor %o0, %g0, %o2
|
|
|
+- retl
|
|
|
+- movvs %icc, %o2, %o0
|
|
|
+-
|
|
|
+-END(.div)
|
|
|
+diff --git a/libc/sysdeps/linux/sparc/sparcv9/udiv.S b/libc/sysdeps/linux/sparc/sparcv9/udiv.S
|
|
|
+deleted file mode 100644
|
|
|
+index 303f29b..0000000
|
|
|
+--- a/libc/sysdeps/linux/sparc/sparcv9/udiv.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,15 +0,0 @@
|
|
|
+-/*
|
|
|
+- * Sparc v9 has divide.
|
|
|
+- * As divx takes 68 cycles and udiv only 37,
|
|
|
+- * we use udiv eventhough it is deprecated.
|
|
|
+- */
|
|
|
+-
|
|
|
+- .text
|
|
|
+- .align 32
|
|
|
+-ENTRY(.udiv)
|
|
|
+-
|
|
|
+- wr %g0, 0, %y
|
|
|
+- retl
|
|
|
+- udiv %o0, %o1, %o0
|
|
|
+-
|
|
|
+-END(.udiv)
|
|
|
+diff --git a/libc/sysdeps/linux/sparc/sparcv9/umul.S b/libc/sysdeps/linux/sparc/sparcv9/umul.S
|
|
|
+deleted file mode 100644
|
|
|
+index e65e4b9..0000000
|
|
|
+--- a/libc/sysdeps/linux/sparc/sparcv9/umul.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,15 +0,0 @@
|
|
|
+-/*
|
|
|
+- * Sparc v9 has multiply.
|
|
|
+- */
|
|
|
+-
|
|
|
+- .text
|
|
|
+- .align 32
|
|
|
+-ENTRY(.umul)
|
|
|
+-
|
|
|
+- srl %o0, 0, %o0
|
|
|
+- srl %o1, 0, %o1
|
|
|
+- mulx %o0, %o1, %o0
|
|
|
+- retl
|
|
|
+- srlx %o0, 32, %o1
|
|
|
+-
|
|
|
+-END(.umul)
|
|
|
+diff --git a/libc/sysdeps/linux/sparc/sparcv9/urem.S b/libc/sysdeps/linux/sparc/sparcv9/urem.S
|
|
|
+deleted file mode 100644
|
|
|
+index 9354269..0000000
|
|
|
+--- a/libc/sysdeps/linux/sparc/sparcv9/urem.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,17 +0,0 @@
|
|
|
+-/*
|
|
|
+- * Sparc v9 has divide.
|
|
|
+- * As divx takes 68 cycles and udiv only 37,
|
|
|
+- * we use udiv eventhough it is deprecated.
|
|
|
+- */
|
|
|
+-
|
|
|
+- .text
|
|
|
+- .align 32
|
|
|
+-ENTRY(.urem)
|
|
|
+-
|
|
|
+- wr %g0, 0, %y
|
|
|
+- udiv %o0, %o1, %o2
|
|
|
+- umul %o2, %o1, %o2
|
|
|
+- retl
|
|
|
+- sub %o0, %o2, %o0
|
|
|
+-
|
|
|
+-END(.urem)
|
|
|
+diff --git a/libc/sysdeps/linux/sparc/sys/procfs.h b/libc/sysdeps/linux/sparc/sys/procfs.h
|
|
|
+index 37d6a61..edbd5a5 100644
|
|
|
+--- a/libc/sysdeps/linux/sparc/sys/procfs.h
|
|
|
++++ b/libc/sysdeps/linux/sparc/sys/procfs.h
|
|
|
+@@ -32,20 +32,6 @@
|
|
|
+
|
|
|
+ __BEGIN_DECLS
|
|
|
+
|
|
|
+-#if __WORDSIZE == 64
|
|
|
+-
|
|
|
+-#define ELF_NGREG 36
|
|
|
+-
|
|
|
+-typedef struct
|
|
|
+- {
|
|
|
+- unsigned long pr_regs[32];
|
|
|
+- unsigned long pr_fsr;
|
|
|
+- unsigned long pr_gsr;
|
|
|
+- unsigned long pr_fprs;
|
|
|
+- } elf_fpregset_t;
|
|
|
+-
|
|
|
+-#else /* sparc32 */
|
|
|
+-
|
|
|
+ #define ELF_NGREG 38
|
|
|
+
|
|
|
+ typedef struct
|
|
|
+@@ -63,8 +49,6 @@ typedef struct
|
|
|
+ unsigned int pr_q[64];
|
|
|
+ } elf_fpregset_t;
|
|
|
+
|
|
|
+-#endif /* sparc32 */
|
|
|
+-
|
|
|
+ typedef unsigned long elf_greg_t;
|
|
|
+ typedef elf_greg_t elf_gregset_t[ELF_NGREG];
|
|
|
+
|
|
|
+@@ -110,13 +94,8 @@ struct elf_prpsinfo
|
|
|
+ char pr_zomb; /* Zombie. */
|
|
|
+ char pr_nice; /* Nice val. */
|
|
|
+ unsigned long int pr_flag; /* Flags. */
|
|
|
+-#if __WORDSIZE == 64
|
|
|
+- unsigned int pr_uid;
|
|
|
+- unsigned int pr_gid;
|
|
|
+-#else
|
|
|
+ unsigned short int pr_uid;
|
|
|
+ unsigned short int pr_gid;
|
|
|
+-#endif
|
|
|
+ int pr_pid, pr_ppid, pr_pgrp, pr_sid;
|
|
|
+ /* Lots missing */
|
|
|
+ char pr_fname[16]; /* Filename of executable. */
|
|
|
+@@ -138,73 +117,6 @@ typedef __pid_t lwpid_t;
|
|
|
+ typedef struct elf_prstatus prstatus_t;
|
|
|
+ typedef struct elf_prpsinfo prpsinfo_t;
|
|
|
+
|
|
|
+-#if __WORDSIZE == 64
|
|
|
+-
|
|
|
+-/* Provide 32-bit variants so that BFD can read 32-bit
|
|
|
+- core files. */
|
|
|
+-#define ELF_NGREG32 38
|
|
|
+-typedef struct
|
|
|
+- {
|
|
|
+- union
|
|
|
+- {
|
|
|
+- unsigned int pr_regs[32];
|
|
|
+- double pr_dregs[16];
|
|
|
+- } pr_fr;
|
|
|
+- unsigned int __unused;
|
|
|
+- unsigned int pr_fsr;
|
|
|
+- unsigned char pr_qcnt;
|
|
|
+- unsigned char pr_q_entrysize;
|
|
|
+- unsigned char pr_en;
|
|
|
+- unsigned int pr_q[64];
|
|
|
+- } elf_fpregset_t32;
|
|
|
+-
|
|
|
+-typedef unsigned int elf_greg_t32;
|
|
|
+-typedef elf_greg_t32 elf_gregset_t32[ELF_NGREG32];
|
|
|
+-
|
|
|
+-struct elf_prstatus32
|
|
|
+- {
|
|
|
+- struct elf_siginfo pr_info; /* Info associated with signal. */
|
|
|
+- short int pr_cursig; /* Current signal. */
|
|
|
+- unsigned int pr_sigpend; /* Set of pending signals. */
|
|
|
+- unsigned int pr_sighold; /* Set of held signals. */
|
|
|
+- __pid_t pr_pid;
|
|
|
+- __pid_t pr_ppid;
|
|
|
+- __pid_t pr_pgrp;
|
|
|
+- __pid_t pr_sid;
|
|
|
+- struct
|
|
|
+- {
|
|
|
+- int tv_sec, tv_usec;
|
|
|
+- } pr_utime, /* User time. */
|
|
|
+- pr_stime, /* System time. */
|
|
|
+- pr_cutime, /* Cumulative user time. */
|
|
|
+- pr_cstime; /* Cumulative system time. */
|
|
|
+- elf_gregset_t32 pr_reg; /* GP registers. */
|
|
|
+- int pr_fpvalid; /* True if math copro being used. */
|
|
|
+- };
|
|
|
+-
|
|
|
+-struct elf_prpsinfo32
|
|
|
+- {
|
|
|
+- char pr_state; /* Numeric process state. */
|
|
|
+- char pr_sname; /* Char for pr_state. */
|
|
|
+- char pr_zomb; /* Zombie. */
|
|
|
+- char pr_nice; /* Nice val. */
|
|
|
+- unsigned int pr_flag; /* Flags. */
|
|
|
+- unsigned short int pr_uid;
|
|
|
+- unsigned short int pr_gid;
|
|
|
+- int pr_pid, pr_ppid, pr_pgrp, pr_sid;
|
|
|
+- /* Lots missing */
|
|
|
+- char pr_fname[16]; /* Filename of executable. */
|
|
|
+- char pr_psargs[ELF_PRARGSZ]; /* Initial part of arg list. */
|
|
|
+- };
|
|
|
+-
|
|
|
+-typedef elf_gregset_t32 prgregset32_t;
|
|
|
+-typedef elf_fpregset_t32 prfpregset32_t;
|
|
|
+-
|
|
|
+-typedef struct elf_prstatus32 prstatus32_t;
|
|
|
+-typedef struct elf_prpsinfo32 prpsinfo32_t;
|
|
|
+-
|
|
|
+-#endif /* sparc64 */
|
|
|
+-
|
|
|
+ __END_DECLS
|
|
|
+
|
|
|
+ #endif /* sys/procfs.h */
|
|
|
+diff --git a/libpthread/linuxthreads.old/sysdeps/sparc/pt-machine.h b/libpthread/linuxthreads.old/sysdeps/sparc/pt-machine.h
|
|
|
+index ab90810..d502c75 100644
|
|
|
+--- a/libpthread/linuxthreads.old/sysdeps/sparc/pt-machine.h
|
|
|
++++ b/libpthread/linuxthreads.old/sysdeps/sparc/pt-machine.h
|
|
|
+@@ -1,8 +1,82 @@
|
|
|
+-#include <features.h>
|
|
|
+-#include <bits/wordsize.h>
|
|
|
++/* Machine-dependent pthreads configuration and inline functions.
|
|
|
++ sparc version.
|
|
|
++ 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>.
|
|
|
+
|
|
|
+-#if __WORDSIZE == 32
|
|
|
+-# include "sparc32/pt-machine.h"
|
|
|
+-#else
|
|
|
+-# include "sparc64/pt-machine.h"
|
|
|
++ 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; see the file COPYING.LIB. If
|
|
|
++ not, see <http://www.gnu.org/licenses/>. */
|
|
|
++
|
|
|
++#ifndef _PT_MACHINE_H
|
|
|
++#define _PT_MACHINE_H 1
|
|
|
++
|
|
|
++#ifndef PT_EI
|
|
|
++# define PT_EI __extern_always_inline
|
|
|
+ #endif
|
|
|
++
|
|
|
++extern long int testandset (int *spinlock);
|
|
|
++extern int __compare_and_swap (long int *p, long int oldval, long int newval);
|
|
|
++
|
|
|
++/* Spinlock implementation; required. */
|
|
|
++PT_EI long int
|
|
|
++testandset (int *spinlock)
|
|
|
++{
|
|
|
++ int ret;
|
|
|
++
|
|
|
++ __asm__ __volatile__("ldstub %1,%0"
|
|
|
++ : "=r"(ret), "=m"(*spinlock)
|
|
|
++ : "m"(*spinlock));
|
|
|
++
|
|
|
++ return ret;
|
|
|
++}
|
|
|
++
|
|
|
++
|
|
|
++/* Memory barrier; default is to do nothing */
|
|
|
++#define MEMORY_BARRIER() __asm__ __volatile__("stbar" : : : "memory")
|
|
|
++
|
|
|
++
|
|
|
++/* Get some notion of the current stack. Need not be exactly the top
|
|
|
++ of the stack, just something somewhere in the current frame. */
|
|
|
++#define CURRENT_STACK_FRAME (stack_pointer + (2 * 64))
|
|
|
++register char *stack_pointer __asm__("%sp");
|
|
|
++
|
|
|
++
|
|
|
++/* 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__("%g7");
|
|
|
++
|
|
|
++/* Return the thread descriptor for the current thread. */
|
|
|
++#define THREAD_SELF __thread_self
|
|
|
++
|
|
|
++/* Initialize the thread-unique value. */
|
|
|
++#define INIT_THREAD_SELF(descr, nr) (__thread_self = (descr))
|
|
|
++
|
|
|
++/* Access to data in the thread descriptor is easy. */
|
|
|
++#define THREAD_GETMEM(descr, member) \
|
|
|
++ ((void) sizeof (descr), THREAD_SELF->member)
|
|
|
++#define THREAD_GETMEM_NC(descr, member) \
|
|
|
++ ((void) sizeof (descr), THREAD_SELF->member)
|
|
|
++#define THREAD_SETMEM(descr, member, value) \
|
|
|
++ ((void) sizeof (descr), THREAD_SELF->member = (value))
|
|
|
++#define THREAD_SETMEM_NC(descr, member, value) \
|
|
|
++ ((void) sizeof (descr), THREAD_SELF->member = (value))
|
|
|
++
|
|
|
++/* We want the OS to assign stack addresses. */
|
|
|
++#define FLOATING_STACKS 1
|
|
|
++
|
|
|
++/* Maximum size of the stack if the rlimit is unlimited. */
|
|
|
++#define ARCH_STACK_MAX_SIZE 8*1024*1024
|
|
|
++
|
|
|
++#endif /* pt-machine.h */
|
|
|
+diff --git a/libpthread/linuxthreads.old/sysdeps/sparc/sparc32/pt-machine.h b/libpthread/linuxthreads.old/sysdeps/sparc/sparc32/pt-machine.h
|
|
|
+deleted file mode 100644
|
|
|
+index d502c75..0000000
|
|
|
+--- a/libpthread/linuxthreads.old/sysdeps/sparc/sparc32/pt-machine.h
|
|
|
++++ /dev/null
|
|
|
+@@ -1,82 +0,0 @@
|
|
|
+-/* Machine-dependent pthreads configuration and inline functions.
|
|
|
+- sparc version.
|
|
|
+- 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>.
|
|
|
+-
|
|
|
+- 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; see the file COPYING.LIB. If
|
|
|
+- not, see <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#ifndef _PT_MACHINE_H
|
|
|
+-#define _PT_MACHINE_H 1
|
|
|
+-
|
|
|
+-#ifndef PT_EI
|
|
|
+-# define PT_EI __extern_always_inline
|
|
|
+-#endif
|
|
|
+-
|
|
|
+-extern long int testandset (int *spinlock);
|
|
|
+-extern int __compare_and_swap (long int *p, long int oldval, long int newval);
|
|
|
+-
|
|
|
+-/* Spinlock implementation; required. */
|
|
|
+-PT_EI long int
|
|
|
+-testandset (int *spinlock)
|
|
|
+-{
|
|
|
+- int ret;
|
|
|
+-
|
|
|
+- __asm__ __volatile__("ldstub %1,%0"
|
|
|
+- : "=r"(ret), "=m"(*spinlock)
|
|
|
+- : "m"(*spinlock));
|
|
|
+-
|
|
|
+- return ret;
|
|
|
+-}
|
|
|
+-
|
|
|
+-
|
|
|
+-/* Memory barrier; default is to do nothing */
|
|
|
+-#define MEMORY_BARRIER() __asm__ __volatile__("stbar" : : : "memory")
|
|
|
+-
|
|
|
+-
|
|
|
+-/* Get some notion of the current stack. Need not be exactly the top
|
|
|
+- of the stack, just something somewhere in the current frame. */
|
|
|
+-#define CURRENT_STACK_FRAME (stack_pointer + (2 * 64))
|
|
|
+-register char *stack_pointer __asm__("%sp");
|
|
|
+-
|
|
|
+-
|
|
|
+-/* 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__("%g7");
|
|
|
+-
|
|
|
+-/* Return the thread descriptor for the current thread. */
|
|
|
+-#define THREAD_SELF __thread_self
|
|
|
+-
|
|
|
+-/* Initialize the thread-unique value. */
|
|
|
+-#define INIT_THREAD_SELF(descr, nr) (__thread_self = (descr))
|
|
|
+-
|
|
|
+-/* Access to data in the thread descriptor is easy. */
|
|
|
+-#define THREAD_GETMEM(descr, member) \
|
|
|
+- ((void) sizeof (descr), THREAD_SELF->member)
|
|
|
+-#define THREAD_GETMEM_NC(descr, member) \
|
|
|
+- ((void) sizeof (descr), THREAD_SELF->member)
|
|
|
+-#define THREAD_SETMEM(descr, member, value) \
|
|
|
+- ((void) sizeof (descr), THREAD_SELF->member = (value))
|
|
|
+-#define THREAD_SETMEM_NC(descr, member, value) \
|
|
|
+- ((void) sizeof (descr), THREAD_SELF->member = (value))
|
|
|
+-
|
|
|
+-/* We want the OS to assign stack addresses. */
|
|
|
+-#define FLOATING_STACKS 1
|
|
|
+-
|
|
|
+-/* Maximum size of the stack if the rlimit is unlimited. */
|
|
|
+-#define ARCH_STACK_MAX_SIZE 8*1024*1024
|
|
|
+-
|
|
|
+-#endif /* pt-machine.h */
|
|
|
+diff --git a/libpthread/linuxthreads.old/sysdeps/sparc/sparc64/pt-machine.h b/libpthread/linuxthreads.old/sysdeps/sparc/sparc64/pt-machine.h
|
|
|
+deleted file mode 100644
|
|
|
+index e3c73d9..0000000
|
|
|
+--- a/libpthread/linuxthreads.old/sysdeps/sparc/sparc64/pt-machine.h
|
|
|
++++ /dev/null
|
|
|
+@@ -1,104 +0,0 @@
|
|
|
+-/* Machine-dependent pthreads configuration and inline functions.
|
|
|
+- Sparc v9 version.
|
|
|
+- 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>.
|
|
|
+-
|
|
|
+- 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; see the file COPYING.LIB. If
|
|
|
+- not, see <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#ifndef _PT_MACHINE_H
|
|
|
+-#define _PT_MACHINE_H 1
|
|
|
+-
|
|
|
+-#ifndef PT_EI
|
|
|
+-# define PT_EI __extern_always_inline
|
|
|
+-#endif
|
|
|
+-
|
|
|
+-extern long int testandset (int *spinlock);
|
|
|
+-extern int __compare_and_swap (long int *p, long int oldval, long int newval);
|
|
|
+-
|
|
|
+-/* Spinlock implementation; required. */
|
|
|
+-PT_EI long int
|
|
|
+-testandset (int *spinlock)
|
|
|
+-{
|
|
|
+- int ret;
|
|
|
+-
|
|
|
+- __asm__ __volatile__("ldstub %1,%0"
|
|
|
+- : "=r" (ret), "=m" (*spinlock) : "m" (*spinlock));
|
|
|
+-
|
|
|
+- return ret;
|
|
|
+-}
|
|
|
+-
|
|
|
+-
|
|
|
+-/* Memory barrier; default is to do nothing */
|
|
|
+-#define MEMORY_BARRIER() \
|
|
|
+- __asm__ __volatile__("membar #LoadLoad | #LoadStore | #StoreLoad | #StoreStore" : : : "memory")
|
|
|
+-/* Read barrier. */
|
|
|
+-#define READ_MEMORY_BARRIER() \
|
|
|
+- __asm__ __volatile__("membar #LoadLoad | #LoadStore" : : : "memory")
|
|
|
+-/* Write barrier. */
|
|
|
+-#define WRITE_MEMORY_BARRIER() \
|
|
|
+- __asm__ __volatile__("membar #StoreLoad | #StoreStore" : : : "memory")
|
|
|
+-
|
|
|
+-
|
|
|
+-/* Get some notion of the current stack. Need not be exactly the top
|
|
|
+- of the stack, just something somewhere in the current frame. */
|
|
|
+-#define CURRENT_STACK_FRAME (stack_pointer + (2 * 128))
|
|
|
+-register char *stack_pointer __asm__ ("%sp");
|
|
|
+-
|
|
|
+-
|
|
|
+-/* 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__ ("%g7");
|
|
|
+-
|
|
|
+-/* Return the thread descriptor for the current thread. */
|
|
|
+-#define THREAD_SELF __thread_self
|
|
|
+-
|
|
|
+-/* Initialize the thread-unique value. */
|
|
|
+-#define INIT_THREAD_SELF(descr, nr) (__thread_self = (descr))
|
|
|
+-
|
|
|
+-
|
|
|
+-/* Compare-and-swap for semaphores. */
|
|
|
+-
|
|
|
+-#define HAS_COMPARE_AND_SWAP
|
|
|
+-PT_EI int
|
|
|
+-__compare_and_swap (long int *p, long int oldval, long int newval)
|
|
|
+-{
|
|
|
+- long int readval;
|
|
|
+-
|
|
|
+- __asm__ __volatile__ ("casx [%4], %2, %0"
|
|
|
+- : "=r"(readval), "=m"(*p)
|
|
|
+- : "r"(oldval), "m"(*p), "r"(p), "0"(newval));
|
|
|
+- MEMORY_BARRIER();
|
|
|
+- return readval == oldval;
|
|
|
+-}
|
|
|
+-
|
|
|
+-/* Access to data in the thread descriptor is easy. */
|
|
|
+-#define THREAD_GETMEM(descr, member) \
|
|
|
+- ((void) sizeof (descr), THREAD_SELF->member)
|
|
|
+-#define THREAD_GETMEM_NC(descr, member) \
|
|
|
+- ((void) sizeof (descr), THREAD_SELF->member)
|
|
|
+-#define THREAD_SETMEM(descr, member, value) \
|
|
|
+- ((void) sizeof (descr), THREAD_SELF->member = (value))
|
|
|
+-#define THREAD_SETMEM_NC(descr, member, value) \
|
|
|
+- ((void) sizeof (descr), THREAD_SELF->member = (value))
|
|
|
+-
|
|
|
+-/* We want the OS to assign stack addresses. */
|
|
|
+-#define FLOATING_STACKS 1
|
|
|
+-
|
|
|
+-/* Maximum size of the stack if the rlimit is unlimited. */
|
|
|
+-#define ARCH_STACK_MAX_SIZE 32*1024*1024
|
|
|
+-
|
|
|
+-#endif /* pt-machine.h */
|
|
|
+diff --git a/libpthread/linuxthreads/sysdeps/sparc/pspinlock.c b/libpthread/linuxthreads/sysdeps/sparc/pspinlock.c
|
|
|
+index 72a9af5..4de152b 100644
|
|
|
+--- a/libpthread/linuxthreads/sysdeps/sparc/pspinlock.c
|
|
|
++++ b/libpthread/linuxthreads/sysdeps/sparc/pspinlock.c
|
|
|
+@@ -1,14 +1,87 @@
|
|
|
+-#include <features.h>
|
|
|
+-#include <bits/wordsize.h>
|
|
|
++/* POSIX spinlock implementation. SPARC32 version.
|
|
|
++ Copyright (C) 2000 Free Software Foundation, Inc.
|
|
|
++ This file is part of the GNU C Library.
|
|
|
+
|
|
|
+-#if __WORDSIZE == 32
|
|
|
++ 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.
|
|
|
+
|
|
|
+-# if defined(__CONFIG_SPARC_V9B__)
|
|
|
+-# include "sparc32/sparcv9b/pspinlock.c"
|
|
|
+-# else
|
|
|
+-# include "sparc32/pspinlock.c"
|
|
|
+-# endif
|
|
|
++ 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.
|
|
|
+
|
|
|
+-#else
|
|
|
+-# include "sparc64/pspinlock.c"
|
|
|
+-#endif
|
|
|
++ You should have received a copy of the GNU Lesser General Public
|
|
|
++ License along with the GNU C Library; see the file COPYING.LIB. If
|
|
|
++ not, see <http://www.gnu.org/licenses/>. */
|
|
|
++
|
|
|
++#include <errno.h>
|
|
|
++#include <pthread.h>
|
|
|
++#include "internals.h"
|
|
|
++
|
|
|
++/* This implementation is similar to the one used in the Linux kernel. */
|
|
|
++int
|
|
|
++__pthread_spin_lock (pthread_spinlock_t *lock)
|
|
|
++{
|
|
|
++ __asm__ __volatile__
|
|
|
++ ("1: ldstub [%0], %%g2\n"
|
|
|
++ " orcc %%g2, 0x0, %%g0\n"
|
|
|
++ " bne,a 2f\n"
|
|
|
++ " ldub [%0], %%g2\n"
|
|
|
++ ".subsection 2\n"
|
|
|
++ "2: orcc %%g2, 0x0, %%g0\n"
|
|
|
++ " bne,a 2b\n"
|
|
|
++ " ldub [%0], %%g2\n"
|
|
|
++ " b,a 1b\n"
|
|
|
++ ".previous"
|
|
|
++ : /* no outputs */
|
|
|
++ : "r" (lock)
|
|
|
++ : "g2", "memory", "cc");
|
|
|
++ return 0;
|
|
|
++}
|
|
|
++weak_alias (__pthread_spin_lock, pthread_spin_lock)
|
|
|
++
|
|
|
++
|
|
|
++int
|
|
|
++__pthread_spin_trylock (pthread_spinlock_t *lock)
|
|
|
++{
|
|
|
++ int result;
|
|
|
++ __asm__ __volatile__
|
|
|
++ ("ldstub [%1], %0"
|
|
|
++ : "=r" (result)
|
|
|
++ : "r" (lock)
|
|
|
++ : "memory");
|
|
|
++ return result == 0 ? 0 : EBUSY;
|
|
|
++}
|
|
|
++weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
|
|
|
++
|
|
|
++
|
|
|
++int
|
|
|
++__pthread_spin_unlock (pthread_spinlock_t *lock)
|
|
|
++{
|
|
|
++ *lock = 0;
|
|
|
++ return 0;
|
|
|
++}
|
|
|
++weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
|
|
|
++
|
|
|
++
|
|
|
++int
|
|
|
++__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
|
|
|
++{
|
|
|
++ /* We can ignore the `pshared' parameter. Since we are busy-waiting
|
|
|
++ all processes which can access the memory location `lock' points
|
|
|
++ to can use the spinlock. */
|
|
|
++ *lock = 0;
|
|
|
++ return 0;
|
|
|
++}
|
|
|
++weak_alias (__pthread_spin_init, pthread_spin_init)
|
|
|
++
|
|
|
++
|
|
|
++int
|
|
|
++__pthread_spin_destroy (pthread_spinlock_t *lock)
|
|
|
++{
|
|
|
++ /* Nothing to do. */
|
|
|
++ return 0;
|
|
|
++}
|
|
|
++weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
|
|
|
+diff --git a/libpthread/linuxthreads/sysdeps/sparc/pt-machine.h b/libpthread/linuxthreads/sysdeps/sparc/pt-machine.h
|
|
|
+index ab90810..d502c75 100644
|
|
|
+--- a/libpthread/linuxthreads/sysdeps/sparc/pt-machine.h
|
|
|
++++ b/libpthread/linuxthreads/sysdeps/sparc/pt-machine.h
|
|
|
+@@ -1,8 +1,82 @@
|
|
|
+-#include <features.h>
|
|
|
+-#include <bits/wordsize.h>
|
|
|
++/* Machine-dependent pthreads configuration and inline functions.
|
|
|
++ sparc version.
|
|
|
++ 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>.
|
|
|
+
|
|
|
+-#if __WORDSIZE == 32
|
|
|
+-# include "sparc32/pt-machine.h"
|
|
|
+-#else
|
|
|
+-# include "sparc64/pt-machine.h"
|
|
|
++ 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; see the file COPYING.LIB. If
|
|
|
++ not, see <http://www.gnu.org/licenses/>. */
|
|
|
++
|
|
|
++#ifndef _PT_MACHINE_H
|
|
|
++#define _PT_MACHINE_H 1
|
|
|
++
|
|
|
++#ifndef PT_EI
|
|
|
++# define PT_EI __extern_always_inline
|
|
|
+ #endif
|
|
|
++
|
|
|
++extern long int testandset (int *spinlock);
|
|
|
++extern int __compare_and_swap (long int *p, long int oldval, long int newval);
|
|
|
++
|
|
|
++/* Spinlock implementation; required. */
|
|
|
++PT_EI long int
|
|
|
++testandset (int *spinlock)
|
|
|
++{
|
|
|
++ int ret;
|
|
|
++
|
|
|
++ __asm__ __volatile__("ldstub %1,%0"
|
|
|
++ : "=r"(ret), "=m"(*spinlock)
|
|
|
++ : "m"(*spinlock));
|
|
|
++
|
|
|
++ return ret;
|
|
|
++}
|
|
|
++
|
|
|
++
|
|
|
++/* Memory barrier; default is to do nothing */
|
|
|
++#define MEMORY_BARRIER() __asm__ __volatile__("stbar" : : : "memory")
|
|
|
++
|
|
|
++
|
|
|
++/* Get some notion of the current stack. Need not be exactly the top
|
|
|
++ of the stack, just something somewhere in the current frame. */
|
|
|
++#define CURRENT_STACK_FRAME (stack_pointer + (2 * 64))
|
|
|
++register char *stack_pointer __asm__("%sp");
|
|
|
++
|
|
|
++
|
|
|
++/* 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__("%g7");
|
|
|
++
|
|
|
++/* Return the thread descriptor for the current thread. */
|
|
|
++#define THREAD_SELF __thread_self
|
|
|
++
|
|
|
++/* Initialize the thread-unique value. */
|
|
|
++#define INIT_THREAD_SELF(descr, nr) (__thread_self = (descr))
|
|
|
++
|
|
|
++/* Access to data in the thread descriptor is easy. */
|
|
|
++#define THREAD_GETMEM(descr, member) \
|
|
|
++ ((void) sizeof (descr), THREAD_SELF->member)
|
|
|
++#define THREAD_GETMEM_NC(descr, member) \
|
|
|
++ ((void) sizeof (descr), THREAD_SELF->member)
|
|
|
++#define THREAD_SETMEM(descr, member, value) \
|
|
|
++ ((void) sizeof (descr), THREAD_SELF->member = (value))
|
|
|
++#define THREAD_SETMEM_NC(descr, member, value) \
|
|
|
++ ((void) sizeof (descr), THREAD_SELF->member = (value))
|
|
|
++
|
|
|
++/* We want the OS to assign stack addresses. */
|
|
|
++#define FLOATING_STACKS 1
|
|
|
++
|
|
|
++/* Maximum size of the stack if the rlimit is unlimited. */
|
|
|
++#define ARCH_STACK_MAX_SIZE 8*1024*1024
|
|
|
++
|
|
|
++#endif /* pt-machine.h */
|
|
|
+diff --git a/libpthread/linuxthreads/sysdeps/sparc/sparc32/pspinlock.c b/libpthread/linuxthreads/sysdeps/sparc/sparc32/pspinlock.c
|
|
|
+deleted file mode 100644
|
|
|
+index 4de152b..0000000
|
|
|
+--- a/libpthread/linuxthreads/sysdeps/sparc/sparc32/pspinlock.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1,87 +0,0 @@
|
|
|
+-/* POSIX spinlock implementation. SPARC32 version.
|
|
|
+- Copyright (C) 2000 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; see the file COPYING.LIB. If
|
|
|
+- not, see <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <errno.h>
|
|
|
+-#include <pthread.h>
|
|
|
+-#include "internals.h"
|
|
|
+-
|
|
|
+-/* This implementation is similar to the one used in the Linux kernel. */
|
|
|
+-int
|
|
|
+-__pthread_spin_lock (pthread_spinlock_t *lock)
|
|
|
+-{
|
|
|
+- __asm__ __volatile__
|
|
|
+- ("1: ldstub [%0], %%g2\n"
|
|
|
+- " orcc %%g2, 0x0, %%g0\n"
|
|
|
+- " bne,a 2f\n"
|
|
|
+- " ldub [%0], %%g2\n"
|
|
|
+- ".subsection 2\n"
|
|
|
+- "2: orcc %%g2, 0x0, %%g0\n"
|
|
|
+- " bne,a 2b\n"
|
|
|
+- " ldub [%0], %%g2\n"
|
|
|
+- " b,a 1b\n"
|
|
|
+- ".previous"
|
|
|
+- : /* no outputs */
|
|
|
+- : "r" (lock)
|
|
|
+- : "g2", "memory", "cc");
|
|
|
+- return 0;
|
|
|
+-}
|
|
|
+-weak_alias (__pthread_spin_lock, pthread_spin_lock)
|
|
|
+-
|
|
|
+-
|
|
|
+-int
|
|
|
+-__pthread_spin_trylock (pthread_spinlock_t *lock)
|
|
|
+-{
|
|
|
+- int result;
|
|
|
+- __asm__ __volatile__
|
|
|
+- ("ldstub [%1], %0"
|
|
|
+- : "=r" (result)
|
|
|
+- : "r" (lock)
|
|
|
+- : "memory");
|
|
|
+- return result == 0 ? 0 : EBUSY;
|
|
|
+-}
|
|
|
+-weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
|
|
|
+-
|
|
|
+-
|
|
|
+-int
|
|
|
+-__pthread_spin_unlock (pthread_spinlock_t *lock)
|
|
|
+-{
|
|
|
+- *lock = 0;
|
|
|
+- return 0;
|
|
|
+-}
|
|
|
+-weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
|
|
|
+-
|
|
|
+-
|
|
|
+-int
|
|
|
+-__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
|
|
|
+-{
|
|
|
+- /* We can ignore the `pshared' parameter. Since we are busy-waiting
|
|
|
+- all processes which can access the memory location `lock' points
|
|
|
+- to can use the spinlock. */
|
|
|
+- *lock = 0;
|
|
|
+- return 0;
|
|
|
+-}
|
|
|
+-weak_alias (__pthread_spin_init, pthread_spin_init)
|
|
|
+-
|
|
|
+-
|
|
|
+-int
|
|
|
+-__pthread_spin_destroy (pthread_spinlock_t *lock)
|
|
|
+-{
|
|
|
+- /* Nothing to do. */
|
|
|
+- return 0;
|
|
|
+-}
|
|
|
+-weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
|
|
|
+diff --git a/libpthread/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h b/libpthread/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h
|
|
|
+deleted file mode 100644
|
|
|
+index d502c75..0000000
|
|
|
+--- a/libpthread/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h
|
|
|
++++ /dev/null
|
|
|
+@@ -1,82 +0,0 @@
|
|
|
+-/* Machine-dependent pthreads configuration and inline functions.
|
|
|
+- sparc version.
|
|
|
+- 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>.
|
|
|
+-
|
|
|
+- 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; see the file COPYING.LIB. If
|
|
|
+- not, see <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#ifndef _PT_MACHINE_H
|
|
|
+-#define _PT_MACHINE_H 1
|
|
|
+-
|
|
|
+-#ifndef PT_EI
|
|
|
+-# define PT_EI __extern_always_inline
|
|
|
+-#endif
|
|
|
+-
|
|
|
+-extern long int testandset (int *spinlock);
|
|
|
+-extern int __compare_and_swap (long int *p, long int oldval, long int newval);
|
|
|
+-
|
|
|
+-/* Spinlock implementation; required. */
|
|
|
+-PT_EI long int
|
|
|
+-testandset (int *spinlock)
|
|
|
+-{
|
|
|
+- int ret;
|
|
|
+-
|
|
|
+- __asm__ __volatile__("ldstub %1,%0"
|
|
|
+- : "=r"(ret), "=m"(*spinlock)
|
|
|
+- : "m"(*spinlock));
|
|
|
+-
|
|
|
+- return ret;
|
|
|
+-}
|
|
|
+-
|
|
|
+-
|
|
|
+-/* Memory barrier; default is to do nothing */
|
|
|
+-#define MEMORY_BARRIER() __asm__ __volatile__("stbar" : : : "memory")
|
|
|
+-
|
|
|
+-
|
|
|
+-/* Get some notion of the current stack. Need not be exactly the top
|
|
|
+- of the stack, just something somewhere in the current frame. */
|
|
|
+-#define CURRENT_STACK_FRAME (stack_pointer + (2 * 64))
|
|
|
+-register char *stack_pointer __asm__("%sp");
|
|
|
+-
|
|
|
+-
|
|
|
+-/* 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__("%g7");
|
|
|
+-
|
|
|
+-/* Return the thread descriptor for the current thread. */
|
|
|
+-#define THREAD_SELF __thread_self
|
|
|
+-
|
|
|
+-/* Initialize the thread-unique value. */
|
|
|
+-#define INIT_THREAD_SELF(descr, nr) (__thread_self = (descr))
|
|
|
+-
|
|
|
+-/* Access to data in the thread descriptor is easy. */
|
|
|
+-#define THREAD_GETMEM(descr, member) \
|
|
|
+- ((void) sizeof (descr), THREAD_SELF->member)
|
|
|
+-#define THREAD_GETMEM_NC(descr, member) \
|
|
|
+- ((void) sizeof (descr), THREAD_SELF->member)
|
|
|
+-#define THREAD_SETMEM(descr, member, value) \
|
|
|
+- ((void) sizeof (descr), THREAD_SELF->member = (value))
|
|
|
+-#define THREAD_SETMEM_NC(descr, member, value) \
|
|
|
+- ((void) sizeof (descr), THREAD_SELF->member = (value))
|
|
|
+-
|
|
|
+-/* We want the OS to assign stack addresses. */
|
|
|
+-#define FLOATING_STACKS 1
|
|
|
+-
|
|
|
+-/* Maximum size of the stack if the rlimit is unlimited. */
|
|
|
+-#define ARCH_STACK_MAX_SIZE 8*1024*1024
|
|
|
+-
|
|
|
+-#endif /* pt-machine.h */
|
|
|
+diff --git a/libpthread/linuxthreads/sysdeps/sparc/sparc32/sparcv9/pspinlock.c b/libpthread/linuxthreads/sysdeps/sparc/sparc32/sparcv9/pspinlock.c
|
|
|
+deleted file mode 100644
|
|
|
+index fb49ca3..0000000
|
|
|
+--- a/libpthread/linuxthreads/sysdeps/sparc/sparc32/sparcv9/pspinlock.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1,93 +0,0 @@
|
|
|
+-/* POSIX spinlock implementation. SPARC v9 version.
|
|
|
+- Copyright (C) 2000 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; see the file COPYING.LIB. If
|
|
|
+- not, see <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <errno.h>
|
|
|
+-#include <pthread.h>
|
|
|
+-#include "internals.h"
|
|
|
+-
|
|
|
+-
|
|
|
+-/* This implementation is similar to the one used in the Linux kernel. */
|
|
|
+-int
|
|
|
+-__pthread_spin_lock (pthread_spinlock_t *lock)
|
|
|
+-{
|
|
|
+- __asm__ __volatile__
|
|
|
+- ("1: ldstub [%0], %%g2\n"
|
|
|
+- " brnz,pn %%g2, 2f\n"
|
|
|
+- " membar #StoreLoad | #StoreStore\n"
|
|
|
+- ".subsection 2\n"
|
|
|
+- "2: ldub [%0], %%g2\n"
|
|
|
+- " brnz,pt %%g2, 2b\n"
|
|
|
+- " membar #LoadLoad\n"
|
|
|
+- " b,a,pt %%xcc, 1b\n"
|
|
|
+- ".previous"
|
|
|
+- : /* no outputs */
|
|
|
+- : "r" (lock)
|
|
|
+- : "g2", "memory");
|
|
|
+- return 0;
|
|
|
+-}
|
|
|
+-weak_alias (__pthread_spin_lock, pthread_spin_lock)
|
|
|
+-
|
|
|
+-
|
|
|
+-int
|
|
|
+-__pthread_spin_trylock (pthread_spinlock_t *lock)
|
|
|
+-{
|
|
|
+- int result;
|
|
|
+- __asm__ __volatile__
|
|
|
+- ("ldstub [%1], %0\n"
|
|
|
+- "membar #StoreLoad | #StoreStore"
|
|
|
+- : "=r" (result)
|
|
|
+- : "r" (lock)
|
|
|
+- : "memory");
|
|
|
+- return result == 0 ? 0 : EBUSY;
|
|
|
+-}
|
|
|
+-weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
|
|
|
+-
|
|
|
+-
|
|
|
+-int
|
|
|
+-__pthread_spin_unlock (pthread_spinlock_t *lock)
|
|
|
+-{
|
|
|
+- __asm__ __volatile__
|
|
|
+- ("membar #StoreStore | #LoadStore\n"
|
|
|
+- "stb %%g0, [%0]"
|
|
|
+- :
|
|
|
+- : "r" (lock)
|
|
|
+- : "memory");
|
|
|
+- return 0;
|
|
|
+-}
|
|
|
+-weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
|
|
|
+-
|
|
|
+-
|
|
|
+-int
|
|
|
+-__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
|
|
|
+-{
|
|
|
+- /* We can ignore the `pshared' parameter. Since we are busy-waiting
|
|
|
+- all processes which can access the memory location `lock' points
|
|
|
+- to can use the spinlock. */
|
|
|
+- *lock = 0;
|
|
|
+- return 0;
|
|
|
+-}
|
|
|
+-weak_alias (__pthread_spin_init, pthread_spin_init)
|
|
|
+-
|
|
|
+-
|
|
|
+-int
|
|
|
+-__pthread_spin_destroy (pthread_spinlock_t *lock)
|
|
|
+-{
|
|
|
+- /* Nothing to do. */
|
|
|
+- return 0;
|
|
|
+-}
|
|
|
+-weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
|
|
|
+diff --git a/libpthread/linuxthreads/sysdeps/sparc/sparc64/pspinlock.c b/libpthread/linuxthreads/sysdeps/sparc/sparc64/pspinlock.c
|
|
|
+deleted file mode 100644
|
|
|
+index 743cb77..0000000
|
|
|
+--- a/libpthread/linuxthreads/sysdeps/sparc/sparc64/pspinlock.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1,92 +0,0 @@
|
|
|
+-/* POSIX spinlock implementation. SPARC64 version.
|
|
|
+- Copyright (C) 2000 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; see the file COPYING.LIB. If
|
|
|
+- not, see <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <errno.h>
|
|
|
+-#include <pthread.h>
|
|
|
+-#include "internals.h"
|
|
|
+-
|
|
|
+-/* This implementation is similar to the one used in the Linux kernel. */
|
|
|
+-int
|
|
|
+-__pthread_spin_lock (pthread_spinlock_t *lock)
|
|
|
+-{
|
|
|
+- __asm__ __volatile__
|
|
|
+- ("1: ldstub [%0], %%g5\n"
|
|
|
+- " brnz,pn %%g5, 2f\n"
|
|
|
+- " membar #StoreLoad | #StoreStore\n"
|
|
|
+- ".subsection 2\n"
|
|
|
+- "2: ldub [%0], %%g5\n"
|
|
|
+- " brnz,pt %%g5, 2b\n"
|
|
|
+- " membar #LoadLoad\n"
|
|
|
+- " b,a,pt %%xcc, 1b\n"
|
|
|
+- ".previous"
|
|
|
+- : /* no outputs */
|
|
|
+- : "r" (lock)
|
|
|
+- : "g5", "memory");
|
|
|
+- return 0;
|
|
|
+-}
|
|
|
+-weak_alias (__pthread_spin_lock, pthread_spin_lock)
|
|
|
+-
|
|
|
+-
|
|
|
+-int
|
|
|
+-__pthread_spin_trylock (pthread_spinlock_t *lock)
|
|
|
+-{
|
|
|
+- int result;
|
|
|
+- __asm__ __volatile__
|
|
|
+- ("ldstub [%1], %0\n"
|
|
|
+- "membar #StoreLoad | #StoreStore"
|
|
|
+- : "=r" (result)
|
|
|
+- : "r" (lock)
|
|
|
+- : "memory");
|
|
|
+- return result == 0 ? 0 : EBUSY;
|
|
|
+-}
|
|
|
+-weak_alias (__pthread_spin_trylock, pthread_spin_trylock)
|
|
|
+-
|
|
|
+-
|
|
|
+-int
|
|
|
+-__pthread_spin_unlock (pthread_spinlock_t *lock)
|
|
|
+-{
|
|
|
+- __asm__ __volatile__
|
|
|
+- ("membar #StoreStore | #LoadStore\n"
|
|
|
+- "stb %%g0, [%0]"
|
|
|
+- :
|
|
|
+- : "r" (lock)
|
|
|
+- : "memory");
|
|
|
+- return 0;
|
|
|
+-}
|
|
|
+-weak_alias (__pthread_spin_unlock, pthread_spin_unlock)
|
|
|
+-
|
|
|
+-
|
|
|
+-int
|
|
|
+-__pthread_spin_init (pthread_spinlock_t *lock, int pshared)
|
|
|
+-{
|
|
|
+- /* We can ignore the `pshared' parameter. Since we are busy-waiting
|
|
|
+- all processes which can access the memory location `lock' points
|
|
|
+- to can use the spinlock. */
|
|
|
+- *lock = 0;
|
|
|
+- return 0;
|
|
|
+-}
|
|
|
+-weak_alias (__pthread_spin_init, pthread_spin_init)
|
|
|
+-
|
|
|
+-
|
|
|
+-int
|
|
|
+-__pthread_spin_destroy (pthread_spinlock_t *lock)
|
|
|
+-{
|
|
|
+- /* Nothing to do. */
|
|
|
+- return 0;
|
|
|
+-}
|
|
|
+-weak_alias (__pthread_spin_destroy, pthread_spin_destroy)
|
|
|
+diff --git a/libpthread/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h b/libpthread/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h
|
|
|
+deleted file mode 100644
|
|
|
+index e3c73d9..0000000
|
|
|
+--- a/libpthread/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h
|
|
|
++++ /dev/null
|
|
|
+@@ -1,104 +0,0 @@
|
|
|
+-/* Machine-dependent pthreads configuration and inline functions.
|
|
|
+- Sparc v9 version.
|
|
|
+- 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>.
|
|
|
+-
|
|
|
+- 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; see the file COPYING.LIB. If
|
|
|
+- not, see <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#ifndef _PT_MACHINE_H
|
|
|
+-#define _PT_MACHINE_H 1
|
|
|
+-
|
|
|
+-#ifndef PT_EI
|
|
|
+-# define PT_EI __extern_always_inline
|
|
|
+-#endif
|
|
|
+-
|
|
|
+-extern long int testandset (int *spinlock);
|
|
|
+-extern int __compare_and_swap (long int *p, long int oldval, long int newval);
|
|
|
+-
|
|
|
+-/* Spinlock implementation; required. */
|
|
|
+-PT_EI long int
|
|
|
+-testandset (int *spinlock)
|
|
|
+-{
|
|
|
+- int ret;
|
|
|
+-
|
|
|
+- __asm__ __volatile__("ldstub %1,%0"
|
|
|
+- : "=r" (ret), "=m" (*spinlock) : "m" (*spinlock));
|
|
|
+-
|
|
|
+- return ret;
|
|
|
+-}
|
|
|
+-
|
|
|
+-
|
|
|
+-/* Memory barrier; default is to do nothing */
|
|
|
+-#define MEMORY_BARRIER() \
|
|
|
+- __asm__ __volatile__("membar #LoadLoad | #LoadStore | #StoreLoad | #StoreStore" : : : "memory")
|
|
|
+-/* Read barrier. */
|
|
|
+-#define READ_MEMORY_BARRIER() \
|
|
|
+- __asm__ __volatile__("membar #LoadLoad | #LoadStore" : : : "memory")
|
|
|
+-/* Write barrier. */
|
|
|
+-#define WRITE_MEMORY_BARRIER() \
|
|
|
+- __asm__ __volatile__("membar #StoreLoad | #StoreStore" : : : "memory")
|
|
|
+-
|
|
|
+-
|
|
|
+-/* Get some notion of the current stack. Need not be exactly the top
|
|
|
+- of the stack, just something somewhere in the current frame. */
|
|
|
+-#define CURRENT_STACK_FRAME (stack_pointer + (2 * 128))
|
|
|
+-register char *stack_pointer __asm__ ("%sp");
|
|
|
+-
|
|
|
+-
|
|
|
+-/* 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__ ("%g7");
|
|
|
+-
|
|
|
+-/* Return the thread descriptor for the current thread. */
|
|
|
+-#define THREAD_SELF __thread_self
|
|
|
+-
|
|
|
+-/* Initialize the thread-unique value. */
|
|
|
+-#define INIT_THREAD_SELF(descr, nr) (__thread_self = (descr))
|
|
|
+-
|
|
|
+-
|
|
|
+-/* Compare-and-swap for semaphores. */
|
|
|
+-
|
|
|
+-#define HAS_COMPARE_AND_SWAP
|
|
|
+-PT_EI int
|
|
|
+-__compare_and_swap (long int *p, long int oldval, long int newval)
|
|
|
+-{
|
|
|
+- long int readval;
|
|
|
+-
|
|
|
+- __asm__ __volatile__ ("casx [%4], %2, %0"
|
|
|
+- : "=r"(readval), "=m"(*p)
|
|
|
+- : "r"(oldval), "m"(*p), "r"(p), "0"(newval));
|
|
|
+- MEMORY_BARRIER();
|
|
|
+- return readval == oldval;
|
|
|
+-}
|
|
|
+-
|
|
|
+-/* Access to data in the thread descriptor is easy. */
|
|
|
+-#define THREAD_GETMEM(descr, member) \
|
|
|
+- ((void) sizeof (descr), THREAD_SELF->member)
|
|
|
+-#define THREAD_GETMEM_NC(descr, member) \
|
|
|
+- ((void) sizeof (descr), THREAD_SELF->member)
|
|
|
+-#define THREAD_SETMEM(descr, member, value) \
|
|
|
+- ((void) sizeof (descr), THREAD_SELF->member = (value))
|
|
|
+-#define THREAD_SETMEM_NC(descr, member, value) \
|
|
|
+- ((void) sizeof (descr), THREAD_SELF->member = (value))
|
|
|
+-
|
|
|
+-/* We want the OS to assign stack addresses. */
|
|
|
+-#define FLOATING_STACKS 1
|
|
|
+-
|
|
|
+-/* Maximum size of the stack if the rlimit is unlimited. */
|
|
|
+-#define ARCH_STACK_MAX_SIZE 32*1024*1024
|
|
|
+-
|
|
|
+-#endif /* pt-machine.h */
|
|
|
+diff --git a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
|
|
|
+deleted file mode 100644
|
|
|
+index bd9bb0d..0000000
|
|
|
+--- a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
|
|
|
++++ /dev/null
|
|
|
+@@ -1,100 +0,0 @@
|
|
|
+-/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <tls.h>
|
|
|
+-#ifndef __ASSEMBLER__
|
|
|
+-# include <linuxthreads/internals.h>
|
|
|
+-#endif
|
|
|
+-
|
|
|
+-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
|
|
|
+-
|
|
|
+-# undef PSEUDO
|
|
|
+-# define PSEUDO(name, syscall_name, args) \
|
|
|
+- .text; \
|
|
|
+-ENTRY(name) \
|
|
|
+- ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1; \
|
|
|
+- cmp %g1, 0; \
|
|
|
+- bne 1f; \
|
|
|
+- mov SYS_ify(syscall_name), %g1; \
|
|
|
+- ta 0x10; \
|
|
|
+- bcs __syscall_error_handler; \
|
|
|
+- nop; \
|
|
|
+- .subsection 2; \
|
|
|
+-1: save %sp, -96, %sp; \
|
|
|
+- CENABLE; \
|
|
|
+- nop; \
|
|
|
+- mov %o0, %l0; \
|
|
|
+- COPY_ARGS_##args \
|
|
|
+- mov SYS_ify(syscall_name), %g1; \
|
|
|
+- ta 0x10; \
|
|
|
+- bcs __syscall_error_handler2; \
|
|
|
+- mov %o0, %l1; \
|
|
|
+- CDISABLE; \
|
|
|
+- mov %l0, %o0; \
|
|
|
+- jmpl %i7 + 8, %g0; \
|
|
|
+- restore %g0, %l1, %o0; \
|
|
|
+- .previous; \
|
|
|
+- SYSCALL_ERROR_HANDLER \
|
|
|
+- SYSCALL_ERROR_HANDLER2
|
|
|
+-
|
|
|
+-#define SYSCALL_ERROR_HANDLER2 \
|
|
|
+-SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler2) \
|
|
|
+- .global __errno_location; \
|
|
|
+- .type __errno_location,@function; \
|
|
|
+- CDISABLE; \
|
|
|
+- mov %l0, %o0; \
|
|
|
+- call __errno_location; \
|
|
|
+- nop; \
|
|
|
+- st %l1, [%o0]; \
|
|
|
+- jmpl %i7 + 8, %g0; \
|
|
|
+- restore %g0, -1, %o0; \
|
|
|
+- .previous;
|
|
|
+-
|
|
|
+-# ifdef IS_IN_libpthread
|
|
|
+-# define CENABLE call __pthread_enable_asynccancel
|
|
|
+-# define CDISABLE call __pthread_disable_asynccancel
|
|
|
+-# elif !defined NOT_IN_libc
|
|
|
+-# define CENABLE call __libc_enable_asynccancel
|
|
|
+-# define CDISABLE call __libc_disable_asynccancel
|
|
|
+-# else
|
|
|
+-# define CENABLE call __librt_enable_asynccancel
|
|
|
+-# define CDISABLE call __librt_disable_asynccancel
|
|
|
+-# endif
|
|
|
+-
|
|
|
+-#define COPY_ARGS_0 /* Nothing */
|
|
|
+-#define COPY_ARGS_1 COPY_ARGS_0 mov %i0, %o0;
|
|
|
+-#define COPY_ARGS_2 COPY_ARGS_1 mov %i1, %o1;
|
|
|
+-#define COPY_ARGS_3 COPY_ARGS_2 mov %i2, %o2;
|
|
|
+-#define COPY_ARGS_4 COPY_ARGS_3 mov %i3, %o3;
|
|
|
+-#define COPY_ARGS_5 COPY_ARGS_4 mov %i4, %o4;
|
|
|
+-#define COPY_ARGS_6 COPY_ARGS_5 mov %i5, %o5;
|
|
|
+-
|
|
|
+-# ifndef __ASSEMBLER__
|
|
|
+-# define SINGLE_THREAD_P \
|
|
|
+- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
|
|
|
+- p_header.data.multiple_threads) == 0, 1)
|
|
|
+-# else
|
|
|
+-# define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1
|
|
|
+-# endif
|
|
|
+-
|
|
|
+-#elif !defined __ASSEMBLER__
|
|
|
+-
|
|
|
+-/* This code should never be used but we define it anyhow. */
|
|
|
+-# define SINGLE_THREAD_P (1)
|
|
|
+-
|
|
|
+-#endif
|
|
|
+diff --git a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S
|
|
|
+deleted file mode 100644
|
|
|
+index ab2286e..0000000
|
|
|
+--- a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,64 +0,0 @@
|
|
|
+-/* Copyright (C) 2003 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <sysdep-cancel.h>
|
|
|
+-
|
|
|
+- .text
|
|
|
+-#ifdef SHARED
|
|
|
+-.LLGETPC0:
|
|
|
+- retl
|
|
|
+- add %o7, %o0, %o0
|
|
|
+-#endif
|
|
|
+-ENTRY(__vfork)
|
|
|
+-#ifdef SHARED
|
|
|
+- mov %o7, %o1
|
|
|
+- sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %o0
|
|
|
+- call .LLGETPC0
|
|
|
+- add %o0, %lo(_GLOBAL_OFFSET_TABLE_+4), %o0
|
|
|
+- sethi %hi(__libc_pthread_functions), %o2
|
|
|
+- mov %o1, %o7
|
|
|
+- or %o2, %lo(__libc_pthread_functions), %o2
|
|
|
+- ld [%o0 + %o2], %o2
|
|
|
+- ld [%o2], %o2
|
|
|
+- cmp %o2, 0
|
|
|
+-#else
|
|
|
+- .weak pthread_create
|
|
|
+- sethi %hi(pthread_create), %o0
|
|
|
+- orcc %o0, %lo(pthread_create), %o0
|
|
|
+-#endif
|
|
|
+-#if defined SHARED && !defined BROKEN_SPARC_WDISP22
|
|
|
+- bne HIDDEN_JUMPTARGET(fork)
|
|
|
+-#else
|
|
|
+- bne 1f
|
|
|
+-#endif
|
|
|
+- mov __NR_vfork, %g1
|
|
|
+- ta 0x10
|
|
|
+- bcs __syscall_error_handler
|
|
|
+- nop
|
|
|
+- sub %o1, 1, %o1
|
|
|
+- retl
|
|
|
+- and %o0, %o1, %o0
|
|
|
+-#if !defined SHARED || defined BROKEN_SPARC_WDISP22
|
|
|
+-1: mov %o7, %g1
|
|
|
+- call HIDDEN_JUMPTARGET(fork)
|
|
|
+- mov %g1, %o7
|
|
|
+-#endif
|
|
|
+- SYSCALL_ERROR_HANDLER
|
|
|
+-PSEUDO_END (__vfork)
|
|
|
+-libc_hidden_def (__vfork)
|
|
|
+-weak_alias (__vfork, vfork)
|
|
|
+diff --git a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/pt-sigsuspend.c b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/pt-sigsuspend.c
|
|
|
+deleted file mode 100644
|
|
|
+index d57283a..0000000
|
|
|
+--- a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/pt-sigsuspend.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1 +0,0 @@
|
|
|
+-#include "../../ia64/pt-sigsuspend.c"
|
|
|
+diff --git a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
|
|
|
+deleted file mode 100644
|
|
|
+index 9972ee4..0000000
|
|
|
+--- a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
|
|
|
++++ /dev/null
|
|
|
+@@ -1,99 +0,0 @@
|
|
|
+-/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <tls.h>
|
|
|
+-#ifndef __ASSEMBLER__
|
|
|
+-# include <linuxthreads/internals.h>
|
|
|
+-#endif
|
|
|
+-
|
|
|
+-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
|
|
|
+-
|
|
|
+-# undef PSEUDO
|
|
|
+-# define PSEUDO(name, syscall_name, args) \
|
|
|
+- .text; \
|
|
|
+-ENTRY(name) \
|
|
|
+- ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1; \
|
|
|
+- brnz,pn %g1, 1f; \
|
|
|
+- mov SYS_ify(syscall_name), %g1; \
|
|
|
+- ta 0x6d; \
|
|
|
+- bcs,pn %xcc, __syscall_error_handler; \
|
|
|
+- nop; \
|
|
|
+- .subsection 2; \
|
|
|
+-1: save %sp, -192, %sp; \
|
|
|
+- CENABLE; \
|
|
|
+- nop; \
|
|
|
+- mov %o0, %l0; \
|
|
|
+- COPY_ARGS_##args \
|
|
|
+- mov SYS_ify(syscall_name), %g1; \
|
|
|
+- ta 0x6d; \
|
|
|
+- bcs,pn %xcc, __syscall_error_handler2; \
|
|
|
+- mov %o0, %l1; \
|
|
|
+- CDISABLE; \
|
|
|
+- mov %l0, %o0; \
|
|
|
+- jmpl %i7 + 8, %g0; \
|
|
|
+- restore %g0, %l1, %o0; \
|
|
|
+- .previous; \
|
|
|
+- SYSCALL_ERROR_HANDLER \
|
|
|
+- SYSCALL_ERROR_HANDLER2
|
|
|
+-
|
|
|
+-#define SYSCALL_ERROR_HANDLER2 \
|
|
|
+-SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler2) \
|
|
|
+- .global __errno_location; \
|
|
|
+- .type __errno_location,@function; \
|
|
|
+- CDISABLE; \
|
|
|
+- mov %l0, %o0; \
|
|
|
+- call __errno_location; \
|
|
|
+- nop; \
|
|
|
+- st %l1, [%o0]; \
|
|
|
+- jmpl %i7 + 8, %g0; \
|
|
|
+- restore %g0, -1, %o0; \
|
|
|
+- .previous;
|
|
|
+-
|
|
|
+-# ifdef IS_IN_libpthread
|
|
|
+-# define CENABLE call __pthread_enable_asynccancel
|
|
|
+-# define CDISABLE call __pthread_disable_asynccancel
|
|
|
+-# elif !defined NOT_IN_libc
|
|
|
+-# define CENABLE call __libc_enable_asynccancel
|
|
|
+-# define CDISABLE call __libc_disable_asynccancel
|
|
|
+-# else
|
|
|
+-# define CENABLE call __librt_enable_asynccancel
|
|
|
+-# define CDISABLE call __librt_disable_asynccancel
|
|
|
+-# endif
|
|
|
+-
|
|
|
+-#define COPY_ARGS_0 /* Nothing */
|
|
|
+-#define COPY_ARGS_1 COPY_ARGS_0 mov %i0, %o0;
|
|
|
+-#define COPY_ARGS_2 COPY_ARGS_1 mov %i1, %o1;
|
|
|
+-#define COPY_ARGS_3 COPY_ARGS_2 mov %i2, %o2;
|
|
|
+-#define COPY_ARGS_4 COPY_ARGS_3 mov %i3, %o3;
|
|
|
+-#define COPY_ARGS_5 COPY_ARGS_4 mov %i4, %o4;
|
|
|
+-#define COPY_ARGS_6 COPY_ARGS_5 mov %i5, %o5;
|
|
|
+-
|
|
|
+-# ifndef __ASSEMBLER__
|
|
|
+-# define SINGLE_THREAD_P \
|
|
|
+- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
|
|
|
+- p_header.data.multiple_threads) == 0, 1)
|
|
|
+-# else
|
|
|
+-# define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1
|
|
|
+-# endif
|
|
|
+-
|
|
|
+-#elif !defined __ASSEMBLER__
|
|
|
+-
|
|
|
+-/* This code should never be used but we define it anyhow. */
|
|
|
+-# define SINGLE_THREAD_P (1)
|
|
|
+-
|
|
|
+-#endif
|
|
|
+diff --git a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S
|
|
|
+deleted file mode 100644
|
|
|
+index 3ff16b1..0000000
|
|
|
+--- a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,63 +0,0 @@
|
|
|
+-/* Copyright (C) 2003 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <sysdep-cancel.h>
|
|
|
+-
|
|
|
+-#ifdef SHARED
|
|
|
+-.LLGETPC0:
|
|
|
+- retl
|
|
|
+- add %o7, %o0, %o0
|
|
|
+-#endif
|
|
|
+-ENTRY(__vfork)
|
|
|
+-#ifdef SHARED
|
|
|
+- mov %o7, %o1
|
|
|
+- sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %o0
|
|
|
+- call .LLGETPC0
|
|
|
+- add %o0, %lo(_GLOBAL_OFFSET_TABLE_+4), %o0
|
|
|
+- sethi %hi(__libc_pthread_functions), %o2
|
|
|
+- mov %o1, %o7
|
|
|
+- or %o2, %lo(__libc_pthread_functions), %o2
|
|
|
+- ldx [%o0 + %o2], %o2
|
|
|
+- ldx [%o2], %o0
|
|
|
+-#else
|
|
|
+- .weak pthread_create
|
|
|
+- sethi %hi(pthread_create), %o0
|
|
|
+- or %o0, %lo(pthread_create), %o0
|
|
|
+-#endif
|
|
|
+-#if defined SHARED && !defined BROKEN_SPARC_WDISP22
|
|
|
+- cmp %o0, 0
|
|
|
+- bne HIDDEN_JUMPTARGET(fork)
|
|
|
+-#else
|
|
|
+- brnz,pn %o0, 1f
|
|
|
+-#endif
|
|
|
+- mov __NR_vfork, %g1
|
|
|
+- ta 0x6d
|
|
|
+- bcs,pn %xcc, __syscall_error_handler
|
|
|
+- nop
|
|
|
+- sub %o1, 1, %o1
|
|
|
+- retl
|
|
|
+- and %o0, %o1, %o0
|
|
|
+-#if !defined SHARED || defined BROKEN_SPARC_WDISP22
|
|
|
+-1: mov %o7, %g1
|
|
|
+- call HIDDEN_JUMPTARGET(fork)
|
|
|
+- mov %g1, %o7
|
|
|
+-#endif
|
|
|
+- SYSCALL_ERROR_HANDLER
|
|
|
+-PSEUDO_END (__vfork)
|
|
|
+-libc_hidden_def (__vfork)
|
|
|
+-weak_alias (__vfork, vfork)
|
|
|
+diff --git a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
|
|
|
+index fa656b3..bd9bb0d 100644
|
|
|
+--- a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
|
|
|
++++ b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
|
|
|
+@@ -1,10 +1,100 @@
|
|
|
+-#ifndef SPARC_SYSDEP_CANCEL_H
|
|
|
+-#define SPARC_SYSDEP_CANCEL_H
|
|
|
++/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
|
|
|
++ This file is part of the GNU C Library.
|
|
|
++ Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
|
|
|
+
|
|
|
+-#if defined(__arch64__)
|
|
|
+-#include <sparc64/sysdep-cancel.h>
|
|
|
+-#else
|
|
|
+-#include <sparc32/sysdep-cancel.h>
|
|
|
++ The GNU C Library is free software; you can redistribute it and/or
|
|
|
++ modify it under the terms of the GNU Lesser General Public
|
|
|
++ License as published by the Free Software Foundation; either
|
|
|
++ version 2.1 of the License, or (at your option) any later version.
|
|
|
++
|
|
|
++ The GNU C Library is distributed in the hope that it will be useful,
|
|
|
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
++ Lesser General Public License for more details.
|
|
|
++
|
|
|
++ You should have received a copy of the GNU Lesser General Public
|
|
|
++ License along with the GNU C Library; if not, see
|
|
|
++ <http://www.gnu.org/licenses/>. */
|
|
|
++
|
|
|
++#include <tls.h>
|
|
|
++#ifndef __ASSEMBLER__
|
|
|
++# include <linuxthreads/internals.h>
|
|
|
+ #endif
|
|
|
+
|
|
|
++#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
|
|
|
++
|
|
|
++# undef PSEUDO
|
|
|
++# define PSEUDO(name, syscall_name, args) \
|
|
|
++ .text; \
|
|
|
++ENTRY(name) \
|
|
|
++ ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1; \
|
|
|
++ cmp %g1, 0; \
|
|
|
++ bne 1f; \
|
|
|
++ mov SYS_ify(syscall_name), %g1; \
|
|
|
++ ta 0x10; \
|
|
|
++ bcs __syscall_error_handler; \
|
|
|
++ nop; \
|
|
|
++ .subsection 2; \
|
|
|
++1: save %sp, -96, %sp; \
|
|
|
++ CENABLE; \
|
|
|
++ nop; \
|
|
|
++ mov %o0, %l0; \
|
|
|
++ COPY_ARGS_##args \
|
|
|
++ mov SYS_ify(syscall_name), %g1; \
|
|
|
++ ta 0x10; \
|
|
|
++ bcs __syscall_error_handler2; \
|
|
|
++ mov %o0, %l1; \
|
|
|
++ CDISABLE; \
|
|
|
++ mov %l0, %o0; \
|
|
|
++ jmpl %i7 + 8, %g0; \
|
|
|
++ restore %g0, %l1, %o0; \
|
|
|
++ .previous; \
|
|
|
++ SYSCALL_ERROR_HANDLER \
|
|
|
++ SYSCALL_ERROR_HANDLER2
|
|
|
++
|
|
|
++#define SYSCALL_ERROR_HANDLER2 \
|
|
|
++SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler2) \
|
|
|
++ .global __errno_location; \
|
|
|
++ .type __errno_location,@function; \
|
|
|
++ CDISABLE; \
|
|
|
++ mov %l0, %o0; \
|
|
|
++ call __errno_location; \
|
|
|
++ nop; \
|
|
|
++ st %l1, [%o0]; \
|
|
|
++ jmpl %i7 + 8, %g0; \
|
|
|
++ restore %g0, -1, %o0; \
|
|
|
++ .previous;
|
|
|
++
|
|
|
++# ifdef IS_IN_libpthread
|
|
|
++# define CENABLE call __pthread_enable_asynccancel
|
|
|
++# define CDISABLE call __pthread_disable_asynccancel
|
|
|
++# elif !defined NOT_IN_libc
|
|
|
++# define CENABLE call __libc_enable_asynccancel
|
|
|
++# define CDISABLE call __libc_disable_asynccancel
|
|
|
++# else
|
|
|
++# define CENABLE call __librt_enable_asynccancel
|
|
|
++# define CDISABLE call __librt_disable_asynccancel
|
|
|
++# endif
|
|
|
++
|
|
|
++#define COPY_ARGS_0 /* Nothing */
|
|
|
++#define COPY_ARGS_1 COPY_ARGS_0 mov %i0, %o0;
|
|
|
++#define COPY_ARGS_2 COPY_ARGS_1 mov %i1, %o1;
|
|
|
++#define COPY_ARGS_3 COPY_ARGS_2 mov %i2, %o2;
|
|
|
++#define COPY_ARGS_4 COPY_ARGS_3 mov %i3, %o3;
|
|
|
++#define COPY_ARGS_5 COPY_ARGS_4 mov %i4, %o4;
|
|
|
++#define COPY_ARGS_6 COPY_ARGS_5 mov %i5, %o5;
|
|
|
++
|
|
|
++# ifndef __ASSEMBLER__
|
|
|
++# define SINGLE_THREAD_P \
|
|
|
++ __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
|
|
|
++ p_header.data.multiple_threads) == 0, 1)
|
|
|
++# else
|
|
|
++# define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1
|
|
|
++# endif
|
|
|
++
|
|
|
++#elif !defined __ASSEMBLER__
|
|
|
++
|
|
|
++/* This code should never be used but we define it anyhow. */
|
|
|
++# define SINGLE_THREAD_P (1)
|
|
|
++
|
|
|
+ #endif
|
|
|
+diff --git a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/vfork.S b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/vfork.S
|
|
|
+new file mode 100644
|
|
|
+index 0000000..ab2286e
|
|
|
+--- /dev/null
|
|
|
++++ b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/vfork.S
|
|
|
+@@ -0,0 +1,64 @@
|
|
|
++/* Copyright (C) 2003 Free Software Foundation, Inc.
|
|
|
++ This file is part of the GNU C Library.
|
|
|
++ Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
|
|
++
|
|
|
++ The GNU C Library is free software; you can redistribute it and/or
|
|
|
++ modify it under the terms of the GNU Lesser General Public
|
|
|
++ License as published by the Free Software Foundation; either
|
|
|
++ version 2.1 of the License, or (at your option) any later version.
|
|
|
++
|
|
|
++ The GNU C Library is distributed in the hope that it will be useful,
|
|
|
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
++ Lesser General Public License for more details.
|
|
|
++
|
|
|
++ You should have received a copy of the GNU Lesser General Public
|
|
|
++ License along with the GNU C Library; if not, see
|
|
|
++ <http://www.gnu.org/licenses/>. */
|
|
|
++
|
|
|
++#include <sysdep-cancel.h>
|
|
|
++
|
|
|
++ .text
|
|
|
++#ifdef SHARED
|
|
|
++.LLGETPC0:
|
|
|
++ retl
|
|
|
++ add %o7, %o0, %o0
|
|
|
++#endif
|
|
|
++ENTRY(__vfork)
|
|
|
++#ifdef SHARED
|
|
|
++ mov %o7, %o1
|
|
|
++ sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %o0
|
|
|
++ call .LLGETPC0
|
|
|
++ add %o0, %lo(_GLOBAL_OFFSET_TABLE_+4), %o0
|
|
|
++ sethi %hi(__libc_pthread_functions), %o2
|
|
|
++ mov %o1, %o7
|
|
|
++ or %o2, %lo(__libc_pthread_functions), %o2
|
|
|
++ ld [%o0 + %o2], %o2
|
|
|
++ ld [%o2], %o2
|
|
|
++ cmp %o2, 0
|
|
|
++#else
|
|
|
++ .weak pthread_create
|
|
|
++ sethi %hi(pthread_create), %o0
|
|
|
++ orcc %o0, %lo(pthread_create), %o0
|
|
|
++#endif
|
|
|
++#if defined SHARED && !defined BROKEN_SPARC_WDISP22
|
|
|
++ bne HIDDEN_JUMPTARGET(fork)
|
|
|
++#else
|
|
|
++ bne 1f
|
|
|
++#endif
|
|
|
++ mov __NR_vfork, %g1
|
|
|
++ ta 0x10
|
|
|
++ bcs __syscall_error_handler
|
|
|
++ nop
|
|
|
++ sub %o1, 1, %o1
|
|
|
++ retl
|
|
|
++ and %o0, %o1, %o0
|
|
|
++#if !defined SHARED || defined BROKEN_SPARC_WDISP22
|
|
|
++1: mov %o7, %g1
|
|
|
++ call HIDDEN_JUMPTARGET(fork)
|
|
|
++ mov %g1, %o7
|
|
|
++#endif
|
|
|
++ SYSCALL_ERROR_HANDLER
|
|
|
++PSEUDO_END (__vfork)
|
|
|
++libc_hidden_def (__vfork)
|
|
|
++weak_alias (__vfork, vfork)
|
|
|
+diff --git a/libpthread/nptl/sysdeps/jmpbuf-unwind.h b/libpthread/nptl/sysdeps/jmpbuf-unwind.h
|
|
|
+new file mode 100644
|
|
|
+index 0000000..2f64e7d
|
|
|
+--- /dev/null
|
|
|
++++ b/libpthread/nptl/sysdeps/jmpbuf-unwind.h
|
|
|
+@@ -0,0 +1,27 @@
|
|
|
++/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
|
|
++ This file is part of the GNU C Library.
|
|
|
++ Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
|
|
++
|
|
|
++ The GNU C Library is free software; you can redistribute it and/or
|
|
|
++ modify it under the terms of the GNU Lesser General Public
|
|
|
++ License as published by the Free Software Foundation; either
|
|
|
++ version 2.1 of the License, or (at your option) any later version.
|
|
|
++
|
|
|
++ The GNU C Library is distributed in the hope that it will be useful,
|
|
|
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
++ Lesser General Public License for more details.
|
|
|
++
|
|
|
++ You should have received a copy of the GNU Lesser General Public
|
|
|
++ License along with the GNU C Library; if not, see
|
|
|
++ <http://www.gnu.org/licenses/>. */
|
|
|
++
|
|
|
++#include <setjmp.h>
|
|
|
++#include <stdint.h>
|
|
|
++#include <unwind.h>
|
|
|
++
|
|
|
++#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
|
|
|
++ _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj)
|
|
|
++
|
|
|
++#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \
|
|
|
++ ((uintptr_t) (_address) - (_adj) < (uintptr_t) (_jmpbuf)[JB_SP] - (_adj))
|
|
|
+diff --git a/libpthread/nptl/sysdeps/pthread_spin_lock.c b/libpthread/nptl/sysdeps/pthread_spin_lock.c
|
|
|
+new file mode 100644
|
|
|
+index 0000000..2dfcd3c
|
|
|
+--- /dev/null
|
|
|
++++ b/libpthread/nptl/sysdeps/pthread_spin_lock.c
|
|
|
+@@ -0,0 +1,39 @@
|
|
|
++/* Copyright (C) 2003 Free Software Foundation, Inc.
|
|
|
++ This file is part of the GNU C Library.
|
|
|
++ Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
|
|
++
|
|
|
++ The GNU C Library is free software; you can redistribute it and/or
|
|
|
++ modify it under the terms of the GNU Lesser General Public
|
|
|
++ License as published by the Free Software Foundation; either
|
|
|
++ version 2.1 of the License, or (at your option) any later version.
|
|
|
++
|
|
|
++ The GNU C Library is distributed in the hope that it will be useful,
|
|
|
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
++ Lesser General Public License for more details.
|
|
|
++
|
|
|
++ You should have received a copy of the GNU Lesser General Public
|
|
|
++ License along with the GNU C Library; if not, see
|
|
|
++ <http://www.gnu.org/licenses/>. */
|
|
|
++
|
|
|
++#include "pthreadP.h"
|
|
|
++
|
|
|
++int
|
|
|
++pthread_spin_lock (pthread_spinlock_t *lock)
|
|
|
++{
|
|
|
++ __asm__ __volatile__
|
|
|
++ ("1: ldstub [%0], %%g2\n"
|
|
|
++ " orcc %%g2, 0x0, %%g0\n"
|
|
|
++ " bne,a 2f\n"
|
|
|
++ " ldub [%0], %%g2\n"
|
|
|
++ ".subsection 2\n"
|
|
|
++ "2: orcc %%g2, 0x0, %%g0\n"
|
|
|
++ " bne,a 2b\n"
|
|
|
++ " ldub [%0], %%g2\n"
|
|
|
++ " b,a 1b\n"
|
|
|
++ ".previous"
|
|
|
++ : /* no outputs */
|
|
|
++ : "r" (lock)
|
|
|
++ : "g2", "memory", "cc");
|
|
|
++ return 0;
|
|
|
++}
|
|
|
+diff --git a/libpthread/nptl/sysdeps/pthread_spin_trylock.c b/libpthread/nptl/sysdeps/pthread_spin_trylock.c
|
|
|
+new file mode 100644
|
|
|
+index 0000000..c1b7b23
|
|
|
+--- /dev/null
|
|
|
++++ b/libpthread/nptl/sysdeps/pthread_spin_trylock.c
|
|
|
+@@ -0,0 +1,28 @@
|
|
|
++/* Copyright (C) 2003 Free Software Foundation, Inc.
|
|
|
++ This file is part of the GNU C Library.
|
|
|
++ Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
|
|
++
|
|
|
++ The GNU C Library is free software; you can redistribute it and/or
|
|
|
++ modify it under the terms of the GNU Lesser General Public
|
|
|
++ License as published by the Free Software Foundation; either
|
|
|
++ version 2.1 of the License, or (at your option) any later version.
|
|
|
++
|
|
|
++ The GNU C Library is distributed in the hope that it will be useful,
|
|
|
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
++ Lesser General Public License for more details.
|
|
|
++
|
|
|
++ You should have received a copy of the GNU Lesser General Public
|
|
|
++ License along with the GNU C Library; if not, see
|
|
|
++ <http://www.gnu.org/licenses/>. */
|
|
|
++
|
|
|
++#include <errno.h>
|
|
|
++#include "pthreadP.h"
|
|
|
++
|
|
|
++int
|
|
|
++pthread_spin_trylock (pthread_spinlock_t *lock)
|
|
|
++{
|
|
|
++ int res;
|
|
|
++ __asm__ __volatile__ ("ldstub [%1], %0" : "=r" (res) : "r" (lock) : "memory");
|
|
|
++ return res == 0 ? 0 : EBUSY;
|
|
|
++}
|
|
|
+diff --git a/libpthread/nptl/sysdeps/pthreaddef.h b/libpthread/nptl/sysdeps/pthreaddef.h
|
|
|
+new file mode 100644
|
|
|
+index 0000000..435fedc
|
|
|
+--- /dev/null
|
|
|
++++ b/libpthread/nptl/sysdeps/pthreaddef.h
|
|
|
+@@ -0,0 +1,39 @@
|
|
|
++/* 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, see
|
|
|
++ <http://www.gnu.org/licenses/>. */
|
|
|
++
|
|
|
++/* Default stack size. */
|
|
|
++#define ARCH_STACK_DEFAULT_SIZE (2 * 1024 * 1024)
|
|
|
++
|
|
|
++/* Required stack pointer alignment at beginning. */
|
|
|
++#define STACK_ALIGN 16
|
|
|
++
|
|
|
++/* Minimal stack size after allocating thread descriptor and guard size. */
|
|
|
++#define MINIMAL_REST_STACK 2048
|
|
|
++
|
|
|
++/* Alignment requirement for TCB. */
|
|
|
++#define TCB_ALIGNMENT 16
|
|
|
++
|
|
|
++
|
|
|
++/* Location of current stack frame. */
|
|
|
++#define CURRENT_STACK_FRAME (stack_pointer + (2 * 64))
|
|
|
++register char *stack_pointer __asm__("%sp");
|
|
|
++
|
|
|
++/* XXX Until we have a better place keep the definitions here. */
|
|
|
++
|
|
|
++/* While there is no such syscall. */
|
|
|
++#define __exit_thread_inline(val) \
|
|
|
++ INLINE_SYSCALL (exit, 1, (val))
|
|
|
+diff --git a/libpthread/nptl/sysdeps/sparc/jmpbuf-unwind.h b/libpthread/nptl/sysdeps/sparc/jmpbuf-unwind.h
|
|
|
+index 6cbb37b..2f64e7d 100644
|
|
|
+--- a/libpthread/nptl/sysdeps/sparc/jmpbuf-unwind.h
|
|
|
++++ b/libpthread/nptl/sysdeps/sparc/jmpbuf-unwind.h
|
|
|
+@@ -1,5 +1,27 @@
|
|
|
+-#if defined(__arch64__)
|
|
|
+-#include "sparc64/jmpbuf-unwind.h"
|
|
|
+-#else
|
|
|
+-#include "sparc32/jmpbuf-unwind.h"
|
|
|
+-#endif
|
|
|
++/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
|
|
++ This file is part of the GNU C Library.
|
|
|
++ Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
|
|
++
|
|
|
++ The GNU C Library is free software; you can redistribute it and/or
|
|
|
++ modify it under the terms of the GNU Lesser General Public
|
|
|
++ License as published by the Free Software Foundation; either
|
|
|
++ version 2.1 of the License, or (at your option) any later version.
|
|
|
++
|
|
|
++ The GNU C Library is distributed in the hope that it will be useful,
|
|
|
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
++ Lesser General Public License for more details.
|
|
|
++
|
|
|
++ You should have received a copy of the GNU Lesser General Public
|
|
|
++ License along with the GNU C Library; if not, see
|
|
|
++ <http://www.gnu.org/licenses/>. */
|
|
|
++
|
|
|
++#include <setjmp.h>
|
|
|
++#include <stdint.h>
|
|
|
++#include <unwind.h>
|
|
|
++
|
|
|
++#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
|
|
|
++ _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj)
|
|
|
++
|
|
|
++#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \
|
|
|
++ ((uintptr_t) (_address) - (_adj) < (uintptr_t) (_jmpbuf)[JB_SP] - (_adj))
|
|
|
+diff --git a/libpthread/nptl/sysdeps/sparc/pthread_spin_lock.c b/libpthread/nptl/sysdeps/sparc/pthread_spin_lock.c
|
|
|
+index dcc5ae2..2dfcd3c 100644
|
|
|
+--- a/libpthread/nptl/sysdeps/sparc/pthread_spin_lock.c
|
|
|
++++ b/libpthread/nptl/sysdeps/sparc/pthread_spin_lock.c
|
|
|
+@@ -1,5 +1,39 @@
|
|
|
+-#if defined(__arch64__)
|
|
|
+-#include "sparc64/pthread_spin_lock.c"
|
|
|
+-#else
|
|
|
+-#include "sparc32/pthread_spin_lock.c"
|
|
|
+-#endif
|
|
|
++/* Copyright (C) 2003 Free Software Foundation, Inc.
|
|
|
++ This file is part of the GNU C Library.
|
|
|
++ Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
|
|
++
|
|
|
++ The GNU C Library is free software; you can redistribute it and/or
|
|
|
++ modify it under the terms of the GNU Lesser General Public
|
|
|
++ License as published by the Free Software Foundation; either
|
|
|
++ version 2.1 of the License, or (at your option) any later version.
|
|
|
++
|
|
|
++ The GNU C Library is distributed in the hope that it will be useful,
|
|
|
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
++ Lesser General Public License for more details.
|
|
|
++
|
|
|
++ You should have received a copy of the GNU Lesser General Public
|
|
|
++ License along with the GNU C Library; if not, see
|
|
|
++ <http://www.gnu.org/licenses/>. */
|
|
|
++
|
|
|
++#include "pthreadP.h"
|
|
|
++
|
|
|
++int
|
|
|
++pthread_spin_lock (pthread_spinlock_t *lock)
|
|
|
++{
|
|
|
++ __asm__ __volatile__
|
|
|
++ ("1: ldstub [%0], %%g2\n"
|
|
|
++ " orcc %%g2, 0x0, %%g0\n"
|
|
|
++ " bne,a 2f\n"
|
|
|
++ " ldub [%0], %%g2\n"
|
|
|
++ ".subsection 2\n"
|
|
|
++ "2: orcc %%g2, 0x0, %%g0\n"
|
|
|
++ " bne,a 2b\n"
|
|
|
++ " ldub [%0], %%g2\n"
|
|
|
++ " b,a 1b\n"
|
|
|
++ ".previous"
|
|
|
++ : /* no outputs */
|
|
|
++ : "r" (lock)
|
|
|
++ : "g2", "memory", "cc");
|
|
|
++ return 0;
|
|
|
++}
|
|
|
+diff --git a/libpthread/nptl/sysdeps/sparc/pthread_spin_trylock.c b/libpthread/nptl/sysdeps/sparc/pthread_spin_trylock.c
|
|
|
+index af63eec..c1b7b23 100644
|
|
|
+--- a/libpthread/nptl/sysdeps/sparc/pthread_spin_trylock.c
|
|
|
++++ b/libpthread/nptl/sysdeps/sparc/pthread_spin_trylock.c
|
|
|
+@@ -1,5 +1,28 @@
|
|
|
+-#if defined(__arch64__)
|
|
|
+-#include "sparc64/pthread_spin_trylock.c"
|
|
|
+-#else
|
|
|
+-#include "sparc32/pthread_spin_trylock.c"
|
|
|
+-#endif
|
|
|
++/* Copyright (C) 2003 Free Software Foundation, Inc.
|
|
|
++ This file is part of the GNU C Library.
|
|
|
++ Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
|
|
++
|
|
|
++ The GNU C Library is free software; you can redistribute it and/or
|
|
|
++ modify it under the terms of the GNU Lesser General Public
|
|
|
++ License as published by the Free Software Foundation; either
|
|
|
++ version 2.1 of the License, or (at your option) any later version.
|
|
|
++
|
|
|
++ The GNU C Library is distributed in the hope that it will be useful,
|
|
|
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
++ Lesser General Public License for more details.
|
|
|
++
|
|
|
++ You should have received a copy of the GNU Lesser General Public
|
|
|
++ License along with the GNU C Library; if not, see
|
|
|
++ <http://www.gnu.org/licenses/>. */
|
|
|
++
|
|
|
++#include <errno.h>
|
|
|
++#include "pthreadP.h"
|
|
|
++
|
|
|
++int
|
|
|
++pthread_spin_trylock (pthread_spinlock_t *lock)
|
|
|
++{
|
|
|
++ int res;
|
|
|
++ __asm__ __volatile__ ("ldstub [%1], %0" : "=r" (res) : "r" (lock) : "memory");
|
|
|
++ return res == 0 ? 0 : EBUSY;
|
|
|
++}
|
|
|
+diff --git a/libpthread/nptl/sysdeps/sparc/pthreaddef.h b/libpthread/nptl/sysdeps/sparc/pthreaddef.h
|
|
|
+index d4695c4..435fedc 100644
|
|
|
+--- a/libpthread/nptl/sysdeps/sparc/pthreaddef.h
|
|
|
++++ b/libpthread/nptl/sysdeps/sparc/pthreaddef.h
|
|
|
+@@ -1,5 +1,39 @@
|
|
|
+-#if defined(__arch64__)
|
|
|
+-#include "sparc64/pthreaddef.h"
|
|
|
+-#else
|
|
|
+-#include "sparc32/pthreaddef.h"
|
|
|
+-#endif
|
|
|
++/* 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, see
|
|
|
++ <http://www.gnu.org/licenses/>. */
|
|
|
++
|
|
|
++/* Default stack size. */
|
|
|
++#define ARCH_STACK_DEFAULT_SIZE (2 * 1024 * 1024)
|
|
|
++
|
|
|
++/* Required stack pointer alignment at beginning. */
|
|
|
++#define STACK_ALIGN 16
|
|
|
++
|
|
|
++/* Minimal stack size after allocating thread descriptor and guard size. */
|
|
|
++#define MINIMAL_REST_STACK 2048
|
|
|
++
|
|
|
++/* Alignment requirement for TCB. */
|
|
|
++#define TCB_ALIGNMENT 16
|
|
|
++
|
|
|
++
|
|
|
++/* Location of current stack frame. */
|
|
|
++#define CURRENT_STACK_FRAME (stack_pointer + (2 * 64))
|
|
|
++register char *stack_pointer __asm__("%sp");
|
|
|
++
|
|
|
++/* XXX Until we have a better place keep the definitions here. */
|
|
|
++
|
|
|
++/* While there is no such syscall. */
|
|
|
++#define __exit_thread_inline(val) \
|
|
|
++ INLINE_SYSCALL (exit, 1, (val))
|
|
|
+diff --git a/libpthread/nptl/sysdeps/sparc/sparc32/jmpbuf-unwind.h b/libpthread/nptl/sysdeps/sparc/sparc32/jmpbuf-unwind.h
|
|
|
+deleted file mode 100644
|
|
|
+index 2f64e7d..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/sparc/sparc32/jmpbuf-unwind.h
|
|
|
++++ /dev/null
|
|
|
+@@ -1,27 +0,0 @@
|
|
|
+-/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <setjmp.h>
|
|
|
+-#include <stdint.h>
|
|
|
+-#include <unwind.h>
|
|
|
+-
|
|
|
+-#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
|
|
|
+- _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj)
|
|
|
+-
|
|
|
+-#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \
|
|
|
+- ((uintptr_t) (_address) - (_adj) < (uintptr_t) (_jmpbuf)[JB_SP] - (_adj))
|
|
|
+diff --git a/libpthread/nptl/sysdeps/sparc/sparc32/pthread_spin_lock.c b/libpthread/nptl/sysdeps/sparc/sparc32/pthread_spin_lock.c
|
|
|
+deleted file mode 100644
|
|
|
+index 2dfcd3c..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/sparc/sparc32/pthread_spin_lock.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1,39 +0,0 @@
|
|
|
+-/* Copyright (C) 2003 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include "pthreadP.h"
|
|
|
+-
|
|
|
+-int
|
|
|
+-pthread_spin_lock (pthread_spinlock_t *lock)
|
|
|
+-{
|
|
|
+- __asm__ __volatile__
|
|
|
+- ("1: ldstub [%0], %%g2\n"
|
|
|
+- " orcc %%g2, 0x0, %%g0\n"
|
|
|
+- " bne,a 2f\n"
|
|
|
+- " ldub [%0], %%g2\n"
|
|
|
+- ".subsection 2\n"
|
|
|
+- "2: orcc %%g2, 0x0, %%g0\n"
|
|
|
+- " bne,a 2b\n"
|
|
|
+- " ldub [%0], %%g2\n"
|
|
|
+- " b,a 1b\n"
|
|
|
+- ".previous"
|
|
|
+- : /* no outputs */
|
|
|
+- : "r" (lock)
|
|
|
+- : "g2", "memory", "cc");
|
|
|
+- return 0;
|
|
|
+-}
|
|
|
+diff --git a/libpthread/nptl/sysdeps/sparc/sparc32/pthread_spin_trylock.c b/libpthread/nptl/sysdeps/sparc/sparc32/pthread_spin_trylock.c
|
|
|
+deleted file mode 100644
|
|
|
+index c1b7b23..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/sparc/sparc32/pthread_spin_trylock.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1,28 +0,0 @@
|
|
|
+-/* Copyright (C) 2003 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <errno.h>
|
|
|
+-#include "pthreadP.h"
|
|
|
+-
|
|
|
+-int
|
|
|
+-pthread_spin_trylock (pthread_spinlock_t *lock)
|
|
|
+-{
|
|
|
+- int res;
|
|
|
+- __asm__ __volatile__ ("ldstub [%1], %0" : "=r" (res) : "r" (lock) : "memory");
|
|
|
+- return res == 0 ? 0 : EBUSY;
|
|
|
+-}
|
|
|
+diff --git a/libpthread/nptl/sysdeps/sparc/sparc32/pthreaddef.h b/libpthread/nptl/sysdeps/sparc/sparc32/pthreaddef.h
|
|
|
+deleted file mode 100644
|
|
|
+index 435fedc..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/sparc/sparc32/pthreaddef.h
|
|
|
++++ /dev/null
|
|
|
+@@ -1,39 +0,0 @@
|
|
|
+-/* 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, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-/* Default stack size. */
|
|
|
+-#define ARCH_STACK_DEFAULT_SIZE (2 * 1024 * 1024)
|
|
|
+-
|
|
|
+-/* Required stack pointer alignment at beginning. */
|
|
|
+-#define STACK_ALIGN 16
|
|
|
+-
|
|
|
+-/* Minimal stack size after allocating thread descriptor and guard size. */
|
|
|
+-#define MINIMAL_REST_STACK 2048
|
|
|
+-
|
|
|
+-/* Alignment requirement for TCB. */
|
|
|
+-#define TCB_ALIGNMENT 16
|
|
|
+-
|
|
|
+-
|
|
|
+-/* Location of current stack frame. */
|
|
|
+-#define CURRENT_STACK_FRAME (stack_pointer + (2 * 64))
|
|
|
+-register char *stack_pointer __asm__("%sp");
|
|
|
+-
|
|
|
+-/* XXX Until we have a better place keep the definitions here. */
|
|
|
+-
|
|
|
+-/* While there is no such syscall. */
|
|
|
+-#define __exit_thread_inline(val) \
|
|
|
+- INLINE_SYSCALL (exit, 1, (val))
|
|
|
+diff --git a/libpthread/nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_lock.c b/libpthread/nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_lock.c
|
|
|
+deleted file mode 100644
|
|
|
+index 3d314be..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_lock.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1,38 +0,0 @@
|
|
|
+-/* Copyright (C) 2003 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include "pthreadP.h"
|
|
|
+-
|
|
|
+-int
|
|
|
+-pthread_spin_lock (pthread_spinlock_t *lock)
|
|
|
+-{
|
|
|
+- __asm__ __volatile__
|
|
|
+- ("1: ldstub [%0], %%g2\n"
|
|
|
+- " brnz,pn %%g2, 2f\n"
|
|
|
+- " membar #StoreLoad | #StoreStore\n"
|
|
|
+- ".subsection 2\n"
|
|
|
+- "2: ldub [%0], %%g2\n"
|
|
|
+- " brnz,pt %%g2, 2b\n"
|
|
|
+- " membar #LoadLoad\n"
|
|
|
+- " b,a,pt %%xcc, 1b\n"
|
|
|
+- ".previous"
|
|
|
+- : /* no outputs */
|
|
|
+- : "r" (lock)
|
|
|
+- : "g2", "memory");
|
|
|
+- return 0;
|
|
|
+-}
|
|
|
+diff --git a/libpthread/nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_trylock.c b/libpthread/nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_trylock.c
|
|
|
+deleted file mode 100644
|
|
|
+index 3b20a21..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_trylock.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1 +0,0 @@
|
|
|
+-#include <sparc64/pthread_spin_trylock.c>
|
|
|
+diff --git a/libpthread/nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_unlock.c b/libpthread/nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_unlock.c
|
|
|
+deleted file mode 100644
|
|
|
+index 482cbe3..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_unlock.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1 +0,0 @@
|
|
|
+-#include <sparc64/pthread_spin_unlock.c>
|
|
|
+diff --git a/libpthread/nptl/sysdeps/sparc/sparc64/jmpbuf-unwind.h b/libpthread/nptl/sysdeps/sparc/sparc64/jmpbuf-unwind.h
|
|
|
+deleted file mode 100644
|
|
|
+index 2f64e7d..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/sparc/sparc64/jmpbuf-unwind.h
|
|
|
++++ /dev/null
|
|
|
+@@ -1,27 +0,0 @@
|
|
|
+-/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <setjmp.h>
|
|
|
+-#include <stdint.h>
|
|
|
+-#include <unwind.h>
|
|
|
+-
|
|
|
+-#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
|
|
|
+- _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj)
|
|
|
+-
|
|
|
+-#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \
|
|
|
+- ((uintptr_t) (_address) - (_adj) < (uintptr_t) (_jmpbuf)[JB_SP] - (_adj))
|
|
|
+diff --git a/libpthread/nptl/sysdeps/sparc/sparc64/pthread_spin_lock.c b/libpthread/nptl/sysdeps/sparc/sparc64/pthread_spin_lock.c
|
|
|
+deleted file mode 100644
|
|
|
+index 0235056..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/sparc/sparc64/pthread_spin_lock.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1,38 +0,0 @@
|
|
|
+-/* Copyright (C) 2003 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include "pthreadP.h"
|
|
|
+-
|
|
|
+-int
|
|
|
+-pthread_spin_lock (pthread_spinlock_t *lock)
|
|
|
+-{
|
|
|
+- __asm__ __volatile__
|
|
|
+- ("1: ldstub [%0], %%g5\n"
|
|
|
+- " brnz,pn %%g5, 2f\n"
|
|
|
+- " membar #StoreLoad | #StoreStore\n"
|
|
|
+- ".subsection 2\n"
|
|
|
+- "2: ldub [%0], %%g5\n"
|
|
|
+- " brnz,pt %%g5, 2b\n"
|
|
|
+- " membar #LoadLoad\n"
|
|
|
+- " b,a,pt %%xcc, 1b\n"
|
|
|
+- ".previous"
|
|
|
+- : /* no outputs */
|
|
|
+- : "r" (lock)
|
|
|
+- : "g5", "memory");
|
|
|
+- return 0;
|
|
|
+-}
|
|
|
+diff --git a/libpthread/nptl/sysdeps/sparc/sparc64/pthread_spin_trylock.c b/libpthread/nptl/sysdeps/sparc/sparc64/pthread_spin_trylock.c
|
|
|
+deleted file mode 100644
|
|
|
+index b14621b..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/sparc/sparc64/pthread_spin_trylock.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1,33 +0,0 @@
|
|
|
+-/* Copyright (C) 2003 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <errno.h>
|
|
|
+-#include "pthreadP.h"
|
|
|
+-
|
|
|
+-int
|
|
|
+-pthread_spin_trylock (pthread_spinlock_t *lock)
|
|
|
+-{
|
|
|
+- int res;
|
|
|
+- __asm__ __volatile__
|
|
|
+- ("ldstub [%1], %0\n"
|
|
|
+- "membar #StoreLoad | #StoreStore"
|
|
|
+- : "=r" (res)
|
|
|
+- : "r" (lock)
|
|
|
+- : "memory");
|
|
|
+- return res == 0 ? 0 : EBUSY;
|
|
|
+-}
|
|
|
+diff --git a/libpthread/nptl/sysdeps/sparc/sparc64/pthread_spin_unlock.c b/libpthread/nptl/sysdeps/sparc/sparc64/pthread_spin_unlock.c
|
|
|
+deleted file mode 100644
|
|
|
+index a00fad3..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/sparc/sparc64/pthread_spin_unlock.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1,29 +0,0 @@
|
|
|
+-/* pthread_spin_unlock -- unlock a spin lock. Generic version.
|
|
|
+- Copyright (C) 2003 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include "pthreadP.h"
|
|
|
+-#include <atomic.h>
|
|
|
+-
|
|
|
+-int
|
|
|
+-pthread_spin_unlock (pthread_spinlock_t *lock)
|
|
|
+-{
|
|
|
+- __asm__ __volatile__ ("membar #StoreStore | #LoadStore");
|
|
|
+- *lock = 0;
|
|
|
+- return 0;
|
|
|
+-}
|
|
|
+diff --git a/libpthread/nptl/sysdeps/sparc/sparc64/pthreaddef.h b/libpthread/nptl/sysdeps/sparc/sparc64/pthreaddef.h
|
|
|
+deleted file mode 100644
|
|
|
+index 845f4bf..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/sparc/sparc64/pthreaddef.h
|
|
|
++++ /dev/null
|
|
|
+@@ -1,39 +0,0 @@
|
|
|
+-/* 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, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-/* Default stack size. */
|
|
|
+-#define ARCH_STACK_DEFAULT_SIZE (4 * 1024 * 1024)
|
|
|
+-
|
|
|
+-/* Required stack pointer alignment at beginning. */
|
|
|
+-#define STACK_ALIGN 16
|
|
|
+-
|
|
|
+-/* Minimal stack size after allocating thread descriptor and guard size. */
|
|
|
+-#define MINIMAL_REST_STACK 4096
|
|
|
+-
|
|
|
+-/* Alignment requirement for TCB. */
|
|
|
+-#define TCB_ALIGNMENT 16
|
|
|
+-
|
|
|
+-
|
|
|
+-/* Location of current stack frame. */
|
|
|
+-#define CURRENT_STACK_FRAME (stack_pointer + (2 * 128))
|
|
|
+-register char *stack_pointer __asm__("%sp");
|
|
|
+-
|
|
|
+-/* XXX Until we have a better place keep the definitions here. */
|
|
|
+-
|
|
|
+-/* While there is no such syscall. */
|
|
|
+-#define __exit_thread_inline(val) \
|
|
|
+- INLINE_SYSCALL (exit, 1, (val))
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/clone.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/clone.S
|
|
|
+index dfc5e82..a6142aa 100644
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/clone.S
|
|
|
++++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/clone.S
|
|
|
+@@ -1,5 +1,2 @@
|
|
|
+-#if defined(__arch64__)
|
|
|
+-#include "./sparc64/clone.S"
|
|
|
+-#else
|
|
|
+-#include "./sparc32/clone.S"
|
|
|
+-#endif
|
|
|
++#define RESET_PID
|
|
|
++#include <libc/sysdeps/linux/sparc/clone.S>
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/pt-vfork.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/pt-vfork.S
|
|
|
+index e8705c5..37231a8 100644
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/pt-vfork.S
|
|
|
++++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/pt-vfork.S
|
|
|
+@@ -1,5 +1,44 @@
|
|
|
+-#if defined(__arch64__)
|
|
|
+-#include "sparc64/pt-vfork.S"
|
|
|
+-#else
|
|
|
+-#include "sparc32/pt-vfork.S"
|
|
|
+-#endif
|
|
|
++/* Copyright (C) 2004 Free Software Foundation, Inc.
|
|
|
++ This file is part of the GNU C Library.
|
|
|
++ Contributed by Jakub Jelinek <jakub@redhat.com>, 2004.
|
|
|
++
|
|
|
++ The GNU C Library is free software; you can redistribute it and/or
|
|
|
++ modify it under the terms of the GNU Lesser General Public
|
|
|
++ License as published by the Free Software Foundation; either
|
|
|
++ version 2.1 of the License, or (at your option) any later version.
|
|
|
++
|
|
|
++ The GNU C Library is distributed in the hope that it will be useful,
|
|
|
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
++ Lesser General Public License for more details.
|
|
|
++
|
|
|
++ You should have received a copy of the GNU Lesser General Public
|
|
|
++ License along with the GNU C Library; if not, see
|
|
|
++ <http://www.gnu.org/licenses/>. */
|
|
|
++
|
|
|
++#include <sysdep.h>
|
|
|
++#include <tcb-offsets.h>
|
|
|
++
|
|
|
++ .text
|
|
|
++ .globl __syscall_error
|
|
|
++ENTRY(__vfork)
|
|
|
++ ld [%g7 + PID], %o5
|
|
|
++ sub %g0, %o5, %o4
|
|
|
++ st %o4, [%g7 + PID]
|
|
|
++
|
|
|
++ LOADSYSCALL(vfork)
|
|
|
++ ta 0x10
|
|
|
++ bcc 2f
|
|
|
++ mov %o7, %g1
|
|
|
++ st %o5, [%g7 + PID]
|
|
|
++ call __syscall_error
|
|
|
++ mov %g1, %o7
|
|
|
++2: sub %o1, 1, %o1
|
|
|
++ andcc %o0, %o1, %o0
|
|
|
++ bne,a 1f
|
|
|
++ st %o5, [%g7 + PID]
|
|
|
++1: retl
|
|
|
++ nop
|
|
|
++END(__vfork)
|
|
|
++
|
|
|
++weak_alias (__vfork, vfork)
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/pthread_barrier_wait.c b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/pthread_barrier_wait.c
|
|
|
+index 73eaa69..169f6e7 100644
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/pthread_barrier_wait.c
|
|
|
++++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/pthread_barrier_wait.c
|
|
|
+@@ -1 +1,93 @@
|
|
|
+-#include "sparc32/pthread_barrier_wait.c"
|
|
|
++/* Copyright (C) 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
|
|
|
++ This file is part of the GNU C Library.
|
|
|
++ Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003.
|
|
|
++
|
|
|
++ The GNU C Library is free software; you can redistribute it and/or
|
|
|
++ modify it under the terms of the GNU Lesser General Public
|
|
|
++ License as published by the Free Software Foundation; either
|
|
|
++ version 2.1 of the License, or (at your option) any later version.
|
|
|
++
|
|
|
++ The GNU C Library is distributed in the hope that it will be useful,
|
|
|
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
++ Lesser General Public License for more details.
|
|
|
++
|
|
|
++ You should have received a copy of the GNU Lesser General Public
|
|
|
++ License along with the GNU C Library; if not, see
|
|
|
++ <http://www.gnu.org/licenses/>. */
|
|
|
++
|
|
|
++#include <errno.h>
|
|
|
++#include <sysdep.h>
|
|
|
++#include <lowlevellock.h>
|
|
|
++#include <pthreadP.h>
|
|
|
++
|
|
|
++/* Wait on barrier. */
|
|
|
++int
|
|
|
++pthread_barrier_wait (
|
|
|
++ pthread_barrier_t *barrier)
|
|
|
++{
|
|
|
++ union sparc_pthread_barrier *ibarrier
|
|
|
++ = (union sparc_pthread_barrier *) barrier;
|
|
|
++ int result = 0;
|
|
|
++ int private = ibarrier->s.pshared ? LLL_SHARED : LLL_PRIVATE;
|
|
|
++
|
|
|
++ /* Make sure we are alone. */
|
|
|
++ lll_lock (ibarrier->b.lock, private);
|
|
|
++
|
|
|
++ /* One more arrival. */
|
|
|
++ --ibarrier->b.left;
|
|
|
++
|
|
|
++ /* Are these all? */
|
|
|
++ if (ibarrier->b.left == 0)
|
|
|
++ {
|
|
|
++ /* Yes. Increment the event counter to avoid invalid wake-ups and
|
|
|
++ tell the current waiters that it is their turn. */
|
|
|
++ ++ibarrier->b.curr_event;
|
|
|
++
|
|
|
++ /* Wake up everybody. */
|
|
|
++ lll_futex_wake (&ibarrier->b.curr_event, INT_MAX, private);
|
|
|
++
|
|
|
++ /* This is the thread which finished the serialization. */
|
|
|
++ result = PTHREAD_BARRIER_SERIAL_THREAD;
|
|
|
++ }
|
|
|
++ else
|
|
|
++ {
|
|
|
++ /* The number of the event we are waiting for. The barrier's event
|
|
|
++ number must be bumped before we continue. */
|
|
|
++ unsigned int event = ibarrier->b.curr_event;
|
|
|
++
|
|
|
++ /* Before suspending, make the barrier available to others. */
|
|
|
++ lll_unlock (ibarrier->b.lock, private);
|
|
|
++
|
|
|
++ /* Wait for the event counter of the barrier to change. */
|
|
|
++ do
|
|
|
++ lll_futex_wait (&ibarrier->b.curr_event, event, private);
|
|
|
++ while (event == ibarrier->b.curr_event);
|
|
|
++ }
|
|
|
++
|
|
|
++ /* Make sure the init_count is stored locally or in a register. */
|
|
|
++ unsigned int init_count = ibarrier->b.init_count;
|
|
|
++
|
|
|
++ /* If this was the last woken thread, unlock. */
|
|
|
++ if (__atomic_is_v9 || ibarrier->s.pshared == 0)
|
|
|
++ {
|
|
|
++ if (atomic_increment_val (&ibarrier->b.left) == init_count)
|
|
|
++ /* We are done. */
|
|
|
++ lll_unlock (ibarrier->b.lock, private);
|
|
|
++ }
|
|
|
++ else
|
|
|
++ {
|
|
|
++ unsigned int left;
|
|
|
++ /* Slightly more complicated. On pre-v9 CPUs, atomic_increment_val
|
|
|
++ is only atomic for threads within the same process, not for
|
|
|
++ multiple processes. */
|
|
|
++ __sparc32_atomic_do_lock24 (&ibarrier->s.left_lock);
|
|
|
++ left = ++ibarrier->b.left;
|
|
|
++ __sparc32_atomic_do_unlock24 (&ibarrier->s.left_lock);
|
|
|
++ if (left == init_count)
|
|
|
++ /* We are done. */
|
|
|
++ lll_unlock (ibarrier->b.lock, private);
|
|
|
++ }
|
|
|
++
|
|
|
++ return result;
|
|
|
++}
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_post.c b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_post.c
|
|
|
+new file mode 100644
|
|
|
+index 0000000..8da4193
|
|
|
+--- /dev/null
|
|
|
++++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_post.c
|
|
|
+@@ -0,0 +1,52 @@
|
|
|
++/* sem_post -- post to a POSIX semaphore. SPARC version.
|
|
|
++ Copyright (C) 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
|
|
|
++ This file is part of the GNU C Library.
|
|
|
++ Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
|
|
++
|
|
|
++ The GNU C Library is free software; you can redistribute it and/or
|
|
|
++ modify it under the terms of the GNU Lesser General Public
|
|
|
++ License as published by the Free Software Foundation; either
|
|
|
++ version 2.1 of the License, or (at your option) any later version.
|
|
|
++
|
|
|
++ The GNU C Library is distributed in the hope that it will be useful,
|
|
|
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
++ Lesser General Public License for more details.
|
|
|
++
|
|
|
++ You should have received a copy of the GNU Lesser General Public
|
|
|
++ License along with the GNU C Library; if not, see
|
|
|
++ <http://www.gnu.org/licenses/>. */
|
|
|
++
|
|
|
++#include <errno.h>
|
|
|
++#include <sysdep.h>
|
|
|
++#include <lowlevellock.h>
|
|
|
++#include <internaltypes.h>
|
|
|
++#include <semaphore.h>
|
|
|
++
|
|
|
++int
|
|
|
++sem_post (sem_t *sem)
|
|
|
++{
|
|
|
++ struct sparc_new_sem *isem = (struct sparc_new_sem *) sem;
|
|
|
++ int nr;
|
|
|
++
|
|
|
++ if (__atomic_is_v9)
|
|
|
++ nr = atomic_increment_val (&isem->value);
|
|
|
++ else
|
|
|
++ {
|
|
|
++ __sparc32_atomic_do_lock24 (&isem->lock);
|
|
|
++ nr = ++(isem->value);
|
|
|
++ __sparc32_atomic_do_unlock24 (&isem->lock);
|
|
|
++ }
|
|
|
++ atomic_full_barrier ();
|
|
|
++ if (isem->nwaiters > 0)
|
|
|
++ {
|
|
|
++ int err = lll_futex_wake (&isem->value, 1,
|
|
|
++ isem->private ^ FUTEX_PRIVATE_FLAG);
|
|
|
++ if (__builtin_expect (err, 0) < 0)
|
|
|
++ {
|
|
|
++ __set_errno (-err);
|
|
|
++ return -1;
|
|
|
++ }
|
|
|
++ }
|
|
|
++ return 0;
|
|
|
++}
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_timedwait.c b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_timedwait.c
|
|
|
+new file mode 100644
|
|
|
+index 0000000..64c9abf
|
|
|
+--- /dev/null
|
|
|
++++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_timedwait.c
|
|
|
+@@ -0,0 +1,147 @@
|
|
|
++/* sem_timedwait -- wait on a semaphore. SPARC version.
|
|
|
++ Copyright (C) 2003, 2006, 2007 Free Software Foundation, Inc.
|
|
|
++ This file is part of the GNU C Library.
|
|
|
++ Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003.
|
|
|
++
|
|
|
++ The GNU C Library is free software; you can redistribute it and/or
|
|
|
++ modify it under the terms of the GNU Lesser General Public
|
|
|
++ License as published by the Free Software Foundation; either
|
|
|
++ version 2.1 of the License, or (at your option) any later version.
|
|
|
++
|
|
|
++ The GNU C Library is distributed in the hope that it will be useful,
|
|
|
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
++ Lesser General Public License for more details.
|
|
|
++
|
|
|
++ You should have received a copy of the GNU Lesser General Public
|
|
|
++ License along with the GNU C Library; if not, see
|
|
|
++ <http://www.gnu.org/licenses/>. */
|
|
|
++
|
|
|
++#include <errno.h>
|
|
|
++#include <sysdep.h>
|
|
|
++#include <lowlevellock.h>
|
|
|
++#include <internaltypes.h>
|
|
|
++#include <semaphore.h>
|
|
|
++
|
|
|
++#include <pthreadP.h>
|
|
|
++
|
|
|
++
|
|
|
++extern void __sem_wait_cleanup (void *arg) attribute_hidden;
|
|
|
++
|
|
|
++
|
|
|
++int
|
|
|
++sem_timedwait (sem_t *sem, const struct timespec *abstime)
|
|
|
++{
|
|
|
++ struct sparc_new_sem *isem = (struct sparc_new_sem *) sem;
|
|
|
++ int err;
|
|
|
++ int val;
|
|
|
++
|
|
|
++ if (__atomic_is_v9)
|
|
|
++ val = atomic_decrement_if_positive (&isem->value);
|
|
|
++ else
|
|
|
++ {
|
|
|
++ __sparc32_atomic_do_lock24 (&isem->lock);
|
|
|
++ val = isem->value;
|
|
|
++ if (val > 0)
|
|
|
++ isem->value = val - 1;
|
|
|
++ __sparc32_atomic_do_unlock24 (&isem->lock);
|
|
|
++ }
|
|
|
++
|
|
|
++ if (val > 0)
|
|
|
++ return 0;
|
|
|
++
|
|
|
++ if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)
|
|
|
++ {
|
|
|
++ __set_errno (EINVAL);
|
|
|
++ return -1;
|
|
|
++ }
|
|
|
++
|
|
|
++ if (__atomic_is_v9)
|
|
|
++ atomic_increment (&isem->nwaiters);
|
|
|
++ else
|
|
|
++ {
|
|
|
++ __sparc32_atomic_do_lock24 (&isem->lock);
|
|
|
++ isem->nwaiters++;
|
|
|
++ __sparc32_atomic_do_unlock24 (&isem->lock);
|
|
|
++ }
|
|
|
++
|
|
|
++ pthread_cleanup_push (__sem_wait_cleanup, isem);
|
|
|
++
|
|
|
++ while (1)
|
|
|
++ {
|
|
|
++ struct timeval tv;
|
|
|
++ struct timespec rt;
|
|
|
++ int sec, nsec;
|
|
|
++
|
|
|
++ /* Get the current time. */
|
|
|
++ __gettimeofday (&tv, NULL);
|
|
|
++
|
|
|
++ /* Compute relative timeout. */
|
|
|
++ sec = abstime->tv_sec - tv.tv_sec;
|
|
|
++ nsec = abstime->tv_nsec - tv.tv_usec * 1000;
|
|
|
++ if (nsec < 0)
|
|
|
++ {
|
|
|
++ nsec += 1000000000;
|
|
|
++ --sec;
|
|
|
++ }
|
|
|
++
|
|
|
++ /* Already timed out? */
|
|
|
++ err = -ETIMEDOUT;
|
|
|
++ if (sec < 0)
|
|
|
++ {
|
|
|
++ __set_errno (ETIMEDOUT);
|
|
|
++ err = -1;
|
|
|
++ break;
|
|
|
++ }
|
|
|
++
|
|
|
++ /* Do wait. */
|
|
|
++ rt.tv_sec = sec;
|
|
|
++ rt.tv_nsec = nsec;
|
|
|
++
|
|
|
++ /* Enable asynchronous cancellation. Required by the standard. */
|
|
|
++ int oldtype = __pthread_enable_asynccancel ();
|
|
|
++
|
|
|
++ err = lll_futex_timed_wait (&isem->value, 0, &rt,
|
|
|
++ isem->private ^ FUTEX_PRIVATE_FLAG);
|
|
|
++
|
|
|
++ /* Disable asynchronous cancellation. */
|
|
|
++ __pthread_disable_asynccancel (oldtype);
|
|
|
++
|
|
|
++ if (err != 0 && err != -EWOULDBLOCK)
|
|
|
++ {
|
|
|
++ __set_errno (-err);
|
|
|
++ err = -1;
|
|
|
++ break;
|
|
|
++ }
|
|
|
++
|
|
|
++ if (__atomic_is_v9)
|
|
|
++ val = atomic_decrement_if_positive (&isem->value);
|
|
|
++ else
|
|
|
++ {
|
|
|
++ __sparc32_atomic_do_lock24 (&isem->lock);
|
|
|
++ val = isem->value;
|
|
|
++ if (val > 0)
|
|
|
++ isem->value = val - 1;
|
|
|
++ __sparc32_atomic_do_unlock24 (&isem->lock);
|
|
|
++ }
|
|
|
++
|
|
|
++ if (val > 0)
|
|
|
++ {
|
|
|
++ err = 0;
|
|
|
++ break;
|
|
|
++ }
|
|
|
++ }
|
|
|
++
|
|
|
++ pthread_cleanup_pop (0);
|
|
|
++
|
|
|
++ if (__atomic_is_v9)
|
|
|
++ atomic_decrement (&isem->nwaiters);
|
|
|
++ else
|
|
|
++ {
|
|
|
++ __sparc32_atomic_do_lock24 (&isem->lock);
|
|
|
++ isem->nwaiters--;
|
|
|
++ __sparc32_atomic_do_unlock24 (&isem->lock);
|
|
|
++ }
|
|
|
++
|
|
|
++ return err;
|
|
|
++}
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_trywait.c b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_trywait.c
|
|
|
+new file mode 100644
|
|
|
+index 0000000..36e859b
|
|
|
+--- /dev/null
|
|
|
++++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_trywait.c
|
|
|
+@@ -0,0 +1,51 @@
|
|
|
++/* sem_trywait -- wait on a semaphore. SPARC version.
|
|
|
++ Copyright (C) 2003, 2006, 2007 Free Software Foundation, Inc.
|
|
|
++ This file is part of the GNU C Library.
|
|
|
++ Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003.
|
|
|
++
|
|
|
++ The GNU C Library is free software; you can redistribute it and/or
|
|
|
++ modify it under the terms of the GNU Lesser General Public
|
|
|
++ License as published by the Free Software Foundation; either
|
|
|
++ version 2.1 of the License, or (at your option) any later version.
|
|
|
++
|
|
|
++ The GNU C Library is distributed in the hope that it will be useful,
|
|
|
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
++ Lesser General Public License for more details.
|
|
|
++
|
|
|
++ You should have received a copy of the GNU Lesser General Public
|
|
|
++ License along with the GNU C Library; if not, see
|
|
|
++ <http://www.gnu.org/licenses/>. */
|
|
|
++
|
|
|
++#include <errno.h>
|
|
|
++#include <sysdep.h>
|
|
|
++#include <lowlevellock.h>
|
|
|
++#include <internaltypes.h>
|
|
|
++#include <semaphore.h>
|
|
|
++
|
|
|
++
|
|
|
++int
|
|
|
++sem_trywait (sem_t *sem)
|
|
|
++{
|
|
|
++ struct sparc_old_sem *isem = (struct sparc_old_sem *) sem;
|
|
|
++ int val;
|
|
|
++
|
|
|
++ if (isem->value > 0)
|
|
|
++ {
|
|
|
++ if (__atomic_is_v9)
|
|
|
++ val = atomic_decrement_if_positive (&isem->value);
|
|
|
++ else
|
|
|
++ {
|
|
|
++ __sparc32_atomic_do_lock24 (&isem->lock);
|
|
|
++ val = isem->value;
|
|
|
++ if (val > 0)
|
|
|
++ isem->value = val - 1;
|
|
|
++ __sparc32_atomic_do_unlock24 (&isem->lock);
|
|
|
++ }
|
|
|
++ if (val > 0)
|
|
|
++ return 0;
|
|
|
++ }
|
|
|
++
|
|
|
++ __set_errno (EAGAIN);
|
|
|
++ return -1;
|
|
|
++}
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_wait.c b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_wait.c
|
|
|
+new file mode 100644
|
|
|
+index 0000000..5d887ab
|
|
|
+--- /dev/null
|
|
|
++++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_wait.c
|
|
|
+@@ -0,0 +1,124 @@
|
|
|
++/* sem_wait -- wait on a semaphore. Generic futex-using version.
|
|
|
++ Copyright (C) 2003, 2007 Free Software Foundation, Inc.
|
|
|
++ This file is part of the GNU C Library.
|
|
|
++ Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003.
|
|
|
++
|
|
|
++ The GNU C Library is free software; you can redistribute it and/or
|
|
|
++ modify it under the terms of the GNU Lesser General Public
|
|
|
++ License as published by the Free Software Foundation; either
|
|
|
++ version 2.1 of the License, or (at your option) any later version.
|
|
|
++
|
|
|
++ The GNU C Library is distributed in the hope that it will be useful,
|
|
|
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
++ Lesser General Public License for more details.
|
|
|
++
|
|
|
++ You should have received a copy of the GNU Lesser General Public
|
|
|
++ License along with the GNU C Library; if not, see
|
|
|
++ <http://www.gnu.org/licenses/>. */
|
|
|
++
|
|
|
++#include <errno.h>
|
|
|
++#include <sysdep.h>
|
|
|
++#include <lowlevellock.h>
|
|
|
++#include <internaltypes.h>
|
|
|
++#include <semaphore.h>
|
|
|
++
|
|
|
++#include <pthreadP.h>
|
|
|
++
|
|
|
++
|
|
|
++void
|
|
|
++attribute_hidden
|
|
|
++__sem_wait_cleanup (void *arg)
|
|
|
++{
|
|
|
++ struct sparc_new_sem *isem = (struct sparc_new_sem *) arg;
|
|
|
++
|
|
|
++ if (__atomic_is_v9)
|
|
|
++ atomic_decrement (&isem->nwaiters);
|
|
|
++ else
|
|
|
++ {
|
|
|
++ __sparc32_atomic_do_lock24 (&isem->lock);
|
|
|
++ isem->nwaiters--;
|
|
|
++ __sparc32_atomic_do_unlock24 (&isem->lock);
|
|
|
++ }
|
|
|
++}
|
|
|
++
|
|
|
++
|
|
|
++int
|
|
|
++sem_wait (sem_t *sem)
|
|
|
++{
|
|
|
++ struct sparc_new_sem *isem = (struct sparc_new_sem *) sem;
|
|
|
++ int err;
|
|
|
++ int val;
|
|
|
++
|
|
|
++ if (__atomic_is_v9)
|
|
|
++ val = atomic_decrement_if_positive (&isem->value);
|
|
|
++ else
|
|
|
++ {
|
|
|
++ __sparc32_atomic_do_lock24 (&isem->lock);
|
|
|
++ val = isem->value;
|
|
|
++ if (val > 0)
|
|
|
++ isem->value = val - 1;
|
|
|
++ else
|
|
|
++ isem->nwaiters++;
|
|
|
++ __sparc32_atomic_do_unlock24 (&isem->lock);
|
|
|
++ }
|
|
|
++
|
|
|
++ if (val > 0)
|
|
|
++ return 0;
|
|
|
++
|
|
|
++ if (__atomic_is_v9)
|
|
|
++ atomic_increment (&isem->nwaiters);
|
|
|
++ else
|
|
|
++ /* Already done above while still holding isem->lock. */;
|
|
|
++
|
|
|
++ pthread_cleanup_push (__sem_wait_cleanup, isem);
|
|
|
++
|
|
|
++ while (1)
|
|
|
++ {
|
|
|
++ /* Enable asynchronous cancellation. Required by the standard. */
|
|
|
++ int oldtype = __pthread_enable_asynccancel ();
|
|
|
++
|
|
|
++ err = lll_futex_wait (&isem->value, 0,
|
|
|
++ isem->private ^ FUTEX_PRIVATE_FLAG);
|
|
|
++
|
|
|
++ /* Disable asynchronous cancellation. */
|
|
|
++ __pthread_disable_asynccancel (oldtype);
|
|
|
++
|
|
|
++ if (err != 0 && err != -EWOULDBLOCK)
|
|
|
++ {
|
|
|
++ __set_errno (-err);
|
|
|
++ err = -1;
|
|
|
++ break;
|
|
|
++ }
|
|
|
++
|
|
|
++ if (__atomic_is_v9)
|
|
|
++ val = atomic_decrement_if_positive (&isem->value);
|
|
|
++ else
|
|
|
++ {
|
|
|
++ __sparc32_atomic_do_lock24 (&isem->lock);
|
|
|
++ val = isem->value;
|
|
|
++ if (val > 0)
|
|
|
++ isem->value = val - 1;
|
|
|
++ __sparc32_atomic_do_unlock24 (&isem->lock);
|
|
|
++ }
|
|
|
++
|
|
|
++ if (val > 0)
|
|
|
++ {
|
|
|
++ err = 0;
|
|
|
++ break;
|
|
|
++ }
|
|
|
++ }
|
|
|
++
|
|
|
++ pthread_cleanup_pop (0);
|
|
|
++
|
|
|
++ if (__atomic_is_v9)
|
|
|
++ atomic_decrement (&isem->nwaiters);
|
|
|
++ else
|
|
|
++ {
|
|
|
++ __sparc32_atomic_do_lock24 (&isem->lock);
|
|
|
++ isem->nwaiters--;
|
|
|
++ __sparc32_atomic_do_unlock24 (&isem->lock);
|
|
|
++ }
|
|
|
++
|
|
|
++ return err;
|
|
|
++}
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S
|
|
|
+deleted file mode 100644
|
|
|
+index a6142aa..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,2 +0,0 @@
|
|
|
+-#define RESET_PID
|
|
|
+-#include <libc/sysdeps/linux/sparc/clone.S>
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/pt-vfork.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/pt-vfork.S
|
|
|
+deleted file mode 100644
|
|
|
+index 37231a8..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/pt-vfork.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,44 +0,0 @@
|
|
|
+-/* Copyright (C) 2004 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Jakub Jelinek <jakub@redhat.com>, 2004.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <sysdep.h>
|
|
|
+-#include <tcb-offsets.h>
|
|
|
+-
|
|
|
+- .text
|
|
|
+- .globl __syscall_error
|
|
|
+-ENTRY(__vfork)
|
|
|
+- ld [%g7 + PID], %o5
|
|
|
+- sub %g0, %o5, %o4
|
|
|
+- st %o4, [%g7 + PID]
|
|
|
+-
|
|
|
+- LOADSYSCALL(vfork)
|
|
|
+- ta 0x10
|
|
|
+- bcc 2f
|
|
|
+- mov %o7, %g1
|
|
|
+- st %o5, [%g7 + PID]
|
|
|
+- call __syscall_error
|
|
|
+- mov %g1, %o7
|
|
|
+-2: sub %o1, 1, %o1
|
|
|
+- andcc %o0, %o1, %o0
|
|
|
+- bne,a 1f
|
|
|
+- st %o5, [%g7 + PID]
|
|
|
+-1: retl
|
|
|
+- nop
|
|
|
+-END(__vfork)
|
|
|
+-
|
|
|
+-weak_alias (__vfork, vfork)
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/pthread_barrier_wait.c b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/pthread_barrier_wait.c
|
|
|
+deleted file mode 100644
|
|
|
+index 169f6e7..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/pthread_barrier_wait.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1,93 +0,0 @@
|
|
|
+-/* Copyright (C) 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <errno.h>
|
|
|
+-#include <sysdep.h>
|
|
|
+-#include <lowlevellock.h>
|
|
|
+-#include <pthreadP.h>
|
|
|
+-
|
|
|
+-/* Wait on barrier. */
|
|
|
+-int
|
|
|
+-pthread_barrier_wait (
|
|
|
+- pthread_barrier_t *barrier)
|
|
|
+-{
|
|
|
+- union sparc_pthread_barrier *ibarrier
|
|
|
+- = (union sparc_pthread_barrier *) barrier;
|
|
|
+- int result = 0;
|
|
|
+- int private = ibarrier->s.pshared ? LLL_SHARED : LLL_PRIVATE;
|
|
|
+-
|
|
|
+- /* Make sure we are alone. */
|
|
|
+- lll_lock (ibarrier->b.lock, private);
|
|
|
+-
|
|
|
+- /* One more arrival. */
|
|
|
+- --ibarrier->b.left;
|
|
|
+-
|
|
|
+- /* Are these all? */
|
|
|
+- if (ibarrier->b.left == 0)
|
|
|
+- {
|
|
|
+- /* Yes. Increment the event counter to avoid invalid wake-ups and
|
|
|
+- tell the current waiters that it is their turn. */
|
|
|
+- ++ibarrier->b.curr_event;
|
|
|
+-
|
|
|
+- /* Wake up everybody. */
|
|
|
+- lll_futex_wake (&ibarrier->b.curr_event, INT_MAX, private);
|
|
|
+-
|
|
|
+- /* This is the thread which finished the serialization. */
|
|
|
+- result = PTHREAD_BARRIER_SERIAL_THREAD;
|
|
|
+- }
|
|
|
+- else
|
|
|
+- {
|
|
|
+- /* The number of the event we are waiting for. The barrier's event
|
|
|
+- number must be bumped before we continue. */
|
|
|
+- unsigned int event = ibarrier->b.curr_event;
|
|
|
+-
|
|
|
+- /* Before suspending, make the barrier available to others. */
|
|
|
+- lll_unlock (ibarrier->b.lock, private);
|
|
|
+-
|
|
|
+- /* Wait for the event counter of the barrier to change. */
|
|
|
+- do
|
|
|
+- lll_futex_wait (&ibarrier->b.curr_event, event, private);
|
|
|
+- while (event == ibarrier->b.curr_event);
|
|
|
+- }
|
|
|
+-
|
|
|
+- /* Make sure the init_count is stored locally or in a register. */
|
|
|
+- unsigned int init_count = ibarrier->b.init_count;
|
|
|
+-
|
|
|
+- /* If this was the last woken thread, unlock. */
|
|
|
+- if (__atomic_is_v9 || ibarrier->s.pshared == 0)
|
|
|
+- {
|
|
|
+- if (atomic_increment_val (&ibarrier->b.left) == init_count)
|
|
|
+- /* We are done. */
|
|
|
+- lll_unlock (ibarrier->b.lock, private);
|
|
|
+- }
|
|
|
+- else
|
|
|
+- {
|
|
|
+- unsigned int left;
|
|
|
+- /* Slightly more complicated. On pre-v9 CPUs, atomic_increment_val
|
|
|
+- is only atomic for threads within the same process, not for
|
|
|
+- multiple processes. */
|
|
|
+- __sparc32_atomic_do_lock24 (&ibarrier->s.left_lock);
|
|
|
+- left = ++ibarrier->b.left;
|
|
|
+- __sparc32_atomic_do_unlock24 (&ibarrier->s.left_lock);
|
|
|
+- if (left == init_count)
|
|
|
+- /* We are done. */
|
|
|
+- lll_unlock (ibarrier->b.lock, private);
|
|
|
+- }
|
|
|
+-
|
|
|
+- return result;
|
|
|
+-}
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_post.c b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_post.c
|
|
|
+deleted file mode 100644
|
|
|
+index 8da4193..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_post.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1,52 +0,0 @@
|
|
|
+-/* sem_post -- post to a POSIX semaphore. SPARC version.
|
|
|
+- Copyright (C) 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <errno.h>
|
|
|
+-#include <sysdep.h>
|
|
|
+-#include <lowlevellock.h>
|
|
|
+-#include <internaltypes.h>
|
|
|
+-#include <semaphore.h>
|
|
|
+-
|
|
|
+-int
|
|
|
+-sem_post (sem_t *sem)
|
|
|
+-{
|
|
|
+- struct sparc_new_sem *isem = (struct sparc_new_sem *) sem;
|
|
|
+- int nr;
|
|
|
+-
|
|
|
+- if (__atomic_is_v9)
|
|
|
+- nr = atomic_increment_val (&isem->value);
|
|
|
+- else
|
|
|
+- {
|
|
|
+- __sparc32_atomic_do_lock24 (&isem->lock);
|
|
|
+- nr = ++(isem->value);
|
|
|
+- __sparc32_atomic_do_unlock24 (&isem->lock);
|
|
|
+- }
|
|
|
+- atomic_full_barrier ();
|
|
|
+- if (isem->nwaiters > 0)
|
|
|
+- {
|
|
|
+- int err = lll_futex_wake (&isem->value, 1,
|
|
|
+- isem->private ^ FUTEX_PRIVATE_FLAG);
|
|
|
+- if (__builtin_expect (err, 0) < 0)
|
|
|
+- {
|
|
|
+- __set_errno (-err);
|
|
|
+- return -1;
|
|
|
+- }
|
|
|
+- }
|
|
|
+- return 0;
|
|
|
+-}
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c
|
|
|
+deleted file mode 100644
|
|
|
+index 64c9abf..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1,147 +0,0 @@
|
|
|
+-/* sem_timedwait -- wait on a semaphore. SPARC version.
|
|
|
+- Copyright (C) 2003, 2006, 2007 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <errno.h>
|
|
|
+-#include <sysdep.h>
|
|
|
+-#include <lowlevellock.h>
|
|
|
+-#include <internaltypes.h>
|
|
|
+-#include <semaphore.h>
|
|
|
+-
|
|
|
+-#include <pthreadP.h>
|
|
|
+-
|
|
|
+-
|
|
|
+-extern void __sem_wait_cleanup (void *arg) attribute_hidden;
|
|
|
+-
|
|
|
+-
|
|
|
+-int
|
|
|
+-sem_timedwait (sem_t *sem, const struct timespec *abstime)
|
|
|
+-{
|
|
|
+- struct sparc_new_sem *isem = (struct sparc_new_sem *) sem;
|
|
|
+- int err;
|
|
|
+- int val;
|
|
|
+-
|
|
|
+- if (__atomic_is_v9)
|
|
|
+- val = atomic_decrement_if_positive (&isem->value);
|
|
|
+- else
|
|
|
+- {
|
|
|
+- __sparc32_atomic_do_lock24 (&isem->lock);
|
|
|
+- val = isem->value;
|
|
|
+- if (val > 0)
|
|
|
+- isem->value = val - 1;
|
|
|
+- __sparc32_atomic_do_unlock24 (&isem->lock);
|
|
|
+- }
|
|
|
+-
|
|
|
+- if (val > 0)
|
|
|
+- return 0;
|
|
|
+-
|
|
|
+- if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)
|
|
|
+- {
|
|
|
+- __set_errno (EINVAL);
|
|
|
+- return -1;
|
|
|
+- }
|
|
|
+-
|
|
|
+- if (__atomic_is_v9)
|
|
|
+- atomic_increment (&isem->nwaiters);
|
|
|
+- else
|
|
|
+- {
|
|
|
+- __sparc32_atomic_do_lock24 (&isem->lock);
|
|
|
+- isem->nwaiters++;
|
|
|
+- __sparc32_atomic_do_unlock24 (&isem->lock);
|
|
|
+- }
|
|
|
+-
|
|
|
+- pthread_cleanup_push (__sem_wait_cleanup, isem);
|
|
|
+-
|
|
|
+- while (1)
|
|
|
+- {
|
|
|
+- struct timeval tv;
|
|
|
+- struct timespec rt;
|
|
|
+- int sec, nsec;
|
|
|
+-
|
|
|
+- /* Get the current time. */
|
|
|
+- __gettimeofday (&tv, NULL);
|
|
|
+-
|
|
|
+- /* Compute relative timeout. */
|
|
|
+- sec = abstime->tv_sec - tv.tv_sec;
|
|
|
+- nsec = abstime->tv_nsec - tv.tv_usec * 1000;
|
|
|
+- if (nsec < 0)
|
|
|
+- {
|
|
|
+- nsec += 1000000000;
|
|
|
+- --sec;
|
|
|
+- }
|
|
|
+-
|
|
|
+- /* Already timed out? */
|
|
|
+- err = -ETIMEDOUT;
|
|
|
+- if (sec < 0)
|
|
|
+- {
|
|
|
+- __set_errno (ETIMEDOUT);
|
|
|
+- err = -1;
|
|
|
+- break;
|
|
|
+- }
|
|
|
+-
|
|
|
+- /* Do wait. */
|
|
|
+- rt.tv_sec = sec;
|
|
|
+- rt.tv_nsec = nsec;
|
|
|
+-
|
|
|
+- /* Enable asynchronous cancellation. Required by the standard. */
|
|
|
+- int oldtype = __pthread_enable_asynccancel ();
|
|
|
+-
|
|
|
+- err = lll_futex_timed_wait (&isem->value, 0, &rt,
|
|
|
+- isem->private ^ FUTEX_PRIVATE_FLAG);
|
|
|
+-
|
|
|
+- /* Disable asynchronous cancellation. */
|
|
|
+- __pthread_disable_asynccancel (oldtype);
|
|
|
+-
|
|
|
+- if (err != 0 && err != -EWOULDBLOCK)
|
|
|
+- {
|
|
|
+- __set_errno (-err);
|
|
|
+- err = -1;
|
|
|
+- break;
|
|
|
+- }
|
|
|
+-
|
|
|
+- if (__atomic_is_v9)
|
|
|
+- val = atomic_decrement_if_positive (&isem->value);
|
|
|
+- else
|
|
|
+- {
|
|
|
+- __sparc32_atomic_do_lock24 (&isem->lock);
|
|
|
+- val = isem->value;
|
|
|
+- if (val > 0)
|
|
|
+- isem->value = val - 1;
|
|
|
+- __sparc32_atomic_do_unlock24 (&isem->lock);
|
|
|
+- }
|
|
|
+-
|
|
|
+- if (val > 0)
|
|
|
+- {
|
|
|
+- err = 0;
|
|
|
+- break;
|
|
|
+- }
|
|
|
+- }
|
|
|
+-
|
|
|
+- pthread_cleanup_pop (0);
|
|
|
+-
|
|
|
+- if (__atomic_is_v9)
|
|
|
+- atomic_decrement (&isem->nwaiters);
|
|
|
+- else
|
|
|
+- {
|
|
|
+- __sparc32_atomic_do_lock24 (&isem->lock);
|
|
|
+- isem->nwaiters--;
|
|
|
+- __sparc32_atomic_do_unlock24 (&isem->lock);
|
|
|
+- }
|
|
|
+-
|
|
|
+- return err;
|
|
|
+-}
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_trywait.c b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_trywait.c
|
|
|
+deleted file mode 100644
|
|
|
+index 36e859b..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_trywait.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1,51 +0,0 @@
|
|
|
+-/* sem_trywait -- wait on a semaphore. SPARC version.
|
|
|
+- Copyright (C) 2003, 2006, 2007 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <errno.h>
|
|
|
+-#include <sysdep.h>
|
|
|
+-#include <lowlevellock.h>
|
|
|
+-#include <internaltypes.h>
|
|
|
+-#include <semaphore.h>
|
|
|
+-
|
|
|
+-
|
|
|
+-int
|
|
|
+-sem_trywait (sem_t *sem)
|
|
|
+-{
|
|
|
+- struct sparc_old_sem *isem = (struct sparc_old_sem *) sem;
|
|
|
+- int val;
|
|
|
+-
|
|
|
+- if (isem->value > 0)
|
|
|
+- {
|
|
|
+- if (__atomic_is_v9)
|
|
|
+- val = atomic_decrement_if_positive (&isem->value);
|
|
|
+- else
|
|
|
+- {
|
|
|
+- __sparc32_atomic_do_lock24 (&isem->lock);
|
|
|
+- val = isem->value;
|
|
|
+- if (val > 0)
|
|
|
+- isem->value = val - 1;
|
|
|
+- __sparc32_atomic_do_unlock24 (&isem->lock);
|
|
|
+- }
|
|
|
+- if (val > 0)
|
|
|
+- return 0;
|
|
|
+- }
|
|
|
+-
|
|
|
+- __set_errno (EAGAIN);
|
|
|
+- return -1;
|
|
|
+-}
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c
|
|
|
+deleted file mode 100644
|
|
|
+index 5d887ab..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1,124 +0,0 @@
|
|
|
+-/* sem_wait -- wait on a semaphore. Generic futex-using version.
|
|
|
+- Copyright (C) 2003, 2007 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Paul Mackerras <paulus@au.ibm.com>, 2003.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <errno.h>
|
|
|
+-#include <sysdep.h>
|
|
|
+-#include <lowlevellock.h>
|
|
|
+-#include <internaltypes.h>
|
|
|
+-#include <semaphore.h>
|
|
|
+-
|
|
|
+-#include <pthreadP.h>
|
|
|
+-
|
|
|
+-
|
|
|
+-void
|
|
|
+-attribute_hidden
|
|
|
+-__sem_wait_cleanup (void *arg)
|
|
|
+-{
|
|
|
+- struct sparc_new_sem *isem = (struct sparc_new_sem *) arg;
|
|
|
+-
|
|
|
+- if (__atomic_is_v9)
|
|
|
+- atomic_decrement (&isem->nwaiters);
|
|
|
+- else
|
|
|
+- {
|
|
|
+- __sparc32_atomic_do_lock24 (&isem->lock);
|
|
|
+- isem->nwaiters--;
|
|
|
+- __sparc32_atomic_do_unlock24 (&isem->lock);
|
|
|
+- }
|
|
|
+-}
|
|
|
+-
|
|
|
+-
|
|
|
+-int
|
|
|
+-sem_wait (sem_t *sem)
|
|
|
+-{
|
|
|
+- struct sparc_new_sem *isem = (struct sparc_new_sem *) sem;
|
|
|
+- int err;
|
|
|
+- int val;
|
|
|
+-
|
|
|
+- if (__atomic_is_v9)
|
|
|
+- val = atomic_decrement_if_positive (&isem->value);
|
|
|
+- else
|
|
|
+- {
|
|
|
+- __sparc32_atomic_do_lock24 (&isem->lock);
|
|
|
+- val = isem->value;
|
|
|
+- if (val > 0)
|
|
|
+- isem->value = val - 1;
|
|
|
+- else
|
|
|
+- isem->nwaiters++;
|
|
|
+- __sparc32_atomic_do_unlock24 (&isem->lock);
|
|
|
+- }
|
|
|
+-
|
|
|
+- if (val > 0)
|
|
|
+- return 0;
|
|
|
+-
|
|
|
+- if (__atomic_is_v9)
|
|
|
+- atomic_increment (&isem->nwaiters);
|
|
|
+- else
|
|
|
+- /* Already done above while still holding isem->lock. */;
|
|
|
+-
|
|
|
+- pthread_cleanup_push (__sem_wait_cleanup, isem);
|
|
|
+-
|
|
|
+- while (1)
|
|
|
+- {
|
|
|
+- /* Enable asynchronous cancellation. Required by the standard. */
|
|
|
+- int oldtype = __pthread_enable_asynccancel ();
|
|
|
+-
|
|
|
+- err = lll_futex_wait (&isem->value, 0,
|
|
|
+- isem->private ^ FUTEX_PRIVATE_FLAG);
|
|
|
+-
|
|
|
+- /* Disable asynchronous cancellation. */
|
|
|
+- __pthread_disable_asynccancel (oldtype);
|
|
|
+-
|
|
|
+- if (err != 0 && err != -EWOULDBLOCK)
|
|
|
+- {
|
|
|
+- __set_errno (-err);
|
|
|
+- err = -1;
|
|
|
+- break;
|
|
|
+- }
|
|
|
+-
|
|
|
+- if (__atomic_is_v9)
|
|
|
+- val = atomic_decrement_if_positive (&isem->value);
|
|
|
+- else
|
|
|
+- {
|
|
|
+- __sparc32_atomic_do_lock24 (&isem->lock);
|
|
|
+- val = isem->value;
|
|
|
+- if (val > 0)
|
|
|
+- isem->value = val - 1;
|
|
|
+- __sparc32_atomic_do_unlock24 (&isem->lock);
|
|
|
+- }
|
|
|
+-
|
|
|
+- if (val > 0)
|
|
|
+- {
|
|
|
+- err = 0;
|
|
|
+- break;
|
|
|
+- }
|
|
|
+- }
|
|
|
+-
|
|
|
+- pthread_cleanup_pop (0);
|
|
|
+-
|
|
|
+- if (__atomic_is_v9)
|
|
|
+- atomic_decrement (&isem->nwaiters);
|
|
|
+- else
|
|
|
+- {
|
|
|
+- __sparc32_atomic_do_lock24 (&isem->lock);
|
|
|
+- isem->nwaiters--;
|
|
|
+- __sparc32_atomic_do_unlock24 (&isem->lock);
|
|
|
+- }
|
|
|
+-
|
|
|
+- return err;
|
|
|
+-}
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
|
|
|
+deleted file mode 100644
|
|
|
+index b61ca7b..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h
|
|
|
++++ /dev/null
|
|
|
+@@ -1,111 +0,0 @@
|
|
|
+-/* Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <tls.h>
|
|
|
+-#include <sysdep.h>
|
|
|
+-#ifndef __ASSEMBLER__
|
|
|
+-# include <pthreadP.h>
|
|
|
+-#endif
|
|
|
+-
|
|
|
+-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
|
|
|
+-
|
|
|
+-# undef PSEUDO
|
|
|
+-# define PSEUDO(name, syscall_name, args) \
|
|
|
+- .text; \
|
|
|
+- .globl __syscall_error; \
|
|
|
+-ENTRY(name) \
|
|
|
+- ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1;\
|
|
|
+- cmp %g1, 0; \
|
|
|
+- bne 1f; \
|
|
|
+-.type __##syscall_name##_nocancel,@function; \
|
|
|
+-.globl __##syscall_name##_nocancel; \
|
|
|
+-__##syscall_name##_nocancel: \
|
|
|
+- mov SYS_ify(syscall_name), %g1; \
|
|
|
+- ta 0x10; \
|
|
|
+- bcc 8f; \
|
|
|
+- mov %o7, %g1; \
|
|
|
+- call __syscall_error; \
|
|
|
+- mov %g1, %o7; \
|
|
|
+-8: jmpl %o7 + 8, %g0; \
|
|
|
+- nop; \
|
|
|
+-.size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel;\
|
|
|
+-1: save %sp, -96, %sp; \
|
|
|
+- cfi_def_cfa_register(%fp); \
|
|
|
+- cfi_window_save; \
|
|
|
+- cfi_register(%o7, %i7); \
|
|
|
+- CENABLE; \
|
|
|
+- nop; \
|
|
|
+- mov %o0, %l0; \
|
|
|
+- COPY_ARGS_##args \
|
|
|
+- mov SYS_ify(syscall_name), %g1; \
|
|
|
+- ta 0x10; \
|
|
|
+- bcc 1f; \
|
|
|
+- mov %o0, %l1; \
|
|
|
+- CDISABLE; \
|
|
|
+- mov %l0, %o0; \
|
|
|
+- call __syscall_error; \
|
|
|
+- mov %l1, %o0; \
|
|
|
+- b 2f; \
|
|
|
+- mov -1, %l1; \
|
|
|
+-1: CDISABLE; \
|
|
|
+- mov %l0, %o0; \
|
|
|
+-2: jmpl %i7 + 8, %g0; \
|
|
|
+- restore %g0, %l1, %o0;
|
|
|
+-
|
|
|
+-
|
|
|
+-# ifdef IS_IN_libpthread
|
|
|
+-# define CENABLE call __pthread_enable_asynccancel
|
|
|
+-# define CDISABLE call __pthread_disable_asynccancel
|
|
|
+-# elif !defined NOT_IN_libc
|
|
|
+-# define CENABLE call __libc_enable_asynccancel
|
|
|
+-# define CDISABLE call __libc_disable_asynccancel
|
|
|
+-# elif defined IS_IN_librt
|
|
|
+-# define CENABLE call __librt_enable_asynccancel
|
|
|
+-# define CDISABLE call __librt_disable_asynccancel
|
|
|
+-# else
|
|
|
+-# error Unsupported library
|
|
|
+-# endif
|
|
|
+-
|
|
|
+-#define COPY_ARGS_0 /* Nothing */
|
|
|
+-#define COPY_ARGS_1 COPY_ARGS_0 mov %i0, %o0;
|
|
|
+-#define COPY_ARGS_2 COPY_ARGS_1 mov %i1, %o1;
|
|
|
+-#define COPY_ARGS_3 COPY_ARGS_2 mov %i2, %o2;
|
|
|
+-#define COPY_ARGS_4 COPY_ARGS_3 mov %i3, %o3;
|
|
|
+-#define COPY_ARGS_5 COPY_ARGS_4 mov %i4, %o4;
|
|
|
+-#define COPY_ARGS_6 COPY_ARGS_5 mov %i5, %o5;
|
|
|
+-
|
|
|
+-# ifndef __ASSEMBLER__
|
|
|
+-# define SINGLE_THREAD_P \
|
|
|
+- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
|
|
|
+- header.multiple_threads) == 0, 1)
|
|
|
+-# else
|
|
|
+-# define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1
|
|
|
+-# endif
|
|
|
+-
|
|
|
+-#elif !defined __ASSEMBLER__
|
|
|
+-
|
|
|
+-# define SINGLE_THREAD_P (1)
|
|
|
+-# define NO_CANCELLATION 1
|
|
|
+-
|
|
|
+-#endif
|
|
|
+-
|
|
|
+-#ifndef __ASSEMBLER__
|
|
|
+-# define RTLD_SINGLE_THREAD_P \
|
|
|
+- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
|
|
|
+- header.multiple_threads) == 0, 1)
|
|
|
+-#endif
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S
|
|
|
+deleted file mode 100644
|
|
|
+index 71f0662..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,48 +0,0 @@
|
|
|
+-/* Copyright (C) 2004 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Jakub Jelinek <jakub@redhat.com>, 2004.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <sysdep.h>
|
|
|
+-#include <tcb-offsets.h>
|
|
|
+-
|
|
|
+- .text
|
|
|
+- .globl __syscall_error
|
|
|
+-ENTRY(__vfork)
|
|
|
+- ld [%g7 + PID], %o5
|
|
|
+- cmp %o5, 0
|
|
|
+- bne 1f
|
|
|
+- sub %g0, %o5, %o4
|
|
|
+- sethi %hi(0x80000000), %o4
|
|
|
+-1: st %o4, [%g7 + PID]
|
|
|
+-
|
|
|
+- LOADSYSCALL(vfork)
|
|
|
+- ta 0x10
|
|
|
+- bcc 2f
|
|
|
+- mov %o7, %g1
|
|
|
+- st %o5, [%g7 + PID]
|
|
|
+- call __syscall_error
|
|
|
+- mov %g1, %o7
|
|
|
+-2: sub %o1, 1, %o1
|
|
|
+- andcc %o0, %o1, %o0
|
|
|
+- bne,a 1f
|
|
|
+- st %o5, [%g7 + PID]
|
|
|
+-1: retl
|
|
|
+- nop
|
|
|
+-END(__vfork)
|
|
|
+-
|
|
|
+-libc_hidden_def (vfork)
|
|
|
+-weak_alias (__vfork, vfork)
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S
|
|
|
+deleted file mode 100644
|
|
|
+index 64e3bfc..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,2 +0,0 @@
|
|
|
+-#define RESET_PID
|
|
|
+-#include <libc/sysdeps/linux/sparc/sparcv9/clone.S>
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/pt-vfork.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/pt-vfork.S
|
|
|
+deleted file mode 100644
|
|
|
+index a058d89..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/pt-vfork.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,44 +0,0 @@
|
|
|
+-/* Copyright (C) 2004 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Jakub Jelinek <jakub@redhat.com>, 2004.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <sysdep.h>
|
|
|
+-#include <tcb-offsets.h>
|
|
|
+-
|
|
|
+- .text
|
|
|
+- .globl __syscall_error
|
|
|
+-ENTRY(__vfork)
|
|
|
+- ld [%g7 + PID], %o5
|
|
|
+- sub %g0, %o5, %o4
|
|
|
+- st %o4, [%g7 + PID]
|
|
|
+-
|
|
|
+- LOADSYSCALL(vfork)
|
|
|
+- ta 0x6d
|
|
|
+- bcc,pt %xcc, 2f
|
|
|
+- mov %o7, %g1
|
|
|
+- st %o5, [%g7 + PID]
|
|
|
+- call __syscall_error
|
|
|
+- mov %g1, %o7
|
|
|
+-2: sub %o1, 1, %o1
|
|
|
+- andcc %o0, %o1, %o0
|
|
|
+- bne,a,pt %icc, 1f
|
|
|
+- st %o5, [%g7 + PID]
|
|
|
+-1: retl
|
|
|
+- nop
|
|
|
+-END(__vfork)
|
|
|
+-
|
|
|
+-weak_alias (__vfork, vfork)
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
|
|
|
+deleted file mode 100644
|
|
|
+index 0e9d263..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h
|
|
|
++++ /dev/null
|
|
|
+@@ -1,109 +0,0 @@
|
|
|
+-/* Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <sysdep.h>
|
|
|
+-#include <tls.h>
|
|
|
+-#ifndef __ASSEMBLER__
|
|
|
+-# include <pthreadP.h>
|
|
|
+-#endif
|
|
|
+-
|
|
|
+-#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
|
|
|
+-
|
|
|
+-# undef PSEUDO
|
|
|
+-# define PSEUDO(name, syscall_name, args) \
|
|
|
+- .text; \
|
|
|
+- .globl __syscall_error; \
|
|
|
+-ENTRY(name) \
|
|
|
+- ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1;\
|
|
|
+- brnz,pn %g1, 1f; \
|
|
|
+-.type __##syscall_name##_nocancel,@function; \
|
|
|
+-.globl __##syscall_name##_nocancel; \
|
|
|
+-__##syscall_name##_nocancel: \
|
|
|
+- mov SYS_ify(syscall_name), %g1; \
|
|
|
+- ta 0x6d; \
|
|
|
+- bcc,pt %xcc, 8f; \
|
|
|
+- mov %o7, %g1; \
|
|
|
+- call __syscall_error; \
|
|
|
+- mov %g1, %o7; \
|
|
|
+-8: jmpl %o7 + 8, %g0; \
|
|
|
+- nop; \
|
|
|
+-.size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel;\
|
|
|
+-1: save %sp, -192, %sp; \
|
|
|
+- cfi_def_cfa_register(%fp); \
|
|
|
+- cfi_window_save; \
|
|
|
+- cfi_register(%o7, %i7); \
|
|
|
+- CENABLE; \
|
|
|
+- nop; \
|
|
|
+- mov %o0, %l0; \
|
|
|
+- COPY_ARGS_##args \
|
|
|
+- mov SYS_ify(syscall_name), %g1; \
|
|
|
+- ta 0x6d; \
|
|
|
+- bcc,pt %xcc, 1f; \
|
|
|
+- mov %o0, %l1; \
|
|
|
+- CDISABLE; \
|
|
|
+- mov %l0, %o0; \
|
|
|
+- call __syscall_error; \
|
|
|
+- mov %l1, %o0; \
|
|
|
+- ba,pt %xcc, 2f; \
|
|
|
+- mov -1, %l1; \
|
|
|
+-1: CDISABLE; \
|
|
|
+- mov %l0, %o0; \
|
|
|
+-2: jmpl %i7 + 8, %g0; \
|
|
|
+- restore %g0, %l1, %o0;
|
|
|
+-
|
|
|
+-# ifdef IS_IN_libpthread
|
|
|
+-# define CENABLE call __pthread_enable_asynccancel
|
|
|
+-# define CDISABLE call __pthread_disable_asynccancel
|
|
|
+-# elif !defined NOT_IN_libc
|
|
|
+-# define CENABLE call __libc_enable_asynccancel
|
|
|
+-# define CDISABLE call __libc_disable_asynccancel
|
|
|
+-# elif defined IS_IN_librt
|
|
|
+-# define CENABLE call __librt_enable_asynccancel
|
|
|
+-# define CDISABLE call __librt_disable_asynccancel
|
|
|
+-# else
|
|
|
+-# error Unsupported library
|
|
|
+-# endif
|
|
|
+-
|
|
|
+-#define COPY_ARGS_0 /* Nothing */
|
|
|
+-#define COPY_ARGS_1 COPY_ARGS_0 mov %i0, %o0;
|
|
|
+-#define COPY_ARGS_2 COPY_ARGS_1 mov %i1, %o1;
|
|
|
+-#define COPY_ARGS_3 COPY_ARGS_2 mov %i2, %o2;
|
|
|
+-#define COPY_ARGS_4 COPY_ARGS_3 mov %i3, %o3;
|
|
|
+-#define COPY_ARGS_5 COPY_ARGS_4 mov %i4, %o4;
|
|
|
+-#define COPY_ARGS_6 COPY_ARGS_5 mov %i5, %o5;
|
|
|
+-
|
|
|
+-# ifndef __ASSEMBLER__
|
|
|
+-# define SINGLE_THREAD_P \
|
|
|
+- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
|
|
|
+- header.multiple_threads) == 0, 1)
|
|
|
+-# else
|
|
|
+-# define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1
|
|
|
+-# endif
|
|
|
+-
|
|
|
+-#elif !defined __ASSEMBLER__
|
|
|
+-
|
|
|
+-# define SINGLE_THREAD_P (1)
|
|
|
+-# define NO_CANCELLATION 1
|
|
|
+-
|
|
|
+-#endif
|
|
|
+-
|
|
|
+-#ifndef __ASSEMBLER__
|
|
|
+-# define RTLD_SINGLE_THREAD_P \
|
|
|
+- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
|
|
|
+- header.multiple_threads) == 0, 1)
|
|
|
+-#endif
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_create.c b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_create.c
|
|
|
+deleted file mode 100644
|
|
|
+index 0a9c337..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_create.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1 +0,0 @@
|
|
|
+-#include "../../x86_64/timer_create.c"
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_delete.c b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_delete.c
|
|
|
+deleted file mode 100644
|
|
|
+index f0d4fd2..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_delete.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1 +0,0 @@
|
|
|
+-#include "../../x86_64/timer_delete.c"
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_getoverr.c b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_getoverr.c
|
|
|
+deleted file mode 100644
|
|
|
+index 82121a7..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_getoverr.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1 +0,0 @@
|
|
|
+-#include "../../x86_64/timer_getoverr.c"
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_gettime.c b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_gettime.c
|
|
|
+deleted file mode 100644
|
|
|
+index 313c05f..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_gettime.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1 +0,0 @@
|
|
|
+-#include "../../x86_64/timer_gettime.c"
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_settime.c b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_settime.c
|
|
|
+deleted file mode 100644
|
|
|
+index 76f549c..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/timer_settime.c
|
|
|
++++ /dev/null
|
|
|
+@@ -1 +0,0 @@
|
|
|
+-#include "../../x86_64/timer_settime.c"
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S
|
|
|
+deleted file mode 100644
|
|
|
+index bea4f2f..0000000
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S
|
|
|
++++ /dev/null
|
|
|
+@@ -1,48 +0,0 @@
|
|
|
+-/* Copyright (C) 2004 Free Software Foundation, Inc.
|
|
|
+- This file is part of the GNU C Library.
|
|
|
+- Contributed by Jakub Jelinek <jakub@redhat.com>, 2004.
|
|
|
+-
|
|
|
+- The GNU C Library is free software; you can redistribute it and/or
|
|
|
+- modify it under the terms of the GNU Lesser General Public
|
|
|
+- License as published by the Free Software Foundation; either
|
|
|
+- version 2.1 of the License, or (at your option) any later version.
|
|
|
+-
|
|
|
+- The GNU C Library is distributed in the hope that it will be useful,
|
|
|
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
+- Lesser General Public License for more details.
|
|
|
+-
|
|
|
+- You should have received a copy of the GNU Lesser General Public
|
|
|
+- License along with the GNU C Library; if not, see
|
|
|
+- <http://www.gnu.org/licenses/>. */
|
|
|
+-
|
|
|
+-#include <sysdep.h>
|
|
|
+-#include <tcb-offsets.h>
|
|
|
+-
|
|
|
+- .text
|
|
|
+- .globl __syscall_error
|
|
|
+-ENTRY(__vfork)
|
|
|
+- ld [%g7 + PID], %o5
|
|
|
+- sethi %hi(0x80000000), %o3
|
|
|
+- cmp %o5, 0
|
|
|
+- sub %g0, %o5, %o4
|
|
|
+- move %icc, %o3, %o4
|
|
|
+- st %o4, [%g7 + PID]
|
|
|
+-
|
|
|
+- LOADSYSCALL(vfork)
|
|
|
+- ta 0x6d
|
|
|
+- bcc,pt %xcc, 2f
|
|
|
+- mov %o7, %g1
|
|
|
+- st %o5, [%g7 + PID]
|
|
|
+- call __syscall_error
|
|
|
+- mov %g1, %o7
|
|
|
+-2: sub %o1, 1, %o1
|
|
|
+- andcc %o0, %o1, %o0
|
|
|
+- bne,a,pt %icc, 1f
|
|
|
+- st %o5, [%g7 + PID]
|
|
|
+-1: retl
|
|
|
+- nop
|
|
|
+-END(__vfork)
|
|
|
+-
|
|
|
+-hidden_def (vfork)
|
|
|
+-weak_alias (__vfork, vfork)
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
|
|
|
+index 5be9beb..b61ca7b 100644
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
|
|
|
++++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
|
|
|
+@@ -1,5 +1,111 @@
|
|
|
+-#if defined(__arch64__)
|
|
|
+-#include "sparc64/sysdep-cancel.h"
|
|
|
+-#else
|
|
|
+-#include "sparc32/sysdep-cancel.h"
|
|
|
++/* Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
|
|
|
++ This file is part of the GNU C Library.
|
|
|
++ Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
|
|
|
++
|
|
|
++ The GNU C Library is free software; you can redistribute it and/or
|
|
|
++ modify it under the terms of the GNU Lesser General Public
|
|
|
++ License as published by the Free Software Foundation; either
|
|
|
++ version 2.1 of the License, or (at your option) any later version.
|
|
|
++
|
|
|
++ The GNU C Library is distributed in the hope that it will be useful,
|
|
|
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
++ Lesser General Public License for more details.
|
|
|
++
|
|
|
++ You should have received a copy of the GNU Lesser General Public
|
|
|
++ License along with the GNU C Library; if not, see
|
|
|
++ <http://www.gnu.org/licenses/>. */
|
|
|
++
|
|
|
++#include <tls.h>
|
|
|
++#include <sysdep.h>
|
|
|
++#ifndef __ASSEMBLER__
|
|
|
++# include <pthreadP.h>
|
|
|
++#endif
|
|
|
++
|
|
|
++#if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
|
|
|
++
|
|
|
++# undef PSEUDO
|
|
|
++# define PSEUDO(name, syscall_name, args) \
|
|
|
++ .text; \
|
|
|
++ .globl __syscall_error; \
|
|
|
++ENTRY(name) \
|
|
|
++ ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1;\
|
|
|
++ cmp %g1, 0; \
|
|
|
++ bne 1f; \
|
|
|
++.type __##syscall_name##_nocancel,@function; \
|
|
|
++.globl __##syscall_name##_nocancel; \
|
|
|
++__##syscall_name##_nocancel: \
|
|
|
++ mov SYS_ify(syscall_name), %g1; \
|
|
|
++ ta 0x10; \
|
|
|
++ bcc 8f; \
|
|
|
++ mov %o7, %g1; \
|
|
|
++ call __syscall_error; \
|
|
|
++ mov %g1, %o7; \
|
|
|
++8: jmpl %o7 + 8, %g0; \
|
|
|
++ nop; \
|
|
|
++.size __##syscall_name##_nocancel,.-__##syscall_name##_nocancel;\
|
|
|
++1: save %sp, -96, %sp; \
|
|
|
++ cfi_def_cfa_register(%fp); \
|
|
|
++ cfi_window_save; \
|
|
|
++ cfi_register(%o7, %i7); \
|
|
|
++ CENABLE; \
|
|
|
++ nop; \
|
|
|
++ mov %o0, %l0; \
|
|
|
++ COPY_ARGS_##args \
|
|
|
++ mov SYS_ify(syscall_name), %g1; \
|
|
|
++ ta 0x10; \
|
|
|
++ bcc 1f; \
|
|
|
++ mov %o0, %l1; \
|
|
|
++ CDISABLE; \
|
|
|
++ mov %l0, %o0; \
|
|
|
++ call __syscall_error; \
|
|
|
++ mov %l1, %o0; \
|
|
|
++ b 2f; \
|
|
|
++ mov -1, %l1; \
|
|
|
++1: CDISABLE; \
|
|
|
++ mov %l0, %o0; \
|
|
|
++2: jmpl %i7 + 8, %g0; \
|
|
|
++ restore %g0, %l1, %o0;
|
|
|
++
|
|
|
++
|
|
|
++# ifdef IS_IN_libpthread
|
|
|
++# define CENABLE call __pthread_enable_asynccancel
|
|
|
++# define CDISABLE call __pthread_disable_asynccancel
|
|
|
++# elif !defined NOT_IN_libc
|
|
|
++# define CENABLE call __libc_enable_asynccancel
|
|
|
++# define CDISABLE call __libc_disable_asynccancel
|
|
|
++# elif defined IS_IN_librt
|
|
|
++# define CENABLE call __librt_enable_asynccancel
|
|
|
++# define CDISABLE call __librt_disable_asynccancel
|
|
|
++# else
|
|
|
++# error Unsupported library
|
|
|
++# endif
|
|
|
++
|
|
|
++#define COPY_ARGS_0 /* Nothing */
|
|
|
++#define COPY_ARGS_1 COPY_ARGS_0 mov %i0, %o0;
|
|
|
++#define COPY_ARGS_2 COPY_ARGS_1 mov %i1, %o1;
|
|
|
++#define COPY_ARGS_3 COPY_ARGS_2 mov %i2, %o2;
|
|
|
++#define COPY_ARGS_4 COPY_ARGS_3 mov %i3, %o3;
|
|
|
++#define COPY_ARGS_5 COPY_ARGS_4 mov %i4, %o4;
|
|
|
++#define COPY_ARGS_6 COPY_ARGS_5 mov %i5, %o5;
|
|
|
++
|
|
|
++# ifndef __ASSEMBLER__
|
|
|
++# define SINGLE_THREAD_P \
|
|
|
++ __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
|
|
|
++ header.multiple_threads) == 0, 1)
|
|
|
++# else
|
|
|
++# define SINGLE_THREAD_P ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1
|
|
|
++# endif
|
|
|
++
|
|
|
++#elif !defined __ASSEMBLER__
|
|
|
++
|
|
|
++# define SINGLE_THREAD_P (1)
|
|
|
++# define NO_CANCELLATION 1
|
|
|
++
|
|
|
++#endif
|
|
|
++
|
|
|
++#ifndef __ASSEMBLER__
|
|
|
++# define RTLD_SINGLE_THREAD_P \
|
|
|
++ __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
|
|
|
++ header.multiple_threads) == 0, 1)
|
|
|
+ #endif
|
|
|
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/vfork.S b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/vfork.S
|
|
|
+index 160cd0b..71f0662 100644
|
|
|
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/vfork.S
|
|
|
++++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/vfork.S
|
|
|
+@@ -1,5 +1,48 @@
|
|
|
+-#if defined(__arch64__)
|
|
|
+-#include "sparc64/vfork.S"
|
|
|
+-#else
|
|
|
+-#include "sparc32/vfork.S"
|
|
|
+-#endif
|
|
|
++/* Copyright (C) 2004 Free Software Foundation, Inc.
|
|
|
++ This file is part of the GNU C Library.
|
|
|
++ Contributed by Jakub Jelinek <jakub@redhat.com>, 2004.
|
|
|
++
|
|
|
++ The GNU C Library is free software; you can redistribute it and/or
|
|
|
++ modify it under the terms of the GNU Lesser General Public
|
|
|
++ License as published by the Free Software Foundation; either
|
|
|
++ version 2.1 of the License, or (at your option) any later version.
|
|
|
++
|
|
|
++ The GNU C Library is distributed in the hope that it will be useful,
|
|
|
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
++ Lesser General Public License for more details.
|
|
|
++
|
|
|
++ You should have received a copy of the GNU Lesser General Public
|
|
|
++ License along with the GNU C Library; if not, see
|
|
|
++ <http://www.gnu.org/licenses/>. */
|
|
|
++
|
|
|
++#include <sysdep.h>
|
|
|
++#include <tcb-offsets.h>
|
|
|
++
|
|
|
++ .text
|
|
|
++ .globl __syscall_error
|
|
|
++ENTRY(__vfork)
|
|
|
++ ld [%g7 + PID], %o5
|
|
|
++ cmp %o5, 0
|
|
|
++ bne 1f
|
|
|
++ sub %g0, %o5, %o4
|
|
|
++ sethi %hi(0x80000000), %o4
|
|
|
++1: st %o4, [%g7 + PID]
|
|
|
++
|
|
|
++ LOADSYSCALL(vfork)
|
|
|
++ ta 0x10
|
|
|
++ bcc 2f
|
|
|
++ mov %o7, %g1
|
|
|
++ st %o5, [%g7 + PID]
|
|
|
++ call __syscall_error
|
|
|
++ mov %g1, %o7
|
|
|
++2: sub %o1, 1, %o1
|
|
|
++ andcc %o0, %o1, %o0
|
|
|
++ bne,a 1f
|
|
|
++ st %o5, [%g7 + PID]
|
|
|
++1: retl
|
|
|
++ nop
|
|
|
++END(__vfork)
|
|
|
++
|
|
|
++libc_hidden_def (vfork)
|
|
|
++weak_alias (__vfork, vfork)
|
|
|
+--
|
|
|
+1.8.5.2 (Apple Git-48)
|
|
|
+
|