Home | History | Annotate | Line # | Download | only in atomic
atomic.S revision 1.1.4.2
      1 /*	$NetBSD: atomic.S,v 1.1.4.2 2008/03/24 07:14:29 keiichi 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  * 3. All advertising materials mentioning features or use of this software
     19  *    must display the following acknowledgement:
     20  *	This product includes software developed by the NetBSD
     21  *	Foundation, Inc. and its contributors.
     22  * 4. Neither the name of The NetBSD Foundation nor the names of its
     23  *    contributors may be used to endorse or promote products derived
     24  *    from this software without specific prior written permission.
     25  *
     26  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36  * POSSIBILITY OF SUCH DAMAGE.
     37  */
     38 
     39 #include <machine/asm.h>
     40 
     41 #ifdef _KERNEL
     42 #define	ALIAS(f, t)	STRONG_ALIAS(f,t)
     43 #else
     44 #define	ALIAS(f, t)	WEAK_ALIAS(f,t)
     45 #endif
     46 
     47 	.text
     48 
     49 ENTRY_NOPROFILE(_atomic_dec_32,1)
     50 	fetchadd4.rel	r8=[r32],-1
     51 	br.ret.sptk	rp
     52 
     53 ENTRY_NOPROFILE(_atomic_dec_64,1)
     54 	fetchadd8.rel	r8=[r32],-1
     55 	br.ret.sptk	rp
     56 
     57 ENTRY_NOPROFILE(_atomic_dec_32_nv,1)
     58 	fetchadd4.rel	r8=[r32],-1
     59 	br.ret.sptk	rp
     60 
     61 ENTRY_NOPROFILE(_atomic_dec_64_nv,1)
     62 	fetchadd8.rel	r8=[r32],-1
     63 	br.ret.sptk	rp
     64 
     65 ENTRY_NOPROFILE(_atomic_inc_32,1)
     66 	fetchadd4.rel	r8=[r32],1
     67 	br.ret.sptk	rp
     68 
     69 ENTRY_NOPROFILE(_atomic_inc_64,1)
     70 	fetchadd8.rel	r8=[r32],1
     71 	br.ret.sptk	rp
     72 
     73 ENTRY_NOPROFILE(_atomic_inc_32_nv,1)
     74 	fetchadd4.rel	r8=[r32],1
     75 	br.ret.sptk	rp
     76 
     77 ENTRY_NOPROFILE(_atomic_inc_64_nv,1)
     78 	fetchadd8.rel	r8=[r32],1
     79 	br.ret.sptk	rp
     80 
     81 ENTRY_NOPROFILE(_atomic_swap_32,2)
     82 	xchg4		r8=[r32],r33
     83 	;;
     84 	mov		r33=r8
     85 	br.ret.sptk	rp
     86 
     87 ENTRY_NOPROFILE(_atomic_swap_64,2)
     88 	xchg8		r8=[r32],r33
     89 	;;
     90 	mov		r33=r8
     91 	br.ret.sptk	rp
     92 
     93 ENTRY_NOPROFILE(_atomic_cas_32,3)
     94 	mov		ar.ccv=r33
     95 	;;
     96 	cmpxchg4.acq	r8=[r32],r34,ar.ccv
     97 	br.ret.sptk	rp
     98 
     99 ENTRY_NOPROFILE(_atomic_cas_64,3)
    100 	mov		ar.ccv=r33
    101 	;;
    102 	cmpxchg8.acq	r8=[r32],r34,ar.ccv
    103 	br.ret.sptk	rp
    104 
    105 ENTRY_NOPROFILE(_membar_consumer,0)
    106 	mf
    107 	br.ret.sptk	rp
    108 
    109 ENTRY_NOPROFILE(_membar_producer,0)
    110 	mf
    111 	br.ret.sptk	rp
    112 
    113 ENTRY_NOPROFILE(_membar_enter,0)
    114 	mf
    115 	br.ret.sptk	rp
    116 
    117 ENTRY_NOPROFILE(_membar_exit,0)
    118 	mf
    119 	br.ret.sptk	rp
    120 
    121 ENTRY_NOPROFILE(_membar_sync,0)
    122 	mf
    123 	br.ret.sptk	rp
    124 
    125 
    126 ALIAS(atomic_add_32,_atomic_add_32)
    127 ALIAS(atomic_add_int,_atomic_add_32)
    128 ALIAS(atomic_add_64,_atomic_add_64)
    129 ALIAS(atomic_add_long,_atomic_add_64)
    130 ALIAS(atomic_add_ptr,_atomic_add_64)
    131 
    132 ALIAS(atomic_add_32_nv,_atomic_add_32_nv)
    133 ALIAS(atomic_add_int_nv,_atomic_add_32_nv)
    134 ALIAS(atomic_add_64_nv,_atomic_add_64_nv)
    135 ALIAS(atomic_add_long_nv,_atomic_add_64_nv)
    136 ALIAS(atomic_add_ptr_nv,_atomic_add_64_nv)
    137 
    138 ALIAS(atomic_and_32,_atomic_and_32)
    139 ALIAS(atomic_and_uint,_atomic_and_32)
    140 ALIAS(atomic_and_64,_atomic_and_64)
    141 ALIAS(atomic_and_ulong,_atomic_and_64)
    142 ALIAS(atomic_and_ptr,_atomic_and_64)
    143 
    144 ALIAS(atomic_and_32_nv,_atomic_and_32_nv)
    145 ALIAS(atomic_and_uint_nv,_atomic_and_32_nv)
    146 ALIAS(atomic_and_64_nv,_atomic_and_64_nv)
    147 ALIAS(atomic_and_ulong_nv,_atomic_and_64_nv)
    148 ALIAS(atomic_and_ptr_nv,_atomic_and_64_nv)
    149 
    150 ALIAS(atomic_dec_32,_atomic_dec_32)
    151 ALIAS(atomic_dec_uint,_atomic_dec_32)
    152 ALIAS(atomic_dec_64,_atomic_dec_64)
    153 ALIAS(atomic_dec_ulong,_atomic_dec_64)
    154 ALIAS(atomic_dec_ptr,_atomic_dec_64)
    155 
    156 ALIAS(atomic_dec_32_nv,_atomic_dec_32_nv)
    157 ALIAS(atomic_dec_uint_nv,_atomic_dec_32_nv)
    158 ALIAS(atomic_dec_64_nv,_atomic_dec_64_nv)
    159 ALIAS(atomic_dec_ulong_nv,_atomic_dec_64_nv)
    160 ALIAS(atomic_dec_ptr_nv,_atomic_dec_64_nv)
    161 
    162 ALIAS(atomic_inc_32,_atomic_inc_32)
    163 ALIAS(atomic_inc_uint,_atomic_inc_32)
    164 ALIAS(atomic_inc_64,_atomic_inc_64)
    165 ALIAS(atomic_inc_ulong,_atomic_inc_64)
    166 ALIAS(atomic_inc_ptr,_atomic_inc_64)
    167 
    168 ALIAS(atomic_inc_32_nv,_atomic_inc_32_nv)
    169 ALIAS(atomic_inc_uint_nv,_atomic_inc_32_nv)
    170 ALIAS(atomic_inc_64_nv,_atomic_inc_64_nv)
    171 ALIAS(atomic_inc_ulong_nv,_atomic_inc_64_nv)
    172 ALIAS(atomic_inc_ptr_nv,_atomic_inc_64_nv)
    173 
    174 ALIAS(atomic_or_32,_atomic_or_32)
    175 ALIAS(atomic_or_uint,_atomic_or_32)
    176 ALIAS(atomic_or_64,_atomic_or_64)
    177 ALIAS(atomic_or_ulong,_atomic_or_64)
    178 ALIAS(atomic_or_ptr,_atomic_or_64)
    179 
    180 ALIAS(atomic_or_32_nv,_atomic_or_32_nv)
    181 ALIAS(atomic_or_uint_nv,_atomic_or_32_nv)
    182 ALIAS(atomic_or_64_nv,_atomic_or_64_nv)
    183 ALIAS(atomic_or_ulong_nv,_atomic_or_64_nv)
    184 ALIAS(atomic_or_ptr_nv,_atomic_or_64_nv)
    185 
    186 ALIAS(atomic_swap_32,_atomic_swap_32)
    187 ALIAS(atomic_swap_uint,_atomic_swap_32)
    188 ALIAS(atomic_swap_64,_atomic_swap_64)
    189 ALIAS(atomic_swap_ulong,_atomic_swap_64)
    190 ALIAS(atomic_swap_ptr,_atomic_swap_64)
    191 
    192 ALIAS(atomic_cas_32,_atomic_cas_32)
    193 ALIAS(atomic_cas_uint,_atomic_cas_32)
    194 ALIAS(atomic_cas_64,_atomic_cas_64)
    195 ALIAS(atomic_cas_ulong,_atomic_cas_64)
    196 ALIAS(atomic_cas_ptr,_atomic_cas_64)
    197 
    198 ALIAS(membar_consumer,_membar_consumer)
    199 ALIAS(membar_producer,_membar_producer)
    200 ALIAS(membar_enter,_membar_enter)
    201 ALIAS(membar_exit,_membar_exit)
    202 ALIAS(membar_sync,_membar_sync)
    203 
    204 STRONG_ALIAS(_atomic_add_int,_atomic_add_32)
    205 STRONG_ALIAS(_atomic_add_long,_atomic_add_64)
    206 STRONG_ALIAS(_atomic_add_ptr,_atomic_add_64)
    207 
    208 STRONG_ALIAS(_atomic_add_int_nv,_atomic_add_32_nv)
    209 STRONG_ALIAS(_atomic_add_long_nv,_atomic_add_64_nv)
    210 STRONG_ALIAS(_atomic_add_ptr_nv,_atomic_add_64_nv)
    211 
    212 STRONG_ALIAS(_atomic_and_uint,_atomic_and_32)
    213 STRONG_ALIAS(_atomic_and_ulong,_atomic_and_64)
    214 STRONG_ALIAS(_atomic_and_ptr,_atomic_and_64)
    215 
    216 STRONG_ALIAS(_atomic_and_uint_nv,_atomic_and_32_nv)
    217 STRONG_ALIAS(_atomic_and_ulong_nv,_atomic_and_64_nv)
    218 STRONG_ALIAS(_atomic_and_ptr_nv,_atomic_and_64_nv)
    219 
    220 STRONG_ALIAS(_atomic_dec_uint,_atomic_dec_32)
    221 STRONG_ALIAS(_atomic_dec_ulong,_atomic_dec_64)
    222 STRONG_ALIAS(_atomic_dec_ptr,_atomic_dec_64)
    223 
    224 STRONG_ALIAS(_atomic_dec_uint_nv,_atomic_dec_32_nv)
    225 STRONG_ALIAS(_atomic_dec_ulong_nv,_atomic_dec_64_nv)
    226 STRONG_ALIAS(_atomic_dec_ptr_nv,_atomic_dec_64_nv)
    227 
    228 STRONG_ALIAS(_atomic_inc_uint,_atomic_inc_32)
    229 STRONG_ALIAS(_atomic_inc_ulong,_atomic_inc_64)
    230 STRONG_ALIAS(_atomic_inc_ptr,_atomic_inc_64)
    231 
    232 STRONG_ALIAS(_atomic_inc_uint_nv,_atomic_inc_32_nv)
    233 STRONG_ALIAS(_atomic_inc_ulong_nv,_atomic_inc_64_nv)
    234 STRONG_ALIAS(_atomic_inc_ptr_nv,_atomic_inc_64_nv)
    235 
    236 STRONG_ALIAS(_atomic_or_uint,_atomic_or_32)
    237 STRONG_ALIAS(_atomic_or_ulong,_atomic_or_64)
    238 STRONG_ALIAS(_atomic_or_ptr,_atomic_or_64)
    239 
    240 STRONG_ALIAS(_atomic_or_uint_nv,_atomic_or_32_nv)
    241 STRONG_ALIAS(_atomic_or_ulong_nv,_atomic_or_64_nv)
    242 STRONG_ALIAS(_atomic_or_ptr_nv,_atomic_or_64_nv)
    243 
    244 STRONG_ALIAS(_atomic_swap_uint,_atomic_swap_32)
    245 STRONG_ALIAS(_atomic_swap_ulong,_atomic_swap_64)
    246 STRONG_ALIAS(_atomic_swap_ptr,_atomic_swap_64)
    247 
    248 STRONG_ALIAS(_atomic_cas_uint,_atomic_cas_32)
    249 STRONG_ALIAS(_atomic_cas_ulong,_atomic_cas_64)
    250 STRONG_ALIAS(_atomic_cas_ptr,_atomic_cas_64)
    251