ARMの平方根(3)

よく見てみると、1bit毎に3クロックで収束出来るルーチンがあった(;´Д`)

; IN :  n 32 bit unsigned integer
; OUT:  root = INT (SQRT (n))
; TMP:  offset

MOV    offset, #3 << 30
MOV    root, #1 << 30
[ unroll for i = 0 .. 15
CMP    n, root, ROR #2 * i
SUBHS  n, n, root, ROR #2 * i
ADC    root, offset, root, LSL #1
]
BIC    root, root, #3 << 30  ; for rounding add: CMP n, root  ADC root, #1

51クロックって……テラハヤス(*´ω`)


早速前回のと比較。

前回のルーチン → 880ms
今回のルーチン → 700ms

笑いが止まらないぜ(゚∀゚)アヒャヒャヒャヒャ


↓ソース

uint32 sqrt( uint32 n ){
    uint32 offset,root;
    __asm{
        MOV     offset,#0xc0000000
        MOV     root,#0x40000000
        
        CMP     n,root,ROR #0
        SUBHS   n,n,root,ROR #0
        ADC     root,offset,root,LSL #1
        
        CMP     n,root,ROR #2
        SUBHS   n,n,root,ROR #2
        ADC     root,offset,root,LSL #1
        
        CMP     n,root,ROR #4
        SUBHS   n,n,root,ROR #4
        ADC     root,offset,root,LSL #1
        
        CMP     n,root,ROR #6
        SUBHS   n,n,root,ROR #6
        ADC     root,offset,root,LSL #1
        
        CMP     n,root,ROR #8
        SUBHS   n,n,root,ROR #8
        ADC     root,offset,root,LSL #1
        
        CMP     n,root,ROR #10
        SUBHS   n,n,root,ROR #10
        ADC     root,offset,root,LSL #1
        
        CMP     n,root,ROR #12
        SUBHS   n,n,root,ROR #12
        ADC     root,offset,root,LSL #1
        
        CMP     n,root,ROR #14
        SUBHS   n,n,root,ROR #14
        ADC     root,offset,root,LSL #1
        
        CMP     n,root,ROR #16
        SUBHS   n,n,root,ROR #16
        ADC     root,offset,root,LSL #1
        
        CMP     n,root,ROR #18
        SUBHS   n,n,root,ROR #18
        ADC     root,offset,root,LSL #1
        
        CMP     n,root,ROR #20
        SUBHS   n,n,root,ROR #20
        ADC     root,offset,root,LSL #1
        
        CMP     n,root,ROR #22
        SUBHS   n,n,root,ROR #22
        ADC     root,offset,root,LSL #1
        
        CMP     n,root,ROR #24
        SUBHS   n,n,root,ROR #24
        ADC     root,offset,root,LSL #1
        
        CMP     n,root,ROR #26
        SUBHS   n,n,root,ROR #26
        ADC     root,offset,root,LSL #1
        
        CMP     n,root,ROR #28
        SUBHS   n,n,root,ROR #28
        ADC     root,offset,root,LSL #1
        
        CMP     n,root,ROR #30
        SUBHS   n,n,root,ROR #30
        ADC     root,offset,root,LSL #1
        
        BIC     root,root,#0xc0000000
    };
    return root;
}