summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2011-11-30 22:29:33 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2011-11-30 22:29:33 +0000
commit0389984f5e1661a5cd9dc0f15dc55a9ff5a3b927 (patch)
tree9f60b09cc1447fb54c59835052aa947c7643e8ec
parent2380e91ebcff9e62483029a65772f4f6bc431afb (diff)
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181863 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--libitm/ChangeLog8
-rw-r--r--libitm/beginend.cc12
-rw-r--r--libitm/config/alpha/sjlj.S44
-rw-r--r--libitm/config/x86/sjlj.S19
-rw-r--r--libitm/libitm_i.h2
5 files changed, 46 insertions, 39 deletions
diff --git a/libitm/ChangeLog b/libitm/ChangeLog
index be994a5c36e6..33584647bc8c 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 a26697567a3e..d8ef651236dd 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 3aa5f06e3324..615eacb8688d 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 39e0c758d6d0..8faa0c61d5c2 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 ba1afb4710c8..ff6884e88051 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;