int iSqrt(int value) {
  int root = 0;
  if ((0x40000000l >> 0) + root <= value) {
    value -= (0x40000000l >> 0) + root;
    root = (root >> 1) | (0x40000000l >> 0);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 2) + root <= value) {
    value -= (0x40000000l >> 2) + root;
    root = (root >> 1) | (0x40000000l >> 2);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 4) + root <= value) {
    value -= (0x40000000l >> 4) + root;
    root = (root >> 1) | (0x40000000l >> 4);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 6) + root <= value) {
    value -= (0x40000000l >> 6) + root;
    root = (root >> 1) | (0x40000000l >> 6);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 8) + root <= value) {
    value -= (0x40000000l >> 8) + root;
    root = (root >> 1) | (0x40000000l >> 8);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 10) + root <= value) {
    value -= (0x40000000l >> 10) + root;
    root = (root >> 1) | (0x40000000l >> 10);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 12) + root <= value) {
    value -= (0x40000000l >> 12) + root;
    root = (root >> 1) | (0x40000000l >> 12);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 14) + root <= value) {
    value -= (0x40000000l >> 14) + root;
    root = (root >> 1) | (0x40000000l >> 14);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 16) + root <= value) {
    value -= (0x40000000l >> 16) + root;
    root = (root >> 1) | (0x40000000l >> 16);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 18) + root <= value) {
    value -= (0x40000000l >> 18) + root;
    root = (root >> 1) | (0x40000000l >> 18);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 20) + root <= value) {
    value -= (0x40000000l >> 20) + root;
    root = (root >> 1) | (0x40000000l >> 20);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 22) + root <= value) {
    value -= (0x40000000l >> 22) + root;
    root = (root >> 1) | (0x40000000l >> 22);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 24) + root <= value) {
    value -= (0x40000000l >> 24) + root;
    root = (root >> 1) | (0x40000000l >> 24);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 26) + root <= value) {
    value -= (0x40000000l >> 26) + root;
    root = (root >> 1) | (0x40000000l >> 26);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 28) + root <= value) {
    value -= (0x40000000l >> 28) + root;
    root = (root >> 1) | (0x40000000l >> 28);
  } else {
    root = root >> 1;
  };
  if ((0x40000000l >> 30) + root <= value) {
    value -= (0x40000000l >> 30) + root;
    root = (root >> 1) | (0x40000000l >> 30);
  } else {
    root = root >> 1;
  };
  if (root < value) {
    ++root;
  }
  return root;
}


