1/*
2 * CDDL HEADER START
3 *
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.
7 *
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.
12 *
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]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
24 */
25
26	.file	"atomic.s"
27
28#define	_ASM
29#include <sys/asm_linkage.h>
30
31	ENTRY(atomic_add_64_nv)
32	mov	%rsi, %rax		// %rax = delta addend
33	lock
34	  xaddq	%rsi, (%rdi)		// %rsi = old value, (%rdi) = sum
35	addq	%rsi, %rax		// new value = original value + delta
36	ret
37	SET_SIZE(atomic_add_64_nv)
38
39	ENTRY(atomic_or_8_nv)
40	movb	(%rdi), %al	// %al = old value
411:
42	movb	%sil, %cl
43	orb	%al, %cl	// %cl = new value
44	lock
45	cmpxchgb %cl, (%rdi)	// try to stick it in
46	jne	1b
47	movzbl	%cl, %eax	// return new value
48	ret
49	SET_SIZE(atomic_or_8_nv)
50
51	ENTRY(atomic_cas_32)
52	movl	%esi, %eax
53	lock
54	cmpxchgl %edx, (%rdi)
55	ret
56	SET_SIZE(atomic_cas_32)
57
58	ENTRY(atomic_cas_64)
59	movq	%rsi, %rax
60	lock
61	cmpxchgq %rdx, (%rdi)
62	ret
63	SET_SIZE(atomic_cas_64)
64
65	ENTRY(membar_producer)
66	sfence
67	ret
68	SET_SIZE(membar_producer)
69