1*bf8d907eSskrll/* $NetBSD: atomic_dec.S,v 1.7 2020/08/06 10:00:21 skrll 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*bf8d907eSskrllRCSID("$NetBSD: atomic_dec.S,v 1.7 2020/08/06 10:00:21 skrll Exp $") 338daf714eSmatt 348daf714eSmatt .text 358daf714eSmatt .set noreorder 364c44c335Sbouyer#ifdef _KERNEL_OPT 374c44c335Sbouyer#include "opt_cputype.h" 384c44c335Sbouyer#ifndef MIPS3_LOONGSON2F 394c44c335Sbouyer .set noat 408daf714eSmatt .set nomacro 414c44c335Sbouyer#endif 424c44c335Sbouyer#else /* _KERNEL_OPT */ 434c44c335Sbouyer .set noat 444c44c335Sbouyer .set nomacro 454c44c335Sbouyer#endif /* _KERNEL_OPT */ 468daf714eSmatt 478daf714eSmattLEAF(_atomic_dec_32) 48ac748598Smatt#if defined(_MIPS_ARCH_OCTEONP) || defined(_MIPS_ARCH_OCTEON2) 49ac748598Smatt li t0, -1 50ac748598Smatt saa t0, (a0) 51ac748598Smatt#else 52*bf8d907eSskrll LLSCSYNC 538daf714eSmatt1: INT_LL t0, 0(a0) 548daf714eSmatt nop 558daf714eSmatt INT_ADDU t0, -1 568daf714eSmatt INT_SC t0, 0(a0) 578daf714eSmatt beq t0, zero, 1b 588daf714eSmatt nop 59ac748598Smatt#endif 608daf714eSmatt j ra 618daf714eSmatt nop 628daf714eSmattEND(_atomic_dec_32) 638daf714eSmattATOMIC_OP_ALIAS(atomic_dec_32, _atomic_dec_32) 648daf714eSmatt 658daf714eSmattLEAF(_atomic_dec_32_nv) 66*bf8d907eSskrll LLSCSYNC 678daf714eSmatt1: INT_LL v0, 0(a0) 688daf714eSmatt nop 698daf714eSmatt INT_ADDU v0, -1 708daf714eSmatt move t0, v0 718daf714eSmatt INT_SC t0, 0(a0) 728daf714eSmatt beq t0, zero, 1b 738daf714eSmatt nop 748daf714eSmatt j ra 758daf714eSmatt nop 768daf714eSmattEND(_atomic_dec_32_nv) 778daf714eSmattATOMIC_OP_ALIAS(atomic_dec_32_nv, _atomic_dec_32_nv) 788daf714eSmatt 798daf714eSmatt#if !defined(__mips_o32) 808daf714eSmattLEAF(_atomic_dec_64) 81ac748598Smatt#if defined(_MIPS_ARCH_OCTEONP) || defined(_MIPS_ARCH_OCTEON2) 82ac748598Smatt li t0, -1 83ac748598Smatt saad t0, (a0) 84ac748598Smatt#else 85*bf8d907eSskrll LLSCSYNC 868daf714eSmatt1: REG_LL t0, 0(a0) 878daf714eSmatt nop 888daf714eSmatt REG_ADDU t0, -1 898daf714eSmatt REG_SC t0, 0(a0) 908daf714eSmatt beq t0, zero, 1b 918daf714eSmatt nop 92ac748598Smatt#endif 938daf714eSmatt j ra 948daf714eSmatt nop 958daf714eSmattEND(_atomic_dec_64) 968daf714eSmattATOMIC_OP_ALIAS(atomic_dec_64, _atomic_dec_64) 978daf714eSmatt 988daf714eSmattLEAF(_atomic_dec_64_nv) 99*bf8d907eSskrll LLSCSYNC 1008daf714eSmatt1: REG_LL v0, 0(a0) 1018daf714eSmatt nop 1028daf714eSmatt REG_ADDU v0, -1 1038daf714eSmatt move t0, v0 1048daf714eSmatt REG_SC t0, 0(a0) 1058daf714eSmatt beq t0, zero, 1b 1068daf714eSmatt nop 1078daf714eSmatt j ra 1088daf714eSmatt nop 1098daf714eSmattEND(_atomic_dec_64_nv) 1108daf714eSmattATOMIC_OP_ALIAS(atomic_dec_64_nv, _atomic_dec_64_nv) 1118daf714eSmatt#endif 1128daf714eSmatt 1138daf714eSmatt#ifdef _LP64 1148daf714eSmattSTRONG_ALIAS(_atomic_dec_ptr, _atomic_dec_64) 1158daf714eSmattSTRONG_ALIAS(_atomic_dec_ptr_nv, _atomic_dec_64_nv) 1168daf714eSmattSTRONG_ALIAS(_atomic_dec_ulong, _atomic_dec_64) 1178daf714eSmattSTRONG_ALIAS(_atomic_dec_ulong_nv, _atomic_dec_64_nv) 1188daf714eSmatt#else 1198daf714eSmattSTRONG_ALIAS(_atomic_dec_ptr, _atomic_dec_32) 1208daf714eSmattSTRONG_ALIAS(_atomic_dec_ptr_nv, _atomic_dec_32_nv) 1218daf714eSmattSTRONG_ALIAS(_atomic_dec_ulong, _atomic_dec_32) 1228daf714eSmattSTRONG_ALIAS(_atomic_dec_ulong_nv, _atomic_dec_32_nv) 1238daf714eSmatt#endif 1248daf714eSmattSTRONG_ALIAS(_atomic_dec_uint, _atomic_dec_32) 1258daf714eSmattSTRONG_ALIAS(_atomic_dec_uint_nv, _atomic_dec_32_nv) 1268daf714eSmatt 1278daf714eSmattATOMIC_OP_ALIAS(atomic_dec_ptr, _atomic_dec_ptr) 1288daf714eSmattATOMIC_OP_ALIAS(atomic_dec_ptr_nv, _atomic_dec_ptr_nv) 1298daf714eSmattATOMIC_OP_ALIAS(atomic_dec_uint, _atomic_dec_uint) 1308daf714eSmattATOMIC_OP_ALIAS(atomic_dec_uint_nv, _atomic_dec_uint_nv) 1318daf714eSmattATOMIC_OP_ALIAS(atomic_dec_ulong, _atomic_dec_ulong) 1328daf714eSmattATOMIC_OP_ALIAS(atomic_dec_ulong_nv, _atomic_dec_ulong_nv) 133