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"
32 #include <ia32/sys/asm_linkage.h>
34 #include <machine/asmacros.h>
38 ALTENTRY(atomic_inc_uchar)
43 SET_SIZE(atomic_inc_uchar)
44 SET_SIZE(atomic_inc_8)
47 ALTENTRY(atomic_inc_ushort)
52 SET_SIZE(atomic_inc_ushort)
53 SET_SIZE(atomic_inc_16)
56 ALTENTRY(atomic_inc_uint)
57 ALTENTRY(atomic_inc_ulong)
62 SET_SIZE(atomic_inc_ulong)
63 SET_SIZE(atomic_inc_uint)
64 SET_SIZE(atomic_inc_32)
66 ENTRY(atomic_inc_8_nv)
67 ALTENTRY(atomic_inc_uchar_nv)
77 SET_SIZE(atomic_inc_uchar_nv)
78 SET_SIZE(atomic_inc_8_nv)
80 ENTRY(atomic_inc_16_nv)
81 ALTENTRY(atomic_inc_ushort_nv)
91 SET_SIZE(atomic_inc_ushort_nv)
92 SET_SIZE(atomic_inc_16_nv)
94 ENTRY(atomic_inc_32_nv)
95 ALTENTRY(atomic_inc_uint_nv)
96 ALTENTRY(atomic_inc_ulong_nv)
102 cmpxchgl %ecx, (%edx)
106 SET_SIZE(atomic_inc_ulong_nv)
107 SET_SIZE(atomic_inc_uint_nv)
108 SET_SIZE(atomic_inc_32_nv)
111 * NOTE: If atomic_inc_64 and atomic_inc_64_nv are ever
112 * separated, you need to also edit the libc i386 platform
113 * specific mapfile and remove the NODYNSORT attribute
114 * from atomic_inc_64_nv.
117 ALTENTRY(atomic_inc_64_nv)
137 SET_SIZE(atomic_inc_64_nv)
138 SET_SIZE(atomic_inc_64)
141 ALTENTRY(atomic_dec_uchar)
146 SET_SIZE(atomic_dec_uchar)
147 SET_SIZE(atomic_dec_8)
150 ALTENTRY(atomic_dec_ushort)
155 SET_SIZE(atomic_dec_ushort)
156 SET_SIZE(atomic_dec_16)
159 ALTENTRY(atomic_dec_uint)
160 ALTENTRY(atomic_dec_ulong)
165 SET_SIZE(atomic_dec_ulong)
166 SET_SIZE(atomic_dec_uint)
167 SET_SIZE(atomic_dec_32)
169 ENTRY(atomic_dec_8_nv)
170 ALTENTRY(atomic_dec_uchar_nv)
180 SET_SIZE(atomic_dec_uchar_nv)
181 SET_SIZE(atomic_dec_8_nv)
183 ENTRY(atomic_dec_16_nv)
184 ALTENTRY(atomic_dec_ushort_nv)
194 SET_SIZE(atomic_dec_ushort_nv)
195 SET_SIZE(atomic_dec_16_nv)
197 ENTRY(atomic_dec_32_nv)
198 ALTENTRY(atomic_dec_uint_nv)
199 ALTENTRY(atomic_dec_ulong_nv)
205 cmpxchgl %ecx, (%edx)
209 SET_SIZE(atomic_dec_ulong_nv)
210 SET_SIZE(atomic_dec_uint_nv)
211 SET_SIZE(atomic_dec_32_nv)
214 * NOTE: If atomic_dec_64 and atomic_dec_64_nv are ever
215 * separated, it is important to edit the libc i386 platform
216 * specific mapfile and remove the NODYNSORT attribute
217 * from atomic_dec_64_nv.
220 ALTENTRY(atomic_dec_64_nv)
241 SET_SIZE(atomic_dec_64_nv)
242 SET_SIZE(atomic_dec_64)
245 ALTENTRY(atomic_add_char)
251 SET_SIZE(atomic_add_char)
252 SET_SIZE(atomic_add_8)
255 ALTENTRY(atomic_add_short)
261 SET_SIZE(atomic_add_short)
262 SET_SIZE(atomic_add_16)
265 ALTENTRY(atomic_add_int)
266 ALTENTRY(atomic_add_ptr)
267 ALTENTRY(atomic_add_long)
273 SET_SIZE(atomic_add_long)
274 SET_SIZE(atomic_add_ptr)
275 SET_SIZE(atomic_add_int)
276 SET_SIZE(atomic_add_32)
279 ALTENTRY(atomic_sub_char)
285 SET_SIZE(atomic_sub_char)
286 SET_SIZE(atomic_sub_8)
289 ALTENTRY(atomic_sub_short)
295 SET_SIZE(atomic_sub_short)
296 SET_SIZE(atomic_sub_16)
299 ALTENTRY(atomic_sub_int)
300 ALTENTRY(atomic_sub_ptr)
301 ALTENTRY(atomic_sub_long)
307 SET_SIZE(atomic_sub_long)
308 SET_SIZE(atomic_sub_ptr)
309 SET_SIZE(atomic_sub_int)
310 SET_SIZE(atomic_sub_32)
313 ALTENTRY(atomic_or_uchar)
319 SET_SIZE(atomic_or_uchar)
320 SET_SIZE(atomic_or_8)
323 ALTENTRY(atomic_or_ushort)
329 SET_SIZE(atomic_or_ushort)
330 SET_SIZE(atomic_or_16)
333 ALTENTRY(atomic_or_uint)
334 ALTENTRY(atomic_or_ulong)
340 SET_SIZE(atomic_or_ulong)
341 SET_SIZE(atomic_or_uint)
342 SET_SIZE(atomic_or_32)
345 ALTENTRY(atomic_and_uchar)
351 SET_SIZE(atomic_and_uchar)
352 SET_SIZE(atomic_and_8)
355 ALTENTRY(atomic_and_ushort)
361 SET_SIZE(atomic_and_ushort)
362 SET_SIZE(atomic_and_16)
365 ALTENTRY(atomic_and_uint)
366 ALTENTRY(atomic_and_ulong)
372 SET_SIZE(atomic_and_ulong)
373 SET_SIZE(atomic_and_uint)
374 SET_SIZE(atomic_and_32)
376 ENTRY(atomic_add_8_nv)
377 ALTENTRY(atomic_add_char_nv)
388 SET_SIZE(atomic_add_char_nv)
389 SET_SIZE(atomic_add_8_nv)
391 ENTRY(atomic_add_16_nv)
392 ALTENTRY(atomic_add_short_nv)
403 SET_SIZE(atomic_add_short_nv)
404 SET_SIZE(atomic_add_16_nv)
406 ENTRY(atomic_add_32_nv)
407 ALTENTRY(atomic_add_int_nv)
408 ALTENTRY(atomic_add_ptr_nv)
409 ALTENTRY(atomic_add_long_nv)
416 cmpxchgl %ecx, (%edx)
420 SET_SIZE(atomic_add_long_nv)
421 SET_SIZE(atomic_add_ptr_nv)
422 SET_SIZE(atomic_add_int_nv)
423 SET_SIZE(atomic_add_32_nv)
425 ENTRY(atomic_sub_8_nv)
426 ALTENTRY(atomic_sub_char_nv)
437 SET_SIZE(atomic_sub_char_nv)
438 SET_SIZE(atomic_sub_8_nv)
440 ENTRY(atomic_sub_16_nv)
441 ALTENTRY(atomic_sub_short_nv)
452 SET_SIZE(atomic_sub_short_nv)
453 SET_SIZE(atomic_sub_16_nv)
455 ENTRY(atomic_sub_32_nv)
456 ALTENTRY(atomic_sub_int_nv)
457 ALTENTRY(atomic_sub_ptr_nv)
458 ALTENTRY(atomic_sub_long_nv)
465 cmpxchgl %ecx, (%edx)
469 SET_SIZE(atomic_sub_long_nv)
470 SET_SIZE(atomic_sub_ptr_nv)
471 SET_SIZE(atomic_sub_int_nv)
472 SET_SIZE(atomic_sub_32_nv)
475 * NOTE: If atomic_add_64 and atomic_add_64_nv are ever
476 * separated, it is important to edit the libc i386 platform
477 * specific mapfile and remove the NODYNSORT attribute
478 * from atomic_add_64_nv.
481 ALTENTRY(atomic_add_64_nv)
500 SET_SIZE(atomic_add_64_nv)
501 SET_SIZE(atomic_add_64)
504 ALTENTRY(atomic_sub_64_nv)
523 SET_SIZE(atomic_sub_64_nv)
524 SET_SIZE(atomic_sub_64)
526 ENTRY(atomic_or_8_nv)
527 ALTENTRY(atomic_or_uchar_nv)
538 SET_SIZE(atomic_or_uchar_nv)
539 SET_SIZE(atomic_or_8_nv)
541 ENTRY(atomic_or_16_nv)
542 ALTENTRY(atomic_or_ushort_nv)
553 SET_SIZE(atomic_or_ushort_nv)
554 SET_SIZE(atomic_or_16_nv)
556 ENTRY(atomic_or_32_nv)
557 ALTENTRY(atomic_or_uint_nv)
558 ALTENTRY(atomic_or_ulong_nv)
565 cmpxchgl %ecx, (%edx)
569 SET_SIZE(atomic_or_ulong_nv)
570 SET_SIZE(atomic_or_uint_nv)
571 SET_SIZE(atomic_or_32_nv)
574 * NOTE: If atomic_or_64 and atomic_or_64_nv are ever
575 * separated, it is important to edit the libc i386 platform
576 * specific mapfile and remove the NODYNSORT attribute
577 * from atomic_or_64_nv.
580 ALTENTRY(atomic_or_64_nv)
599 SET_SIZE(atomic_or_64_nv)
600 SET_SIZE(atomic_or_64)
602 ENTRY(atomic_and_8_nv)
603 ALTENTRY(atomic_and_uchar_nv)
614 SET_SIZE(atomic_and_uchar_nv)
615 SET_SIZE(atomic_and_8_nv)
617 ENTRY(atomic_and_16_nv)
618 ALTENTRY(atomic_and_ushort_nv)
629 SET_SIZE(atomic_and_ushort_nv)
630 SET_SIZE(atomic_and_16_nv)
632 ENTRY(atomic_and_32_nv)
633 ALTENTRY(atomic_and_uint_nv)
634 ALTENTRY(atomic_and_ulong_nv)
641 cmpxchgl %ecx, (%edx)
645 SET_SIZE(atomic_and_ulong_nv)
646 SET_SIZE(atomic_and_uint_nv)
647 SET_SIZE(atomic_and_32_nv)
650 * NOTE: If atomic_and_64 and atomic_and_64_nv are ever
651 * separated, it is important to edit the libc i386 platform
652 * specific mapfile and remove the NODYNSORT attribute
653 * from atomic_and_64_nv.
656 ALTENTRY(atomic_and_64_nv)
675 SET_SIZE(atomic_and_64_nv)
676 SET_SIZE(atomic_and_64)
679 ALTENTRY(atomic_cas_uchar)
686 SET_SIZE(atomic_cas_uchar)
687 SET_SIZE(atomic_cas_8)
690 ALTENTRY(atomic_cas_ushort)
697 SET_SIZE(atomic_cas_ushort)
698 SET_SIZE(atomic_cas_16)
701 ALTENTRY(atomic_cas_uint)
702 ALTENTRY(atomic_cas_ulong)
703 ALTENTRY(atomic_cas_ptr)
708 cmpxchgl %ecx, (%edx)
710 SET_SIZE(atomic_cas_ptr)
711 SET_SIZE(atomic_cas_ulong)
712 SET_SIZE(atomic_cas_uint)
713 SET_SIZE(atomic_cas_32)
728 SET_SIZE(atomic_cas_64)
731 ALTENTRY(atomic_swap_uchar)
737 SET_SIZE(atomic_swap_uchar)
738 SET_SIZE(atomic_swap_8)
740 ENTRY(atomic_swap_16)
741 ALTENTRY(atomic_swap_ushort)
747 SET_SIZE(atomic_swap_ushort)
748 SET_SIZE(atomic_swap_16)
750 ENTRY(atomic_swap_32)
751 ALTENTRY(atomic_swap_uint)
752 ALTENTRY(atomic_swap_ptr)
753 ALTENTRY(atomic_swap_ulong)
759 SET_SIZE(atomic_swap_ulong)
760 SET_SIZE(atomic_swap_ptr)
761 SET_SIZE(atomic_swap_uint)
762 SET_SIZE(atomic_swap_32)
764 ENTRY(atomic_swap_64)
779 SET_SIZE(atomic_swap_64)
781 ENTRY(atomic_set_long_excl)
791 SET_SIZE(atomic_set_long_excl)
793 ENTRY(atomic_clear_long_excl)
803 SET_SIZE(atomic_clear_long_excl)
806 * NOTE: membar_enter, membar_exit, membar_producer, and
807 * membar_consumer are all identical routines. We define them
808 * separately, instead of using ALTENTRY definitions to alias them
809 * together, so that DTrace and debuggers will see a unique address
810 * for them, allowing more accurate tracing.
818 SET_SIZE(membar_enter)
824 SET_SIZE(membar_exit)
826 ENTRY(membar_producer)
830 SET_SIZE(membar_producer)
832 ENTRY(membar_consumer)
836 SET_SIZE(membar_consumer)
839 .section .note.GNU-stack,"",%progbits