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 42 ENTRY(_atomic_dec_32,1) 43 fetchadd4.rel r8=[r32],-1 44 br.ret.sptk rp 45 END(_atomic_dec_32) 46 47 ENTRY(_atomic_dec_64,1) 48 fetchadd8.rel r8=[r32],-1 49 br.ret.sptk rp 50 END(_atomic_dec_64) 51 52 ENTRY(_atomic_dec_32_nv,1) 53 fetchadd4.rel r8=[r32],-1 54 br.ret.sptk rp 55 END(_atomic_dec_32_nv) 56 57 ENTRY(_atomic_dec_64_nv,1) 58 fetchadd8.rel r8=[r32],-1 59 br.ret.sptk rp 60 END(_atomic_dec_64_nv) 61 62 ENTRY(_atomic_inc_32,1) 63 fetchadd4.rel r8=[r32],1 64 br.ret.sptk rp 65 END(_atomic_inc_32) 66 67 ENTRY(_atomic_inc_64,1) 68 fetchadd8.rel r8=[r32],1 69 br.ret.sptk rp 70 END(_atomic_inc_64) 71 72 ENTRY(_atomic_inc_32_nv,1) 73 fetchadd4.rel r8=[r32],1 74 br.ret.sptk rp 75 END(_atomic_inc_32_nv) 76 77 ENTRY(_atomic_inc_64_nv,1) 78 fetchadd8.rel r8=[r32],1 79 br.ret.sptk rp 80 END(_atomic_inc_64_nv) 81 82 ENTRY(_atomic_swap_32,2) 83 xchg4 r8=[r32],r33 84 ;; 85 mov r33=r8 86 br.ret.sptk rp 87 END(_atomic_swap_32) 88 89 ENTRY(_atomic_swap_64,2) 90 xchg8 r8=[r32],r33 91 ;; 92 mov r33=r8 93 br.ret.sptk rp 94 END(_atomic_swap_64) 95 96 ENTRY(_atomic_cas_32,3) 97 mov ar.ccv=r33 98 ;; 99 cmpxchg4.acq r8=[r32],r34,ar.ccv 100 br.ret.sptk rp 101 END(_atomic_cas_32) 102 103 ENTRY(_atomic_cas_64,3) 104 mov ar.ccv=r33 105 ;; 106 cmpxchg8.acq r8=[r32],r34,ar.ccv 107 br.ret.sptk rp 108 END(_atomic_cas_64) 109 110 ENTRY(_membar_consumer,0) 111 mf 112 br.ret.sptk rp 113 END(_membar_consumer) 114 115 ENTRY(_membar_producer,0) 116 mf 117 br.ret.sptk rp 118 END(_membar_producer) 119 120 ENTRY(_membar_acquire,0) 121 mf 122 br.ret.sptk rp 123 END(_membar_acquire) 124 125 ENTRY(_membar_release,0) 126 mf 127 br.ret.sptk rp 128 END(_membar_release) 129 130 ENTRY(_membar_enter,0) 131 mf 132 br.ret.sptk rp 133 END(_membar_enter) 134 135 ENTRY(_membar_exit,0) 136 mf 137 br.ret.sptk rp 138 END(_membar_exit) 139 140 ENTRY(_membar_sync,0) 141 mf 142 br.ret.sptk rp 143 END(_membar_sync) 144 145 146 ALIAS(atomic_add_32,_atomic_add_32) 147 ALIAS(atomic_add_int,_atomic_add_32) 148 ALIAS(atomic_add_64,_atomic_add_64) 149 ALIAS(atomic_add_long,_atomic_add_64) 150 ALIAS(atomic_add_ptr,_atomic_add_64) 151 152 ALIAS(atomic_add_32_nv,_atomic_add_32_nv) 153 ALIAS(atomic_add_int_nv,_atomic_add_32_nv) 154 ALIAS(atomic_add_64_nv,_atomic_add_64_nv) 155 ALIAS(atomic_add_long_nv,_atomic_add_64_nv) 156 ALIAS(atomic_add_ptr_nv,_atomic_add_64_nv) 157 158 ALIAS(atomic_and_32,_atomic_and_32) 159 ALIAS(atomic_and_uint,_atomic_and_32) 160 ALIAS(atomic_and_64,_atomic_and_64) 161 ALIAS(atomic_and_ulong,_atomic_and_64) 162 ALIAS(atomic_and_ptr,_atomic_and_64) 163 164 ALIAS(atomic_and_32_nv,_atomic_and_32_nv) 165 ALIAS(atomic_and_uint_nv,_atomic_and_32_nv) 166 ALIAS(atomic_and_64_nv,_atomic_and_64_nv) 167 ALIAS(atomic_and_ulong_nv,_atomic_and_64_nv) 168 ALIAS(atomic_and_ptr_nv,_atomic_and_64_nv) 169 170 ALIAS(atomic_dec_32,_atomic_dec_32) 171 ALIAS(atomic_dec_uint,_atomic_dec_32) 172 ALIAS(atomic_dec_64,_atomic_dec_64) 173 ALIAS(atomic_dec_ulong,_atomic_dec_64) 174 ALIAS(atomic_dec_ptr,_atomic_dec_64) 175 176 ALIAS(atomic_dec_32_nv,_atomic_dec_32_nv) 177 ALIAS(atomic_dec_uint_nv,_atomic_dec_32_nv) 178 ALIAS(atomic_dec_64_nv,_atomic_dec_64_nv) 179 ALIAS(atomic_dec_ulong_nv,_atomic_dec_64_nv) 180 ALIAS(atomic_dec_ptr_nv,_atomic_dec_64_nv) 181 182 ALIAS(atomic_inc_32,_atomic_inc_32) 183 ALIAS(atomic_inc_uint,_atomic_inc_32) 184 ALIAS(atomic_inc_64,_atomic_inc_64) 185 ALIAS(atomic_inc_ulong,_atomic_inc_64) 186 ALIAS(atomic_inc_ptr,_atomic_inc_64) 187 188 ALIAS(atomic_inc_32_nv,_atomic_inc_32_nv) 189 ALIAS(atomic_inc_uint_nv,_atomic_inc_32_nv) 190 ALIAS(atomic_inc_64_nv,_atomic_inc_64_nv) 191 ALIAS(atomic_inc_ulong_nv,_atomic_inc_64_nv) 192 ALIAS(atomic_inc_ptr_nv,_atomic_inc_64_nv) 193 194 ALIAS(atomic_or_32,_atomic_or_32) 195 ALIAS(atomic_or_uint,_atomic_or_32) 196 ALIAS(atomic_or_64,_atomic_or_64) 197 ALIAS(atomic_or_ulong,_atomic_or_64) 198 ALIAS(atomic_or_ptr,_atomic_or_64) 199 200 ALIAS(atomic_or_32_nv,_atomic_or_32_nv) 201 ALIAS(atomic_or_uint_nv,_atomic_or_32_nv) 202 ALIAS(atomic_or_64_nv,_atomic_or_64_nv) 203 ALIAS(atomic_or_ulong_nv,_atomic_or_64_nv) 204 ALIAS(atomic_or_ptr_nv,_atomic_or_64_nv) 205 206 ALIAS(atomic_swap_32,_atomic_swap_32) 207 ALIAS(atomic_swap_uint,_atomic_swap_32) 208 ALIAS(atomic_swap_64,_atomic_swap_64) 209 ALIAS(atomic_swap_ulong,_atomic_swap_64) 210 ALIAS(atomic_swap_ptr,_atomic_swap_64) 211 212 ALIAS(atomic_cas_32,_atomic_cas_32) 213 ALIAS(atomic_cas_uint,_atomic_cas_32) 214 ALIAS(atomic_cas_64,_atomic_cas_64) 215 ALIAS(atomic_cas_ulong,_atomic_cas_64) 216 ALIAS(atomic_cas_ptr,_atomic_cas_64) 217 218 ALIAS(atomic_cas_32_ni,_atomic_cas_32) 219 ALIAS(atomic_cas_uint_ni,_atomic_cas_32) 220 ALIAS(atomic_cas_64_ni,_atomic_cas_64) 221 ALIAS(atomic_cas_ulong_ni,_atomic_cas_64) 222 ALIAS(atomic_cas_ptr_ni,_atomic_cas_64) 223 224 ALIAS(membar_consumer,_membar_consumer) 225 ALIAS(membar_producer,_membar_producer) 226 ALIAS(membar_acquire,_membar_acquire) 227 ALIAS(membar_release,_membar_release) 228 ALIAS(membar_enter,_membar_enter) 229 ALIAS(membar_exit,_membar_exit) 230 ALIAS(membar_sync,_membar_sync) 231 232 STRONG_ALIAS(_atomic_add_int,_atomic_add_32) 233 STRONG_ALIAS(_atomic_add_long,_atomic_add_64) 234 STRONG_ALIAS(_atomic_add_ptr,_atomic_add_64) 235 236 STRONG_ALIAS(_atomic_add_int_nv,_atomic_add_32_nv) 237 STRONG_ALIAS(_atomic_add_long_nv,_atomic_add_64_nv) 238 STRONG_ALIAS(_atomic_add_ptr_nv,_atomic_add_64_nv) 239 240 STRONG_ALIAS(_atomic_and_uint,_atomic_and_32) 241 STRONG_ALIAS(_atomic_and_ulong,_atomic_and_64) 242 STRONG_ALIAS(_atomic_and_ptr,_atomic_and_64) 243 244 STRONG_ALIAS(_atomic_and_uint_nv,_atomic_and_32_nv) 245 STRONG_ALIAS(_atomic_and_ulong_nv,_atomic_and_64_nv) 246 STRONG_ALIAS(_atomic_and_ptr_nv,_atomic_and_64_nv) 247 248 STRONG_ALIAS(_atomic_dec_uint,_atomic_dec_32) 249 STRONG_ALIAS(_atomic_dec_ulong,_atomic_dec_64) 250 STRONG_ALIAS(_atomic_dec_ptr,_atomic_dec_64) 251 252 STRONG_ALIAS(_atomic_dec_uint_nv,_atomic_dec_32_nv) 253 STRONG_ALIAS(_atomic_dec_ulong_nv,_atomic_dec_64_nv) 254 STRONG_ALIAS(_atomic_dec_ptr_nv,_atomic_dec_64_nv) 255 256 STRONG_ALIAS(_atomic_inc_uint,_atomic_inc_32) 257 STRONG_ALIAS(_atomic_inc_ulong,_atomic_inc_64) 258 STRONG_ALIAS(_atomic_inc_ptr,_atomic_inc_64) 259 260 STRONG_ALIAS(_atomic_inc_uint_nv,_atomic_inc_32_nv) 261 STRONG_ALIAS(_atomic_inc_ulong_nv,_atomic_inc_64_nv) 262 STRONG_ALIAS(_atomic_inc_ptr_nv,_atomic_inc_64_nv) 263 264 STRONG_ALIAS(_atomic_or_uint,_atomic_or_32) 265 STRONG_ALIAS(_atomic_or_ulong,_atomic_or_64) 266 STRONG_ALIAS(_atomic_or_ptr,_atomic_or_64) 267 268 STRONG_ALIAS(_atomic_or_uint_nv,_atomic_or_32_nv) 269 STRONG_ALIAS(_atomic_or_ulong_nv,_atomic_or_64_nv) 270 STRONG_ALIAS(_atomic_or_ptr_nv,_atomic_or_64_nv) 271 272 STRONG_ALIAS(_atomic_swap_uint,_atomic_swap_32) 273 STRONG_ALIAS(_atomic_swap_ulong,_atomic_swap_64) 274 STRONG_ALIAS(_atomic_swap_ptr,_atomic_swap_64) 275 276 STRONG_ALIAS(_atomic_cas_uint,_atomic_cas_32) 277 STRONG_ALIAS(_atomic_cas_ulong,_atomic_cas_64) 278 STRONG_ALIAS(_atomic_cas_ptr,_atomic_cas_64) 279 280 STRONG_ALIAS(_atomic_cas_uint_ni,_atomic_cas_32) 281 STRONG_ALIAS(_atomic_cas_ulong_ni,_atomic_cas_64) 282 STRONG_ALIAS(_atomic_cas_ptr_ni,_atomic_cas_64) 283