Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.9.
  1/*
  2 * Copyright (C) 2006 Atmel Corporation
  3 *
  4 * This program is free software; you can redistribute it and/or modify
  5 * it under the terms of the GNU General Public License version 2 as
  6 * published by the Free Software Foundation.
  7 */
  8#include <linux/linkage.h>
  9
 10	.text
 11	/*
 12	 * unsigned long find_first_zero_bit(const unsigned long *addr,
 13	 *				     unsigned long size)
 14	 */
 15ENTRY(find_first_zero_bit)
 16	cp.w	r11, 0
 17	reteq	r11
 18	mov	r9, r11
 191:	ld.w	r8, r12[0]
 20	com	r8
 21	brne	.L_found
 22	sub	r12, -4
 23	sub	r9, 32
 24	brgt	1b
 25	retal	r11
 26
 27	/*
 28	 * unsigned long find_next_zero_bit(const unsigned long *addr,
 29	 *				    unsigned long size,
 30	 *				    unsigned long offset)
 31	 */
 32ENTRY(find_next_zero_bit)
 33	lsr	r8, r10, 5
 34	sub	r9, r11, r10
 35	retle	r11
 36
 37	lsl	r8, 2
 38	add	r12, r8
 39	andl	r10, 31, COH
 40	breq	1f
 41
 42	/* offset is not word-aligned. Handle the first (32 - r10) bits */
 43	ld.w	r8, r12[0]
 44	com	r8
 45	sub	r12, -4
 46	lsr	r8, r8, r10
 47	brne	.L_found
 48
 49	/* r9 = r9 - (32 - r10) = r9 + r10 - 32 */
 50	add	r9, r10
 51	sub	r9, 32
 52	retle	r11
 53
 54	/* Main loop. offset must be word-aligned */
 551:	ld.w	r8, r12[0]
 56	com	r8
 57	brne	.L_found
 58	sub	r12, -4
 59	sub	r9, 32
 60	brgt	1b
 61	retal	r11
 62
 63	/* Common return path for when a bit is actually found. */
 64.L_found:
 65	brev	r8
 66	clz	r10, r8
 67	rsub	r9, r11
 68	add	r10, r9
 69
 70	/* XXX: If we don't have to return exactly "size" when the bit
 71	   is not found, we may drop this "min" thing */
 72	min	r12, r11, r10
 73	retal	r12
 74
 75	/*
 76	 * unsigned long find_first_bit(const unsigned long *addr,
 77	 *				unsigned long size)
 78	 */
 79ENTRY(find_first_bit)
 80	cp.w	r11, 0
 81	reteq	r11
 82	mov	r9, r11
 831:	ld.w	r8, r12[0]
 84	cp.w	r8, 0
 85	brne	.L_found
 86	sub	r12, -4
 87	sub	r9, 32
 88	brgt	1b
 89	retal	r11
 90
 91	/*
 92	 * unsigned long find_next_bit(const unsigned long *addr,
 93	 *			       unsigned long size,
 94	 *			       unsigned long offset)
 95	 */
 96ENTRY(find_next_bit)
 97	lsr	r8, r10, 5
 98	sub	r9, r11, r10
 99	retle	r11
100
101	lsl	r8, 2
102	add	r12, r8
103	andl	r10, 31, COH
104	breq	1f
105
106	/* offset is not word-aligned. Handle the first (32 - r10) bits */
107	ld.w	r8, r12[0]
108	sub	r12, -4
109	lsr	r8, r8, r10
110	brne	.L_found
111
112	/* r9 = r9 - (32 - r10) = r9 + r10 - 32 */
113	add	r9, r10
114	sub	r9, 32
115	retle	r11
116
117	/* Main loop. offset must be word-aligned */
1181:	ld.w	r8, r12[0]
119	cp.w	r8, 0
120	brne	.L_found
121	sub	r12, -4
122	sub	r9, 32
123	brgt	1b
124	retal	r11
125
126ENTRY(find_next_bit_le)
127	lsr	r8, r10, 5
128	sub	r9, r11, r10
129	retle	r11
130
131	lsl	r8, 2
132	add	r12, r8
133	andl	r10, 31, COH
134	breq	1f
135
136	/* offset is not word-aligned. Handle the first (32 - r10) bits */
137	ldswp.w	r8, r12[0]
138	sub	r12, -4
139	lsr	r8, r8, r10
140	brne	.L_found
141
142	/* r9 = r9 - (32 - r10) = r9 + r10 - 32 */
143	add	r9, r10
144	sub	r9, 32
145	retle	r11
146
147	/* Main loop. offset must be word-aligned */
1481:	ldswp.w	r8, r12[0]
149	cp.w	r8, 0
150	brne	.L_found
151	sub	r12, -4
152	sub	r9, 32
153	brgt	1b
154	retal	r11
155
156ENTRY(find_next_zero_bit_le)
157	lsr	r8, r10, 5
158	sub	r9, r11, r10
159	retle	r11
160
161	lsl	r8, 2
162	add	r12, r8
163	andl	r10, 31, COH
164	breq	1f
165
166	/* offset is not word-aligned. Handle the first (32 - r10) bits */
167	ldswp.w	r8, r12[0]
168	sub	r12, -4
169	com	r8
170	lsr	r8, r8, r10
171	brne	.L_found
172
173	/* r9 = r9 - (32 - r10) = r9 + r10 - 32 */
174	add	r9, r10
175	sub	r9, 32
176	retle	r11
177
178	/* Main loop. offset must be word-aligned */
1791:	ldswp.w	r8, r12[0]
180	com	r8
181	brne	.L_found
182	sub	r12, -4
183	sub	r9, 32
184	brgt	1b
185	retal	r11