Linux 2.2.0
[davej-history.git] / arch / alpha / lib / semaphore.S
blob7ecddc2ec4134215868f786661371282f793630c
1 /*
2  *  linux/arch/alpha/lib/semaphore.S
3  *
4  *  Copyright (C) 1999  Richard Henderson
5  */
7 /*
8  * The semaphore operations have a special calling sequence that
9  * allow us to do a simpler in-line version of them. These routines
10  * need to convert that sequence back into the C sequence when
11  * there is contention on the semaphore.
12  */
14         .set noat
15         .set noreorder
16         .align 4
18 /* __down_failed takes the semaphore in $24, clobbers $24 and $28.  */
20         .globl  __down_failed
21         .ent    __down_failed
22 __down_failed:
23         ldgp    $29,0($27)
24         lda     $30, -20*8($30)
25         stq     $28, 0*8($30)
26         stq     $0, 1*8($30)
27         stq     $1, 2*8($30)
28         stq     $2, 3*8($30)
29         stq     $3, 4*8($30)
30         stq     $4, 5*8($30)
31         stq     $5, 6*8($30)
32         stq     $6, 7*8($30)
33         stq     $7, 8*8($30)
34         stq     $16, 9*8($30)
35         stq     $17, 10*8($30)
36         stq     $18, 11*8($30)
37         stq     $19, 12*8($30)
38         stq     $20, 13*8($30)
39         stq     $21, 14*8($30)
40         stq     $22, 15*8($30)
41         stq     $23, 16*8($30)
42         stq     $25, 17*8($30)
43         stq     $26, 18*8($30)
44         .frame $30, 20*8, $28
45         .prologue 1
46         
47         mov     $24, $16
48         jsr     __down
49         
50         ldq     $28, 0*8($30)
51         ldq     $0, 1*8($30)
52         ldq     $1, 2*8($30)
53         ldq     $2, 3*8($30)
54         ldq     $3, 4*8($30)
55         ldq     $4, 5*8($30)
56         ldq     $5, 6*8($30)
57         ldq     $6, 7*8($30)
58         ldq     $7, 8*8($30)
59         ldq     $16, 9*8($30)
60         ldq     $17, 10*8($30)
61         ldq     $18, 11*8($30)
62         ldq     $19, 12*8($30)
63         ldq     $20, 13*8($30)
64         ldq     $21, 14*8($30)
65         ldq     $22, 15*8($30)
66         ldq     $23, 16*8($30)
67         ldq     $25, 17*8($30)
68         ldq     $26, 18*8($30)
69         lda     $30, 20*8($30)
70         ret     $31, ($28), 0
71         .end    __down_failed
73 /* __down_failed_interruptible takes the semaphore in $24,
74    clobbers $28, returns success in $24.  */
76         .globl  __down_failed_interruptible
77         .ent    __down_failed_interruptible
78 __down_failed_interruptible:
79         ldgp    $29,0($27)
80         lda     $30, -20*8($30)
81         stq     $28, 0*8($30)
82         stq     $0, 1*8($30)
83         stq     $1, 2*8($30)
84         stq     $2, 3*8($30)
85         stq     $3, 4*8($30)
86         stq     $4, 5*8($30)
87         stq     $5, 6*8($30)
88         stq     $6, 7*8($30)
89         stq     $7, 8*8($30)
90         stq     $16, 9*8($30)
91         stq     $17, 10*8($30)
92         stq     $18, 11*8($30)
93         stq     $19, 12*8($30)
94         stq     $20, 13*8($30)
95         stq     $21, 14*8($30)
96         stq     $22, 15*8($30)
97         stq     $23, 16*8($30)
98         stq     $25, 17*8($30)
99         stq     $26, 18*8($30)
100         .frame $30, 20*8, $28
101         .prologue 1
102         
103         mov     $24, $16
104         jsr     __down
105         mov     $0, $24
106         
107         ldq     $28, 0*8($30)
108         ldq     $0, 1*8($30)
109         ldq     $1, 2*8($30)
110         ldq     $2, 3*8($30)
111         ldq     $3, 4*8($30)
112         ldq     $4, 5*8($30)
113         ldq     $5, 6*8($30)
114         ldq     $6, 7*8($30)
115         ldq     $7, 8*8($30)
116         ldq     $16, 9*8($30)
117         ldq     $17, 10*8($30)
118         ldq     $18, 11*8($30)
119         ldq     $19, 12*8($30)
120         ldq     $20, 13*8($30)
121         ldq     $21, 14*8($30)
122         ldq     $22, 15*8($30)
123         ldq     $23, 16*8($30)
124         ldq     $25, 17*8($30)
125         ldq     $26, 18*8($30)
126         lda     $30, 20*8($30)
127         ret     $31, ($28), 0
128         .end    __down_failed_interruptible
130 /* __up_wakeup takes the semaphore in $24, clobbers $24 and $28.  */
132         .globl  __up_wakeup
133         .ent    __up_wakeup
134 __up_wakeup:
135         ldgp    $29,0($27)
136         lda     $30, -20*8($30)
137         stq     $28, 0*8($30)
138         stq     $0, 1*8($30)
139         stq     $1, 2*8($30)
140         stq     $2, 3*8($30)
141         stq     $3, 4*8($30)
142         stq     $4, 5*8($30)
143         stq     $5, 6*8($30)
144         stq     $6, 7*8($30)
145         stq     $7, 8*8($30)
146         stq     $16, 9*8($30)
147         stq     $17, 10*8($30)
148         stq     $18, 11*8($30)
149         stq     $19, 12*8($30)
150         stq     $20, 13*8($30)
151         stq     $21, 14*8($30)
152         stq     $22, 15*8($30)
153         stq     $23, 16*8($30)
154         stq     $25, 17*8($30)
155         stq     $26, 18*8($30)
156         .frame $30, 20*8, $28
157         .prologue 1
158         
159         mov     $24, $16
160         jsr     __up
161         
162         ldq     $28, 0*8($30)
163         ldq     $0, 1*8($30)
164         ldq     $1, 2*8($30)
165         ldq     $2, 3*8($30)
166         ldq     $3, 4*8($30)
167         ldq     $4, 5*8($30)
168         ldq     $5, 6*8($30)
169         ldq     $6, 7*8($30)
170         ldq     $7, 8*8($30)
171         ldq     $16, 9*8($30)
172         ldq     $17, 10*8($30)
173         ldq     $18, 11*8($30)
174         ldq     $19, 12*8($30)
175         ldq     $20, 13*8($30)
176         ldq     $21, 14*8($30)
177         ldq     $22, 15*8($30)
178         ldq     $23, 16*8($30)
179         ldq     $25, 17*8($30)
180         ldq     $26, 18*8($30)
181         lda     $30, 20*8($30)
182         ret     $31, ($28), 0
183         .end    __up_wakeup