Blame view

arch/arm/lib/findbit.S 4.85 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  /*
   *  linux/arch/arm/lib/findbit.S
   *
   *  Copyright (C) 1995-2000 Russell King
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   *
   * 16th March 2001 - John Ripley <jripley@sonicblue.com>
   *   Fixed so that "size" is an exclusive not an inclusive quantity.
   *   All users of these functions expect exclusive sizes, and may
   *   also call with zero size.
   * Reworked by rmk.
   */
  #include <linux/linkage.h>
  #include <asm/assembler.h>
                  .text
  
  /*
   * Purpose  : Find a 'zero' bit
   * Prototype: int find_first_zero_bit(void *addr, unsigned int maxbit);
   */
  ENTRY(_find_first_zero_bit_le)
  		teq	r1, #0	
  		beq	3f
  		mov	r2, #0
8b592783a   Catalin Marinas   Thumb-2: Implemen...
28
29
30
31
  1:
   ARM(		ldrb	r3, [r0, r2, lsr #3]	)
   THUMB(		lsr	r3, r2, #3		)
   THUMB(		ldrb	r3, [r0, r3]		)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
32
  		eors	r3, r3, #0xff		@ invert bits
8adbb3718   Nicolas Pitre   [ARM] 3152/1: mak...
33
  		bne	.L_found		@ any now set - found zero bit
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
35
36
37
  		add	r2, r2, #8		@ next bit pointer
  2:		cmp	r2, r1			@ any more?
  		blo	1b
  3:		mov	r0, r1			@ no free bits
7999d8d7a   Russell King   [ARM] Remove RETI...
38
  		mov	pc, lr
93ed39701   Catalin Marinas   [ARM] 5227/1: Add...
39
  ENDPROC(_find_first_zero_bit_le)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40
41
42
43
44
45
46
47
48
49
  
  /*
   * Purpose  : Find next 'zero' bit
   * Prototype: int find_next_zero_bit(void *addr, unsigned int maxbit, int offset)
   */
  ENTRY(_find_next_zero_bit_le)
  		teq	r1, #0
  		beq	3b
  		ands	ip, r2, #7
  		beq	1b			@ If new byte, goto old routine
8b592783a   Catalin Marinas   Thumb-2: Implemen...
50
51
52
   ARM(		ldrb	r3, [r0, r2, lsr #3]	)
   THUMB(		lsr	r3, r2, #3		)
   THUMB(		ldrb	r3, [r0, r3]		)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
53
54
  		eor	r3, r3, #0xff		@ now looking for a 1 bit
  		movs	r3, r3, lsr ip		@ shift off unused bits
8adbb3718   Nicolas Pitre   [ARM] 3152/1: mak...
55
  		bne	.L_found
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
56
57
58
  		orr	r2, r2, #7		@ if zero, then no bits here
  		add	r2, r2, #1		@ align bit pointer
  		b	2b			@ loop for next bit
93ed39701   Catalin Marinas   [ARM] 5227/1: Add...
59
  ENDPROC(_find_next_zero_bit_le)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60
61
62
63
64
65
66
67
68
  
  /*
   * Purpose  : Find a 'one' bit
   * Prototype: int find_first_bit(const unsigned long *addr, unsigned int maxbit);
   */
  ENTRY(_find_first_bit_le)
  		teq	r1, #0	
  		beq	3f
  		mov	r2, #0
8b592783a   Catalin Marinas   Thumb-2: Implemen...
69
70
71
72
  1:
   ARM(		ldrb	r3, [r0, r2, lsr #3]	)
   THUMB(		lsr	r3, r2, #3		)
   THUMB(		ldrb	r3, [r0, r3]		)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
73
  		movs	r3, r3
8adbb3718   Nicolas Pitre   [ARM] 3152/1: mak...
74
  		bne	.L_found		@ any now set - found zero bit
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
75
76
77
78
  		add	r2, r2, #8		@ next bit pointer
  2:		cmp	r2, r1			@ any more?
  		blo	1b
  3:		mov	r0, r1			@ no free bits
7999d8d7a   Russell King   [ARM] Remove RETI...
79
  		mov	pc, lr
93ed39701   Catalin Marinas   [ARM] 5227/1: Add...
80
  ENDPROC(_find_first_bit_le)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
82
83
84
85
86
87
88
89
90
  
  /*
   * Purpose  : Find next 'one' bit
   * Prototype: int find_next_zero_bit(void *addr, unsigned int maxbit, int offset)
   */
  ENTRY(_find_next_bit_le)
  		teq	r1, #0
  		beq	3b
  		ands	ip, r2, #7
  		beq	1b			@ If new byte, goto old routine
8b592783a   Catalin Marinas   Thumb-2: Implemen...
91
92
93
   ARM(		ldrb	r3, [r0, r2, lsr #3]	)
   THUMB(		lsr	r3, r2, #3		)
   THUMB(		ldrb	r3, [r0, r3]		)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
94
  		movs	r3, r3, lsr ip		@ shift off unused bits
8adbb3718   Nicolas Pitre   [ARM] 3152/1: mak...
95
  		bne	.L_found
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
96
97
98
  		orr	r2, r2, #7		@ if zero, then no bits here
  		add	r2, r2, #1		@ align bit pointer
  		b	2b			@ loop for next bit
93ed39701   Catalin Marinas   [ARM] 5227/1: Add...
99
  ENDPROC(_find_next_bit_le)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
100
101
102
103
104
105
106
107
  
  #ifdef __ARMEB__
  
  ENTRY(_find_first_zero_bit_be)
  		teq	r1, #0
  		beq	3f
  		mov	r2, #0
  1:		eor	r3, r2, #0x18		@ big endian byte ordering
8b592783a   Catalin Marinas   Thumb-2: Implemen...
108
109
110
   ARM(		ldrb	r3, [r0, r3, lsr #3]	)
   THUMB(		lsr	r3, #3			)
   THUMB(		ldrb	r3, [r0, r3]		)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
111
  		eors	r3, r3, #0xff		@ invert bits
8adbb3718   Nicolas Pitre   [ARM] 3152/1: mak...
112
  		bne	.L_found		@ any now set - found zero bit
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
113
114
115
116
  		add	r2, r2, #8		@ next bit pointer
  2:		cmp	r2, r1			@ any more?
  		blo	1b
  3:		mov	r0, r1			@ no free bits
7999d8d7a   Russell King   [ARM] Remove RETI...
117
  		mov	pc, lr
93ed39701   Catalin Marinas   [ARM] 5227/1: Add...
118
  ENDPROC(_find_first_zero_bit_be)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
119
120
121
122
123
124
125
  
  ENTRY(_find_next_zero_bit_be)
  		teq	r1, #0
  		beq	3b
  		ands	ip, r2, #7
  		beq	1b			@ If new byte, goto old routine
  		eor	r3, r2, #0x18		@ big endian byte ordering
8b592783a   Catalin Marinas   Thumb-2: Implemen...
126
127
128
   ARM(		ldrb	r3, [r0, r3, lsr #3]	)
   THUMB(		lsr	r3, #3			)
   THUMB(		ldrb	r3, [r0, r3]		)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
129
130
  		eor	r3, r3, #0xff		@ now looking for a 1 bit
  		movs	r3, r3, lsr ip		@ shift off unused bits
8adbb3718   Nicolas Pitre   [ARM] 3152/1: mak...
131
  		bne	.L_found
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
132
133
134
  		orr	r2, r2, #7		@ if zero, then no bits here
  		add	r2, r2, #1		@ align bit pointer
  		b	2b			@ loop for next bit
93ed39701   Catalin Marinas   [ARM] 5227/1: Add...
135
  ENDPROC(_find_next_zero_bit_be)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
136
137
138
139
140
141
  
  ENTRY(_find_first_bit_be)
  		teq	r1, #0
  		beq	3f
  		mov	r2, #0
  1:		eor	r3, r2, #0x18		@ big endian byte ordering
8b592783a   Catalin Marinas   Thumb-2: Implemen...
142
143
144
   ARM(		ldrb	r3, [r0, r3, lsr #3]	)
   THUMB(		lsr	r3, #3			)
   THUMB(		ldrb	r3, [r0, r3]		)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
145
  		movs	r3, r3
8adbb3718   Nicolas Pitre   [ARM] 3152/1: mak...
146
  		bne	.L_found		@ any now set - found zero bit
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
147
148
149
150
  		add	r2, r2, #8		@ next bit pointer
  2:		cmp	r2, r1			@ any more?
  		blo	1b
  3:		mov	r0, r1			@ no free bits
7999d8d7a   Russell King   [ARM] Remove RETI...
151
  		mov	pc, lr
93ed39701   Catalin Marinas   [ARM] 5227/1: Add...
152
  ENDPROC(_find_first_bit_be)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
153
154
155
156
157
158
159
  
  ENTRY(_find_next_bit_be)
  		teq	r1, #0
  		beq	3b
  		ands	ip, r2, #7
  		beq	1b			@ If new byte, goto old routine
  		eor	r3, r2, #0x18		@ big endian byte ordering
8b592783a   Catalin Marinas   Thumb-2: Implemen...
160
161
162
   ARM(		ldrb	r3, [r0, r3, lsr #3]	)
   THUMB(		lsr	r3, #3			)
   THUMB(		ldrb	r3, [r0, r3]		)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
163
  		movs	r3, r3, lsr ip		@ shift off unused bits
8adbb3718   Nicolas Pitre   [ARM] 3152/1: mak...
164
  		bne	.L_found
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
165
166
167
  		orr	r2, r2, #7		@ if zero, then no bits here
  		add	r2, r2, #1		@ align bit pointer
  		b	2b			@ loop for next bit
93ed39701   Catalin Marinas   [ARM] 5227/1: Add...
168
  ENDPROC(_find_next_bit_be)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
169
170
171
172
173
174
  
  #endif
  
  /*
   * One or more bits in the LSB of r3 are assumed to be set.
   */
8adbb3718   Nicolas Pitre   [ARM] 3152/1: mak...
175
  .L_found:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
176
  #if __LINUX_ARM_ARCH__ >= 5
0e91ec0c0   James Jones   ARM: 6482/2: Fix ...
177
178
  		rsb	r0, r3, #0
  		and	r3, r3, r0
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
179
180
181
182
183
184
185
186
187
188
189
190
191
192
  		clz	r3, r3
  		rsb	r3, r3, #31
  		add	r0, r2, r3
  #else
  		tst	r3, #0x0f
  		addeq	r2, r2, #4
  		movne	r3, r3, lsl #4
  		tst	r3, #0x30
  		addeq	r2, r2, #2
  		movne	r3, r3, lsl #2
  		tst	r3, #0x40
  		addeq	r2, r2, #1
  		mov	r0, r2
  #endif
0e91ec0c0   James Jones   ARM: 6482/2: Fix ...
193
194
  		cmp	r1, r0			@ Clamp to maxbit
  		movlo	r0, r1
7999d8d7a   Russell King   [ARM] Remove RETI...
195
  		mov	pc, lr
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
196