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
ENTRY(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
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)
39
ENTRY(find_next_zero_bit)
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
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);
62
1: ldb r3, [r0+], r2 >> #3
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?
68
3: mov r0, r1 @ no free bits
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)
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
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.