| 
									
										
										
										
											2007-11-30 16:12:36 +09:00
										 |  |  | #ifndef __ASM_SH_BITOPS_GRB_H
 | 
					
						
							|  |  |  | #define __ASM_SH_BITOPS_GRB_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline void set_bit(int nr, volatile void * addr) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int	mask; | 
					
						
							|  |  |  | 	volatile unsigned int *a = addr; | 
					
						
							|  |  |  | 	unsigned long tmp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	a += nr >> 5; | 
					
						
							|  |  |  | 	mask = 1 << (nr & 0x1f); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         __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: r15 = size */ | 
					
						
							|  |  |  |                 "   mov.l  @%1,   %0      \n\t" /* load  old value */ | 
					
						
							|  |  |  |                 "   or      %2,   %0      \n\t" /* or */ | 
					
						
							|  |  |  |                 "   mov.l   %0,   @%1     \n\t" /* store new value */ | 
					
						
							|  |  |  |                 "1: mov     r1,   r15     \n\t" /* LOGOUT */ | 
					
						
							|  |  |  |                 : "=&r" (tmp), | 
					
						
							|  |  |  |                   "+r"  (a) | 
					
						
							|  |  |  |                 : "r"   (mask) | 
					
						
							|  |  |  |                 : "memory" , "r0", "r1"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline void clear_bit(int nr, volatile void * addr) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int	mask; | 
					
						
							|  |  |  | 	volatile unsigned int *a = addr; | 
					
						
							|  |  |  |         unsigned long tmp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	a += nr >> 5; | 
					
						
							|  |  |  |         mask = ~(1 << (nr & 0x1f)); | 
					
						
							|  |  |  |         __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: r15 = size */ | 
					
						
							|  |  |  |                 "   mov.l  @%1,   %0      \n\t" /* load  old value */ | 
					
						
							|  |  |  |                 "   and     %2,   %0      \n\t" /* and */ | 
					
						
							|  |  |  |                 "   mov.l   %0,   @%1     \n\t" /* store new value */ | 
					
						
							|  |  |  |                 "1: mov     r1,   r15     \n\t" /* LOGOUT */ | 
					
						
							|  |  |  |                 : "=&r" (tmp), | 
					
						
							|  |  |  |                   "+r"  (a) | 
					
						
							|  |  |  |                 : "r"   (mask) | 
					
						
							|  |  |  |                 : "memory" , "r0", "r1"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline void change_bit(int nr, volatile void * addr) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |         int     mask; | 
					
						
							|  |  |  |         volatile unsigned int *a = addr; | 
					
						
							|  |  |  |         unsigned long tmp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         a += nr >> 5; | 
					
						
							|  |  |  |         mask = 1 << (nr & 0x1f); | 
					
						
							|  |  |  |         __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: r15 = size */ | 
					
						
							|  |  |  |                 "   mov.l  @%1,   %0      \n\t" /* load  old value */ | 
					
						
							|  |  |  |                 "   xor     %2,   %0      \n\t" /* xor */ | 
					
						
							|  |  |  |                 "   mov.l   %0,   @%1     \n\t" /* store new value */ | 
					
						
							|  |  |  |                 "1: mov     r1,   r15     \n\t" /* LOGOUT */ | 
					
						
							|  |  |  |                 : "=&r" (tmp), | 
					
						
							|  |  |  |                   "+r"  (a) | 
					
						
							|  |  |  |                 : "r"   (mask) | 
					
						
							|  |  |  |                 : "memory" , "r0", "r1"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline int test_and_set_bit(int nr, volatile void * addr) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |         int     mask, retval; | 
					
						
							|  |  |  | 	volatile unsigned int *a = addr; | 
					
						
							|  |  |  |         unsigned long tmp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	a += nr >> 5; | 
					
						
							|  |  |  | 	mask = 1 << (nr & 0x1f); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         __asm__ __volatile__ ( | 
					
						
							|  |  |  |                 "   .align 2              \n\t" | 
					
						
							|  |  |  |                 "   mova    1f,   r0      \n\t" /* r0 = end point */ | 
					
						
							|  |  |  |                 "   mov    r15,   r1      \n\t" /* r1 = saved sp */ | 
					
						
							|  |  |  |                 "   mov   #-14,   r15     \n\t" /* LOGIN: r15 = size */ | 
					
						
							|  |  |  |                 "   mov.l  @%2,   %0      \n\t" /* load old value */ | 
					
						
							|  |  |  |                 "   mov     %0,   %1      \n\t" | 
					
						
							|  |  |  |                 "   tst     %1,   %3      \n\t" /* T = ((*a & mask) == 0) */ | 
					
						
							|  |  |  |                 "   mov    #-1,   %1      \n\t" /* retvat = -1 */ | 
					
						
							|  |  |  |                 "   negc    %1,   %1      \n\t" /* retval = (mask & *a) != 0 */ | 
					
						
							|  |  |  |                 "   or      %3,   %0      \n\t" | 
					
						
							|  |  |  |                 "   mov.l   %0,  @%2      \n\t" /* store new value */ | 
					
						
							|  |  |  |                 "1: mov     r1,  r15      \n\t" /* LOGOUT */ | 
					
						
							|  |  |  |                 : "=&r" (tmp), | 
					
						
							|  |  |  |                   "=&r" (retval), | 
					
						
							|  |  |  |                   "+r"  (a) | 
					
						
							|  |  |  |                 : "r"   (mask) | 
					
						
							|  |  |  |                 : "memory" , "r0", "r1" ,"t"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return retval; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline int test_and_clear_bit(int nr, volatile void * addr) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |         int     mask, retval,not_mask; | 
					
						
							|  |  |  |         volatile unsigned int *a = addr; | 
					
						
							|  |  |  |         unsigned long tmp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         a += nr >> 5; | 
					
						
							|  |  |  |         mask = 1 << (nr & 0x1f); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	not_mask = ~mask; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         __asm__ __volatile__ ( | 
					
						
							|  |  |  |                 "   .align 2              \n\t" | 
					
						
							|  |  |  | 		"   mova    1f,   r0      \n\t" /* r0 = end point */ | 
					
						
							|  |  |  |                 "   mov    r15,   r1      \n\t" /* r1 = saved sp */ | 
					
						
							|  |  |  | 		"   mov   #-14,   r15     \n\t" /* LOGIN */ | 
					
						
							|  |  |  | 		"   mov.l  @%2,   %0      \n\t" /* load old value */ | 
					
						
							|  |  |  |                 "   mov     %0,   %1      \n\t" /* %1 = *a */ | 
					
						
							|  |  |  |                 "   tst     %1,   %3      \n\t" /* T = ((*a & mask) == 0) */ | 
					
						
							|  |  |  | 		"   mov    #-1,   %1      \n\t" /* retvat = -1 */ | 
					
						
							|  |  |  |                 "   negc    %1,   %1      \n\t" /* retval = (mask & *a) != 0 */ | 
					
						
							|  |  |  |                 "   and     %4,   %0      \n\t" | 
					
						
							|  |  |  |                 "   mov.l   %0,  @%2      \n\t" /* store new value */ | 
					
						
							|  |  |  | 		"1: mov     r1,   r15     \n\t" /* LOGOUT */ | 
					
						
							|  |  |  | 		: "=&r" (tmp), | 
					
						
							|  |  |  | 		  "=&r" (retval), | 
					
						
							|  |  |  | 		  "+r"  (a) | 
					
						
							|  |  |  | 		: "r"   (mask), | 
					
						
							|  |  |  | 		  "r"   (not_mask) | 
					
						
							|  |  |  | 		: "memory" , "r0", "r1", "t"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return retval; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline int test_and_change_bit(int nr, volatile void * addr) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |         int     mask, retval; | 
					
						
							|  |  |  |         volatile unsigned int *a = addr; | 
					
						
							|  |  |  |         unsigned long tmp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         a += nr >> 5; | 
					
						
							|  |  |  |         mask = 1 << (nr & 0x1f); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         __asm__ __volatile__ ( | 
					
						
							|  |  |  |                 "   .align 2              \n\t" | 
					
						
							|  |  |  |                 "   mova    1f,   r0      \n\t" /* r0 = end point */ | 
					
						
							|  |  |  |                 "   mov    r15,   r1      \n\t" /* r1 = saved sp */ | 
					
						
							|  |  |  |                 "   mov   #-14,   r15     \n\t" /* LOGIN */ | 
					
						
							|  |  |  |                 "   mov.l  @%2,   %0      \n\t" /* load old value */ | 
					
						
							|  |  |  |                 "   mov     %0,   %1      \n\t" /* %1 = *a */ | 
					
						
							|  |  |  |                 "   tst     %1,   %3      \n\t" /* T = ((*a & mask) == 0) */ | 
					
						
							|  |  |  |                 "   mov    #-1,   %1      \n\t" /* retvat = -1 */ | 
					
						
							|  |  |  |                 "   negc    %1,   %1      \n\t" /* retval = (mask & *a) != 0 */ | 
					
						
							|  |  |  |                 "   xor     %3,   %0      \n\t" | 
					
						
							|  |  |  |                 "   mov.l   %0,  @%2      \n\t" /* store new value */ | 
					
						
							|  |  |  |                 "1: mov     r1,   r15     \n\t" /* LOGOUT */ | 
					
						
							|  |  |  |                 : "=&r" (tmp), | 
					
						
							|  |  |  |                   "=&r" (retval), | 
					
						
							|  |  |  |                   "+r"  (a) | 
					
						
							|  |  |  |                 : "r"   (mask) | 
					
						
							|  |  |  |                 : "memory" , "r0", "r1", "t"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return retval; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-11-20 15:25:22 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <asm-generic/bitops/non-atomic.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-30 16:12:36 +09:00
										 |  |  | #endif /* __ASM_SH_BITOPS_GRB_H */
 |