This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Hi, Here is a patch for sh atomicity macros. Sorry for the delay. If it's ok, please move the file sysdeps/sh/bits/atomic.h to sysdeps/unix/sysv/linux/sh/bits. I've added a comment for the software atomic sequence according to Roland's advice. Regards, kaz -- 2002-04-06 Kaz Kojima <kkojima at rr dot iij4u dot or dot jp> * sysdeps/sh/bits/atomic.h: Add comment. (__arch_compare_and_exchange_val_*_acq): Add parens around macro arguments. (atomic_bit_set, atomic_bit_test_set): Likewise. (atomic_exchange_and_add): Likewise. Don't evaluate value argument twice. (atomic_add, atomic_add_negative, atomic_add_zero): Likewise. --- ORIG/libc/sysdeps/sh/bits/atomic.h Sat Mar 29 10:37:20 2003 +++ LOCAL/libc/sysdeps/sh/bits/atomic.h Sun Apr 6 09:48:19 2003 @@ -44,9 +44,28 @@ typedef uintptr_t uatomicptr_t; typedef intmax_t atomic_max_t; typedef uintmax_t uatomic_max_t; +/* SH kernel has implemented a gUSA ("g" User Space Atomicity) support + for the user space atomicity. The atomicity macros use this scheme. + + Reference: + Niibe Yutaka, "gUSA: Simple and Efficient User Space Atomicity + Emulation with Little Kernel Modification", Linux Conference 2002, + Japan. http://lc.linux.or.jp/lc2002/papers/niibe0919h.pdf (in + Japanese). + + B.N. Bershad, D. Redell, and J. Ellis, "Fast Mutual Exclusion for + Uniprocessors", Proceedings of the Fifth Architectural Support for + Programming Languages and Operating Systems (ASPLOS), pp. 223-233, + October 1992. http://www.cs.washington.edu/homes/bershad/Papers/Rcs.ps + + SuperH ABI: + r15: -(size of atomic instruction sequence) < 0 + r0: end point + r1: saved stack pointer +*/ #define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \ - ({ __typeof (*mem) __result; \ + ({ __typeof (*(mem)) __result; \ __asm __volatile ("\ .align 2\n\ mova 1f,r0\n\ @@ -63,7 +82,7 @@ typedef uintmax_t uatomic_max_t; __result; }) #define __arch_compare_and_exchange_val_16_acq(mem, newval, oldval) \ - ({ __typeof (*mem) __result; \ + ({ __typeof (*(mem)) __result; \ __asm __volatile ("\ .align 2\n\ mova 1f,r0\n\ @@ -80,7 +99,7 @@ typedef uintmax_t uatomic_max_t; __result; }) #define __arch_compare_and_exchange_val_32_acq(mem, newval, oldval) \ - ({ __typeof (*mem) __result; \ + ({ __typeof (*(mem)) __result; \ __asm __volatile ("\ .align 2\n\ mova 1f,r0\n\ @@ -105,9 +124,8 @@ typedef uintmax_t uatomic_max_t; (abort (), 0) #define atomic_exchange_and_add(mem, value) \ - ({ __typeof (*mem) __result; \ - __typeof (value) __value; \ - if (sizeof (*mem) == 1) \ + ({ __typeof (*(mem)) __result, __tmp, __value = (value); \ + if (sizeof (*(mem)) == 1) \ __asm __volatile ("\ .align 2\n\ mova 1f,r0\n\ @@ -117,9 +135,9 @@ typedef uintmax_t uatomic_max_t; add %0,%1\n\ mov.b %1,@%2\n\ 1: mov r1,r15"\ - : "=&r" (__result), "=&r" (__value) : "r" (mem), "1" (value) \ + : "=&r" (__result), "=&r" (__tmp) : "r" (mem), "1" (__value) \ : "r0", "r1", "memory"); \ - else if (sizeof (*mem) == 2) \ + else if (sizeof (*(mem)) == 2) \ __asm __volatile ("\ .align 2\n\ mova 1f,r0\n\ @@ -129,9 +147,9 @@ typedef uintmax_t uatomic_max_t; add %0,%1\n\ mov.w %1,@%2\n\ 1: mov r1,r15"\ - : "=&r" (__result), "=&r" (__value) : "r" (mem), "1" (value) \ + : "=&r" (__result), "=&r" (__tmp) : "r" (mem), "1" (__value) \ : "r0", "r1", "memory"); \ - else if (sizeof (*mem) == 4) \ + else if (sizeof (*(mem)) == 4) \ __asm __volatile ("\ .align 2\n\ mova 1f,r0\n\ @@ -141,23 +159,22 @@ typedef uintmax_t uatomic_max_t; add %0,%1\n\ mov.l %1,@%2\n\ 1: mov r1,r15"\ - : "=&r" (__result), "=&r" (__value) : "r" (mem), "1" (value) \ + : "=&r" (__result), "=&r" (__tmp) : "r" (mem), "1" (__value) \ : "r0", "r1", "memory"); \ else \ { \ - __typeof (value) addval = (value); \ __typeof (mem) memp = (mem); \ do \ __result = *memp; \ while (__arch_compare_and_exchange_val_64_acq \ - (memp, __result + addval, __result) == __result); \ - (void) addval; \ + (memp, __result + __value, __result) == __result); \ + (void) __value; \ } \ __result; }) #define atomic_add(mem, value) \ - (void) ({ __typeof (value) __value; \ - if (sizeof (*mem) == 1) \ + (void) ({ __typeof (*(mem)) __tmp, __value = (value); \ + if (sizeof (*(mem)) == 1) \ __asm __volatile ("\ .align 2\n\ mova 1f,r0\n\ @@ -167,9 +184,9 @@ typedef uintmax_t uatomic_max_t; add r2,%0\n\ mov.b %0,@%1\n\ 1: mov r1,r15"\ - : "=&r" (__value) : "r" (mem), "0" (value) \ + : "=&r" (__tmp) : "r" (mem), "0" (__value) \ : "r0", "r1", "r2", "memory"); \ - else if (sizeof (*mem) == 2) \ + else if (sizeof (*(mem)) == 2) \ __asm __volatile ("\ .align 2\n\ mova 1f,r0\n\ @@ -179,9 +196,9 @@ typedef uintmax_t uatomic_max_t; add r2,%0\n\ mov.w %0,@%1\n\ 1: mov r1,r15"\ - : "=&r" (__value) : "r" (mem), "0" (value) \ + : "=&r" (__tmp) : "r" (mem), "0" (__value) \ : "r0", "r1", "r2", "memory"); \ - else if (sizeof (*mem) == 4) \ + else if (sizeof (*(mem)) == 4) \ __asm __volatile ("\ .align 2\n\ mova 1f,r0\n\ @@ -191,25 +208,24 @@ typedef uintmax_t uatomic_max_t; add r2,%0\n\ mov.l %0,@%1\n\ 1: mov r1,r15"\ - : "=&r" (__value) : "r" (mem), "0" (value) \ + : "=&r" (__tmp) : "r" (mem), "0" (__value) \ : "r0", "r1", "r2", "memory"); \ else \ { \ - __typeof (value) addval = (value); \ - __typeof (*mem) oldval; \ + __typeof (*(mem)) oldval; \ __typeof (mem) memp = (mem); \ do \ oldval = *memp; \ while (__arch_compare_and_exchange_val_64_acq \ - (memp, oldval + addval, oldval) == oldval); \ - (void) addval; \ + (memp, oldval + __value, oldval) == oldval); \ + (void) __value; \ } \ }) #define atomic_add_negative(mem, value) \ ({ unsigned char __result; \ - __typeof (value) __value; \ - if (sizeof (*mem) == 1) \ + __typeof (*(mem)) __tmp, __value = (value); \ + if (sizeof (*(mem)) == 1) \ __asm __volatile ("\ .align 2\n\ mova 1f,r0\n\ @@ -221,9 +237,9 @@ typedef uintmax_t uatomic_max_t; 1: mov r1,r15\n\ shal %1\n\ movt %0"\ - : "=r" (__result), "=&r" (__value) : "r" (mem), "1" (value) \ + : "=r" (__result), "=&r" (__tmp) : "r" (mem), "1" (__value) \ : "r0", "r1", "r2", "t", "memory"); \ - else if (sizeof (*mem) == 2) \ + else if (sizeof (*(mem)) == 2) \ __asm __volatile ("\ .align 2\n\ mova 1f,r0\n\ @@ -235,9 +251,9 @@ typedef uintmax_t uatomic_max_t; 1: mov r1,r15\n\ shal %1\n\ movt %0"\ - : "=r" (__result), "=&r" (__value) : "r" (mem), "1" (value) \ + : "=r" (__result), "=&r" (__tmp) : "r" (mem), "1" (__value) \ : "r0", "r1", "r2", "t", "memory"); \ - else if (sizeof (*mem) == 4) \ + else if (sizeof (*(mem)) == 4) \ __asm __volatile ("\ .align 2\n\ mova 1f,r0\n\ @@ -249,7 +265,7 @@ typedef uintmax_t uatomic_max_t; 1: mov r1,r15\n\ shal %1\n\ movt %0"\ - : "=r" (__result), "=&r" (__value) : "r" (mem), "1" (value) \ + : "=r" (__result), "=&r" (__tmp) : "r" (mem), "1" (__value) \ : "r0", "r1", "r2", "t", "memory"); \ else \ abort (); \ @@ -257,8 +273,8 @@ typedef uintmax_t uatomic_max_t; #define atomic_add_zero(mem, value) \ ({ unsigned char __result; \ - __typeof (value) __value; \ - if (sizeof (*mem) == 1) \ + __typeof (*(mem)) __tmp, __value = (value); \ + if (sizeof (*(mem)) == 1) \ __asm __volatile ("\ .align 2\n\ mova 1f,r0\n\ @@ -270,9 +286,9 @@ typedef uintmax_t uatomic_max_t; 1: mov r1,r15\n\ tst %1,%1\n\ movt %0"\ - : "=r" (__result), "=&r" (__value) : "r" (mem), "1" (value) \ + : "=r" (__result), "=&r" (__tmp) : "r" (mem), "1" (__value) \ : "r0", "r1", "r2", "t", "memory"); \ - else if (sizeof (*mem) == 2) \ + else if (sizeof (*(mem)) == 2) \ __asm __volatile ("\ .align 2\n\ mova 1f,r0\n\ @@ -284,9 +300,9 @@ typedef uintmax_t uatomic_max_t; 1: mov r1,r15\n\ tst %1,%1\n\ movt %0"\ - : "=r" (__result), "=&r" (__value) : "r" (mem), "1" (value) \ + : "=r" (__result), "=&r" (__tmp) : "r" (mem), "1" (__value) \ : "r0", "r1", "r2", "t", "memory"); \ - else if (sizeof (*mem) == 4) \ + else if (sizeof (*(mem)) == 4) \ __asm __volatile ("\ .align 2\n\ mova 1f,r0\n\ @@ -298,7 +314,7 @@ typedef uintmax_t uatomic_max_t; 1: mov r1,r15\n\ tst %1,%1\n\ movt %0"\ - : "=r" (__result), "=&r" (__value) : "r" (mem), "1" (value) \ + : "=r" (__result), "=&r" (__tmp) : "r" (mem), "1" (__value) \ : "r0", "r1", "r2", "t", "memory"); \ else \ abort (); \ @@ -309,7 +325,7 @@ typedef uintmax_t uatomic_max_t; #define atomic_bit_set(mem, bit) \ (void) ({ unsigned int __mask = 1 << (bit); \ - if (sizeof (*mem) == 1) \ + if (sizeof (*(mem)) == 1) \ __asm __volatile ("\ .align 2\n\ mova 1f,r0\n\ @@ -321,7 +337,7 @@ typedef uintmax_t uatomic_max_t; 1: mov r1,r15"\ : : "r" (mem), "r" (__mask) \ : "r0", "r1", "r2", "memory"); \ - else if (sizeof (*mem) == 2) \ + else if (sizeof (*(mem)) == 2) \ __asm __volatile ("\ .align 2\n\ mova 1f,r0\n\ @@ -333,7 +349,7 @@ typedef uintmax_t uatomic_max_t; 1: mov r1,r15"\ : : "r" (mem), "r" (__mask) \ : "r0", "r1", "r2", "memory"); \ - else if (sizeof (*mem) == 4) \ + else if (sizeof (*(mem)) == 4) \ __asm __volatile ("\ .align 2\n\ mova 1f,r0\n\ @@ -352,7 +368,7 @@ typedef uintmax_t uatomic_max_t; #define atomic_bit_test_set(mem, bit) \ ({ unsigned int __mask = 1 << (bit); \ unsigned int __result = __mask; \ - if (sizeof (*mem) == 1) \ + if (sizeof (*(mem)) == 1) \ __asm __volatile ("\ .align 2\n\ mova 1f,r0\n\ @@ -367,7 +383,7 @@ typedef uintmax_t uatomic_max_t; : "=&r" (__result), "=&r" (__mask) \ : "r" (mem), "0" (__result), "1" (__mask) \ : "r0", "r1", "r2", "memory"); \ - else if (sizeof (*mem) == 2) \ + else if (sizeof (*(mem)) == 2) \ __asm __volatile ("\ .align 2\n\ mova 1f,r0\n\ @@ -382,7 +398,7 @@ typedef uintmax_t uatomic_max_t; : "=&r" (__result), "=&r" (__mask) \ : "r" (mem), "0" (__result), "1" (__mask) \ : "r0", "r1", "r2", "memory"); \ - else if (sizeof (*mem) == 4) \ + else if (sizeof (*(mem)) == 4) \ __asm __volatile ("\ .align 2\n\ mova 1f,r0\n\
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |