Update.
authorUlrich Drepper <drepper@redhat.com>
Sun, 14 Sep 2003 20:38:01 +0000 (20:38 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sun, 14 Sep 2003 20:38:01 +0000 (20:38 +0000)
2003-09-14  Ulrich Drepper  <drepper@redhat.com>

* dirent/dirent.h: Remove __THROW from scandir.

2003-09-14  Philip Blundell  <philb@gnu.org>

* sysdeps/unix/sysv/linux/arm/mmap.S: Use sys_mmap2 if it's known
to be available.

* sysdeps/unix/sysv/linux/arm/mmap64.S: Optimise code a little.

* sysdeps/arm/memset.S: Rewrite.

ChangeLog
dirent/dirent.h
sysdeps/arm/memset.S
sysdeps/unix/sysv/linux/arm/mmap.S
sysdeps/unix/sysv/linux/arm/mmap64.S

index 468a551..ac3576f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2003-09-14  Ulrich Drepper  <drepper@redhat.com>
+
+       * dirent/dirent.h: Remove __THROW from scandir.
+
+2003-09-14  Philip Blundell  <philb@gnu.org>
+
+       * sysdeps/unix/sysv/linux/arm/mmap.S: Use sys_mmap2 if it's known
+       to be available.
+
+       * sysdeps/unix/sysv/linux/arm/mmap64.S: Optimise code a little.
+
+       * sysdeps/arm/memset.S: Rewrite.
+
 2003-09-12  Jakub Jelinek  <jakub@redhat.com>
 
        * sysdeps/unix/sysv/linux/s390/bits/typesizes.h: New.
index 9f7c380..319fb74 100644 (file)
@@ -239,14 +239,14 @@ extern int dirfd (DIR *__dirp) __THROW;
 extern int scandir (__const char *__restrict __dir,
                    struct dirent ***__restrict __namelist,
                    int (*__selector) (__const struct dirent *),
-                   int (*__cmp) (__const void *, __const void *)) __THROW;
+                   int (*__cmp) (__const void *, __const void *));
 # else
 #  ifdef __REDIRECT
 extern int __REDIRECT (scandir,
                       (__const char *__restrict __dir,
                        struct dirent ***__restrict __namelist,
                        int (*__selector) (__const struct dirent *),
-                       int (*__cmp) (__const void *, __const void *)) __THROW,
+                       int (*__cmp) (__const void *, __const void *)),
                       scandir64);
 #  else
 #   define scandir scandir64
@@ -259,7 +259,7 @@ extern int __REDIRECT (scandir,
 extern int scandir64 (__const char *__restrict __dir,
                      struct dirent64 ***__restrict __namelist,
                      int (*__selector) (__const struct dirent64 *),
-                     int (*__cmp) (__const void *, __const void *)) __THROW;
+                     int (*__cmp) (__const void *, __const void *));
 # endif
 
 /* Function to compare two `struct dirent's alphabetically.  */
@@ -269,8 +269,7 @@ extern int alphasort (__const void *__e1, __const void *__e2)
 # else
 #  ifdef __REDIRECT
 extern int __REDIRECT (alphasort,
-                      (__const void *__e1, __const void *__e2)
-                      __THROW,
+                      (__const void *__e1, __const void *__e2) __THROW,
                       alphasort64) __attribute_pure__;
 #  else
 #   define alphasort alphasort64
@@ -290,8 +289,7 @@ extern int versionsort (__const void *__e1, __const void *__e2)
 #  else
 #   ifdef __REDIRECT
 extern int __REDIRECT (versionsort,
-                      (__const void *__e1, __const void *__e2)
-                      __THROW,
+                      (__const void *__e1, __const void *__e2) __THROW,
                       versionsort64) __attribute_pure__;
 #   else
 #    define versionsort versionsort64
index 0b62413..1e2699d 100644 (file)
 /* void *memset (dstpp, c, len) */
 
 ENTRY(memset)
-       mov     a4, a1
-       cmp     a3, $8          @ at least 8 bytes to do?
-       blt     2f
-       orr     a2, a2, a2, lsl $8
-       orr     a2, a2, a2, lsl $16
+       mov     r3, r0
+       cmp     r2, #8
+       bcc     2f              @ less than 8 bytes to move
+
 1:
-       tst     a4, $3          @ aligned yet?
-       strneb  a2, [a4], $1
-       subne   a3, a3, $1
+       tst     r3, #3          @ aligned yet?
+       strneb  r1, [r3], #1
+       subne   r2, r2, #1
        bne     1b
-       mov     ip, a2
+
+       orr     r1, r1, r1, lsl $8
+       orr     r1, r1, r1, lsl $16
+
 1:
-       cmp     a3, $8          @ 8 bytes still to do?
-       blt     2f
-       stmia   a4!, {a2, ip}
-       sub     a3, a3, $8
-       cmp     a3, $8          @ 8 bytes still to do?
-       blt     2f
-       stmia   a4!, {a2, ip}
-       sub     a3, a3, $8
-       cmp     a3, $8          @ 8 bytes still to do?
-       blt     2f
-       stmia   a4!, {a2, ip}
-       sub     a3, a3, $8
-       cmp     a3, $8          @ 8 bytes still to do?
-       stmgeia a4!, {a2, ip}
-       subge   a3, a3, $8
-       bge     1b
+       subs    r2, r2, #8
+       strcs   r1, [r3], #4    @ store up to 32 bytes per loop iteration
+       strcs   r1, [r3], #4
+       subcss  r2, r2, #8
+       strcs   r1, [r3], #4
+       strcs   r1, [r3], #4
+       subcss  r2, r2, #8
+       strcs   r1, [r3], #4
+       strcs   r1, [r3], #4
+       subcss  r2, r2, #8
+       strcs   r1, [r3], #4
+       strcs   r1, [r3], #4
+       bcs     1b
+
+       and     r2, r2, #7
 2:
