[S390] Inline assembly cleanup.
[sfrench/cifs-2.6.git] / include / asm-s390 / spinlock.h
index 273dbecf8acef0465060133bbac01bab72118fc5..ce3edf6d63b3bdf4bac03a982d00151577843d4c 100644 (file)
 #ifndef __ASM_SPINLOCK_H
 #define __ASM_SPINLOCK_H
 
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2)
+
+static inline int
+_raw_compare_and_swap(volatile unsigned int *lock,
+                     unsigned int old, unsigned int new)
+{
+       asm volatile(
+               "       cs      %0,%3,%1"
+               : "=d" (old), "=Q" (*lock)
+               : "0" (old), "d" (new), "Q" (*lock)
+               : "cc", "memory" );
+       return old;
+}
+
+#else /* __GNUC__ */
+
 static inline int
 _raw_compare_and_swap(volatile unsigned int *lock,
                      unsigned int old, unsigned int new)
 {
-       asm volatile ("cs %0,%3,0(%4)"
-                     : "=d" (old), "=m" (*lock)
-                     : "0" (old), "d" (new), "a" (lock), "m" (*lock)
-                     : "cc", "memory" );
+       asm volatile(
+               "       cs      %0,%3,0(%4)"
+               : "=d" (old), "=m" (*lock)
+               : "0" (old), "d" (new), "a" (lock), "m" (*lock)
+               : "cc", "memory" );
        return old;
 }
 
+#endif /* __GNUC__ */
+
 /*
  * Simple spin lock operations.  There are two variants, one clears IRQ's
  * on the local processor, one does not.