Home | History | Annotate | Download | only in atomic
      1 // Copyright 2012 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 #include "textflag.h"
      6 
      7 #define DMB_ISH_7 \
      8 	MOVB	runtimegoarm(SB), R11; \
      9 	CMP	$7, R11; \
     10 	BLT	2(PC); \
     11 	WORD	$0xf57ff05b	// dmb ish
     12 
     13 // Plan9/ARM atomic operations.
     14 // TODO(minux): this only supports ARMv6K or higher.
     15 
     16 TEXT CompareAndSwapInt32(SB),NOSPLIT,$0
     17 	B CompareAndSwapUint32(SB)
     18 
     19 TEXT CompareAndSwapUint32(SB),NOSPLIT,$0
     20 	B armCompareAndSwapUint32(SB)
     21 
     22 TEXT CompareAndSwapUintptr(SB),NOSPLIT,$0
     23 	B CompareAndSwapUint32(SB)
     24 
     25 TEXT AddInt32(SB),NOSPLIT,$0
     26 	B AddUint32(SB)
     27 
     28 TEXT AddUint32(SB),NOSPLIT,$0
     29 	B armAddUint32(SB)
     30 
     31 TEXT AddUintptr(SB),NOSPLIT,$0
     32 	B AddUint32(SB)
     33 
     34 TEXT SwapInt32(SB),NOSPLIT,$0
     35 	B SwapUint32(SB)
     36 
     37 TEXT SwapUint32(SB),NOSPLIT,$0
     38 	B armSwapUint32(SB)
     39 
     40 TEXT SwapUintptr(SB),NOSPLIT,$0
     41 	B SwapUint32(SB)
     42 
     43 TEXT CompareAndSwapInt64(SB),NOSPLIT,$0
     44 	B CompareAndSwapUint64(SB)
     45 
     46 TEXT CompareAndSwapUint64(SB),NOSPLIT,$-4
     47 	B armCompareAndSwapUint64(SB)
     48 
     49 TEXT AddInt64(SB),NOSPLIT,$0
     50 	B addUint64(SB)
     51 
     52 TEXT AddUint64(SB),NOSPLIT,$0
     53 	B addUint64(SB)
     54 
     55 TEXT SwapInt64(SB),NOSPLIT,$0
     56 	B swapUint64(SB)
     57 
     58 TEXT SwapUint64(SB),NOSPLIT,$0
     59 	B swapUint64(SB)
     60 
     61 TEXT LoadInt32(SB),NOSPLIT,$0
     62 	B LoadUint32(SB)
     63 
     64 TEXT LoadUint32(SB),NOSPLIT,$0-8
     65 	MOVW addr+0(FP), R1
     66 load32loop:
     67 	LDREX (R1), R2		// loads R2
     68 	STREX R2, (R1), R0	// stores R2
     69 	CMP $0, R0
     70 	BNE load32loop
     71 	MOVW R2, val+4(FP)
     72 	DMB_ISH_7
     73 	RET
     74 
     75 TEXT LoadInt64(SB),NOSPLIT,$0
     76 	B loadUint64(SB)
     77 
     78 TEXT LoadUint64(SB),NOSPLIT,$0
     79 	B loadUint64(SB)
     80 
     81 TEXT LoadUintptr(SB),NOSPLIT,$0
     82 	B LoadUint32(SB)
     83 
     84 TEXT LoadPointer(SB),NOSPLIT,$0
     85 	B LoadUint32(SB)
     86 
     87 TEXT StoreInt32(SB),NOSPLIT,$0
     88 	B StoreUint32(SB)
     89 
     90 TEXT StoreUint32(SB),NOSPLIT,$0-8
     91 	MOVW addr+0(FP), R1
     92 	MOVW val+4(FP), R2
     93 	DMB_ISH_7
     94 storeloop:
     95 	LDREX (R1), R4		// loads R4
     96 	STREX R2, (R1), R0	// stores R2
     97 	CMP $0, R0
     98 	BNE storeloop
     99 	RET
    100 
    101 TEXT StoreInt64(SB),NOSPLIT,$0
    102 	B storeUint64(SB)
    103 
    104 TEXT StoreUint64(SB),NOSPLIT,$0
    105 	B storeUint64(SB)
    106 
    107 TEXT StoreUintptr(SB),NOSPLIT,$0
    108 	B StoreUint32(SB)
    109