atomic.h revision 80708
1/*- 2 * Copyright (c) 2001 Jake Burkholder. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $FreeBSD: head/sys/sparc64/include/atomic.h 80708 2001-07-31 05:45:16Z jake $ 27 */ 28 29/* 30 * This is not atomic. It is just a stub to make things compile. 31 */ 32 33#ifndef _MACHINE_ATOMIC_H_ 34#define _MACHINE_ATOMIC_H_ 35 36#define __atomic_op(p, op, v) ({ \ 37 __typeof(*p) __v = (__typeof(*p))v; \ 38 *p op __v; \ 39}) 40 41#define __atomic_load(p) ({ \ 42 __typeof(*p) __v; \ 43 __v = *p; \ 44 __v; \ 45}) 46 47#define __atomic_load_clear(p) ({ \ 48 __typeof(*p) __v; \ 49 __v = *p; \ 50 *p = 0; \ 51 __v; \ 52}) 53 54#define __atomic_cas(p, e, s) ({ \ 55 u_int __v; \ 56 if (*p == (__typeof(*p))e) { \ 57 *p = (__typeof(*p))s; \ 58 __v = 1; \ 59 } else { \ 60 __v = 0; \ 61 } \ 62 __v; \ 63}) 64 65#define __atomic_op_8(p, op, v) __atomic_op(p, op, v) 66#define __atomic_op_16(p, op, v) __atomic_op(p, op, v) 67#define __atomic_op_32(p, op, v) __atomic_op(p, op, v) 68#define __atomic_load_32(p) __atomic_load(p) 69#define __atomic_load_clear_32(p) __atomic_load_clear(p) 70#define __atomic_cas_32(p, e, s) __atomic_cas(p, e, s) 71#define __atomic_op_64(p, op, v) __atomic_op(p, op, v) 72#define __atomic_load_64(p) __atomic_load(p) 73#define __atomic_load_clear_64(p) __atomic_load_clear(p) 74#define __atomic_cas_64(p, e, s) __atomic_cas(p, e, s) 75 76#define atomic_add_8(p, v) __atomic_op_8(p, +=, v) 77#define atomic_subtract_8(p, v) __atomic_op_8(p, -=, v) 78#define atomic_set_8(p, v) __atomic_op_8(p, |=, v) 79#define atomic_clear_8(p, v) __atomic_op_8(p, &=, ~v) 80#define atomic_store_8(p, v) __atomic_op_8(p, =, v) 81 82#define atomic_add_16(p, v) __atomic_op_16(p, +=, v) 83#define atomic_subtract_16(p, v) __atomic_op_16(p, -=, v) 84#define atomic_set_16(p, v) __atomic_op_16(p, |=, v) 85#define atomic_clear_16(p, v) __atomic_op_16(p, &=, ~v) 86#define atomic_store_16(p, v) __atomic_op_16(p, =, v) 87 88#define atomic_add_32(p, v) __atomic_op_32(p, +=, v) 89#define atomic_subtract_32(p, v) __atomic_op_32(p, -=, v) 90#define atomic_set_32(p, v) __atomic_op_32(p, |=, v) 91#define atomic_clear_32(p, v) __atomic_op_32(p, &=, ~v) 92#define atomic_store_32(p, v) __atomic_op_32(p, =, v) 93#define atomic_load_32(p) __atomic_load_32(p) 94#define atomic_readandclear_32(p) __atomic_load_clear_32(p) 95#define atomic_cmpset_32(p, e, s) __atomic_cas_32(p, e, s) 96 97#define atomic_add_64(p, v) __atomic_op_64(p, +=, v) 98#define atomic_subtract_64(p, v) __atomic_op_64(p, -=, v) 99#define atomic_set_64(p, v) __atomic_op_64(p, |=, v) 100#define atomic_clear_64(p, v) __atomic_op_64(p, &=, ~v) 101#define atomic_store_64(p, v) __atomic_op_64(p, =, v) 102#define atomic_load_64(p) __atomic_load_64(p) 103#define atomic_readandclear_64(p) __atomic_load_clear_64(p) 104#define atomic_cmpset_64(p, e, s) __atomic_cas_64(p, e, s) 105 106#define atomic_add_acq_8(p, v) __atomic_op_8(p, +=, v) 107#define atomic_subtract_acq_8(p, v) __atomic_op_8(p, -=, v) 108#define atomic_set_acq_8(p, v) __atomic_op_8(p, |=, v) 109#define atomic_clear_acq_8(p, v) __atomic_op_8(p, &=, ~v) 110#define atomic_store_acq_8(p, v) __atomic_op_8(p, =, v) 111 112#define atomic_add_acq_16(p, v) __atomic_op_16(p, +=, v) 113#define atomic_subtract_acq_16(p, v) __atomic_op_16(p, -=, v) 114#define atomic_set_acq_16(p, v) __atomic_op_16(p, |=, v) 115#define atomic_clear_acq_16(p, v) __atomic_op_16(p, &=, ~v) 116#define atomic_store_acq_16(p, v) __atomic_op_16(p, =, v) 117 118#define atomic_add_acq_32(p, v) __atomic_op_32(p, +=, v) 119#define atomic_subtract_acq_32(p, v) __atomic_op_32(p, -=, v) 120#define atomic_set_acq_32(p, v) __atomic_op_32(p, |=, v) 121#define atomic_clear_acq_32(p, v) __atomic_op_32(p, &=, ~v) 122#define atomic_store_acq_32(p, v) __atomic_op_32(p, =, v) 123#define atomic_load_acq_32(p) __atomic_load_32(p) 124#define atomic_cmpset_acq_32(p, e, s) __atomic_cas_32(p, e, s) 125 126#define atomic_add_acq_64(p, v) __atomic_op_64(p, +=, v) 127#define atomic_subtract_acq_64(p, v) __atomic_op_64(p, -=, v) 128#define atomic_set_acq_64(p, v) __atomic_op_64(p, |=, v) 129#define atomic_clear_acq_64(p, v) __atomic_op_64(p, &=, ~v) 130#define atomic_store_acq_64(p, v) __atomic_op_64(p, =, v) 131#define atomic_load_acq_64(p) __atomic_load_64(p) 132#define atomic_cmpset_acq_64(p, e, s) __atomic_cas_64(p, e, s) 133 134#define atomic_add_rel_8(p, v) __atomic_op_8(p, +=, v) 135#define atomic_subtract_rel_8(p, v) __atomic_op_8(p, -=, v) 136#define atomic_set_rel_8(p, v) __atomic_op_8(p, |=, v) 137#define atomic_clear_rel_8(p, v) __atomic_op_8(p, &=, ~v) 138#define atomic_store_rel_8(p, v) __atomic_op_8(p, =, v) 139 140#define atomic_add_rel_16(p, v) __atomic_op_16(p, +=, v) 141#define atomic_subtract_rel_16(p, v) __atomic_op_16(p, -=, v) 142#define atomic_set_rel_16(p, v) __atomic_op_16(p, |=, v) 143#define atomic_clear_rel_16(p, v) __atomic_op_16(p, &=, ~v) 144#define atomic_store_rel_16(p, v) __atomic_op_16(p, =, v) 145 146#define atomic_add_rel_32(p, v) __atomic_op_32(p, +=, v) 147#define atomic_subtract_rel_32(p, v) __atomic_op_32(p, -=, v) 148#define atomic_set_rel_32(p, v) __atomic_op_32(p, |=, v) 149#define atomic_clear_rel_32(p, v) __atomic_op_32(p, &=, ~v) 150#define atomic_store_rel_32(p, v) __atomic_op_32(p, =, v) 151#define atomic_cmpset_rel_32(p, e, s) __atomic_cas_32(p, e, s) 152 153#define atomic_add_rel_64(p, v) __atomic_op_64(p, +=, v) 154#define atomic_subtract_rel_64(p, v) __atomic_op_64(p, -=, v) 155#define atomic_set_rel_64(p, v) __atomic_op_64(p, |=, v) 156#define atomic_clear_rel_64(p, v) __atomic_op_64(p, &=, ~v) 157#define atomic_store_rel_64(p, v) __atomic_op_64(p, =, v) 158#define atomic_cmpset_rel_64(p, e, s) __atomic_cas_64(p, e, s) 159 160#define atomic_add_char(p, v) __atomic_op_8(p, +=, v) 161#define atomic_subtract_char(p, v) __atomic_op_8(p, -=, v) 162#define atomic_set_char(p, v) __atomic_op_8(p, |=, v) 163#define atomic_clear_char(p, v) __atomic_op_8(p, &=, ~v) 164#define atomic_store_char(p, v) __atomic_op_8(p, =, v) 165 166#define atomic_add_short(p, v) __atomic_op_16(p, +=, v) 167#define atomic_subtract_short(p, v) __atomic_op_16(p, -=, v) 168#define atomic_set_short(p, v) __atomic_op_16(p, |=, v) 169#define atomic_clear_short(p, v) __atomic_op_16(p, &=, ~v) 170#define atomic_store_short(p, v) __atomic_op_16(p, =, v) 171 172#define atomic_add_int(p, v) __atomic_op_32(p, +=, v) 173#define atomic_subtract_int(p, v) __atomic_op_32(p, -=, v) 174#define atomic_set_int(p, v) __atomic_op_32(p, |=, v) 175#define atomic_clear_int(p, v) __atomic_op_32(p, &=, ~v) 176#define atomic_store_int(p, v) __atomic_op_32(p, =, v) 177#define atomic_load_int(p) __atomic_load_32(p) 178#define atomic_readandclear_int(p) __atomic_load_clear_32(p) 179#define atomic_cmpset_int(p, e, s) __atomic_cas_32(p, e, s) 180 181#define atomic_add_long(p, v) __atomic_op_64(p, +=, v) 182#define atomic_subtract_long(p, v) __atomic_op_64(p, -=, v) 183#define atomic_set_long(p, v) __atomic_op_64(p, |=, v) 184#define atomic_clear_long(p, v) __atomic_op_64(p, &=, ~v) 185#define atomic_store_long(p, v) __atomic_op_64(p, =, v) 186#define atomic_load_long(p) __atomic_load_64(p) 187#define atomic_readandclear_long(p) __atomic_load_clear_64(p) 188#define atomic_cmpset_long(p, e, s) __atomic_cas_64(p, e, s) 189 190#define atomic_add_acq_char(p, v) __atomic_op_8(p, +=, v) 191#define atomic_subtract_acq_char(p, v) __atomic_op_8(p, -=, v) 192#define atomic_set_acq_char(p, v) __atomic_op_8(p, |=, v) 193#define atomic_clear_acq_char(p, v) __atomic_op_8(p, &=, ~v) 194#define atomic_store_acq_char(p, v) __atomic_op_8(p, =, v) 195 196#define atomic_add_acq_short(p, v) __atomic_op_16(p, +=, v) 197#define atomic_subtract_acq_short(p, v) __atomic_op_16(p, -=, v) 198#define atomic_set_acq_short(p, v) __atomic_op_16(p, |=, v) 199#define atomic_clear_acq_short(p, v) __atomic_op_16(p, &=, ~v) 200#define atomic_store_acq_short(p, v) __atomic_op_16(p, =, v) 201 202#define atomic_add_acq_int(p, v) __atomic_op_32(p, +=, v) 203#define atomic_subtract_acq_int(p, v) __atomic_op_32(p, -=, v) 204#define atomic_set_acq_int(p, v) __atomic_op_32(p, |=, v) 205#define atomic_clear_acq_int(p, v) __atomic_op_32(p, &=, ~v) 206#define atomic_store_acq_int(p, v) __atomic_op_32(p, =, v) 207#define atomic_load_acq_int(p) __atomic_load_32(p) 208#define atomic_cmpset_acq_int(p, e, s) __atomic_cas_32(p, e, s) 209 210#define atomic_add_acq_long(p, v) __atomic_op_64(p, +=, v) 211#define atomic_subtract_acq_long(p, v) __atomic_op_64(p, -=, v) 212#define atomic_set_acq_long(p, v) __atomic_op_64(p, |=, v) 213#define atomic_clear_acq_long(p, v) __atomic_op_64(p, &=, ~v) 214#define atomic_store_acq_long(p, v) __atomic_op_64(p, =, v) 215#define atomic_load_acq_long(p) __atomic_load_64(p) 216#define atomic_cmpset_acq_long(p, e, s) __atomic_cas_64(p, e, s) 217 218#define atomic_add_rel_char(p, v) __atomic_op_8(p, +=, v) 219#define atomic_subtract_rel_char(p, v) __atomic_op_8(p, -=, v) 220#define atomic_set_rel_char(p, v) __atomic_op_8(p, |=, v) 221#define atomic_clear_rel_char(p, v) __atomic_op_8(p, &=, ~v) 222#define atomic_store_rel_char(p, v) __atomic_op_8(p, =, v) 223 224#define atomic_add_rel_short(p, v) __atomic_op_16(p, +=, v) 225#define atomic_subtract_rel_short(p, v) __atomic_op_16(p, -=, v) 226#define atomic_set_rel_short(p, v) __atomic_op_16(p, |=, v) 227#define atomic_clear_rel_short(p, v) __atomic_op_16(p, &=, ~v) 228#define atomic_store_rel_short(p, v) __atomic_op_16(p, =, v) 229 230#define atomic_add_rel_int(p, v) __atomic_op_32(p, +=, v) 231#define atomic_subtract_rel_int(p, v) __atomic_op_32(p, -=, v) 232#define atomic_set_rel_int(p, v) __atomic_op_32(p, |=, v) 233#define atomic_clear_rel_int(p, v) __atomic_op_32(p, &=, ~v) 234#define atomic_store_rel_int(p, v) __atomic_op_32(p, =, v) 235#define atomic_cmpset_rel_int(p, e, s) __atomic_cas_32(p, e, s) 236 237#define atomic_add_rel_long(p, v) __atomic_op_64(p, +=, v) 238#define atomic_subtract_rel_long(p, v) __atomic_op_64(p, -=, v) 239#define atomic_set_rel_long(p, v) __atomic_op_64(p, |=, v) 240#define atomic_clear_rel_long(p, v) __atomic_op_64(p, &=, ~v) 241#define atomic_store_rel_long(p, v) __atomic_op_64(p, =, v) 242#define atomic_cmpset_rel_long(p, e, s) __atomic_cas_64(p, e, s) 243 244#define atomic_add_char(p, v) __atomic_op_8(p, +=, v) 245#define atomic_subtract_char(p, v) __atomic_op_8(p, -=, v) 246#define atomic_set_char(p, v) __atomic_op_8(p, |=, v) 247#define atomic_clear_char(p, v) __atomic_op_8(p, &=, ~v) 248#define atomic_store_char(p, v) __atomic_op_8(p, =, v) 249 250#define atomic_add_short(p, v) __atomic_op_16(p, +=, v) 251#define atomic_subtract_short(p, v) __atomic_op_16(p, -=, v) 252#define atomic_set_short(p, v) __atomic_op_16(p, |=, v) 253#define atomic_clear_short(p, v) __atomic_op_16(p, &=, ~v) 254#define atomic_store_short(p, v) __atomic_op_16(p, =, v) 255 256#define atomic_add_int(p, v) __atomic_op_32(p, +=, v) 257#define atomic_subtract_int(p, v) __atomic_op_32(p, -=, v) 258#define atomic_set_int(p, v) __atomic_op_32(p, |=, v) 259#define atomic_clear_int(p, v) __atomic_op_32(p, &=, ~v) 260#define atomic_store_int(p, v) __atomic_op_32(p, =, v) 261#define atomic_load_int(p) __atomic_load_32(p) 262#define atomic_readandclear_int(p) __atomic_load_clear_32(p) 263#define atomic_cmpset_int(p, e, s) __atomic_cas_32(p, e, s) 264 265#define atomic_add_long(p, v) __atomic_op_64(p, +=, v) 266#define atomic_subtract_long(p, v) __atomic_op_64(p, -=, v) 267#define atomic_set_long(p, v) __atomic_op_64(p, |=, v) 268#define atomic_clear_long(p, v) __atomic_op_64(p, &=, ~v) 269#define atomic_store_long(p, v) __atomic_op_64(p, =, v) 270#define atomic_load_long(p) __atomic_load_64(p) 271#define atomic_readandclear_long(p) __atomic_load_clear_64(p) 272#define atomic_cmpset_long(p, e, s) __atomic_cas_64(p, e, s) 273 274#define atomic_add_ptr(p, v) __atomic_op_64(p, +=, v) 275#define atomic_subtract_ptr(p, v) __atomic_op_64(p, -=, v) 276#define atomic_set_ptr(p, v) __atomic_op_64(p, |=, v) 277#define atomic_clear_ptr(p, v) __atomic_op_64(p, &=, ~v) 278#define atomic_store_ptr(p, v) __atomic_op_64(p, =, v) 279#define atomic_load_ptr(p) __atomic_load_64(p) 280#define atomic_readandclear_ptr(p) __atomic_load_clear_64(p) 281#define atomic_cmpset_ptr(p, e, s) __atomic_cas_64(p, e, s) 282 283#define atomic_add_acq_char(p, v) __atomic_op_8(p, +=, v) 284#define atomic_subtract_acq_char(p, v) __atomic_op_8(p, -=, v) 285#define atomic_set_acq_char(p, v) __atomic_op_8(p, |=, v) 286#define atomic_clear_acq_char(p, v) __atomic_op_8(p, &=, ~v) 287#define atomic_store_acq_char(p, v) __atomic_op_8(p, =, v) 288 289#define atomic_add_acq_short(p, v) __atomic_op_16(p, +=, v) 290#define atomic_subtract_acq_short(p, v) __atomic_op_16(p, -=, v) 291#define atomic_set_acq_short(p, v) __atomic_op_16(p, |=, v) 292#define atomic_clear_acq_short(p, v) __atomic_op_16(p, &=, ~v) 293#define atomic_store_acq_short(p, v) __atomic_op_16(p, =, v) 294 295#define atomic_add_acq_int(p, v) __atomic_op_32(p, +=, v) 296#define atomic_subtract_acq_int(p, v) __atomic_op_32(p, -=, v) 297#define atomic_set_acq_int(p, v) __atomic_op_32(p, |=, v) 298#define atomic_clear_acq_int(p, v) __atomic_op_32(p, &=, ~v) 299#define atomic_store_acq_int(p, v) __atomic_op_32(p, =, v) 300#define atomic_load_acq_int(p) __atomic_load_32(p) 301#define atomic_cmpset_acq_int(p, e, s) __atomic_cas_32(p, e, s) 302 303#define atomic_add_acq_long(p, v) __atomic_op_64(p, +=, v) 304#define atomic_subtract_acq_long(p, v) __atomic_op_64(p, -=, v) 305#define atomic_set_acq_long(p, v) __atomic_op_64(p, |=, v) 306#define atomic_clear_acq_long(p, v) __atomic_op_64(p, &=, ~v) 307#define atomic_store_acq_long(p, v) __atomic_op_64(p, =, v) 308#define atomic_load_acq_long(p) __atomic_load_64(p) 309#define atomic_cmpset_acq_long(p, e, s) __atomic_cas_64(p, e, s) 310 311#define atomic_add_acq_ptr(p, v) __atomic_op_64(p, +=, v) 312#define atomic_subtract_acq_ptr(p, v) __atomic_op_64(p, -=, v) 313#define atomic_set_acq_ptr(p, v) __atomic_op_64(p, |=, v) 314#define atomic_clear_acq_ptr(p, v) __atomic_op_64(p, &=, ~v) 315#define atomic_store_acq_ptr(p, v) __atomic_op_64(p, =, v) 316#define atomic_load_acq_ptr(p) __atomic_load_64(p) 317#define atomic_cmpset_acq_ptr(p, e, s) __atomic_cas_64(p, e, s) 318 319#define atomic_add_rel_char(p, v) __atomic_op_8(p, +=, v) 320#define atomic_subtract_rel_char(p, v) __atomic_op_8(p, -=, v) 321#define atomic_set_rel_char(p, v) __atomic_op_8(p, |=, v) 322#define atomic_clear_rel_char(p, v) __atomic_op_8(p, &=, ~v) 323#define atomic_store_rel_char(p, v) __atomic_op_8(p, =, v) 324 325#define atomic_add_rel_short(p, v) __atomic_op_16(p, +=, v) 326#define atomic_subtract_rel_short(p, v) __atomic_op_16(p, -=, v) 327#define atomic_set_rel_short(p, v) __atomic_op_16(p, |=, v) 328#define atomic_clear_rel_short(p, v) __atomic_op_16(p, &=, ~v) 329#define atomic_store_rel_short(p, v) __atomic_op_16(p, =, v) 330 331#define atomic_add_rel_int(p, v) __atomic_op_32(p, +=, v) 332#define atomic_subtract_rel_int(p, v) __atomic_op_32(p, -=, v) 333#define atomic_set_rel_int(p, v) __atomic_op_32(p, |=, v) 334#define atomic_clear_rel_int(p, v) __atomic_op_32(p, &=, ~v) 335#define atomic_store_rel_int(p, v) __atomic_op_32(p, =, v) 336#define atomic_cmpset_rel_int(p, e, s) __atomic_cas_32(p, e, s) 337 338#define atomic_add_rel_long(p, v) __atomic_op_64(p, +=, v) 339#define atomic_subtract_rel_long(p, v) __atomic_op_64(p, -=, v) 340#define atomic_set_rel_long(p, v) __atomic_op_64(p, |=, v) 341#define atomic_clear_rel_long(p, v) __atomic_op_64(p, &=, ~v) 342#define atomic_store_rel_long(p, v) __atomic_op_64(p, =, v) 343#define atomic_cmpset_rel_long(p, e, s) __atomic_cas_64(p, e, s) 344 345#define atomic_add_rel_ptr(p, v) __atomic_op_64(p, +=, v) 346#define atomic_subtract_rel_ptr(p, v) __atomic_op_64(p, -=, v) 347#define atomic_set_rel_ptr(p, v) __atomic_op_64(p, |=, v) 348#define atomic_clear_rel_ptr(p, v) __atomic_op_64(p, &=, ~v) 349#define atomic_store_rel_ptr(p, v) __atomic_op_64(p, =, v) 350#define atomic_cmpset_rel_ptr(p, e, s) __atomic_cas_64(p, e, s) 351 352#endif /* !_MACHINE_ATOMIC_H_ */ 353