xref: /openbmc/linux/arch/sparc/lib/bitops.S (revision 4cdb71b6)
1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */
2478b8fecSSam Ravnborg/* bitops.S: Sparc64 atomic bit operations.
3478b8fecSSam Ravnborg *
4478b8fecSSam Ravnborg * Copyright (C) 2000, 2007 David S. Miller (davem@davemloft.net)
5478b8fecSSam Ravnborg */
6478b8fecSSam Ravnborg
7*4cdb71b6SMasahiro Yamada#include <linux/export.h>
88695c37dSDavid S. Miller#include <linux/linkage.h>
9478b8fecSSam Ravnborg#include <asm/asi.h>
10478b8fecSSam Ravnborg#include <asm/backoff.h>
11478b8fecSSam Ravnborg
12478b8fecSSam Ravnborg	.text
13478b8fecSSam Ravnborg
148695c37dSDavid S. MillerENTRY(test_and_set_bit)	/* %o0=nr, %o1=addr */
15478b8fecSSam Ravnborg	BACKOFF_SETUP(%o3)
16478b8fecSSam Ravnborg	srlx	%o0, 6, %g1
17478b8fecSSam Ravnborg	mov	1, %o2
18478b8fecSSam Ravnborg	sllx	%g1, 3, %g3
19478b8fecSSam Ravnborg	and	%o0, 63, %g2
20478b8fecSSam Ravnborg	sllx	%o2, %g2, %o2
21478b8fecSSam Ravnborg	add	%o1, %g3, %o1
22478b8fecSSam Ravnborg1:	ldx	[%o1], %g7
23478b8fecSSam Ravnborg	or	%g7, %o2, %g1
24478b8fecSSam Ravnborg	casx	[%o1], %g7, %g1
25478b8fecSSam Ravnborg	cmp	%g7, %g1
260f58189dSDavid S. Miller	bne,pn	%xcc, BACKOFF_LABEL(2f, 1b)
27478b8fecSSam Ravnborg	 and	%g7, %o2, %g2
28478b8fecSSam Ravnborg	clr	%o0
29478b8fecSSam Ravnborg	movrne	%g2, 1, %o0
30478b8fecSSam Ravnborg	retl
31478b8fecSSam Ravnborg	 nop
32478b8fecSSam Ravnborg2:	BACKOFF_SPIN(%o3, %o4, 1b)
338695c37dSDavid S. MillerENDPROC(test_and_set_bit)
34d3867f04SAl ViroEXPORT_SYMBOL(test_and_set_bit)
35478b8fecSSam Ravnborg
368695c37dSDavid S. MillerENTRY(test_and_clear_bit) /* %o0=nr, %o1=addr */
37478b8fecSSam Ravnborg	BACKOFF_SETUP(%o3)
38478b8fecSSam Ravnborg	srlx	%o0, 6, %g1
39478b8fecSSam Ravnborg	mov	1, %o2
40478b8fecSSam Ravnborg	sllx	%g1, 3, %g3
41478b8fecSSam Ravnborg	and	%o0, 63, %g2
42478b8fecSSam Ravnborg	sllx	%o2, %g2, %o2
43478b8fecSSam Ravnborg	add	%o1, %g3, %o1
44478b8fecSSam Ravnborg1:	ldx	[%o1], %g7
45478b8fecSSam Ravnborg	andn	%g7, %o2, %g1
46478b8fecSSam Ravnborg	casx	[%o1], %g7, %g1
47478b8fecSSam Ravnborg	cmp	%g7, %g1
480f58189dSDavid S. Miller	bne,pn	%xcc, BACKOFF_LABEL(2f, 1b)
49478b8fecSSam Ravnborg	 and	%g7, %o2, %g2
50478b8fecSSam Ravnborg	clr	%o0
51478b8fecSSam Ravnborg	movrne	%g2, 1, %o0
52478b8fecSSam Ravnborg	retl
53478b8fecSSam Ravnborg	 nop
54478b8fecSSam Ravnborg2:	BACKOFF_SPIN(%o3, %o4, 1b)
558695c37dSDavid S. MillerENDPROC(test_and_clear_bit)
56d3867f04SAl ViroEXPORT_SYMBOL(test_and_clear_bit)
57478b8fecSSam Ravnborg
588695c37dSDavid S. MillerENTRY(test_and_change_bit) /* %o0=nr, %o1=addr */
59478b8fecSSam Ravnborg	BACKOFF_SETUP(%o3)
60478b8fecSSam Ravnborg	srlx	%o0, 6, %g1
61478b8fecSSam Ravnborg	mov	1, %o2
62478b8fecSSam Ravnborg	sllx	%g1, 3, %g3
63478b8fecSSam Ravnborg	and	%o0, 63, %g2
64478b8fecSSam Ravnborg	sllx	%o2, %g2, %o2
65478b8fecSSam Ravnborg	add	%o1, %g3, %o1
66478b8fecSSam Ravnborg1:	ldx	[%o1], %g7
67478b8fecSSam Ravnborg	xor	%g7, %o2, %g1
68478b8fecSSam Ravnborg	casx	[%o1], %g7, %g1
69478b8fecSSam Ravnborg	cmp	%g7, %g1
700f58189dSDavid S. Miller	bne,pn	%xcc, BACKOFF_LABEL(2f, 1b)
71478b8fecSSam Ravnborg	 and	%g7, %o2, %g2
72478b8fecSSam Ravnborg	clr	%o0
73478b8fecSSam Ravnborg	movrne	%g2, 1, %o0
74478b8fecSSam Ravnborg	retl
75478b8fecSSam Ravnborg	 nop
76478b8fecSSam Ravnborg2:	BACKOFF_SPIN(%o3, %o4, 1b)
778695c37dSDavid S. MillerENDPROC(test_and_change_bit)
78d3867f04SAl ViroEXPORT_SYMBOL(test_and_change_bit)
79478b8fecSSam Ravnborg
808695c37dSDavid S. MillerENTRY(set_bit) /* %o0=nr, %o1=addr */
81478b8fecSSam Ravnborg	BACKOFF_SETUP(%o3)
82478b8fecSSam Ravnborg	srlx	%o0, 6, %g1
83478b8fecSSam Ravnborg	mov	1, %o2
84478b8fecSSam Ravnborg	sllx	%g1, 3, %g3
85478b8fecSSam Ravnborg	and	%o0, 63, %g2
86478b8fecSSam Ravnborg	sllx	%o2, %g2, %o2
87478b8fecSSam Ravnborg	add	%o1, %g3, %o1
88478b8fecSSam Ravnborg1:	ldx	[%o1], %g7
89478b8fecSSam Ravnborg	or	%g7, %o2, %g1
90478b8fecSSam Ravnborg	casx	[%o1], %g7, %g1
91478b8fecSSam Ravnborg	cmp	%g7, %g1
920f58189dSDavid S. Miller	bne,pn	%xcc, BACKOFF_LABEL(2f, 1b)
93478b8fecSSam Ravnborg	 nop
94478b8fecSSam Ravnborg	retl
95478b8fecSSam Ravnborg	 nop
96478b8fecSSam Ravnborg2:	BACKOFF_SPIN(%o3, %o4, 1b)
978695c37dSDavid S. MillerENDPROC(set_bit)
98d3867f04SAl ViroEXPORT_SYMBOL(set_bit)
99478b8fecSSam Ravnborg
1008695c37dSDavid S. MillerENTRY(clear_bit) /* %o0=nr, %o1=addr */
101478b8fecSSam Ravnborg	BACKOFF_SETUP(%o3)
102478b8fecSSam Ravnborg	srlx	%o0, 6, %g1
103478b8fecSSam Ravnborg	mov	1, %o2
104478b8fecSSam Ravnborg	sllx	%g1, 3, %g3
105478b8fecSSam Ravnborg	and	%o0, 63, %g2
106478b8fecSSam Ravnborg	sllx	%o2, %g2, %o2
107478b8fecSSam Ravnborg	add	%o1, %g3, %o1
108478b8fecSSam Ravnborg1:	ldx	[%o1], %g7
109478b8fecSSam Ravnborg	andn	%g7, %o2, %g1
110478b8fecSSam Ravnborg	casx	[%o1], %g7, %g1
111478b8fecSSam Ravnborg	cmp	%g7, %g1
1120f58189dSDavid S. Miller	bne,pn	%xcc, BACKOFF_LABEL(2f, 1b)
113478b8fecSSam Ravnborg	 nop
114478b8fecSSam Ravnborg	retl
115478b8fecSSam Ravnborg	 nop
116478b8fecSSam Ravnborg2:	BACKOFF_SPIN(%o3, %o4, 1b)
1178695c37dSDavid S. MillerENDPROC(clear_bit)
118d3867f04SAl ViroEXPORT_SYMBOL(clear_bit)
119478b8fecSSam Ravnborg
1208695c37dSDavid S. MillerENTRY(change_bit) /* %o0=nr, %o1=addr */
121478b8fecSSam Ravnborg	BACKOFF_SETUP(%o3)
122478b8fecSSam Ravnborg	srlx	%o0, 6, %g1
123478b8fecSSam Ravnborg	mov	1, %o2
124478b8fecSSam Ravnborg	sllx	%g1, 3, %g3
125478b8fecSSam Ravnborg	and	%o0, 63, %g2
126478b8fecSSam Ravnborg	sllx	%o2, %g2, %o2
127478b8fecSSam Ravnborg	add	%o1, %g3, %o1
128478b8fecSSam Ravnborg1:	ldx	[%o1], %g7
129478b8fecSSam Ravnborg	xor	%g7, %o2, %g1
130478b8fecSSam Ravnborg	casx	[%o1], %g7, %g1
131478b8fecSSam Ravnborg	cmp	%g7, %g1
1320f58189dSDavid S. Miller	bne,pn	%xcc, BACKOFF_LABEL(2f, 1b)
133478b8fecSSam Ravnborg	 nop
134478b8fecSSam Ravnborg	retl
135478b8fecSSam Ravnborg	 nop
136478b8fecSSam Ravnborg2:	BACKOFF_SPIN(%o3, %o4, 1b)
1378695c37dSDavid S. MillerENDPROC(change_bit)
138d3867f04SAl ViroEXPORT_SYMBOL(change_bit)
139