Last active
May 1, 2017 04:52
-
-
Save gene-ressler/c412035acaa68b2b8cbb1bf7c87f25bf to your computer and use it in GitHub Desktop.
Integer square root with shift and add
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// assumes unsigned is 32 bits | |
unsigned isqrt1(unsigned x) { | |
unsigned r = 0, r2 = 0; | |
for (int p = 15; p >= 0; --p) { | |
unsigned tr2 = r2 + (r << (p + 1)) + (1u << (p << 1)); | |
if (tr2 <= x) { | |
r2 = tr2; | |
r |= (1u << p); | |
} | |
} | |
return r; | |
} | |
/* | |
gcc 6.3 -O2 | |
isqrt(unsigned int): | |
mov esi, 15 | |
xor r9d, r9d | |
xor eax, eax | |
mov r8d, 1 | |
.L3: | |
lea ecx, [rsi+1] | |
mov edx, eax | |
mov r10d, r8d | |
sal edx, cl | |
lea ecx, [rsi+rsi] | |
sal r10d, cl | |
add edx, r10d | |
add edx, r9d | |
cmp edx, edi | |
ja .L2 | |
mov r11d, r8d | |
mov ecx, esi | |
mov r9d, edx | |
sal r11d, cl | |
or eax, r11d | |
.L2: | |
sub esi, 1 | |
cmp esi, -1 | |
jne .L3 | |
rep ret | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment