xref: /netbsd-src/common/lib/libc/arch/ia64/atomic/atomic.S (revision 4f8ce3b31dd3bccb2f78a8118c558aacc733ac7d)
1*4f8ce3b3Sriastradh/*	$NetBSD: atomic.S,v 1.7 2022/04/09 23:32:51 riastradh Exp $	*/
2473f1b48Skochi
3473f1b48Skochi/*-
4473f1b48Skochi * Copyright (c) 2008 The NetBSD Foundation, Inc.
5473f1b48Skochi * All rights reserved.
6473f1b48Skochi *
7473f1b48Skochi * This code is derived from software contributed to The NetBSD Foundation
8473f1b48Skochi * by Takayoshi Kochi.
9473f1b48Skochi *
10473f1b48Skochi * Redistribution and use in source and binary forms, with or without
11473f1b48Skochi * modification, are permitted provided that the following conditions
12473f1b48Skochi * are met:
13473f1b48Skochi * 1. Redistributions of source code must retain the above copyright
14473f1b48Skochi *    notice, this list of conditions and the following disclaimer.
15473f1b48Skochi * 2. Redistributions in binary form must reproduce the above copyright
16473f1b48Skochi *    notice, this list of conditions and the following disclaimer in the
17473f1b48Skochi *    documentation and/or other materials provided with the distribution.
18473f1b48Skochi *
19473f1b48Skochi * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20473f1b48Skochi * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21473f1b48Skochi * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22473f1b48Skochi * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23473f1b48Skochi * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24473f1b48Skochi * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25473f1b48Skochi * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26473f1b48Skochi * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27473f1b48Skochi * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28473f1b48Skochi * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29473f1b48Skochi * POSSIBILITY OF SUCH DAMAGE.
30473f1b48Skochi */
31473f1b48Skochi
32473f1b48Skochi#include <machine/asm.h>
33473f1b48Skochi
34473f1b48Skochi#ifdef _KERNEL
35473f1b48Skochi#define	ALIAS(f, t)	STRONG_ALIAS(f,t)
36473f1b48Skochi#else
37473f1b48Skochi#define	ALIAS(f, t)	WEAK_ALIAS(f,t)
38473f1b48Skochi#endif
39473f1b48Skochi
40473f1b48Skochi	.text
41473f1b48Skochi
426740bb54SchsENTRY(_atomic_dec_32,1)
43473f1b48Skochi	fetchadd4.rel	r8=[r32],-1
44473f1b48Skochi	br.ret.sptk	rp
4588855871SskrllEND(_atomic_dec_32)
46473f1b48Skochi
476740bb54SchsENTRY(_atomic_dec_64,1)
48473f1b48Skochi	fetchadd8.rel	r8=[r32],-1
49473f1b48Skochi	br.ret.sptk	rp
5088855871SskrllEND(_atomic_dec_64)
51473f1b48Skochi
526740bb54SchsENTRY(_atomic_dec_32_nv,1)
53473f1b48Skochi	fetchadd4.rel	r8=[r32],-1
54473f1b48Skochi	br.ret.sptk	rp
5588855871SskrllEND(_atomic_dec_32_nv)
56473f1b48Skochi
576740bb54SchsENTRY(_atomic_dec_64_nv,1)
58473f1b48Skochi	fetchadd8.rel	r8=[r32],-1
59473f1b48Skochi	br.ret.sptk	rp
6088855871SskrllEND(_atomic_dec_64_nv)
61473f1b48Skochi
626740bb54SchsENTRY(_atomic_inc_32,1)
63473f1b48Skochi	fetchadd4.rel	r8=[r32],1
64473f1b48Skochi	br.ret.sptk	rp
6588855871SskrllEND(_atomic_inc_32)
66473f1b48Skochi
676740bb54SchsENTRY(_atomic_inc_64,1)
68473f1b48Skochi	fetchadd8.rel	r8=[r32],1
69473f1b48Skochi	br.ret.sptk	rp
7088855871SskrllEND(_atomic_inc_64)
71473f1b48Skochi
726740bb54SchsENTRY(_atomic_inc_32_nv,1)
73473f1b48Skochi	fetchadd4.rel	r8=[r32],1
74473f1b48Skochi	br.ret.sptk	rp
7588855871SskrllEND(_atomic_inc_32_nv)
76473f1b48Skochi
776740bb54SchsENTRY(_atomic_inc_64_nv,1)
78473f1b48Skochi	fetchadd8.rel	r8=[r32],1
79473f1b48Skochi	br.ret.sptk	rp
8088855871SskrllEND(_atomic_inc_64_nv)
81473f1b48Skochi
826740bb54SchsENTRY(_atomic_swap_32,2)
83473f1b48Skochi	xchg4		r8=[r32],r33
84473f1b48Skochi	;;
85473f1b48Skochi	mov		r33=r8
86473f1b48Skochi	br.ret.sptk	rp
8788855871SskrllEND(_atomic_swap_32)
88473f1b48Skochi
896740bb54SchsENTRY(_atomic_swap_64,2)
90473f1b48Skochi	xchg8		r8=[r32],r33
91473f1b48Skochi	;;
92473f1b48Skochi	mov		r33=r8
93473f1b48Skochi	br.ret.sptk	rp
9488855871SskrllEND(_atomic_swap_64)
95473f1b48Skochi
966740bb54SchsENTRY(_atomic_cas_32,3)
97473f1b48Skochi	mov		ar.ccv=r33
98473f1b48Skochi	;;
99473f1b48Skochi	cmpxchg4.acq	r8=[r32],r34,ar.ccv
100473f1b48Skochi	br.ret.sptk	rp
10188855871SskrllEND(_atomic_cas_32)
102473f1b48Skochi
1036740bb54SchsENTRY(_atomic_cas_64,3)
104473f1b48Skochi	mov		ar.ccv=r33
105473f1b48Skochi	;;
106473f1b48Skochi	cmpxchg8.acq	r8=[r32],r34,ar.ccv
107473f1b48Skochi	br.ret.sptk	rp
10888855871SskrllEND(_atomic_cas_64)
109473f1b48Skochi
1106740bb54SchsENTRY(_membar_consumer,0)
111473f1b48Skochi	mf
112473f1b48Skochi	br.ret.sptk	rp
11388855871SskrllEND(_membar_consumer)
114473f1b48Skochi
1156740bb54SchsENTRY(_membar_producer,0)
116473f1b48Skochi	mf
117473f1b48Skochi	br.ret.sptk	rp
11888855871SskrllEND(_membar_producer)
119473f1b48Skochi
120*4f8ce3b3SriastradhENTRY(_membar_acquire,0)
121*4f8ce3b3Sriastradh	mf
122*4f8ce3b3Sriastradh	br.ret.sptk	rp
123*4f8ce3b3SriastradhEND(_membar_acquire)
124*4f8ce3b3Sriastradh
125*4f8ce3b3SriastradhENTRY(_membar_release,0)
126*4f8ce3b3Sriastradh	mf
127*4f8ce3b3Sriastradh	br.ret.sptk	rp
128*4f8ce3b3SriastradhEND(_membar_release)
129*4f8ce3b3Sriastradh
1306740bb54SchsENTRY(_membar_enter,0)
131473f1b48Skochi	mf
132473f1b48Skochi	br.ret.sptk	rp
13388855871SskrllEND(_membar_enter)
134473f1b48Skochi
1356740bb54SchsENTRY(_membar_exit,0)
136473f1b48Skochi	mf
137473f1b48Skochi	br.ret.sptk	rp
13888855871SskrllEND(_membar_exit)
139473f1b48Skochi
1406740bb54SchsENTRY(_membar_sync,0)
141473f1b48Skochi	mf
142473f1b48Skochi	br.ret.sptk	rp
14388855871SskrllEND(_membar_sync)
144473f1b48Skochi
145473f1b48Skochi
146473f1b48SkochiALIAS(atomic_add_32,_atomic_add_32)
147473f1b48SkochiALIAS(atomic_add_int,_atomic_add_32)
148473f1b48SkochiALIAS(atomic_add_64,_atomic_add_64)
149473f1b48SkochiALIAS(atomic_add_long,_atomic_add_64)
150473f1b48SkochiALIAS(atomic_add_ptr,_atomic_add_64)
151473f1b48Skochi
152473f1b48SkochiALIAS(atomic_add_32_nv,_atomic_add_32_nv)
153473f1b48SkochiALIAS(atomic_add_int_nv,_atomic_add_32_nv)
154473f1b48SkochiALIAS(atomic_add_64_nv,_atomic_add_64_nv)
155473f1b48SkochiALIAS(atomic_add_long_nv,_atomic_add_64_nv)
156473f1b48SkochiALIAS(atomic_add_ptr_nv,_atomic_add_64_nv)
157473f1b48Skochi
158473f1b48SkochiALIAS(atomic_and_32,_atomic_and_32)
159473f1b48SkochiALIAS(atomic_and_uint,_atomic_and_32)
160473f1b48SkochiALIAS(atomic_and_64,_atomic_and_64)
161473f1b48SkochiALIAS(atomic_and_ulong,_atomic_and_64)
162473f1b48SkochiALIAS(atomic_and_ptr,_atomic_and_64)
163473f1b48Skochi
164473f1b48SkochiALIAS(atomic_and_32_nv,_atomic_and_32_nv)
165473f1b48SkochiALIAS(atomic_and_uint_nv,_atomic_and_32_nv)
166473f1b48SkochiALIAS(atomic_and_64_nv,_atomic_and_64_nv)
167473f1b48SkochiALIAS(atomic_and_ulong_nv,_atomic_and_64_nv)
168473f1b48SkochiALIAS(atomic_and_ptr_nv,_atomic_and_64_nv)
169473f1b48Skochi
170473f1b48SkochiALIAS(atomic_dec_32,_atomic_dec_32)
171473f1b48SkochiALIAS(atomic_dec_uint,_atomic_dec_32)
172473f1b48SkochiALIAS(atomic_dec_64,_atomic_dec_64)
173473f1b48SkochiALIAS(atomic_dec_ulong,_atomic_dec_64)
174473f1b48SkochiALIAS(atomic_dec_ptr,_atomic_dec_64)
175473f1b48Skochi
176473f1b48SkochiALIAS(atomic_dec_32_nv,_atomic_dec_32_nv)
177473f1b48SkochiALIAS(atomic_dec_uint_nv,_atomic_dec_32_nv)
178473f1b48SkochiALIAS(atomic_dec_64_nv,_atomic_dec_64_nv)
179473f1b48SkochiALIAS(atomic_dec_ulong_nv,_atomic_dec_64_nv)
180473f1b48SkochiALIAS(atomic_dec_ptr_nv,_atomic_dec_64_nv)
181473f1b48Skochi
182473f1b48SkochiALIAS(atomic_inc_32,_atomic_inc_32)
183473f1b48SkochiALIAS(atomic_inc_uint,_atomic_inc_32)
184473f1b48SkochiALIAS(atomic_inc_64,_atomic_inc_64)
185473f1b48SkochiALIAS(atomic_inc_ulong,_atomic_inc_64)
186473f1b48SkochiALIAS(atomic_inc_ptr,_atomic_inc_64)
187473f1b48Skochi
188473f1b48SkochiALIAS(atomic_inc_32_nv,_atomic_inc_32_nv)
189473f1b48SkochiALIAS(atomic_inc_uint_nv,_atomic_inc_32_nv)
190473f1b48SkochiALIAS(atomic_inc_64_nv,_atomic_inc_64_nv)
191473f1b48SkochiALIAS(atomic_inc_ulong_nv,_atomic_inc_64_nv)
192473f1b48SkochiALIAS(atomic_inc_ptr_nv,_atomic_inc_64_nv)
193473f1b48Skochi
194473f1b48SkochiALIAS(atomic_or_32,_atomic_or_32)
195473f1b48SkochiALIAS(atomic_or_uint,_atomic_or_32)
196473f1b48SkochiALIAS(atomic_or_64,_atomic_or_64)
197473f1b48SkochiALIAS(atomic_or_ulong,_atomic_or_64)
198473f1b48SkochiALIAS(atomic_or_ptr,_atomic_or_64)
199473f1b48Skochi
200473f1b48SkochiALIAS(atomic_or_32_nv,_atomic_or_32_nv)
201473f1b48SkochiALIAS(atomic_or_uint_nv,_atomic_or_32_nv)
202473f1b48SkochiALIAS(atomic_or_64_nv,_atomic_or_64_nv)
203473f1b48SkochiALIAS(atomic_or_ulong_nv,_atomic_or_64_nv)
204473f1b48SkochiALIAS(atomic_or_ptr_nv,_atomic_or_64_nv)
205473f1b48Skochi
206473f1b48SkochiALIAS(atomic_swap_32,_atomic_swap_32)
207473f1b48SkochiALIAS(atomic_swap_uint,_atomic_swap_32)
208473f1b48SkochiALIAS(atomic_swap_64,_atomic_swap_64)
209473f1b48SkochiALIAS(atomic_swap_ulong,_atomic_swap_64)
210473f1b48SkochiALIAS(atomic_swap_ptr,_atomic_swap_64)
211473f1b48Skochi
212473f1b48SkochiALIAS(atomic_cas_32,_atomic_cas_32)
213473f1b48SkochiALIAS(atomic_cas_uint,_atomic_cas_32)
214473f1b48SkochiALIAS(atomic_cas_64,_atomic_cas_64)
215473f1b48SkochiALIAS(atomic_cas_ulong,_atomic_cas_64)
216473f1b48SkochiALIAS(atomic_cas_ptr,_atomic_cas_64)
217473f1b48Skochi
2182ead1ed5SkochiALIAS(atomic_cas_32_ni,_atomic_cas_32)
2192ead1ed5SkochiALIAS(atomic_cas_uint_ni,_atomic_cas_32)
2202ead1ed5SkochiALIAS(atomic_cas_64_ni,_atomic_cas_64)
2212ead1ed5SkochiALIAS(atomic_cas_ulong_ni,_atomic_cas_64)
2222ead1ed5SkochiALIAS(atomic_cas_ptr_ni,_atomic_cas_64)
2232ead1ed5Skochi
224473f1b48SkochiALIAS(membar_consumer,_membar_consumer)
225473f1b48SkochiALIAS(membar_producer,_membar_producer)
226*4f8ce3b3SriastradhALIAS(membar_acquire,_membar_acquire)
227*4f8ce3b3SriastradhALIAS(membar_release,_membar_release)
228473f1b48SkochiALIAS(membar_enter,_membar_enter)
229473f1b48SkochiALIAS(membar_exit,_membar_exit)
230473f1b48SkochiALIAS(membar_sync,_membar_sync)
231473f1b48Skochi
232473f1b48SkochiSTRONG_ALIAS(_atomic_add_int,_atomic_add_32)
233473f1b48SkochiSTRONG_ALIAS(_atomic_add_long,_atomic_add_64)
234473f1b48SkochiSTRONG_ALIAS(_atomic_add_ptr,_atomic_add_64)
235473f1b48Skochi
236473f1b48SkochiSTRONG_ALIAS(_atomic_add_int_nv,_atomic_add_32_nv)
237473f1b48SkochiSTRONG_ALIAS(_atomic_add_long_nv,_atomic_add_64_nv)
238473f1b48SkochiSTRONG_ALIAS(_atomic_add_ptr_nv,_atomic_add_64_nv)
239473f1b48Skochi
240473f1b48SkochiSTRONG_ALIAS(_atomic_and_uint,_atomic_and_32)
241473f1b48SkochiSTRONG_ALIAS(_atomic_and_ulong,_atomic_and_64)
242473f1b48SkochiSTRONG_ALIAS(_atomic_and_ptr,_atomic_and_64)
243473f1b48Skochi
244473f1b48SkochiSTRONG_ALIAS(_atomic_and_uint_nv,_atomic_and_32_nv)
245473f1b48SkochiSTRONG_ALIAS(_atomic_and_ulong_nv,_atomic_and_64_nv)
246473f1b48SkochiSTRONG_ALIAS(_atomic_and_ptr_nv,_atomic_and_64_nv)
247473f1b48Skochi
248473f1b48SkochiSTRONG_ALIAS(_atomic_dec_uint,_atomic_dec_32)
249473f1b48SkochiSTRONG_ALIAS(_atomic_dec_ulong,_atomic_dec_64)
250473f1b48SkochiSTRONG_ALIAS(_atomic_dec_ptr,_atomic_dec_64)
251473f1b48Skochi
252473f1b48SkochiSTRONG_ALIAS(_atomic_dec_uint_nv,_atomic_dec_32_nv)
253473f1b48SkochiSTRONG_ALIAS(_atomic_dec_ulong_nv,_atomic_dec_64_nv)
254473f1b48SkochiSTRONG_ALIAS(_atomic_dec_ptr_nv,_atomic_dec_64_nv)
255473f1b48Skochi
256473f1b48SkochiSTRONG_ALIAS(_atomic_inc_uint,_atomic_inc_32)
257473f1b48SkochiSTRONG_ALIAS(_atomic_inc_ulong,_atomic_inc_64)
258473f1b48SkochiSTRONG_ALIAS(_atomic_inc_ptr,_atomic_inc_64)
259473f1b48Skochi
260473f1b48SkochiSTRONG_ALIAS(_atomic_inc_uint_nv,_atomic_inc_32_nv)
261473f1b48SkochiSTRONG_ALIAS(_atomic_inc_ulong_nv,_atomic_inc_64_nv)
262473f1b48SkochiSTRONG_ALIAS(_atomic_inc_ptr_nv,_atomic_inc_64_nv)
263473f1b48Skochi
264473f1b48SkochiSTRONG_ALIAS(_atomic_or_uint,_atomic_or_32)
265473f1b48SkochiSTRONG_ALIAS(_atomic_or_ulong,_atomic_or_64)
266473f1b48SkochiSTRONG_ALIAS(_atomic_or_ptr,_atomic_or_64)
267473f1b48Skochi
268473f1b48SkochiSTRONG_ALIAS(_atomic_or_uint_nv,_atomic_or_32_nv)
269473f1b48SkochiSTRONG_ALIAS(_atomic_or_ulong_nv,_atomic_or_64_nv)
270473f1b48SkochiSTRONG_ALIAS(_atomic_or_ptr_nv,_atomic_or_64_nv)
271473f1b48Skochi
272473f1b48SkochiSTRONG_ALIAS(_atomic_swap_uint,_atomic_swap_32)
273473f1b48SkochiSTRONG_ALIAS(_atomic_swap_ulong,_atomic_swap_64)
274473f1b48SkochiSTRONG_ALIAS(_atomic_swap_ptr,_atomic_swap_64)
275473f1b48Skochi
276473f1b48SkochiSTRONG_ALIAS(_atomic_cas_uint,_atomic_cas_32)
277473f1b48SkochiSTRONG_ALIAS(_atomic_cas_ulong,_atomic_cas_64)
278473f1b48SkochiSTRONG_ALIAS(_atomic_cas_ptr,_atomic_cas_64)
2792ead1ed5Skochi
2802ead1ed5SkochiSTRONG_ALIAS(_atomic_cas_uint_ni,_atomic_cas_32)
2812ead1ed5SkochiSTRONG_ALIAS(_atomic_cas_ulong_ni,_atomic_cas_64)
2822ead1ed5SkochiSTRONG_ALIAS(_atomic_cas_ptr_ni,_atomic_cas_64)
283