ARM: Count leading zeros

From ScienceZero

Jump to: navigation, search

[edit] Minimum size

       ;R0 - value
       ;R1 = count of leading zeros
       ;Uses R0-R1        mov	r1,#0
       ;Worst case 159 cycles, best case 4 cycles
       mov	r1,#0
loop   movs	r0,r0,lsl #1
       addcc	r1,r1,#1
       bcc	loop
       mov	pc,r14


[edit] Maximum performance

       ;R0 - value
       ;R1 = count of leading zeros
       ;Uses R0-R1
       ;16 cycles constant
       movs	r1,r0,lsr #16
       mov	r1,#0
       addeq	r1,r1,#16
       moveqs	r0,r0,lsl #16
       addeq	r1,r1,#1
       
       tst	r0,#0xff000000
       addeq	r1,r1,#8
       moveq	r0,r0,lsl #8
       
       tst	r0,#0xf0000000
       addeq	r1,r1,#4
       moveq	r0,r0,lsl #4
       
       tst	r0,#0xc0000000
       addeq	r1,r1,#2
       moveq	r0,r0,lsl #2
       
       tst	r0,#0x80000000
       addeq	r1,r1,#1
       
       mov	pc,r14


[edit] Maximum performance with normalizing

       ;R0 - value
       ;R1 = count of leading zeros
       ;Uses R0-R1
       ;17 cycles constant
       movs	r1,r0,lsr #16
       mov	r1,#0
       addeq	r1,r1,#16
       moveqs	r0,r0,lsl #16
       addeq	r1,r1,#1
       
       tst	r0,#0xff000000
       addeq	r1,r1,#8
       moveq	r0,r0,lsl #8
       
       tst	r0,#0xf0000000
       addeq	r1,r1,#4
       moveq	r0,r0,lsl #4
       
       tst	r0,#0xc0000000
       addeq	r1,r1,#2
       moveq	r0,r0,lsl #2
       
       tst	r0,#0x80000000
       addeq	r1,r1,#1
       moveq	r0,r0,lsl #1
       
       mov	pc,r14
Views
Personal tools
Science Zero