This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] sh: Fix calculation address in atomic function
- From: Nobuhiro Iwamatsu <iwamatsu at nigauri dot org>
- To: libc-alpha at sourceware dot org
- Cc: thomas at codesourcery dot com,kkojima at rr dot iij4u dot or dot jp,Nobuhiro Iwamatsu <iwamatsu at nigauri dot org>
- Date: Mon, 11 Jun 2012 15:24:44 +0900
- Subject: [PATCH] sh: Fix calculation address in atomic function
For example, in atomic_exchange_and_add, %1(__tmp) is added
to r2 by "add %1, r2\n\".
If interruption enters at this time, it will return to label 0.
And %1(__tmp) is added to r2 by "add %1, r2\n\", agian.
Since %1(__tmp) is added by r2 whenever interruption enters,
the value is not written in the right address.
This changes the order using registers and corrects this problem.
* sysdeps/unix/sysv/linux/sh/bits/atomic.h (atomic_exchange_and_add):
Fix calculate address by gUSA.
* sysdeps/unix/sysv/linux/sh/bits/atomic.h (atomic_add): Likewise.
* sysdeps/unix/sysv/linux/sh/bits/atomic.h (atomic_add_negative): Likewise.
* sysdeps/unix/sysv/linux/sh/bits/atomic.h (atomic_add_zero): Likewise.
* sysdeps/unix/sysv/linux/sh/bits/atomic.h (atomic_increment_and_test): Likewise.
* sysdeps/unix/sysv/linux/sh/bits/atomic.h (atomic_decrement_and_test): Likewise.
* sysdeps/unix/sysv/linux/sh/bits/atomic.h (atomic_bit_set): Likewise.
* sysdeps/unix/sysv/linux/sh/bits/atomic.h (atomic_bit_test_set): Likewise.
Signed-off-by: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
---
sysdeps/unix/sysv/linux/sh/bits/atomic.h | 62 +++++++++++++++---------------
1 file changed, 31 insertions(+), 31 deletions(-)
diff --git a/sysdeps/unix/sysv/linux/sh/bits/atomic.h b/sysdeps/unix/sysv/linux/sh/bits/atomic.h
index c8f07e5..a443fb4 100644
--- a/sysdeps/unix/sysv/linux/sh/bits/atomic.h
+++ b/sysdeps/unix/sysv/linux/sh/bits/atomic.h
@@ -1,5 +1,5 @@
/* Atomic operations used inside libc. Linux/SH version.
- Copyright (C) 2003, 2011 Free Software Foundation, Inc.
+ Copyright (C) 2003 - 2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -138,8 +138,8 @@ typedef uintmax_t uatomic_max_t;
mov r15,r1\n\
mov #-6,r15\n\
0: mov.b @%2,%0\n\
- add %0,%1\n\
- mov.b %1,@%2\n\
+ add %1,%0\n\
+ mov.b %0,@%2\n\
1: mov r1,r15"\
: "=&r" (__result), "=&r" (__tmp) : rNOSP (mem), "1" (__value) \
: "r0", "r1", "memory"); \
@@ -150,8 +150,8 @@ typedef uintmax_t uatomic_max_t;
mov r15,r1\n\
mov #-6,r15\n\
0: mov.w @%2,%0\n\
- add %0,%1\n\
- mov.w %1,@%2\n\
+ add %1,%0\n\
+ mov.w %0,@%2\n\
1: mov r1,r15"\
: "=&r" (__result), "=&r" (__tmp) : rNOSP (mem), "1" (__value) \
: "r0", "r1", "memory"); \
@@ -162,8 +162,8 @@ typedef uintmax_t uatomic_max_t;
mov r15,r1\n\
mov #-6,r15\n\
0: mov.l @%2,%0\n\
- add %0,%1\n\
- mov.l %1,@%2\n\
+ add %1,%0\n\
+ mov.l %0,@%2\n\
1: mov r1,r15"\
: "=&r" (__result), "=&r" (__tmp) : rNOSP (mem), "1" (__value) \
: "r0", "r1", "memory"); \
@@ -187,8 +187,8 @@ typedef uintmax_t uatomic_max_t;
mov r15,r1\n\
mov #-6,r15\n\
0: mov.b @%1,r2\n\
- add r2,%0\n\
- mov.b %0,@%1\n\
+ add %0,r2\n\
+ mov.b r2,@%1\n\
1: mov r1,r15"\
: "=&r" (__tmp) : rNOSP (mem), "0" (__value) \
: "r0", "r1", "r2", "memory"); \
@@ -199,8 +199,8 @@ typedef uintmax_t uatomic_max_t;
mov r15,r1\n\
mov #-6,r15\n\
0: mov.w @%1,r2\n\
- add r2,%0\n\
- mov.w %0,@%1\n\
+ add %0,r2\n\
+ mov.w r2,@%1\n\
1: mov r1,r15"\
: "=&r" (__tmp) : rNOSP (mem), "0" (__value) \
: "r0", "r1", "r2", "memory"); \
@@ -211,8 +211,8 @@ typedef uintmax_t uatomic_max_t;
mov r15,r1\n\
mov #-6,r15\n\
0: mov.l @%1,r2\n\
- add r2,%0\n\
- mov.l %0,@%1\n\
+ add %0,r2\n\
+ mov.l r2,@%1\n\
1: mov r1,r15"\
: "=&r" (__tmp) : rNOSP (mem), "0" (__value) \
: "r0", "r1", "r2", "memory"); \
@@ -238,10 +238,10 @@ typedef uintmax_t uatomic_max_t;
mov r15,r1\n\
mov #-6,r15\n\
0: mov.b @%2,r2\n\
- add r2,%1\n\
- mov.b %1,@%2\n\
+ add %1,r2\n\
+ mov.b r2,@%2\n\
1: mov r1,r15\n\
- shal %1\n\
+ shal r2\n\
movt %0"\
: "=r" (__result), "=&r" (__tmp) : rNOSP (mem), "1" (__value) \
: "r0", "r1", "r2", "t", "memory"); \
@@ -252,10 +252,10 @@ typedef uintmax_t uatomic_max_t;
mov r15,r1\n\
mov #-6,r15\n\
0: mov.w @%2,r2\n\
- add r2,%1\n\
- mov.w %1,@%2\n\
+ add %1,r2\n\
+ mov.w r2,@%2\n\
1: mov r1,r15\n\
- shal %1\n\
+ shal r2\n\
movt %0"\
: "=r" (__result), "=&r" (__tmp) : rNOSP (mem), "1" (__value) \
: "r0", "r1", "r2", "t", "memory"); \
@@ -266,10 +266,10 @@ typedef uintmax_t uatomic_max_t;
mov r15,r1\n\
mov #-6,r15\n\
0: mov.l @%2,r2\n\
- add r2,%1\n\
- mov.l %1,@%2\n\
+ add %1,r2\n\
+ mov.l r2,@%2\n\
1: mov r1,r15\n\
- shal %1\n\
+ shal r2\n\
movt %0"\
: "=r" (__result), "=&r" (__tmp) : rNOSP (mem), "1" (__value) \
: "r0", "r1", "r2", "t", "memory"); \
@@ -287,10 +287,10 @@ typedef uintmax_t uatomic_max_t;
mov r15,r1\n\
mov #-6,r15\n\
0: mov.b @%2,r2\n\
- add r2,%1\n\
- mov.b %1,@%2\n\
+ add %1,r2\n\
+ mov.b r2,@%2\n\
1: mov r1,r15\n\
- tst %1,%1\n\
+ tst r2,r2\n\
movt %0"\
: "=r" (__result), "=&r" (__tmp) : rNOSP (mem), "1" (__value) \
: "r0", "r1", "r2", "t", "memory"); \
@@ -301,10 +301,10 @@ typedef uintmax_t uatomic_max_t;
mov r15,r1\n\
mov #-6,r15\n\
0: mov.w @%2,r2\n\
- add r2,%1\n\
- mov.w %1,@%2\n\
+ add %1,r2\n\
+ mov.w r2,@%2\n\
1: mov r1,r15\n\
- tst %1,%1\n\
+ tst r2,r2\n\
movt %0"\
: "=r" (__result), "=&r" (__tmp) : rNOSP (mem), "1" (__value) \
: "r0", "r1", "r2", "t", "memory"); \
@@ -315,10 +315,10 @@ typedef uintmax_t uatomic_max_t;
mov r15,r1\n\
mov #-6,r15\n\
0: mov.l @%2,r2\n\
- add r2,%1\n\
- mov.l %1,@%2\n\
+ add %1,r2\n\
+ mov.l r2,@%2\n\
1: mov r1,r15\n\
- tst %1,%1\n\
+ tst r2,r2\n\
movt %0"\
: "=r" (__result), "=&r" (__tmp) : rNOSP (mem), "1" (__value) \
: "r0", "r1", "r2", "t", "memory"); \
--
1.7.10