Home | History | Annotate | Line # | Download | only in atomic
atomic_cas.S revision 1.13.16.2
      1  1.13.16.1   martin /*	$NetBSD: atomic_cas.S,v 1.13.16.2 2020/04/21 19:37:43 martin Exp $	*/
      2        1.2       ad 
      3        1.2       ad /*-
      4        1.3       ad  * Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
      5        1.2       ad  * All rights reserved.
      6        1.2       ad  *
      7        1.2       ad  * This code is derived from software contributed to The NetBSD Foundation
      8        1.2       ad  * by Jason R. Thorpe.
      9        1.2       ad  *
     10        1.2       ad  * Redistribution and use in source and binary forms, with or without
     11        1.2       ad  * modification, are permitted provided that the following conditions
     12        1.2       ad  * are met:
     13        1.2       ad  * 1. Redistributions of source code must retain the above copyright
     14        1.2       ad  *    notice, this list of conditions and the following disclaimer.
     15        1.2       ad  * 2. Redistributions in binary form must reproduce the above copyright
     16        1.2       ad  *    notice, this list of conditions and the following disclaimer in the
     17        1.2       ad  *    documentation and/or other materials provided with the distribution.
     18        1.2       ad  *
     19        1.2       ad  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20        1.2       ad  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21        1.2       ad  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22        1.2       ad  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23        1.2       ad  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24        1.2       ad  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25        1.2       ad  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26        1.2       ad  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27        1.2       ad  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28        1.2       ad  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29        1.2       ad  * POSSIBILITY OF SUCH DAMAGE.
     30        1.2       ad  */
     31        1.2       ad 
     32        1.2       ad #include "atomic_op_asm.h"
     33        1.2       ad 
     34        1.2       ad 	.text
     35        1.2       ad 
     36        1.5      chs ENTRY(_atomic_cas_32)
     37        1.6     matt 	movl	4(%sp), %a0
     38        1.6     matt 	movl	8(%sp), %d0
     39        1.6     matt 	movl	12(%sp), %d1
     40        1.7     matt 	casl	%d0, %d1, (%a0)
     41        1.2       ad 	/* %d0 now contains the old value */
     42        1.2       ad 	movl	%d0, %a0	/* pointers return also in %a0 */
     43        1.2       ad 	rts
     44        1.7     matt END(_atomic_cas_32)
     45        1.3       ad 
     46        1.2       ad ATOMIC_OP_ALIAS(atomic_cas_32,_atomic_cas_32)
     47        1.2       ad ATOMIC_OP_ALIAS(atomic_cas_uint,_atomic_cas_32)
     48        1.2       ad STRONG_ALIAS(_atomic_cas_uint,_atomic_cas_32)
     49        1.2       ad ATOMIC_OP_ALIAS(atomic_cas_ulong,_atomic_cas_32)
     50        1.2       ad STRONG_ALIAS(_atomic_cas_ulong,_atomic_cas_32)
     51        1.2       ad ATOMIC_OP_ALIAS(atomic_cas_ptr,_atomic_cas_32)
     52        1.2       ad STRONG_ALIAS(_atomic_cas_ptr,_atomic_cas_32)
     53       1.10   martin CRT_ALIAS(__sync_val_compare_and_swap_4,_atomic_cas_32)
     54        1.3       ad 
     55        1.3       ad ATOMIC_OP_ALIAS(atomic_cas_32_ni,_atomic_cas_32)
     56        1.3       ad STRONG_ALIAS(_atomic_cas_32_ni,_atomic_cas_32)
     57        1.3       ad ATOMIC_OP_ALIAS(atomic_cas_uint_ni,_atomic_cas_32)
     58        1.3       ad STRONG_ALIAS(_atomic_cas_uint_ni,_atomic_cas_32)
     59        1.3       ad ATOMIC_OP_ALIAS(atomic_cas_ulong_ni,_atomic_cas_32)
     60        1.3       ad STRONG_ALIAS(_atomic_cas_ulong_ni,_atomic_cas_32)
     61        1.3       ad ATOMIC_OP_ALIAS(atomic_cas_ptr_ni,_atomic_cas_32)
     62        1.3       ad STRONG_ALIAS(_atomic_cas_ptr_ni,_atomic_cas_32)
     63        1.8   martin 
     64        1.8   martin ENTRY(__sync_bool_compare_and_swap_4)
     65        1.8   martin 	movl	4(%sp), %a0
     66       1.11    isaki 	movl	8(%sp), %d0
     67        1.8   martin 	movl	12(%sp), %d1
     68       1.11    isaki 	casl	%d0, %d1, (%a0)
     69       1.12    isaki 	beqs	1f
     70        1.9   martin 	clrl	%d0	/* return false */
     71        1.9   martin 	rts
     72       1.12    isaki 1:	movql	#1, %d0	/* return success */
     73        1.9   martin 	rts
     74        1.8   martin END(__sync_bool_compare_and_swap_4)
     75        1.8   martin 
     76        1.8   martin ENTRY(_atomic_cas_16)
     77        1.8   martin 	movl	4(%sp), %a0
     78       1.11    isaki 	movw	8+2(%sp), %d0		/* lower word */
     79       1.11    isaki 	movw	12+2(%sp), %d1		/* lower word */
     80        1.8   martin 	casw	%d0, %d1, (%a0)
     81        1.8   martin 	/* %d0 now contains the old value */
     82        1.8   martin 	rts
     83        1.8   martin END(_atomic_cas_16)
     84        1.8   martin 
     85        1.8   martin ATOMIC_OP_ALIAS(atomic_cas_16,_atomic_cas_16)
     86       1.10   martin CRT_ALIAS(__sync_val_compare_and_swap_2,_atomic_cas_16)
     87        1.8   martin 
     88        1.8   martin ENTRY(__sync_bool_compare_and_swap_2)
     89        1.8   martin 	movl	4(%sp), %a0
     90       1.11    isaki 	movw	8+2(%sp), %d0		/* lower word */
     91       1.11    isaki 	movw	12+2(%sp), %d1		/* lower word */
     92       1.11    isaki 	casw	%d0, %d1, (%a0)
     93       1.13  mlelstv 	/* %d0 now contains the old value */
     94       1.12    isaki 	beqs	1f
     95        1.9   martin 	clrl	%d0	/* return failure */
     96        1.9   martin 	rts
     97       1.12    isaki 1:	movql	#1, %d0	/* return success */
     98        1.9   martin 	rts
     99        1.8   martin END(__sync_bool_compare_and_swap_2)
    100        1.8   martin 
    101        1.8   martin ENTRY(_atomic_cas_8)
    102        1.8   martin 	movl	4(%sp), %a0
    103       1.11    isaki 	movb	8+3(%sp), %d0		/* lower byte */
    104       1.11    isaki 	movb	12+3(%sp), %d1		/* lower byte */
    105        1.8   martin 	casb	%d0, %d1, (%a0)
    106        1.8   martin 	/* %d0 now contains the old value */
    107        1.8   martin 	rts
    108        1.8   martin END(_atomic_cas_8)
    109        1.8   martin 
    110        1.8   martin ATOMIC_OP_ALIAS(atomic_cas_8,_atomic_cas_8)
    111       1.10   martin CRT_ALIAS(__sync_val_compare_and_swap_1,_atomic_cas_8)
    112        1.8   martin 
    113        1.8   martin 
    114        1.8   martin ENTRY(__sync_bool_compare_and_swap_1)
    115        1.8   martin 	movl	4(%sp), %a0
    116       1.11    isaki 	movb	8+3(%sp), %d0		/* lower byte */
    117       1.11    isaki 	movb	12+3(%sp), %d1		/* lower byte */
    118       1.11    isaki 	casb	%d0, %d1, (%a0)
    119       1.13  mlelstv 	/* %d0 now contains the old value */
    120       1.12    isaki 	beqs	1f
    121        1.9   martin 	clrl	%d0	/* return failure */
    122        1.9   martin 	rts
    123       1.12    isaki 1:	movql	#1, %d0	/* return success */
    124        1.9   martin 	rts
    125        1.8   martin END(__sync_bool_compare_and_swap_1)
    126        1.8   martin 
    127