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
7TEXT ·SwapInt32(SB),NOSPLIT,$0-20
8	BR	·SwapUint32(SB)
9
10TEXT ·SwapUint32(SB),NOSPLIT,$0-20
11	MOVD	addr+0(FP), R3
12	MOVWZ	new+8(FP), R4
13	MOVWZ	(R3), R5
14repeat:
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
20TEXT ·SwapInt64(SB),NOSPLIT,$0-24
21	BR	·SwapUint64(SB)
22
23TEXT ·SwapUint64(SB),NOSPLIT,$0-24
24	MOVD	addr+0(FP), R3
25	MOVD	new+8(FP), R4
26	MOVD	(R3), R5
27repeat:
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
33TEXT ·SwapUintptr(SB),NOSPLIT,$0-24
34	BR	·SwapUint64(SB)
35
36TEXT ·CompareAndSwapInt32(SB),NOSPLIT,$0-17
37	BR	·CompareAndSwapUint32(SB)
38
39TEXT ·CompareAndSwapUint32(SB),NOSPLIT,$0-17
40	MOVD	addr+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, swapped+16(FP)
46	RET
47cas_fail:
48	MOVB	$0, swapped+16(FP)
49	RET
50
51TEXT ·CompareAndSwapUintptr(SB),NOSPLIT,$0-25
52	BR	·CompareAndSwapUint64(SB)
53
54TEXT ·CompareAndSwapInt64(SB),NOSPLIT,$0-25
55	BR	·CompareAndSwapUint64(SB)
56
57TEXT ·CompareAndSwapUint64(SB),NOSPLIT,$0-25
58	MOVD	addr+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, swapped+24(FP)
64	RET
65cas64_fail:
66	MOVB	$0, swapped+24(FP)
67	RET
68
69TEXT ·AddInt32(SB),NOSPLIT,$0-20
70	BR	·AddUint32(SB)
71
72TEXT ·AddUint32(SB),NOSPLIT,$0-20
73	MOVD	addr+0(FP), R4
74	MOVWZ	delta+8(FP), R5
75	MOVWZ	(R4), R3
76repeat:
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, new+16(FP)
81	RET
82
83TEXT ·AddUintptr(SB),NOSPLIT,$0-24
84	BR	·AddUint64(SB)
85
86TEXT ·AddInt64(SB),NOSPLIT,$0-24
87	BR	·AddUint64(SB)
88
89TEXT ·AddUint64(SB),NOSPLIT,$0-24
90	MOVD	addr+0(FP), R4
91	MOVD	delta+8(FP), R5
92	MOVD	(R4), R3
93repeat:
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, new+16(FP)
98	RET
99
100TEXT ·LoadInt32(SB),NOSPLIT,$0-12
101	BR	·LoadUint32(SB)
102
103TEXT ·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
109TEXT ·LoadInt64(SB),NOSPLIT,$0-16
110	BR	·LoadUint64(SB)
111
112TEXT ·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
118TEXT ·LoadUintptr(SB),NOSPLIT,$0-16
119	BR	·LoadPointer(SB)
120
121TEXT ·LoadPointer(SB),NOSPLIT,$0-16
122	BR	·LoadUint64(SB)
123
124TEXT ·StoreInt32(SB),NOSPLIT,$0-12
125	BR	·StoreUint32(SB)
126
127TEXT ·StoreUint32(SB),NOSPLIT,$0-12
128	MOVD	addr+0(FP), R3
129	MOVW	val+8(FP), R4
130	MOVW	R4, 0(R3)
131	RET
132
133TEXT ·StoreInt64(SB),NOSPLIT,$0-16
134	BR	·StoreUint64(SB)
135
136TEXT ·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
142TEXT ·StoreUintptr(SB),NOSPLIT,$0-16
143	BR	·StoreUint64(SB)
144