From: Michael Munday Date: Mon, 21 Mar 2016 01:34:48 +0000 (-0400) Subject: sync/atomic: add s390x implementations of atomic functions X-Git-Tag: go1.7beta1~834 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=7da42d75975044df37aa3aa2499623e2084a12df;p=gostls13.git sync/atomic: add s390x implementations of atomic functions Load and store instructions are atomic on s390x. Change-Id: I33c641a75954f4fbd301b11a467cb57872038880 Reviewed-on: https://go-review.googlesource.com/20947 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- diff --git a/src/sync/atomic/asm_s390x.s b/src/sync/atomic/asm_s390x.s new file mode 100644 index 0000000000..b5389be38f --- /dev/null +++ b/src/sync/atomic/asm_s390x.s @@ -0,0 +1,143 @@ +// Copyright 2016 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 "textflag.h" + +TEXT ·SwapInt32(SB),NOSPLIT,$0-20 + BR ·SwapUint32(SB) + +TEXT ·SwapUint32(SB),NOSPLIT,$0-20 + MOVD addr+0(FP), R3 + MOVWZ new+8(FP), R4 + MOVWZ (R3), R5 +repeat: + CS R5, R4, (R3) // if (R3)==R5 then (R3)=R4 else R5=(R3) + BNE repeat + MOVW R5, old+16(FP) + RET + +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 + MOVD (R3), R5 +repeat: + CSG R5, R4, (R3) // if (R3)==R5 then (R3)=R4 else R5=(R3) + BNE repeat + MOVD R5, old+16(FP) + RET + +TEXT ·SwapUintptr(SB),NOSPLIT,$0-24 + BR ·SwapUint64(SB) + +TEXT ·CompareAndSwapInt32(SB),NOSPLIT,$0-17 + BR ·CompareAndSwapUint32(SB) + +TEXT ·CompareAndSwapUint32(SB),NOSPLIT,$0-17 + MOVD ptr+0(FP), R3 + MOVWZ old+8(FP), R4 + MOVWZ new+12(FP), R5 + CS R4, R5, 0(R3) // if R4==(R3) then (R3)=R5 else R4=(R3) + BNE cas_fail + MOVB $1, ret+16(FP) + RET +cas_fail: + MOVB $0, ret+16(FP) + RET + +TEXT ·CompareAndSwapUintptr(SB),NOSPLIT,$0-25 + BR ·CompareAndSwapUint64(SB) + +TEXT ·CompareAndSwapInt64(SB),NOSPLIT,$0-25 + BR ·CompareAndSwapUint64(SB) + +TEXT ·CompareAndSwapUint64(SB),NOSPLIT,$0-25 + MOVD ptr+0(FP), R3 + MOVD old+8(FP), R4 + MOVD new+16(FP), R5 + CSG R4, R5, 0(R3) // if R4==(R3) then (R3)=R5 else R4=(R3) + BNE cas64_fail + MOVB $1, ret+24(FP) + RET +cas64_fail: + MOVB $0, ret+24(FP) + RET + +TEXT ·AddInt32(SB),NOSPLIT,$0-20 + BR ·AddUint32(SB) + +TEXT ·AddUint32(SB),NOSPLIT,$0-20 + MOVD ptr+0(FP), R4 + MOVWZ delta+8(FP), R5 + MOVWZ (R4), R3 +repeat: + ADD R3, R5, R6 + CS R3, R6, (R4) // if R3==(R4) then (R4)=R6 else R3=(R4) + BNE repeat + MOVW R6, ret+16(FP) + RET + +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 ptr+0(FP), R4 + MOVD delta+8(FP), R5 + MOVD (R4), R3 +repeat: + ADD R3, R5, R6 + CSG R3, R6, (R4) // if R3==(R4) then (R4)=R6 else R3=(R4) + BNE repeat + MOVD R6, ret+16(FP) + RET + +TEXT ·LoadInt32(SB),NOSPLIT,$0-12 + BR ·LoadUint32(SB) + +TEXT ·LoadUint32(SB),NOSPLIT,$0-12 + MOVD addr+0(FP), R3 + MOVW 0(R3), R4 + MOVW R4, val+8(FP) + RET + +TEXT ·LoadInt64(SB),NOSPLIT,$0-16 + BR ·LoadUint64(SB) + +TEXT ·LoadUint64(SB),NOSPLIT,$0-16 + MOVD addr+0(FP), R3 + MOVD 0(R3), R4 + MOVD R4, val+8(FP) + RET + +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 ptr+0(FP), R3 + MOVW val+8(FP), R4 + MOVW R4, 0(R3) + RET + +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 + MOVD R4, 0(R3) + RET + +TEXT ·StoreUintptr(SB),NOSPLIT,$0-16 + BR ·StoreUint64(SB)