From 6b58cbc02d642a18343fbb8663e76d87a538dd4a Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Fri, 9 Feb 2001 05:33:59 +0000 Subject: [PATCH] Update. 2001-02-08 Ulrich Drepper * sysdeps/alpha/strrchr.S: Little optimization. Patch by Richard Henderson . * sysdeps/alpha/alphaev67/strrchr.S: New file. Contributed by Rick Gorton .. 2001-02-08 kaz Kojima * sysdeps/sh/sh3/setjmp.S (__sigsetjmp): Correct function name in the assembler end directive. pointer in FILE structure before calling _IO_init. correctly. For numbers ending in all zeros eat the zeros even before --- ChangeLog | 17 +- .../sysdeps/unix/sysv/linux/sh/pt-initfini.c | 169 ++++++++++++++++++ sysdeps/alpha/alphaev67/strrchr.S | 117 ++++++++++++ sysdeps/alpha/strrchr.S | 2 +- sysdeps/sh/sh3/setjmp.S | 2 +- 5 files changed, 303 insertions(+), 4 deletions(-) create mode 100644 linuxthreads/sysdeps/unix/sysv/linux/sh/pt-initfini.c create mode 100644 sysdeps/alpha/alphaev67/strrchr.S diff --git a/ChangeLog b/ChangeLog index 95bd8f1aae..ecd9ce4223 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2001-02-08 Ulrich Drepper + + * sysdeps/alpha/strrchr.S: Little optimization. + Patch by Richard Henderson . + + * sysdeps/alpha/alphaev67/strrchr.S: New file. + Contributed by Rick Gorton .. + +2001-02-08 kaz Kojima + + * sysdeps/sh/sh3/setjmp.S (__sigsetjmp): Correct function name + in the assembler end directive. + 2001-02-08 Andreas Jaeger * manual/stdio.texi (Closing Streams): Fix typos. @@ -9,7 +22,7 @@ Reported by Claus-Justus Heine . * stdlib/strfmon.c [USE_IN_LIBIO]: Define lock variable and store - point in FILE structure before calling _IO_init. + pointer in FILE structure before calling _IO_init. * stdlib/Makefile: Add -D_IO_MTSAFE_IO to CFLAGS for strfmon and strfmon_l if necessary. Reported by Jury Gerold . @@ -36,7 +49,7 @@ * stdlib/strtod.c: Never stop prematurely reading digits before the decimal point is found. Compute exponent limit for negative exponents - correctly. For numbers ending in all zeros eat the zeroes even before + correctly. For numbers ending in all zeros eat the zeros even before the decimal point if the exponent is negative [PR libc/2072]. * stdlib/Makefile (tests): Add bug-strtod. * stdlib/bug-strtod.c: New file. diff --git a/linuxthreads/sysdeps/unix/sysv/linux/sh/pt-initfini.c b/linuxthreads/sysdeps/unix/sysv/linux/sh/pt-initfini.c new file mode 100644 index 0000000000..01cd5a27bb --- /dev/null +++ b/linuxthreads/sysdeps/unix/sysv/linux/sh/pt-initfini.c @@ -0,0 +1,169 @@ +/* Special .init and .fini section support for SH. Linuxthread version. + Copyright (C) 2000, 2001 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 Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + In addition to the permissions in the GNU Library General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The Library General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + 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 Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* This file is compiled into assembly code which is then munged by a sed + script into two files: crti.s and crtn.s. + + * crti.s puts a function prologue at the beginning of the + .init and .fini sections and defines global symbols for + those addresses, so they can be called as functions. + + * crtn.s puts the corresponding function epilogues + in the .init and .fini sections. */ + +__asm__ (" + +#include \"defs.h\" +#define SHARED + +/*@HEADER_ENDS*/ + +/*@TESTS_BEGIN*/ + +/*@TESTS_END*/ + +/*@_init_PROLOG_BEGINS*/ + .section .init + .align 5 + .global _init + .type _init,@function +_init: + mov.l r12,@-r15 + mov.l r14,@-r15 + sts.l pr,@-r15 +#ifdef SHARED + mova .L22,r0 + mov.l .L22,r12 + add r0,r12 + mova .L24,r0 + mov.l .L24,r1 + add r0,r1 + jsr @r1 + nop + mova .L23,r0 + mov.l .L23,r1 + add r0,r1 +#else + mov.l .L24,r1 + jsr @r1 + nop + mov.l .L23,r1 +#endif + jsr @r1 + mov r15,r14 + bra 1f + nop + .align 2 +#ifdef SHARED +.L22: + .long _GLOBAL_OFFSET_TABLE_ +.L23: + .long __gmon_start__@PLT +.L24: + .long __pthread_initialize_minimal@PLT +#else +.L23: + .long __gmon_start__ +.L24: + .long __pthread_initialize_minimal +#endif + .data + .global __fpscr_values +__fpscr_values: + .long 0 + .long 0x80000 + .previous +1: + ALIGN + END_INIT + + +/*@_init_PROLOG_ENDS*/ + +/*@_init_EPILOG_BEGINS*/ + .section .init + mov r14,r15 + lds.l @r15+,pr + mov.l @r15+,r14 + rts + mov.l @r15+,r12 + END_INIT + .section .text + .align 5 + .weak __gmon_start__ + .type __gmon_start__,@function +__gmon_start__: + mov.l r14,@-r15 + mov r15,r14 + mov r14,r15 + rts + mov.l @r15+,r14 + +/*@_init_EPILOG_ENDS*/ + +/*@_fini_PROLOG_BEGINS*/ + .section .fini + .align 5 + .global _fini + .type _fini,@function +_fini: + mov.l r12,@-r15 + mov.l r14,@-r15 + sts.l pr,@-r15 +#ifdef SHARED + mova .L27,r0 + mov.l .L27,r12 + add r0,r12 +#endif + mov r15,r14 + ALIGN + END_FINI +#ifdef SHARED + bra 1f + nop + .align 2 +.L27: + .long _GLOBAL_OFFSET_TABLE_ +#endif +1: +/*@_fini_PROLOG_ENDS*/ + +/*@_fini_EPILOG_BEGINS*/ + .section .fini + mov r14,r15 + lds.l @r15+,pr + mov.l @r15+,r14 + rts + mov.l @r15+,r12 + + END_FINI + +/*@_fini_EPILOG_ENDS*/ + +/*@TRAILER_BEGINS*/ +"); diff --git a/sysdeps/alpha/alphaev67/strrchr.S b/sysdeps/alpha/alphaev67/strrchr.S new file mode 100644 index 0000000000..68874c966e --- /dev/null +++ b/sysdeps/alpha/alphaev67/strrchr.S @@ -0,0 +1,117 @@ +/* Copyright (C) 2000 Free Software Foundation, Inc. + EV67 optimized by Rick Gorton . + + 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 Library General Public License as + published by the Free Software Foundation; either version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* Return the address of the last occurrence of a given character + within a null-terminated string, or null if it is not found. */ + +#include + + .arch ev6 + .set noreorder + .set noat + +ENTRY(strrchr) +#ifdef PROF + ldgp gp, 0(pv) + lda AT, _mcount + jsr AT, (AT), _mcount + .prologue 1 +#else + .prologue 0 +#endif + + and a1, 0xff, t2 # E : 00000000000000ch + insbl a1, 1, t4 # U : 000000000000ch00 + insbl a1, 2, t5 # U : 0000000000ch0000 + ldq_u t0, 0(a0) # L : load first quadword Latency=3 + + mov zero, t6 # E : t6 is last match aligned addr + or t2, t4, a1 # E : 000000000000chch + sll t5, 8, t3 # U : 00000000ch000000 + mov zero, t8 # E : t8 is last match byte compare mask + + andnot a0, 7, v0 # E : align source addr + or t5, t3, t3 # E : 00000000chch0000 + sll a1, 32, t2 # U : 0000chch00000000 + sll a1, 48, t4 # U : chch000000000000 + + or t4, a1, a1 # E : chch00000000chch + or t2, t3, t2 # E : 0000chchchch0000 + or a1, t2, a1 # E : chchchchchchchch + lda t5, -1 # E : build garbage mask + + cmpbge zero, t0, t1 # E : bits set iff byte == zero + mskqh t5, a0, t4 # E : Complete garbage mask + xor t0, a1, t2 # E : make bytes == c zero + cmpbge zero, t4, t4 # E : bits set iff byte is garbage + + cmpbge zero, t2, t3 # E : bits set iff byte == c + andnot t1, t4, t1 # E : clear garbage from null test + andnot t3, t4, t3 # E : clear garbage from char test + bne t1, $eos # U : did we already hit the terminator? + + /* Character search main loop */ +$loop: + ldq t0, 8(v0) # L : load next quadword + cmovne t3, v0, t6 # E : save previous comparisons match + nop # : Latency=2, extra map slot (keep nop with cmov) + nop + + cmovne t3, t3, t8 # E : Latency=2, extra map slot + nop # : keep with cmovne + addq v0, 8, v0 # E : + xor t0, a1, t2 # E : + + cmpbge zero, t0, t1 # E : bits set iff byte == zero + cmpbge zero, t2, t3 # E : bits set iff byte == c + beq t1, $loop # U : if we havnt seen a null, loop + nop + + /* Mask out character matches after terminator */ +$eos: + negq t1, t4 # E : isolate first null byte match + and t1, t4, t4 # E : + subq t4, 1, t5 # E : build a mask of the bytes upto... + or t4, t5, t4 # E : ... and including the null + + and t3, t4, t3 # E : mask out char matches after null + cmovne t3, t3, t8 # E : save it, if match found Latency=2, extra map slot + nop # : Keep with cmovne + nop + + cmovne t3, v0, t6 # E : + nop # : Keep with cmovne + /* Locate the address of the last matched character */ + ctlz t8, t2 # U0 : Latency=3 (0x40 for t8=0) + nop + + cmoveq t8, 0x3f, t2 # E : Compensate for case when no match is seen + nop # E : hide the cmov latency (2) behind ctlz latency + lda t5, 0x3f($31) # E : + subq t5, t2, t5 # E : Normalize leading zero count + + addq t6, t5, v0 # E : and add to quadword address + ret # L0 : Latency=3 + nop + nop + +END(strrchr) + +weak_alias (strrchr, rindex) diff --git a/sysdeps/alpha/strrchr.S b/sysdeps/alpha/strrchr.S index 9997961c60..0faa8cc55f 100644 --- a/sysdeps/alpha/strrchr.S +++ b/sysdeps/alpha/strrchr.S @@ -39,7 +39,7 @@ ENTRY(strrchr) .prologue 0 #endif - zapnot a1, 1, a1 # e0 : zero extend our test character + and a1, 0xff, a1 # e0 : zero extend our test character mov zero, t6 # .. e1 : t6 is last match aligned addr sll a1, 8, t5 # e0 : replicate our test character mov zero, t7 # .. e1 : t7 is last match byte compare mask diff --git a/sysdeps/sh/sh3/setjmp.S b/sysdeps/sh/sh3/setjmp.S index c25f9a4197..5ed526b082 100644 --- a/sysdeps/sh/sh3/setjmp.S +++ b/sysdeps/sh/sh3/setjmp.S @@ -61,4 +61,4 @@ ENTRY (__sigsetjmp) .L1: .long C_SYMBOL_NAME(__sigjmp_save) #endif -END (__setjmp) +END (__sigsetjmp)