2004-11-18 Daniel Jacobowitz <dan@codesourcery.com>
authorRoland McGrath <roland@gnu.org>
Sat, 4 Dec 2004 21:20:17 +0000 (21:20 +0000)
committerRoland McGrath <roland@gnu.org>
Sat, 4 Dec 2004 21:20:17 +0000 (21:20 +0000)
* sysdeps/arm/sysdep.h: Define __USE_BX__ if bx is available.
Use it instead of __THUMB_INTERWORK__.  Make RETINSTR take
only a condition and a register.
* sysdeps/arm/dl-machine.h: Use __USE_BX__ instead of
__THUMB_INTERWORK__.
(_dl_start_user): Use BX.
* sysdeps/arm/strlen.S: Use DO_RET.
* sysdeps/unix/arm/brk.S, sysdeps/unix/arm/fork.S,
sysdeps/unix/arm/sysdep.S, sysdeps/unix/arm/sysdep.h: Likewise.
* sysdeps/unix/sysv/linux/arm/clone.S,
sysdeps/unix/sysv/linux/arm/mmap.S,
sysdeps/unix/sysv/linux/arm/mmap64.S,
sysdeps/unix/sysv/linux/arm/socket.S,
sysdeps/unix/sysv/linux/arm/sysdep.h,
sysdeps/unix/sysv/linux/arm/vfork.S: Update uses of RETINSTR.

13 files changed:
sysdeps/arm/dl-machine.h
sysdeps/arm/strlen.S
sysdeps/arm/sysdep.h
sysdeps/unix/arm/brk.S
sysdeps/unix/arm/fork.S
sysdeps/unix/arm/sysdep.S
sysdeps/unix/arm/sysdep.h
sysdeps/unix/sysv/linux/arm/clone.S
sysdeps/unix/sysv/linux/arm/mmap.S
sysdeps/unix/sysv/linux/arm/mmap64.S
sysdeps/unix/sysv/linux/arm/socket.S
sysdeps/unix/sysv/linux/arm/sysdep.h
sysdeps/unix/sysv/linux/arm/vfork.S

index 5dfe334..761f8da 100644 (file)
@@ -123,7 +123,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
   return lazy;
 }
 
-#if defined(__THUMB_INTERWORK__)
+#if defined(__USE_BX__)
 #define BX(x) "bx\t" #x
 #else
 #define BX(x) "mov\tpc, " #x
@@ -293,7 +293,7 @@ _dl_start_user:\n\
        ldr     r0, .L_FINI_PROC\n\
        add     r0, sl, r0\n\
        @ jump to the user_s entry point\n\
-       mov     pc, r6\n\
+       " BX(r6) "\n\
 .L_GET_GOT:\n\
        .word   _GLOBAL_OFFSET_TABLE_ - .L_GOT_GOT - 4\n\
 .L_SKIP_ARGS:\n\
index a83c41d..86e1665 100644 (file)
@@ -68,6 +68,6 @@ Llastword:                            @ drop through to here once we find a
        tstne   r2, $0x00ff0000         @ (if first three all non-zero, 4th
        addne   r0, r0, $1              @  must be zero)
 #endif
-       RETINSTR(mov,pc,lr)
+       DO_RET(lr)
 END(strlen)
 libc_hidden_builtin_def (strlen)
index cb3f105..8ca77a6 100644 (file)
 
 #include <sysdeps/generic/sysdep.h>
 
+#if (!defined (__ARM_ARCH_2__) && !defined (__ARM_ARCH_3__) \
+     && !defined (__ARM_ARCH_3M__) && !defined (__ARM_ARCH_4__))
+# define __USE_BX__
+#endif
+
 #ifdef __ASSEMBLER__
 
 /* Syntactic details of assembler.  */
 #ifdef __APCS_32__
 #define LOADREGS(cond, base, reglist...)\
        ldm##cond       base,reglist
-#define RETINSTR(instr, regs...)\
-       instr   regs
-#ifdef __THUMB_INTERWORK__
+#ifdef __USE_BX__
+#define RETINSTR(cond, reg)    \
+       bx##cond        reg
 #define DO_RET(_reg)           \
        bx _reg
 #else
+#define RETINSTR(cond, reg)    \
+       mov##cond       pc, reg
 #define DO_RET(_reg)           \
        mov pc, _reg
 #endif
 #else  /* APCS-26 */
 #define LOADREGS(cond, base, reglist...)\
        ldm##cond       base,reglist^
-#define RETINSTR(instr, regs...)\
-       instr##s        regs
+#define RETINSTR(cond, reg)    \
+       mov##cond##s    pc, reg
 #define DO_RET(_reg)           \
        movs pc, _reg
 #endif
index 9e20dc6..914e8a8 100644 (file)
@@ -43,7 +43,7 @@ SYSCALL__ (brk, 1)
 #endif
        str r0, [r1]
        mov r0, $0
-       RETINSTR(mov, pc, r14)
+       DO_RET (r14)
 #ifdef PIC
 1:     .long _GLOBAL_OFFSET_TABLE_ - 2b - 8
 _cb_addr:
index b317b66..bd00c92 100644 (file)
@@ -27,7 +27,7 @@ SYSCALL__ (fork, 0)
           R0&-1==R0, and the child gets R0&0==0.  */
        sub r1, r1, $1
        and r0, r0, r1
