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