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 <ia32/sys/asm_linkage.h>
34 ALTENTRY(atomic_inc_uchar)
39 SET_SIZE(atomic_inc_uchar)
40 SET_SIZE(atomic_inc_8)
43 ALTENTRY(atomic_inc_ushort)
48 SET_SIZE(atomic_inc_ushort)
49 SET_SIZE(atomic_inc_16)
52 ALTENTRY(atomic_inc_uint)
53 ALTENTRY(atomic_inc_ulong)
58 SET_SIZE(atomic_inc_ulong)
59 SET_SIZE(atomic_inc_uint)
60 SET_SIZE(atomic_inc_32)
62 ENTRY(atomic_inc_8_nv)
63 ALTENTRY(atomic_inc_uchar_nv)
73 SET_SIZE(atomic_inc_uchar_nv)
74 SET_SIZE(atomic_inc_8_nv)
76 ENTRY(atomic_inc_16_nv)
77 ALTENTRY(atomic_inc_ushort_nv)
87 SET_SIZE(atomic_inc_ushort_nv)
88 SET_SIZE(atomic_inc_16_nv)
90 ENTRY(atomic_inc_32_nv)
91 ALTENTRY(atomic_inc_uint_nv)
92 ALTENTRY(atomic_inc_ulong_nv)
102 SET_SIZE(atomic_inc_ulong_nv)
103 SET_SIZE(atomic_inc_uint_nv)
104 SET_SIZE(atomic_inc_32_nv)
107 * NOTE: If atomic_inc_64 and atomic_inc_64_nv are ever
108 * separated, you need to also edit the libc i386 platform
109 * specific mapfile and remove the NODYNSORT attribute
110 * from atomic_inc_64_nv.
113 ALTENTRY(atomic_inc_64_nv)
133 SET_SIZE(atomic_inc_64_nv)
134 SET_SIZE(atomic_inc_64)
137 ALTENTRY(atomic_dec_uchar)
142 SET_SIZE(atomic_dec_uchar)
143 SET_SIZE(atomic_dec_8)
146 ALTENTRY(atomic_dec_ushort)
151 SET_SIZE(atomic_dec_ushort)
152 SET_SIZE(atomic_dec_16)
155 ALTENTRY(atomic_dec_uint)
156 ALTENTRY(atomic_dec_ulong)
161 SET_SIZE(atomic_dec_ulong)
162 SET_SIZE(atomic_dec_uint)
163 SET_SIZE(atomic_dec_32)
165 ENTRY(atomic_dec_8_nv)
166 ALTENTRY(atomic_dec_uchar_nv)
176 SET_SIZE(atomic_dec_uchar_nv)
177 SET_SIZE(atomic_dec_8_nv)
179 ENTRY(atomic_dec_16_nv)
180 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)
195 ALTENTRY(atomic_dec_ulong_nv)
201 cmpxchgl %ecx, (%edx)
205 SET_SIZE(atomic_dec_ulong_nv)
206 SET_SIZE(atomic_dec_uint_nv)
207 SET_SIZE(atomic_dec_32_nv)
210 * NOTE: If atomic_dec_64 and atomic_dec_64_nv are ever
211 * separated, it is important to edit the libc i386 platform
212 * specific mapfile and remove the NODYNSORT attribute
213 * from atomic_dec_64_nv.
216 ALTENTRY(atomic_dec_64_nv)
237 SET_SIZE(atomic_dec_64_nv)
238 SET_SIZE(atomic_dec_64)
241 ALTENTRY(atomic_add_char)
247 SET_SIZE(atomic_add_char)
248 SET_SIZE(atomic_add_8)
251 ALTENTRY(atomic_add_short)
257 SET_SIZE(atomic_add_short)
258 SET_SIZE(atomic_add_16)
261 ALTENTRY(atomic_add_int)
262 ALTENTRY(atomic_add_ptr)
263 ALTENTRY(atomic_add_long)
269 SET_SIZE(atomic_add_long)
270 SET_SIZE(atomic_add_ptr)
271 SET_SIZE(atomic_add_int)
272 SET_SIZE(atomic_add_32)
275 ALTENTRY(atomic_sub_char)
281 SET_SIZE(atomic_sub_char)
282 SET_SIZE(atomic_sub_8)
285 ALTENTRY(atomic_sub_short)
291 SET_SIZE(atomic_sub_short)
292 SET_SIZE(atomic_sub_16)
295 ALTENTRY(atomic_sub_int)
296 ALTENTRY(atomic_sub_ptr)
297 ALTENTRY(atomic_sub_long)
303 SET_SIZE(atomic_sub_long)
304 SET_SIZE(atomic_sub_ptr)
305 SET_SIZE(atomic_sub_int)
306 SET_SIZE(atomic_sub_32)
309 ALTENTRY(atomic_or_uchar)
315 SET_SIZE(atomic_or_uchar)
316 SET_SIZE(atomic_or_8)
319 ALTENTRY(atomic_or_ushort)
325 SET_SIZE(atomic_or_ushort)
326 SET_SIZE(atomic_or_16)
329 ALTENTRY(atomic_or_uint)
330 ALTENTRY(atomic_or_ulong)
336 SET_SIZE(atomic_or_ulong)
337 SET_SIZE(atomic_or_uint)
338 SET_SIZE(atomic_or_32)
341 ALTENTRY(atomic_and_uchar)
347 SET_SIZE(atomic_and_uchar)
348 SET_SIZE(atomic_and_8)
351 ALTENTRY(atomic_and_ushort)
357 SET_SIZE(atomic_and_ushort)
358 SET_SIZE(atomic_and_16)
361 ALTENTRY(atomic_and_uint)
362 ALTENTRY(atomic_and_ulong)
368 SET_SIZE(atomic_and_ulong)
369 SET_SIZE(atomic_and_uint)
370 SET_SIZE(atomic_and_32)
372 ENTRY(atomic_add_8_nv)
373 ALTENTRY(atomic_add_char_nv)
384 SET_SIZE(atomic_add_char_nv)
385 SET_SIZE(atomic_add_8_nv)
387 ENTRY(atomic_add_16_nv)
388 ALTENTRY(atomic_add_short_nv)
399 SET_SIZE(atomic_add_short_nv)
400 SET_SIZE(atomic_add_16_nv)
402 ENTRY(atomic_add_32_nv)
403 ALTENTRY(atomic_add_int_nv)
404 ALTENTRY(atomic_add_ptr_nv)
405 ALTENTRY(atomic_add_long_nv)
412 cmpxchgl %ecx, (%edx)
416 SET_SIZE(atomic_add_long_nv)
417 SET_SIZE(atomic_add_ptr_nv)
418 SET_SIZE(atomic_add_int_nv)
419 SET_SIZE(atomic_add_32_nv)
421 ENTRY(atomic_sub_8_nv)
422 ALTENTRY(atomic_sub_char_nv)
433 SET_SIZE(atomic_sub_char_nv)
434 SET_SIZE(atomic_sub_8_nv)
436 ENTRY(atomic_sub_16_nv)
437 ALTENTRY(atomic_sub_short_nv)
448 SET_SIZE(atomic_sub_short_nv)
449 SET_SIZE(atomic_sub_16_nv)
451 ENTRY(atomic_sub_32_nv)
452 ALTENTRY(atomic_sub_int_nv)
453 ALTENTRY(atomic_sub_ptr_nv)
454 ALTENTRY(atomic_sub_long_nv)
461 cmpxchgl %ecx, (%edx)
465 SET_SIZE(atomic_sub_long_nv)
466 SET_SIZE(atomic_sub_ptr_nv)
467 SET_SIZE(atomic_sub_int_nv)
468 SET_SIZE(atomic_sub_32_nv)
471 * NOTE: If atomic_add_64 and atomic_add_64_nv are ever
472 * separated, it is important to edit the libc i386 platform
473 * specific mapfile and remove the NODYNSORT attribute
474 * from atomic_add_64_nv.
477 ALTENTRY(atomic_add_64_nv)
496 SET_SIZE(atomic_add_64_nv)
497 SET_SIZE(atomic_add_64)
500 ALTENTRY(atomic_sub_64_nv)
519 SET_SIZE(atomic_sub_64_nv)
520 SET_SIZE(atomic_sub_64)
522 ENTRY(atomic_or_8_nv)
523 ALTENTRY(atomic_or_uchar_nv)
534 SET_SIZE(atomic_or_uchar_nv)
535 SET_SIZE(atomic_or_8_nv)
537 ENTRY(atomic_or_16_nv)
538 ALTENTRY(atomic_or_ushort_nv)
549 SET_SIZE(atomic_or_ushort_nv)
550 SET_SIZE(atomic_or_16_nv)
552 ENTRY(atomic_or_32_nv)
553 ALTENTRY(atomic_or_uint_nv)
554 ALTENTRY(atomic_or_ulong_nv)
561 cmpxchgl %ecx, (%edx)
565 SET_SIZE(atomic_or_ulong_nv)
566 SET_SIZE(atomic_or_uint_nv)
567 SET_SIZE(atomic_or_32_nv)
570 * NOTE: If atomic_or_64 and atomic_or_64_nv are ever
571 * separated, it is important to edit the libc i386 platform
572 * specific mapfile and remove the NODYNSORT attribute
573 * from atomic_or_64_nv.
576 ALTENTRY(atomic_or_64_nv)
595 SET_SIZE(atomic_or_64_nv)
596 SET_SIZE(atomic_or_64)
598 ENTRY(atomic_and_8_nv)
599 ALTENTRY(atomic_and_uchar_nv)
610 SET_SIZE(atomic_and_uchar_nv)
611 SET_SIZE(atomic_and_8_nv)
613 ENTRY(atomic_and_16_nv)
614 ALTENTRY(atomic_and_ushort_nv)
625 SET_SIZE(atomic_and_ushort_nv)
626 SET_SIZE(atomic_and_16_nv)
628 ENTRY(atomic_and_32_nv)
629 ALTENTRY(atomic_and_uint_nv)
630 ALTENTRY(atomic_and_ulong_nv)
637 cmpxchgl %ecx, (%edx)
641 SET_SIZE(atomic_and_ulong_nv)
642 SET_SIZE(atomic_and_uint_nv)
643 SET_SIZE(atomic_and_32_nv)
646 * NOTE: If atomic_and_64 and atomic_and_64_nv are ever
647 * separated, it is important to edit the libc i386 platform
648 * specific mapfile and remove the NODYNSORT attribute
649 * from atomic_and_64_nv.
652 ALTENTRY(atomic_and_64_nv)
671 SET_SIZE(atomic_and_64_nv)
672 SET_SIZE(atomic_and_64)
675 ALTENTRY(atomic_cas_uchar)
682 SET_SIZE(atomic_cas_uchar)
683 SET_SIZE(atomic_cas_8)
686 ALTENTRY(atomic_cas_ushort)
693 SET_SIZE(atomic_cas_ushort)
694 SET_SIZE(atomic_cas_16)
697 ALTENTRY(atomic_cas_uint)
698 ALTENTRY(atomic_cas_ulong)
699 ALTENTRY(atomic_cas_ptr)
704 cmpxchgl %ecx, (%edx)
706 SET_SIZE(atomic_cas_ptr)
707 SET_SIZE(atomic_cas_ulong)
708 SET_SIZE(atomic_cas_uint)
709 SET_SIZE(atomic_cas_32)
724 SET_SIZE(atomic_cas_64)
727 ALTENTRY(atomic_swap_uchar)
733 SET_SIZE(atomic_swap_uchar)
734 SET_SIZE(atomic_swap_8)
736 ENTRY(atomic_swap_16)
737 ALTENTRY(atomic_swap_ushort)
743 SET_SIZE(atomic_swap_ushort)
744 SET_SIZE(atomic_swap_16)
746 ENTRY(atomic_swap_32)
747 ALTENTRY(atomic_swap_uint)
748 ALTENTRY(atomic_swap_ptr)
749 ALTENTRY(atomic_swap_ulong)
755 SET_SIZE(atomic_swap_ulong)
756 SET_SIZE(atomic_swap_ptr)
757 SET_SIZE(atomic_swap_uint)
758 SET_SIZE(atomic_swap_32)
760 ENTRY(atomic_swap_64)
775 SET_SIZE(atomic_swap_64)
777 ENTRY(atomic_set_long_excl)
787 SET_SIZE(atomic_set_long_excl)
789 ENTRY(atomic_clear_long_excl)
799 SET_SIZE(atomic_clear_long_excl)
802 * NOTE: membar_enter, membar_exit, membar_producer, and
803 * membar_consumer are all identical routines. We define them
804 * separately, instead of using ALTENTRY definitions to alias them
805 * together, so that DTrace and debuggers will see a unique address
806 * for them, allowing more accurate tracing.
814 SET_SIZE(membar_enter)
820 SET_SIZE(membar_exit)
822 ENTRY(membar_producer)
826 SET_SIZE(membar_producer)
828 ENTRY(membar_consumer)
832 SET_SIZE(membar_consumer)
835 .section .note.GNU-stack,"",%progbits