|
@@ -1,8666 +0,0 @@
|
|
|
-From b523318f205c88a1f9871b8acbda999150242e36 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/5] 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 | 25 +-
|
|
|
- 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, 1350 insertions(+), 6534 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..90efb77 100644
|
|
|
---- a/libc/sysdeps/linux/sparc/jmpbuf-unwind.h
|
|
|
-+++ b/libc/sysdeps/linux/sparc/jmpbuf-unwind.h
|
|
|
-@@ -6,26 +6,19 @@
|
|
|
- #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
|
|
|
-+#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))
|
|
|
- #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)
|
|
|
-
|