From: Andrew Haley <aph@redhat.com>
To: kernel mailz <kernelmailz@googlemail.com>
Cc: gcc-help@gcc.gnu.org, linuxppc-dev@ozlabs.org,
Ian Lance Taylor <iant@google.com>
Subject: Re: Inline Assembly queries
Date: Tue, 30 Jun 2009 10:30:53 +0100 [thread overview]
Message-ID: <4A49DB4D.5060304@redhat.com> (raw)
In-Reply-To: <abe8a1fd0906292253ye4595c9wb0c085b7d89aea7@mail.gmail.com>
kernel mailz wrote:
> Consider atomic_add and atomic_add_return in kernel code.
>
> On Tue, Jun 30, 2009 at 2:59 AM, Ian Lance Taylor<iant@google.com> wrote:
>> kernel mailz <kernelmailz@googlemail.com> writes:
>>
>>> I tried a small example
>>>
>>> int *p = 0x1000;
>>> int a = *p;
>>> asm("sync":::"memory");
>>> a = *p;
>>>
>>> and
>>>
>>> volatile int *p = 0x1000;
>>> int a = *p;
>>> asm("sync");
>>> a = *p
>>>
>>> Got the same assembly.
>>> Which is right.
>>>
>>> So does it mean, if proper use of volatile is done, there is no need
>>> of "memory" ?
>> You have to consider the effects of inlining, which may bring in other
>> memory loads and stores through non-volatile pointers.
> Consider
>
> static __inline__ void atomic_add(int a, atomic_t *v)
> {
> int t;
>
> __asm__ __volatile__(
> "1: lwarx %0,0,%3 # atomic_add\n\
> add %0,%2,%0\n"
> PPC405_ERR77(0,%3)
> " stwcx. %0,0,%3 \n\
> bne- 1b"
> : "=&r" (t), "+m" (v->counter)
> : "r" (a), "r" (&v->counter)
> : "cc");
> }
>
> static __inline__ int atomic_add_return(int a, atomic_t *v)
> {
> int t;
>
> __asm__ __volatile__(
> LWSYNC_ON_SMP
> "1: lwarx %0,0,%2 # atomic_add_return\n\
> add %0,%1,%0\n"
> PPC405_ERR77(0,%2)
> " stwcx. %0,0,%2 \n\
> bne- 1b"
> ISYNC_ON_SMP
> : "=&r" (t)
> : "r" (a), "r" (&v->counter)
> : "cc", "memory");
>
> return t;
> }
>
> I am not able to figure out why "memory" is added in latter
The latter, as well as its stated purpose, forms a memory barrier, so the
compiler must be prevented from moving memory access across it. See
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2745.html
Andrew.
next prev parent reply other threads:[~2009-06-30 9:31 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-06-27 19:46 Inline Assembly queries kernel mailz
[not found] ` <abe8a1fd0906271249k479e5a87gfe1ee9c02798a234@mail.gmail.com>
[not found] ` <m3ab3t4623.fsf@google.com>
2009-06-28 4:57 ` kernel mailz
2009-06-29 15:49 ` kernel mailz
2009-06-29 19:27 ` Scott Wood
2009-06-30 5:27 ` kernel mailz
2009-06-30 10:41 ` Benjamin Herrenschmidt
2009-06-29 21:29 ` Ian Lance Taylor
2009-06-30 5:53 ` kernel mailz
2009-06-30 9:30 ` Andrew Haley [this message]
2009-06-30 9:52 ` Paul Mackerras
2009-06-29 15:57 ` David Howells
2009-06-29 21:27 ` Ian Lance Taylor
2009-06-30 10:43 ` Benjamin Herrenschmidt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4A49DB4D.5060304@redhat.com \
--to=aph@redhat.com \
--cc=gcc-help@gcc.gnu.org \
--cc=iant@google.com \
--cc=kernelmailz@googlemail.com \
--cc=linuxppc-dev@ozlabs.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).