1/* $NetBSD: atomic.S,v 1.7 2022/04/09 23:32:51 riastradh Exp $ */ 2 3/*- 4 * Copyright (c) 2008 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Takayoshi Kochi. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32#include <machine/asm.h> 33 34#ifdef _KERNEL 35#define ALIAS(f, t) STRONG_ALIAS(f,t) 36#else 37#define ALIAS(f, t) WEAK_ALIAS(f,t) 38#endif 39 40 .text 41 42ENTRY(_atomic_dec_32,1) 43 fetchadd4.rel r8=[r32],-1 44 br.ret.sptk rp 45END(_atomic_dec_32) 46 47ENTRY(_atomic_dec_64,1) 48 fetchadd8.rel r8=[r32],-1 49 br.ret.sptk rp 50END(_atomic_dec_64) 51 52ENTRY(_atomic_dec_32_nv,1) 53 fetchadd4.rel r8=[r32],-1 54 br.ret.sptk rp 55END(_atomic_dec_32_nv) 56 57ENTRY(_atomic_dec_64_nv,1) 58 fetchadd8.rel r8=[r32],-1 59 br.ret.sptk rp 60END(_atomic_dec_64_nv) 61 62ENTRY(_atomic_inc_32,1) 63 fetchadd4.rel r8=[r32],1 64 br.ret.sptk rp 65END(_atomic_inc_32) 66 67ENTRY(_atomic_inc_64,1) 68 fetchadd8.rel r8=[r32],1 69 br.ret.sptk rp 70END(_atomic_inc_64) 71 72ENTRY(_atomic_inc_32_nv,1) 73 fetchadd4.rel r8=[r32],1 74 br.ret.sptk rp 75END(_atomic_inc_32_nv) 76 77ENTRY(_atomic_inc_64_nv,1) 78 fetchadd8.rel r8=[r32],1 79 br.ret.sptk rp 80END(_atomic_inc_64_nv) 81 82ENTRY(_atomic_swap_32,2) 83 xchg4 r8=[r32],r33 84 ;; 85 mov r33=r8 86 br.ret.sptk rp 87END(_atomic_swap_32) 88 89ENTRY(_atomic_swap_64,2) 90 xchg8 r8=[r32],r33 91 ;; 92 mov r33=r8 93 br.ret.sptk rp 94END(_atomic_swap_64) 95 96ENTRY(_atomic_cas_32,3) 97 mov ar.ccv=r33 98 ;; 99 cmpxchg4.acq r8=[r32],r34,ar.ccv 100 br.ret.sptk rp 101END(_atomic_cas_32) 102 103ENTRY(_atomic_cas_64,3) 104 mov ar.ccv=r33 105 ;; 106 cmpxchg8.acq r8=[r32],r34,ar.ccv 107 br.ret.sptk rp 108END(_atomic_cas_64) 109 110ENTRY(_membar_consumer,0) 111 mf 112 br.ret.sptk rp 113END(_membar_consumer) 114 115ENTRY(_membar_producer,0) 116 mf 117 br.ret.sptk rp 118END(_membar_producer) 119 120ENTRY(_membar_acquire,0) 121 mf 122 br.ret.sptk rp 123END(_membar_acquire) 124 125ENTRY(_membar_release,0) 126 mf 127 br.ret.sptk rp 128END(_membar_release) 129 130ENTRY(_membar_enter,0) 131 mf 132 br.ret.sptk rp 133END(_membar_enter) 134 135ENTRY(_membar_exit,0) 136 mf 137 br.ret.sptk rp 138END(_membar_exit) 139 140ENTRY(_membar_sync,0) 141 mf 142 br.ret.sptk rp 143END(_membar_sync) 144 145 146ALIAS(atomic_add_32,_atomic_add_32) 147ALIAS(atomic_add_int,_atomic_add_32) 148ALIAS(atomic_add_64,_atomic_add_64) 149ALIAS(atomic_add_long,_atomic_add_64) 150ALIAS(atomic_add_ptr,_atomic_add_64) 151 152ALIAS(atomic_add_32_nv,_atomic_add_32_nv) 153ALIAS(atomic_add_int_nv,_atomic_add_32_nv) 154ALIAS(atomic_add_64_nv,_atomic_add_64_nv) 155ALIAS(atomic_add_long_nv,_atomic_add_64_nv) 156ALIAS(atomic_add_ptr_nv,_atomic_add_64_nv) 157 158ALIAS(atomic_and_32,_atomic_and_32) 159ALIAS(atomic_and_uint,_atomic_and_32) 160ALIAS(atomic_and_64,_atomic_and_64) 161ALIAS(atomic_and_ulong,_atomic_and_64) 162ALIAS(atomic_and_ptr,_atomic_and_64) 163 164ALIAS(atomic_and_32_nv,_atomic_and_32_nv) 165ALIAS(atomic_and_uint_nv,_atomic_and_32_nv) 166ALIAS(atomic_and_64_nv,_atomic_and_64_nv) 167ALIAS(atomic_and_ulong_nv,_atomic_and_64_nv) 168ALIAS(atomic_and_ptr_nv,_atomic_and_64_nv) 169 170ALIAS(atomic_dec_32,_atomic_dec_32) 171ALIAS(atomic_dec_uint,_atomic_dec_32) 172ALIAS(atomic_dec_64,_atomic_dec_64) 173ALIAS(atomic_dec_ulong,_atomic_dec_64) 174ALIAS(atomic_dec_ptr,_atomic_dec_64) 175 176ALIAS(atomic_dec_32_nv,_atomic_dec_32_nv) 177ALIAS(atomic_dec_uint_nv,_atomic_dec_32_nv) 178ALIAS(atomic_dec_64_nv,_atomic_dec_64_nv) 179ALIAS(atomic_dec_ulong_nv,_atomic_dec_64_nv) 180ALIAS(atomic_dec_ptr_nv,_atomic_dec_64_nv) 181 182ALIAS(atomic_inc_32,_atomic_inc_32) 183ALIAS(atomic_inc_uint,_atomic_inc_32) 184ALIAS(atomic_inc_64,_atomic_inc_64) 185ALIAS(atomic_inc_ulong,_atomic_inc_64) 186ALIAS(atomic_inc_ptr,_atomic_inc_64) 187 188ALIAS(atomic_inc_32_nv,_atomic_inc_32_nv) 189ALIAS(atomic_inc_uint_nv,_atomic_inc_32_nv) 190ALIAS(atomic_inc_64_nv,_atomic_inc_64_nv) 191ALIAS(atomic_inc_ulong_nv,_atomic_inc_64_nv) 192ALIAS(atomic_inc_ptr_nv,_atomic_inc_64_nv) 193 194ALIAS(atomic_or_32,_atomic_or_32) 195ALIAS(atomic_or_uint,_atomic_or_32) 196ALIAS(atomic_or_64,_atomic_or_64) 197ALIAS(atomic_or_ulong,_atomic_or_64) 198ALIAS(atomic_or_ptr,_atomic_or_64) 199 200ALIAS(atomic_or_32_nv,_atomic_or_32_nv) 201ALIAS(atomic_or_uint_nv,_atomic_or_32_nv) 202ALIAS(atomic_or_64_nv,_atomic_or_64_nv) 203ALIAS(atomic_or_ulong_nv,_atomic_or_64_nv) 204ALIAS(atomic_or_ptr_nv,_atomic_or_64_nv) 205 206ALIAS(atomic_swap_32,_atomic_swap_32) 207ALIAS(atomic_swap_uint,_atomic_swap_32) 208ALIAS(atomic_swap_64,_atomic_swap_64) 209ALIAS(atomic_swap_ulong,_atomic_swap_64) 210ALIAS(atomic_swap_ptr,_atomic_swap_64) 211 212ALIAS(atomic_cas_32,_atomic_cas_32) 213ALIAS(atomic_cas_uint,_atomic_cas_32) 214ALIAS(atomic_cas_64,_atomic_cas_64) 215ALIAS(atomic_cas_ulong,_atomic_cas_64) 216ALIAS(atomic_cas_ptr,_atomic_cas_64) 217 218ALIAS(atomic_cas_32_ni,_atomic_cas_32) 219ALIAS(atomic_cas_uint_ni,_atomic_cas_32) 220ALIAS(atomic_cas_64_ni,_atomic_cas_64) 221ALIAS(atomic_cas_ulong_ni,_atomic_cas_64) 222ALIAS(atomic_cas_ptr_ni,_atomic_cas_64) 223 224ALIAS(membar_consumer,_membar_consumer) 225ALIAS(membar_producer,_membar_producer) 226ALIAS(membar_acquire,_membar_acquire) 227ALIAS(membar_release,_membar_release) 228ALIAS(membar_enter,_membar_enter) 229ALIAS(membar_exit,_membar_exit) 230ALIAS(membar_sync,_membar_sync) 231 232STRONG_ALIAS(_atomic_add_int,_atomic_add_32) 233STRONG_ALIAS(_atomic_add_long,_atomic_add_64) 234STRONG_ALIAS(_atomic_add_ptr,_atomic_add_64) 235 236STRONG_ALIAS(_atomic_add_int_nv,_atomic_add_32_nv) 237STRONG_ALIAS(_atomic_add_long_nv,_atomic_add_64_nv) 238STRONG_ALIAS(_atomic_add_ptr_nv,_atomic_add_64_nv) 239 240STRONG_ALIAS(_atomic_and_uint,_atomic_and_32) 241STRONG_ALIAS(_atomic_and_ulong,_atomic_and_64) 242STRONG_ALIAS(_atomic_and_ptr,_atomic_and_64) 243 244STRONG_ALIAS(_atomic_and_uint_nv,_atomic_and_32_nv) 245STRONG_ALIAS(_atomic_and_ulong_nv,_atomic_and_64_nv) 246STRONG_ALIAS(_atomic_and_ptr_nv,_atomic_and_64_nv) 247 248STRONG_ALIAS(_atomic_dec_uint,_atomic_dec_32) 249STRONG_ALIAS(_atomic_dec_ulong,_atomic_dec_64) 250STRONG_ALIAS(_atomic_dec_ptr,_atomic_dec_64) 251 252STRONG_ALIAS(_atomic_dec_uint_nv,_atomic_dec_32_nv) 253STRONG_ALIAS(_atomic_dec_ulong_nv,_atomic_dec_64_nv) 254STRONG_ALIAS(_atomic_dec_ptr_nv,_atomic_dec_64_nv) 255 256STRONG_ALIAS(_atomic_inc_uint,_atomic_inc_32) 257STRONG_ALIAS(_atomic_inc_ulong,_atomic_inc_64) 258STRONG_ALIAS(_atomic_inc_ptr,_atomic_inc_64) 259 260STRONG_ALIAS(_atomic_inc_uint_nv,_atomic_inc_32_nv) 261STRONG_ALIAS(_atomic_inc_ulong_nv,_atomic_inc_64_nv) 262STRONG_ALIAS(_atomic_inc_ptr_nv,_atomic_inc_64_nv) 263 264STRONG_ALIAS(_atomic_or_uint,_atomic_or_32) 265STRONG_ALIAS(_atomic_or_ulong,_atomic_or_64) 266STRONG_ALIAS(_atomic_or_ptr,_atomic_or_64) 267 268STRONG_ALIAS(_atomic_or_uint_nv,_atomic_or_32_nv) 269STRONG_ALIAS(_atomic_or_ulong_nv,_atomic_or_64_nv) 270STRONG_ALIAS(_atomic_or_ptr_nv,_atomic_or_64_nv) 271 272STRONG_ALIAS(_atomic_swap_uint,_atomic_swap_32) 273STRONG_ALIAS(_atomic_swap_ulong,_atomic_swap_64) 274STRONG_ALIAS(_atomic_swap_ptr,_atomic_swap_64) 275 276STRONG_ALIAS(_atomic_cas_uint,_atomic_cas_32) 277STRONG_ALIAS(_atomic_cas_ulong,_atomic_cas_64) 278STRONG_ALIAS(_atomic_cas_ptr,_atomic_cas_64) 279 280STRONG_ALIAS(_atomic_cas_uint_ni,_atomic_cas_32) 281STRONG_ALIAS(_atomic_cas_ulong_ni,_atomic_cas_64) 282STRONG_ALIAS(_atomic_cas_ptr_ni,_atomic_cas_64) 283