2006-12-11 Sebastien Pouliot <sebastien@ximian.com>
[mono.git] / mono / io-layer / hppa_atomic.s
1 /*
2     Copyright (c) 2003 Bernie Solomon <bernard@ugsolutions.com>
3     
4     Permission is hereby granted, free of charge, to any person obtaining
5     a copy of this software and associated documentation files (the
6     "Software"), to deal in the Software without restriction, including
7     without limitation the rights to use, copy, modify, merge, publish,
8     distribute, sublicense, and/or sell copies of the Software, and to
9     permit persons to whom the Software is furnished to do so, subject to
10     the following conditions:
11     
12     The above copyright notice and this permission notice shall be
13     included in all copies or substantial portions of the Software.
14     
15     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17     MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19     LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20     OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21     WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
23
24
25     Implementation of "atomic" operations for HPPA. Currently (Oct 9th 2003)
26     only implemented for 64 bit compiles. There is only one atomic
27     instruction LDCW which is used to implement spinlocks. There are
28     16 locks which are selected by taking 4 bits out of the address of
29     the relevant variable to try to avoid too much contention
30     for a single lock.
31 */
32 #include "config.h"
33 #if SIZEOF_VOID_P != 8
34 #error "Currently only supports 64 bit pointers"
35 #endif
36
37         .SPACE  $TEXT$,SORT=8
38         .SUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=0x2c,CODE_ONLY,SORT=24
39 InterlockedIncrement
40         .EXPORT InterlockedIncrement,ENTRY,PRIV_LEV=3,NO_RELOCATION,LONG_RETURN
41         .PROC
42         .CALLINFO FRAME=0,ARGS_SAVED,ORDERING_AWARE
43         .ENTRY
44         ADDIL   L'locks-$global$,%r27,%r1
45         LDO     R'locks-$global$(%r1),%r31
46         EXTRD,U %r26,60,4,%r28
47         DEPD,Z  %r28,59,60,%r29
48         ADD,L   %r29,%r31,%r31
49 atomictest$1
50         LDCW    0(%r31),%r29
51         CMPB,<>,N        %r0,%r29,gotlock$1
52         NOP
53 spin$1
54         LDW     0(%r31),%r29
55         CMPB,=,N       %r29,%r0,spin$1
56         NOP
57         B,N     atomictest$1
58 gotlock$1
59         LDW     0(%r26),%r28
60         LDO     1(%r28),%r28
61         STW     %r28,0(%r26)
62         LDI     1,%r29
63         STW     %r29,0(%r31)
64         .EXIT
65         BVE,N   (%r2)
66         .PROCEND
67
68 InterlockedDecrement
69         .EXPORT InterlockedDecrement,ENTRY,PRIV_LEV=3,NO_RELOCATION,LONG_RETURN
70         .PROC
71         .CALLINFO FRAME=0,ARGS_SAVED,ORDERING_AWARE
72         .ENTRY
73         ADDIL   L'locks-$global$,%r27,%r1
74         LDO     R'locks-$global$(%r1),%r31
75         EXTRD,U %r26,60,4,%r28
76         DEPD,Z  %r28,59,60,%r29
77         ADD,L   %r29,%r31,%r31
78 atomictest$2
79         LDCW    0(%r31),%r29
80         CMPB,<>,N        %r0,%r29,gotlock$2
81         NOP
82 spin$2
83         LDW     0(%r31),%r29
84         CMPB,=,N       %r29,%r0,spin$2
85         NOP
86         B,N     atomictest$2
87 gotlock$2
88         LDW     0(%r26),%r28
89         LDO     -1(%r28),%r28
90         STW     %r28,0(%r26)
91         LDI     1,%r29
92         STW     %r29,0(%r31)
93         .EXIT
94         BVE,N   (%r2)
95         .PROCEND
96
97 InterlockedExchange
98         .EXPORT InterlockedExchange,ENTRY,PRIV_LEV=3,NO_RELOCATION,LONG_RETURN
99         .PROC
100         .CALLINFO FRAME=0,ARGS_SAVED,ORDERING_AWARE
101         .ENTRY
102         ADDIL   L'locks-$global$,%r27,%r1
103         LDO     R'locks-$global$(%r1),%r31
104         EXTRD,U %r26,60,4,%r28
105         DEPD,Z  %r28,59,60,%r29
106         ADD,L   %r29,%r31,%r31
107 atomictest$3
108         LDCW    0(%r31),%r29
109         CMPB,<>,N        %r0,%r29,gotlock$3
110         NOP
111 spin$3
112         LDW     0(%r31),%r29
113         CMPB,=,N       %r29,%r0,spin$3
114         NOP
115         B,N     atomictest$3
116 gotlock$3
117         LDW     0(%r26),%r28
118         STW     %r25,0(%r26)
119         LDI     1,%r29
120         STW     %r29,0(%r31)
121         .EXIT
122         BVE,N   (%r2)
123         .PROCEND
124
125 InterlockedExchangePointer
126         .EXPORT InterlockedExchangePointer,ENTRY,PRIV_LEV=3,NO_RELOCATION,LONG_RETURN
127         .PROC
128         .CALLINFO FRAME=0,ARGS_SAVED,ORDERING_AWARE
129         .ENTRY
130         ADDIL   L'locks-$global$,%r27,%r1
131         LDO     R'locks-$global$(%r1),%r31
132         EXTRD,U %r26,60,4,%r28
133         DEPD,Z  %r28,59,60,%r29
134         ADD,L   %r29,%r31,%r31
135 atomictest$4
136         LDCW    0(%r31),%r29
137         CMPB,<>,N        %r0,%r29,gotlock$4
138         NOP
139 spin$4
140         LDW     0(%r31),%r29
141         CMPB,=,N       %r29,%r0,spin$4
142         NOP
143         B,N     atomictest$4
144 gotlock$4
145         LDD     0(%r26),%r28
146         STD     %r25,0(%r26)
147         LDI     1,%r29
148         STW     %r29,0(%r31)
149         .EXIT
150         BVE,N   (%r2)
151         .PROCEND
152
153 InterlockedCompareExchange
154         .EXPORT InterlockedCompareExchange,ENTRY,PRIV_LEV=3,NO_RELOCATION,LONG_RETURN
155         .PROC
156         .CALLINFO FRAME=0,ARGS_SAVED,ORDERING_AWARE
157         .ENTRY
158         ADDIL   L'locks-$global$,%r27,%r1
159         LDO     R'locks-$global$(%r1),%r31
160         EXTRD,U %r26,60,4,%r28
161         DEPD,Z  %r28,59,60,%r29
162         ADD,L   %r29,%r31,%r31
163 atomictest$5
164         LDCW    0(%r31),%r29
165         CMPB,<>,N        %r0,%r29,gotlock$5
166         NOP
167 spin$5
168         LDW     0(%r31),%r29
169         CMPB,=,N       %r29,%r0,spin$5
170         NOP
171         B,N     atomictest$5
172 gotlock$5
173         LDW     0(%r26),%r28
174         CMPB,<> %r28,%r24,noexchange$5
175         NOP
176         STW     %r25,0(%r26)
177 noexchange$5
178         LDI     1,%r29
179         STW     %r29,0(%r31)
180         .EXIT
181         BVE,N   (%r2)
182         .PROCEND
183
184 InterlockedCompareExchangePointer
185         .EXPORT InterlockedCompareExchangePointer,ENTRY,PRIV_LEV=3,NO_RELOCATION,LONG_RETURN
186         .PROC
187         .CALLINFO FRAME=0,ARGS_SAVED,ORDERING_AWARE
188         .ENTRY
189         ADDIL   L'locks-$global$,%r27,%r1
190         LDO     R'locks-$global$(%r1),%r31
191         EXTRD,U %r26,60,4,%r28
192         DEPD,Z  %r28,59,60,%r29
193         ADD,L   %r29,%r31,%r31
194 atomictest$6
195         LDCW    0(%r31),%r29
196         CMPB,<>,N        %r0,%r29,gotlock$6
197         NOP
198 spin$6
199         LDW     0(%r31),%r29
200         CMPB,=,N       %r29,%r0,spin$6
201         NOP
202         B,N     atomictest$6
203 gotlock$6
204         LDD     0(%r26),%r28
205         CMPB,*<> %r28,%r24,noexchange$6
206         NOP
207         STD     %r25,0(%r26)
208 noexchange$6
209         LDI     1,%r29
210         STW     %r29,0(%r31)
211         .EXIT
212         BVE,N   (%r2)
213         .PROCEND
214
215
216         .SPACE  $PRIVATE$,SORT=16
217         .SUBSPA $SHORTDATA$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=24
218 locks
219         .ALIGN  16
220         .STRING "\x00\x00\x00\x01"
221         .ALIGN  16
222         .STRING "\x00\x00\x00\x01"
223         .ALIGN  16
224         .STRING "\x00\x00\x00\x01"
225         .ALIGN  16
226         .STRING "\x00\x00\x00\x01"
227         .ALIGN  16
228         .STRING "\x00\x00\x00\x01"
229         .ALIGN  16
230         .STRING "\x00\x00\x00\x01"
231         .ALIGN  16
232         .STRING "\x00\x00\x00\x01"
233         .ALIGN  16
234         .STRING "\x00\x00\x00\x01"
235         .ALIGN  16
236         .STRING "\x00\x00\x00\x01"
237         .ALIGN  16
238         .STRING "\x00\x00\x00\x01"
239         .ALIGN  16
240         .STRING "\x00\x00\x00\x01"
241         .ALIGN  16
242         .STRING "\x00\x00\x00\x01"
243         .ALIGN  16
244         .STRING "\x00\x00\x00\x01"
245         .ALIGN  16
246         .STRING "\x00\x00\x00\x01"
247         .ALIGN  16
248         .STRING "\x00\x00\x00\x01"
249         .ALIGN  16
250         .STRING "\x00\x00\x00\x01"
251         .IMPORT $global$,DATA
252         .END