1/*	$NetBSD: atomic.S,v 1.5 2009/11/09 14:22:02 skrll Exp $	*/
2
3/*-
4 * Copyright (c) 2008 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Takayoshi Kochi.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#include <machine/asm.h>
33
34#ifdef _KERNEL
35#define	ALIAS(f, t)	STRONG_ALIAS(f,t)
36#else
37#define	ALIAS(f, t)	WEAK_ALIAS(f,t)
38#endif
39
40	.text
41
42ENTRY(_atomic_dec_32,1)
43	fetchadd4.rel	r8=[r32],-1
44	br.ret.sptk	rp
45END(_atomic_dec_32)
46
47ENTRY(_atomic_dec_64,1)
48	fetchadd8.rel	r8=[r32],-1
49	br.ret.sptk	rp
50END(_atomic_dec_64)
51
52ENTRY(_atomic_dec_32_nv,1)
53	fetchadd4.rel	r8=[r32],-1
54	br.ret.sptk	rp
55END(_atomic_dec_32_nv)
56
57ENTRY(_atomic_dec_64_nv,1)
58	fetchadd8.rel	r8=[r32],-1
59	br.ret.sptk	rp
60END(_atomic_dec_64_nv)
61
62ENTRY(_atomic_inc_32,1)
63	fetchadd4.rel	r8=[r32],1
64	br.ret.sptk	rp
65END(_atomic_inc_32)
66
67ENTRY(_atomic_inc_64,1)
68	fetchadd8.rel	r8=[r32],1
69	br.ret.sptk	rp
70END(_atomic_inc_64)
71
72ENTRY(_atomic_inc_32_nv,1)
73	fetchadd4.rel	r8=[r32],1
74	br.ret.sptk	rp
75END(_atomic_inc_32_nv)
76
77ENTRY(_atomic_inc_64_nv,1)
78	fetchadd8.rel	r8=[r32],1
79	br.ret.sptk	rp
80END(_atomic_inc_64_nv)
81
82ENTRY(_atomic_swap_32,2)
83	xchg4		r8=[r32],r33
84	;;
85	mov		r33=r8
86	br.ret.sptk	rp
87END(_atomic_swap_32)
88
89ENTRY(_atomic_swap_64,2)
90	xchg8		r8=[r32],r33
91	;;
92	mov		r33=r8
93	br.ret.sptk	rp
94END(_atomic_swap_64)
95
96ENTRY(_atomic_cas_32,3)
97	mov		ar.ccv=r33
98	;;
99	cmpxchg4.acq	r8=[r32],r34,ar.ccv
100	br.ret.sptk	rp
101END(_atomic_cas_32)
102
103ENTRY(_atomic_cas_64,3)
104	mov		ar.ccv=r33
105	;;
106	cmpxchg8.acq	r8=[r32],r34,ar.ccv
107	br.ret.sptk	rp
108END(_atomic_cas_64)
109
110ENTRY(_membar_consumer,0)
111	mf
112	br.ret.sptk	rp
113END(_membar_consumer)
114
115ENTRY(_membar_producer,0)
116	mf
117	br.ret.sptk	rp
118END(_membar_producer)
119
120ENTRY(_membar_enter,0)
121	mf
122	br.ret.sptk	rp
123END(_membar_enter)
124
125ENTRY(_membar_exit,0)
126	mf
127	br.ret.sptk	rp
128END(_membar_exit)
129
130ENTRY(_membar_sync,0)
131	mf
132	br.ret.sptk	rp
133END(_membar_sync)
134
135
136ALIAS(atomic_add_32,_atomic_add_32)
137ALIAS(atomic_add_int,_atomic_add_32)
138ALIAS(atomic_add_64,_atomic_add_64)
139ALIAS(atomic_add_long,_atomic_add_64)
140ALIAS(atomic_add_ptr,_atomic_add_64)
141
142ALIAS(atomic_add_32_nv,_atomic_add_32_nv)
143ALIAS(atomic_add_int_nv,_atomic_add_32_nv)
144ALIAS(atomic_add_64_nv,_atomic_add_64_nv)
145ALIAS(atomic_add_long_nv,_atomic_add_64_nv)
146ALIAS(atomic_add_ptr_nv,_atomic_add_64_nv)
147
148ALIAS(atomic_and_32,_atomic_and_32)
149ALIAS(atomic_and_uint,_atomic_and_32)
150ALIAS(atomic_and_64,_atomic_and_64)
151ALIAS(atomic_and_ulong,_atomic_and_64)
152ALIAS(atomic_and_ptr,_atomic_and_64)
153
154ALIAS(atomic_and_32_nv,_atomic_and_32_nv)
155ALIAS(atomic_and_uint_nv,_atomic_and_32_nv)
156ALIAS(atomic_and_64_nv,_atomic_and_64_nv)
157ALIAS(atomic_and_ulong_nv,_atomic_and_64_nv)
158ALIAS(atomic_and_ptr_nv,_atomic_and_64_nv)
159
160ALIAS(atomic_dec_32,_atomic_dec_32)
161ALIAS(atomic_dec_uint,_atomic_dec_32)
162ALIAS(atomic_dec_64,_atomic_dec_64)
163ALIAS(atomic_dec_ulong,_atomic_dec_64)
164ALIAS(atomic_dec_ptr,_atomic_dec_64)
165
166ALIAS(atomic_dec_32_nv,_atomic_dec_32_nv)
167ALIAS(atomic_dec_uint_nv,_atomic_dec_32_nv)
168ALIAS(atomic_dec_64_nv,_atomic_dec_64_nv)
169ALIAS(atomic_dec_ulong_nv,_atomic_dec_64_nv)
170ALIAS(atomic_dec_ptr_nv,_atomic_dec_64_nv)
171
172ALIAS(atomic_inc_32,_atomic_inc_32)
173ALIAS(atomic_inc_uint,_atomic_inc_32)
174ALIAS(atomic_inc_64,_atomic_inc_64)
175ALIAS(atomic_inc_ulong,_atomic_inc_64)
176ALIAS(atomic_inc_ptr,_atomic_inc_64)
177
178ALIAS(atomic_inc_32_nv,_atomic_inc_32_nv)
179ALIAS(atomic_inc_uint_nv,_atomic_inc_32_nv)
180ALIAS(atomic_inc_64_nv,_atomic_inc_64_nv)
181ALIAS(atomic_inc_ulong_nv,_atomic_inc_64_nv)
182ALIAS(atomic_inc_ptr_nv,_atomic_inc_64_nv)
183
184ALIAS(atomic_or_32,_atomic_or_32)
185ALIAS(atomic_or_uint,_atomic_or_32)
186ALIAS(atomic_or_64,_atomic_or_64)
187ALIAS(atomic_or_ulong,_atomic_or_64)
188ALIAS(atomic_or_ptr,_atomic_or_64)
189
190ALIAS(atomic_or_32_nv,_atomic_or_32_nv)
191ALIAS(atomic_or_uint_nv,_atomic_or_32_nv)
192ALIAS(atomic_or_64_nv,_atomic_or_64_nv)
193ALIAS(atomic_or_ulong_nv,_atomic_or_64_nv)
194ALIAS(atomic_or_ptr_nv,_atomic_or_64_nv)
195
196ALIAS(atomic_swap_32,_atomic_swap_32)
197ALIAS(atomic_swap_uint,_atomic_swap_32)
198ALIAS(atomic_swap_64,_atomic_swap_64)
199ALIAS(atomic_swap_ulong,_atomic_swap_64)
200ALIAS(atomic_swap_ptr,_atomic_swap_64)
201
202ALIAS(atomic_cas_32,_atomic_cas_32)
203ALIAS(atomic_cas_uint,_atomic_cas_32)
204ALIAS(atomic_cas_64,_atomic_cas_64)
205ALIAS(atomic_cas_ulong,_atomic_cas_64)
206ALIAS(atomic_cas_ptr,_atomic_cas_64)
207
208ALIAS(atomic_cas_32_ni,_atomic_cas_32)
209ALIAS(atomic_cas_uint_ni,_atomic_cas_32)
210ALIAS(atomic_cas_64_ni,_atomic_cas_64)
211ALIAS(atomic_cas_ulong_ni,_atomic_cas_64)
212ALIAS(atomic_cas_ptr_ni,_atomic_cas_64)
213
214ALIAS(membar_consumer,_membar_consumer)
215ALIAS(membar_producer,_membar_producer)
216ALIAS(membar_enter,_membar_enter)
217ALIAS(membar_exit,_membar_exit)
218ALIAS(membar_sync,_membar_sync)
219
220STRONG_ALIAS(_atomic_add_int,_atomic_add_32)
221STRONG_ALIAS(_atomic_add_long,_atomic_add_64)
222STRONG_ALIAS(_atomic_add_ptr,_atomic_add_64)
223
224STRONG_ALIAS(_atomic_add_int_nv,_atomic_add_32_nv)
225STRONG_ALIAS(_atomic_add_long_nv,_atomic_add_64_nv)
226STRONG_ALIAS(_atomic_add_ptr_nv,_atomic_add_64_nv)
227
228STRONG_ALIAS(_atomic_and_uint,_atomic_and_32)
229STRONG_ALIAS(_atomic_and_ulong,_atomic_and_64)
230STRONG_ALIAS(_atomic_and_ptr,_atomic_and_64)
231
232STRONG_ALIAS(_atomic_and_uint_nv,_atomic_and_32_nv)
233STRONG_ALIAS(_atomic_and_ulong_nv,_atomic_and_64_nv)
234STRONG_ALIAS(_atomic_and_ptr_nv,_atomic_and_64_nv)
235
236STRONG_ALIAS(_atomic_dec_uint,_atomic_dec_32)
237STRONG_ALIAS(_atomic_dec_ulong,_atomic_dec_64)
238STRONG_ALIAS(_atomic_dec_ptr,_atomic_dec_64)
239
240STRONG_ALIAS(_atomic_dec_uint_nv,_atomic_dec_32_nv)
241STRONG_ALIAS(_atomic_dec_ulong_nv,_atomic_dec_64_nv)
242STRONG_ALIAS(_atomic_dec_ptr_nv,_atomic_dec_64_nv)
243
244STRONG_ALIAS(_atomic_inc_uint,_atomic_inc_32)
245STRONG_ALIAS(_atomic_inc_ulong,_atomic_inc_64)
246STRONG_ALIAS(_atomic_inc_ptr,_atomic_inc_64)
247
248STRONG_ALIAS(_atomic_inc_uint_nv,_atomic_inc_32_nv)
249STRONG_ALIAS(_atomic_inc_ulong_nv,_atomic_inc_64_nv)
250STRONG_ALIAS(_atomic_inc_ptr_nv,_atomic_inc_64_nv)
251
252STRONG_ALIAS(_atomic_or_uint,_atomic_or_32)
253STRONG_ALIAS(_atomic_or_ulong,_atomic_or_64)
254STRONG_ALIAS(_atomic_or_ptr,_atomic_or_64)
255
256STRONG_ALIAS(_atomic_or_uint_nv,_atomic_or_32_nv)
257STRONG_ALIAS(_atomic_or_ulong_nv,_atomic_or_64_nv)
258STRONG_ALIAS(_atomic_or_ptr_nv,_atomic_or_64_nv)
259
260STRONG_ALIAS(_atomic_swap_uint,_atomic_swap_32)
261STRONG_ALIAS(_atomic_swap_ulong,_atomic_swap_64)
262STRONG_ALIAS(_atomic_swap_ptr,_atomic_swap_64)
263
264STRONG_ALIAS(_atomic_cas_uint,_atomic_cas_32)
265STRONG_ALIAS(_atomic_cas_ulong,_atomic_cas_64)
266STRONG_ALIAS(_atomic_cas_ptr,_atomic_cas_64)
267
268STRONG_ALIAS(_atomic_cas_uint_ni,_atomic_cas_32)
269STRONG_ALIAS(_atomic_cas_ulong_ni,_atomic_cas_64)
270STRONG_ALIAS(_atomic_cas_ptr_ni,_atomic_cas_64)
271