Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7da42d7

Browse files
mundaymbradfitz
authored andcommitted
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 <[email protected]> Run-TryBot: Brad Fitzpatrick <[email protected]> TryBot-Result: Gobot Gobot <[email protected]>
1 parent 95a895d commit 7da42d7

File tree

1 file changed

+143
-0
lines changed

1 file changed

+143
-0
lines changed

src/sync/atomic/asm_s390x.s

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
// Copyright 2016 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+
TEXT ·SwapInt32(SB),NOSPLIT,$0-20
8+
BR ·SwapUint32(SB)
9+
10+
TEXT ·SwapUint32(SB),NOSPLIT,$0-20
11+
MOVD addr+0(FP), R3
12+
MOVWZ new+8(FP), R4
13+
MOVWZ (R3), R5
14+
repeat:
15+
CS R5, R4, (R3) // if (R3)==R5 then (R3)=R4 else R5=(R3)
16+
BNE repeat
17+
MOVW R5, old+16(FP)
18+
RET
19+
20+
TEXT ·SwapInt64(SB),NOSPLIT,$0-24
21+
BR ·SwapUint64(SB)
22+
23+
TEXT ·SwapUint64(SB),NOSPLIT,$0-24
24+
MOVD addr+0(FP), R3
25+
MOVD new+8(FP), R4
26+
MOVD (R3), R5
27+
repeat:
28+
CSG R5, R4, (R3) // if (R3)==R5 then (R3)=R4 else R5=(R3)
29+
BNE repeat
30+
MOVD R5, old+16(FP)
31+
RET
32+
33+
TEXT ·SwapUintptr(SB),NOSPLIT,$0-24
34+
BR ·SwapUint64(SB)
35+
36+
TEXT ·CompareAndSwapInt32(SB),NOSPLIT,$0-17
37+
BR ·CompareAndSwapUint32(SB)
38+
39+
TEXT ·CompareAndSwapUint32(SB),NOSPLIT,$0-17
40+
MOVD ptr+0(FP), R3
41+
MOVWZ old+8(FP), R4
42+
MOVWZ new+12(FP), R5
43+
CS R4, R5, 0(R3) // if R4==(R3) then (R3)=R5 else R4=(R3)
44+
BNE cas_fail
45+
MOVB $1, ret+16(FP)
46+
RET
47+
cas_fail:
48+
MOVB $0, ret+16(FP)
49+
RET
50+
51+
TEXT ·CompareAndSwapUintptr(SB),NOSPLIT,$0-25
52+
BR ·CompareAndSwapUint64(SB)
53+
54+
TEXT ·CompareAndSwapInt64(SB),NOSPLIT,$0-25
55+
BR ·CompareAndSwapUint64(SB)
56+
57+
TEXT ·CompareAndSwapUint64(SB),NOSPLIT,$0-25
58+
MOVD ptr+0(FP), R3
59+
MOVD old+8(FP), R4
60+
MOVD new+16(FP), R5
61+
CSG R4, R5, 0(R3) // if R4==(R3) then (R3)=R5 else R4=(R3)
62+
BNE cas64_fail
63+
MOVB $1, ret+24(FP)
64+
RET
65+
cas64_fail:
66+
MOVB $0, ret+24(FP)
67+
RET
68+
69+
TEXT ·AddInt32(SB),NOSPLIT,$0-20
70+
BR ·AddUint32(SB)
71+
72+
TEXT ·AddUint32(SB),NOSPLIT,$0-20
73+
MOVD ptr+0(FP), R4
74+
MOVWZ delta+8(FP), R5
75+
MOVWZ (R4), R3
76+
repeat:
77+
ADD R3, R5, R6
78+
CS R3, R6, (R4) // if R3==(R4) then (R4)=R6 else R3=(R4)
79+
BNE repeat
80+
MOVW R6, ret+16(FP)
81+
RET
82+
83+
TEXT ·AddUintptr(SB),NOSPLIT,$0-24
84+
BR ·AddUint64(SB)
85+
86+
TEXT ·AddInt64(SB),NOSPLIT,$0-24
87+
BR ·AddUint64(SB)
88+
89+
TEXT ·AddUint64(SB),NOSPLIT,$0-24
90+
MOVD ptr+0(FP), R4
91+
MOVD delta+8(FP), R5
92+
MOVD (R4), R3
93+
repeat:
94+
ADD R3, R5, R6
95+
CSG R3, R6, (R4) // if R3==(R4) then (R4)=R6 else R3=(R4)
96+
BNE repeat
97+
MOVD R6, ret+16(FP)
98+
RET
99+
100+
TEXT ·LoadInt32(SB),NOSPLIT,$0-12
101+
BR ·LoadUint32(SB)
102+
103+
TEXT ·LoadUint32(SB),NOSPLIT,$0-12
104+
MOVD addr+0(FP), R3
105+
MOVW 0(R3), R4
106+
MOVW R4, val+8(FP)
107+
RET
108+
109+
TEXT ·LoadInt64(SB),NOSPLIT,$0-16
110+
BR ·LoadUint64(SB)
111+
112+
TEXT ·LoadUint64(SB),NOSPLIT,$0-16
113+
MOVD addr+0(FP), R3
114+
MOVD 0(R3), R4
115+
MOVD R4, val+8(FP)
116+
RET
117+
118+
TEXT ·LoadUintptr(SB),NOSPLIT,$0-16
119+
BR ·LoadPointer(SB)
120+
121+
TEXT ·LoadPointer(SB),NOSPLIT,$0-16
122+
BR ·LoadUint64(SB)
123+
124+
TEXT ·StoreInt32(SB),NOSPLIT,$0-12
125+
BR ·StoreUint32(SB)
126+
127+
TEXT ·StoreUint32(SB),NOSPLIT,$0-12
128+
MOVD ptr+0(FP), R3
129+
MOVW val+8(FP), R4
130+
MOVW R4, 0(R3)
131+
RET
132+
133+
TEXT ·StoreInt64(SB),NOSPLIT,$0-16
134+
BR ·StoreUint64(SB)
135+
136+
TEXT ·StoreUint64(SB),NOSPLIT,$0-16
137+
MOVD addr+0(FP), R3
138+
MOVD val+8(FP), R4
139+
MOVD R4, 0(R3)
140+
RET
141+
142+
TEXT ·StoreUintptr(SB),NOSPLIT,$0-16
143+
BR ·StoreUint64(SB)

0 commit comments

Comments
 (0)