blob: c77746247d3698856f26e27531c7454382178a6e [file] [log] [blame]
GuanXuetao96cf5182011-01-15 18:23:09 +08001/*
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 */
Guan Xuetaoe13b91c2011-06-13 11:44:49 +080020ENTRY(find_first_zero_bit)
GuanXuetao96cf5182011-01-15 18:23:09 +080021 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
Guan Xuetaoe13b91c2011-06-13 11:44:49 +080032ENDPROC(find_first_zero_bit)
GuanXuetao96cf5182011-01-15 18:23:09 +080033
34/*
35 * Purpose : Find next 'zero' bit
36 * Prototype: int find_next_zero_bit
37 * (void *addr, unsigned int maxbit, int offset)
38 */
Guan Xuetaoe13b91c2011-06-13 11:44:49 +080039ENTRY(find_next_zero_bit)
GuanXuetao96cf5182011-01-15 18:23:09 +080040 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
Guan Xuetaoe13b91c2011-06-13 11:44:49 +080051ENDPROC(find_next_zero_bit)
GuanXuetao96cf5182011-01-15 18:23:09 +080052
53/*
54 * Purpose : Find a 'one' bit
55 * Prototype: int find_first_bit
56 * (const unsigned long *addr, unsigned int maxbit);
57 */
Guan Xuetaoe13b91c2011-06-13 11:44:49 +080058ENTRY(find_first_bit)
GuanXuetao96cf5182011-01-15 18:23:09 +080059 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
Guan Xuetaoe13b91c2011-06-13 11:44:49 +080070ENDPROC(find_first_bit)
GuanXuetao96cf5182011-01-15 18:23:09 +080071
72/*
73 * Purpose : Find next 'one' bit
74 * Prototype: int find_next_zero_bit
75 * (void *addr, unsigned int maxbit, int offset)
76 */
Guan Xuetaoe13b91c2011-06-13 11:44:49 +080077ENTRY(find_next_bit)
GuanXuetao96cf5182011-01-15 18:23:09 +080078 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
Guan Xuetaoe13b91c2011-06-13 11:44:49 +080088ENDPROC(find_next_bit)
GuanXuetao96cf5182011-01-15 18:23:09 +080089
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