]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - arch/unicore32/lib/findbit.S
Merge branch 'pm-cpufreq'
[mirror_ubuntu-artful-kernel.git] / arch / unicore32 / lib / findbit.S
CommitLineData
96cf5185
G
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
15
16/*
17 * Purpose : Find a 'zero' bit
18 * Prototype: int find_first_zero_bit(void *addr, unsigned int maxbit);
19 */
e13b91c1 20ENTRY(find_first_zero_bit)
96cf5185
G
21 cxor.a r1, #0
22 beq 3f
23 mov r2, #0
241: 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
282: csub.a r2, r1 @ any more?
29 bub 1b
303: mov r0, r1 @ no free bits
31 mov pc, lr
e13b91c1 32ENDPROC(find_first_zero_bit)
96cf5185
G
33
34/*
35 * Purpose : Find next 'zero' bit
36 * Prototype: int find_next_zero_bit
37 * (void *addr, unsigned int maxbit, int offset)
38 */
e13b91c1 39ENTRY(find_next_zero_bit)
96cf5185
G
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
e13b91c1 51ENDPROC(find_next_zero_bit)
96cf5185
G
52
53/*
54 * Purpose : Find a 'one' bit
55 * Prototype: int find_first_bit
56 * (const unsigned long *addr, unsigned int maxbit);
57 */
e13b91c1 58ENTRY(find_first_bit)
96cf5185
G
59 cxor.a r1, #0
60 beq 3f
61 mov r2, #0
621: 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
662: csub.a r2, r1 @ any more?
67 bub 1b
683: mov r0, r1 @ no free bits
69 mov pc, lr
e13b91c1 70ENDPROC(find_first_bit)
96cf5185
G
71
72/*
73 * Purpose : Find next 'one' bit
74 * Prototype: int find_next_zero_bit
75 * (void *addr, unsigned int maxbit, int offset)
76 */
e13b91c1 77ENTRY(find_next_bit)
96cf5185
G
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
e13b91c1 88ENDPROC(find_next_bit)
96cf5185
G
89
90/*
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
100