xref: /netbsd-src/common/lib/libc/arch/ia64/atomic/atomic.S (revision aef5eb5f59cdfe8314f1b5f78ac04eb144e44010)
1/*	$NetBSD: atomic.S,v 1.7 2022/04/09 23:32:51 riastradh 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_acquire,0)
121	mf
122	br.ret.sptk	rp
123END(_membar_acquire)
124
125ENTRY(_membar_release,0)
126	mf
127	br.ret.sptk	rp
128END(_membar_release)
129
130ENTRY(_membar_enter,0)
131	mf
132	br.ret.sptk	rp
133END(_membar_enter)
134
135ENTRY(_membar_exit,0)
136	mf
137	br.ret.sptk	rp
138END(_membar_exit)
139
140ENTRY(_membar_sync,0)
141	mf
142	br.ret.sptk	rp
143END(_membar_sync)
144
145
146ALIAS(atomic_add_32,_atomic_add_32)
147ALIAS(atomic_add_int,_atomic_add_32)
148ALIAS(atomic_add_64,_atomic_add_64)
149ALIAS(atomic_add_long,_atomic_add_64)
150ALIAS(atomic_add_ptr,_atomic_add_64)
151
152ALIAS(atomic_add_32_nv,_atomic_add_32_nv)
153ALIAS(atomic_add_int_nv,_atomic_add_32_nv)
154ALIAS(atomic_add_64_nv,_atomic_add_64_nv)
155ALIAS(atomic_add_long_nv,_atomic_add_64_nv)
156ALIAS(atomic_add_ptr_nv,_atomic_add_64_nv)
157
158ALIAS(atomic_and_32,_atomic_and_32)
159ALIAS(atomic_and_uint,_atomic_and_32)
160ALIAS(atomic_and_64,_atomic_and_64)
161ALIAS(atomic_and_ulong,_atomic_and_64)
162ALIAS(atomic_and_ptr,_atomic_and_64)
163
164ALIAS(atomic_and_32_nv,_atomic_and_32_nv)
165ALIAS(atomic_and_uint_nv,_atomic_and_32_nv)
166ALIAS(atomic_and_64_nv,_atomic_and_64_nv)
167ALIAS(atomic_and_ulong_nv,_atomic_and_64_nv)
168ALIAS(atomic_and_ptr_nv,_atomic_and_64_nv)
169
170ALIAS(atomic_dec_32,_atomic_dec_32)
171ALIAS(atomic_dec_uint,_atomic_dec_32)
172ALIAS(atomic_dec_64,_atomic_dec_64)
173ALIAS(atomic_dec_ulong,_atomic_dec_64)
174ALIAS(atomic_dec_ptr,_atomic_dec_64)
175
176ALIAS(atomic_dec_32_nv,_atomic_dec_32_nv)
177ALIAS(atomic_dec_uint_nv,_atomic_dec_32_nv)
178ALIAS(atomic_dec_64_nv,_atomic_dec_64_nv)
179ALIAS(atomic_dec_ulong_nv,_atomic_dec_64_nv)
180ALIAS(atomic_dec_ptr_nv,_atomic_dec_64_nv)
181
182ALIAS(atomic_inc_32,_atomic_inc_32)
183ALIAS(atomic_inc_uint,_atomic_inc_32)
184ALIAS(atomic_inc_64,_atomic_inc_64)
185ALIAS(atomic_inc_ulong,_atomic_inc_64)
186ALIAS(atomic_inc_ptr,_atomic_inc_64)
187
188ALIAS(atomic_inc_32_nv,_atomic_inc_32_nv)
189ALIAS(atomic_inc_uint_nv,_atomic_inc_32_nv)
190ALIAS(atomic_inc_64_nv,_atomic_inc_64_nv)
191ALIAS(atomic_inc_ulong_nv,_atomic_inc_64_nv)
192ALIAS(atomic_inc_ptr_nv,_atomic_inc_64_nv)
193
194ALIAS(atomic_or_32,_atomic_or_32)
195ALIAS(atomic_or_uint,_atomic_or_32)
196ALIAS(atomic_or_64,_atomic_or_64)
197ALIAS(atomic_or_ulong,_atomic_or_64)
198ALIAS(atomic_or_ptr,_atomic_or_64)
199
200ALIAS(atomic_or_32_nv,_atomic_or_32_nv)
201ALIAS(atomic_or_uint_nv,_atomic_or_32_nv)
202ALIAS(atomic_or_64_nv,_atomic_or_64_nv)
203ALIAS(atomic_or_ulong_nv,_atomic_or_64_nv)
204ALIAS(atomic_or_ptr_nv,_atomic_or_64_nv)
205
206ALIAS(atomic_swap_32,_atomic_swap_32)
207ALIAS(atomic_swap_uint,_atomic_swap_32)
208ALIAS(atomic_swap_64,_atomic_swap_64)
209ALIAS(atomic_swap_ulong,_atomic_swap_64)
210ALIAS(atomic_swap_ptr,_atomic_swap_64)
211
212ALIAS(atomic_cas_32,_atomic_cas_32)
213ALIAS(atomic_cas_uint,_atomic_cas_32)
214ALIAS(atomic_cas_64,_atomic_cas_64)
215ALIAS(atomic_cas_ulong,_atomic_cas_64)
216ALIAS(atomic_cas_ptr,_atomic_cas_64)
217
218ALIAS(atomic_cas_32_ni,_atomic_cas_32)
219ALIAS(atomic_cas_uint_ni,_atomic_cas_32)
220ALIAS(atomic_cas_64_ni,_atomic_cas_64)
221ALIAS(atomic_cas_ulong_ni,_atomic_cas_64)
222ALIAS(atomic_cas_ptr_ni,_atomic_cas_64)
223
224ALIAS(membar_consumer,_membar_consumer)
225ALIAS(membar_producer,_membar_producer)
226ALIAS(membar_acquire,_membar_acquire)
227ALIAS(membar_release,_membar_release)
228ALIAS(membar_enter,_membar_enter)
229ALIAS(membar_exit,_membar_exit)
230ALIAS(membar_sync,_membar_sync)
231
232STRONG_ALIAS(_atomic_add_int,_atomic_add_32)
233STRONG_ALIAS(_atomic_add_long,_atomic_add_64)
234STRONG_ALIAS(_atomic_add_ptr,_atomic_add_64)
235
236STRONG_ALIAS(_atomic_add_int_nv,_atomic_add_32_nv)
237STRONG_ALIAS(_atomic_add_long_nv,_atomic_add_64_nv)
238STRONG_ALIAS(_atomic_add_ptr_nv,_atomic_add_64_nv)
239
240STRONG_ALIAS(_atomic_and_uint,_atomic_and_32)
241STRONG_ALIAS(_atomic_and_ulong,_atomic_and_64)
242STRONG_ALIAS(_atomic_and_ptr,_atomic_and_64)
243
244STRONG_ALIAS(_atomic_and_uint_nv,_atomic_and_32_nv)
245STRONG_ALIAS(_atomic_and_ulong_nv,_atomic_and_64_nv)
246STRONG_ALIAS(_atomic_and_ptr_nv,_atomic_and_64_nv)
247
248STRONG_ALIAS(_atomic_dec_uint,_atomic_dec_32)
249STRONG_ALIAS(_atomic_dec_ulong,_atomic_dec_64)
250STRONG_ALIAS(_atomic_dec_ptr,_atomic_dec_64)
251
252STRONG_ALIAS(_atomic_dec_uint_nv,_atomic_dec_32_nv)
253STRONG_ALIAS(_atomic_dec_ulong_nv,_atomic_dec_64_nv)
254STRONG_ALIAS(_atomic_dec_ptr_nv,_atomic_dec_64_nv)
255
256STRONG_ALIAS(_atomic_inc_uint,_atomic_inc_32)
257STRONG_ALIAS(_atomic_inc_ulong,_atomic_inc_64)
258STRONG_ALIAS(_atomic_inc_ptr,_atomic_inc_64)
259
260STRONG_ALIAS(_atomic_inc_uint_nv,_atomic_inc_32_nv)
261STRONG_ALIAS(_atomic_inc_ulong_nv,_atomic_inc_64_nv)
262STRONG_ALIAS(_atomic_inc_ptr_nv,_atomic_inc_64_nv)
263
264STRONG_ALIAS(_atomic_or_uint,_atomic_or_32)
265STRONG_ALIAS(_atomic_or_ulong,_atomic_or_64)
266STRONG_ALIAS(_atomic_or_ptr,_atomic_or_64)
267
268STRONG_ALIAS(_atomic_or_uint_nv,_atomic_or_32_nv)
269STRONG_ALIAS(_atomic_or_ulong_nv,_atomic_or_64_nv)
270STRONG_ALIAS(_atomic_or_ptr_nv,_atomic_or_64_nv)
271
272STRONG_ALIAS(_atomic_swap_uint,_atomic_swap_32)
273STRONG_ALIAS(_atomic_swap_ulong,_atomic_swap_64)
274STRONG_ALIAS(_atomic_swap_ptr,_atomic_swap_64)
275
276STRONG_ALIAS(_atomic_cas_uint,_atomic_cas_32)
277STRONG_ALIAS(_atomic_cas_ulong,_atomic_cas_64)
278STRONG_ALIAS(_atomic_cas_ptr,_atomic_cas_64)
279
280STRONG_ALIAS(_atomic_cas_uint_ni,_atomic_cas_32)
281STRONG_ALIAS(_atomic_cas_ulong_ni,_atomic_cas_64)
282STRONG_ALIAS(_atomic_cas_ptr_ni,_atomic_cas_64)
283