1ee43a844SPaul Mundt #ifndef __ASM_SH_CMPXCHG_LLSC_H 2ee43a844SPaul Mundt #define __ASM_SH_CMPXCHG_LLSC_H 3ee43a844SPaul Mundt 4ee43a844SPaul Mundt static inline unsigned long xchg_u32(volatile u32 *m, unsigned long val) 5ee43a844SPaul Mundt { 6ee43a844SPaul Mundt unsigned long retval; 7ee43a844SPaul Mundt unsigned long tmp; 8ee43a844SPaul Mundt 9ee43a844SPaul Mundt __asm__ __volatile__ ( 10ee43a844SPaul Mundt "1: \n\t" 1142990701SMatt Fleming "movli.l @%2, %0 ! xchg_u32 \n\t" 1242990701SMatt Fleming "mov %0, %1 \n\t" 1342990701SMatt Fleming "mov %3, %0 \n\t" 1442990701SMatt Fleming "movco.l %0, @%2 \n\t" 15ee43a844SPaul Mundt "bf 1b \n\t" 16ee43a844SPaul Mundt "synco \n\t" 1742990701SMatt Fleming : "=&z"(tmp), "=&r" (retval) 1842990701SMatt Fleming : "r" (m), "r" (val) 19ee43a844SPaul Mundt : "t", "memory" 20ee43a844SPaul Mundt ); 21ee43a844SPaul Mundt 22ee43a844SPaul Mundt return retval; 23ee43a844SPaul Mundt } 24ee43a844SPaul Mundt 25ee43a844SPaul Mundt static inline unsigned long xchg_u8(volatile u8 *m, unsigned long val) 26ee43a844SPaul Mundt { 27ee43a844SPaul Mundt unsigned long retval; 28ee43a844SPaul Mundt unsigned long tmp; 29ee43a844SPaul Mundt 30ee43a844SPaul Mundt __asm__ __volatile__ ( 31ee43a844SPaul Mundt "1: \n\t" 3242990701SMatt Fleming "movli.l @%2, %0 ! xchg_u8 \n\t" 3342990701SMatt Fleming "mov %0, %1 \n\t" 3442990701SMatt Fleming "mov %3, %0 \n\t" 3542990701SMatt Fleming "movco.l %0, @%2 \n\t" 36ee43a844SPaul Mundt "bf 1b \n\t" 37ee43a844SPaul Mundt "synco \n\t" 3842990701SMatt Fleming : "=&z"(tmp), "=&r" (retval) 3942990701SMatt Fleming : "r" (m), "r" (val & 0xff) 40ee43a844SPaul Mundt : "t", "memory" 41ee43a844SPaul Mundt ); 42ee43a844SPaul Mundt 43ee43a844SPaul Mundt return retval; 44ee43a844SPaul Mundt } 45ee43a844SPaul Mundt 46ee43a844SPaul Mundt static inline unsigned long 47ee43a844SPaul Mundt __cmpxchg_u32(volatile int *m, unsigned long old, unsigned long new) 48ee43a844SPaul Mundt { 49ee43a844SPaul Mundt unsigned long retval; 50ee43a844SPaul Mundt unsigned long tmp; 51ee43a844SPaul Mundt 52ee43a844SPaul Mundt __asm__ __volatile__ ( 53ee43a844SPaul Mundt "1: \n\t" 5442990701SMatt Fleming "movli.l @%2, %0 ! __cmpxchg_u32 \n\t" 5542990701SMatt Fleming "mov %0, %1 \n\t" 5642990701SMatt Fleming "cmp/eq %1, %3 \n\t" 57ee43a844SPaul Mundt "bf 2f \n\t" 5842990701SMatt Fleming "mov %3, %0 \n\t" 59ee43a844SPaul Mundt "2: \n\t" 6042990701SMatt Fleming "movco.l %0, @%2 \n\t" 61ee43a844SPaul Mundt "bf 1b \n\t" 62ee43a844SPaul Mundt "synco \n\t" 6342990701SMatt Fleming : "=&z" (tmp), "=&r" (retval) 6442990701SMatt Fleming : "r" (m), "r" (old), "r" (new) 65ee43a844SPaul Mundt : "t", "memory" 66ee43a844SPaul Mundt ); 67ee43a844SPaul Mundt 68ee43a844SPaul Mundt return retval; 69ee43a844SPaul Mundt } 70ee43a844SPaul Mundt 71ee43a844SPaul Mundt #endif /* __ASM_SH_CMPXCHG_LLSC_H */ 72