[COMMITTED] alpha: Create __syscall_nocancel entry points
diff mbox

Message ID 5377B2E1.5050300@twiddle.net
State New
Headers show

Commit Message

Richard Henderson May 17, 2014, 7:05 p.m. UTC
Moves the alpha port more in line with x86_64, as fallout from the
recent not-cancel.h change.

The rearrangement preserves the branch prediction, from expected-not-taken
forward branch to expected-taken backward branch.


r~
* sysdeps/unix/sysv/linux/alpha/nptl/sysdep-cancel.h (PSEUDO):
	Create the __##syscall_name##_nocancel entry point.
	* sysdeps/unix/sysv/linux/alpha/sigsuspend.S (__sigsuspend_nocancel):
	Remove; let the sysdep-cancel.h code create it.

Patch
diff mbox

diff --git a/sysdeps/unix/sysv/linux/alpha/nptl/sysdep-cancel.h b/sysdeps/unix/sysv/linux/alpha/nptl/sysdep-cancel.h
index 610b583..69809bc 100644
--- a/sysdeps/unix/sysv/linux/alpha/nptl/sysdep-cancel.h
+++ b/sysdeps/unix/sysv/linux/alpha/nptl/sysdep-cancel.h
@@ -28,24 +28,32 @@ 
 
 # undef PSEUDO
 # define PSEUDO(name, syscall_name, args)			\
-	.globl name;						\
+	.globl	__##syscall_name##_nocancel;			\
+	.type	__##syscall_name##_nocancel, @function;		\
+	.usepv	__##syscall_name##_nocancel, std;		\
 	.align 4;						\
-	.type name, @function;					\
-	.usepv name, std;					\
 	cfi_startproc;						\
-__LABEL(name)							\
+__LABEL(__##syscall_name##_nocancel)				\
 	ldgp	gp, 0(pv);					\
 	PSEUDO_PROF;						\
-	PSEUDO_PREPARE_ARGS					\
-	SINGLE_THREAD_P(t0);					\
-	bne	t0, $pseudo_cancel;				\
+__LABEL($pseudo_nocancel)					\
+	PSEUDO_PREPARE_ARGS;					\
 	lda	v0, SYS_ify(syscall_name);			\
 	call_pal PAL_callsys;					\
 	bne	a3, SYSCALL_ERROR_LABEL;			\
 __LABEL($pseudo_ret)						\
 	.subsection 2;						\
+	.size __##syscall_name##_nocancel, .-__##syscall_name##_nocancel; \
+	.globl	name;						\
+	.type	name, @function;				\
+	.usepv	name, std;					\
+	.align 4;						\
 	cfi_startproc;						\
-__LABEL($pseudo_cancel)						\
+__LABEL(name)							\
+	ldgp	gp, 0(pv);					\
+	PSEUDO_PROF;						\
+	SINGLE_THREAD_P(t0);					\
+	beq	t0, $pseudo_nocancel;				\
 	subq	sp, 64, sp;					\
 	cfi_def_cfa_offset(64);					\
 	stq	ra, 0(sp);					\
diff --git a/sysdeps/unix/sysv/linux/alpha/sigsuspend.S b/sysdeps/unix/sysv/linux/alpha/sigsuspend.S
index aa5e6c6..8a6816e 100644
--- a/sysdeps/unix/sysv/linux/alpha/sigsuspend.S
+++ b/sysdeps/unix/sysv/linux/alpha/sigsuspend.S
@@ -19,19 +19,6 @@ 
 /* sigsuspend is a special syscall since it needs to dereference the
    sigset.  This will have to change when we have more than 64 signals.  */
 
-#ifndef NO_CANCELLATION
-#include <sysdep.h>
-
-#undef PSEUDO_PREPARE_ARGS
-#define PSEUDO_PREPARE_ARGS	ldq	a0, 0(a0);
-
-PSEUDO(__sigsuspend_nocancel, sigsuspend, 1)
-	ret
-/* Use END, not PSEUDO_END, so that we don't issue two $syscall_error
-   symbols; we'll jump into __sigsuspend for the error case.  */
-END(__sigsuspend_nocancel)
-#endif /* NO_CANCELLATION */
-
 #include <sysdep-cancel.h>
 
 #undef PSEUDO_PREPARE_ARGS