-       RETINSTR(mov, pc, r14)
+       DO_RET (r14)
 PSEUDO_END (__fork)
 libc_hidden_def (__fork)
 
index 5fc80a8..4810805 100644 (file)
@@ -50,7 +50,7 @@ syscall_error:
        ldr r1, 1f
        str r0, [r1]
        mvn r0, $0
-       RETINSTR(mov, pc, r14)
+       DO_RET (r14)
 
 1:     .long C_SYMBOL_NAME(errno)
 #else
@@ -60,7 +60,7 @@ syscall_error:
 0:     add r2, pc, r2
        str r0, [r1, r2]
        mvn r0, $0
-       RETINSTR(mov, pc, r14)
+       DO_RET (r14)
 
 1:     .word _GLOBAL_OFFSET_TABLE_ - 0b - 8
 2:     .word C_SYMBOL_NAME(errno)(GOTOFF)
index d776b45..5f36272 100644 (file)
@@ -24,7 +24,7 @@
 
 #ifdef __ASSEMBLER__
 
-#define ret            RETINSTR(mov, pc, r14)
+#define ret            DO_RET (r14)
 #define MOVE(a,b)      mov b,a
 
 #endif
index 1c6f786..bf07fb3 100644 (file)
@@ -45,7 +45,7 @@ ENTRY(__clone)
        swi     SYS_ify(clone)
        movs    a1, a1
        blt     PLTJMP(C_SYMBOL_NAME(__syscall_error))
-       RETINSTR(movne, pc, lr)
+       RETINSTR(ne, lr)
 
        @ pick the function arg and call address off the stack and execute
        ldr     r0, [sp, #4]
index 7beba68..cf6f253 100644 (file)
@@ -51,7 +51,7 @@ ENTRY (__mmap)
        ldr     r5, [sp], #4
 
        cmn     r0, $4096
-       RETINSTR(movcc, pc, lr)
+       RETINSTR(cc, lr)
        b       PLTJMP(syscall_error)
 
 .Linval:
@@ -83,7 +83,7 @@ ENTRY (__mmap)
        add     sp, sp, #16
 
        cmn     r0, $4096
-       RETINSTR(movcc, pc, lr)
+       RETINSTR(cc, lr)
        b       PLTJMP(syscall_error);
 #endif
 
index f8361b5..b4b712c 100644 (file)
@@ -43,12 +43,12 @@ ENTRY (__mmap64)
 # ifdef __ASSUME_MMAP2_SYSCALL
        ldr     r4, [sp], #4
        ldr     r5, [sp], #4
-       RETINSTR(movcc, pc, lr) 
+       RETINSTR(cc, lr)        
        b       PLTJMP(syscall_error)
 # else
        ldrcc   r4, [sp], #4
        ldrcc   r5, [sp], #4
-       RETINSTR(movcc, pc, lr)
+       RETINSTR(cc, lr)
        cmn     r0, $ENOSYS
        bne     .Lerror
        /* The current kernel does not support mmap2.  Fall back to plain
index 3e93ceb..212a489 100644 (file)
@@ -91,7 +91,7 @@ ENTRY (__socket)
 
        /* r0 is < 0 if there was an error.  */
        cmn r0, $124
-       RETINSTR(movcc, pc, r14)
+       RETINSTR(cc, r14)
        b PLTJMP(SYSCALL_ERROR)
 
 #if defined NEED_CANCELLATION && defined CENABLE
@@ -114,7 +114,7 @@ ENTRY (__socket)
 
        /* r0 is < 0 if there was an error.  */
        cmn r0, $124
-       RETINSTR(movcc, pc, r14)
+       RETINSTR(cc, r14)
        b PLTJMP(SYSCALL_ERROR)
 #endif
 
index fda7c5b..668aa1a 100644 (file)
@@ -54,7 +54,7 @@
     cmn r0, $4096;
 
 #define PSEUDO_RET                                                           \
-    RETINSTR(movcc, pc, lr);                                                 \
+    RETINSTR(cc, lr);                                                        \
     b PLTJMP(SYSCALL_ERROR)
 #undef ret
 #define ret PSEUDO_RET
@@ -71,7 +71,7 @@
     DO_CALL (syscall_name, args);
 
 #define PSEUDO_RET_NOERRNO                                                   \
-    RETINSTR(mov, pc, lr);
+    DO_RET (lr);
 
 #undef ret_NOERRNO
 #define ret_NOERRNO PSEUDO_RET_NOERRNO
index bba1a54..9ef5114 100644 (file)
@@ -32,7 +32,7 @@ ENTRY (__vfork)
 #ifdef __NR_vfork
        swi     __NR_vfork
        cmn     a1, #4096
-       RETINSTR(movcc, pc, lr)
+       RETINSTR(cc, lr)
 
 # ifdef __ASSUME_VFORK_SYSCALL
        b       PLTJMP(C_SYMBOL_NAME(__syscall_error))
@@ -47,7 +47,7 @@ ENTRY (__vfork)
        /* If we don't have vfork, fork is close enough.  */
        swi     __NR_fork
        cmn     a1, #4096
-       RETINSTR(movcc, pc, lr)
+       RETINSTR(cc, lr)
        b       PLTJMP(C_SYMBOL_NAME(__syscall_error))
 #elif !defined __NR_vfork
 # error "__NR_vfork not available and __ASSUME_VFORK_SYSCALL defined"