Fix gUSA sequence in SH atomic functions in

sysdeps/unix/sysv/linux/sh/bits/atomic.h.
This commit is contained in:
Kaz Kojima 2012-06-23 07:29:05 +09:00
parent 0479b305c5
commit d230f50a06
2 changed files with 107 additions and 93 deletions

View File

@ -1,3 +1,16 @@
2012-06-22 Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
Kaz Kojima <kkojima@rr.iij4u.or.jp>
* sysdeps/unix/sysv/linux/sh/bits/atomic.h
(__arch_compare_and_exchange_val_8_acq): Remove explicit nop.
(__arch_compare_and_exchange_val_16_acq): Likewise.
(__arch_compare_and_exchange_val_32_acq): Likewise.
(atomic_exchange_and_add): Fix gUSA sequence.
(atomic_add): Likewise.
(atomic_add_negative): Likewise.
(atomic_add_zero): Likewise.
(atomic_bit_test_set): Likewise.
2012-06-22 Andreas Schwab <schwab@redhat.com>
[BZ #13579]

View File

@ -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
@ -73,11 +73,10 @@ typedef uintmax_t uatomic_max_t;
#define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \
({ __typeof (*(mem)) __result; \
__asm __volatile ("\
.align 2\n\
mova 1f,r0\n\
nop\n\
.align 2\n\
mov r15,r1\n\
mov #-8,r15\n\
mov #(0f-1f),r15\n\
0: mov.b @%1,%0\n\
cmp/eq %0,%3\n\
bf 1f\n\
@ -90,10 +89,10 @@ typedef uintmax_t uatomic_max_t;
#define __arch_compare_and_exchange_val_16_acq(mem, newval, oldval) \
({ __typeof (*(mem)) __result; \
__asm __volatile ("\
.align 2\n\
mova 1f,r0\n\
nop\n\
mov r15,r1\n\
.align 2\n\
mov #(0f-1f),r15\n\
mov #-8,r15\n\
0: mov.w @%1,%0\n\
cmp/eq %0,%3\n\
@ -107,11 +106,10 @@ typedef uintmax_t uatomic_max_t;
#define __arch_compare_and_exchange_val_32_acq(mem, newval, oldval) \
({ __typeof (*(mem)) __result; \
__asm __volatile ("\
.align 2\n\
mova 1f,r0\n\
nop\n\
.align 2\n\
mov r15,r1\n\
mov #-8,r15\n\
mov #(0f-1f),r15\n\
0: mov.l @%1,%0\n\
cmp/eq %0,%3\n\
bf 1f\n\
@ -133,40 +131,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); \
@ -182,37 +183,37 @@ typedef uintmax_t uatomic_max_t;
(void) ({ __typeof (*(mem)) __tmp, __value = (value); \
if (sizeof (*(mem)) == 1) \
__asm __volatile ("\
.align 2\n\
mova 1f,r0\n\
mov r15,r1\n\
mov #-6,r15\n\
.align 2\n\
mov #(0f-1f),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"); \
else if (sizeof (*(mem)) == 2) \
__asm __volatile ("\
.align 2\n\
mova 1f,r0\n\
mov r15,r1\n\
mov #-6,r15\n\
.align 2\n\
mov #(0f-1f),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"); \
else if (sizeof (*(mem)) == 4) \
__asm __volatile ("\
.align 2\n\
mova 1f,r0\n\
mov r15,r1\n\
mov #-6,r15\n\
.align 2\n\
mov #(0f-1f),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"); \
@ -233,43 +234,43 @@ typedef uintmax_t uatomic_max_t;
__typeof (*(mem)) __tmp, __value = (value); \
if (sizeof (*(mem)) == 1) \
__asm __volatile ("\
.align 2\n\
mova 1f,r0\n\
mov r15,r1\n\
mov #-6,r15\n\
.align 2\n\
mov #(0f-1f),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"); \
else if (sizeof (*(mem)) == 2) \
__asm __volatile ("\
.align 2\n\
mova 1f,r0\n\
mov r15,r1\n\
mov #-6,r15\n\
.align 2\n\
mov #(0f-1f),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"); \
else if (sizeof (*(mem)) == 4) \
__asm __volatile ("\
.align 2\n\
mova 1f,r0\n\
mov r15,r1\n\
mov #-6,r15\n\
.align 2\n\
mov #(0f-1f),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"); \
@ -282,43 +283,43 @@ typedef uintmax_t uatomic_max_t;
__typeof (*(mem)) __tmp, __value = (value); \
if (sizeof (*(mem)) == 1) \
__asm __volatile ("\
.align 2\n\
mova 1f,r0\n\
mov r15,r1\n\
mov #-6,r15\n\
.align 2\n\
mov #(0f-1f),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"); \
else if (sizeof (*(mem)) == 2) \
__asm __volatile ("\
.align 2\n\
mova 1f,r0\n\
mov r15,r1\n\
mov #-6,r15\n\
.align 2\n\
mov #(0f-1f),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"); \
else if (sizeof (*(mem)) == 4) \
__asm __volatile ("\
.align 2\n\
mova 1f,r0\n\
mov r15,r1\n\
mov #-6,r15\n\
.align 2\n\
mov #(0f-1f),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"); \
@ -333,10 +334,10 @@ typedef uintmax_t uatomic_max_t;
(void) ({ unsigned int __mask = 1 << (bit); \
if (sizeof (*(mem)) == 1) \
__asm __volatile ("\
.align 2\n\
mova 1f,r0\n\
mov r15,r1\n\
mov #-6,r15\n\
.align 2\n\
mov #(0f-1f),r15\n\
0: mov.b @%0,r2\n\
or %1,r2\n\
mov.b r2,@%0\n\
@ -345,10 +346,10 @@ typedef uintmax_t uatomic_max_t;
: "r0", "r1", "r2", "memory"); \
else if (sizeof (*(mem)) == 2) \
__asm __volatile ("\
.align 2\n\
mova 1f,r0\n\
mov r15,r1\n\
mov #-6,r15\n\
.align 2\n\
mov #(0f-1f),r15\n\
0: mov.w @%0,r2\n\
or %1,r2\n\
mov.w r2,@%0\n\
@ -357,10 +358,10 @@ typedef uintmax_t uatomic_max_t;
: "r0", "r1", "r2", "memory"); \
else if (sizeof (*(mem)) == 4) \
__asm __volatile ("\
.align 2\n\
mova 1f,r0\n\
mov r15,r1\n\
mov #-6,r15\n\
.align 2\n\
mov #(0f-1f),r15\n\
0: mov.l @%0,r2\n\
or %1,r2\n\
mov.l r2,@%0\n\
@ -376,49 +377,49 @@ typedef uintmax_t uatomic_max_t;
unsigned int __result = __mask; \
if (sizeof (*(mem)) == 1) \
__asm __volatile ("\
.align 2\n\
mova 1f,r0\n\
nop\n\
.align 2\n\
mov r15,r1\n\
mov #-8,r15\n\
mov #(0f-1f),r15\n\
0: mov.b @%2,r2\n\
or r2,%1\n\
and r2,%0\n\
mov.b %1,@%2\n\
1: mov r1,r15"\
mov r2,r3\n\
or %1,r2\n\
mov.b r2,@%2\n\
1: mov r1,r15\n\
and r3,%0"\
: "=&r" (__result), "=&r" (__mask) \
: rNOSP (mem), "0" (__result), "1" (__mask) \
: "r0", "r1", "r2", "memory"); \
: "r0", "r1", "r2", "r3", "memory"); \
else if (sizeof (*(mem)) == 2) \
__asm __volatile ("\
.align 2\n\
mova 1f,r0\n\
nop\n\
.align 2\n\
mov r15,r1\n\
mov #-8,r15\n\
mov #(0f-1f),r15\n\
0: mov.w @%2,r2\n\
or r2,%1\n\
and r2,%0\n\
mov r2,r3\n\
or %1,r2\n\
mov.w %1,@%2\n\
1: mov r1,r15"\
1: mov r1,r15\n\
and r3,%0"\
: "=&r" (__result), "=&r" (__mask) \
: rNOSP (mem), "0" (__result), "1" (__mask) \
: "r0", "r1", "r2", "memory"); \
: "r0", "r1", "r2", "r3", "memory"); \
else if (sizeof (*(mem)) == 4) \
__asm __volatile ("\
.align 2\n\
mova 1f,r0\n\
nop\n\
.align 2\n\
mov r15,r1\n\
mov #-8,r15\n\
mov #(0f-1f),r15\n\
0: mov.l @%2,r2\n\
mov r2,r3\n\
or r2,%1\n\
and r2,%0\n\
mov.l %1,@%2\n\
1: mov r1,r15"\
1: mov r1,r15\n\
and r3,%0"\
: "=&r" (__result), "=&r" (__mask) \
: rNOSP (mem), "0" (__result), "1" (__mask) \
: "r0", "r1", "r2", "memory"); \
: "r0", "r1", "r2", "r3", "memory"); \
else \
abort (); \
__result; })