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