root/src/pkg/sync/atomic/asm_freebsd_arm.s

/* [<][>][^][v][top][bottom][index][help] */
// Copyright 2012 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

#include "../../../cmd/ld/textflag.h"

// FreeBSD/ARM atomic operations.
// TODO(minux): this only supports ARMv6K or higher.

TEXT ツキCompareAndSwapInt32(SB),NOSPLIT,$0
        B ツキCompareAndSwapUint32(SB)

TEXT ツキCompareAndSwapUint32(SB),NOSPLIT,$0
        B ツキarmCompareAndSwapUint32(SB)

TEXT ツキCompareAndSwapUintptr(SB),NOSPLIT,$0
        B ツキCompareAndSwapUint32(SB)

TEXT ツキCompareAndSwapPointer(SB),NOSPLIT,$0
        B ツキCompareAndSwapUint32(SB)

TEXT ツキAddInt32(SB),NOSPLIT,$0
        B ツキAddUint32(SB)

TEXT ツキAddUint32(SB),NOSPLIT,$0
        B ツキarmAddUint32(SB)

TEXT ツキAddUintptr(SB),NOSPLIT,$0
        B ツキAddUint32(SB)

TEXT ツキSwapInt32(SB),NOSPLIT,$0
        B ツキSwapUint32(SB)

TEXT ツキSwapUint32(SB),NOSPLIT,$0
        B ツキarmSwapUint32(SB)

TEXT ツキSwapUintptr(SB),NOSPLIT,$0
        B ツキSwapUint32(SB)

TEXT ツキSwapPointer(SB),NOSPLIT,$0
        B ツキSwapUint32(SB)

TEXT ツキCompareAndSwapInt64(SB),NOSPLIT,$0
        B ツキCompareAndSwapUint64(SB)

TEXT ツキCompareAndSwapUint64(SB),NOSPLIT,$-4
        B ツキarmCompareAndSwapUint64(SB)

TEXT ツキAddInt64(SB),NOSPLIT,$0
        B ツキaddUint64(SB)

TEXT ツキAddUint64(SB),NOSPLIT,$0
        B ツキaddUint64(SB)

TEXT ツキSwapInt64(SB),NOSPLIT,$0
        B ツキswapUint64(SB)

TEXT ツキSwapUint64(SB),NOSPLIT,$0
        B ツキswapUint64(SB)

TEXT ツキLoadInt32(SB),NOSPLIT,$0
        B ツキLoadUint32(SB)

TEXT ツキLoadUint32(SB),NOSPLIT,$0-8
        MOVW addr+0(FP), R1
load32loop:
        LDREX (R1), R2          // loads R2
        STREX R2, (R1), R0      // stores R2
        CMP $0, R0
        BNE load32loop
        MOVW R2, val+4(FP)
        RET

TEXT ツキLoadInt64(SB),NOSPLIT,$0
        B ツキloadUint64(SB)

TEXT ツキLoadUint64(SB),NOSPLIT,$0
        B ツキloadUint64(SB)

TEXT ツキLoadUintptr(SB),NOSPLIT,$0
        B ツキLoadUint32(SB)

TEXT ツキLoadPointer(SB),NOSPLIT,$0
        B ツキLoadUint32(SB)

TEXT ツキStoreInt32(SB),NOSPLIT,$0
        B ツキStoreUint32(SB)

TEXT ツキStoreUint32(SB),NOSPLIT,$0-8
        MOVW addr+0(FP), R1
        MOVW val+4(FP), R2
storeloop:
        LDREX (R1), R4          // loads R4
        STREX R2, (R1), R0      // stores R2
        CMP $0, R0
        BNE storeloop
        RET

TEXT ツキStoreInt64(SB),NOSPLIT,$0
        B ツキstoreUint64(SB)

TEXT ツキStoreUint64(SB),NOSPLIT,$0
        B ツキstoreUint64(SB)

TEXT ツキStoreUintptr(SB),NOSPLIT,$0
        B ツキStoreUint32(SB)

TEXT ツキStorePointer(SB),NOSPLIT,$0
        B ツキStoreUint32(SB)

/* [<][>][^][v][top][bottom][index][help] */