.text
ENTRY(_find_first_zero_bit_le)
teq r1,
beq 3f
mov r2,
1:
ARM( ldrb r3, [r0, r2, lsr
THUMB( lsr r3, r2,
THUMB( ldrb r3, [r0, r3] )
eors r3, r3,
bne .L_found @ any now set - found zero bit
add r2, r2,
2: cmp r2, r1 @ any more?
blo 1b
3: mov r0, r1 @ no free bits
mov pc, lr
ENDPROC(_find_first_zero_bit_le)
ENTRY(_find_next_zero_bit_le)
teq r1,
beq 3b
ands ip, r2,
beq 1b @ If new byte, goto old routine
ARM( ldrb r3, [r0, r2, lsr
THUMB( lsr r3, r2,
THUMB( ldrb r3, [r0, r3] )
eor r3, r3,
movs r3, r3, lsr ip @ shift off unused bits
bne .L_found
orr r2, r2,
add r2, r2,
b 2b @ loop for next bit
ENDPROC(_find_next_zero_bit_le)
ENTRY(_find_first_bit_le)
teq r1,
beq 3f
mov r2,
1:
ARM( ldrb r3, [r0, r2, lsr
THUMB( lsr r3, r2,
THUMB( ldrb r3, [r0, r3] )
movs r3, r3
bne .L_found @ any now set - found zero bit
add r2, r2,
2: cmp r2, r1 @ any more?
blo 1b
3: mov r0, r1 @ no free bits
mov pc, lr
ENDPROC(_find_first_bit_le)
ENTRY(_find_next_bit_le)
teq r1,
beq 3b
ands ip, r2,
beq 1b @ If new byte, goto old routine
ARM( ldrb r3, [r0, r2, lsr
THUMB( lsr r3, r2,
THUMB( ldrb r3, [r0, r3] )
movs r3, r3, lsr ip @ shift off unused bits
bne .L_found
orr r2, r2,
add r2, r2,
b 2b @ loop for next bit
ENDPROC(_find_next_bit_le)
ENTRY(_find_first_zero_bit_be)
teq r1,
beq 3f
mov r2,
1: eor r3, r2,
ARM( ldrb r3, [r0, r3, lsr
THUMB( lsr r3,
THUMB( ldrb r3, [r0, r3] )
eors r3, r3,
bne .L_found @ any now set - found zero bit
add r2, r2,
2: cmp r2, r1 @ any more?
blo 1b
3: mov r0, r1 @ no free bits
mov pc, lr
ENDPROC(_find_first_zero_bit_be)
ENTRY(_find_next_zero_bit_be)
teq r1,
beq 3b
ands ip, r2,
beq 1b @ If new byte, goto old routine
eor r3, r2,
ARM( ldrb r3, [r0, r3, lsr
THUMB( lsr r3,
THUMB( ldrb r3, [r0, r3] )
eor r3, r3,
movs r3, r3, lsr ip @ shift off unused bits
bne .L_found
orr r2, r2,
add r2, r2,
b 2b @ loop for next bit
ENDPROC(_find_next_zero_bit_be)
ENTRY(_find_first_bit_be)
teq r1,
beq 3f
mov r2,
1: eor r3, r2,
ARM( ldrb r3, [r0, r3, lsr
THUMB( lsr r3,
THUMB( ldrb r3, [r0, r3] )
movs r3, r3
bne .L_found @ any now set - found zero bit
add r2, r2,
2: cmp r2, r1 @ any more?
blo 1b
3: mov r0, r1 @ no free bits
mov pc, lr
ENDPROC(_find_first_bit_be)
ENTRY(_find_next_bit_be)
teq r1,
beq 3b
ands ip, r2,
beq 1b @ If new byte, goto old routine
eor r3, r2,
ARM( ldrb r3, [r0, r3, lsr
THUMB( lsr r3,
THUMB( ldrb r3, [r0, r3] )
movs r3, r3, lsr ip @ shift off unused bits
bne .L_found
orr r2, r2,
add r2, r2,
b 2b @ loop for next bit
ENDPROC(_find_next_bit_be)
.L_found:
rsb r0, r3,
and r3, r3, r0
clz r3, r3
rsb r3, r3,
add r0, r2, r3
tst r3,
addeq r2, r2,
movne r3, r3, lsl
tst r3,
addeq r2, r2,
movne r3, r3, lsl
tst r3,
addeq r2, r2,
mov r0, r2
cmp r1, r0 @ Clamp to maxbit
movlo r0, r1
mov pc, lr