Merge git://git.infradead.org/users/willy/linux-nvme
[linux/fpc-iii.git] / arch / unicore32 / lib / findbit.S
blobc77746247d3698856f26e27531c7454382178a6e
1 /*
2  * linux/arch/unicore32/lib/findbit.S
3  *
4  * Code specific to PKUnity SoC and UniCore ISA
5  *
6  * Copyright (C) 2001-2010 GUAN Xue-tao
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  */
12 #include <linux/linkage.h>
13 #include <asm/assembler.h>
14                 .text
17  * Purpose  : Find a 'zero' bit
18  * Prototype: int find_first_zero_bit(void *addr, unsigned int maxbit);
19  */
20 ENTRY(find_first_zero_bit)
21                 cxor.a  r1, #0
22                 beq     3f
23                 mov     r2, #0
24 1:              ldb     r3, [r0+], r2 >> #3
25                 xor.a   r3, r3, #0xff           @ invert bits
26                 bne     .L_found                @ any now set - found zero bit
27                 add     r2, r2, #8              @ next bit pointer
28 2:              csub.a  r2, r1                  @ any more?
29                 bub     1b
30 3:              mov     r0, r1                  @ no free bits
31                 mov     pc, lr
32 ENDPROC(find_first_zero_bit)
35  * Purpose  : Find next 'zero' bit
36  * Prototype: int find_next_zero_bit
37  *              (void *addr, unsigned int maxbit, int offset)
38  */
39 ENTRY(find_next_zero_bit)
40                 cxor.a  r1, #0
41                 beq     3b
42                 and.a   ip, r2, #7
43                 beq     1b                      @ If new byte, goto old routine
44                 ldb     r3, [r0+], r2 >> #3
45                 xor     r3, r3, #0xff           @ now looking for a 1 bit
46                 mov.a   r3, r3 >> ip            @ shift off unused bits
47                 bne     .L_found
48                 or      r2, r2, #7              @ if zero, then no bits here
49                 add     r2, r2, #1              @ align bit pointer
50                 b       2b                      @ loop for next bit
51 ENDPROC(find_next_zero_bit)
54  * Purpose  : Find a 'one' bit
55  * Prototype: int find_first_bit
56  *              (const unsigned long *addr, unsigned int maxbit);
57  */
58 ENTRY(find_first_bit)
59                 cxor.a  r1, #0
60                 beq     3f
61                 mov     r2, #0
62 1:              ldb     r3, [r0+], r2 >> #3
63                 mov.a   r3, r3
64                 bne     .L_found                @ any now set - found zero bit
65                 add     r2, r2, #8              @ next bit pointer
66 2:              csub.a  r2, r1                  @ any more?
67                 bub     1b
68 3:              mov     r0, r1                  @ no free bits
69                 mov     pc, lr
70 ENDPROC(find_first_bit)
73  * Purpose  : Find next 'one' bit
74  * Prototype: int find_next_zero_bit
75  *              (void *addr, unsigned int maxbit, int offset)
76  */
77 ENTRY(find_next_bit)
78                 cxor.a  r1, #0
79                 beq     3b
80                 and.a   ip, r2, #7
81                 beq     1b                      @ If new byte, goto old routine
82                 ldb     r3, [r0+], r2 >> #3
83                 mov.a   r3, r3 >> ip            @ shift off unused bits
84                 bne     .L_found
85                 or      r2, r2, #7              @ if zero, then no bits here
86                 add     r2, r2, #1              @ align bit pointer
87                 b       2b                      @ loop for next bit
88 ENDPROC(find_next_bit)
91  * One or more bits in the LSB of r3 are assumed to be set.
92  */
93 .L_found:
94                 rsub    r1, r3, #0
95                 and     r3, r3, r1
96                 cntlz   r3, r3
97                 rsub    r3, r3, #31
98                 add     r0, r2, r3
99                 mov     pc, lr