Linux Audio

Check our new training course

Open-source upstreaming

Need help get the support for your hardware in upstream Linux?
Loading...
v4.6
 1/* atomic-ops.S: kernel atomic operations
 2 *
 3 * For an explanation of how atomic ops work in this arch, see:
 4 *   Documentation/frv/atomic-ops.txt
 5 *
 6 * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
 7 * Written by David Howells (dhowells@redhat.com)
 8 *
 9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version
12 * 2 of the License, or (at your option) any later version.
13 */
14
15#include <asm/spr-regs.h>
16
17	.text
18	.balign 4
19
20###############################################################################
21#
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22# uint32_t __xchg_32(uint32_t i, uint32_t *v)
23#
24###############################################################################
25	.globl		__xchg_32
26        .type		__xchg_32,@function
27__xchg_32:
28	or.p		gr8,gr8,gr10
290:
30	orcc		gr0,gr0,gr0,icc3		/* set ICC3.Z */
31	ckeq		icc3,cc7
32	ld.p		@(gr9,gr0),gr8			/* LD.P/ORCR must be atomic */
33	orcr		cc7,cc7,cc3			/* set CC3 to true */
34	cst.p		gr10,@(gr9,gr0)		,cc3,#1
35	corcc		gr29,gr29,gr0		,cc3,#1	/* clear ICC3.Z if store happens */
36	beq		icc3,#0,0b
37	bralr
38
39	.size		__xchg_32, .-__xchg_32
40
41###############################################################################
42#
43# uint32_t __cmpxchg_32(uint32_t *v, uint32_t test, uint32_t new)
44#
45###############################################################################
46	.globl		__cmpxchg_32
47        .type		__cmpxchg_32,@function
48__cmpxchg_32:
49	or.p		gr8,gr8,gr11
500:
51	orcc		gr0,gr0,gr0,icc3
52	ckeq		icc3,cc7
53	ld.p		@(gr11,gr0),gr8
54	orcr		cc7,cc7,cc3
55	subcc		gr8,gr9,gr7,icc0
56	bnelr		icc0,#0
57	cst.p		gr10,@(gr11,gr0)	,cc3,#1
58	corcc		gr29,gr29,gr0		,cc3,#1
59	beq		icc3,#0,0b
60	bralr
61
62	.size		__cmpxchg_32, .-__cmpxchg_32
v3.1
  1/* atomic-ops.S: kernel atomic operations
  2 *
  3 * For an explanation of how atomic ops work in this arch, see:
  4 *   Documentation/frv/atomic-ops.txt
  5 *
  6 * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
  7 * Written by David Howells (dhowells@redhat.com)
  8 *
  9 * This program is free software; you can redistribute it and/or
 10 * modify it under the terms of the GNU General Public License
 11 * as published by the Free Software Foundation; either version
 12 * 2 of the License, or (at your option) any later version.
 13 */
 14
 15#include <asm/spr-regs.h>
 16
 17	.text
 18	.balign 4
 19
 20###############################################################################
 21#
 22# unsigned long atomic_test_and_ANDNOT_mask(unsigned long mask, volatile unsigned long *v);
 23#
 24###############################################################################
 25	.globl		atomic_test_and_ANDNOT_mask
 26        .type		atomic_test_and_ANDNOT_mask,@function
 27atomic_test_and_ANDNOT_mask:
 28	not.p		gr8,gr10
 290:
 30	orcc		gr0,gr0,gr0,icc3		/* set ICC3.Z */
 31	ckeq		icc3,cc7
 32	ld.p		@(gr9,gr0),gr8			/* LD.P/ORCR must be atomic */
 33	orcr		cc7,cc7,cc3			/* set CC3 to true */
 34	and		gr8,gr10,gr11
 35	cst.p		gr11,@(gr9,gr0)		,cc3,#1
 36	corcc		gr29,gr29,gr0		,cc3,#1	/* clear ICC3.Z if store happens */
 37	beq		icc3,#0,0b
 38	bralr
 39
 40	.size		atomic_test_and_ANDNOT_mask, .-atomic_test_and_ANDNOT_mask
 41
 42###############################################################################
 43#
 44# unsigned long atomic_test_and_OR_mask(unsigned long mask, volatile unsigned long *v);
 45#
 46###############################################################################
 47	.globl		atomic_test_and_OR_mask
 48        .type		atomic_test_and_OR_mask,@function
 49atomic_test_and_OR_mask:
 50	or.p		gr8,gr8,gr10
 510:
 52	orcc		gr0,gr0,gr0,icc3		/* set ICC3.Z */
 53	ckeq		icc3,cc7
 54	ld.p		@(gr9,gr0),gr8			/* LD.P/ORCR must be atomic */
 55	orcr		cc7,cc7,cc3			/* set CC3 to true */
 56	or		gr8,gr10,gr11
 57	cst.p		gr11,@(gr9,gr0)		,cc3,#1
 58	corcc		gr29,gr29,gr0		,cc3,#1	/* clear ICC3.Z if store happens */
 59	beq		icc3,#0,0b
 60	bralr
 61
 62	.size		atomic_test_and_OR_mask, .-atomic_test_and_OR_mask
 63
 64###############################################################################
 65#
 66# unsigned long atomic_test_and_XOR_mask(unsigned long mask, volatile unsigned long *v);
 67#
 68###############################################################################
 69	.globl		atomic_test_and_XOR_mask
 70        .type		atomic_test_and_XOR_mask,@function
 71atomic_test_and_XOR_mask:
 72	or.p		gr8,gr8,gr10
 730:
 74	orcc		gr0,gr0,gr0,icc3		/* set ICC3.Z */
 75	ckeq		icc3,cc7
 76	ld.p		@(gr9,gr0),gr8			/* LD.P/ORCR must be atomic */
 77	orcr		cc7,cc7,cc3			/* set CC3 to true */
 78	xor		gr8,gr10,gr11
 79	cst.p		gr11,@(gr9,gr0)		,cc3,#1
 80	corcc		gr29,gr29,gr0		,cc3,#1	/* clear ICC3.Z if store happens */
 81	beq		icc3,#0,0b
 82	bralr
 83
 84	.size		atomic_test_and_XOR_mask, .-atomic_test_and_XOR_mask
 85
 86###############################################################################
 87#
 88# int atomic_add_return(int i, atomic_t *v)
 89#
 90###############################################################################
 91	.globl		atomic_add_return
 92        .type		atomic_add_return,@function
 93atomic_add_return:
 94	or.p		gr8,gr8,gr10
 950:
 96	orcc		gr0,gr0,gr0,icc3		/* set ICC3.Z */
 97	ckeq		icc3,cc7
 98	ld.p		@(gr9,gr0),gr8			/* LD.P/ORCR must be atomic */
 99	orcr		cc7,cc7,cc3			/* set CC3 to true */