x86 assembly (clang, -O0):
<iSqrt>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
movl   $0x0,-0x8(%rbp)
movslq -0x8(%rbp),%rax
add    $0x40000000,%rax
movslq -0x4(%rbp),%rcx
cmp    %rcx,%rax
jg     1150 <iSqrt+0x50>
movslq -0x8(%rbp),%rcx
add    $0x40000000,%rcx
movslq -0x4(%rbp),%rax
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
cltq
or     $0x40000000,%rax
mov    %eax,-0x8(%rbp)
jmp    1159 <iSqrt+0x59>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
movslq -0x8(%rbp),%rax
add    $0x10000000,%rax
movslq -0x4(%rbp),%rcx
cmp    %rcx,%rax
jg     119b <iSqrt+0x9b>
movslq -0x8(%rbp),%rcx
add    $0x10000000,%rcx
movslq -0x4(%rbp),%rax
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
cltq
or     $0x10000000,%rax
mov    %eax,-0x8(%rbp)
jmp    11a4 <iSqrt+0xa4>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
movslq -0x8(%rbp),%rax
add    $0x4000000,%rax
movslq -0x4(%rbp),%rcx
cmp    %rcx,%rax
jg     11e6 <iSqrt+0xe6>
movslq -0x8(%rbp),%rcx
add    $0x4000000,%rcx
movslq -0x4(%rbp),%rax
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
cltq
or     $0x4000000,%rax
mov    %eax,-0x8(%rbp)
jmp    11ef <iSqrt+0xef>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
movslq -0x8(%rbp),%rax
add    $0x1000000,%rax
movslq -0x4(%rbp),%rcx
cmp    %rcx,%rax
jg     1231 <iSqrt+0x131>
movslq -0x8(%rbp),%rcx
add    $0x1000000,%rcx
movslq -0x4(%rbp),%rax
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
cltq
or     $0x1000000,%rax
mov    %eax,-0x8(%rbp)
jmp    123a <iSqrt+0x13a>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
movslq -0x8(%rbp),%rax
add    $0x400000,%rax
movslq -0x4(%rbp),%rcx
cmp    %rcx,%rax
jg     127c <iSqrt+0x17c>
movslq -0x8(%rbp),%rcx
add    $0x400000,%rcx
movslq -0x4(%rbp),%rax
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
cltq
or     $0x400000,%rax
mov    %eax,-0x8(%rbp)
jmp    1285 <iSqrt+0x185>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
movslq -0x8(%rbp),%rax
add    $0x100000,%rax
movslq -0x4(%rbp),%rcx
cmp    %rcx,%rax
jg     12c7 <iSqrt+0x1c7>
movslq -0x8(%rbp),%rcx
add    $0x100000,%rcx
movslq -0x4(%rbp),%rax
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
cltq
or     $0x100000,%rax
mov    %eax,-0x8(%rbp)
jmp    12d0 <iSqrt+0x1d0>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
movslq -0x8(%rbp),%rax
add    $0x40000,%rax
movslq -0x4(%rbp),%rcx
cmp    %rcx,%rax
jg     1312 <iSqrt+0x212>
movslq -0x8(%rbp),%rcx
add    $0x40000,%rcx
movslq -0x4(%rbp),%rax
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
cltq
or     $0x40000,%rax
mov    %eax,-0x8(%rbp)
jmp    131b <iSqrt+0x21b>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
movslq -0x8(%rbp),%rax
add    $0x10000,%rax
movslq -0x4(%rbp),%rcx
cmp    %rcx,%rax
jg     135d <iSqrt+0x25d>
movslq -0x8(%rbp),%rcx
add    $0x10000,%rcx
movslq -0x4(%rbp),%rax
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
cltq
or     $0x10000,%rax
mov    %eax,-0x8(%rbp)
jmp    1366 <iSqrt+0x266>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
movslq -0x8(%rbp),%rax
add    $0x4000,%rax
movslq -0x4(%rbp),%rcx
cmp    %rcx,%rax
jg     13a8 <iSqrt+0x2a8>
movslq -0x8(%rbp),%rcx
add    $0x4000,%rcx
movslq -0x4(%rbp),%rax
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
cltq
or     $0x4000,%rax
mov    %eax,-0x8(%rbp)
jmp    13b1 <iSqrt+0x2b1>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
movslq -0x8(%rbp),%rax
add    $0x1000,%rax
movslq -0x4(%rbp),%rcx
cmp    %rcx,%rax
jg     13f3 <iSqrt+0x2f3>
movslq -0x8(%rbp),%rcx
add    $0x1000,%rcx
movslq -0x4(%rbp),%rax
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
cltq
or     $0x1000,%rax
mov    %eax,-0x8(%rbp)
jmp    13fc <iSqrt+0x2fc>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
movslq -0x8(%rbp),%rax
add    $0x400,%rax
movslq -0x4(%rbp),%rcx
cmp    %rcx,%rax
jg     143e <iSqrt+0x33e>
movslq -0x8(%rbp),%rcx
add    $0x400,%rcx
movslq -0x4(%rbp),%rax
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
cltq
or     $0x400,%rax
mov    %eax,-0x8(%rbp)
jmp    1447 <iSqrt+0x347>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
movslq -0x8(%rbp),%rax
add    $0x100,%rax
movslq -0x4(%rbp),%rcx
cmp    %rcx,%rax
jg     1489 <iSqrt+0x389>
movslq -0x8(%rbp),%rcx
add    $0x100,%rcx
movslq -0x4(%rbp),%rax
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
cltq
or     $0x100,%rax
mov    %eax,-0x8(%rbp)
jmp    1492 <iSqrt+0x392>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
movslq -0x8(%rbp),%rax
add    $0x40,%rax
movslq -0x4(%rbp),%rcx
cmp    %rcx,%rax
jg     14cd <iSqrt+0x3cd>
movslq -0x8(%rbp),%rcx
add    $0x40,%rcx
movslq -0x4(%rbp),%rax
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
cltq
or     $0x40,%rax
mov    %eax,-0x8(%rbp)
jmp    14d6 <iSqrt+0x3d6>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
movslq -0x8(%rbp),%rax
add    $0x10,%rax
movslq -0x4(%rbp),%rcx
cmp    %rcx,%rax
jg     1511 <iSqrt+0x411>
movslq -0x8(%rbp),%rcx
add    $0x10,%rcx
movslq -0x4(%rbp),%rax
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
cltq
or     $0x10,%rax
mov    %eax,-0x8(%rbp)
jmp    151a <iSqrt+0x41a>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
movslq -0x8(%rbp),%rax
add    $0x4,%rax
movslq -0x4(%rbp),%rcx
cmp    %rcx,%rax
jg     1555 <iSqrt+0x455>
movslq -0x8(%rbp),%rcx
add    $0x4,%rcx
movslq -0x4(%rbp),%rax
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
cltq
or     $0x4,%rax
mov    %eax,-0x8(%rbp)
jmp    155e <iSqrt+0x45e>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
movslq -0x8(%rbp),%rax
add    $0x1,%rax
movslq -0x4(%rbp),%rcx
cmp    %rcx,%rax
jg     1599 <iSqrt+0x499>
movslq -0x8(%rbp),%rcx
add    $0x1,%rcx
movslq -0x4(%rbp),%rax
sub    %rcx,%rax
mov    %eax,-0x4(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
cltq
or     $0x1,%rax
mov    %eax,-0x8(%rbp)
jmp    15a2 <iSqrt+0x4a2>
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    15b7 <iSqrt+0x4b7>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<iSqrt>:
lea    -0x40000000(%rdi),%eax
xor    %edx,%edx
cmp    $0x40000000,%edi
setge  %dl
cmovl  %edi,%eax
shl    $0x1e,%edx
lea    0x10000000(%rdx),%esi
movslq %eax,%rcx
shr    %edx
lea    0x10000000(%rdx),%edi
xor    %eax,%eax
cmp    %rsi,%rcx
cmovl  %eax,%esi
cmovl  %edx,%edi
sub    %esi,%ecx
lea    0x4000000(%rdi),%edx
shr    %edi
cmp    %edx,%ecx
cmovl  %eax,%edx
lea    0x4000000(%rdi),%esi
cmovl  %edi,%esi
sub    %edx,%ecx
lea    0x1000000(%rsi),%edx
shr    %esi
mov    %esi,%edi
or     $0x1000000,%edi
cmp    %edx,%ecx
cmovl  %eax,%edx
cmovl  %esi,%edi
sub    %edx,%ecx
lea    0x400000(%rdi),%edx
shr    %edi
mov    %edi,%esi
or     $0x400000,%esi
cmp    %edx,%ecx
cmovl  %eax,%edx
cmovl  %edi,%esi
sub    %edx,%ecx
lea    0x100000(%rsi),%edx
shr    %esi
mov    %esi,%edi
or     $0x100000,%edi
cmp    %edx,%ecx
cmovl  %eax,%edx
cmovl  %esi,%edi
sub    %edx,%ecx
lea    0x40000(%rdi),%edx
shr    %edi
mov    %edi,%esi
or     $0x40000,%esi
cmp    %edx,%ecx
cmovl  %eax,%edx
cmovl  %edi,%esi
sub    %edx,%ecx
lea    0x10000(%rsi),%edx
shr    %esi
mov    %esi,%edi
or     $0x10000,%edi
cmp    %edx,%ecx
cmovl  %eax,%edx
cmovl  %esi,%edi
sub    %edx,%ecx
lea    0x4000(%rdi),%edx
shr    %edi
mov    %edi,%esi
or     $0x4000,%esi
cmp    %edx,%ecx
cmovl  %eax,%edx
cmovl  %edi,%esi
sub    %edx,%ecx
lea    0x1000(%rsi),%edx
shr    %esi
mov    %esi,%edi
or     $0x1000,%edi
cmp    %edx,%ecx
cmovl  %eax,%edx
cmovl  %esi,%edi
sub    %edx,%ecx
lea    0x400(%rdi),%edx
shr    %edi
mov    %edi,%esi
or     $0x400,%esi
cmp    %edx,%ecx
cmovl  %eax,%edx
cmovl  %edi,%esi
sub    %edx,%ecx
lea    0x100(%rsi),%edx
shr    %esi
mov    %esi,%edi
or     $0x100,%edi
cmp    %edx,%ecx
cmovl  %eax,%edx
cmovl  %esi,%edi
sub    %edx,%ecx
lea    0x40(%rdi),%edx
shr    %edi
mov    %edi,%esi
or     $0x40,%esi
cmp    %edx,%ecx
cmovl  %eax,%edx
cmovl  %edi,%esi
sub    %edx,%ecx
lea    0x10(%rsi),%edx
shr    %esi
mov    %esi,%edi
or     $0x10,%edi
cmp    %edx,%ecx
cmovl  %eax,%edx
cmovl  %esi,%edi
sub    %edx,%ecx
lea    0x4(%rdi),%esi
shr    %edi
mov    %edi,%edx
or     $0x4,%edx
cmp    %esi,%ecx
cmovl  %eax,%esi
cmovl  %edi,%edx
sub    %esi,%ecx
cmp    %ecx,%edx
jge    1284 <iSqrt+0x184>
mov    %edx,%eax
not    %eax
add    %eax,%ecx
shr    %edx
or     $0x1,%edx
jmp    1286 <iSqrt+0x186>
shr    %edx
xor    %eax,%eax
cmp    %ecx,%edx
setl   %al
add    %edx,%eax
ret

LLVM IR (-O0):
define i32 @iSqrt(i32 %0) {
%2 = alloca i32
%3 = alloca i32
store i32 %0, i32* %2
store i32 0, i32* %3
%4 = load i32, i32* %3
%5 = sext i32 %4 to i64
%6 = add nsw i64 1073741824, %5
%7 = load i32, i32* %2
%8 = sext i32 %7 to i64
%9 = icmp sle i64 %6, %8
br i1 %9, label %10, label %23
10: ; preds = %1
%11 = load i32, i32* %3
%12 = sext i32 %11 to i64
%13 = add nsw i64 1073741824, %12
%14 = load i32, i32* %2
%15 = sext i32 %14 to i64
%16 = sub nsw i64 %15, %13
%17 = trunc i64 %16 to i32
store i32 %17, i32* %2
%18 = load i32, i32* %3
%19 = ashr i32 %18, 1
%20 = sext i32 %19 to i64
%21 = or i64 %20, 1073741824
%22 = trunc i64 %21 to i32
store i32 %22, i32* %3
br label %26
23: ; preds = %1
%24 = load i32, i32* %3
%25 = ashr i32 %24, 1
store i32 %25, i32* %3
br label %26
26: ; preds = %23, %10
%27 = load i32, i32* %3
%28 = sext i32 %27 to i64
%29 = add nsw i64 268435456, %28
%30 = load i32, i32* %2
%31 = sext i32 %30 to i64
%32 = icmp sle i64 %29, %31
br i1 %32, label %33, label %46
33: ; preds = %26
%34 = load i32, i32* %3
%35 = sext i32 %34 to i64
%36 = add nsw i64 268435456, %35
%37 = load i32, i32* %2
%38 = sext i32 %37 to i64
%39 = sub nsw i64 %38, %36
%40 = trunc i64 %39 to i32
store i32 %40, i32* %2
%41 = load i32, i32* %3
%42 = ashr i32 %41, 1
%43 = sext i32 %42 to i64
%44 = or i64 %43, 268435456
%45 = trunc i64 %44 to i32
store i32 %45, i32* %3
br label %49
46: ; preds = %26
%47 = load i32, i32* %3
%48 = ashr i32 %47, 1
store i32 %48, i32* %3
br label %49
49: ; preds = %46, %33
%50 = load i32, i32* %3
%51 = sext i32 %50 to i64
%52 = add nsw i64 67108864, %51
%53 = load i32, i32* %2
%54 = sext i32 %53 to i64
%55 = icmp sle i64 %52, %54
br i1 %55, label %56, label %69
56: ; preds = %49
%57 = load i32, i32* %3
%58 = sext i32 %57 to i64
%59 = add nsw i64 67108864, %58
%60 = load i32, i32* %2
%61 = sext i32 %60 to i64
%62 = sub nsw i64 %61, %59
%63 = trunc i64 %62 to i32
store i32 %63, i32* %2
%64 = load i32, i32* %3
%65 = ashr i32 %64, 1
%66 = sext i32 %65 to i64
%67 = or i64 %66, 67108864
%68 = trunc i64 %67 to i32
store i32 %68, i32* %3
br label %72
69: ; preds = %49
%70 = load i32, i32* %3
%71 = ashr i32 %70, 1
store i32 %71, i32* %3
br label %72
72: ; preds = %69, %56
%73 = load i32, i32* %3
%74 = sext i32 %73 to i64
%75 = add nsw i64 16777216, %74
%76 = load i32, i32* %2
%77 = sext i32 %76 to i64
%78 = icmp sle i64 %75, %77
br i1 %78, label %79, label %92
79: ; preds = %72
%80 = load i32, i32* %3
%81 = sext i32 %80 to i64
%82 = add nsw i64 16777216, %81
%83 = load i32, i32* %2
%84 = sext i32 %83 to i64
%85 = sub nsw i64 %84, %82
%86 = trunc i64 %85 to i32
store i32 %86, i32* %2
%87 = load i32, i32* %3
%88 = ashr i32 %87, 1
%89 = sext i32 %88 to i64
%90 = or i64 %89, 16777216
%91 = trunc i64 %90 to i32
store i32 %91, i32* %3
br label %95
92: ; preds = %72
%93 = load i32, i32* %3
%94 = ashr i32 %93, 1
store i32 %94, i32* %3
br label %95
95: ; preds = %92, %79
%96 = load i32, i32* %3
%97 = sext i32 %96 to i64
%98 = add nsw i64 4194304, %97
%99 = load i32, i32* %2
%100 = sext i32 %99 to i64
%101 = icmp sle i64 %98, %100
br i1 %101, label %102, label %115
102: ; preds = %95
%103 = load i32, i32* %3
%104 = sext i32 %103 to i64
%105 = add nsw i64 4194304, %104
%106 = load i32, i32* %2
%107 = sext i32 %106 to i64
%108 = sub nsw i64 %107, %105
%109 = trunc i64 %108 to i32
store i32 %109, i32* %2
%110 = load i32, i32* %3
%111 = ashr i32 %110, 1
%112 = sext i32 %111 to i64
%113 = or i64 %112, 4194304
%114 = trunc i64 %113 to i32
store i32 %114, i32* %3
br label %118
115: ; preds = %95
%116 = load i32, i32* %3
%117 = ashr i32 %116, 1
store i32 %117, i32* %3
br label %118
118: ; preds = %115, %102
%119 = load i32, i32* %3
%120 = sext i32 %119 to i64
%121 = add nsw i64 1048576, %120
%122 = load i32, i32* %2
%123 = sext i32 %122 to i64
%124 = icmp sle i64 %121, %123
br i1 %124, label %125, label %138
125: ; preds = %118
%126 = load i32, i32* %3
%127 = sext i32 %126 to i64
%128 = add nsw i64 1048576, %127
%129 = load i32, i32* %2
%130 = sext i32 %129 to i64
%131 = sub nsw i64 %130, %128
%132 = trunc i64 %131 to i32
store i32 %132, i32* %2
%133 = load i32, i32* %3
%134 = ashr i32 %133, 1
%135 = sext i32 %134 to i64
%136 = or i64 %135, 1048576
%137 = trunc i64 %136 to i32
store i32 %137, i32* %3
br label %141
138: ; preds = %118
%139 = load i32, i32* %3
%140 = ashr i32 %139, 1
store i32 %140, i32* %3
br label %141
141: ; preds = %138, %125
%142 = load i32, i32* %3
%143 = sext i32 %142 to i64
%144 = add nsw i64 262144, %143
%145 = load i32, i32* %2
%146 = sext i32 %145 to i64
%147 = icmp sle i64 %144, %146
br i1 %147, label %148, label %161
148: ; preds = %141
%149 = load i32, i32* %3
%150 = sext i32 %149 to i64
%151 = add nsw i64 262144, %150
%152 = load i32, i32* %2
%153 = sext i32 %152 to i64
%154 = sub nsw i64 %153, %151
%155 = trunc i64 %154 to i32
store i32 %155, i32* %2
%156 = load i32, i32* %3
%157 = ashr i32 %156, 1
%158 = sext i32 %157 to i64
%159 = or i64 %158, 262144
%160 = trunc i64 %159 to i32
store i32 %160, i32* %3
br label %164
161: ; preds = %141
%162 = load i32, i32* %3
%163 = ashr i32 %162, 1
store i32 %163, i32* %3
br label %164
164: ; preds = %161, %148
%165 = load i32, i32* %3
%166 = sext i32 %165 to i64
%167 = add nsw i64 65536, %166
%168 = load i32, i32* %2
%169 = sext i32 %168 to i64
%170 = icmp sle i64 %167, %169
br i1 %170, label %171, label %184
171: ; preds = %164
%172 = load i32, i32* %3
%173 = sext i32 %172 to i64
%174 = add nsw i64 65536, %173
%175 = load i32, i32* %2
%176 = sext i32 %175 to i64
%177 = sub nsw i64 %176, %174
%178 = trunc i64 %177 to i32
store i32 %178, i32* %2
%179 = load i32, i32* %3
%180 = ashr i32 %179, 1
%181 = sext i32 %180 to i64
%182 = or i64 %181, 65536
%183 = trunc i64 %182 to i32
store i32 %183, i32* %3
br label %187
184: ; preds = %164
%185 = load i32, i32* %3
%186 = ashr i32 %185, 1
store i32 %186, i32* %3
br label %187
187: ; preds = %184, %171
%188 = load i32, i32* %3
%189 = sext i32 %188 to i64
%190 = add nsw i64 16384, %189
%191 = load i32, i32* %2
%192 = sext i32 %191 to i64
%193 = icmp sle i64 %190, %192
br i1 %193, label %194, label %207
194: ; preds = %187
%195 = load i32, i32* %3
%196 = sext i32 %195 to i64
%197 = add nsw i64 16384, %196
%198 = load i32, i32* %2
%199 = sext i32 %198 to i64
%200 = sub nsw i64 %199, %197
%201 = trunc i64 %200 to i32
store i32 %201, i32* %2
%202 = load i32, i32* %3
%203 = ashr i32 %202, 1
%204 = sext i32 %203 to i64
%205 = or i64 %204, 16384
%206 = trunc i64 %205 to i32
store i32 %206, i32* %3
br label %210
207: ; preds = %187
%208 = load i32, i32* %3
%209 = ashr i32 %208, 1
store i32 %209, i32* %3
br label %210
210: ; preds = %207, %194
%211 = load i32, i32* %3
%212 = sext i32 %211 to i64
%213 = add nsw i64 4096, %212
%214 = load i32, i32* %2
%215 = sext i32 %214 to i64
%216 = icmp sle i64 %213, %215
br i1 %216, label %217, label %230
217: ; preds = %210
%218 = load i32, i32* %3
%219 = sext i32 %218 to i64
%220 = add nsw i64 4096, %219
%221 = load i32, i32* %2
%222 = sext i32 %221 to i64
%223 = sub nsw i64 %222, %220
%224 = trunc i64 %223 to i32
store i32 %224, i32* %2
%225 = load i32, i32* %3
%226 = ashr i32 %225, 1
%227 = sext i32 %226 to i64
%228 = or i64 %227, 4096
%229 = trunc i64 %228 to i32
store i32 %229, i32* %3
br label %233
230: ; preds = %210
%231 = load i32, i32* %3
%232 = ashr i32 %231, 1
store i32 %232, i32* %3
br label %233
233: ; preds = %230, %217
%234 = load i32, i32* %3
%235 = sext i32 %234 to i64
%236 = add nsw i64 1024, %235
%237 = load i32, i32* %2
%238 = sext i32 %237 to i64
%239 = icmp sle i64 %236, %238
br i1 %239, label %240, label %253
240: ; preds = %233
%241 = load i32, i32* %3
%242 = sext i32 %241 to i64
%243 = add nsw i64 1024, %242
%244 = load i32, i32* %2
%245 = sext i32 %244 to i64
%246 = sub nsw i64 %245, %243
%247 = trunc i64 %246 to i32
store i32 %247, i32* %2
%248 = load i32, i32* %3
%249 = ashr i32 %248, 1
%250 = sext i32 %249 to i64
%251 = or i64 %250, 1024
%252 = trunc i64 %251 to i32
store i32 %252, i32* %3
br label %256
253: ; preds = %233
%254 = load i32, i32* %3
%255 = ashr i32 %254, 1
store i32 %255, i32* %3
br label %256
256: ; preds = %253, %240
%257 = load i32, i32* %3
%258 = sext i32 %257 to i64
%259 = add nsw i64 256, %258
%260 = load i32, i32* %2
%261 = sext i32 %260 to i64
%262 = icmp sle i64 %259, %261
br i1 %262, label %263, label %276
263: ; preds = %256
%264 = load i32, i32* %3
%265 = sext i32 %264 to i64
%266 = add nsw i64 256, %265
%267 = load i32, i32* %2
%268 = sext i32 %267 to i64
%269 = sub nsw i64 %268, %266
%270 = trunc i64 %269 to i32
store i32 %270, i32* %2
%271 = load i32, i32* %3
%272 = ashr i32 %271, 1
%273 = sext i32 %272 to i64
%274 = or i64 %273, 256
%275 = trunc i64 %274 to i32
store i32 %275, i32* %3
br label %279
276: ; preds = %256
%277 = load i32, i32* %3
%278 = ashr i32 %277, 1
store i32 %278, i32* %3
br label %279
279: ; preds = %276, %263
%280 = load i32, i32* %3
%281 = sext i32 %280 to i64
%282 = add nsw i64 64, %281
%283 = load i32, i32* %2
%284 = sext i32 %283 to i64
%285 = icmp sle i64 %282, %284
br i1 %285, label %286, label %299
286: ; preds = %279
%287 = load i32, i32* %3
%288 = sext i32 %287 to i64
%289 = add nsw i64 64, %288
%290 = load i32, i32* %2
%291 = sext i32 %290 to i64
%292 = sub nsw i64 %291, %289
%293 = trunc i64 %292 to i32
store i32 %293, i32* %2
%294 = load i32, i32* %3
%295 = ashr i32 %294, 1
%296 = sext i32 %295 to i64
%297 = or i64 %296, 64
%298 = trunc i64 %297 to i32
store i32 %298, i32* %3
br label %302
299: ; preds = %279
%300 = load i32, i32* %3
%301 = ashr i32 %300, 1
store i32 %301, i32* %3
br label %302
302: ; preds = %299, %286
%303 = load i32, i32* %3
%304 = sext i32 %303 to i64
%305 = add nsw i64 16, %304
%306 = load i32, i32* %2
%307 = sext i32 %306 to i64
%308 = icmp sle i64 %305, %307
br i1 %308, label %309, label %322
309: ; preds = %302
%310 = load i32, i32* %3
%311 = sext i32 %310 to i64
%312 = add nsw i64 16, %311
%313 = load i32, i32* %2
%314 = sext i32 %313 to i64
%315 = sub nsw i64 %314, %312
%316 = trunc i64 %315 to i32
store i32 %316, i32* %2
%317 = load i32, i32* %3
%318 = ashr i32 %317, 1
%319 = sext i32 %318 to i64
%320 = or i64 %319, 16
%321 = trunc i64 %320 to i32
store i32 %321, i32* %3
br label %325
322: ; preds = %302
%323 = load i32, i32* %3
%324 = ashr i32 %323, 1
store i32 %324, i32* %3
br label %325
325: ; preds = %322, %309
%326 = load i32, i32* %3
%327 = sext i32 %326 to i64
%328 = add nsw i64 4, %327
%329 = load i32, i32* %2
%330 = sext i32 %329 to i64
%331 = icmp sle i64 %328, %330
br i1 %331, label %332, label %345
332: ; preds = %325
%333 = load i32, i32* %3
%334 = sext i32 %333 to i64
%335 = add nsw i64 4, %334
%336 = load i32, i32* %2
%337 = sext i32 %336 to i64
%338 = sub nsw i64 %337, %335
%339 = trunc i64 %338 to i32
store i32 %339, i32* %2
%340 = load i32, i32* %3
%341 = ashr i32 %340, 1
%342 = sext i32 %341 to i64
%343 = or i64 %342, 4
%344 = trunc i64 %343 to i32
store i32 %344, i32* %3
br label %348
345: ; preds = %325
%346 = load i32, i32* %3
%347 = ashr i32 %346, 1
store i32 %347, i32* %3
br label %348
348: ; preds = %345, %332
%349 = load i32, i32* %3
%350 = sext i32 %349 to i64
%351 = add nsw i64 1, %350
%352 = load i32, i32* %2
%353 = sext i32 %352 to i64
%354 = icmp sle i64 %351, %353
br i1 %354, label %355, label %368
355: ; preds = %348
%356 = load i32, i32* %3
%357 = sext i32 %356 to i64
%358 = add nsw i64 1, %357
%359 = load i32, i32* %2
%360 = sext i32 %359 to i64
%361 = sub nsw i64 %360, %358
%362 = trunc i64 %361 to i32
store i32 %362, i32* %2
%363 = load i32, i32* %3
%364 = ashr i32 %363, 1
%365 = sext i32 %364 to i64
%366 = or i64 %365, 1
%367 = trunc i64 %366 to i32
store i32 %367, i32* %3
br label %371
368: ; preds = %348
%369 = load i32, i32* %3
%370 = ashr i32 %369, 1
store i32 %370, i32* %3
br label %371
371: ; preds = %368, %355
%372 = load i32, i32* %3
%373 = load i32, i32* %2
%374 = icmp slt i32 %372, %373
br i1 %374, label %375, label %378
375: ; preds = %371
%376 = load i32, i32* %3
%377 = add nsw i32 %376, 1
store i32 %377, i32* %3
br label %378
378: ; preds = %375, %371
%379 = load i32, i32* %3
ret i32 %379
}

LLVM IR (-O2):
define i32 @iSqrt(i32 %0) {
%2 = icmp sgt i32 %0, 1073741823
%3 = add i32 %0, -1073741824
%4 = select i1 %2, i32 %3, i32 %0
%5 = select i1 %2, i32 1073741824, i32 0
%6 = or i32 %5, 268435456
%7 = zext i32 %6 to i64
%8 = sext i32 %4 to i64
%9 = icmp slt i64 %8, %7
%10 = lshr exact i32 %5, 1
%11 = or i32 %10, 268435456
%12 = select i1 %9, i32 0, i32 %6
%13 = sub i32 %4, %12
%14 = select i1 %9, i32 %10, i32 %11
%15 = or i32 %14, 67108864
%16 = icmp slt i32 %13, %15
%17 = lshr exact i32 %14, 1
%18 = or i32 %17, 67108864
%19 = select i1 %16, i32 0, i32 %15
%20 = sub i32 %13, %19
%21 = select i1 %16, i32 %17, i32 %18
%22 = add nuw nsw i32 %21, 16777216
%23 = icmp slt i32 %20, %22
%24 = lshr i32 %21, 1
%25 = or i32 %24, 16777216
%26 = select i1 %23, i32 0, i32 %22
%27 = sub i32 %20, %26
%28 = select i1 %23, i32 %24, i32 %25
%29 = add nuw nsw i32 %28, 4194304
%30 = icmp slt i32 %27, %29
%31 = lshr i32 %28, 1
%32 = or i32 %31, 4194304
%33 = select i1 %30, i32 0, i32 %29
%34 = sub i32 %27, %33
%35 = select i1 %30, i32 %31, i32 %32
%36 = add nuw nsw i32 %35, 1048576
%37 = icmp slt i32 %34, %36
%38 = lshr i32 %35, 1
%39 = or i32 %38, 1048576
%40 = select i1 %37, i32 0, i32 %36
%41 = sub i32 %34, %40
%42 = select i1 %37, i32 %38, i32 %39
%43 = add nuw nsw i32 %42, 262144
%44 = icmp slt i32 %41, %43
%45 = lshr i32 %42, 1
%46 = or i32 %45, 262144
%47 = select i1 %44, i32 0, i32 %43
%48 = sub i32 %41, %47
%49 = select i1 %44, i32 %45, i32 %46
%50 = add nuw nsw i32 %49, 65536
%51 = icmp slt i32 %48, %50
%52 = lshr i32 %49, 1
%53 = or i32 %52, 65536
%54 = select i1 %51, i32 0, i32 %50
%55 = sub i32 %48, %54
%56 = select i1 %51, i32 %52, i32 %53
%57 = add nuw nsw i32 %56, 16384
%58 = icmp slt i32 %55, %57
%59 = lshr i32 %56, 1
%60 = or i32 %59, 16384
%61 = select i1 %58, i32 0, i32 %57
%62 = sub i32 %55, %61
%63 = select i1 %58, i32 %59, i32 %60
%64 = add nuw nsw i32 %63, 4096
%65 = icmp slt i32 %62, %64
%66 = lshr i32 %63, 1
%67 = or i32 %66, 4096
%68 = select i1 %65, i32 0, i32 %64
%69 = sub i32 %62, %68
%70 = select i1 %65, i32 %66, i32 %67
%71 = add nuw nsw i32 %70, 1024
%72 = icmp slt i32 %69, %71
%73 = lshr i32 %70, 1
%74 = or i32 %73, 1024
%75 = select i1 %72, i32 0, i32 %71
%76 = sub i32 %69, %75
%77 = select i1 %72, i32 %73, i32 %74
%78 = add nuw nsw i32 %77, 256
%79 = icmp slt i32 %76, %78
%80 = lshr i32 %77, 1
%81 = or i32 %80, 256
%82 = select i1 %79, i32 0, i32 %78
%83 = sub i32 %76, %82
%84 = select i1 %79, i32 %80, i32 %81
%85 = add nuw nsw i32 %84, 64
%86 = icmp slt i32 %83, %85
%87 = lshr i32 %84, 1
%88 = or i32 %87, 64
%89 = select i1 %86, i32 0, i32 %85
%90 = sub i32 %83, %89
%91 = select i1 %86, i32 %87, i32 %88
%92 = add nuw nsw i32 %91, 16
%93 = icmp slt i32 %90, %92
%94 = lshr i32 %91, 1
%95 = or i32 %94, 16
%96 = select i1 %93, i32 0, i32 %92
%97 = sub i32 %90, %96
%98 = select i1 %93, i32 %94, i32 %95
%99 = add nuw nsw i32 %98, 4
%100 = icmp slt i32 %97, %99
%101 = lshr i32 %98, 1
%102 = or i32 %101, 4
%103 = select i1 %100, i32 0, i32 %99
%104 = sub i32 %97, %103
%105 = select i1 %100, i32 %101, i32 %102
%106 = icmp slt i32 %105, %104
br i1 %106, label %107, label %112
107: ; preds = %1
%108 = xor i32 %105, -1
%109 = add i32 %104, %108
%110 = lshr i32 %105, 1
%111 = or i32 %110, 1
br label %114
112: ; preds = %1
%113 = lshr i32 %105, 1
br label %114
114: ; preds = %112, %107
%115 = phi i32 [ %109, %107 ], [ %104, %112 ]
%116 = phi i32 [ %111, %107 ], [ %113, %112 ]
%117 = icmp slt i32 %116, %115
%118 = zext i1 %117 to i32
%119 = add nsw i32 %116, %118
ret i32 %119
}