summaryrefslogtreecommitdiff
path: root/linuxthreads
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-01-12 19:29:11 +0000
committerUlrich Drepper <drepper@redhat.com>2003-01-12 19:29:11 +0000
commitaddb5f3176382693f987f0f44f3708f610d2e984 (patch)
tree7c1f62aba569850e1e15199b3e51573cf4759aeb /linuxthreads
parent76426e0247ecd09c574ac124d8c0329d3d6d0ff7 (diff)
Update.
2002-01-09 Richard Henderson <rth@redhat.com> * sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h: Assume only ret follows pseudo, and thus avoid branch-to-branch in cancel case. Use SYSCALL_ERROR_LABEL.
Diffstat (limited to 'linuxthreads')
-rw-r--r--linuxthreads/ChangeLog6
-rw-r--r--linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h15
2 files changed, 17 insertions, 4 deletions
diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog
index 5f0c1bfb2b..de0204dc80 100644
--- a/linuxthreads/ChangeLog
+++ b/linuxthreads/ChangeLog
@@ -1,3 +1,9 @@
+2002-01-09 Richard Henderson <rth@redhat.com>
+
+ * sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h: Assume only
+ ret follows pseudo, and thus avoid branch-to-branch in cancel
+ case. Use SYSCALL_ERROR_LABEL.
+
2003-01-11 Philip Blundell <philb@gnu.org>
* sysdeps/unix/sysv/linux/arm/vfork.S: New file.
diff --git a/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h b/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h
index 18ea29c49f..083db2f39a 100644
--- a/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h
+++ b/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h
@@ -33,6 +33,9 @@
# define PSEUDO_PROF
# endif
+/* ??? Assumes that nothing comes between PSEUDO and PSEUDO_END
+ besides "ret". */
+
# undef PSEUDO
# define PSEUDO(name, syscall_name, args) \
.globl name; \
@@ -47,7 +50,7 @@ __LABEL(name) \
bne t0, $pseudo_cancel; \
lda v0, SYS_ify(syscall_name); \
call_pal PAL_callsys; \
- bne a3, $syscall_error; \
+ bne a3, SYSCALL_ERROR_LABEL; \
__LABEL($pseudo_ret) \
.subsection 2; \
__LABEL($pseudo_cancel) \
@@ -59,13 +62,17 @@ __LABEL($pseudo_cancel) \
lda v0, SYS_ify(syscall_name); \
call_pal PAL_callsys; \
stq v0, 8(sp); \
- stq a3, 16(sp); \
+ bne a3, $multi_error; \
+ CDISABLE; \
+ ldq ra, 0(sp); \
+ ldq v0, 8(sp); \
+ addq sp, 64, sp; \
+ ret; \
+__LABEL($multi_error) \
CDISABLE; \
ldq ra, 0(sp); \
ldq v0, 8(sp); \
- ldq a3, 16(sp); \
addq sp, 64, sp; \
- beq a3, $pseudo_ret; \
__LABEL($syscall_error) \
SYSCALL_ERROR_HANDLER; \
END(name); \