patch-2.4.0-test2 linux/arch/arm/lib/findbit.S
Next file: linux/arch/arm/lib/getconsdata.c
Previous file: linux/arch/arm/lib/clearbit.S
Back to the patch index
Back to the overall index
- Lines: 105
- Date:
Mon Jun 19 17:59:34 2000
- Orig file:
v2.4.0-test1/linux/arch/arm/lib/findbit.S
- Orig date:
Thu Mar 2 14:36:22 2000
diff -u --recursive --new-file v2.4.0-test1/linux/arch/arm/lib/findbit.S linux/arch/arm/lib/findbit.S
@@ -1,65 +1,53 @@
/*
- * linux/arch/arm/lib/bitops.S
+ * linux/arch/arm/lib/findbit.S
*
- * Copyright (C) 1995-1996 Russell King
+ * Copyright (C) 1995-2000 Russell King
*/
#include <linux/linkage.h>
#include <asm/assembler.h>
.text
-@ Purpose : Find a 'zero' bit
-@ Prototype: int find_first_zero_bit(char *addr,int maxbit);
-
+/*
+ * Purpose : Find a 'zero' bit
+ * Prototype: int find_first_zero_bit(void *addr, int maxbit);
+ */
ENTRY(find_first_zero_bit)
- mov r2, #0 @ Initialise bit position
-Lfindzbit1lp: ldrb r3, [r0, r2, lsr #3] @ Check byte, if 0xFF, then all bits set
- teq r3, #0xFF
- bne Lfoundzbit
- add r2, r2, #8
- cmp r2, r1 @ Check to see if we have come to the end
- bcc Lfindzbit1lp
- add r0, r1, #1 @ Make sure that we flag an error
- RETINSTR(mov,pc,lr)
-Lfoundzbit: tst r3, #1 @ Check individual bits
- moveq r0, r2
- RETINSTR(moveq,pc,lr)
- tst r3, #2
- addeq r0, r2, #1
- RETINSTR(moveq,pc,lr)
- tst r3, #4
- addeq r0, r2, #2
- RETINSTR(moveq,pc,lr)
- tst r3, #8
- addeq r0, r2, #3
- RETINSTR(moveq,pc,lr)
- tst r3, #16
- addeq r0, r2, #4
- RETINSTR(moveq,pc,lr)
- tst r3, #32
- addeq r0, r2, #5
- RETINSTR(moveq,pc,lr)
- tst r3, #64
- addeq r0, r2, #6
- RETINSTR(moveq,pc,lr)
- add r0, r2, #7
+ mov r2, #0
+.bytelp: ldrb r3, [r0, r2, lsr #3]
+ eors r3, r3, #0xff @ invert bits
+ bne .found @ any now set - found zero bit
+ add r2, r2, #8 @ next bit pointer
+ cmp r2, r1 @ any more?
+ bcc .bytelp
+ add r0, r1, #1 @ no free bits
RETINSTR(mov,pc,lr)
-@ Purpose : Find next 'zero' bit
-@ Prototype: int find_next_zero_bit(char *addr,int maxbit,int offset)
-
+/*
+ * Purpose : Find next 'zero' bit
+ * Prototype: int find_next_zero_bit(void *addr, int maxbit, int offset)
+ */
ENTRY(find_next_zero_bit)
- tst r2, #7
- beq Lfindzbit1lp @ If new byte, goto old routine
+ ands ip, r2, #7
+ beq .bytelp @ If new byte, goto old routine
ldrb r3, [r0, r2, lsr#3]
- orr r3, r3, #0xFF00 @ Set top bits so we wont get confused
- str r4, [sp, #-4]!
- and r4, r2, #7
- mov r3, r3, lsr r4 @ Shift right by no. of bits
- ldr r4, [sp], #4
- and r3, r3, #0xFF
- teq r3, #0xFF
- orreq r2, r2, #7
+ eor r3, r3, #0xff @ now looking for a 1 bit
+ movs r3, r3, lsr ip @ shift off unused bits
+ orreq r2, r2, #7 @ if zero, then no bits here
+ addeq r2, r2, #1 @ align bit pointer
+ beq .bytelp @ loop for next bit
+
+/*
+ * One or more bits in the LSB of r3 are assumed to be set.
+ */
+.found: tst r3, #0x0f
+ addeq r2, r2, #4
+ movne r3, r3, lsl #4
+ tst r3, #0x30
+ addeq r2, r2, #2
+ movne r3, r3, lsl #2
+ tst r3, #0x40
addeq r2, r2, #1
- beq Lfindzbit1lp @ If all bits are set, goto old routine
- b Lfoundzbit
+ mov r0, r2
+ RETINSTR(mov,pc,lr)
+
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)