Linux-2.6.12-rc2
[linux-3.10.git] / arch / arm26 / lib / findbit.S
1 /*
2  *  linux/arch/arm/lib/findbit.S
3  *
4  *  Copyright (C) 1995-2000 Russell King
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * 16th March 2001 - John Ripley <jripley@sonicblue.com>
11  *   Fixed so that "size" is an exclusive not an inclusive quantity.
12  *   All users of these functions expect exclusive sizes, and may
13  *   also call with zero size.
14  * Reworked by rmk.
15  */
16 #include <linux/linkage.h>
17 #include <asm/assembler.h>
18                 .text
19
20 /*
21  * Purpose  : Find a 'zero' bit
22  * Prototype: int find_first_zero_bit(void *addr, unsigned int maxbit);
23  */
24 ENTRY(_find_first_zero_bit_le)
25                 teq     r1, #0  
26                 beq     3f
27                 mov     r2, #0
28 1:              ldrb    r3, [r0, r2, lsr #3]
29                 eors    r3, r3, #0xff           @ invert bits
30                 bne     .found                  @ any now set - found zero bit
31                 add     r2, r2, #8              @ next bit pointer
32 2:              cmp     r2, r1                  @ any more?
33                 blo     1b
34 3:              mov     r0, r1                  @ no free bits
35                 RETINSTR(mov,pc,lr)
36
37 /*
38  * Purpose  : Find next 'zero' bit
39  * Prototype: int find_next_zero_bit(void *addr, unsigned int maxbit, int offset)
40  */
41 ENTRY(_find_next_zero_bit_le)
42                 teq     r1, #0
43                 beq     2b
44                 ands    ip, r2, #7
45                 beq     1b                      @ If new byte, goto old routine
46                 ldrb    r3, [r0, r2, lsr #3]
47                 eor     r3, r3, #0xff           @ now looking for a 1 bit
48                 movs    r3, r3, lsr ip          @ shift off unused bits
49                 bne     .found
50                 orr     r2, r2, #7              @ if zero, then no bits here
51                 add     r2, r2, #1              @ align bit pointer
52                 b       2b                      @ loop for next bit
53
54 /*
55  * One or more bits in the LSB of r3 are assumed to be set.
56  */
57 .found:         tst     r3, #0x0f
58                 addeq   r2, r2, #4
59                 movne   r3, r3, lsl #4
60                 tst     r3, #0x30
61                 addeq   r2, r2, #2
62                 movne   r3, r3, lsl #2
63                 tst     r3, #0x40
64                 addeq   r2, r2, #1
65                 mov     r0, r2
66                 RETINSTR(mov,pc,lr)
67