diff --git a/src/pkg/sync/atomic/asm_power64x.s b/src/pkg/sync/atomic/asm_power64x.s new file mode 100644 index 00000000000..bdb1dcff496 --- /dev/null +++ b/src/pkg/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 "../../../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)