diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2006-09-28 10:56:43 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2006-09-28 10:56:43 -0400 |
commit | 94c12cc7d196bab34aaa98d38521549fa1e5ef76 (patch) | |
tree | 8e0cec0ed44445d74a2cb5160303d6b4dfb1bc31 /include/asm-s390/spinlock.h | |
parent | 25d83cbfaa44e1b9170c0941c3ef52ca39f54ccc (diff) |
[S390] Inline assembly cleanup.
Major cleanup of all s390 inline assemblies. They now have a common
coding style. Quite a few have been shortened, mainly by using register
asm variables. Use of the EX_TABLE macro helps as well. The atomic ops,
bit ops and locking inlines new use the Q-constraint if a newer gcc
is used. That results in slightly better code.
Thanks to Christian Borntraeger for proof reading the changes.
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'include/asm-s390/spinlock.h')
-rw-r--r-- | include/asm-s390/spinlock.h | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/include/asm-s390/spinlock.h b/include/asm-s390/spinlock.h index 273dbecf8ace..ce3edf6d63b3 100644 --- a/include/asm-s390/spinlock.h +++ b/include/asm-s390/spinlock.h | |||
@@ -11,17 +11,36 @@ | |||
11 | #ifndef __ASM_SPINLOCK_H | 11 | #ifndef __ASM_SPINLOCK_H |
12 | #define __ASM_SPINLOCK_H | 12 | #define __ASM_SPINLOCK_H |
13 | 13 | ||
14 | #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2) | ||
15 | |||
16 | static inline int | ||
17 | _raw_compare_and_swap(volatile unsigned int *lock, | ||
18 | unsigned int old, unsigned int new) | ||
19 | { | ||
20 | asm volatile( | ||
21 | " cs %0,%3,%1" | ||
22 | : "=d" (old), "=Q" (*lock) | ||
23 | : "0" (old), "d" (new), "Q" (*lock) | ||
24 | : "cc", "memory" ); | ||
25 | return old; | ||
26 | } | ||
27 | |||
28 | #else /* __GNUC__ */ | ||
29 | |||
14 | static inline int | 30 | static inline int |
15 | _raw_compare_and_swap(volatile unsigned int *lock, | 31 | _raw_compare_and_swap(volatile unsigned int *lock, |
16 | unsigned int old, unsigned int new) | 32 | unsigned int old, unsigned int new) |
17 | { | 33 | { |
18 | asm volatile ("cs %0,%3,0(%4)" | 34 | asm volatile( |
19 | : "=d" (old), "=m" (*lock) | 35 | " cs %0,%3,0(%4)" |
20 | : "0" (old), "d" (new), "a" (lock), "m" (*lock) | 36 | : "=d" (old), "=m" (*lock) |
21 | : "cc", "memory" ); | 37 | : "0" (old), "d" (new), "a" (lock), "m" (*lock) |
38 | : "cc", "memory" ); | ||
22 | return old; | 39 | return old; |
23 | } | 40 | } |
24 | 41 | ||
42 | #endif /* __GNUC__ */ | ||
43 | |||
25 | /* | 44 | /* |
26 | * Simple spin lock operations. There are two variants, one clears IRQ's | 45 | * Simple spin lock operations. There are two variants, one clears IRQ's |
27 | * on the local processor, one does not. | 46 | * on the local processor, one does not. |