| Paul Mundt | ee43a84 | 2008-08-07 18:01:43 +0900 | [diff] [blame] | 1 | #ifndef __ASM_SH_CMPXCHG_LLSC_H | 
|  | 2 | #define __ASM_SH_CMPXCHG_LLSC_H | 
|  | 3 |  | 
|  | 4 | static inline unsigned long xchg_u32(volatile u32 *m, unsigned long val) | 
|  | 5 | { | 
|  | 6 | unsigned long retval; | 
|  | 7 | unsigned long tmp; | 
|  | 8 |  | 
|  | 9 | __asm__ __volatile__ ( | 
|  | 10 | "1:					\n\t" | 
|  | 11 | "movli.l	@%1, %0	! xchg_u32	\n\t" | 
|  | 12 | "mov		%0, %2			\n\t" | 
|  | 13 | "mov		%4, %0			\n\t" | 
|  | 14 | "movco.l	%0, @%1			\n\t" | 
|  | 15 | "bf		1b			\n\t" | 
|  | 16 | "synco					\n\t" | 
|  | 17 | : "=&z"(tmp), "=r" (m), "=&r" (retval) | 
|  | 18 | : "1" (m), "r" (val) | 
|  | 19 | : "t", "memory" | 
|  | 20 | ); | 
|  | 21 |  | 
|  | 22 | return retval; | 
|  | 23 | } | 
|  | 24 |  | 
|  | 25 | static inline unsigned long xchg_u8(volatile u8 *m, unsigned long val) | 
|  | 26 | { | 
|  | 27 | unsigned long retval; | 
|  | 28 | unsigned long tmp; | 
|  | 29 |  | 
|  | 30 | __asm__ __volatile__ ( | 
|  | 31 | "1:					\n\t" | 
|  | 32 | "movli.l	@%1, %0	! xchg_u8	\n\t" | 
|  | 33 | "mov		%0, %2			\n\t" | 
|  | 34 | "mov		%4, %0			\n\t" | 
|  | 35 | "movco.l	%0, @%1			\n\t" | 
|  | 36 | "bf		1b			\n\t" | 
|  | 37 | "synco					\n\t" | 
|  | 38 | : "=&z"(tmp), "=r" (m), "=&r" (retval) | 
|  | 39 | : "1" (m), "r" (val & 0xff) | 
|  | 40 | : "t", "memory" | 
|  | 41 | ); | 
|  | 42 |  | 
|  | 43 | return retval; | 
|  | 44 | } | 
|  | 45 |  | 
|  | 46 | static inline unsigned long | 
|  | 47 | __cmpxchg_u32(volatile int *m, unsigned long old, unsigned long new) | 
|  | 48 | { | 
|  | 49 | unsigned long retval; | 
|  | 50 | unsigned long tmp; | 
|  | 51 |  | 
|  | 52 | __asm__ __volatile__ ( | 
|  | 53 | "1:						\n\t" | 
|  | 54 | "movli.l	@%1, %0	! __cmpxchg_u32		\n\t" | 
|  | 55 | "mov		%0, %2				\n\t" | 
|  | 56 | "cmp/eq		%2, %4				\n\t" | 
|  | 57 | "bf		2f				\n\t" | 
|  | 58 | "mov		%5, %0				\n\t" | 
|  | 59 | "2:						\n\t" | 
|  | 60 | "movco.l	%0, @%1				\n\t" | 
|  | 61 | "bf		1b				\n\t" | 
|  | 62 | "synco						\n\t" | 
|  | 63 | : "=&z" (tmp), "=r" (m), "=&r" (retval) | 
|  | 64 | : "1" (m), "r" (old), "r" (new) | 
|  | 65 | : "t", "memory" | 
|  | 66 | ); | 
|  | 67 |  | 
|  | 68 | return retval; | 
|  | 69 | } | 
|  | 70 |  | 
|  | 71 | #endif /* __ASM_SH_CMPXCHG_LLSC_H */ |