On Thursday 21 April 2005 15:58, Joerg Wunsch wrote:
> As Dmitry K. wrote:
> > I have look 'ffs' from newlib (1.12.0).  It take up to 800 (!)
> > clocks.  Reason: shift is included to loop.
>
> The slightly modified BSD code (counter reduced to 8 bits) yields
>
>         sbiw r24,0
>         breq .L1
>         ldi r18,lo8(1)
> .L9:
>         sbrc r24,0
>         rjmp .L8
>         lsr r25
>         ror r24
>         subi r18,lo8(-(1))
>         rjmp .L9
> .L8:
>         mov r24,r18
>         clr r25
> .L1:
>         ret
>
> This makes 6 clocks per cycle, so up to ~ 100 clocks max.

Misprint: 7 clocks per cycle (rjmp).


> I'm interested in seeing Dmitry's code...

I have use byte-width shift:

   #define val_lo  r24
   #define val_hi  r25
   #define cntr    r30
        ...
   ffs:
        ldi     cntr, 1
        tst     val_lo
        brne    2f
        or      val_lo, val_hi
        breq    9f
        ldi     cntr, 8
   1:   inc     cntr
   2:   ror     val_lo
        brcc    1b
        mov     r24, cntr
        clr     r25
   9:   ret

Summary:  6+4*7+3+2 = 39 clocks (max), without call/ret.

ffsl:   the same idea    --> 18 words.
ffsll:  movw+sbiw usage  --> 26 words.

Dmitry.



_______________________________________________
AVR-libc-dev mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/avr-libc-dev

Reply via email to