• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/arch/sh/include/asm/
1#ifndef __ASM_SH_ATOMIC_GRB_H
2#define __ASM_SH_ATOMIC_GRB_H
3
4static inline void atomic_add(int i, atomic_t *v)
5{
6	int tmp;
7
8	__asm__ __volatile__ (
9		"   .align 2              \n\t"
10		"   mova    1f,   r0      \n\t" /* r0 = end point */
11		"   mov    r15,   r1      \n\t" /* r1 = saved sp */
12		"   mov    #-6,   r15     \n\t" /* LOGIN: r15 = size */
13		"   mov.l  @%1,   %0      \n\t" /* load  old value */
14		"   add     %2,   %0      \n\t" /* add */
15		"   mov.l   %0,   @%1     \n\t" /* store new value */
16		"1: mov     r1,   r15     \n\t" /* LOGOUT */
17		: "=&r" (tmp),
18		  "+r"  (v)
19		: "r"   (i)
20		: "memory" , "r0", "r1");
21}
22
23static inline void atomic_sub(int i, atomic_t *v)
24{
25	int tmp;
26
27	__asm__ __volatile__ (
28		"   .align 2              \n\t"
29		"   mova    1f,   r0      \n\t" /* r0 = end point */
30		"   mov     r15,  r1      \n\t" /* r1 = saved sp */
31		"   mov    #-6,   r15     \n\t" /* LOGIN: r15 = size */
32		"   mov.l  @%1,   %0      \n\t" /* load  old value */
33		"   sub     %2,   %0      \n\t" /* sub */
34		"   mov.l   %0,   @%1     \n\t" /* store new value */
35		"1: mov     r1,   r15     \n\t" /* LOGOUT */
36		: "=&r" (tmp),
37		  "+r"  (v)
38		: "r"   (i)
39		: "memory" , "r0", "r1");
40}
41
42static inline int atomic_add_return(int i, atomic_t *v)
43{
44	int tmp;
45
46	__asm__ __volatile__ (
47		"   .align 2              \n\t"
48		"   mova    1f,   r0      \n\t" /* r0 = end point */
49		"   mov    r15,   r1      \n\t" /* r1 = saved sp */
50		"   mov    #-6,   r15     \n\t" /* LOGIN: r15 = size */
51		"   mov.l  @%1,   %0      \n\t" /* load  old value */
52		"   add     %2,   %0      \n\t" /* add */
53		"   mov.l   %0,   @%1     \n\t" /* store new value */
54		"1: mov     r1,   r15     \n\t" /* LOGOUT */
55		: "=&r" (tmp),
56		  "+r"  (v)
57		: "r"   (i)
58		: "memory" , "r0", "r1");
59
60	return tmp;
61}
62
63static inline int atomic_sub_return(int i, atomic_t *v)
64{
65	int tmp;
66
67	__asm__ __volatile__ (
68		"   .align 2              \n\t"
69		"   mova    1f,   r0      \n\t" /* r0 = end point */
70		"   mov    r15,   r1      \n\t" /* r1 = saved sp */
71		"   mov    #-6,   r15     \n\t" /* LOGIN: r15 = size */
72		"   mov.l  @%1,   %0      \n\t" /* load  old value */
73		"   sub     %2,   %0      \n\t" /* sub */
74		"   mov.l   %0,   @%1     \n\t" /* store new value */
75		"1: mov     r1,   r15     \n\t" /* LOGOUT */
76		: "=&r" (tmp),
77		  "+r"  (v)
78		: "r"   (i)
79		: "memory", "r0", "r1");
80
81	return tmp;
82}
83
84static inline void atomic_clear_mask(unsigned int mask, atomic_t *v)
85{
86	int tmp;
87	unsigned int _mask = ~mask;
88
89	__asm__ __volatile__ (
90		"   .align 2              \n\t"
91		"   mova    1f,   r0      \n\t" /* r0 = end point */
92		"   mov    r15,   r1      \n\t" /* r1 = saved sp */
93		"   mov    #-6,   r15     \n\t" /* LOGIN: r15 = size */
94		"   mov.l  @%1,   %0      \n\t" /* load  old value */
95		"   and     %2,   %0      \n\t" /* add */
96		"   mov.l   %0,   @%1     \n\t" /* store new value */
97		"1: mov     r1,   r15     \n\t" /* LOGOUT */
98		: "=&r" (tmp),
99		  "+r"  (v)
100		: "r"   (_mask)
101		: "memory" , "r0", "r1");
102}
103
104static inline void atomic_set_mask(unsigned int mask, atomic_t *v)
105{
106	int tmp;
107
108	__asm__ __volatile__ (
109		"   .align 2              \n\t"
110		"   mova    1f,   r0      \n\t" /* r0 = end point */
111		"   mov    r15,   r1      \n\t" /* r1 = saved sp */
112		"   mov    #-6,   r15     \n\t" /* LOGIN: r15 = size */
113		"   mov.l  @%1,   %0      \n\t" /* load  old value */
114		"   or      %2,   %0      \n\t" /* or */
115		"   mov.l   %0,   @%1     \n\t" /* store new value */
116		"1: mov     r1,   r15     \n\t" /* LOGOUT */
117		: "=&r" (tmp),
118		  "+r"  (v)
119		: "r"   (mask)
120		: "memory" , "r0", "r1");
121}
122
123#endif /* __ASM_SH_ATOMIC_GRB_H */
124