unsigned int mborg_isqrt4(unsigned long val) {
  unsigned int temp, g = 0;
  if (val >= 0x40000000) {
    g = 0x8000;
    val -= 0x40000000;
  }
  temp = (g << (15)) + (1 << ((15) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((15) - 1);
    val -= temp;
  }
  temp = (g << (14)) + (1 << ((14) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((14) - 1);
    val -= temp;
  }
  temp = (g << (13)) + (1 << ((13) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((13) - 1);
    val -= temp;
  }
  temp = (g << (12)) + (1 << ((12) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((12) - 1);
    val -= temp;
  }
  temp = (g << (11)) + (1 << ((11) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((11) - 1);
    val -= temp;
  }
  temp = (g << (10)) + (1 << ((10) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((10) - 1);
    val -= temp;
  }
  temp = (g << (9)) + (1 << ((9) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((9) - 1);
    val -= temp;
  }
  temp = (g << (8)) + (1 << ((8) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((8) - 1);
    val -= temp;
  }
  temp = (g << (7)) + (1 << ((7) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((7) - 1);
    val -= temp;
  }
  temp = (g << (6)) + (1 << ((6) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((6) - 1);
    val -= temp;
  }
  temp = (g << (5)) + (1 << ((5) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((5) - 1);
    val -= temp;
  }
  temp = (g << (4)) + (1 << ((4) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((4) - 1);
    val -= temp;
  }
  temp = (g << (3)) + (1 << ((3) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((3) - 1);
    val -= temp;
  }
  temp = (g << (2)) + (1 << ((2) * 2 - 2));
  if (val >= temp) {
    g += 1 << ((2) - 1);
    val -= temp;
  }
  temp = g + g + 1;
  if (val >= temp)
    g++;
  return g;
}


x86 assembly (clang, -O0):
<mborg_isqrt4>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0x10(%rbp)
cmpq   $0x40000000,-0x8(%rbp)
40
jb     1132 <mborg_isqrt4+0x32>
movl   $0x8000,-0x10(%rbp)
mov    -0x8(%rbp),%rax
sub    $0x40000000,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%eax
shl    $0xf,%eax
add    $0x10000000,%eax
mov    %eax,-0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
cmp    %rcx,%rax
jb     116b <mborg_isqrt4+0x6b>
mov    -0x10(%rbp),%eax
add    $0x4000,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,%ecx
mov    -0x8(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%eax
shl    $0xe,%eax
add    $0x4000000,%eax
mov    %eax,-0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
cmp    %rcx,%rax
jb     11a4 <mborg_isqrt4+0xa4>
mov    -0x10(%rbp),%eax
add    $0x2000,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,%ecx
mov    -0x8(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%eax
shl    $0xd,%eax
add    $0x1000000,%eax
mov    %eax,-0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
cmp    %rcx,%rax
jb     11dd <mborg_isqrt4+0xdd>
mov    -0x10(%rbp),%eax
add    $0x1000,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,%ecx
mov    -0x8(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%eax
shl    $0xc,%eax
add    $0x400000,%eax
mov    %eax,-0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
cmp    %rcx,%rax
jb     1216 <mborg_isqrt4+0x116>
mov    -0x10(%rbp),%eax
add    $0x800,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,%ecx
mov    -0x8(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%eax
shl    $0xb,%eax
add    $0x100000,%eax
mov    %eax,-0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
cmp    %rcx,%rax
jb     124f <mborg_isqrt4+0x14f>
mov    -0x10(%rbp),%eax
add    $0x400,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,%ecx
mov    -0x8(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%eax
shl    $0xa,%eax
add    $0x40000,%eax
mov    %eax,-0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
cmp    %rcx,%rax
jb     1288 <mborg_isqrt4+0x188>
mov    -0x10(%rbp),%eax
add    $0x200,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,%ecx
mov    -0x8(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%eax
shl    $0x9,%eax
add    $0x10000,%eax
mov    %eax,-0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
cmp    %rcx,%rax
jb     12c1 <mborg_isqrt4+0x1c1>
mov    -0x10(%rbp),%eax
add    $0x100,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,%ecx
mov    -0x8(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%eax
shl    $0x8,%eax
add    $0x4000,%eax
mov    %eax,-0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
cmp    %rcx,%rax
jb     12fa <mborg_isqrt4+0x1fa>
mov    -0x10(%rbp),%eax
add    $0x80,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,%ecx
mov    -0x8(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%eax
shl    $0x7,%eax
add    $0x1000,%eax
mov    %eax,-0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
cmp    %rcx,%rax
jb     1331 <mborg_isqrt4+0x231>
mov    -0x10(%rbp),%eax
add    $0x40,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,%ecx
mov    -0x8(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%eax
shl    $0x6,%eax
add    $0x400,%eax
mov    %eax,-0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
cmp    %rcx,%rax
jb     1368 <mborg_isqrt4+0x268>
mov    -0x10(%rbp),%eax
add    $0x20,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,%ecx
mov    -0x8(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%eax
shl    $0x5,%eax
add    $0x100,%eax
mov    %eax,-0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
cmp    %rcx,%rax
jb     139f <mborg_isqrt4+0x29f>
mov    -0x10(%rbp),%eax
add    $0x10,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,%ecx
mov    -0x8(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%eax
shl    $0x4,%eax
add    $0x40,%eax
mov    %eax,-0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
cmp    %rcx,%rax
jb     13d4 <mborg_isqrt4+0x2d4>
mov    -0x10(%rbp),%eax
add    $0x8,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,%ecx
mov    -0x8(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%eax
shl    $0x3,%eax
add    $0x10,%eax
mov    %eax,-0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
cmp    %rcx,%rax
jb     1409 <mborg_isqrt4+0x309>
mov    -0x10(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,%ecx
mov    -0x8(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%eax
shl    $0x2,%eax
add    $0x4,%eax
mov    %eax,-0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
cmp    %rcx,%rax
jb     143e <mborg_isqrt4+0x33e>
mov    -0x10(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,%ecx
mov    -0x8(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%eax
add    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
cmp    %rcx,%rax
jb     1463 <mborg_isqrt4+0x363>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<mborg_isqrt4>:
lea    -0x40000000(%rdi),%rcx
xor    %edx,%edx
cmp    $0x40000000,%rdi
setae  %dl
cmovb  %rdi,%rcx
mov    %edx,%esi
shl    $0xf,%esi
shl    $0x1e,%edx
or     $0x10000000,%edx
lea    0x4000(%rsi),%edi
xor    %eax,%eax
cmp    %rdx,%rcx
cmovb  %rax,%rdx
cmovb  %esi,%edi
sub    %rdx,%rcx
mov    %edi,%edx
shl    $0xe,%edx
or     $0x4000000,%edx
lea    0x2000(%rdi),%esi
cmp    %rdx,%rcx
cmovb  %rax,%rdx
cmovb  %edi,%esi
sub    %rdx,%rcx
mov    %esi,%edx
shl    $0xd,%edx
or     $0x1000000,%edx
cmp    %rdx,%rcx
cmovb  %rax,%rdx
lea    0x1000(%rsi),%edi
cmovb  %esi,%edi
sub    %rdx,%rcx
mov    %edi,%edx
shl    $0xc,%edx
add    $0x400000,%edx
lea    0x800(%rdi),%esi
cmp    %rdx,%rcx
cmovb  %rax,%rdx
cmovb  %edi,%esi
sub    %rdx,%rcx
mov    %esi,%edx
shl    $0xb,%edx
add    $0x100000,%edx
lea    0x400(%rsi),%edi
cmp    %rdx,%rcx
cmovb  %rax,%rdx
cmovb  %esi,%edi
sub    %rdx,%rcx
mov    %edi,%edx
shl    $0xa,%edx
add    $0x40000,%edx
cmp    %rdx,%rcx
cmovb  %rax,%rdx
lea    0x200(%rdi),%esi
cmovb  %edi,%esi
sub    %rdx,%rcx
mov    %esi,%edx
shl    $0x9,%edx
add    $0x10000,%edx
lea    0x100(%rsi),%edi
cmp    %rdx,%rcx
cmovb  %rax,%rdx
cmovb  %esi,%edi
sub    %rdx,%rcx
mov    %edi,%edx
shl    $0x8,%edx
add    $0x4000,%edx
lea    0x80(%rdi),%esi
cmp    %rdx,%rcx
cmovb  %rax,%rdx
cmovb  %edi,%esi
sub    %rdx,%rcx
mov    %esi,%edx
shl    $0x7,%edx
add    $0x1000,%edx
cmp    %rdx,%rcx
cmovb  %rax,%rdx
lea    0x40(%rsi),%edi
cmovb  %esi,%edi
sub    %rdx,%rcx
mov    %edi,%edx
shl    $0x6,%edx
add    $0x400,%edx
lea    0x20(%rdi),%esi
cmp    %rdx,%rcx
cmovb  %rax,%rdx
cmovb  %edi,%esi
sub    %rdx,%rcx
mov    %esi,%edx
shl    $0x5,%edx
add    $0x100,%edx
lea    0x10(%rsi),%edi
cmp    %rdx,%rcx
cmovb  %rax,%rdx
cmovb  %esi,%edi
sub    %rdx,%rcx
mov    %edi,%edx
shl    $0x4,%edx
add    $0x40,%edx
cmp    %rdx,%rcx
cmovb  %rax,%rdx
lea    0x8(%rdi),%esi
cmovb  %edi,%esi
sub    %rdx,%rcx
lea    0x10(,%rsi,8),%edx
cmp    %rdx,%rcx
cmovb  %rax,%rdx
lea    0x4(%rsi),%edi
cmovb  %esi,%edi
sub    %rdx,%rcx
lea    0x4(,%rdi,4),%edx
cmp    %rdx,%rcx
cmovb  %rax,%rdx
lea    0x2(%rdi),%eax
cmovb  %edi,%eax
sub    %rdx,%rcx
lea    (%rax,%rax,1),%edx
add    $0x1,%edx
cmp    %rdx,%rcx
sbb    $0xffffffff,%eax
ret

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

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