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;
}