Path: blob/master/arch/sh/include/asm/bitops-grb.h
15125 views
#ifndef __ASM_SH_BITOPS_GRB_H1#define __ASM_SH_BITOPS_GRB_H23static inline void set_bit(int nr, volatile void * addr)4{5int mask;6volatile unsigned int *a = addr;7unsigned long tmp;89a += nr >> 5;10mask = 1 << (nr & 0x1f);1112__asm__ __volatile__ (13" .align 2 \n\t"14" mova 1f, r0 \n\t" /* r0 = end point */15" mov r15, r1 \n\t" /* r1 = saved sp */16" mov #-6, r15 \n\t" /* LOGIN: r15 = size */17" mov.l @%1, %0 \n\t" /* load old value */18" or %2, %0 \n\t" /* or */19" mov.l %0, @%1 \n\t" /* store new value */20"1: mov r1, r15 \n\t" /* LOGOUT */21: "=&r" (tmp),22"+r" (a)23: "r" (mask)24: "memory" , "r0", "r1");25}2627static inline void clear_bit(int nr, volatile void * addr)28{29int mask;30volatile unsigned int *a = addr;31unsigned long tmp;3233a += nr >> 5;34mask = ~(1 << (nr & 0x1f));35__asm__ __volatile__ (36" .align 2 \n\t"37" mova 1f, r0 \n\t" /* r0 = end point */38" mov r15, r1 \n\t" /* r1 = saved sp */39" mov #-6, r15 \n\t" /* LOGIN: r15 = size */40" mov.l @%1, %0 \n\t" /* load old value */41" and %2, %0 \n\t" /* and */42" mov.l %0, @%1 \n\t" /* store new value */43"1: mov r1, r15 \n\t" /* LOGOUT */44: "=&r" (tmp),45"+r" (a)46: "r" (mask)47: "memory" , "r0", "r1");48}4950static inline void change_bit(int nr, volatile void * addr)51{52int mask;53volatile unsigned int *a = addr;54unsigned long tmp;5556a += nr >> 5;57mask = 1 << (nr & 0x1f);58__asm__ __volatile__ (59" .align 2 \n\t"60" mova 1f, r0 \n\t" /* r0 = end point */61" mov r15, r1 \n\t" /* r1 = saved sp */62" mov #-6, r15 \n\t" /* LOGIN: r15 = size */63" mov.l @%1, %0 \n\t" /* load old value */64" xor %2, %0 \n\t" /* xor */65" mov.l %0, @%1 \n\t" /* store new value */66"1: mov r1, r15 \n\t" /* LOGOUT */67: "=&r" (tmp),68"+r" (a)69: "r" (mask)70: "memory" , "r0", "r1");71}7273static inline int test_and_set_bit(int nr, volatile void * addr)74{75int mask, retval;76volatile unsigned int *a = addr;77unsigned long tmp;7879a += nr >> 5;80mask = 1 << (nr & 0x1f);8182__asm__ __volatile__ (83" .align 2 \n\t"84" mova 1f, r0 \n\t" /* r0 = end point */85" mov r15, r1 \n\t" /* r1 = saved sp */86" mov #-14, r15 \n\t" /* LOGIN: r15 = size */87" mov.l @%2, %0 \n\t" /* load old value */88" mov %0, %1 \n\t"89" tst %1, %3 \n\t" /* T = ((*a & mask) == 0) */90" mov #-1, %1 \n\t" /* retvat = -1 */91" negc %1, %1 \n\t" /* retval = (mask & *a) != 0 */92" or %3, %0 \n\t"93" mov.l %0, @%2 \n\t" /* store new value */94"1: mov r1, r15 \n\t" /* LOGOUT */95: "=&r" (tmp),96"=&r" (retval),97"+r" (a)98: "r" (mask)99: "memory" , "r0", "r1" ,"t");100101return retval;102}103104static inline int test_and_clear_bit(int nr, volatile void * addr)105{106int mask, retval,not_mask;107volatile unsigned int *a = addr;108unsigned long tmp;109110a += nr >> 5;111mask = 1 << (nr & 0x1f);112113not_mask = ~mask;114115__asm__ __volatile__ (116" .align 2 \n\t"117" mova 1f, r0 \n\t" /* r0 = end point */118" mov r15, r1 \n\t" /* r1 = saved sp */119" mov #-14, r15 \n\t" /* LOGIN */120" mov.l @%2, %0 \n\t" /* load old value */121" mov %0, %1 \n\t" /* %1 = *a */122" tst %1, %3 \n\t" /* T = ((*a & mask) == 0) */123" mov #-1, %1 \n\t" /* retvat = -1 */124" negc %1, %1 \n\t" /* retval = (mask & *a) != 0 */125" and %4, %0 \n\t"126" mov.l %0, @%2 \n\t" /* store new value */127"1: mov r1, r15 \n\t" /* LOGOUT */128: "=&r" (tmp),129"=&r" (retval),130"+r" (a)131: "r" (mask),132"r" (not_mask)133: "memory" , "r0", "r1", "t");134135return retval;136}137138static inline int test_and_change_bit(int nr, volatile void * addr)139{140int mask, retval;141volatile unsigned int *a = addr;142unsigned long tmp;143144a += nr >> 5;145mask = 1 << (nr & 0x1f);146147__asm__ __volatile__ (148" .align 2 \n\t"149" mova 1f, r0 \n\t" /* r0 = end point */150" mov r15, r1 \n\t" /* r1 = saved sp */151" mov #-14, r15 \n\t" /* LOGIN */152" mov.l @%2, %0 \n\t" /* load old value */153" mov %0, %1 \n\t" /* %1 = *a */154" tst %1, %3 \n\t" /* T = ((*a & mask) == 0) */155" mov #-1, %1 \n\t" /* retvat = -1 */156" negc %1, %1 \n\t" /* retval = (mask & *a) != 0 */157" xor %3, %0 \n\t"158" mov.l %0, @%2 \n\t" /* store new value */159"1: mov r1, r15 \n\t" /* LOGOUT */160: "=&r" (tmp),161"=&r" (retval),162"+r" (a)163: "r" (mask)164: "memory" , "r0", "r1", "t");165166return retval;167}168169#include <asm-generic/bitops/non-atomic.h>170171#endif /* __ASM_SH_BITOPS_GRB_H */172173174