long fixsqrt32(long x) {
  unsigned long r = 0, s, v = (unsigned long)x;
  s = r + (1 << 15 * 2);
  r >>= 1;
  if (s <= v) {
    v -= s;
    r |= (1 << 15 * 2);
  };
  s = r + (1 << 14 * 2);
  r >>= 1;
  if (s <= v) {
    v -= s;
    r |= (1 << 14 * 2);
  };
  s = r + (1 << 13 * 2);
  r >>= 1;
  if (s <= v) {
    v -= s;
    r |= (1 << 13 * 2);
  };
  s = r + (1 << 12 * 2);
  r >>= 1;
  if (s <= v) {
    v -= s;
    r |= (1 << 12 * 2);
  };
  s = r + (1 << 11 * 2);
  r >>= 1;
  if (s <= v) {
    v -= s;
    r |= (1 << 11 * 2);
  };
  s = r + (1 << 10 * 2);
  r >>= 1;
  if (s <= v) {
    v -= s;
    r |= (1 << 10 * 2);
  };
  s = r + (1 << 9 * 2);
  r >>= 1;
  if (s <= v) {
    v -= s;
    r |= (1 << 9 * 2);
  };
  s = r + (1 << 8 * 2);
  r >>= 1;
  if (s <= v) {
    v -= s;
    r |= (1 << 8 * 2);
  };
  s = r + (1 << 7 * 2);
  r >>= 1;
  if (s <= v) {
    v -= s;
    r |= (1 << 7 * 2);
  };
  s = r + (1 << 6 * 2);
  r >>= 1;
  if (s <= v) {
    v -= s;
    r |= (1 << 6 * 2);
  };
  s = r + (1 << 5 * 2);
  r >>= 1;
  if (s <= v) {
    v -= s;
    r |= (1 << 5 * 2);
  };
  s = r + (1 << 4 * 2);
  r >>= 1;
  if (s <= v) {
    v -= s;
    r |= (1 << 4 * 2);
  };
  s = r + (1 << 3 * 2);
  r >>= 1;
  if (s <= v) {
    v -= s;
    r |= (1 << 3 * 2);
  };
  s = r + (1 << 2 * 2);
  r >>= 1;
  if (s <= v) {
    v -= s;
    r |= (1 << 2 * 2);
  };
  s = r + (1 << 1 * 2);
  r >>= 1;
  if (s <= v) {
    v -= s;
    r |= (1 << 1 * 2);
  };
  s = r + (1 << 0 * 2);
  r >>= 1;
  if (s <= v) {
    v -= s;
    r |= (1 << 0 * 2);
  };
  return (long)(r << (20 / 2));
}


