This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Swap the action and jmpbuf arguments to GTM_longjmp


On several ABIs, the first register parameter is the same as
the return value register.  Moving the action parameter first
avoids the need for register shuffling on these targets.

        * libitm_i.h (GTM_longjmp): Swap first and second arguments.
        * beginend.c (_ITM_abortTransaction): Update to match.
        (GTM::gtm_thread::restart): Likewise.
        * config/alpha/sjlj.S (GTM_longjmp): Likewise.
        * config/x86/sjlj.S (GTM_longjmp): Likewise.
---
 libitm/ChangeLog           |    8 ++++++++
 libitm/beginend.cc         |   12 ++++++------
 libitm/config/alpha/sjlj.S |   44 ++++++++++++++++++++++----------------------
 libitm/config/x86/sjlj.S   |   19 +++++++++----------
 libitm/libitm_i.h          |    2 +-
 5 files changed, 46 insertions(+), 39 deletions(-)

diff --git a/libitm/ChangeLog b/libitm/ChangeLog
index be994a5..3358464 100644
--- a/libitm/ChangeLog
+++ b/libitm/ChangeLog
@@ -1,3 +1,11 @@
+2011-11-30  Richard Henderson  <rth@redhat.com>
+
+	* libitm_i.h (GTM_longjmp): Swap first and second arguments.
+	* beginend.c (_ITM_abortTransaction): Update to match.
+	(GTM::gtm_thread::restart): Likewise.
+	* config/alpha/sjlj.S (GTM_longjmp): Likewise.
+	* config/x86/sjlj.S (GTM_longjmp): Likewise.
+
 2011-11-23  Iain Sandoe  <iains@gcc.gnu.org>
 
 	* Makefile.am (libitm_la_LDFLAGS): Remove "-no-undefined".
diff --git a/libitm/beginend.cc b/libitm/beginend.cc
index a266975..d8ef651 100644
--- a/libitm/beginend.cc
+++ b/libitm/beginend.cc
@@ -404,8 +404,8 @@ _ITM_abortTransaction (_ITM_abortReason reason)
       tx->rollback (cp, true);
 
       // Jump to nested transaction (use the saved jump buffer).
-      GTM_longjmp (&longjmp_jb, a_abortTransaction | a_restoreLiveVariables,
-	  longjmp_prop);
+      GTM_longjmp (a_abortTransaction | a_restoreLiveVariables,
+		   &longjmp_jb, longjmp_prop);
     }
   else
     {
@@ -421,8 +421,8 @@ _ITM_abortTransaction (_ITM_abortReason reason)
 	gtm_thread::serial_lock.read_unlock (tx);
       tx->state = 0;
 
-      GTM_longjmp (&tx->jb, a_abortTransaction | a_restoreLiveVariables,
-	  tx->prop);
+      GTM_longjmp (a_abortTransaction | a_restoreLiveVariables,
+		   &tx->jb, tx->prop);
     }
 }
 
@@ -512,8 +512,8 @@ GTM::gtm_thread::restart (gtm_restart_reason r)
       disp = abi_disp();
     }
 
-  GTM_longjmp (&jb,
-      choose_code_path(prop, disp) | a_restoreLiveVariables, prop);
+  GTM_longjmp (choose_code_path(prop, disp) | a_restoreLiveVariables,
+	       &jb, prop);
 }
 
 void ITM_REGPARM
diff --git a/libitm/config/alpha/sjlj.S b/libitm/config/alpha/sjlj.S
index 3aa5f06..615eacb 100644
--- a/libitm/config/alpha/sjlj.S
+++ b/libitm/config/alpha/sjlj.S
@@ -81,28 +81,28 @@ _ITM_beginTransaction:
 
 GTM_longjmp:
 	.prologue 0
-	ldq	$26, 0($16)
-	ldq	$9, 8($16)
-	ldq	$10, 16($16)
-	ldq	$11, 24($16)
-
-	ldq	$12, 32($16)
-	ldq	$13, 40($16)
-	ldq	$14, 48($16)
-	ldq	$15, 56($16)
-
-	ldq	$1, 64($16)
-	ldt	$f2, 72($16)
-	ldt	$f3, 80($16)
-	ldt	$f4, 88($16)
-
-	ldt	$f5, 96($16)
-	ldt	$f6, 104($16)
-	ldt	$f7, 112($16)
-	ldt	$f8, 120($16)
-
-	ldt	$f9, 128($16)
-	mov	$17, $0
+	ldq	$26, 0($17)
+	ldq	$9, 8($17)
+	ldq	$10, 16($17)
+	ldq	$11, 24($17)
+
+	ldq	$12, 32($17)
+	ldq	$13, 40($17)
+	ldq	$14, 48($17)
+	ldq	$15, 56($17)
+
+	ldq	$1, 64($17)
+	ldt	$f2, 72($17)
+	ldt	$f3, 80($17)
+	ldt	$f4, 88($17)
+
+	ldt	$f5, 96($17)
+	ldt	$f6, 104($17)
+	ldt	$f7, 112($17)
+	ldt	$f8, 120($17)
+
+	ldt	$f9, 128($17)
+	mov	$16, $0
 	mov	$1, $30
 	ret
 .end GTM_longjmp
diff --git a/libitm/config/x86/sjlj.S b/libitm/config/x86/sjlj.S
index 39e0c75..8faa0c6 100644
--- a/libitm/config/x86/sjlj.S
+++ b/libitm/config/x86/sjlj.S
@@ -113,21 +113,20 @@ SYM(_ITM_beginTransaction):
 SYM(GTM_longjmp):
 	cfi_startproc
 #ifdef __x86_64__
-	movq	(%rdi), %rcx
-	movq	8(%rdi), %rdx
-	movq	16(%rdi), %rbx
-	movq	24(%rdi), %rbp
-	movq	32(%rdi), %r12
-	movq	40(%rdi), %r13
-	movq	48(%rdi), %r14
-	movq	56(%rdi), %r15
-	movl	%esi, %eax
+	movq	(%rsi), %rcx
+	movq	8(%rsi), %rdx
+	movq	16(%rsi), %rbx
+	movq	24(%rsi), %rbp
+	movq	32(%rsi), %r12
+	movq	40(%rsi), %r13
+	movq	48(%rsi), %r14
+	movq	56(%rsi), %r15
+	movl	%edi, %eax
 	cfi_def_cfa(%rcx, 0)
 	cfi_register(%rip, %rdx)
 	movq	%rcx, %rsp
 	jmp	*%rdx
 #else
-	xchgl	%eax, %edx
 	movl	(%edx), %ecx
 	movl	4(%edx), %ebx
 	movl	8(%edx), %esi
diff --git a/libitm/libitm_i.h b/libitm/libitm_i.h
index ba1afb4..ff6884e 100644
--- a/libitm/libitm_i.h
+++ b/libitm/libitm_i.h
@@ -285,7 +285,7 @@ namespace GTM HIDDEN {
 // are used.
 extern uint64_t gtm_spin_count_var;
 
-extern "C" uint32_t GTM_longjmp (const gtm_jmpbuf *, uint32_t, uint32_t)
+extern "C" uint32_t GTM_longjmp (uint32_t, const gtm_jmpbuf *, uint32_t)
 	ITM_NORETURN ITM_REGPARM;
 
 extern "C" void GTM_LB (const void *, size_t) ITM_REGPARM;
-- 
1.7.6.4


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]