------- Comment #13 from wvangulik at xs4all dot nl  2007-10-24 11:16 -------
(In reply to comment #10)

Something like this is smaller, faster and works for all registers (no need for
LD_regs). And could easily be writtin in to a insn:

; rOut: output register
; rIn:  input register
; rIn, Z, N are clobbered, C is set
clzqi_init:
    clr rOut           ; clear to zero
    neg rOut           ; make -1, and set C (C used for garanteed termination)
clzqi_loop1:
    inc rOut           ; inc output (C not touched)
    rol rIn            ; push MSB into C
    brcc clz_loop1     ; if C is cleared (msb was not set), continue loop
clzqi_end:

A clz on a hi/si/di would be almost the same. Extend the "rol rIn" to a rol per
sub_reg.
Of course there can be speed optimisation for hi/si/di, but for the AVR the
optimizer is in most cases set for size.
A library call to this is shorter but it may impose extra mov instruction to
fit the register constraints.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29524

Reply via email to