x86 assembly (clang, -O0):
<fixsqrt32>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movq   $0x0,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
add    $0x40000000,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
ja     115d <fixsqrt32+0x5d>
mov    -0x18(%rbp),%rcx
mov    -0x20(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
or     $0x40000000,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x10000000,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
ja     11a2 <fixsqrt32+0xa2>
mov    -0x18(%rbp),%rcx
mov    -0x20(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
or     $0x10000000,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x4000000,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
ja     11e7 <fixsqrt32+0xe7>
mov    -0x18(%rbp),%rcx
mov    -0x20(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
or     $0x4000000,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1000000,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
ja     122c <fixsqrt32+0x12c>
mov    -0x18(%rbp),%rcx
mov    -0x20(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
or     $0x1000000,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x400000,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
ja     1271 <fixsqrt32+0x171>
mov    -0x18(%rbp),%rcx
mov    -0x20(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
or     $0x400000,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x100000,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
ja     12b6 <fixsqrt32+0x1b6>
mov    -0x18(%rbp),%rcx
mov    -0x20(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
or     $0x100000,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x40000,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
ja     12fb <fixsqrt32+0x1fb>
mov    -0x18(%rbp),%rcx
mov    -0x20(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
or     $0x40000,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x10000,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
ja     1340 <fixsqrt32+0x240>
mov    -0x18(%rbp),%rcx
mov    -0x20(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
or     $0x10000,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x4000,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
ja     1385 <fixsqrt32+0x285>
mov    -0x18(%rbp),%rcx
mov    -0x20(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
or     $0x4000,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1000,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
ja     13ca <fixsqrt32+0x2ca>
mov    -0x18(%rbp),%rcx
mov    -0x20(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
or     $0x1000,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x400,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
ja     140f <fixsqrt32+0x30f>
mov    -0x18(%rbp),%rcx
mov    -0x20(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
or     $0x400,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x100,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
ja     1454 <fixsqrt32+0x354>
mov    -0x18(%rbp),%rcx
mov    -0x20(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
or     $0x100,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x40,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
ja     1495 <fixsqrt32+0x395>
mov    -0x18(%rbp),%rcx
mov    -0x20(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
or     $0x40,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
ja     14d6 <fixsqrt32+0x3d6>
mov    -0x18(%rbp),%rcx
mov    -0x20(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
or     $0x10,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
ja     1517 <fixsqrt32+0x417>
mov    -0x18(%rbp),%rcx
mov    -0x20(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
or     $0x4,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
shr    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
ja     1558 <fixsqrt32+0x458>
mov    -0x18(%rbp),%rcx
mov    -0x20(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
or     $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
shl    $0xa,%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<fixsqrt32>:
lea    -0x40000000(%rdi),%rcx
xor    %edx,%edx
cmp    $0x40000000,%rdi
setae  %dl
cmovb  %rdi,%rcx
shl    $0x1e,%rdx
lea    0x10000000(%rdx),%rsi
shr    %rdx
lea    0x10000000(%rdx),%rdi
xor    %eax,%eax
cmp    %rsi,%rcx
cmovb  %rdx,%rdi
cmovb  %rax,%rsi
sub    %rsi,%rcx
lea    0x4000000(%rdi),%rdx
shr    %rdi
lea    0x4000000(%rdi),%rsi
cmp    %rdx,%rcx
cmovb  %rdi,%rsi
cmovb  %rax,%rdx
sub    %rdx,%rcx
lea    0x1000000(%rsi),%rdx
shr    %rsi
mov    %rsi,%rdi
or     $0x1000000,%rdi
cmp    %rdx,%rcx
cmovb  %rsi,%rdi
cmovb  %rax,%rdx
sub    %rdx,%rcx
lea    0x400000(%rdi),%rdx
shr    %rdi
mov    %rdi,%rsi
or     $0x400000,%rsi
cmp    %rdx,%rcx
cmovb  %rdi,%rsi
cmovb  %rax,%rdx
sub    %rdx,%rcx
lea    0x100000(%rsi),%rdx
shr    %rsi
mov    %rsi,%rdi
or     $0x100000,%rdi
cmp    %rdx,%rcx
cmovb  %rsi,%rdi
cmovb  %rax,%rdx
sub    %rdx,%rcx
lea    0x40000(%rdi),%rdx
shr    %rdi
mov    %rdi,%rsi
or     $0x40000,%rsi
cmp    %rdx,%rcx
cmovb  %rdi,%rsi
cmovb  %rax,%rdx
sub    %rdx,%rcx
lea    0x10000(%rsi),%rdx
shr    %rsi
mov    %rsi,%rdi
or     $0x10000,%rdi
cmp    %rdx,%rcx
cmovb  %rsi,%rdi
cmovb  %rax,%rdx
sub    %rdx,%rcx
lea    0x4000(%rdi),%rdx
shr    %rdi
mov    %rdi,%rsi
or     $0x4000,%rsi
cmp    %rdx,%rcx
cmovb  %rdi,%rsi
cmovb  %rax,%rdx
sub    %rdx,%rcx
lea    0x1000(%rsi),%rdx
shr    %rsi
mov    %rsi,%rdi
or     $0x1000,%rdi
cmp    %rdx,%rcx
cmovb  %rsi,%rdi
cmovb  %rax,%rdx
sub    %rdx,%rcx
lea    0x400(%rdi),%rdx
shr    %rdi
mov    %rdi,%rsi
or     $0x400,%rsi
cmp    %rdx,%rcx
cmovb  %rdi,%rsi
cmovb  %rax,%rdx
sub    %rdx,%rcx
lea    0x100(%rsi),%rdx
shr    %rsi
mov    %rsi,%rdi
or     $0x100,%rdi
cmp    %rdx,%rcx
cmovb  %rsi,%rdi
cmovb  %rax,%rdx
sub    %rdx,%rcx
lea    0x40(%rdi),%rdx
shr    %rdi
mov    %rdi,%rsi
or     $0x40,%rsi
cmp    %rdx,%rcx
cmovb  %rdi,%rsi
cmovb  %rax,%rdx
sub    %rdx,%rcx
lea    0x10(%rsi),%rdx
shr    %rsi
mov    %rsi,%rdi
or     $0x10,%rdi
cmp    %rdx,%rcx
cmovb  %rsi,%rdi
cmovb  %rax,%rdx
sub    %rdx,%rcx
lea    0x4(%rdi),%rdx
shr    %rdi
mov    %rdi,%rsi
or     $0x4,%rsi
cmp    %rdx,%rcx
cmovb  %rdi,%rsi
cmovb  %rax,%rdx
sub    %rdx,%rcx
mov    %rsi,%rdx
shr    %rdx
xor    %eax,%eax
cmp    %rcx,%rsi
setb   %al
or     %rdx,%rax
shl    $0xa,%rax
ret

LLVM IR (-O0):
define i64 @fixsqrt32(i64 %0) {
%2 = alloca i64
%3 = alloca i64
%4 = alloca i64
%5 = alloca i64
store i64 %0, i64* %2
store i64 0, i64* %3
%6 = load i64, i64* %2
store i64 %6, i64* %5
%7 = load i64, i64* %3
%8 = add i64 %7, 1073741824
store i64 %8, i64* %4
%9 = load i64, i64* %3
%10 = lshr i64 %9, 1
store i64 %10, i64* %3
%11 = load i64, i64* %4
%12 = load i64, i64* %5
%13 = icmp ule i64 %11, %12
br i1 %13, label %14, label %20
14: ; preds = %1
%15 = load i64, i64* %4
%16 = load i64, i64* %5
%17 = sub i64 %16, %15
store i64 %17, i64* %5
%18 = load i64, i64* %3
%19 = or i64 %18, 1073741824
store i64 %19, i64* %3
br label %20
20: ; preds = %14, %1
%21 = load i64, i64* %3
%22 = add i64 %21, 268435456
store i64 %22, i64* %4
%23 = load i64, i64* %3
%24 = lshr i64 %23, 1
store i64 %24, i64* %3
%25 = load i64, i64* %4
%26 = load i64, i64* %5
%27 = icmp ule i64 %25, %26
br i1 %27, label %28, label %34
28: ; preds = %20
%29 = load i64, i64* %4
%30 = load i64, i64* %5
%31 = sub i64 %30, %29
store i64 %31, i64* %5
%32 = load i64, i64* %3
%33 = or i64 %32, 268435456
store i64 %33, i64* %3
br label %34
34: ; preds = %28, %20
%35 = load i64, i64* %3
%36 = add i64 %35, 67108864
store i64 %36, i64* %4
%37 = load i64, i64* %3
%38 = lshr i64 %37, 1
store i64 %38, i64* %3
%39 = load i64, i64* %4
%40 = load i64, i64* %5
%41 = icmp ule i64 %39, %40
br i1 %41, label %42, label %48
42: ; preds = %34
%43 = load i64, i64* %4
%44 = load i64, i64* %5
%45 = sub i64 %44, %43
store i64 %45, i64* %5
%46 = load i64, i64* %3
%47 = or i64 %46, 67108864
store i64 %47, i64* %3
br label %48
48: ; preds = %42, %34
%49 = load i64, i64* %3
%50 = add i64 %49, 16777216
store i64 %50, i64* %4
%51 = load i64, i64* %3
%52 = lshr i64 %51, 1
store i64 %52, i64* %3
%53 = load i64, i64* %4
%54 = load i64, i64* %5
%55 = icmp ule i64 %53, %54
br i1 %55, label %56, label %62
56: ; preds = %48
%57 = load i64, i64* %4
%58 = load i64, i64* %5
%59 = sub i64 %58, %57
store i64 %59, i64* %5
%60 = load i64, i64* %3
%61 = or i64 %60, 16777216
store i64 %61, i64* %3
br label %62
62: ; preds = %56, %48
%63 = load i64, i64* %3
%64 = add i64 %63, 4194304
store i64 %64, i64* %4
%65 = load i64, i64* %3
%66 = lshr i64 %65, 1
store i64 %66, i64* %3
%67 = load i64, i64* %4
%68 = load i64, i64* %5
%69 = icmp ule i64 %67, %68
br i1 %69, label %70, label %76
70: ; preds = %62
%71 = load i64, i64* %4
%72 = load i64, i64* %5
%73 = sub i64 %72, %71
store i64 %73, i64* %5
%74 = load i64, i64* %3
%75 = or i64 %74, 4194304
store i64 %75, i64* %3
br label %76
76: ; preds = %70, %62
%77 = load i64, i64* %3
%78 = add i64 %77, 1048576
store i64 %78, i64* %4
%79 = load i64, i64* %3
%80 = lshr i64 %79, 1
store i64 %80, i64* %3
%81 = load i64, i64* %4
%82 = load i64, i64* %5
%83 = icmp ule i64 %81, %82
br i1 %83, label %84, label %90
84: ; preds = %76
%85 = load i64, i64* %4
%86 = load i64, i64* %5
%87 = sub i64 %86, %85
store i64 %87, i64* %5
%88 = load i64, i64* %3
%89 = or i64 %88, 1048576
store i64 %89, i64* %3
br label %90
90: ; preds = %84, %76
%91 = load i64, i64* %3
%92 = add i64 %91, 262144
store i64 %92, i64* %4
%93 = load i64, i64* %3
%94 = lshr i64 %93, 1
store i64 %94, i64* %3
%95 = load i64, i64* %4
%96 = load i64, i64* %5
%97 = icmp ule i64 %95, %96
br i1 %97, label %98, label %104
98: ; preds = %90
%99 = load i64, i64* %4
%100 = load i64, i64* %5
%101 = sub i64 %100, %99
store i64 %101, i64* %5
%102 = load i64, i64* %3
%103 = or i64 %102, 262144
store i64 %103, i64* %3
br label %104
104: ; preds = %98, %90
%105 = load i64, i64* %3
%106 = add i64 %105, 65536
store i64 %106, i64* %4
%107 = load i64, i64* %3
%108 = lshr i64 %107, 1
store i64 %108, i64* %3
%109 = load i64, i64* %4
%110 = load i64, i64* %5
%111 = icmp ule i64 %109, %110
br i1 %111, label %112, label %118
112: ; preds = %104
%113 = load i64, i64* %4
%114 = load i64, i64* %5
%115 = sub i64 %114, %113
store i64 %115, i64* %5
%116 = load i64, i64* %3
%117 = or i64 %116, 65536
store i64 %117, i64* %3
br label %118
118: ; preds = %112, %104
%119 = load i64, i64* %3
%120 = add i64 %119, 16384
store i64 %120, i64* %4
%121 = load i64, i64* %3
%122 = lshr i64 %121, 1
store i64 %122, i64* %3
%123 = load i64, i64* %4
%124 = load i64, i64* %5
%125 = icmp ule i64 %123, %124
br i1 %125, label %126, label %132
126: ; preds = %118
%127 = load i64, i64* %4
%128 = load i64, i64* %5
%129 = sub i64 %128, %127
store i64 %129, i64* %5
%130 = load i64, i64* %3
%131 = or i64 %130, 16384
store i64 %131, i64* %3
br label %132
132: ; preds = %126, %118
%133 = load i64, i64* %3
%134 = add i64 %133, 4096
store i64 %134, i64* %4
%135 = load i64, i64* %3
%136 = lshr i64 %135, 1
store i64 %136, i64* %3
%137 = load i64, i64* %4
%138 = load i64, i64* %5
%139 = icmp ule i64 %137, %138
br i1 %139, label %140, label %146
140: ; preds = %132
%141 = load i64, i64* %4
%142 = load i64, i64* %5
%143 = sub i64 %142, %141
store i64 %143, i64* %5
%144 = load i64, i64* %3
%145 = or i64 %144, 4096
store i64 %145, i64* %3
br label %146
146: ; preds = %140, %132
%147 = load i64, i64* %3
%148 = add i64 %147, 1024
store i64 %148, i64* %4
%149 = load i64, i64* %3
%150 = lshr i64 %149, 1
store i64 %150, i64* %3
%151 = load i64, i64* %4
%152 = load i64, i64* %5
%153 = icmp ule i64 %151, %152
br i1 %153, label %154, label %160
154: ; preds = %146
%155 = load i64, i64* %4
%156 = load i64, i64* %5
%157 = sub i64 %156, %155
store i64 %157, i64* %5
%158 = load i64, i64* %3
%159 = or i64 %158, 1024
store i64 %159, i64* %3
br label %160
160: ; preds = %154, %146
%161 = load i64, i64* %3
%162 = add i64 %161, 256
store i64 %162, i64* %4
%163 = load i64, i64* %3
%164 = lshr i64 %163, 1
store i64 %164, i64* %3
%165 = load i64, i64* %4
%166 = load i64, i64* %5
%167 = icmp ule i64 %165, %166
br i1 %167, label %168, label %174
168: ; preds = %160
%169 = load i64, i64* %4
%170 = load i64, i64* %5
%171 = sub i64 %170, %169
store i64 %171, i64* %5
%172 = load i64, i64* %3
%173 = or i64 %172, 256
store i64 %173, i64* %3
br label %174
174: ; preds = %168, %160
%175 = load i64, i64* %3
%176 = add i64 %175, 64
store i64 %176, i64* %4
%177 = load i64, i64* %3
%178 = lshr i64 %177, 1
store i64 %178, i64* %3
%179 = load i64, i64* %4
%180 = load i64, i64* %5
%181 = icmp ule i64 %179, %180
br i1 %181, label %182, label %188
182: ; preds = %174
%183 = load i64, i64* %4
%184 = load i64, i64* %5
%185 = sub i64 %184, %183
store i64 %185, i64* %5
%186 = load i64, i64* %3
%187 = or i64 %186, 64
store i64 %187, i64* %3
br label %188
188: ; preds = %182, %174
%189 = load i64, i64* %3
%190 = add i64 %189, 16
store i64 %190, i64* %4
%191 = load i64, i64* %3
%192 = lshr i64 %191, 1
store i64 %192, i64* %3
%193 = load i64, i64* %4
%194 = load i64, i64* %5
%195 = icmp ule i64 %193, %194
br i1 %195, label %196, label %202
196: ; preds = %188
%197 = load i64, i64* %4
%198 = load i64, i64* %5
%199 = sub i64 %198, %197
store i64 %199, i64* %5
%200 = load i64, i64* %3
%201 = or i64 %200, 16
store i64 %201, i64* %3
br label %202
202: ; preds = %196, %188
%203 = load i64, i64* %3
%204 = add i64 %203, 4
store i64 %204, i64* %4
%205 = load i64, i64* %3
%206 = lshr i64 %205, 1
store i64 %206, i64* %3
%207 = load i64, i64* %4
%208 = load i64, i64* %5
%209 = icmp ule i64 %207, %208
br i1 %209, label %210, label %216
210: ; preds = %202
%211 = load i64, i64* %4
%212 = load i64, i64* %5
%213 = sub i64 %212, %211
store i64 %213, i64* %5
%214 = load i64, i64* %3
%215 = or i64 %214, 4
store i64 %215, i64* %3
br label %216
216: ; preds = %210, %202
%217 = load i64, i64* %3
%218 = add i64 %217, 1
store i64 %218, i64* %4
%219 = load i64, i64* %3
%220 = lshr i64 %219, 1
store i64 %220, i64* %3
%221 = load i64, i64* %4
%222 = load i64, i64* %5
%223 = icmp ule i64 %221, %222
br i1 %223, label %224, label %230
224: ; preds = %216
%225 = load i64, i64* %4
%226 = load i64, i64* %5
%227 = sub i64 %226, %225
store i64 %227, i64* %5
%228 = load i64, i64* %3
%229 = or i64 %228, 1
store i64 %229, i64* %3
br label %230
230: ; preds = %224, %216
%231 = load i64, i64* %3
%232 = shl i64 %231, 10
ret i64 %232
}

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