diff options
Diffstat (limited to 'sysdeps/sparc/sparc32')
23 files changed, 125 insertions, 828 deletions
diff --git a/sysdeps/sparc/sparc32/bcopy.c b/sysdeps/sparc/sparc32/bcopy.c deleted file mode 100644 index 9a455f33c4..0000000000 --- a/sysdeps/sparc/sparc32/bcopy.c +++ /dev/null @@ -1 +0,0 @@ -/* bcopy is in memcpy.S */ diff --git a/sysdeps/sparc/sparc32/dl-machine.h b/sysdeps/sparc/sparc32/dl-machine.h index 53257104a6..9631db32e1 100644 --- a/sysdeps/sparc/sparc32/dl-machine.h +++ b/sysdeps/sparc/sparc32/dl-machine.h @@ -563,7 +563,7 @@ elf_machine_lazy_rel (struct link_map *map, { Elf32_Addr value = map->l_addr + reloc->r_addend; value = ((Elf32_Addr (*) (void)) value) (); - sparc_fixup_plt (reloc, reloc_addr, value, 0, 1); + sparc_fixup_plt (reloc, reloc_addr, value, 1, 1); } else if (r_type == R_SPARC_NONE) ; diff --git a/sysdeps/sparc/sparc32/dl-plt.h b/sysdeps/sparc/sparc32/dl-plt.h index edcc5c1374..bfb891fe69 100644 --- a/sysdeps/sparc/sparc32/dl-plt.h +++ b/sysdeps/sparc/sparc32/dl-plt.h @@ -25,19 +25,55 @@ #define OPCODE_JMP_G1 0x81c06000 /* jmp %g1+?; add lo 10 bits of value */ #define OPCODE_SAVE_SP 0x9de3bfa8 /* save %sp, -(16+6)*4, %sp */ #define OPCODE_BA 0x30800000 /* b,a ?; add PC-rel word address */ +#define OPCODE_BA_PT 0x30480000 /* ba,a,pt %icc, ?; add PC-rel word address */ static inline __attribute__ ((always_inline)) Elf32_Addr sparc_fixup_plt (const Elf32_Rela *reloc, Elf32_Addr *reloc_addr, Elf32_Addr value, int t, int do_flush) { - Elf32_Sword disp = value - (Elf32_Addr) reloc_addr; + Elf32_Sword disp; - if (0 && disp >= -0x800000 && disp < 0x800000) + /* 't' is '0' if we are resolving this PLT entry for RTLD bootstrap, + in which case we'll be resolving all PLT entries and thus can + optimize by overwriting instructions starting at the first PLT entry + instruction and we need not be mindful of thread safety. + + Otherwise, 't' is '1'. */ + reloc_addr += t; + disp = value - (Elf32_Addr) reloc_addr; + + if (disp >= -0x800000 && disp < 0x800000) { - /* Don't need to worry about thread safety. We're writing just one - instruction. */ + unsigned int insn = OPCODE_BA | ((disp >> 2) & 0x3fffff); + +#ifdef __sparc_v9__ + /* On V9 we can do even better by using a branch with + prediction if we fit into the even smaller 19-bit + displacement field. */ + if (disp >= -0x100000 && disp < 0x100000) + insn = OPCODE_BA_PT | ((disp >> 2) & 0x07ffff); +#endif + + /* Even if we are writing just a single branch, we must not + ignore the 't' offset. Consider a case where we have some + PLT slots which can be optimized into a single branch and + some which cannot. Then we can end up with a PLT which looks + like: + + PLT4.0: sethi %(PLT_4_INDEX), %g1 + sethi %(fully_resolved_sym_4), %g1 + jmp %g1 + %lo(fully_resolved_sym_4) + PLT5.0: ba,a fully_resolved_sym_5 + ba,a PLT0.0 + ... + + The delay slot of that jmp must always be either a sethi to + %g1 or a nop. But if we try to place this displacement + branch there, PLT4.0 will jump to fully_resolved_sym_4 for 1 + instruction and then go immediately to + fully_resolved_sym_5. */ - reloc_addr[0] = OPCODE_BA | ((disp >> 2) & 0x3fffff); + reloc_addr[0] = insn; if (do_flush) __asm __volatile ("flush %0" : : "r"(reloc_addr)); } @@ -48,7 +84,6 @@ sparc_fixup_plt (const Elf32_Rela *reloc, Elf32_Addr *reloc_addr, need not be done during bootstrapping, since there are no threads. But we also can't tell if we _can_ use flush, so don't. */ - reloc_addr += t; reloc_addr[1] = OPCODE_JMP_G1 | (value & 0x3ff); if (do_flush) __asm __volatile ("flush %0+4" : : "r"(reloc_addr)); diff --git a/sysdeps/sparc/sparc32/memcpy.S b/sysdeps/sparc/sparc32/memcpy.S index 6bd55c06a1..748a0862fe 100644 --- a/sysdeps/sparc/sparc32/memcpy.S +++ b/sysdeps/sparc/sparc32/memcpy.S @@ -68,45 +68,6 @@ stb %t0, [%dst - offset - 0x02]; \ stb %t1, [%dst - offset - 0x01]; -/* Both these macros have to start with exactly the same insn */ -#define RMOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \ - ldd [%src - offset - 0x20], %t0; \ - ldd [%src - offset - 0x18], %t2; \ - ldd [%src - offset - 0x10], %t4; \ - ldd [%src - offset - 0x08], %t6; \ - st %t0, [%dst - offset - 0x20]; \ - st %t1, [%dst - offset - 0x1c]; \ - st %t2, [%dst - offset - 0x18]; \ - st %t3, [%dst - offset - 0x14]; \ - st %t4, [%dst - offset - 0x10]; \ - st %t5, [%dst - offset - 0x0c]; \ - st %t6, [%dst - offset - 0x08]; \ - st %t7, [%dst - offset - 0x04]; - -#define RMOVE_BIGALIGNCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \ - ldd [%src - offset - 0x20], %t0; \ - ldd [%src - offset - 0x18], %t2; \ - ldd [%src - offset - 0x10], %t4; \ - ldd [%src - offset - 0x08], %t6; \ - std %t0, [%dst - offset - 0x20]; \ - std %t2, [%dst - offset - 0x18]; \ - std %t4, [%dst - offset - 0x10]; \ - std %t6, [%dst - offset - 0x08]; - -#define RMOVE_LASTCHUNK(src, dst, offset, t0, t1, t2, t3) \ - ldd [%src + offset + 0x00], %t0; \ - ldd [%src + offset + 0x08], %t2; \ - st %t0, [%dst + offset + 0x00]; \ - st %t1, [%dst + offset + 0x04]; \ - st %t2, [%dst + offset + 0x08]; \ - st %t3, [%dst + offset + 0x0c]; - -#define RMOVE_SHORTCHUNK(src, dst, offset, t0, t1) \ - ldub [%src + offset + 0x00], %t0; \ - ldub [%src + offset + 0x01], %t1; \ - stb %t0, [%dst + offset + 0x00]; \ - stb %t1, [%dst + offset + 0x01]; - #define SMOVE_CHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, prev, shil, shir, offset2) \ ldd [%src + offset + 0x00], %t0; \ ldd [%src + offset + 0x08], %t2; \ @@ -146,295 +107,20 @@ .text .align 4 -ENTRY(bcopy) - mov %o0, %o3 - mov %o1, %o0 - mov %o3, %o1 -END(bcopy) - -ENTRY(memmove) - cmp %o0, %o1 +ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */ + sub %o0, %o1, %o4 st %o0, [%sp + 64] - bleu 9f - sub %o0, %o1, %o4 - - add %o1, %o2, %o3 - cmp %o3, %o0 - bleu 0f - andcc %o4, 3, %o5 - - add %o1, %o2, %o1 - add %o0, %o2, %o0 - bne 77f +9: andcc %o4, 3, %o5 +0: bne 86f cmp %o2, 15 - bleu 91f - andcc %o1, 3, %g0 - be 3f - nop - - andcc %o1, 1, %g0 - be 4f - andcc %o1, 2, %g0 - - ldub [%o1 - 1], %g2 - sub %o1, 1, %o1 - stb %g2, [%o0 - 1] - sub %o2, 1, %o2 - be 3f - sub %o0, 1, %o0 -4: lduh [%o1 - 2], %g2 - sub %o1, 2, %o1 - sth %g2, [%o0 - 2] - sub %o2, 2, %o2 - sub %o0, 2, %o0 - -3: andcc %o1, 4, %g0 - - be 2f - mov %o2, %g1 - - ld [%o1 - 4], %o4 - sub %g1, 4, %g1 - st %o4, [%o0 - 4] - sub %o1, 4, %o1 - sub %o0, 4, %o0 -2: andcc %g1, 0xffffff80, %g6 - be 3f - andcc %o0, 4, %g0 - - be 74f + 4 -5: RMOVE_BIGCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5) - RMOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5) - RMOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5) - RMOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5) - subcc %g6, 128, %g6 - sub %o1, 128, %o1 - bne 5b - sub %o0, 128, %o0 - -3: andcc %g1, 0x70, %g6 - be 72f - andcc %g1, 8, %g0 - - srl %g6, 1, %o4 - mov %o7, %g2 - add %g6, %o4, %o4 -101: call 100f - sub %o1, %g6, %o1 - mov %g2, %o7 - jmpl %o5 + (72f - 101b), %g0 - sub %o0, %g6, %o0 - -71: RMOVE_LASTCHUNK(o1, o0, 0x60, g2, g3, g4, g5) - RMOVE_LASTCHUNK(o1, o0, 0x50, g2, g3, g4, g5) - RMOVE_LASTCHUNK(o1, o0, 0x40, g2, g3, g4, g5) - RMOVE_LASTCHUNK(o1, o0, 0x30, g2, g3, g4, g5) - RMOVE_LASTCHUNK(o1, o0, 0x20, g2, g3, g4, g5) - RMOVE_LASTCHUNK(o1, o0, 0x10, g2, g3, g4, g5) - RMOVE_LASTCHUNK(o1, o0, 0x00, g2, g3, g4, g5) -72: be 73f - andcc %g1, 4, %g0 - - ldd [%o1 - 0x08], %g2 - sub %o0, 8, %o0 - sub %o1, 8, %o1 - st %g2, [%o0] - st %g3, [%o0 + 0x04] -73: be 1f - andcc %g1, 2, %g0 - - ld [%o1 - 4], %g2 - sub %o1, 4, %o1 - st %g2, [%o0 - 4] - sub %o0, 4, %o0 -1: be 1f - andcc %g1, 1, %g0 - - lduh [%o1 - 2], %g2 - sub %o1, 2, %o1 - sth %g2, [%o0 - 2] - sub %o0, 2, %o0 -1: be 1f - nop - - ldub [%o1 - 1], %g2 - stb %g2, [%o0 - 1] -1: retl - ld [%sp + 64], %o0 - -74: RMOVE_BIGALIGNCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5) - RMOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5) - RMOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5) - RMOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5) - subcc %g6, 128, %g6 - sub %o1, 128, %o1 - bne 74b - sub %o0, 128, %o0 - - andcc %g1, 0x70, %g6 - be 72b - andcc %g1, 8, %g0 - - srl %g6, 1, %o4 - mov %o7, %g2 - add %g6, %o4, %o4 -102: call 100f - sub %o1, %g6, %o1 - mov %g2, %o7 - jmpl %o5 + (72b - 102b), %g0 - sub %o0, %g6, %o0 - -75: and %o2, 0xe, %o3 - mov %o7, %g2 - sll %o3, 3, %o4 - sub %o0, %o3, %o0 -103: call 100f - sub %o1, %o3, %o1 - mov %g2, %o7 - jmpl %o5 + (76f - 103b), %g0 - andcc %o2, 1, %g0 - - RMOVE_SHORTCHUNK(o1, o0, 0x0c, g2, g3) - RMOVE_SHORTCHUNK(o1, o0, 0x0a, g2, g3) - RMOVE_SHORTCHUNK(o1, o0, 0x08, g2, g3) - RMOVE_SHORTCHUNK(o1, o0, 0x06, g2, g3) - RMOVE_SHORTCHUNK(o1, o0, 0x04, g2, g3) - RMOVE_SHORTCHUNK(o1, o0, 0x02, g2, g3) - RMOVE_SHORTCHUNK(o1, o0, 0x00, g2, g3) - -76: be 1f - nop - ldub [%o1 - 1], %g2 - stb %g2, [%o0 - 1] -1: retl - ld [%sp + 64], %o0 -91: bne 75b - andcc %o2, 8, %g0 - - be 1f - andcc %o2, 4, %g0 - - ld [%o1 - 0x08], %g2 - ld [%o1 - 0x04], %g3 - sub %o1, 8, %o1 - st %g2, [%o0 - 0x08] - st %g3, [%o0 - 0x04] - sub %o0, 8, %o0 -1: b 73b - mov %o2, %g1 - -77: cmp %o2, 15 - bleu 75b - andcc %o0, 3, %g0 - be 64f - andcc %o0, 1, %g0 - be 63f - andcc %o0, 2, %g0 - ldub [%o1 - 1], %g5 - sub %o1, 1, %o1 - stb %g5, [%o0 - 1] - sub %o0, 1, %o0 - be 64f - sub %o2, 1, %o2 - -63: ldub [%o1 - 1], %g5 - sub %o1, 2, %o1 - stb %g5, [%o0 - 1] - sub %o0, 2, %o0 - ldub [%o1], %g5 - sub %o2, 2, %o2 - stb %g5, [%o0] -64: and %o1, 3, %g2 - and %o1, -4, %o1 - and %o2, 0xc, %g3 - add %o1, 4, %o1 - cmp %g3, 4 - sll %g2, 3, %g4 - mov 32, %g2 - be 4f - sub %g2, %g4, %g6 - - blu 3f - cmp %g3, 8 - - be 2f - srl %o2, 2, %g3 - - ld [%o1 - 4], %o3 - add %o0, -8, %o0 - ld [%o1 - 8], %o4 - add %o1, -16, %o1 - b 7f - add %g3, 1, %g3 -2: ld [%o1 - 4], %o4 - add %o0, -4, %o0 - ld [%o1 - 8], %g1 - add %o1, -12, %o1 - b 8f - add %g3, 2, %g3 -3: ld [%o1 - 4], %o5 - add %o0, -12, %o0 - ld [%o1 - 8], %o3 - add %o1, -20, %o1 - b 6f - srl %o2, 2, %g3 -4: ld [%o1 - 4], %g1 - srl %o2, 2, %g3 - ld [%o1 - 8], %o5 - add %o1, -24, %o1 - add %o0, -16, %o0 - add %g3, -1, %g3 + bleu 90f + andcc %o1, 3, %g0 - ld [%o1 + 12], %o3 -5: sll %o5, %g4, %g2 - srl %g1, %g6, %g5 - or %g2, %g5, %g2 - st %g2, [%o0 + 12] -6: ld [%o1 + 8], %o4 - sll %o3, %g4, %g2 - srl %o5, %g6, %g5 - or %g2, %g5, %g2 - st %g2, [%o0 + 8] -7: ld [%o1 + 4], %g1 - sll %o4, %g4, %g2 - srl %o3, %g6, %g5 - or %g2, %g5, %g2 - st %g2, [%o0 + 4] -8: ld [%o1], %o5 - sll %g1, %g4, %g2 - srl %o4, %g6, %g5 - addcc %g3, -4, %g3 - or %g2, %g5, %g2 - add %o1, -16, %o1 - st %g2, [%o0] - add %o0, -16, %o0 - bne,a 5b - ld [%o1 + 12], %o3 - sll %o5, %g4, %g2 - srl %g1, %g6, %g5 - srl %g4, 3, %g3 - or %g2, %g5, %g2 - add %o1, %g3, %o1 - andcc %o2, 2, %g0 - st %g2, [%o0 + 12] - be 1f - andcc %o2, 1, %g0 - - ldub [%o1 + 15], %g5 - add %o1, -2, %o1 - stb %g5, [%o0 + 11] - add %o0, -2, %o0 - ldub [%o1 + 16], %g5 - stb %g5, [%o0 + 12] -1: be 1f - nop - ldub [%o1 + 15], %g5 - stb %g5, [%o0 + 11] -1: retl - ld [%sp + 64], %o0 + be 78f + andcc %o1, 4, %g0 -78: andcc %o1, 1, %g0 + andcc %o1, 1, %g0 be 4f andcc %o1, 2, %g0 @@ -442,30 +128,16 @@ ENTRY(memmove) add %o1, 1, %o1 stb %g2, [%o0] sub %o2, 1, %o2 - bne 3f + bne 77f add %o0, 1, %o0 4: lduh [%o1], %g2 add %o1, 2, %o1 sth %g2, [%o0] sub %o2, 2, %o2 - b 3f - add %o0, 2, %o0 -END(memmove) - -ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */ - sub %o0, %o1, %o4 - st %o0, [%sp + 64] -9: andcc %o4, 3, %o5 -0: bne 86f - cmp %o2, 15 - - bleu 90f - andcc %o1, 3, %g0 - - bne 78b -3: andcc %o1, 4, %g0 + add %o0, 2, %o0 - be 2f +77: andcc %o1, 4, %g0 +78: be 2f mov %o2, %g1 ld [%o1], %o4 @@ -968,5 +640,5 @@ ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */ 110: retl sub %o7, %g6, %o5 END(memcpy) + libc_hidden_builtin_def (memcpy) -libc_hidden_builtin_def (memmove) diff --git a/sysdeps/sparc/sparc32/memmove.c b/sysdeps/sparc/sparc32/memmove.c deleted file mode 100644 index a8d2d49948..0000000000 --- a/sysdeps/sparc/sparc32/memmove.c +++ /dev/null @@ -1 +0,0 @@ -/* memmove is in memcpy.S */ diff --git a/sysdeps/sparc/sparc32/sparcv8/udiv_qrnnd.S b/sysdeps/sparc/sparc32/sparcv8/udiv_qrnnd.S deleted file mode 100644 index c3f097118f..0000000000 --- a/sysdeps/sparc/sparc32/sparcv8/udiv_qrnnd.S +++ /dev/null @@ -1,215 +0,0 @@ -! SPARC __udiv_qrnnd division support, used from longlong.h. - -! Copyright (C) 1993, 1994 Free Software Foundation, Inc. - -! This file is part of the GNU MP Library. - -! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to -! the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - -! INPUT PARAMETERS -! rem_ptr o0 -! n1 o1 -! n0 o2 -! d o3 - -#include "sysdep.h" - -ENTRY(__udiv_qrnnd) - tst %o3 - bneg LOC(largedivisor) - mov 8,%g1 - - b LOC(p1) - addxcc %o2,%o2,%o2 - -LOC(plop): - bcc LOC(n1) - addxcc %o2,%o2,%o2 -LOC(p1): - addx %o1,%o1,%o1 - subcc %o1,%o3,%o4 - bcc LOC(n2) - addxcc %o2,%o2,%o2 -LOC(p2): - addx %o1,%o1,%o1 - subcc %o1,%o3,%o4 - bcc LOC(n3) - addxcc %o2,%o2,%o2 -LOC(p3): - addx %o1,%o1,%o1 - subcc %o1,%o3,%o4 - bcc LOC(n4) - addxcc %o2,%o2,%o2 -LOC(p4): - addx %o1,%o1,%o1 - addcc %g1,-1,%g1 - bne LOC(plop) - subcc %o1,%o3,%o4 - bcc LOC(n5) - addxcc %o2,%o2,%o2 -LOC(p5): - st %o1,[%o0] - retl - xnor %g0,%o2,%o0 - -LOC(nlop): - bcc LOC(p1) - addxcc %o2,%o2,%o2 -LOC(n1): - addx %o4,%o4,%o4 - subcc %o4,%o3,%o1 - bcc LOC(p2) - addxcc %o2,%o2,%o2 -LOC(n2): - addx %o4,%o4,%o4 - subcc %o4,%o3,%o1 - bcc LOC(p3) - addxcc %o2,%o2,%o2 -LOC(n3): - addx %o4,%o4,%o4 - subcc %o4,%o3,%o1 - bcc LOC(p4) - addxcc %o2,%o2,%o2 -LOC(n4): - addx %o4,%o4,%o4 - addcc %g1,-1,%g1 - bne LOC(nlop) - subcc %o4,%o3,%o1 - bcc LOC(p5) - addxcc %o2,%o2,%o2 -LOC(n5): - st %o4,[%o0] - retl - xnor %g0,%o2,%o0 - -LOC(largedivisor): - and %o2,1,%o5 ! %o5 = n0 & 1 - - srl %o2,1,%o2 - sll %o1,31,%g2 - or %g2,%o2,%o2 ! %o2 = lo(n1n0 >> 1) - srl %o1,1,%o1 ! %o1 = hi(n1n0 >> 1) - - and %o3,1,%g2 - srl %o3,1,%g3 ! %g3 = floor(d / 2) - add %g3,%g2,%g3 ! %g3 = ceil(d / 2) - - b LOC(Lp1) - addxcc %o2,%o2,%o2 - -LOC(Lplop): - bcc LOC(Ln1) - addxcc %o2,%o2,%o2 -LOC(Lp1): - addx %o1,%o1,%o1 - subcc %o1,%g3,%o4 - bcc LOC(Ln2) - addxcc %o2,%o2,%o2 -LOC(Lp2): - addx %o1,%o1,%o1 - subcc %o1,%g3,%o4 - bcc LOC(Ln3) - addxcc %o2,%o2,%o2 -LOC(Lp3): - addx %o1,%o1,%o1 - subcc %o1,%g3,%o4 - bcc LOC(Ln4) - addxcc %o2,%o2,%o2 -LOC(Lp4): - addx %o1,%o1,%o1 - addcc %g1,-1,%g1 - bne LOC(Lplop) - subcc %o1,%g3,%o4 - bcc LOC(Ln5) - addxcc %o2,%o2,%o2 -LOC(Lp5): - add %o1,%o1,%o1 ! << 1 - tst %g2 - bne LOC(Oddp) - add %o5,%o1,%o1 - st %o1,[%o0] - retl - xnor %g0,%o2,%o0 - -LOC(Lnlop): - bcc LOC(Lp1) - addxcc %o2,%o2,%o2 -LOC(Ln1): - addx %o4,%o4,%o4 - subcc %o4,%g3,%o1 - bcc LOC(Lp2) - addxcc %o2,%o2,%o2 -LOC(Ln2): - addx %o4,%o4,%o4 - subcc %o4,%g3,%o1 - bcc LOC(Lp3) - addxcc %o2,%o2,%o2 -LOC(Ln3): - addx %o4,%o4,%o4 - subcc %o4,%g3,%o1 - bcc LOC(Lp4) - addxcc %o2,%o2,%o2 -LOC(Ln4): - addx %o4,%o4,%o4 - addcc %g1,-1,%g1 - bne LOC(Lnlop) - subcc %o4,%g3,%o1 - bcc LOC(Lp5) - addxcc %o2,%o2,%o2 -LOC(Ln5): - add %o4,%o4,%o4 ! << 1 - tst %g2 - bne LOC(Oddn) - add %o5,%o4,%o4 - st %o4,[%o0] - retl - xnor %g0,%o2,%o0 - -LOC(Oddp): - xnor %g0,%o2,%o2 - ! q' in %o2. r' in %o1 - addcc %o1,%o2,%o1 - bcc LOC(Lp6) - addx %o2,0,%o2 - sub %o1,%o3,%o1 -LOC(Lp6): - subcc %o1,%o3,%g0 - bcs LOC(Lp7) - subx %o2,-1,%o2 - sub %o1,%o3,%o1 -LOC(Lp7): - st %o1,[%o0] - retl - mov %o2,%o0 - -LOC(Oddn): - xnor %g0,%o2,%o2 - ! q' in %o2. r' in %o4 - addcc %o4,%o2,%o4 - bcc LOC(Ln6) - addx %o2,0,%o2 - sub %o4,%o3,%o4 -LOC(Ln6): - subcc %o4,%o3,%g0 - bcs LOC(Ln7) - subx %o2,-1,%o2 - sub %o4,%o3,%o4 -LOC(Ln7): - st %o4,[%o0] - retl - mov %o2,%o0 - -END(__udiv_qrnnd) diff --git a/sysdeps/sparc/sparc32/sparcv9/bcopy.c b/sysdeps/sparc/sparc32/sparcv9/bcopy.c deleted file mode 100644 index 9a455f33c4..0000000000 --- a/sysdeps/sparc/sparc32/sparcv9/bcopy.c +++ /dev/null @@ -1 +0,0 @@ -/* bcopy is in memcpy.S */ diff --git a/sysdeps/sparc/sparc32/sparcv9/memmove.c b/sysdeps/sparc/sparc32/sparcv9/memmove.c deleted file mode 100644 index a8d2d49948..0000000000 --- a/sysdeps/sparc/sparc32/sparcv9/memmove.c +++ /dev/null @@ -1 +0,0 @@ -/* memmove is in memcpy.S */ diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile b/sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile new file mode 100644 index 0000000000..4d45042a95 --- /dev/null +++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile @@ -0,0 +1,4 @@ +ifeq ($(subdir),string) +sysdep_routines += memcpy-ultra3 memcpy-niagara1 memcpy-niagara2 \ + memset-niagara1 +endif diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-niagara1.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-niagara1.S new file mode 100644 index 0000000000..10aef85fe1 --- /dev/null +++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-niagara1.S @@ -0,0 +1,2 @@ +#define XCC icc +#include <sparc64/multiarch/memcpy-niagara1.S> diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-niagara2.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-niagara2.S new file mode 100644 index 0000000000..6b1bf6ea70 --- /dev/null +++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-niagara2.S @@ -0,0 +1,2 @@ +#define XCC icc +#include <sparc64/multiarch/memcpy-niagara2.S> diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-ultra3.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-ultra3.S new file mode 100644 index 0000000000..77adf151aa --- /dev/null +++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-ultra3.S @@ -0,0 +1,2 @@ +#define XCC icc +#include <sparc64/multiarch/memcpy-ultra3.S> diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S new file mode 100644 index 0000000000..14df91e005 --- /dev/null +++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S @@ -0,0 +1,4 @@ +#define ASI_PNF 0x82 +#define ASI_BLK_P 0xf0 +#define XCC icc +#include <sparc64/multiarch/memcpy.S> diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memset-niagara1.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/memset-niagara1.S new file mode 100644 index 0000000000..b432420876 --- /dev/null +++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/memset-niagara1.S @@ -0,0 +1,2 @@ +#define XCC icc +#include <sparc64/multiarch/memset-niagara1.S> diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S new file mode 100644 index 0000000000..8f8264337d --- /dev/null +++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S @@ -0,0 +1,4 @@ +#define ASI_PNF 0x82 +#define ASI_BLK_P 0xf0 +#define XCC icc +#include <sparc64/multiarch/memset.S> diff --git a/sysdeps/sparc/sparc32/sparcv9/sparcv9b/memcpy.S b/sysdeps/sparc/sparc32/sparcv9/sparcv9b/memcpy.S deleted file mode 100644 index 61960dce61..0000000000 --- a/sysdeps/sparc/sparc32/sparcv9/sparcv9b/memcpy.S +++ /dev/null @@ -1,2 +0,0 @@ -#define XCC icc -#include <sparc64/sparcv9b/memcpy.S> diff --git a/sysdeps/sparc/sparc32/sparcv9/sparcv9v/memcpy.S b/sysdeps/sparc/sparc32/sparcv9/sparcv9v/memcpy.S deleted file mode 100644 index 4c05f57bc2..0000000000 --- a/sysdeps/sparc/sparc32/sparcv9/sparcv9v/memcpy.S +++ /dev/null @@ -1,2 +0,0 @@ -#define XCC icc -#include <sparc64/sparcv9v/memcpy.S> diff --git a/sysdeps/sparc/sparc32/sparcv9/sparcv9v/memset.S b/sysdeps/sparc/sparc32/sparcv9/sparcv9v/memset.S deleted file mode 100644 index 5e46c7489f..0000000000 --- a/sysdeps/sparc/sparc32/sparcv9/sparcv9v/memset.S +++ /dev/null @@ -1,2 +0,0 @@ -#define XCC icc -#include <sparc64/sparcv9v/memset.S> diff --git a/sysdeps/sparc/sparc32/sparcv9/sparcv9v2/memcpy.S b/sysdeps/sparc/sparc32/sparcv9/sparcv9v2/memcpy.S deleted file mode 100644 index 7f4606037c..0000000000 --- a/sysdeps/sparc/sparc32/sparcv9/sparcv9v2/memcpy.S +++ /dev/null @@ -1,2 +0,0 @@ -#define XCC icc -#include <sparc64/sparcv9v2/memcpy.S> diff --git a/sysdeps/sparc/sparc32/sparcv9/sparcv9v2/memset.S b/sysdeps/sparc/sparc32/sparcv9/sparcv9v2/memset.S deleted file mode 100644 index 72de7bb0cf..0000000000 --- a/sysdeps/sparc/sparc32/sparcv9/sparcv9v2/memset.S +++ /dev/null @@ -1,2 +0,0 @@ -#define XCC icc -#include <sparc64/sparcv9v2/memset.S> diff --git a/sysdeps/sparc/sparc32/sparcv9/strlen.S b/sysdeps/sparc/sparc32/sparcv9/strlen.S index b8f4dba4f4..28a216c076 100644 --- a/sysdeps/sparc/sparc32/sparcv9/strlen.S +++ b/sysdeps/sparc/sparc32/sparcv9/strlen.S @@ -1,4 +1 @@ -#define ASI_PNF 0x82 -#define ASI_BLK_P 0xf0 -#define XCC icc #include <sparc64/strlen.S> diff --git a/sysdeps/sparc/sparc32/strlen.S b/sysdeps/sparc/sparc32/strlen.S index ed92f20e28..2945bb5484 100644 --- a/sysdeps/sparc/sparc32/strlen.S +++ b/sysdeps/sparc/sparc32/strlen.S @@ -1,8 +1,9 @@ /* Determine the length of a string. For SPARC v7. - Copyright (C) 1996, 1999, 2003 Free Software Foundation, Inc. + Copyright (C) 1996, 1999, 2003, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jj@ultra.linux.cz>. + Contributed by Jakub Jelinek <jj@ultra.linux.cz> and + David S. Miller <davem@davemloft.net>. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -21,86 +22,55 @@ #include <sysdep.h> - /* Normally, this uses ((xword - 0x01010101) & 0x80808080) 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 - 0x01010101) & (~xword) & 0x80808080), - 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 4 ENTRY(strlen) - mov %o0, %o1 - andcc %o0, 3, %g0 - be 20f - sethi %hi(0x80808080), %o4 - - ldub [%o0], %o5 - cmp %o5, 0 - be 21f - add %o0, 1, %o0 - andcc %o0, 3, %g0 - be 4f - or %o4, %lo(0x80808080), %o3 - ldub [%o0], %o5 - cmp %o5, 0 - be 22f - add %o0, 1, %o0 - andcc %o0, 3, %g0 - be 5f - sethi %hi(0x01010101), %o4 - ldub [%o0], %o5 - cmp %o5, 0 - be 23f - add %o0, 1, %o0 - b 11f - or %o4, %lo(0x01010101), %o2 -21: retl - mov 0, %o0 -22: retl - mov 1, %o0 -23: retl - mov 2, %o0 - -20: or %o4, %lo(0x80808080), %o3 -4: sethi %hi(0x01010101), %o4 -5: or %o4, %lo(0x01010101), %o2 -11: ld [%o0], %o5 -12: sub %o5, %o2, %o4 -#ifdef EIGHTBIT_NOT_RARE - andn %o4, %o5, %o4 -#endif - andcc %o4, %o3, %g0 - be 11b - add %o0, 4, %o0 - - srl %o5, 24, %g5 - andcc %g5, 0xff, %g0 - be 13f - add %o0, -4, %o4 - srl %o5, 16, %g5 - andcc %g5, 0xff, %g0 - be 13f - add %o4, 1, %o4 - srl %o5, 8, %g5 - andcc %g5, 0xff, %g0 - be 13f - add %o4, 1, %o4 - andcc %o5, 0xff, %g0 - bne,a 12b - ld [%o0], %o5 - add %o4, 1, %o4 -13: retl - sub %o4, %o1, %o0 + mov %o0, %o1 + andn %o0, 0x3, %o0 + + ld [%o0], %o5 + and %o1, 0x3, %g1 + mov -1, %g5 + + sethi %hi(0x01010101), %o2 + sll %g1, 3, %g1 + + or %o2, %lo(0x01010101), %o2 + srl %g5, %g1, %g2 + + orn %o5, %g2, %o5 + sll %o2, 7, %o3 +10: add %o0, 4, %o0 + + andn %o3, %o5, %g1 + sub %o5, %o2, %g2 + + andcc %g1, %g2, %g0 + be,a 10b + ld [%o0], %o5 + + srl %o5, 24, %g1 + + andcc %g1, 0xff, %g0 + be 90f + sub %o0, 4, %o0 + + srl %o5, 16, %g2 + + andcc %g2, 0xff, %g0 + be 90f + add %o0, 1, %o0 + + srl %o5, 8, %g1 + + andcc %g1, 0xff, %g0 + be 90f + add %o0, 1, %o0 + + add %o0, 1, %o0 + +90: retl + sub %o0, %o1, %o0 END(strlen) libc_hidden_builtin_def (strlen) diff --git a/sysdeps/sparc/sparc32/udiv_qrnnd.S b/sysdeps/sparc/sparc32/udiv_qrnnd.S deleted file mode 100644 index 4955318a66..0000000000 --- a/sysdeps/sparc/sparc32/udiv_qrnnd.S +++ /dev/null @@ -1,168 +0,0 @@ -! SPARC __udiv_qrnnd division support, used from longlong.h. -! -! Copyright (C) 1993, 1994, 1997 Free Software Foundation, Inc. -! -! This file is part of the GNU MP Library. -! -! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to -! the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -! -! Added PIC support - May/96, Miguel de Icaza -! -! INPUT PARAMETERS -! rem_ptr i0 -! n1 i1 -! n0 i2 -! d i3 - -#include <sysdep.h> -#undef ret /* Kludge for glibc */ - -#ifdef PIC - .text -#else - .section .rodata,#alloc -#endif - .align 8 - - .type two_to_32,@object - .size two_to_32,8 -two_to_32: - .double 0r4294967296 - - .type two_to_31,@object - .size two_to_31,8 -two_to_31: - .double 0r2147483648 - - .text -ENTRY(__udiv_qrnnd) - !#PROLOGUE# 0 - save %sp,-104,%sp - !#PROLOGUE# 1 - st %i1,[%fp-8] - ld [%fp-8],%f10 -#ifdef PIC -LOC(base): - call 1f - fitod %f10,%f4 -1: ldd [%o7-(LOC(base)-two_to_32)],%f8 -#else - sethi %hi(two_to_32),%o7 - fitod %f10,%f4 - ldd [%o7+%lo(two_to_32)],%f8 -#endif - cmp %i1,0 - bge LOC(248) - mov %i0,%i5 - faddd %f4,%f8,%f4 -LOC(248): - st %i2,[%fp-8] - ld [%fp-8],%f10 - fmuld %f4,%f8,%f6 - cmp %i2,0 - bge LOC(249) - fitod %f10,%f2 - faddd %f2,%f8,%f2 -LOC(249): - st %i3,[%fp-8] - faddd %f6,%f2,%f2 - ld [%fp-8],%f10 - cmp %i3,0 - bge LOC(250) - fitod %f10,%f4 - faddd %f4,%f8,%f4 -LOC(250): - fdivd %f2,%f4,%f2 -#ifdef PIC - ldd [%o7-(LOC(base)-two_to_31)],%f4 -#else - sethi %hi(two_to_31),%o7 - ldd [%o7+%lo(two_to_31)],%f4 -#endif - fcmped %f2,%f4 - nop - fbge,a LOC(251) - fsubd %f2,%f4,%f2 - fdtoi %f2,%f2 - st %f2,[%fp-8] - b LOC(252) - ld [%fp-8],%i4 -LOC(251): - fdtoi %f2,%f2 - st %f2,[%fp-8] - ld [%fp-8],%i4 - sethi %hi(-2147483648),%g2 - xor %i4,%g2,%i4 -LOC(252): - wr %g0,%i4,%y - sra %i3,31,%g2 - and %i4,%g2,%g2 - andcc %g0,0,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,0,%g1 - add %g1,%g2,%i0 - rd %y,%g3 - subcc %i2,%g3,%o7 - subxcc %i1,%i0,%g0 - be LOC(253) - cmp %o7,%i3 - - add %i4,-1,%i0 - add %o7,%i3,%o7 - st %o7,[%i5] - ret - restore -LOC(253): - blu LOC(246) - mov %i4,%i0 - add %i4,1,%i0 - sub %o7,%i3,%o7 -LOC(246): - st %o7,[%i5] - ret - restore - -END(__udiv_qrnnd) |