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