]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/alpha/alpha/atomic.s
This commit was generated by cvs2svn to compensate for changes in r58653,
[FreeBSD/FreeBSD.git] / sys / alpha / alpha / atomic.s
1 /*-
2  * Copyright (c) 1998 Doug Rabson
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $FreeBSD$
27  */
28
29 #include <machine/asm.h>
30         
31         .text
32         
33 LEAF(atomic_set_8, 2)
34         bic     a0, 7, t1
35 0:      ldq_l   t2, 0(t1)
36         extbl   t2, a0, t0
37         bis     t0, a1, t0
38         insbl   t0, a0, t0
39         mskbl   t2, a0, t2
40         or      t2, t0, t0
41         stq_c   t0, 0(t1)
42         beq     t0, 1f
43         mb
44         RET
45 1:      br      0b
46         END(atomic_set_8)
47
48 LEAF(atomic_clear_8, 2)
49         bic     a0, 7, t1
50 0:      ldq_l   t2, 0(t1)
51         extbl   t2, a0, t0
52         bic     t0, a1, t0
53         insbl   t0, a0, t0
54         mskbl   t2, a0, t2
55         or      t2, t0, t0
56         stq_c   t0, 0(t1)
57         beq     t0, 1f
58         mb
59         RET
60 1:      br      0b
61         END(atomic_clear_8)
62         
63 LEAF(atomic_add_8, 2)
64         bic     a0, 7, t1
65 0:      ldq_l   t2, 0(t1)
66         extbl   t2, a0, t0
67         addl    t0, a1, t0
68         insbl   t0, a0, t0
69         mskbl   t2, a0, t2
70         or      t2, t0, t0
71         stq_c   t0, 0(t1)
72         beq     t0, 1f
73         mb
74         RET
75 1:      br      0b
76         END(atomic_add_8)
77
78 LEAF(atomic_subtract_8, 2)
79         bic     a0, 7, t1
80 0:      ldq_l   t2, 0(t1)
81         extbl   t2, a0, t0
82         subl    t0, a1, t0
83         insbl   t0, a0, t0
84         mskbl   t2, a0, t2
85         or      t2, t0, t0
86         stq_c   t0, 0(t1)
87         beq     t0, 1f
88         mb
89         RET
90 1:      br      0b
91         END(atomic_subtract_8)
92         
93 LEAF(atomic_set_16, 2)
94         bic     a0, 7, t1
95 0:      ldq_l   t2, 0(t1)
96         extwl   t2, a0, t0
97         bis     t0, a1, t0
98         inswl   t0, a0, t0
99         mskwl   t2, a0, t2
100         or      t2, t0, t0
101         stq_c   t0, 0(t1)
102         beq     t0, 1f
103         mb
104         RET
105 1:      br      0b
106         END(atomic_set_16)
107
108 LEAF(atomic_clear_16, 2)
109         bic     a0, 7, t1
110 0:      ldq_l   t2, 0(t1)
111         extwl   t2, a0, t0
112         bic     t0, a1, t0
113         inswl   t0, a0, t0
114         mskwl   t2, a0, t2
115         or      t2, t0, t0
116         stq_c   t0, 0(t1)
117         beq     t0, 1f
118         mb
119         RET
120 1:      br      0b
121         END(atomic_clear_16)
122         
123 LEAF(atomic_add_16, 2)
124         bic     a0, 7, t1
125 0:      ldq_l   t2, 0(t1)
126         extwl   t2, a0, t0
127         addl    t0, a1, t0
128         inswl   t0, a0, t0
129         mskwl   t2, a0, t2
130         or      t2, t0, t0
131         stq_c   t0, 0(t1)
132         beq     t0, 1f
133         mb
134         RET
135 1:      br      0b
136         END(atomic_add_16)
137
138 LEAF(atomic_subtract_16, 2)
139         bic     a0, 7, t1
140 0:      ldq_l   t2, 0(t1)
141         extwl   t2, a0, t0
142         subl    t0, a1, t0
143         inswl   t0, a0, t0
144         mskwl   t2, a0, t2
145         or      t2, t0, t0
146         stq_c   t0, 0(t1)
147         beq     t0, 1f
148         mb
149         RET
150 1:      br      0b
151         END(atomic_subtract_16)
152         
153 LEAF(atomic_set_32, 2)
154 0:      ldl_l   t0, 0(a0)
155         bis     t0, a1, t0
156         stl_c   t0, 0(a0)
157         beq     t0, 1f
158         mb
159         RET
160 1:      br      0b
161         END(atomic_set_32)
162
163 LEAF(atomic_clear_32, 2)
164 0:      ldl_l   t0, 0(a0)
165         bic     t0, a1, t0
166         stl_c   t0, 0(a0)
167         beq     t0, 1f
168         mb
169         RET
170 1:      br      0b
171         END(atomic_clear_32)
172         
173 LEAF(atomic_add_32, 2)
174 0:      ldl_l   t0, 0(a0)
175         addl    t0, a1, t0
176         stl_c   t0, 0(a0)
177         beq     t0, 1f
178         mb
179         RET
180 1:      br      0b
181         END(atomic_add_32)
182
183 LEAF(atomic_subtract_32, 2)
184 0:      ldl_l   t0, 0(a0)
185         subl    t0, a1, t0
186         stl_c   t0, 0(a0)
187         beq     t0, 1f
188         mb
189         RET
190 1:      br      0b
191         END(atomic_subtract_32)
192         
193 LEAF(atomic_set_64, 2)
194 0:      ldq_l   t0, 0(a0)
195         bis     t0, a1, t0
196         stq_c   t0, 0(a0)
197         beq     t0, 1f
198         mb
199         RET
200 1:      br      0b
201         END(atomic_set_64)
202
203 LEAF(atomic_clear_64, 2)
204 0:      ldq_l   t0, 0(a0)
205         bic     t0, a1, t0
206         stq_c   t0, 0(a0)
207         beq     t0, 1f
208         mb
209         RET
210 1:      br      0b
211         END(atomic_clear_64)
212         
213 LEAF(atomic_add_64, 2)
214 0:      ldq_l   t0, 0(a0)
215         addq    t0, a1, t0
216         stq_c   t0, 0(a0)
217         beq     t0, 1f
218         mb
219         RET
220 1:      br      0b
221         END(atomic_add_64)
222
223 LEAF(atomic_subtract_64, 2)
224 0:      ldq_l   t0, 0(a0)
225         subq    t0, a1, t0
226         stq_c   t0, 0(a0)
227         beq     t0, 1f
228         mb
229         RET
230 1:      br      0b
231         END(atomic_subtract_64)
232