findbit.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:1k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/arm/lib/findbit.S
  3.  *
  4.  *  Copyright (C) 1995-2000 Russell King
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License version 2 as
  8.  * published by the Free Software Foundation.
  9.  */
  10. #include <linux/linkage.h>
  11. #include <asm/assembler.h>
  12.                 .text
  13. /*
  14.  * Purpose  : Find a 'zero' bit
  15.  * Prototype: int find_first_zero_bit(void *addr, int maxbit);
  16.  */
  17. ENTRY(find_first_zero_bit)
  18. mov r2, #0
  19. .bytelp: ldrb r3, [r0, r2, lsr #3]
  20. eors r3, r3, #0xff @ invert bits
  21. bne .found @ any now set - found zero bit
  22. add r2, r2, #8 @ next bit pointer
  23. cmp r2, r1 @ any more?
  24. bcc .bytelp
  25. add r0, r1, #1 @ no free bits
  26. RETINSTR(mov,pc,lr)
  27. /*
  28.  * Purpose  : Find next 'zero' bit
  29.  * Prototype: int find_next_zero_bit(void *addr, int maxbit, int offset)
  30.  */
  31. ENTRY(find_next_zero_bit)
  32. ands ip, r2, #7
  33. beq .bytelp @ If new byte, goto old routine
  34. ldrb r3, [r0, r2, lsr#3]
  35. eor r3, r3, #0xff @ now looking for a 1 bit
  36. movs r3, r3, lsr ip @ shift off unused bits
  37. orreq r2, r2, #7 @ if zero, then no bits here
  38. addeq r2, r2, #1 @ align bit pointer
  39. beq .bytelp @ loop for next bit
  40. /*
  41.  * One or more bits in the LSB of r3 are assumed to be set.
  42.  */
  43. .found: tst r3, #0x0f
  44. addeq r2, r2, #4
  45. movne r3, r3, lsl #4
  46. tst r3, #0x30
  47. addeq r2, r2, #2
  48. movne r3, r3, lsl #2
  49. tst r3, #0x40
  50. addeq r2, r2, #1
  51. mov r0, r2
  52. RETINSTR(mov,pc,lr)