-       movs    a3, a3          @ anything left?
-       RETINSTR(moveq,pc,lr)   @ nope
-       rsb     a3, a3, $7
-       add     pc, pc, a3, lsl $2
-       mov     r0, r0
-       strb    a2, [a4], $1
-       strb    a2, [a4], $1
-       strb    a2, [a4], $1
-       strb    a2, [a4], $1
-       strb    a2, [a4], $1
-       strb    a2, [a4], $1
-       strb    a2, [a4], $1
-       RETINSTR(mov,pc,lr)
+       subs    r2, r2, #1      @ store up to 4 bytes per loop iteration
+       strcsb  r1, [r3], #1
+       subcss  r2, r2, #1
+       strcsb  r1, [r3], #1
+       subcss  r2, r2, #1
+       strcsb  r1, [r3], #1
+       subcss  r2, r2, #1
+       strcsb  r1, [r3], #1
+       bcs     2b
+       
+       DO_RET(lr)
 END(memset)
 libc_hidden_builtin_def (memset)
index af93c7b..7beba68 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 2000, 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
    02111-1307 USA.  */
 
 #include <sysdep.h>
+#include <kernel-features.h>
+
+#define        EINVAL          22
 
        .text
 
 ENTRY (__mmap)
+# ifdef __ASSUME_MMAP2_SYSCALL
+       /* This code is actually a couple of cycles slower than the
+          sys_mmap version below, so it might seem like a loss.  But the
+          code path inside the kernel is sufficiently much shorter to
+          make it a net gain to use mmap2 when it's known to be
+          available.  */
+
+       /* shuffle args */
+       str     r5, [sp, #-4]!
+       ldr     r5, [sp, #8]
+       str     r4, [sp, #-4]!
+       ldr     r4, [sp, #8]
+
+       /* convert offset to pages */
+       movs    ip, r5, lsl #20
+       bne     .Linval
+       mov     r5, r5, lsr #12
+       
+       /* do the syscall */
+       swi     SYS_ify (mmap2)
+
+       /* restore registers */
+2:
+       ldr     r4, [sp], #4
+       ldr     r5, [sp], #4
+
+       cmn     r0, $4096
+       RETINSTR(movcc, pc, lr)
+       b       PLTJMP(syscall_error)
 
+.Linval:
+       mov     r0, #-EINVAL
+       b       2b
+# else
        /* Because we can only get five args through the syscall interface, and
           mmap() takes six, we need to build a parameter block and pass its
           address instead.  The 386 port does a similar trick.  */
@@ -49,6 +85,7 @@ ENTRY (__mmap)
        cmn     r0, $4096
        RETINSTR(movcc, pc, lr)
        b       PLTJMP(syscall_error);
+#endif
 
 PSEUDO_END (__mmap)
 
index 3936e25..f8361b5 100644 (file)
        .text
 ENTRY (__mmap64)
 #ifdef __NR_mmap2
-       stmfd   sp!, {r4, r5, lr}
-       ldr     r5, [sp, $16]
-       ldr     r4, [sp, $12]
-       movs    ip, r5, lsl $20         @ check that offset is page-aligned
+       ldr     ip, [sp, $4]            @ offset low part
+       str     r5, [sp, #-4]!
+       ldr     r5, [sp, $12]           @ offset high part
+       str     r4, [sp, #-4]!
+       movs    r4, ip, lsl $20         @ check that offset is page-aligned
+       mov     ip, ip, lsr $12
+       moveqs  r4, r5, lsr $12         @ check for overflow
        bne     .Linval
-       ldr     ip, [sp, $20]
-       mov     r5, r5, lsr $12
-       orr     r5, r5, ip, lsl $20     @ compose page offset
-       movs    ip, ip, lsr $12
-       bne     .Linval                 @ check for overflow
+       ldr     r4, [sp, $8]            @ load fd
+       orr     r5, ip, r5, lsl $20     @ compose page offset
        mov     ip, r0
        swi     SYS_ify (mmap2)
        cmn     r0, $4096
-       LOADREGS(ccfd, sp!, {r4, r5, pc})
 # ifdef __ASSUME_MMAP2_SYSCALL
-       ldmfd   sp!, {r4, r5, lr}
+       ldr     r4, [sp], #4
+       ldr     r5, [sp], #4
+       RETINSTR(movcc, pc, lr) 
        b       PLTJMP(syscall_error)
 # else
+       ldrcc   r4, [sp], #4
+       ldrcc   r5, [sp], #4
+       RETINSTR(movcc, pc, lr)
        cmn     r0, $ENOSYS
-       ldmnefd sp!, {r4, r5, lr}
-       bne     PLTJMP(syscall_error)
+       bne     .Lerror
        /* The current kernel does not support mmap2.  Fall back to plain
           mmap if the offset is small enough.  */
-       ldr     r5, [sp, $20]
+       ldr     r5, [sp, $16]
        mov     r0, ip                  @ first arg was clobbered
        teq     r5, $0
-       ldmeqfd sp!, {r4, r5, lr}
+       ldreq   r4, [sp], #4
+       ldreq   r5, [sp], #4
        beq     PLTJMP(__mmap)
 # endif
 .Linval:
        mov     r0, $-EINVAL
-       ldmfd   sp!, {r4, r5, lr}
+.Lerror:
+       ldr     r4, [sp], #4
+       ldr     r5, [sp], #4
        b       PLTJMP(syscall_error)
 #else
        /* The kernel headers do not support mmap2.  Fall back to plain