xref: /netbsd-src/common/lib/libc/arch/alpha/atomic/atomic_cas.S (revision 09ff5f3b480cb7eb269d9eec28950bf196ce206c)
1*09ff5f3bSriastradh/*	$NetBSD: atomic_cas.S,v 1.6 2022/04/06 22:47:55 riastradh Exp $	*/
2fb900ec9Sad
3fb900ec9Sad/*-
4646fc3baSad * Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
5fb900ec9Sad * All rights reserved.
6fb900ec9Sad *
7fb900ec9Sad * This code is derived from software contributed to The NetBSD Foundation
8fb900ec9Sad * by Jason R. Thorpe.
9fb900ec9Sad *
10fb900ec9Sad * Redistribution and use in source and binary forms, with or without
11fb900ec9Sad * modification, are permitted provided that the following conditions
12fb900ec9Sad * are met:
13fb900ec9Sad * 1. Redistributions of source code must retain the above copyright
14fb900ec9Sad *    notice, this list of conditions and the following disclaimer.
15fb900ec9Sad * 2. Redistributions in binary form must reproduce the above copyright
16fb900ec9Sad *    notice, this list of conditions and the following disclaimer in the
17fb900ec9Sad *    documentation and/or other materials provided with the distribution.
18fb900ec9Sad *
19fb900ec9Sad * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20fb900ec9Sad * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21fb900ec9Sad * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22fb900ec9Sad * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23fb900ec9Sad * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24fb900ec9Sad * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25fb900ec9Sad * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26fb900ec9Sad * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27fb900ec9Sad * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28fb900ec9Sad * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29fb900ec9Sad * POSSIBILITY OF SUCH DAMAGE.
30fb900ec9Sad */
31fb900ec9Sad
32fb900ec9Sad#include "atomic_op_asm.h"
33fb900ec9Sad
34fb900ec9Sad	.text
35fb900ec9Sad
366740bb54SchsLEAF(_atomic_cas_32, 3)
37fb900ec9Sad1:	mov	a2, t2
38fb900ec9Sad	ldl_l	v0, 0(a0)
39fb900ec9Sad	cmpeq	v0, a1, t1
40fb900ec9Sad	beq	t1, 2f
41fb900ec9Sad	stl_c	t2, 0(a0)
42fb900ec9Sad	beq	t2, 3f
43fb900ec9Sad2:	RET
44fb900ec9Sad3:	br	1b
45fb900ec9Sad	END(_atomic_cas_32)
46646fc3baSad
47fb900ec9SadATOMIC_OP_ALIAS(atomic_cas_32,_atomic_cas_32)
48fb900ec9SadATOMIC_OP_ALIAS(atomic_cas_uint,_atomic_cas_32)
49fb900ec9SadSTRONG_ALIAS(_atomic_cas_uint,_atomic_cas_32)
50fb900ec9Sad
51646fc3baSadATOMIC_OP_ALIAS(atomic_cas_32_ni,_atomic_cas_32)
52646fc3baSadSTRONG_ALIAS(_atomic_cas_32_ni,_atomic_cas_32)
53646fc3baSadATOMIC_OP_ALIAS(atomic_cas_uint_ni,_atomic_cas_32)
54646fc3baSadSTRONG_ALIAS(_atomic_cas_uint_ni,_atomic_cas_32)
55646fc3baSad
566740bb54SchsLEAF(_atomic_cas_64, 3)
57fb900ec9Sad1:	mov	a2, t2
58fb900ec9Sad	ldq_l	v0, 0(a0)
59fb900ec9Sad	cmpeq	v0, a1, t1
60fb900ec9Sad	beq	t1, 2f
61fb900ec9Sad	stq_c	t2, 0(a0)
62fb900ec9Sad	beq	t2, 3f
63fb900ec9Sad2:	RET
64fb900ec9Sad3:	br	1b
65fb900ec9Sad	END(_atomic_cas_64)
66646fc3baSad
67fb900ec9SadATOMIC_OP_ALIAS(atomic_cas_64,_atomic_cas_64)
68fb900ec9SadATOMIC_OP_ALIAS(atomic_cas_ulong,_atomic_cas_64)
69fb900ec9SadSTRONG_ALIAS(_atomic_cas_ulong,_atomic_cas_64)
70fb900ec9SadATOMIC_OP_ALIAS(atomic_cas_ptr,_atomic_cas_64)
71fb900ec9SadSTRONG_ALIAS(_atomic_cas_ptr,_atomic_cas_64)
72646fc3baSad
73646fc3baSadATOMIC_OP_ALIAS(atomic_cas_64_ni,_atomic_cas_64)
74646fc3baSadSTRONG_ALIAS(_atomic_cas_64_ni,_atomic_cas_64)
75646fc3baSadATOMIC_OP_ALIAS(atomic_cas_ulong_ni,_atomic_cas_64)
76646fc3baSadSTRONG_ALIAS(_atomic_cas_ulong_ni,_atomic_cas_64)
77646fc3baSadATOMIC_OP_ALIAS(atomic_cas_ptr_ni,_atomic_cas_64)
78646fc3baSadSTRONG_ALIAS(_atomic_cas_ptr_ni,_atomic_cas_64)
79