2
* linux/arch/unicore32/lib/findbit.S
4
* Code specific to PKUnity SoC and UniCore ISA
6
* Copyright (C) 2001-2010 GUAN Xue-tao
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.
12
#include <linux/linkage.h>
13
#include <asm/assembler.h>
17
* Purpose : Find a 'zero' bit
18
* Prototype: int find_first_zero_bit(void *addr, unsigned int maxbit);
20
__uc32_find_first_zero_bit:
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?
30
3: mov r0, r1 @ no free bits
34
* Purpose : Find next 'zero' bit
35
* Prototype: int find_next_zero_bit
36
* (void *addr, unsigned int maxbit, int offset)
38
ENTRY(__uc32_find_next_zero_bit)
42
beq 1b @ If new byte, goto old routine
43
ldb r3, [r0+], r2 >> #3
44
xor r3, r3, #0xff @ now looking for a 1 bit
45
mov.a r3, r3 >> ip @ shift off unused bits
47
or r2, r2, #7 @ if zero, then no bits here
48
add r2, r2, #1 @ align bit pointer
49
b 2b @ loop for next bit
50
ENDPROC(__uc32_find_next_zero_bit)
53
* Purpose : Find a 'one' bit
54
* Prototype: int find_first_bit
55
* (const unsigned long *addr, unsigned int maxbit);
57
__uc32_find_first_bit:
61
1: ldb r3, [r0+], r2 >> #3
63
bne .L_found @ any now set - found zero bit
64
add r2, r2, #8 @ next bit pointer
65
2: csub.a r2, r1 @ any more?
67
3: mov r0, r1 @ no free bits
71
* Purpose : Find next 'one' bit
72
* Prototype: int find_next_zero_bit
73
* (void *addr, unsigned int maxbit, int offset)
75
ENTRY(__uc32_find_next_bit)
79
beq 1b @ If new byte, goto old routine
80
ldb r3, [r0+], r2 >> #3
81
mov.a r3, r3 >> ip @ shift off unused bits
83
or r2, r2, #7 @ if zero, then no bits here
84
add r2, r2, #1 @ align bit pointer
85
b 2b @ loop for next bit
86
ENDPROC(__uc32_find_next_bit)
89
* One or more bits in the LSB of r3 are assumed to be set.