This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc 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] 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


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