• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/* bitops.S: Sparc64 atomic bit operations.
2 *
3 * Copyright (C) 2000, 2007 David S. Miller (davem@davemloft.net)
4 */
5
6#include <asm/asi.h>
7#include <asm/backoff.h>
8
9	.text
10
11	.globl	test_and_set_bit
12	.type	test_and_set_bit,#function
13test_and_set_bit:	/* %o0=nr, %o1=addr */
14	BACKOFF_SETUP(%o3)
15	srlx	%o0, 6, %g1
16	mov	1, %o2
17	sllx	%g1, 3, %g3
18	and	%o0, 63, %g2
19	sllx	%o2, %g2, %o2
20	add	%o1, %g3, %o1
211:	ldx	[%o1], %g7
22	or	%g7, %o2, %g1
23	casx	[%o1], %g7, %g1
24	cmp	%g7, %g1
25	bne,pn	%xcc, BACKOFF_LABEL(2f, 1b)
26	 and	%g7, %o2, %g2
27	clr	%o0
28	movrne	%g2, 1, %o0
29	retl
30	 nop
312:	BACKOFF_SPIN(%o3, %o4, 1b)
32	.size	test_and_set_bit, .-test_and_set_bit
33
34	.globl	test_and_clear_bit
35	.type	test_and_clear_bit,#function
36test_and_clear_bit:	/* %o0=nr, %o1=addr */
37	BACKOFF_SETUP(%o3)
38	srlx	%o0, 6, %g1
39	mov	1, %o2
40	sllx	%g1, 3, %g3
41	and	%o0, 63, %g2
42	sllx	%o2, %g2, %o2
43	add	%o1, %g3, %o1
441:	ldx	[%o1], %g7
45	andn	%g7, %o2, %g1
46	casx	[%o1], %g7, %g1
47	cmp	%g7, %g1
48	bne,pn	%xcc, BACKOFF_LABEL(2f, 1b)
49	 and	%g7, %o2, %g2
50	clr	%o0
51	movrne	%g2, 1, %o0
52	retl
53	 nop
542:	BACKOFF_SPIN(%o3, %o4, 1b)
55	.size	test_and_clear_bit, .-test_and_clear_bit
56
57	.globl	test_and_change_bit
58	.type	test_and_change_bit,#function
59test_and_change_bit:	/* %o0=nr, %o1=addr */
60	BACKOFF_SETUP(%o3)
61	srlx	%o0, 6, %g1
62	mov	1, %o2
63	sllx	%g1, 3, %g3
64	and	%o0, 63, %g2
65	sllx	%o2, %g2, %o2
66	add	%o1, %g3, %o1
671:	ldx	[%o1], %g7
68	xor	%g7, %o2, %g1
69	casx	[%o1], %g7, %g1
70	cmp	%g7, %g1
71	bne,pn	%xcc, BACKOFF_LABEL(2f, 1b)
72	 and	%g7, %o2, %g2
73	clr	%o0
74	movrne	%g2, 1, %o0
75	retl
76	 nop
772:	BACKOFF_SPIN(%o3, %o4, 1b)
78	.size	test_and_change_bit, .-test_and_change_bit
79
80	.globl	set_bit
81	.type	set_bit,#function
82set_bit:		/* %o0=nr, %o1=addr */
83	BACKOFF_SETUP(%o3)
84	srlx	%o0, 6, %g1
85	mov	1, %o2
86	sllx	%g1, 3, %g3
87	and	%o0, 63, %g2
88	sllx	%o2, %g2, %o2
89	add	%o1, %g3, %o1
901:	ldx	[%o1], %g7
91	or	%g7, %o2, %g1
92	casx	[%o1], %g7, %g1
93	cmp	%g7, %g1
94	bne,pn	%xcc, BACKOFF_LABEL(2f, 1b)
95	 nop
96	retl
97	 nop
982:	BACKOFF_SPIN(%o3, %o4, 1b)
99	.size	set_bit, .-set_bit
100
101	.globl	clear_bit
102	.type	clear_bit,#function
103clear_bit:		/* %o0=nr, %o1=addr */
104	BACKOFF_SETUP(%o3)
105	srlx	%o0, 6, %g1
106	mov	1, %o2
107	sllx	%g1, 3, %g3
108	and	%o0, 63, %g2
109	sllx	%o2, %g2, %o2
110	add	%o1, %g3, %o1
1111:	ldx	[%o1], %g7
112	andn	%g7, %o2, %g1
113	casx	[%o1], %g7, %g1
114	cmp	%g7, %g1
115	bne,pn	%xcc, BACKOFF_LABEL(2f, 1b)
116	 nop
117	retl
118	 nop
1192:	BACKOFF_SPIN(%o3, %o4, 1b)
120	.size	clear_bit, .-clear_bit
121
122	.globl	change_bit
123	.type	change_bit,#function
124change_bit:		/* %o0=nr, %o1=addr */
125	BACKOFF_SETUP(%o3)
126	srlx	%o0, 6, %g1
127	mov	1, %o2
128	sllx	%g1, 3, %g3
129	and	%o0, 63, %g2
130	sllx	%o2, %g2, %o2
131	add	%o1, %g3, %o1
1321:	ldx	[%o1], %g7
133	xor	%g7, %o2, %g1
134	casx	[%o1], %g7, %g1
135	cmp	%g7, %g1
136	bne,pn	%xcc, BACKOFF_LABEL(2f, 1b)
137	 nop
138	retl
139	 nop
1402:	BACKOFF_SPIN(%o3, %o4, 1b)
141	.size	change_bit, .-change_bit
142