1292407Sbr/*- 2292407Sbr * Copyright (c) 2015 Ruslan Bukin <br@bsdpad.com> 3292407Sbr * All rights reserved. 4292407Sbr * 5292407Sbr * Portions of this software were developed by SRI International and the 6292407Sbr * University of Cambridge Computer Laboratory under DARPA/AFRL contract 7292407Sbr * FA8750-10-C-0237 ("CTSRD"), as part of the DARPA CRASH research programme. 8292407Sbr * 9292407Sbr * Portions of this software were developed by the University of Cambridge 10292407Sbr * Computer Laboratory as part of the CTSRD Project, with support from the 11292407Sbr * UK Higher Education Innovation Fund (HEIF). 12292407Sbr * 13292407Sbr * Redistribution and use in source and binary forms, with or without 14292407Sbr * modification, are permitted provided that the following conditions 15292407Sbr * are met: 16292407Sbr * 1. Redistributions of source code must retain the above copyright 17292407Sbr * notice, this list of conditions and the following disclaimer. 18292407Sbr * 2. Redistributions in binary form must reproduce the above copyright 19292407Sbr * notice, this list of conditions and the following disclaimer in the 20292407Sbr * documentation and/or other materials provided with the distribution. 21292407Sbr * 22292407Sbr * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 23292407Sbr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24292407Sbr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25292407Sbr * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 26292407Sbr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27292407Sbr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28292407Sbr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29292407Sbr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30292407Sbr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31292407Sbr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32292407Sbr * SUCH DAMAGE. 33292407Sbr * 34292407Sbr * $FreeBSD: stable/11/sys/riscv/include/atomic.h 327195 2017-12-26 10:07:17Z kib $ 35292407Sbr */ 36292407Sbr 37292407Sbr#ifndef _MACHINE_ATOMIC_H_ 38292407Sbr#define _MACHINE_ATOMIC_H_ 39292407Sbr 40327195Skib#include <sys/atomic_common.h> 41327195Skib 42292407Sbr#define fence() __asm __volatile("fence" ::: "memory"); 43292407Sbr#define mb() fence() 44292407Sbr#define rmb() fence() 45292407Sbr#define wmb() fence() 46292407Sbr 47292407Sbr#define ATOMIC_ACQ_REL(NAME, WIDTH) \ 48292407Sbrstatic __inline void \ 49292407Sbratomic_##NAME##_acq_##WIDTH(__volatile uint##WIDTH##_t *p, uint##WIDTH##_t v)\ 50292407Sbr{ \ 51292407Sbr atomic_##NAME##_##WIDTH(p, v); \ 52292407Sbr fence(); \ 53292407Sbr} \ 54292407Sbr \ 55292407Sbrstatic __inline void \ 56292407Sbratomic_##NAME##_rel_##WIDTH(__volatile uint##WIDTH##_t *p, uint##WIDTH##_t v)\ 57292407Sbr{ \ 58292407Sbr fence(); \ 59292407Sbr atomic_##NAME##_##WIDTH(p, v); \ 60292407Sbr} 61292407Sbr 62292407Sbrstatic __inline void 63292407Sbratomic_add_32(volatile uint32_t *p, uint32_t val) 64292407Sbr{ 65292407Sbr 66292407Sbr __asm __volatile("amoadd.w zero, %1, %0" 67292407Sbr : "+A" (*p) 68292407Sbr : "r" (val) 69292407Sbr : "memory"); 70292407Sbr} 71292407Sbr 72292407Sbrstatic __inline void 73292407Sbratomic_subtract_32(volatile uint32_t *p, uint32_t val) 74292407Sbr{ 75292407Sbr 76292407Sbr __asm __volatile("amoadd.w zero, %1, %0" 77292407Sbr : "+A" (*p) 78292407Sbr : "r" (-val) 79292407Sbr : "memory"); 80292407Sbr} 81292407Sbr 82292407Sbrstatic __inline void 83292407Sbratomic_set_32(volatile uint32_t *p, uint32_t val) 84292407Sbr{ 85292407Sbr 86292407Sbr __asm __volatile("amoor.w zero, %1, %0" 87292407Sbr : "+A" (*p) 88292407Sbr : "r" (val) 89292407Sbr : "memory"); 90292407Sbr} 91292407Sbr 92292407Sbrstatic __inline void 93292407Sbratomic_clear_32(volatile uint32_t *p, uint32_t val) 94292407Sbr{ 95292407Sbr 96292407Sbr __asm __volatile("amoand.w zero, %1, %0" 97292407Sbr : "+A" (*p) 98292407Sbr : "r" (~val) 99292407Sbr : "memory"); 100292407Sbr} 101292407Sbr 102292407Sbrstatic __inline int 103292407Sbratomic_cmpset_32(volatile uint32_t *p, uint32_t cmpval, uint32_t newval) 104292407Sbr{ 105292407Sbr uint32_t tmp; 106292407Sbr int res; 107292407Sbr 108292407Sbr res = 0; 109292407Sbr 110292407Sbr __asm __volatile( 111292407Sbr "0:" 112292407Sbr "li %1, 1\n" /* Preset to fail */ 113292407Sbr "lr.w %0, %2\n" 114292407Sbr "bne %0, %z3, 1f\n" 115292407Sbr "sc.w %1, %z4, %2\n" 116292407Sbr "bnez %1, 0b\n" 117292407Sbr "1:" 118292407Sbr : "=&r" (tmp), "=&r" (res), "+A" (*p) 119292407Sbr : "rJ" (cmpval), "rJ" (newval) 120292407Sbr : "memory"); 121292407Sbr 122292407Sbr return (!res); 123292407Sbr} 124292407Sbr 125315371Smjgstatic __inline int 126315371Smjgatomic_fcmpset_32(volatile uint32_t *p, uint32_t *cmpval, uint32_t newval) 127315371Smjg{ 128315371Smjg uint32_t tmp; 129315371Smjg int res; 130315371Smjg 131315371Smjg res = 0; 132315371Smjg 133315371Smjg __asm __volatile( 134315371Smjg "0:" 135315371Smjg "li %1, 1\n" /* Preset to fail */ 136315371Smjg "lr.w %0, %2\n" /* Load old value */ 137315371Smjg "bne %0, %z4, 1f\n" /* Compare */ 138315371Smjg "sc.w %1, %z5, %2\n" /* Try to store new value */ 139315371Smjg "j 2f\n" 140315371Smjg "1:" 141315371Smjg "sw %0, %3\n" /* Save old value */ 142315371Smjg "2:" 143315371Smjg : "=&r" (tmp), "=&r" (res), "+A" (*p), "+A" (*cmpval) 144315371Smjg : "rJ" (*cmpval), "rJ" (newval) 145315371Smjg : "memory"); 146315371Smjg 147315371Smjg return (!res); 148315371Smjg} 149315371Smjg 150292407Sbrstatic __inline uint32_t 151292407Sbratomic_fetchadd_32(volatile uint32_t *p, uint32_t val) 152292407Sbr{ 153292407Sbr uint32_t ret; 154292407Sbr 155292407Sbr __asm __volatile("amoadd.w %0, %2, %1" 156292407Sbr : "=&r" (ret), "+A" (*p) 157292407Sbr : "r" (val) 158292407Sbr : "memory"); 159292407Sbr 160292407Sbr return (ret); 161292407Sbr} 162292407Sbr 163292407Sbrstatic __inline uint32_t 164292407Sbratomic_readandclear_32(volatile uint32_t *p) 165292407Sbr{ 166292407Sbr uint32_t ret; 167292407Sbr uint32_t val; 168292407Sbr 169292407Sbr val = 0; 170292407Sbr 171292407Sbr __asm __volatile("amoswap.w %0, %2, %1" 172292407Sbr : "=&r"(ret), "+A" (*p) 173292407Sbr : "r" (val) 174292407Sbr : "memory"); 175292407Sbr 176292407Sbr return (ret); 177292407Sbr} 178292407Sbr 179292407Sbr#define atomic_add_int atomic_add_32 180292407Sbr#define atomic_clear_int atomic_clear_32 181292407Sbr#define atomic_cmpset_int atomic_cmpset_32 182315371Smjg#define atomic_fcmpset_int atomic_fcmpset_32 183292407Sbr#define atomic_fetchadd_int atomic_fetchadd_32 184292407Sbr#define atomic_readandclear_int atomic_readandclear_32 185292407Sbr#define atomic_set_int atomic_set_32 186292407Sbr#define atomic_subtract_int atomic_subtract_32 187292407Sbr 188292407SbrATOMIC_ACQ_REL(set, 32) 189292407SbrATOMIC_ACQ_REL(clear, 32) 190292407SbrATOMIC_ACQ_REL(add, 32) 191292407SbrATOMIC_ACQ_REL(subtract, 32) 192292407Sbr 193292407Sbrstatic __inline int 194292407Sbratomic_cmpset_acq_32(volatile uint32_t *p, uint32_t cmpval, uint32_t newval) 195292407Sbr{ 196292407Sbr int res; 197292407Sbr 198292407Sbr res = atomic_cmpset_32(p, cmpval, newval); 199292407Sbr 200292407Sbr fence(); 201292407Sbr 202292407Sbr return (res); 203292407Sbr} 204292407Sbr 205292407Sbrstatic __inline int 206292407Sbratomic_cmpset_rel_32(volatile uint32_t *p, uint32_t cmpval, uint32_t newval) 207292407Sbr{ 208292407Sbr 209292407Sbr fence(); 210292407Sbr 211292407Sbr return (atomic_cmpset_32(p, cmpval, newval)); 212292407Sbr} 213292407Sbr 214315371Smjgstatic __inline int 215315371Smjgatomic_fcmpset_acq_32(volatile uint32_t *p, uint32_t *cmpval, uint32_t newval) 216315371Smjg{ 217315371Smjg int res; 218315371Smjg 219315371Smjg res = atomic_fcmpset_32(p, cmpval, newval); 220315371Smjg 221315371Smjg fence(); 222315371Smjg 223315371Smjg return (res); 224315371Smjg} 225315371Smjg 226315371Smjgstatic __inline int 227315371Smjgatomic_fcmpset_rel_32(volatile uint32_t *p, uint32_t *cmpval, uint32_t newval) 228315371Smjg{ 229315371Smjg 230315371Smjg fence(); 231315371Smjg 232315371Smjg return (atomic_fcmpset_32(p, cmpval, newval)); 233315371Smjg} 234315371Smjg 235292407Sbrstatic __inline uint32_t 236292407Sbratomic_load_acq_32(volatile uint32_t *p) 237292407Sbr{ 238292407Sbr uint32_t ret; 239292407Sbr 240292407Sbr ret = *p; 241292407Sbr 242292407Sbr fence(); 243292407Sbr 244292407Sbr return (ret); 245292407Sbr} 246292407Sbr 247292407Sbrstatic __inline void 248292407Sbratomic_store_rel_32(volatile uint32_t *p, uint32_t val) 249292407Sbr{ 250292407Sbr 251292407Sbr fence(); 252292407Sbr 253292407Sbr *p = val; 254292407Sbr} 255292407Sbr 256292407Sbr#define atomic_add_acq_int atomic_add_acq_32 257292407Sbr#define atomic_clear_acq_int atomic_clear_acq_32 258292407Sbr#define atomic_cmpset_acq_int atomic_cmpset_acq_32 259315371Smjg#define atomic_fcmpset_acq_int atomic_fcmpset_acq_32 260292407Sbr#define atomic_load_acq_int atomic_load_acq_32 261292407Sbr#define atomic_set_acq_int atomic_set_acq_32 262292407Sbr#define atomic_subtract_acq_int atomic_subtract_acq_32 263292407Sbr 264292407Sbr#define atomic_add_rel_int atomic_add_rel_32 265292407Sbr#define atomic_clear_rel_int atomic_add_rel_32 266292407Sbr#define atomic_cmpset_rel_int atomic_cmpset_rel_32 267315371Smjg#define atomic_fcmpset_rel_int atomic_fcmpset_rel_32 268292407Sbr#define atomic_set_rel_int atomic_set_rel_32 269292407Sbr#define atomic_subtract_rel_int atomic_subtract_rel_32 270292407Sbr#define atomic_store_rel_int atomic_store_rel_32 271292407Sbr 272292407Sbrstatic __inline void 273292407Sbratomic_add_64(volatile uint64_t *p, uint64_t val) 274292407Sbr{ 275292407Sbr 276292407Sbr __asm __volatile("amoadd.d zero, %1, %0" 277292407Sbr : "+A" (*p) 278292407Sbr : "r" (val) 279292407Sbr : "memory"); 280292407Sbr} 281292407Sbr 282292407Sbrstatic __inline void 283292407Sbratomic_subtract_64(volatile uint64_t *p, uint64_t val) 284292407Sbr{ 285292407Sbr 286292407Sbr __asm __volatile("amoadd.d zero, %1, %0" 287292407Sbr : "+A" (*p) 288292407Sbr : "r" (-val) 289292407Sbr : "memory"); 290292407Sbr} 291292407Sbr 292292407Sbrstatic __inline void 293292407Sbratomic_set_64(volatile uint64_t *p, uint64_t val) 294292407Sbr{ 295292407Sbr 296292407Sbr __asm __volatile("amoor.d zero, %1, %0" 297292407Sbr : "+A" (*p) 298292407Sbr : "r" (val) 299292407Sbr : "memory"); 300292407Sbr} 301292407Sbr 302292407Sbrstatic __inline void 303292407Sbratomic_clear_64(volatile uint64_t *p, uint64_t val) 304292407Sbr{ 305292407Sbr 306292407Sbr __asm __volatile("amoand.d zero, %1, %0" 307292407Sbr : "+A" (*p) 308292407Sbr : "r" (~val) 309292407Sbr : "memory"); 310292407Sbr} 311292407Sbr 312292407Sbrstatic __inline int 313292407Sbratomic_cmpset_64(volatile uint64_t *p, uint64_t cmpval, uint64_t newval) 314292407Sbr{ 315292407Sbr uint64_t tmp; 316292407Sbr int res; 317292407Sbr 318292407Sbr res = 0; 319292407Sbr 320292407Sbr __asm __volatile( 321292407Sbr "0:" 322292407Sbr "li %1, 1\n" /* Preset to fail */ 323292407Sbr "lr.d %0, %2\n" 324292407Sbr "bne %0, %z3, 1f\n" 325292407Sbr "sc.d %1, %z4, %2\n" 326292407Sbr "bnez %1, 0b\n" 327292407Sbr "1:" 328292407Sbr : "=&r" (tmp), "=&r" (res), "+A" (*p) 329292407Sbr : "rJ" (cmpval), "rJ" (newval) 330292407Sbr : "memory"); 331292407Sbr 332292407Sbr return (!res); 333292407Sbr} 334292407Sbr 335315371Smjgstatic __inline int 336315371Smjgatomic_fcmpset_64(volatile uint64_t *p, uint64_t *cmpval, uint64_t newval) 337315371Smjg{ 338315371Smjg uint64_t tmp; 339315371Smjg int res; 340315371Smjg 341315371Smjg res = 0; 342315371Smjg 343315371Smjg __asm __volatile( 344315371Smjg "0:" 345315371Smjg "li %1, 1\n" /* Preset to fail */ 346315371Smjg "lr.d %0, %2\n" /* Load old value */ 347315371Smjg "bne %0, %z4, 1f\n" /* Compare */ 348315371Smjg "sc.d %1, %z5, %2\n" /* Try to store new value */ 349315371Smjg "j 2f\n" 350315371Smjg "1:" 351315371Smjg "sd %0, %3\n" /* Save old value */ 352315371Smjg "2:" 353315371Smjg : "=&r" (tmp), "=&r" (res), "+A" (*p), "+A" (*cmpval) 354315371Smjg : "rJ" (*cmpval), "rJ" (newval) 355315371Smjg : "memory"); 356315371Smjg 357315371Smjg return (!res); 358315371Smjg} 359315371Smjg 360292407Sbrstatic __inline uint64_t 361292407Sbratomic_fetchadd_64(volatile uint64_t *p, uint64_t val) 362292407Sbr{ 363292407Sbr uint64_t ret; 364292407Sbr 365292407Sbr __asm __volatile("amoadd.d %0, %2, %1" 366292407Sbr : "=&r" (ret), "+A" (*p) 367292407Sbr : "r" (val) 368292407Sbr : "memory"); 369292407Sbr 370292407Sbr return (ret); 371292407Sbr} 372292407Sbr 373292407Sbrstatic __inline uint64_t 374292407Sbratomic_readandclear_64(volatile uint64_t *p) 375292407Sbr{ 376292407Sbr uint64_t ret; 377292407Sbr uint64_t val; 378292407Sbr 379292407Sbr val = 0; 380292407Sbr 381292407Sbr __asm __volatile("amoswap.d %0, %2, %1" 382292407Sbr : "=&r"(ret), "+A" (*p) 383292407Sbr : "r" (val) 384292407Sbr : "memory"); 385292407Sbr 386292407Sbr return (ret); 387292407Sbr} 388292407Sbr 389295701Sbrstatic __inline uint32_t 390295701Sbratomic_swap_32(volatile uint32_t *p, uint32_t val) 391295701Sbr{ 392295701Sbr uint32_t old; 393295701Sbr 394295701Sbr __asm __volatile("amoswap.w %0, %2, %1" 395295701Sbr : "=&r"(old), "+A" (*p) 396295701Sbr : "r" (val) 397295701Sbr : "memory"); 398295701Sbr 399295701Sbr return (old); 400295701Sbr} 401295701Sbr 402292407Sbrstatic __inline uint64_t 403292407Sbratomic_swap_64(volatile uint64_t *p, uint64_t val) 404292407Sbr{ 405292407Sbr uint64_t old; 406292407Sbr 407292407Sbr __asm __volatile("amoswap.d %0, %2, %1" 408292407Sbr : "=&r"(old), "+A" (*p) 409292407Sbr : "r" (val) 410292407Sbr : "memory"); 411292407Sbr 412292407Sbr return (old); 413292407Sbr} 414292407Sbr 415292407Sbr#define atomic_add_long atomic_add_64 416292407Sbr#define atomic_clear_long atomic_clear_64 417292407Sbr#define atomic_cmpset_long atomic_cmpset_64 418315371Smjg#define atomic_fcmpset_long atomic_fcmpset_64 419292407Sbr#define atomic_fetchadd_long atomic_fetchadd_64 420292407Sbr#define atomic_readandclear_long atomic_readandclear_64 421292407Sbr#define atomic_set_long atomic_set_64 422292407Sbr#define atomic_subtract_long atomic_subtract_64 423292407Sbr 424292407Sbr#define atomic_add_ptr atomic_add_64 425292407Sbr#define atomic_clear_ptr atomic_clear_64 426292407Sbr#define atomic_cmpset_ptr atomic_cmpset_64 427315371Smjg#define atomic_fcmpset_ptr atomic_fcmpset_64 428292407Sbr#define atomic_fetchadd_ptr atomic_fetchadd_64 429292407Sbr#define atomic_readandclear_ptr atomic_readandclear_64 430292407Sbr#define atomic_set_ptr atomic_set_64 431292407Sbr#define atomic_subtract_ptr atomic_subtract_64 432292407Sbr 433292407SbrATOMIC_ACQ_REL(set, 64) 434292407SbrATOMIC_ACQ_REL(clear, 64) 435292407SbrATOMIC_ACQ_REL(add, 64) 436292407SbrATOMIC_ACQ_REL(subtract, 64) 437292407Sbr 438292407Sbrstatic __inline int 439292407Sbratomic_cmpset_acq_64(volatile uint64_t *p, uint64_t cmpval, uint64_t newval) 440292407Sbr{ 441292407Sbr int res; 442292407Sbr 443292407Sbr res = atomic_cmpset_64(p, cmpval, newval); 444292407Sbr 445292407Sbr fence(); 446292407Sbr 447292407Sbr return (res); 448292407Sbr} 449292407Sbr 450292407Sbrstatic __inline int 451292407Sbratomic_cmpset_rel_64(volatile uint64_t *p, uint64_t cmpval, uint64_t newval) 452292407Sbr{ 453292407Sbr 454292407Sbr fence(); 455292407Sbr 456292407Sbr return (atomic_cmpset_64(p, cmpval, newval)); 457292407Sbr} 458292407Sbr 459315371Smjgstatic __inline int 460315371Smjgatomic_fcmpset_acq_64(volatile uint64_t *p, uint64_t *cmpval, uint64_t newval) 461315371Smjg{ 462315371Smjg int res; 463315371Smjg 464315371Smjg res = atomic_fcmpset_64(p, cmpval, newval); 465315371Smjg 466315371Smjg fence(); 467315371Smjg 468315371Smjg return (res); 469315371Smjg} 470315371Smjg 471315371Smjgstatic __inline int 472315371Smjgatomic_fcmpset_rel_64(volatile uint64_t *p, uint64_t *cmpval, uint64_t newval) 473315371Smjg{ 474315371Smjg 475315371Smjg fence(); 476315371Smjg 477315371Smjg return (atomic_fcmpset_64(p, cmpval, newval)); 478315371Smjg} 479315371Smjg 480292407Sbrstatic __inline uint64_t 481292407Sbratomic_load_acq_64(volatile uint64_t *p) 482292407Sbr{ 483292407Sbr uint64_t ret; 484292407Sbr 485292407Sbr ret = *p; 486292407Sbr 487292407Sbr fence(); 488292407Sbr 489292407Sbr return (ret); 490292407Sbr} 491292407Sbr 492292407Sbrstatic __inline void 493292407Sbratomic_store_rel_64(volatile uint64_t *p, uint64_t val) 494292407Sbr{ 495292407Sbr 496292407Sbr fence(); 497292407Sbr 498292407Sbr *p = val; 499292407Sbr} 500292407Sbr 501292407Sbr#define atomic_add_acq_long atomic_add_acq_64 502292407Sbr#define atomic_clear_acq_long atomic_add_acq_64 503292407Sbr#define atomic_cmpset_acq_long atomic_cmpset_acq_64 504315371Smjg#define atomic_fcmpset_acq_long atomic_fcmpset_acq_64 505292407Sbr#define atomic_load_acq_long atomic_load_acq_64 506292407Sbr#define atomic_set_acq_long atomic_set_acq_64 507292407Sbr#define atomic_subtract_acq_long atomic_subtract_acq_64 508292407Sbr 509292407Sbr#define atomic_add_acq_ptr atomic_add_acq_64 510292407Sbr#define atomic_clear_acq_ptr atomic_add_acq_64 511292407Sbr#define atomic_cmpset_acq_ptr atomic_cmpset_acq_64 512315371Smjg#define atomic_fcmpset_acq_ptr atomic_fcmpset_acq_64 513292407Sbr#define atomic_load_acq_ptr atomic_load_acq_64 514292407Sbr#define atomic_set_acq_ptr atomic_set_acq_64 515292407Sbr#define atomic_subtract_acq_ptr atomic_subtract_acq_64 516292407Sbr 517292407Sbrstatic __inline void 518292407Sbratomic_thread_fence_acq(void) 519292407Sbr{ 520292407Sbr 521292407Sbr fence(); 522292407Sbr} 523292407Sbr 524292407Sbrstatic __inline void 525292407Sbratomic_thread_fence_rel(void) 526292407Sbr{ 527292407Sbr 528292407Sbr fence(); 529292407Sbr} 530292407Sbr 531292407Sbrstatic __inline void 532292407Sbratomic_thread_fence_acq_rel(void) 533292407Sbr{ 534292407Sbr 535292407Sbr fence(); 536292407Sbr} 537292407Sbr 538292407Sbrstatic __inline void 539292407Sbratomic_thread_fence_seq_cst(void) 540292407Sbr{ 541292407Sbr 542292407Sbr fence(); 543292407Sbr} 544292407Sbr 545292407Sbr#define atomic_add_rel_long atomic_add_rel_64 546292407Sbr#define atomic_clear_rel_long atomic_clear_rel_64 547292407Sbr 548292407Sbr#define atomic_add_rel_long atomic_add_rel_64 549292407Sbr#define atomic_clear_rel_long atomic_clear_rel_64 550292407Sbr#define atomic_cmpset_rel_long atomic_cmpset_rel_64 551315371Smjg#define atomic_fcmpset_rel_long atomic_fcmpset_rel_64 552292407Sbr#define atomic_set_rel_long atomic_set_rel_64 553292407Sbr#define atomic_subtract_rel_long atomic_subtract_rel_64 554292407Sbr#define atomic_store_rel_long atomic_store_rel_64 555292407Sbr 556292407Sbr#define atomic_add_rel_ptr atomic_add_rel_64 557292407Sbr#define atomic_clear_rel_ptr atomic_clear_rel_64 558292407Sbr#define atomic_cmpset_rel_ptr atomic_cmpset_rel_64 559315371Smjg#define atomic_fcmpset_rel_ptr atomic_fcmpset_rel_64 560292407Sbr#define atomic_set_rel_ptr atomic_set_rel_64 561292407Sbr#define atomic_subtract_rel_ptr atomic_subtract_rel_64 562292407Sbr#define atomic_store_rel_ptr atomic_store_rel_64 563292407Sbr 564292407Sbr#endif /* _MACHINE_ATOMIC_H_ */ 565