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 v2] sh: Fix gUSA sequence in atomic function


From: Nobuhiro Iwamatsu <iwamatsu@nigauri>

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 gUSA sequence.
	* 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.

Signed-off-by: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
---
 sysdeps/unix/sysv/linux/sh/bits/atomic.h |   83 ++++++++++++++++--------------
 1 file changed, 43 insertions(+), 40 deletions(-)

diff --git a/sysdeps/unix/sysv/linux/sh/bits/atomic.h b/sysdeps/unix/sysv/linux/sh/bits/atomic.h
index c8f07e5..9e8653b 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
@@ -133,40 +133,43 @@ typedef uintmax_t uatomic_max_t;
   ({ __typeof (*(mem)) __result, __tmp, __value = (value); \
      if (sizeof (*(mem)) == 1) \
        __asm __volatile ("\
-	  .align 2\n\
 	  mova 1f,r0\n\
+	  .align 2\n\
 	  mov r15,r1\n\
-	  mov #-6,r15\n\
+	  mov #(0f-1f),r15\n\
        0: mov.b @%2,%0\n\
-	  add %0,%1\n\
-	  mov.b %1,@%2\n\
+	  mov %1,r2\n\
+	  add %0,r2\n\
+	  mov.b r2,@%2\n\
        1: mov r1,r15"\
 	: "=&r" (__result), "=&r" (__tmp) : rNOSP (mem), "1" (__value) \
-	: "r0", "r1", "memory"); \
+	: "r0", "r1", "r2", "memory"); \
      else if (sizeof (*(mem)) == 2) \
        __asm __volatile ("\
-	  .align 2\n\
 	  mova 1f,r0\n\
+	  .align 2\n\
 	  mov r15,r1\n\
-	  mov #-6,r15\n\
+	  mov #(0f-1f),r15\n\
        0: mov.w @%2,%0\n\
-	  add %0,%1\n\
-	  mov.w %1,@%2\n\
+	  mov %1,r2\n\
+	  add %0,r2\n\
+	  mov.w r2,@%2\n\
        1: mov r1,r15"\
 	: "=&r" (__result), "=&r" (__tmp) : rNOSP (mem), "1" (__value) \
-	: "r0", "r1", "memory"); \
+	: "r0", "r1", "r2", "memory"); \
      else if (sizeof (*(mem)) == 4) \
        __asm __volatile ("\
-	  .align 2\n\
 	  mova 1f,r0\n\
+	  .align 2\n\
 	  mov r15,r1\n\
-	  mov #-6,r15\n\
+	  mov #(0f-1f),r15\n\
        0: mov.l @%2,%0\n\
-	  add %0,%1\n\
-	  mov.l %1,@%2\n\
+	  mov %1,r2\n\
+	  add %0,r2\n\
+	  mov.l r2,@%2\n\
        1: mov r1,r15"\
 	: "=&r" (__result), "=&r" (__tmp) : rNOSP (mem), "1" (__value) \
-	: "r0", "r1", "memory"); \
+	: "r0", "r1", "r2", "memory"); \
      else \
        { \
 	 __typeof (mem) memp = (mem); \
@@ -187,8 +190,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 +202,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 +214,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 +241,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 +255,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 +269,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 +290,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 +304,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 +318,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]