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