about summary refs log tree commit diff
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)
downloadglibc-addb5f3176382693f987f0f44f3708f610d2e984.tar.gz
glibc-addb5f3176382693f987f0f44f3708f610d2e984.tar.xz
glibc-addb5f3176382693f987f0f44f3708f610d2e984.zip
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);						\