11efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy#ifndef __ASM_SH_CMPXCHG_GRB_H
21efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy#define __ASM_SH_CMPXCHG_GRB_H
31efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy
41efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefystatic inline unsigned long xchg_u32(volatile u32 *m, unsigned long val)
51efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy{
61efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy	unsigned long retval;
71efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy
81efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy	__asm__ __volatile__ (
91efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"   .align 2              \n\t"
101efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"   mova    1f,   r0      \n\t" /* r0 = end point */
111efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"   nop                   \n\t"
121efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"   mov    r15,   r1      \n\t" /* r1 = saved sp */
131efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"   mov    #-4,   r15     \n\t" /* LOGIN */
141efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"   mov.l  @%1,   %0      \n\t" /* load  old value */
151efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"   mov.l   %2,   @%1     \n\t" /* store new value */
161efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"1: mov     r1,   r15     \n\t" /* LOGOUT */
171efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		: "=&r" (retval),
185bdbd4fa4df6891a6644d588c9a30d30e7c0af8eSrinivas KANDAGATLA		  "+r"  (m),
195bdbd4fa4df6891a6644d588c9a30d30e7c0af8eSrinivas KANDAGATLA		  "+r"  (val)		/* inhibit r15 overloading */
205bdbd4fa4df6891a6644d588c9a30d30e7c0af8eSrinivas KANDAGATLA		:
211efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		: "memory", "r0", "r1");
221efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy
231efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy	return retval;
241efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy}
251efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy
261efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefystatic inline unsigned long xchg_u8(volatile u8 *m, unsigned long val)
271efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy{
281efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy	unsigned long retval;
291efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy
301efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy	__asm__ __volatile__ (
311efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"   .align  2             \n\t"
321efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"   mova    1f,   r0      \n\t" /* r0 = end point */
331efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"   mov    r15,   r1      \n\t" /* r1 = saved sp */
341efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"   mov    #-6,   r15     \n\t" /* LOGIN */
351efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"   mov.b  @%1,   %0      \n\t" /* load  old value */
361efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"   extu.b  %0,   %0      \n\t" /* extend as unsigned */
371efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"   mov.b   %2,   @%1     \n\t" /* store new value */
381efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"1: mov     r1,   r15     \n\t" /* LOGOUT */
391efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		: "=&r" (retval),
405bdbd4fa4df6891a6644d588c9a30d30e7c0af8eSrinivas KANDAGATLA		  "+r"  (m),
415bdbd4fa4df6891a6644d588c9a30d30e7c0af8eSrinivas KANDAGATLA		  "+r"  (val)		/* inhibit r15 overloading */
425bdbd4fa4df6891a6644d588c9a30d30e7c0af8eSrinivas KANDAGATLA		:
431efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		: "memory" , "r0", "r1");
441efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy
451efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy	return retval;
461efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy}
471efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy
481efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefystatic inline unsigned long __cmpxchg_u32(volatile int *m, unsigned long old,
491efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy					  unsigned long new)
501efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy{
511efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy	unsigned long retval;
521efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy
531efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy	__asm__ __volatile__ (
541efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"   .align  2             \n\t"
551efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"   mova    1f,   r0      \n\t" /* r0 = end point */
561efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"   nop                   \n\t"
571efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"   mov    r15,   r1      \n\t" /* r1 = saved sp */
581efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"   mov    #-8,   r15     \n\t" /* LOGIN */
595bdbd4fa4df6891a6644d588c9a30d30e7c0af8eSrinivas KANDAGATLA		"   mov.l  @%3,   %0      \n\t" /* load  old value */
605bdbd4fa4df6891a6644d588c9a30d30e7c0af8eSrinivas KANDAGATLA		"   cmp/eq  %0,   %1      \n\t"
611efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"   bf            1f      \n\t" /* if not equal */
625bdbd4fa4df6891a6644d588c9a30d30e7c0af8eSrinivas KANDAGATLA		"   mov.l   %2,   @%3     \n\t" /* store new value */
631efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		"1: mov     r1,   r15     \n\t" /* LOGOUT */
645bdbd4fa4df6891a6644d588c9a30d30e7c0af8eSrinivas KANDAGATLA		: "=&r" (retval),
655bdbd4fa4df6891a6644d588c9a30d30e7c0af8eSrinivas KANDAGATLA		  "+r"  (old), "+r"  (new) /* old or new can be r15 */
665bdbd4fa4df6891a6644d588c9a30d30e7c0af8eSrinivas KANDAGATLA		:  "r"  (m)
671efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy		: "memory" , "r0", "r1", "t");
681efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy
691efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy	return retval;
701efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy}
711efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy
721efe4ce3ca126da77e450d5a83f7201949d76f62Stuart Menefy#endif /* __ASM_SH_CMPXCHG_GRB_H */
73