100	add		gr8,gr10,gr8
101	cst.p		gr8,@(gr9,gr0)		,cc3,#1
102	corcc		gr29,gr29,gr0		,cc3,#1	/* clear ICC3.Z if store happens */
103	beq		icc3,#0,0b
104	bralr
105
106	.size		atomic_add_return, .-atomic_add_return
107
108###############################################################################
109#
110# int atomic_sub_return(int i, atomic_t *v)
111#
112###############################################################################
113	.globl		atomic_sub_return
114        .type		atomic_sub_return,@function
115atomic_sub_return:
116	or.p		gr8,gr8,gr10
1170:
118	orcc		gr0,gr0,gr0,icc3		/* set ICC3.Z */
119	ckeq		icc3,cc7
120	ld.p		@(gr9,gr0),gr8			/* LD.P/ORCR must be atomic */
121	orcr		cc7,cc7,cc3			/* set CC3 to true */
122	sub		gr8,gr10,gr8
123	cst.p		gr8,@(gr9,gr0)		,cc3,#1
124	corcc		gr29,gr29,gr0		,cc3,#1	/* clear ICC3.Z if store happens */
125	beq		icc3,#0,0b
126	bralr
127
128	.size		atomic_sub_return, .-atomic_sub_return
129
130###############################################################################
131#
132# uint32_t __xchg_32(uint32_t i, uint32_t *v)
133#
134###############################################################################
135	.globl		__xchg_32
136        .type		__xchg_32,@function
137__xchg_32:
138	or.p		gr8,gr8,gr10
1390:
140	orcc		gr0,gr0,gr0,icc3		/* set ICC3.Z */
141	ckeq		icc3,cc7
142	ld.p		@(gr9,gr0),gr8			/* LD.P/ORCR must be atomic */
143	orcr		cc7,cc7,cc3			/* set CC3 to true */
144	cst.p		gr10,@(gr9,gr0)		,cc3,#1
145	corcc		gr29,gr29,gr0		,cc3,#1	/* clear ICC3.Z if store happens */
146	beq		icc3,#0,0b
147	bralr
148
149	.size		__xchg_32, .-__xchg_32
150
151###############################################################################
152#
153# uint32_t __cmpxchg_32(uint32_t *v, uint32_t test, uint32_t new)
154#
155###############################################################################
156	.globl		__cmpxchg_32
157        .type		__cmpxchg_32,@function
158__cmpxchg_32:
159	or.p		gr8,gr8,gr11
1600:
161	orcc		gr0,gr0,gr0,icc3
162	ckeq		icc3,cc7
163	ld.p		@(gr11,gr0),gr8
164	orcr		cc7,cc7,cc3
165	subcc		gr8,gr9,gr7,icc0
166	bnelr		icc0,#0
167	cst.p		gr10,@(gr11,gr0)	,cc3,#1
168	corcc		gr29,gr29,gr0		,cc3,#1
169	beq		icc3,#0,0b
170	bralr
171
172	.size		__cmpxchg_32, .-__cmpxchg_32