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