c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs/*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * CDDL HEADER START
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs *
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * The contents of this file are subject to the terms of the
aa81749390e332985277568edab1ee6132326b42gs * Common Development and Distribution License (the "License").
aa81749390e332985277568edab1ee6132326b42gs * You may not use this file except in compliance with the License.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs *
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * or http://www.opensolaris.org/os/licensing.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * See the License for the specific language governing permissions
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * and limitations under the License.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs *
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * When distributing Covered Code, include this CDDL HEADER in each
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * If applicable, add the following below this CDDL HEADER, with the
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * fields enclosed by brackets "[]" replaced with your own identifying
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * information: Portions Copyright [yyyy] [name of copyright owner]
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs *
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * CDDL HEADER END
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
bdb9230ac765cb7af3fc1f4119caf2c5720dceb3Garrett D'Amore/*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs .file "atomic.s"
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#include <sys/asm_linkage.h>
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#if defined(_KERNEL)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs /*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * Legacy kernel interfaces; they will go away the moment our closed
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * bins no longer require them.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ANSI_PRAGMA_WEAK2(cas8,atomic_cas_8,function)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ANSI_PRAGMA_WEAK2(cas32,atomic_cas_32,function)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ANSI_PRAGMA_WEAK2(cas64,atomic_cas_64,function)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ANSI_PRAGMA_WEAK2(caslong,atomic_cas_ulong,function)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ANSI_PRAGMA_WEAK2(casptr,atomic_cas_ptr,function)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ANSI_PRAGMA_WEAK2(atomic_and_long,atomic_and_ulong,function)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ANSI_PRAGMA_WEAK2(atomic_or_long,atomic_or_ulong,function)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#endif
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_inc_8)
526431940871c58531fcb8622ff47caaac00f6aegs ALTENTRY(atomic_inc_uchar)
526431940871c58531fcb8622ff47caaac00f6aegs lock
526431940871c58531fcb8622ff47caaac00f6aegs incb (%rdi)
526431940871c58531fcb8622ff47caaac00f6aegs ret
526431940871c58531fcb8622ff47caaac00f6aegs SET_SIZE(atomic_inc_uchar)
526431940871c58531fcb8622ff47caaac00f6aegs SET_SIZE(atomic_inc_8)
dfc2d53e07384b9eaca5466a2328c88a1ed96f32mx
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_inc_16)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_inc_ushort)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs incw (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_inc_ushort)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_inc_16)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_inc_32)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_inc_uint)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs incl (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_inc_uint)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_inc_32)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_inc_64)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_inc_ulong)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs incq (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_inc_ulong)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_inc_64)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_inc_8_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_inc_uchar_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs xorl %eax, %eax / clear upper bits of %eax return register
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs incb %al / %al = 1
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs xaddb %al, (%rdi) / %al = old value, (%rdi) = new value
aa81749390e332985277568edab1ee6132326b42gs incb %al / return new value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_inc_uchar_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_inc_8_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_inc_16_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_inc_ushort_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs xorl %eax, %eax / clear upper bits of %eax return register
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs incw %ax / %ax = 1
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs xaddw %ax, (%rdi) / %ax = old value, (%rdi) = new value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs incw %ax / return new value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_inc_ushort_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_inc_16_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_inc_32_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_inc_uint_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs xorl %eax, %eax / %eax = 0
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs incl %eax / %eax = 1
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs xaddl %eax, (%rdi) / %eax = old value, (%rdi) = new value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs incl %eax / return new value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_inc_uint_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_inc_32_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_inc_64_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_inc_ulong_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs xorq %rax, %rax / %rax = 0
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs incq %rax / %rax = 1
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs xaddq %rax, (%rdi) / %rax = old value, (%rdi) = new value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs incq %rax / return new value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_inc_ulong_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_inc_64_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_dec_8)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_dec_uchar)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs decb (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_dec_uchar)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_dec_8)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_dec_16)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_dec_ushort)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs decw (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_dec_ushort)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_dec_16)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_dec_32)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_dec_uint)
aa81749390e332985277568edab1ee6132326b42gs lock
3a84c50f71e0942a55e90913f6b44878d5062621Winson Wang - Sun Microsystems - Beijing China decl (%rdi)
3a84c50f71e0942a55e90913f6b44878d5062621Winson Wang - Sun Microsystems - Beijing China ret
9e1a9180bec2232328687ae8e96007921a6ed05dLi-Zhen You SET_SIZE(atomic_dec_uint)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_dec_32)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_dec_64)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_dec_ulong)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs decq (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_dec_ulong)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_dec_64)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_dec_8_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_dec_uchar_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs xorl %eax, %eax / clear upper bits of %eax return register
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs decb %al / %al = -1
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs xaddb %al, (%rdi) / %al = old value, (%rdi) = new value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs decb %al / return new value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_dec_uchar_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_dec_8_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_dec_16_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_dec_ushort_nv)
aa81749390e332985277568edab1ee6132326b42gs xorl %eax, %eax / clear upper bits of %eax return register
aa81749390e332985277568edab1ee6132326b42gs decw %ax / %ax = -1
aa81749390e332985277568edab1ee6132326b42gs lock
aa81749390e332985277568edab1ee6132326b42gs xaddw %ax, (%rdi) / %ax = old value, (%rdi) = new value
526431940871c58531fcb8622ff47caaac00f6aegs decw %ax / return new value
aa81749390e332985277568edab1ee6132326b42gs ret
aa81749390e332985277568edab1ee6132326b42gs SET_SIZE(atomic_dec_ushort_nv)
aa81749390e332985277568edab1ee6132326b42gs SET_SIZE(atomic_dec_16_nv)
5927ab2b3c9b313d37a3417c6a5571fdf191b693KHF
dfc2d53e07384b9eaca5466a2328c88a1ed96f32mx ENTRY(atomic_dec_32_nv)
834a2629f6f251c7492f75e808a856b82a27b337yong tan - Sun Microsystems - Beijing China ALTENTRY(atomic_dec_uint_nv)
834a2629f6f251c7492f75e808a856b82a27b337yong tan - Sun Microsystems - Beijing China xorl %eax, %eax / %eax = 0
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs decl %eax / %eax = -1
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs xaddl %eax, (%rdi) / %eax = old value, (%rdi) = new value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs decl %eax / return new value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_dec_uint_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_dec_32_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_dec_64_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_dec_ulong_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs xorq %rax, %rax / %rax = 0
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs decq %rax / %rax = -1
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs xaddq %rax, (%rdi) / %rax = old value, (%rdi) = new value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs decq %rax / return new value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_dec_ulong_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_dec_64_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_add_8)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_add_char)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs addb %sil, (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_add_char)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_add_8)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_add_16)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_add_short)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs addw %si, (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_add_short)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_add_16)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_add_32)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_add_int)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs addl %esi, (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_add_int)
3a84c50f71e0942a55e90913f6b44878d5062621Winson Wang - Sun Microsystems - Beijing China SET_SIZE(atomic_add_32)
3a84c50f71e0942a55e90913f6b44878d5062621Winson Wang - Sun Microsystems - Beijing China
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_add_64)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_add_ptr)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_add_long)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs addq %rsi, (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_add_long)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_add_ptr)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_add_64)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_or_8)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_or_uchar)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs orb %sil, (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_or_uchar)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_or_8)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_or_16)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_or_ushort)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs orw %si, (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_or_ushort)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_or_16)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_or_32)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_or_uint)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs orl %esi, (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_or_uint)
368a5ef88e8811b10e03b912242c0faef12ce713Miles Xu, Sun Microsystems SET_SIZE(atomic_or_32)
368a5ef88e8811b10e03b912242c0faef12ce713Miles Xu, Sun Microsystems
368a5ef88e8811b10e03b912242c0faef12ce713Miles Xu, Sun Microsystems ENTRY(atomic_or_64)
368a5ef88e8811b10e03b912242c0faef12ce713Miles Xu, Sun Microsystems ALTENTRY(atomic_or_ulong)
368a5ef88e8811b10e03b912242c0faef12ce713Miles Xu, Sun Microsystems lock
368a5ef88e8811b10e03b912242c0faef12ce713Miles Xu, Sun Microsystems orq %rsi, (%rdi)
368a5ef88e8811b10e03b912242c0faef12ce713Miles Xu, Sun Microsystems ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_or_ulong)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_or_64)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_and_8)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_and_uchar)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs andb %sil, (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_and_uchar)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_and_8)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_and_16)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_and_ushort)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs andw %si, (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_and_ushort)
aa81749390e332985277568edab1ee6132326b42gs SET_SIZE(atomic_and_16)
aa81749390e332985277568edab1ee6132326b42gs
aa81749390e332985277568edab1ee6132326b42gs ENTRY(atomic_and_32)
aa81749390e332985277568edab1ee6132326b42gs ALTENTRY(atomic_and_uint)
aa81749390e332985277568edab1ee6132326b42gs lock
aa81749390e332985277568edab1ee6132326b42gs andl %esi, (%rdi)
aa81749390e332985277568edab1ee6132326b42gs ret
aa81749390e332985277568edab1ee6132326b42gs SET_SIZE(atomic_and_uint)
aa81749390e332985277568edab1ee6132326b42gs SET_SIZE(atomic_and_32)
aa81749390e332985277568edab1ee6132326b42gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_and_64)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_and_ulong)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs andq %rsi, (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_and_ulong)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_and_64)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_add_8_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_add_char_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movzbl %sil, %eax / %al = delta addend, clear upper bits
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs xaddb %sil, (%rdi) / %sil = old value, (%rdi) = sum
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs addb %sil, %al / new value = original value + delta
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_add_char_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_add_8_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
aa81749390e332985277568edab1ee6132326b42gs ENTRY(atomic_add_16_nv)
aa81749390e332985277568edab1ee6132326b42gs ALTENTRY(atomic_add_short_nv)
aa81749390e332985277568edab1ee6132326b42gs movzwl %si, %eax / %ax = delta addend, clean upper bits
aa81749390e332985277568edab1ee6132326b42gs lock
aa81749390e332985277568edab1ee6132326b42gs xaddw %si, (%rdi) / %si = old value, (%rdi) = sum
aa81749390e332985277568edab1ee6132326b42gs addw %si, %ax / new value = original value + delta
aa81749390e332985277568edab1ee6132326b42gs ret
aa81749390e332985277568edab1ee6132326b42gs SET_SIZE(atomic_add_short_nv)
aa81749390e332985277568edab1ee6132326b42gs SET_SIZE(atomic_add_16_nv)
aa81749390e332985277568edab1ee6132326b42gs
aa81749390e332985277568edab1ee6132326b42gs ENTRY(atomic_add_32_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_add_int_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mov %esi, %eax / %eax = delta addend
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs xaddl %esi, (%rdi) / %esi = old value, (%rdi) = sum
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs add %esi, %eax / new value = original value + delta
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_add_int_nv)
dfc2d53e07384b9eaca5466a2328c88a1ed96f32mx SET_SIZE(atomic_add_32_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_add_64_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_add_ptr_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_add_long_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mov %rsi, %rax / %rax = delta addend
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs xaddq %rsi, (%rdi) / %rsi = old value, (%rdi) = sum
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs addq %rsi, %rax / new value = original value + delta
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_add_long_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_add_ptr_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_add_64_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_and_8_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_and_uchar_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movb (%rdi), %al / %al = old value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs1:
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movb %sil, %cl
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs andb %al, %cl / %cl = new value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs cmpxchgb %cl, (%rdi) / try to stick it in
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs jne 1b
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movzbl %cl, %eax / return new value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_and_uchar_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_and_8_nv)
dfc2d53e07384b9eaca5466a2328c88a1ed96f32mx
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_and_16_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_and_ushort_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movw (%rdi), %ax / %ax = old value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs1:
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movw %si, %cx
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs andw %ax, %cx / %cx = new value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs cmpxchgw %cx, (%rdi) / try to stick it in
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs jne 1b
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movzwl %cx, %eax / return new value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_and_ushort_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_and_16_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_and_32_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_and_uint_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movl (%rdi), %eax
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs1:
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movl %esi, %ecx
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs andl %eax, %ecx
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs cmpxchgl %ecx, (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs jne 1b
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movl %ecx, %eax
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_and_uint_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_and_32_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_and_64_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_and_ulong_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movq (%rdi), %rax
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs1:
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movq %rsi, %rcx
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs andq %rax, %rcx
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs cmpxchgq %rcx, (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs jne 1b
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movq %rcx, %rax
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_and_ulong_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_and_64_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_or_8_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_or_uchar_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movb (%rdi), %al / %al = old value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs1:
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movb %sil, %cl
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs orb %al, %cl / %cl = new value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs cmpxchgb %cl, (%rdi) / try to stick it in
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs jne 1b
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movzbl %cl, %eax / return new value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_or_uchar_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_or_8_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_or_16_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_or_ushort_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movw (%rdi), %ax / %ax = old value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs1:
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movw %si, %cx
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs orw %ax, %cx / %cx = new value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs cmpxchgw %cx, (%rdi) / try to stick it in
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs jne 1b
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movzwl %cx, %eax / return new value
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_or_ushort_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_or_16_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_or_32_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_or_uint_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movl (%rdi), %eax
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs1:
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movl %esi, %ecx
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs orl %eax, %ecx
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs cmpxchgl %ecx, (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs jne 1b
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movl %ecx, %eax
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_or_uint_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_or_32_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_or_64_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_or_ulong_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movq (%rdi), %rax
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs1:
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movq %rsi, %rcx
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs orq %rax, %rcx
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs cmpxchgq %rcx, (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs jne 1b
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movq %rcx, %rax
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_or_ulong_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_or_64_nv)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_cas_8)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_cas_uchar)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movzbl %sil, %eax
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs cmpxchgb %dl, (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_cas_uchar)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_cas_8)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_cas_16)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_cas_ushort)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movzwl %si, %eax
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs cmpxchgw %dx, (%rdi)
526431940871c58531fcb8622ff47caaac00f6aegs ret
aa81749390e332985277568edab1ee6132326b42gs SET_SIZE(atomic_cas_ushort)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_cas_16)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
aa81749390e332985277568edab1ee6132326b42gs ENTRY(atomic_cas_32)
526431940871c58531fcb8622ff47caaac00f6aegs ALTENTRY(atomic_cas_uint)
aa81749390e332985277568edab1ee6132326b42gs movl %esi, %eax
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
526431940871c58531fcb8622ff47caaac00f6aegs cmpxchgl %edx, (%rdi)
aa81749390e332985277568edab1ee6132326b42gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_cas_uint)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_cas_32)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_cas_64)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_cas_ulong)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_cas_ptr)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movq %rsi, %rax
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs cmpxchgq %rdx, (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_cas_ptr)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_cas_ulong)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_cas_64)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_swap_8)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_swap_uchar)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movzbl %sil, %eax
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs xchgb %al, (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_swap_uchar)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_swap_8)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_swap_16)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_swap_ushort)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movzwl %si, %eax
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs xchgw %ax, (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_swap_ushort)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_swap_16)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_swap_32)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_swap_uint)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movl %esi, %eax
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs xchgl %eax, (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_swap_uint)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_swap_32)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_swap_64)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_swap_ulong)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ALTENTRY(atomic_swap_ptr)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs movq %rsi, %rax
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs xchgq %rax, (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_swap_ptr)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_swap_ulong)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_swap_64)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_set_long_excl)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs xorl %eax, %eax
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs btsq %rsi, (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs jnc 1f
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs decl %eax / return -1
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs1:
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_set_long_excl)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(atomic_clear_long_excl)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs xorl %eax, %eax
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lock
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs btrq %rsi, (%rdi)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs jc 1f
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs decl %eax / return -1
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs1:
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(atomic_clear_long_excl)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#if !defined(_KERNEL)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs /*
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * NOTE: membar_enter, and membar_exit are identical routines.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * We define them separately, instead of using an ALTENTRY
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * definitions to alias them together, so that DTrace and
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * debuggers will see a unique address for them, allowing
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs * more accurate tracing.
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(membar_enter)
aa81749390e332985277568edab1ee6132326b42gs mfence
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(membar_enter)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(membar_exit)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs mfence
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(membar_exit)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(membar_producer)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs sfence
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(membar_producer)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ENTRY(membar_consumer)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs lfence
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs ret
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs SET_SIZE(membar_consumer)
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs#endif /* !_KERNEL */
c7fd2ed091e4e4beb47e1da3a6197a2c38f29c02gs