sh: support 1 and 2 byte xchg
[cascardo/linux.git] / arch / sh / include / asm / cmpxchg-grb.h
index f848dec..2ed557b 100644 (file)
@@ -23,6 +23,28 @@ static inline unsigned long xchg_u32(volatile u32 *m, unsigned long val)
        return retval;
 }
 
+static inline unsigned long xchg_u16(volatile u16 *m, unsigned long val)
+{
+       unsigned long retval;
+
+       __asm__ __volatile__ (
+               "   .align  2             \n\t"
+               "   mova    1f,   r0      \n\t" /* r0 = end point */
+               "   mov    r15,   r1      \n\t" /* r1 = saved sp */
+               "   mov    #-6,   r15     \n\t" /* LOGIN */
+               "   mov.w  @%1,   %0      \n\t" /* load  old value */
+               "   extu.w  %0,   %0      \n\t" /* extend as unsigned */
+               "   mov.w   %2,   @%1     \n\t" /* store new value */
+               "1: mov     r1,   r15     \n\t" /* LOGOUT */
+               : "=&r" (retval),
+                 "+r"  (m),
+                 "+r"  (val)           /* inhibit r15 overloading */
+               :
+               : "memory" , "r0", "r1");
+
+       return retval;
+}
+
 static inline unsigned long xchg_u8(volatile u8 *m, unsigned long val)
 {
        unsigned long retval;