diff options
78 files changed, 779 insertions, 5963 deletions
diff --git a/extra/Configs/Config.sparc b/extra/Configs/Config.sparc index c6180c831..47c8ac289 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 6467f7fff..000000000 --- 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 df3e2d342..000000000 --- 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 f76a637e1..000000000 --- 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 8bbdc84f1..000000000 --- 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 9af0d5667..000000000 --- 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 56725cc91..000000000 --- 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 25810fd1a..000000000 --- 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 7b8500714..000000000 --- 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 28799e4f6..000000000 --- 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 f58c1c232..000000000 --- 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 5ec4da582..26f62126a 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 943548514..251032f33 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 25b5ee59c..77e9147f5 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 40303f0cd..90efb7719 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 123be53fb..97f98da99 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 2ee62a0f8..000000000 --- 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 1474e32ae..000000000 --- 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 45535bb68..000000000 --- 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 303f29bdf..000000000 --- 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 e65e4b95f..000000000 --- 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 93542698d..000000000 --- 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 37d6a615f..edbd5a5ba 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 ab90810f1..d502c759a 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 d502c759a..000000000 --- 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 e3c73d967..000000000 --- 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 72a9af5b1..4de152be3 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 ab90810f1..d502c759a 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 4de152be3..000000000 --- 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 d502c759a..000000000 --- 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 fb49ca37e..000000000 --- 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 743cb77bf..000000000 --- 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 e3c73d967..000000000 --- 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 bd9bb0d6a..000000000 --- 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/sparc64/pt-sigsuspend.c b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/pt-sigsuspend.c deleted file mode 100644 index d57283ad2..000000000 --- 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 9972ee408..000000000 --- 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 3ff16b115..000000000 --- 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 fa656b34e..bd9bb0d6a 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/sparc32/vfork.S b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/vfork.S index ab2286ee8..ab2286ee8 100644 --- a/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S +++ b/libpthread/linuxthreads/sysdeps/unix/sysv/linux/sparc/vfork.S diff --git a/libpthread/nptl/sysdeps/sparc/sparc32/jmpbuf-unwind.h b/libpthread/nptl/sysdeps/jmpbuf-unwind.h index 2f64e7d7c..2f64e7d7c 100644 --- a/libpthread/nptl/sysdeps/sparc/sparc32/jmpbuf-unwind.h +++ b/libpthread/nptl/sysdeps/jmpbuf-unwind.h diff --git a/libpthread/nptl/sysdeps/sparc/sparc32/pthread_spin_lock.c b/libpthread/nptl/sysdeps/pthread_spin_lock.c index 2dfcd3c24..2dfcd3c24 100644 --- a/libpthread/nptl/sysdeps/sparc/sparc32/pthread_spin_lock.c +++ b/libpthread/nptl/sysdeps/pthread_spin_lock.c diff --git a/libpthread/nptl/sysdeps/sparc/sparc32/pthread_spin_trylock.c b/libpthread/nptl/sysdeps/pthread_spin_trylock.c index c1b7b2397..c1b7b2397 100644 --- a/libpthread/nptl/sysdeps/sparc/sparc32/pthread_spin_trylock.c +++ b/libpthread/nptl/sysdeps/pthread_spin_trylock.c diff --git a/libpthread/nptl/sysdeps/sparc/sparc32/pthreaddef.h b/libpthread/nptl/sysdeps/pthreaddef.h index 435fedcf3..435fedcf3 100644 --- a/libpthread/nptl/sysdeps/sparc/sparc32/pthreaddef.h +++ b/libpthread/nptl/sysdeps/pthreaddef.h diff --git a/libpthread/nptl/sysdeps/sparc/jmpbuf-unwind.h b/libpthread/nptl/sysdeps/sparc/jmpbuf-unwind.h index 6cbb37baf..2f64e7d7c 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 dcc5ae28e..2dfcd3c24 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 af63eec73..c1b7b2397 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 d4695c47d..435fedcf3 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/sparcv9/pthread_spin_lock.c b/libpthread/nptl/sysdeps/sparc/sparc32/sparcv9/pthread_spin_lock.c deleted file mode 100644 index 3d314be75..000000000 --- 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 3b20a2180..000000000 --- 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 482cbe3d7..000000000 --- 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 2f64e7d7c..000000000 --- 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 023505630..000000000 --- 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 b14621b57..000000000 --- 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 a00fad376..000000000 --- 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 845f4bfbb..000000000 --- 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 dfc5e8261..a6142aafe 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 e8705c54b..37231a8c3 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 73eaa695e..169f6e784 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/sparc32/sem_post.c b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_post.c index 8da419348..8da419348 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_post.c +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_post.c diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_timedwait.c index 64c9abfc7..64c9abfc7 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_timedwait.c +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_timedwait.c diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_trywait.c b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_trywait.c index 36e859ba4..36e859ba4 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_trywait.c +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_trywait.c diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_wait.c index 5d887ab89..5d887ab89 100644 --- a/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c +++ b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sem_wait.c 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 a6142aafe..000000000 --- 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 37231a8c3..000000000 --- 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 169f6e784..000000000 --- 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/sysdep-cancel.h b/libpthread/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h deleted file mode 100644 index b61ca7b52..000000000 --- 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 71f0662a2..000000000 --- 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 64e3bfc12..000000000 --- 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 a058d89de..000000000 --- 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 0e9d2634a..000000000 --- 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 0a9c3372b..000000000 --- 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 f0d4fd21d..000000000 --- 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 82121a7a2..000000000 --- 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 313c05fea..000000000 --- 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 76f549cb4..000000000 --- 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 bea4f2fd2..000000000 --- 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 5be9beb92..b61ca7b52 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 160cd0b10..71f0662a2 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) |