4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 .ident "%Z%%M% %I% %E% SMI"
31 #include <sys/asm_linkage.h>
35 * Legacy kernel interfaces; they will go away (eventually).
37 ANSI_PRAGMA_WEAK2(cas8,atomic_cas_8,function)
38 ANSI_PRAGMA_WEAK2(cas32,atomic_cas_32,function)
39 ANSI_PRAGMA_WEAK2(cas64,atomic_cas_64,function)
40 ANSI_PRAGMA_WEAK2(caslong,atomic_cas_ulong,function)
41 ANSI_PRAGMA_WEAK2(casptr,atomic_cas_ptr,function)
42 ANSI_PRAGMA_WEAK2(atomic_and_long,atomic_and_ulong,function)
43 ANSI_PRAGMA_WEAK2(atomic_or_long,atomic_or_ulong,function)
46 * Include the definitions for the libc weak aliases.
48 #include "../atomic_asm_weak.h"
52 ALTENTRY(atomic_inc_uchar)
56 SET_SIZE(atomic_inc_uchar)
57 SET_SIZE(atomic_inc_8)
60 ALTENTRY(atomic_inc_ushort)
64 SET_SIZE(atomic_inc_ushort)
65 SET_SIZE(atomic_inc_16)
68 ALTENTRY(atomic_inc_uint)
72 SET_SIZE(atomic_inc_uint)
73 SET_SIZE(atomic_inc_32)
76 ALTENTRY(atomic_inc_ulong)
80 SET_SIZE(atomic_inc_ulong)
81 SET_SIZE(atomic_inc_64)
83 ENTRY(atomic_inc_8_nv)
84 ALTENTRY(atomic_inc_uchar_nv)
93 SET_SIZE(atomic_inc_uchar_nv)
94 SET_SIZE(atomic_inc_8_nv)
96 ENTRY(atomic_inc_16_nv)
97 ALTENTRY(atomic_inc_ushort_nv)
106 SET_SIZE(atomic_inc_ushort_nv)
107 SET_SIZE(atomic_inc_16_nv)
109 ENTRY(atomic_inc_32_nv)
110 ALTENTRY(atomic_inc_uint_nv)
115 cmpxchgl %ecx, (%rdi)
119 SET_SIZE(atomic_inc_uint_nv)
120 SET_SIZE(atomic_inc_32_nv)
122 ENTRY(atomic_inc_64_nv)
123 ALTENTRY(atomic_inc_ulong_nv)
128 cmpxchgq %rcx, (%rdi)
132 SET_SIZE(atomic_inc_ulong_nv)
133 SET_SIZE(atomic_inc_64_nv)
136 ALTENTRY(atomic_dec_uchar)
140 SET_SIZE(atomic_dec_uchar)
141 SET_SIZE(atomic_dec_8)
144 ALTENTRY(atomic_dec_ushort)
148 SET_SIZE(atomic_dec_ushort)
149 SET_SIZE(atomic_dec_16)
152 ALTENTRY(atomic_dec_uint)
156 SET_SIZE(atomic_dec_uint)
157 SET_SIZE(atomic_dec_32)
160 ALTENTRY(atomic_dec_ulong)
164 SET_SIZE(atomic_dec_ulong)
165 SET_SIZE(atomic_dec_64)
167 ENTRY(atomic_dec_8_nv)
168 ALTENTRY(atomic_dec_uchar_nv)
177 SET_SIZE(atomic_dec_uchar_nv)
178 SET_SIZE(atomic_dec_8_nv)
180 ENTRY(atomic_dec_16_nv)
181 ALTENTRY(atomic_dec_ushort_nv)
190 SET_SIZE(atomic_dec_ushort_nv)
191 SET_SIZE(atomic_dec_16_nv)
193 ENTRY(atomic_dec_32_nv)
194 ALTENTRY(atomic_dec_uint_nv)
199 cmpxchgl %ecx, (%rdi)
203 SET_SIZE(atomic_dec_uint_nv)
204 SET_SIZE(atomic_dec_32_nv)
206 ENTRY(atomic_dec_64_nv)
207 ALTENTRY(atomic_dec_ulong_nv)
212 cmpxchgq %rcx, (%rdi)
216 SET_SIZE(atomic_dec_ulong_nv)
217 SET_SIZE(atomic_dec_64_nv)
220 ALTENTRY(atomic_add_char)
224 SET_SIZE(atomic_add_char)
225 SET_SIZE(atomic_add_8)
228 ALTENTRY(atomic_add_short)
232 SET_SIZE(atomic_add_short)
233 SET_SIZE(atomic_add_16)
236 ALTENTRY(atomic_add_int)
240 SET_SIZE(atomic_add_int)
241 SET_SIZE(atomic_add_32)
244 ALTENTRY(atomic_add_ptr)
245 ALTENTRY(atomic_add_long)
249 SET_SIZE(atomic_add_long)
250 SET_SIZE(atomic_add_ptr)
251 SET_SIZE(atomic_add_64)
254 ALTENTRY(atomic_or_uchar)
258 SET_SIZE(atomic_or_uchar)
259 SET_SIZE(atomic_or_8)
262 ALTENTRY(atomic_or_ushort)
266 SET_SIZE(atomic_or_ushort)
267 SET_SIZE(atomic_or_16)
270 ALTENTRY(atomic_or_uint)
274 SET_SIZE(atomic_or_uint)
275 SET_SIZE(atomic_or_32)
278 ALTENTRY(atomic_or_ulong)
282 SET_SIZE(atomic_or_ulong)
283 SET_SIZE(atomic_or_64)
286 ALTENTRY(atomic_and_uchar)
290 SET_SIZE(atomic_and_uchar)
291 SET_SIZE(atomic_and_8)
294 ALTENTRY(atomic_and_ushort)
298 SET_SIZE(atomic_and_ushort)
299 SET_SIZE(atomic_and_16)
302 ALTENTRY(atomic_and_uint)
306 SET_SIZE(atomic_and_uint)
307 SET_SIZE(atomic_and_32)
310 ALTENTRY(atomic_and_ulong)
314 SET_SIZE(atomic_and_ulong)
315 SET_SIZE(atomic_and_64)
317 ENTRY(atomic_add_8_nv)
318 ALTENTRY(atomic_add_char_nv)
328 SET_SIZE(atomic_add_char_nv)
329 SET_SIZE(atomic_add_8_nv)
331 ENTRY(atomic_add_16_nv)
332 ALTENTRY(atomic_add_short_nv)
342 SET_SIZE(atomic_add_short_nv)
343 SET_SIZE(atomic_add_16_nv)
345 ENTRY(atomic_add_32_nv)
346 ALTENTRY(atomic_add_int_nv)
352 cmpxchgl %ecx, (%rdi)
356 SET_SIZE(atomic_add_int_nv)
357 SET_SIZE(atomic_add_32_nv)
359 ENTRY(atomic_add_64_nv)
360 ALTENTRY(atomic_add_ptr_nv)
361 ALTENTRY(atomic_add_long_nv)
367 cmpxchgq %rcx, (%rdi)
371 SET_SIZE(atomic_add_long_nv)
372 SET_SIZE(atomic_add_ptr_nv)
373 SET_SIZE(atomic_add_64_nv)
375 ENTRY(atomic_and_8_nv)
376 ALTENTRY(atomic_and_uchar_nv)
386 SET_SIZE(atomic_and_uchar_nv)
387 SET_SIZE(atomic_and_8_nv)
389 ENTRY(atomic_and_16_nv)
390 ALTENTRY(atomic_and_ushort_nv)
400 SET_SIZE(atomic_and_ushort_nv)
401 SET_SIZE(atomic_and_16_nv)
403 ENTRY(atomic_and_32_nv)
404 ALTENTRY(atomic_and_uint_nv)
410 cmpxchgl %ecx, (%rdi)
414 SET_SIZE(atomic_and_uint_nv)
415 SET_SIZE(atomic_and_32_nv)
417 ENTRY(atomic_and_64_nv)
418 ALTENTRY(atomic_and_ulong_nv)
424 cmpxchgq %rcx, (%rdi)
428 SET_SIZE(atomic_and_ulong_nv)
429 SET_SIZE(atomic_and_64_nv)
431 ENTRY(atomic_or_8_nv)
432 ALTENTRY(atomic_or_uchar_nv)
442 SET_SIZE(atomic_and_uchar_nv)
443 SET_SIZE(atomic_and_8_nv)
445 ENTRY(atomic_or_16_nv)
446 ALTENTRY(atomic_or_ushort_nv)
456 SET_SIZE(atomic_or_ushort_nv)
457 SET_SIZE(atomic_or_16_nv)
459 ENTRY(atomic_or_32_nv)
460 ALTENTRY(atomic_or_uint_nv)
466 cmpxchgl %ecx, (%rdi)
470 SET_SIZE(atomic_or_uint_nv)
471 SET_SIZE(atomic_or_32_nv)
473 ENTRY(atomic_or_64_nv)
474 ALTENTRY(atomic_or_ulong_nv)
480 cmpxchgq %rcx, (%rdi)
484 SET_SIZE(atomic_or_ulong_nv)
485 SET_SIZE(atomic_or_64_nv)
488 ALTENTRY(atomic_cas_uchar)
493 SET_SIZE(atomic_cas_uchar)
494 SET_SIZE(atomic_cas_8)
497 ALTENTRY(atomic_cas_ushort)
502 SET_SIZE(atomic_cas_ushort)
503 SET_SIZE(atomic_cas_16)
506 ALTENTRY(atomic_cas_uint)
509 cmpxchgl %edx, (%rdi)
511 SET_SIZE(atomic_cas_uint)
512 SET_SIZE(atomic_cas_32)
515 ALTENTRY(atomic_cas_ulong)
516 ALTENTRY(atomic_cas_ptr)
519 cmpxchgq %rdx, (%rdi)
521 SET_SIZE(atomic_cas_ptr)
522 SET_SIZE(atomic_cas_ulong)
523 SET_SIZE(atomic_cas_64)
526 ALTENTRY(atomic_swap_uchar)
531 SET_SIZE(atomic_swap_uchar)
532 SET_SIZE(atomic_swap_8)
534 ENTRY(atomic_swap_16)
535 ALTENTRY(atomic_swap_ushort)
540 SET_SIZE(atomic_swap_ushort)
541 SET_SIZE(atomic_swap_16)
543 ENTRY(atomic_swap_32)
544 ALTENTRY(atomic_swap_uint)
549 SET_SIZE(atomic_swap_uint)
550 SET_SIZE(atomic_swap_32)
552 ENTRY(atomic_swap_64)
553 ALTENTRY(atomic_swap_ulong)
554 ALTENTRY(atomic_swap_ptr)
559 SET_SIZE(atomic_swap_ptr)
560 SET_SIZE(atomic_swap_ulong)
561 SET_SIZE(atomic_swap_64)
563 ENTRY(atomic_set_long_excl)
571 SET_SIZE(atomic_set_long_excl)
573 ENTRY(atomic_clear_long_excl)
581 SET_SIZE(atomic_clear_long_excl)
583 #if !defined(_KERNEL)
586 * NOTE: membar_enter, and membar_exit are identical routines.
587 * We define them separately, instead of using an ALTENTRY
588 * definitions to alias them together, so that DTrace and
589 * debuggers will see a unique address for them, allowing
590 * more accurate tracing.
596 SET_SIZE(membar_enter)
601 SET_SIZE(membar_exit)
603 ENTRY(membar_producer)
606 SET_SIZE(membar_producer)
608 ENTRY(membar_consumer)
611 SET_SIZE(membar_consumer)
613 #endif /* !_KERNEL */
616 .section .note.GNU-stack,"",%progbits