xref: /netbsd-src/common/lib/libc/arch/mips/atomic/atomic_cas.S (revision 05a5e24cff47f3d7cded750e448a4213232a03f1)
1*05a5e24cSriastradh/*	$NetBSD: atomic_cas.S,v 1.9 2022/02/27 19:21:53 riastradh Exp $	*/
28daf714eSmatt
38daf714eSmatt/*-
48daf714eSmatt * Copyright (c) 2008 The NetBSD Foundation, Inc.
58daf714eSmatt * All rights reserved.
68daf714eSmatt *
78daf714eSmatt * Redistribution and use in source and binary forms, with or without
88daf714eSmatt * modification, are permitted provided that the following conditions
98daf714eSmatt * are met:
108daf714eSmatt * 1. Redistributions of source code must retain the above copyright
118daf714eSmatt *    notice, this list of conditions and the following disclaimer.
128daf714eSmatt * 2. Redistributions in binary form must reproduce the above copyright
138daf714eSmatt *    notice, this list of conditions and the following disclaimer in the
148daf714eSmatt *    documentation and/or other materials provided with the distribution.
158daf714eSmatt *
168daf714eSmatt * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
178daf714eSmatt * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
188daf714eSmatt * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
198daf714eSmatt * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
208daf714eSmatt * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
218daf714eSmatt * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
228daf714eSmatt * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
238daf714eSmatt * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
248daf714eSmatt * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
258daf714eSmatt * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
268daf714eSmatt * POSSIBILITY OF SUCH DAMAGE.
278daf714eSmatt */
288daf714eSmatt
298daf714eSmatt#include <machine/asm.h>
308daf714eSmatt#include "atomic_op_asm.h"
318daf714eSmatt
32*05a5e24cSriastradhRCSID("$NetBSD: atomic_cas.S,v 1.9 2022/02/27 19:21:53 riastradh Exp $")
338daf714eSmatt
348daf714eSmatt	.text
358daf714eSmatt	.set	noat
368daf714eSmatt	.set	noreorder
378daf714eSmatt	.set	nomacro
388daf714eSmatt
398daf714eSmattLEAF(_atomic_cas_32)
40bf8d907eSskrll	LLSCSYNC
418daf714eSmatt1:	INT_LL		v0, 0(a0)
428daf714eSmatt	 nop
438daf714eSmatt	bne		v0, a1, 2f
448daf714eSmatt	 nop
458daf714eSmatt	move		t0, a2
468daf714eSmatt	INT_SC		t0, 0(a0)
478daf714eSmatt	beq		t0, zero, 1b
488daf714eSmatt 	 nop
498daf714eSmatt	move		v0, a1
50*05a5e24cSriastradh	SYNC_PLUNGER
518daf714eSmatt2:
528daf714eSmatt	j		ra
538daf714eSmatt	 nop
548daf714eSmattEND(_atomic_cas_32)
558daf714eSmattATOMIC_OP_ALIAS(atomic_cas_32, _atomic_cas_32)
568cef165aSrinATOMIC_OP_ALIAS(atomic_cas_32_ni, _atomic_cas_32)
578daf714eSmatt
588daf714eSmatt#if !defined(__mips_o32)
598daf714eSmattLEAF(_atomic_cas_64)
60bf8d907eSskrll	LLSCSYNC
618daf714eSmatt1:	REG_LL		v0, 0(a0)
628daf714eSmatt	 nop
638daf714eSmatt	bne		v0, a1, 2f
648daf714eSmatt	 nop
658daf714eSmatt	move		t0, a2
668daf714eSmatt	REG_SC		t0, 0(a0)
678daf714eSmatt	beq		t0, zero, 1b
688daf714eSmatt 	 nop
698daf714eSmatt	move		v0, a1
70*05a5e24cSriastradh	SYNC_PLUNGER
718daf714eSmatt2:
728daf714eSmatt	j		ra
738daf714eSmatt	 nop
748daf714eSmattEND(_atomic_cas_64)
758daf714eSmattATOMIC_OP_ALIAS(atomic_cas_64, _atomic_cas_64)
766899bcacSmartinATOMIC_OP_ALIAS(atomic_cas_64_ni, _atomic_cas_64)
778daf714eSmatt#endif
788daf714eSmatt
798daf714eSmatt#ifdef _LP64
808daf714eSmattSTRONG_ALIAS(_atomic_cas_ptr,		_atomic_cas_64)
818daf714eSmattSTRONG_ALIAS(_atomic_cas_ptr_ni,	_atomic_cas_64)
828daf714eSmattSTRONG_ALIAS(_atomic_cas_ulong,		_atomic_cas_64)
838daf714eSmattSTRONG_ALIAS(_atomic_cas_ulong_ni,	_atomic_cas_64)
848daf714eSmatt#else
858daf714eSmattSTRONG_ALIAS(_atomic_cas_ptr,		_atomic_cas_32)
868daf714eSmattSTRONG_ALIAS(_atomic_cas_ptr_ni,	_atomic_cas_32)
878daf714eSmattSTRONG_ALIAS(_atomic_cas_ulong,		_atomic_cas_32)
888daf714eSmattSTRONG_ALIAS(_atomic_cas_ulong_ni,	_atomic_cas_32)
898daf714eSmatt#endif
908daf714eSmattSTRONG_ALIAS(_atomic_cas_uint,		_atomic_cas_32)
918daf714eSmattSTRONG_ALIAS(_atomic_cas_uint_ni,	_atomic_cas_32)
928daf714eSmatt
938daf714eSmattATOMIC_OP_ALIAS(atomic_cas_ptr,		_atomic_cas_ptr)
948daf714eSmattATOMIC_OP_ALIAS(atomic_cas_ptr_ni,	_atomic_cas_ptr_ni)
958daf714eSmattATOMIC_OP_ALIAS(atomic_cas_uint,	_atomic_cas_uint)
968daf714eSmattATOMIC_OP_ALIAS(atomic_cas_uint_ni,	_atomic_cas_uint_ni)
978daf714eSmattATOMIC_OP_ALIAS(atomic_cas_ulong,	_atomic_cas_ulong)
988daf714eSmattATOMIC_OP_ALIAS(atomic_cas_ulong_ni,	_atomic_cas_ulong_ni)
99