Skip to content

Commit

Permalink
[POWERPC] Implement atomic{, 64}_{read, write}() without volatile
Browse files Browse the repository at this point in the history
Instead, use asm() like all other atomic operations already do.

Also use inline functions instead of macros; this actually
improves code generation (some code becomes a little smaller,
probably because of improved alias information -- just a few
hundred bytes total on a default kernel build, nothing shocking).

Signed-off-by: Segher Boessenkool <[email protected]>
Signed-off-by: Paul Mackerras <[email protected]>
  • Loading branch information
segher authored and paulusmack committed Aug 17, 2007
1 parent c6d4267 commit 9f0cbea
Showing 1 changed file with 28 additions and 6 deletions.
34 changes: 28 additions & 6 deletions include/asm-powerpc/atomic.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* PowerPC atomic operations
*/

typedef struct { volatile int counter; } atomic_t;
typedef struct { int counter; } atomic_t;

#ifdef __KERNEL__
#include <linux/compiler.h>
Expand All @@ -15,8 +15,19 @@ typedef struct { volatile int counter; } atomic_t;

#define ATOMIC_INIT(i) { (i) }

#define atomic_read(v) ((v)->counter)
#define atomic_set(v,i) (((v)->counter) = (i))
static __inline__ int atomic_read(const atomic_t *v)
{
int t;

__asm__ __volatile__("lwz%U1%X1 %0,%1" : "=r"(t) : "m"(v->counter));

return t;
}

static __inline__ void atomic_set(atomic_t *v, int i)
{
__asm__ __volatile__("stw%U0%X0 %1,%0" : "=m"(v->counter) : "r"(i));
}

static __inline__ void atomic_add(int a, atomic_t *v)
{
Expand Down Expand Up @@ -240,12 +251,23 @@ static __inline__ int atomic_dec_if_positive(atomic_t *v)

#ifdef __powerpc64__

typedef struct { volatile long counter; } atomic64_t;
typedef struct { long counter; } atomic64_t;

#define ATOMIC64_INIT(i) { (i) }

#define atomic64_read(v) ((v)->counter)
#define atomic64_set(v,i) (((v)->counter) = (i))
static __inline__ long atomic64_read(const atomic64_t *v)
{
long t;

__asm__ __volatile__("ld%U1%X1 %0,%1" : "=r"(t) : "m"(v->counter));

return t;
}

static __inline__ void atomic64_set(atomic64_t *v, long i)
{
__asm__ __volatile__("std%U0%X0 %1,%0" : "=m"(v->counter) : "r"(i));
}

static __inline__ void atomic64_add(long a, atomic64_t *v)
{
Expand Down

0 comments on commit 9f0cbea

Please sign in to comment.