]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.power64] sync/atomic: implement for asm_power64x.s
authorShenghou Ma <minux@golang.org>
Tue, 12 Aug 2014 23:50:51 +0000 (19:50 -0400)
committerShenghou Ma <minux@golang.org>
Tue, 12 Aug 2014 23:50:51 +0000 (19:50 -0400)
LGTM=rsc
R=rsc, iant
CC=golang-codereviews
https://golang.org/cl/124220043

src/pkg/sync/atomic/asm_power64x.s [new file with mode: 0644]

diff --git a/src/pkg/sync/atomic/asm_power64x.s b/src/pkg/sync/atomic/asm_power64x.s
new file mode 100644 (file)
index 0000000..bdb1dcf
--- /dev/null
@@ -0,0 +1,184 @@
+// Copyright 2014 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.
+
+// +build power64 power64le
+
+#include "../../../cmd/ld/textflag.h"
+
+TEXT ·SwapInt32(SB),NOSPLIT,$0-20
+       BR      ·SwapUint32(SB)
+
+TEXT ·SwapUint32(SB),NOSPLIT,$0-20
+       MOVD    addr+0(FP), R3
+       MOVW    new+8(FP), R4
+       SYNC
+       LWAR    (R3), R5
+       STWCCC  R4, (R3)
+       BNE     -3(PC)
+       SYNC
+       ISYNC
+       MOVW    R5, old+16(FP)
+       RETURN
+
+TEXT ·SwapInt64(SB),NOSPLIT,$0-24
+       BR      ·SwapUint64(SB)
+
+TEXT ·SwapUint64(SB),NOSPLIT,$0-24
+       MOVD    addr+0(FP), R3
+       MOVD    new+8(FP), R4
+       SYNC
+       LDAR    (R3), R5
+       STDCCC  R4, (R3)
+       BNE     -3(PC)
+       SYNC
+       ISYNC
+       MOVD    R5, old+16(FP)
+       RETURN
+
+TEXT ·SwapUintptr(SB),NOSPLIT,$0-24
+       BR      ·SwapUint64(SB)
+
+TEXT ·SwapPointer(SB),NOSPLIT,$0-24
+       BR      ·SwapUint64(SB)
+
+TEXT ·CompareAndSwapInt32(SB),NOSPLIT,$0-17
+       BR      ·CompareAndSwapUint32(SB)
+
+TEXT ·CompareAndSwapUint32(SB),NOSPLIT,$0-17
+       MOVD    addr+0(FP), R3
+       MOVW    old+8(FP), R4
+       MOVW    new+12(FP), R5
+       SYNC
+       LWAR    (R3), R6
+       CMPW    R6, R4
+       BNE     8(PC)
+       STWCCC  R5, (R3)
+       BNE     -5(PC)
+       SYNC
+       ISYNC
+       MOVD    $1, R3
+       MOVB    R3, swapped+16(FP)
+       RETURN
+       MOVB    R0, swapped+16(FP)
+       RETURN
+
+TEXT ·CompareAndSwapUintptr(SB),NOSPLIT,$0-25
+       BR      ·CompareAndSwapUint64(SB)
+
+TEXT ·CompareAndSwapPointer(SB),NOSPLIT,$0-25
+       BR      ·CompareAndSwapUint64(SB)
+
+TEXT ·CompareAndSwapInt64(SB),NOSPLIT,$0-25
+       BR      ·CompareAndSwapUint64(SB)
+
+TEXT ·CompareAndSwapUint64(SB),NOSPLIT,$0-25
+       MOVD    addr+0(FP), R3
+       MOVD    old+8(FP), R4
+       MOVD    new+16(FP), R5
+       SYNC
+       LDAR    (R3), R6
+       CMP     R6, R4
+       BNE     8(PC)
+       STDCCC  R5, (R3)
+       BNE     -5(PC)
+       SYNC
+       ISYNC
+       MOVD    $1, R3
+       MOVB    R3, swapped+24(FP)
+       RETURN
+       MOVB    R0, swapped+24(FP)
+       RETURN
+
+TEXT ·AddInt32(SB),NOSPLIT,$0-20
+       BR      ·AddUint32(SB)
+
+TEXT ·AddUint32(SB),NOSPLIT,$0-20
+       MOVD    addr+0(FP), R3
+       MOVW    delta+8(FP), R4
+       SYNC
+       LWAR    (R3), R5
+       ADD     R4, R5
+       STWCCC  R5, (R3)
+       BNE     -4(PC)
+       SYNC
+       ISYNC
+       MOVW    R5, ret+16(FP)
+       RETURN
+
+TEXT ·AddUintptr(SB),NOSPLIT,$0-24
+       BR      ·AddUint64(SB)
+
+TEXT ·AddInt64(SB),NOSPLIT,$0-24
+       BR      ·AddUint64(SB)
+
+TEXT ·AddUint64(SB),NOSPLIT,$0-24
+       MOVD    addr+0(FP), R3
+       MOVD    delta+8(FP), R4
+       SYNC
+       LDAR    (R3), R5
+       ADD     R4, R5
+       STDCCC  R5, (R3)
+       BNE     -4(PC)
+       SYNC
+       ISYNC
+       MOVD    R5, ret+16(FP)
+       RETURN
+
+TEXT ·LoadInt32(SB),NOSPLIT,$0-12
+       BR      ·LoadUint32(SB)
+
+TEXT ·LoadUint32(SB),NOSPLIT,$0-12
+       MOVD    addr+0(FP), R3
+       SYNC
+       MOVW    0(R3), R3
+       CMPW    R3, R3, CR7
+       BC      4, 30, 1(PC)    // bne- cr7,0x4
+       ISYNC
+       MOVW    R3, val+8(FP)
+       RETURN
+
+TEXT ·LoadInt64(SB),NOSPLIT,$0-16
+       BR      ·LoadUint64(SB)
+
+TEXT ·LoadUint64(SB),NOSPLIT,$0-16
+       MOVD    addr+0(FP), R3
+       SYNC
+       MOVD    0(R3), R3
+       CMP     R3, R3, CR7
+       BC      4, 30, 1(PC)    // bne- cr7,0x4
+       ISYNC
+       MOVD    R3, val+8(FP)
+       RETURN
+
+TEXT ·LoadUintptr(SB),NOSPLIT,$0-16
+       BR      ·LoadPointer(SB)
+
+TEXT ·LoadPointer(SB),NOSPLIT,$0-16
+       BR      ·LoadUint64(SB)
+
+TEXT ·StoreInt32(SB),NOSPLIT,$0-12
+       BR      ·StoreUint32(SB)
+
+TEXT ·StoreUint32(SB),NOSPLIT,$0-12
+       MOVD    addr+0(FP), R3
+       MOVW    val+8(FP), R4
+       SYNC
+       MOVW    R4, 0(R3)
+       RETURN
+
+TEXT ·StoreInt64(SB),NOSPLIT,$0-16
+       BR      ·StoreUint64(SB)
+
+TEXT ·StoreUint64(SB),NOSPLIT,$0-16
+       MOVD    addr+0(FP), R3
+       MOVD    val+8(FP), R4
+       SYNC
+       MOVD    R4, 0(R3)
+       RETURN
+
+TEXT ·StoreUintptr(SB),NOSPLIT,$0-16
+       BR      ·StorePointer(SB)
+
+TEXT ·StorePointer(SB),NOSPLIT,$0-16
+       BR      ·StoreUint64(SB)