1*4f8ce3b3Sriastradh/* $NetBSD: atomic.S,v 1.7 2022/04/09 23:32:51 riastradh Exp $ */ 2473f1b48Skochi 3473f1b48Skochi/*- 4473f1b48Skochi * Copyright (c) 2008 The NetBSD Foundation, Inc. 5473f1b48Skochi * All rights reserved. 6473f1b48Skochi * 7473f1b48Skochi * This code is derived from software contributed to The NetBSD Foundation 8473f1b48Skochi * by Takayoshi Kochi. 9473f1b48Skochi * 10473f1b48Skochi * Redistribution and use in source and binary forms, with or without 11473f1b48Skochi * modification, are permitted provided that the following conditions 12473f1b48Skochi * are met: 13473f1b48Skochi * 1. Redistributions of source code must retain the above copyright 14473f1b48Skochi * notice, this list of conditions and the following disclaimer. 15473f1b48Skochi * 2. Redistributions in binary form must reproduce the above copyright 16473f1b48Skochi * notice, this list of conditions and the following disclaimer in the 17473f1b48Skochi * documentation and/or other materials provided with the distribution. 18473f1b48Skochi * 19473f1b48Skochi * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20473f1b48Skochi * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21473f1b48Skochi * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22473f1b48Skochi * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23473f1b48Skochi * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24473f1b48Skochi * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25473f1b48Skochi * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26473f1b48Skochi * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27473f1b48Skochi * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28473f1b48Skochi * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29473f1b48Skochi * POSSIBILITY OF SUCH DAMAGE. 30473f1b48Skochi */ 31473f1b48Skochi 32473f1b48Skochi#include <machine/asm.h> 33473f1b48Skochi 34473f1b48Skochi#ifdef _KERNEL 35473f1b48Skochi#define ALIAS(f, t) STRONG_ALIAS(f,t) 36473f1b48Skochi#else 37473f1b48Skochi#define ALIAS(f, t) WEAK_ALIAS(f,t) 38473f1b48Skochi#endif 39473f1b48Skochi 40473f1b48Skochi .text 41473f1b48Skochi 426740bb54SchsENTRY(_atomic_dec_32,1) 43473f1b48Skochi fetchadd4.rel r8=[r32],-1 44473f1b48Skochi br.ret.sptk rp 4588855871SskrllEND(_atomic_dec_32) 46473f1b48Skochi 476740bb54SchsENTRY(_atomic_dec_64,1) 48473f1b48Skochi fetchadd8.rel r8=[r32],-1 49473f1b48Skochi br.ret.sptk rp 5088855871SskrllEND(_atomic_dec_64) 51473f1b48Skochi 526740bb54SchsENTRY(_atomic_dec_32_nv,1) 53473f1b48Skochi fetchadd4.rel r8=[r32],-1 54473f1b48Skochi br.ret.sptk rp 5588855871SskrllEND(_atomic_dec_32_nv) 56473f1b48Skochi 576740bb54SchsENTRY(_atomic_dec_64_nv,1) 58473f1b48Skochi fetchadd8.rel r8=[r32],-1 59473f1b48Skochi br.ret.sptk rp 6088855871SskrllEND(_atomic_dec_64_nv) 61473f1b48Skochi 626740bb54SchsENTRY(_atomic_inc_32,1) 63473f1b48Skochi fetchadd4.rel r8=[r32],1 64473f1b48Skochi br.ret.sptk rp 6588855871SskrllEND(_atomic_inc_32) 66473f1b48Skochi 676740bb54SchsENTRY(_atomic_inc_64,1) 68473f1b48Skochi fetchadd8.rel r8=[r32],1 69473f1b48Skochi br.ret.sptk rp 7088855871SskrllEND(_atomic_inc_64) 71473f1b48Skochi 726740bb54SchsENTRY(_atomic_inc_32_nv,1) 73473f1b48Skochi fetchadd4.rel r8=[r32],1 74473f1b48Skochi br.ret.sptk rp 7588855871SskrllEND(_atomic_inc_32_nv) 76473f1b48Skochi 776740bb54SchsENTRY(_atomic_inc_64_nv,1) 78473f1b48Skochi fetchadd8.rel r8=[r32],1 79473f1b48Skochi br.ret.sptk rp 8088855871SskrllEND(_atomic_inc_64_nv) 81473f1b48Skochi 826740bb54SchsENTRY(_atomic_swap_32,2) 83473f1b48Skochi xchg4 r8=[r32],r33 84473f1b48Skochi ;; 85473f1b48Skochi mov r33=r8 86473f1b48Skochi br.ret.sptk rp 8788855871SskrllEND(_atomic_swap_32) 88473f1b48Skochi 896740bb54SchsENTRY(_atomic_swap_64,2) 90473f1b48Skochi xchg8 r8=[r32],r33 91473f1b48Skochi ;; 92473f1b48Skochi mov r33=r8 93473f1b48Skochi br.ret.sptk rp 9488855871SskrllEND(_atomic_swap_64) 95473f1b48Skochi 966740bb54SchsENTRY(_atomic_cas_32,3) 97473f1b48Skochi mov ar.ccv=r33 98473f1b48Skochi ;; 99473f1b48Skochi cmpxchg4.acq r8=[r32],r34,ar.ccv 100473f1b48Skochi br.ret.sptk rp 10188855871SskrllEND(_atomic_cas_32) 102473f1b48Skochi 1036740bb54SchsENTRY(_atomic_cas_64,3) 104473f1b48Skochi mov ar.ccv=r33 105473f1b48Skochi ;; 106473f1b48Skochi cmpxchg8.acq r8=[r32],r34,ar.ccv 107473f1b48Skochi br.ret.sptk rp 10888855871SskrllEND(_atomic_cas_64) 109473f1b48Skochi 1106740bb54SchsENTRY(_membar_consumer,0) 111473f1b48Skochi mf 112473f1b48Skochi br.ret.sptk rp 11388855871SskrllEND(_membar_consumer) 114473f1b48Skochi 1156740bb54SchsENTRY(_membar_producer,0) 116473f1b48Skochi mf 117473f1b48Skochi br.ret.sptk rp 11888855871SskrllEND(_membar_producer) 119473f1b48Skochi 120*4f8ce3b3SriastradhENTRY(_membar_acquire,0) 121*4f8ce3b3Sriastradh mf 122*4f8ce3b3Sriastradh br.ret.sptk rp 123*4f8ce3b3SriastradhEND(_membar_acquire) 124*4f8ce3b3Sriastradh 125*4f8ce3b3SriastradhENTRY(_membar_release,0) 126*4f8ce3b3Sriastradh mf 127*4f8ce3b3Sriastradh br.ret.sptk rp 128*4f8ce3b3SriastradhEND(_membar_release) 129*4f8ce3b3Sriastradh 1306740bb54SchsENTRY(_membar_enter,0) 131473f1b48Skochi mf 132473f1b48Skochi br.ret.sptk rp 13388855871SskrllEND(_membar_enter) 134473f1b48Skochi 1356740bb54SchsENTRY(_membar_exit,0) 136473f1b48Skochi mf 137473f1b48Skochi br.ret.sptk rp 13888855871SskrllEND(_membar_exit) 139473f1b48Skochi 1406740bb54SchsENTRY(_membar_sync,0) 141473f1b48Skochi mf 142473f1b48Skochi br.ret.sptk rp 14388855871SskrllEND(_membar_sync) 144473f1b48Skochi 145473f1b48Skochi 146473f1b48SkochiALIAS(atomic_add_32,_atomic_add_32) 147473f1b48SkochiALIAS(atomic_add_int,_atomic_add_32) 148473f1b48SkochiALIAS(atomic_add_64,_atomic_add_64) 149473f1b48SkochiALIAS(atomic_add_long,_atomic_add_64) 150473f1b48SkochiALIAS(atomic_add_ptr,_atomic_add_64) 151473f1b48Skochi 152473f1b48SkochiALIAS(atomic_add_32_nv,_atomic_add_32_nv) 153473f1b48SkochiALIAS(atomic_add_int_nv,_atomic_add_32_nv) 154473f1b48SkochiALIAS(atomic_add_64_nv,_atomic_add_64_nv) 155473f1b48SkochiALIAS(atomic_add_long_nv,_atomic_add_64_nv) 156473f1b48SkochiALIAS(atomic_add_ptr_nv,_atomic_add_64_nv) 157473f1b48Skochi 158473f1b48SkochiALIAS(atomic_and_32,_atomic_and_32) 159473f1b48SkochiALIAS(atomic_and_uint,_atomic_and_32) 160473f1b48SkochiALIAS(atomic_and_64,_atomic_and_64) 161473f1b48SkochiALIAS(atomic_and_ulong,_atomic_and_64) 162473f1b48SkochiALIAS(atomic_and_ptr,_atomic_and_64) 163473f1b48Skochi 164473f1b48SkochiALIAS(atomic_and_32_nv,_atomic_and_32_nv) 165473f1b48SkochiALIAS(atomic_and_uint_nv,_atomic_and_32_nv) 166473f1b48SkochiALIAS(atomic_and_64_nv,_atomic_and_64_nv) 167473f1b48SkochiALIAS(atomic_and_ulong_nv,_atomic_and_64_nv) 168473f1b48SkochiALIAS(atomic_and_ptr_nv,_atomic_and_64_nv) 169473f1b48Skochi 170473f1b48SkochiALIAS(atomic_dec_32,_atomic_dec_32) 171473f1b48SkochiALIAS(atomic_dec_uint,_atomic_dec_32) 172473f1b48SkochiALIAS(atomic_dec_64,_atomic_dec_64) 173473f1b48SkochiALIAS(atomic_dec_ulong,_atomic_dec_64) 174473f1b48SkochiALIAS(atomic_dec_ptr,_atomic_dec_64) 175473f1b48Skochi 176473f1b48SkochiALIAS(atomic_dec_32_nv,_atomic_dec_32_nv) 177473f1b48SkochiALIAS(atomic_dec_uint_nv,_atomic_dec_32_nv) 178473f1b48SkochiALIAS(atomic_dec_64_nv,_atomic_dec_64_nv) 179473f1b48SkochiALIAS(atomic_dec_ulong_nv,_atomic_dec_64_nv) 180473f1b48SkochiALIAS(atomic_dec_ptr_nv,_atomic_dec_64_nv) 181473f1b48Skochi 182473f1b48SkochiALIAS(atomic_inc_32,_atomic_inc_32) 183473f1b48SkochiALIAS(atomic_inc_uint,_atomic_inc_32) 184473f1b48SkochiALIAS(atomic_inc_64,_atomic_inc_64) 185473f1b48SkochiALIAS(atomic_inc_ulong,_atomic_inc_64) 186473f1b48SkochiALIAS(atomic_inc_ptr,_atomic_inc_64) 187473f1b48Skochi 188473f1b48SkochiALIAS(atomic_inc_32_nv,_atomic_inc_32_nv) 189473f1b48SkochiALIAS(atomic_inc_uint_nv,_atomic_inc_32_nv) 190473f1b48SkochiALIAS(atomic_inc_64_nv,_atomic_inc_64_nv) 191473f1b48SkochiALIAS(atomic_inc_ulong_nv,_atomic_inc_64_nv) 192473f1b48SkochiALIAS(atomic_inc_ptr_nv,_atomic_inc_64_nv) 193473f1b48Skochi 194473f1b48SkochiALIAS(atomic_or_32,_atomic_or_32) 195473f1b48SkochiALIAS(atomic_or_uint,_atomic_or_32) 196473f1b48SkochiALIAS(atomic_or_64,_atomic_or_64) 197473f1b48SkochiALIAS(atomic_or_ulong,_atomic_or_64) 198473f1b48SkochiALIAS(atomic_or_ptr,_atomic_or_64) 199473f1b48Skochi 200473f1b48SkochiALIAS(atomic_or_32_nv,_atomic_or_32_nv) 201473f1b48SkochiALIAS(atomic_or_uint_nv,_atomic_or_32_nv) 202473f1b48SkochiALIAS(atomic_or_64_nv,_atomic_or_64_nv) 203473f1b48SkochiALIAS(atomic_or_ulong_nv,_atomic_or_64_nv) 204473f1b48SkochiALIAS(atomic_or_ptr_nv,_atomic_or_64_nv) 205473f1b48Skochi 206473f1b48SkochiALIAS(atomic_swap_32,_atomic_swap_32) 207473f1b48SkochiALIAS(atomic_swap_uint,_atomic_swap_32) 208473f1b48SkochiALIAS(atomic_swap_64,_atomic_swap_64) 209473f1b48SkochiALIAS(atomic_swap_ulong,_atomic_swap_64) 210473f1b48SkochiALIAS(atomic_swap_ptr,_atomic_swap_64) 211473f1b48Skochi 212473f1b48SkochiALIAS(atomic_cas_32,_atomic_cas_32) 213473f1b48SkochiALIAS(atomic_cas_uint,_atomic_cas_32) 214473f1b48SkochiALIAS(atomic_cas_64,_atomic_cas_64) 215473f1b48SkochiALIAS(atomic_cas_ulong,_atomic_cas_64) 216473f1b48SkochiALIAS(atomic_cas_ptr,_atomic_cas_64) 217473f1b48Skochi 2182ead1ed5SkochiALIAS(atomic_cas_32_ni,_atomic_cas_32) 2192ead1ed5SkochiALIAS(atomic_cas_uint_ni,_atomic_cas_32) 2202ead1ed5SkochiALIAS(atomic_cas_64_ni,_atomic_cas_64) 2212ead1ed5SkochiALIAS(atomic_cas_ulong_ni,_atomic_cas_64) 2222ead1ed5SkochiALIAS(atomic_cas_ptr_ni,_atomic_cas_64) 2232ead1ed5Skochi 224473f1b48SkochiALIAS(membar_consumer,_membar_consumer) 225473f1b48SkochiALIAS(membar_producer,_membar_producer) 226*4f8ce3b3SriastradhALIAS(membar_acquire,_membar_acquire) 227*4f8ce3b3SriastradhALIAS(membar_release,_membar_release) 228473f1b48SkochiALIAS(membar_enter,_membar_enter) 229473f1b48SkochiALIAS(membar_exit,_membar_exit) 230473f1b48SkochiALIAS(membar_sync,_membar_sync) 231473f1b48Skochi 232473f1b48SkochiSTRONG_ALIAS(_atomic_add_int,_atomic_add_32) 233473f1b48SkochiSTRONG_ALIAS(_atomic_add_long,_atomic_add_64) 234473f1b48SkochiSTRONG_ALIAS(_atomic_add_ptr,_atomic_add_64) 235473f1b48Skochi 236473f1b48SkochiSTRONG_ALIAS(_atomic_add_int_nv,_atomic_add_32_nv) 237473f1b48SkochiSTRONG_ALIAS(_atomic_add_long_nv,_atomic_add_64_nv) 238473f1b48SkochiSTRONG_ALIAS(_atomic_add_ptr_nv,_atomic_add_64_nv) 239473f1b48Skochi 240473f1b48SkochiSTRONG_ALIAS(_atomic_and_uint,_atomic_and_32) 241473f1b48SkochiSTRONG_ALIAS(_atomic_and_ulong,_atomic_and_64) 242473f1b48SkochiSTRONG_ALIAS(_atomic_and_ptr,_atomic_and_64) 243473f1b48Skochi 244473f1b48SkochiSTRONG_ALIAS(_atomic_and_uint_nv,_atomic_and_32_nv) 245473f1b48SkochiSTRONG_ALIAS(_atomic_and_ulong_nv,_atomic_and_64_nv) 246473f1b48SkochiSTRONG_ALIAS(_atomic_and_ptr_nv,_atomic_and_64_nv) 247473f1b48Skochi 248473f1b48SkochiSTRONG_ALIAS(_atomic_dec_uint,_atomic_dec_32) 249473f1b48SkochiSTRONG_ALIAS(_atomic_dec_ulong,_atomic_dec_64) 250473f1b48SkochiSTRONG_ALIAS(_atomic_dec_ptr,_atomic_dec_64) 251473f1b48Skochi 252473f1b48SkochiSTRONG_ALIAS(_atomic_dec_uint_nv,_atomic_dec_32_nv) 253473f1b48SkochiSTRONG_ALIAS(_atomic_dec_ulong_nv,_atomic_dec_64_nv) 254473f1b48SkochiSTRONG_ALIAS(_atomic_dec_ptr_nv,_atomic_dec_64_nv) 255473f1b48Skochi 256473f1b48SkochiSTRONG_ALIAS(_atomic_inc_uint,_atomic_inc_32) 257473f1b48SkochiSTRONG_ALIAS(_atomic_inc_ulong,_atomic_inc_64) 258473f1b48SkochiSTRONG_ALIAS(_atomic_inc_ptr,_atomic_inc_64) 259473f1b48Skochi 260473f1b48SkochiSTRONG_ALIAS(_atomic_inc_uint_nv,_atomic_inc_32_nv) 261473f1b48SkochiSTRONG_ALIAS(_atomic_inc_ulong_nv,_atomic_inc_64_nv) 262473f1b48SkochiSTRONG_ALIAS(_atomic_inc_ptr_nv,_atomic_inc_64_nv) 263473f1b48Skochi 264473f1b48SkochiSTRONG_ALIAS(_atomic_or_uint,_atomic_or_32) 265473f1b48SkochiSTRONG_ALIAS(_atomic_or_ulong,_atomic_or_64) 266473f1b48SkochiSTRONG_ALIAS(_atomic_or_ptr,_atomic_or_64) 267473f1b48Skochi 268473f1b48SkochiSTRONG_ALIAS(_atomic_or_uint_nv,_atomic_or_32_nv) 269473f1b48SkochiSTRONG_ALIAS(_atomic_or_ulong_nv,_atomic_or_64_nv) 270473f1b48SkochiSTRONG_ALIAS(_atomic_or_ptr_nv,_atomic_or_64_nv) 271473f1b48Skochi 272473f1b48SkochiSTRONG_ALIAS(_atomic_swap_uint,_atomic_swap_32) 273473f1b48SkochiSTRONG_ALIAS(_atomic_swap_ulong,_atomic_swap_64) 274473f1b48SkochiSTRONG_ALIAS(_atomic_swap_ptr,_atomic_swap_64) 275473f1b48Skochi 276473f1b48SkochiSTRONG_ALIAS(_atomic_cas_uint,_atomic_cas_32) 277473f1b48SkochiSTRONG_ALIAS(_atomic_cas_ulong,_atomic_cas_64) 278473f1b48SkochiSTRONG_ALIAS(_atomic_cas_ptr,_atomic_cas_64) 2792ead1ed5Skochi 2802ead1ed5SkochiSTRONG_ALIAS(_atomic_cas_uint_ni,_atomic_cas_32) 2812ead1ed5SkochiSTRONG_ALIAS(_atomic_cas_ulong_ni,_atomic_cas_64) 2822ead1ed5SkochiSTRONG_ALIAS(_atomic_cas_ptr_ni,_atomic_cas_64) 283