powerpc: Tell gcc when we clobber the carry in inline asm
authorPaul Mackerras <paulus@samba.org>
Wed, 5 Nov 2008 18:39:27 +0000 (18:39 +0000)
committerPaul Mackerras <paulus@samba.org>
Wed, 19 Nov 2008 05:04:28 +0000 (16:04 +1100)
We have several instances of inline assembly code that use the addic
or addic. instructions, but don't include XER in the list of clobbers.
The addic and addic. instructions affect the carry bit, which is in
the XER register.

This adds "xer" to the list of clobbers for those inline asm
statements that use addic or addic. and didn't already have it.

Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/include/asm/atomic.h
arch/powerpc/include/asm/local.h
arch/powerpc/include/asm/spinlock.h

index f3fc733758f5ccfeb27e1e3e51df7d4039608cbb..499be5bdd6fae52bd0f8894fa62e1553eb237912 100644 (file)
@@ -111,7 +111,7 @@ static __inline__ void atomic_inc(atomic_t *v)
        bne-    1b"
        : "=&r" (t), "+m" (v->counter)
        : "r" (&v->counter)
-       : "cc");
+       : "cc", "xer");
 }
 
 static __inline__ int atomic_inc_return(atomic_t *v)
@@ -128,7 +128,7 @@ static __inline__ int atomic_inc_return(atomic_t *v)
        ISYNC_ON_SMP
        : "=&r" (t)
        : "r" (&v->counter)
-       : "cc", "memory");
+       : "cc", "xer", "memory");
 
        return t;
 }
@@ -155,7 +155,7 @@ static __inline__ void atomic_dec(atomic_t *v)
        bne-    1b"
        : "=&r" (t), "+m" (v->counter)
        : "r" (&v->counter)
-       : "cc");
+       : "cc", "xer");
 }
 
 static __inline__ int atomic_dec_return(atomic_t *v)
@@ -172,7 +172,7 @@ static __inline__ int atomic_dec_return(atomic_t *v)
        ISYNC_ON_SMP
        : "=&r" (t)
        : "r" (&v->counter)
-       : "cc", "memory");
+       : "cc", "xer", "memory");
 
        return t;
 }
@@ -346,7 +346,7 @@ static __inline__ void atomic64_inc(atomic64_t *v)
        bne-    1b"
        : "=&r" (t), "+m" (v->counter)
        : "r" (&v->counter)
-       : "cc");
+       : "cc", "xer");
 }
 
 static __inline__ long atomic64_inc_return(atomic64_t *v)
@@ -362,7 +362,7 @@ static __inline__ long atomic64_inc_return(atomic64_t *v)
        ISYNC_ON_SMP
        : "=&r" (t)
        : "r" (&v->counter)
-       : "cc", "memory");
+       : "cc", "xer", "memory");
 
        return t;
 }
@@ -388,7 +388,7 @@ static __inline__ void atomic64_dec(atomic64_t *v)
        bne-    1b"
        : "=&r" (t), "+m" (v->counter)
        : "r" (&v->counter)
-       : "cc");
+       : "cc", "xer");
 }
 
 static __inline__ long atomic64_dec_return(atomic64_t *v)
@@ -404,7 +404,7 @@ static __inline__ long atomic64_dec_return(atomic64_t *v)
        ISYNC_ON_SMP
        : "=&r" (t)
        : "r" (&v->counter)
-       : "cc", "memory");
+       : "cc", "xer", "memory");
 
        return t;
 }
@@ -431,7 +431,7 @@ static __inline__ long atomic64_dec_if_positive(atomic64_t *v)
        "\n\
 2:"    : "=&r" (t)
        : "r" (&v->counter)
-       : "cc", "memory");
+       : "cc", "xer", "memory");
 
        return t;
 }
index 612d8327665351c43b39dcd41e5323178ecc6f60..84b457a3c1bcda476a0c475d2bddf594a134e9bc 100644 (file)
@@ -67,7 +67,7 @@ static __inline__ long local_inc_return(local_t *l)
        bne-    1b"
        : "=&r" (t)
        : "r" (&(l->a.counter))
-       : "cc", "memory");
+       : "cc", "xer", "memory");
 
        return t;
 }
@@ -94,7 +94,7 @@ static __inline__ long local_dec_return(local_t *l)
        bne-    1b"
        : "=&r" (t)
        : "r" (&(l->a.counter))
-       : "cc", "memory");
+       : "cc", "xer", "memory");
 
        return t;
 }
index f56a843f47058fa238ec86f844786d3b4cbe9499..36864364e601cb22b6221fb824929973a2b2e688 100644 (file)
@@ -277,7 +277,7 @@ static inline void __raw_read_unlock(raw_rwlock_t *rw)
        bne-            1b"
        : "=&r"(tmp)
        : "r"(&rw->lock)
-       : "cr0", "memory");
+       : "cr0", "xer", "memory");
 }
 
 static inline void __raw_write_unlock(raw_rwlock_t *rw)