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