1/* $NetBSD: atomic.S,v 1.5 2009/11/09 14:22:02 skrll 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_enter,0) 121 mf 122 br.ret.sptk rp 123END(_membar_enter) 124 125ENTRY(_membar_exit,0) 126 mf 127 br.ret.sptk rp 128END(_membar_exit) 129 130ENTRY(_membar_sync,0) 131 mf 132 br.ret.sptk rp 133END(_membar_sync) 134 135 136ALIAS(atomic_add_32,_atomic_add_32) 137ALIAS(atomic_add_int,_atomic_add_32) 138ALIAS(atomic_add_64,_atomic_add_64) 139ALIAS(atomic_add_long,_atomic_add_64) 140ALIAS(atomic_add_ptr,_atomic_add_64) 141 142ALIAS(atomic_add_32_nv,_atomic_add_32_nv) 143ALIAS(atomic_add_int_nv,_atomic_add_32_nv) 144ALIAS(atomic_add_64_nv,_atomic_add_64_nv) 145ALIAS(atomic_add_long_nv,_atomic_add_64_nv) 146ALIAS(atomic_add_ptr_nv,_atomic_add_64_nv) 147 148ALIAS(atomic_and_32,_atomic_and_32) 149ALIAS(atomic_and_uint,_atomic_and_32) 150ALIAS(atomic_and_64,_atomic_and_64) 151ALIAS(atomic_and_ulong,_atomic_and_64) 152ALIAS(atomic_and_ptr,_atomic_and_64) 153 154ALIAS(atomic_and_32_nv,_atomic_and_32_nv) 155ALIAS(atomic_and_uint_nv,_atomic_and_32_nv) 156ALIAS(atomic_and_64_nv,_atomic_and_64_nv) 157ALIAS(atomic_and_ulong_nv,_atomic_and_64_nv) 158ALIAS(atomic_and_ptr_nv,_atomic_and_64_nv) 159 160ALIAS(atomic_dec_32,_atomic_dec_32) 161ALIAS(atomic_dec_uint,_atomic_dec_32) 162ALIAS(atomic_dec_64,_atomic_dec_64) 163ALIAS(atomic_dec_ulong,_atomic_dec_64) 164ALIAS(atomic_dec_ptr,_atomic_dec_64) 165 166ALIAS(atomic_dec_32_nv,_atomic_dec_32_nv) 167ALIAS(atomic_dec_uint_nv,_atomic_dec_32_nv) 168ALIAS(atomic_dec_64_nv,_atomic_dec_64_nv) 169ALIAS(atomic_dec_ulong_nv,_atomic_dec_64_nv) 170ALIAS(atomic_dec_ptr_nv,_atomic_dec_64_nv) 171 172ALIAS(atomic_inc_32,_atomic_inc_32) 173ALIAS(atomic_inc_uint,_atomic_inc_32) 174ALIAS(atomic_inc_64,_atomic_inc_64) 175ALIAS(atomic_inc_ulong,_atomic_inc_64) 176ALIAS(atomic_inc_ptr,_atomic_inc_64) 177 178ALIAS(atomic_inc_32_nv,_atomic_inc_32_nv) 179ALIAS(atomic_inc_uint_nv,_atomic_inc_32_nv) 180ALIAS(atomic_inc_64_nv,_atomic_inc_64_nv) 181ALIAS(atomic_inc_ulong_nv,_atomic_inc_64_nv) 182ALIAS(atomic_inc_ptr_nv,_atomic_inc_64_nv) 183 184ALIAS(atomic_or_32,_atomic_or_32) 185ALIAS(atomic_or_uint,_atomic_or_32) 186ALIAS(atomic_or_64,_atomic_or_64) 187ALIAS(atomic_or_ulong,_atomic_or_64) 188ALIAS(atomic_or_ptr,_atomic_or_64) 189 190ALIAS(atomic_or_32_nv,_atomic_or_32_nv) 191ALIAS(atomic_or_uint_nv,_atomic_or_32_nv) 192ALIAS(atomic_or_64_nv,_atomic_or_64_nv) 193ALIAS(atomic_or_ulong_nv,_atomic_or_64_nv) 194ALIAS(atomic_or_ptr_nv,_atomic_or_64_nv) 195 196ALIAS(atomic_swap_32,_atomic_swap_32) 197ALIAS(atomic_swap_uint,_atomic_swap_32) 198ALIAS(atomic_swap_64,_atomic_swap_64) 199ALIAS(atomic_swap_ulong,_atomic_swap_64) 200ALIAS(atomic_swap_ptr,_atomic_swap_64) 201 202ALIAS(atomic_cas_32,_atomic_cas_32) 203ALIAS(atomic_cas_uint,_atomic_cas_32) 204ALIAS(atomic_cas_64,_atomic_cas_64) 205ALIAS(atomic_cas_ulong,_atomic_cas_64) 206ALIAS(atomic_cas_ptr,_atomic_cas_64) 207 208ALIAS(atomic_cas_32_ni,_atomic_cas_32) 209ALIAS(atomic_cas_uint_ni,_atomic_cas_32) 210ALIAS(atomic_cas_64_ni,_atomic_cas_64) 211ALIAS(atomic_cas_ulong_ni,_atomic_cas_64) 212ALIAS(atomic_cas_ptr_ni,_atomic_cas_64) 213 214ALIAS(membar_consumer,_membar_consumer) 215ALIAS(membar_producer,_membar_producer) 216ALIAS(membar_enter,_membar_enter) 217ALIAS(membar_exit,_membar_exit) 218ALIAS(membar_sync,_membar_sync) 219 220STRONG_ALIAS(_atomic_add_int,_atomic_add_32) 221STRONG_ALIAS(_atomic_add_long,_atomic_add_64) 222STRONG_ALIAS(_atomic_add_ptr,_atomic_add_64) 223 224STRONG_ALIAS(_atomic_add_int_nv,_atomic_add_32_nv) 225STRONG_ALIAS(_atomic_add_long_nv,_atomic_add_64_nv) 226STRONG_ALIAS(_atomic_add_ptr_nv,_atomic_add_64_nv) 227 228STRONG_ALIAS(_atomic_and_uint,_atomic_and_32) 229STRONG_ALIAS(_atomic_and_ulong,_atomic_and_64) 230STRONG_ALIAS(_atomic_and_ptr,_atomic_and_64) 231 232STRONG_ALIAS(_atomic_and_uint_nv,_atomic_and_32_nv) 233STRONG_ALIAS(_atomic_and_ulong_nv,_atomic_and_64_nv) 234STRONG_ALIAS(_atomic_and_ptr_nv,_atomic_and_64_nv) 235 236STRONG_ALIAS(_atomic_dec_uint,_atomic_dec_32) 237STRONG_ALIAS(_atomic_dec_ulong,_atomic_dec_64) 238STRONG_ALIAS(_atomic_dec_ptr,_atomic_dec_64) 239 240STRONG_ALIAS(_atomic_dec_uint_nv,_atomic_dec_32_nv) 241STRONG_ALIAS(_atomic_dec_ulong_nv,_atomic_dec_64_nv) 242STRONG_ALIAS(_atomic_dec_ptr_nv,_atomic_dec_64_nv) 243 244STRONG_ALIAS(_atomic_inc_uint,_atomic_inc_32) 245STRONG_ALIAS(_atomic_inc_ulong,_atomic_inc_64) 246STRONG_ALIAS(_atomic_inc_ptr,_atomic_inc_64) 247 248STRONG_ALIAS(_atomic_inc_uint_nv,_atomic_inc_32_nv) 249STRONG_ALIAS(_atomic_inc_ulong_nv,_atomic_inc_64_nv) 250STRONG_ALIAS(_atomic_inc_ptr_nv,_atomic_inc_64_nv) 251 252STRONG_ALIAS(_atomic_or_uint,_atomic_or_32) 253STRONG_ALIAS(_atomic_or_ulong,_atomic_or_64) 254STRONG_ALIAS(_atomic_or_ptr,_atomic_or_64) 255 256STRONG_ALIAS(_atomic_or_uint_nv,_atomic_or_32_nv) 257STRONG_ALIAS(_atomic_or_ulong_nv,_atomic_or_64_nv) 258STRONG_ALIAS(_atomic_or_ptr_nv,_atomic_or_64_nv) 259 260STRONG_ALIAS(_atomic_swap_uint,_atomic_swap_32) 261STRONG_ALIAS(_atomic_swap_ulong,_atomic_swap_64) 262STRONG_ALIAS(_atomic_swap_ptr,_atomic_swap_64) 263 264STRONG_ALIAS(_atomic_cas_uint,_atomic_cas_32) 265STRONG_ALIAS(_atomic_cas_ulong,_atomic_cas_64) 266STRONG_ALIAS(_atomic_cas_ptr,_atomic_cas_64) 267 268STRONG_ALIAS(_atomic_cas_uint_ni,_atomic_cas_32) 269STRONG_ALIAS(_atomic_cas_ulong_ni,_atomic_cas_64) 270STRONG_ALIAS(_atomic_cas_ptr_ni,_atomic_cas_64) 271