diff options
author | Austin Clements <austin@google.com> | 2014-11-03 10:53:11 -0500 |
---|---|---|
committer | Austin Clements <austin@google.com> | 2014-11-03 10:53:11 -0500 |
commit | a99ecf3e88b4af2999b94cc7195cb64c8e7addcd (patch) | |
tree | 7503515b74bc72ddf1b66e17da99c2f9cae22b31 /src/sync | |
parent | 27415cf7bf3f0be8cd0a5e696bfaac6d16cc9cf1 (diff) | |
parent | 0fc3394d300f31ece45f1ddf7d3e4db951d73466 (diff) | |
download | go-a99ecf3e88b4af2999b94cc7195cb64c8e7addcd.tar.gz |
[dev.power64] all: merge default into dev.power64
Trivial merge except for src/runtime/asm_power64x.s and
src/runtime/signal_power64x.c
LGTM=rsc
R=rsc
CC=golang-codereviews
https://codereview.appspot.com/168950044
Diffstat (limited to 'src/sync')
-rw-r--r-- | src/sync/atomic/asm_power64x.s | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/src/sync/atomic/asm_power64x.s b/src/sync/atomic/asm_power64x.s new file mode 100644 index 000000000..1130d3c16 --- /dev/null +++ b/src/sync/atomic/asm_power64x.s @@ -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 "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) |