int sqrti(int i) {
  int s = 0;
  int t = 1 << 30;
  while (t) {
    s |= t;
    if (s <= i) {
      i -= s;
      s += t;
    } else
      s -= t;
    s >>= 1;
    t >>= 2;
  }
  return (s);
}


x86 assembly (clang, -O0):
<sqrti>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
movl   $0x0,-0x8(%rbp)
movl   $0x40000000,-0xc(%rbp)
cmpl   $0x0,-0xc(%rbp)
je     116f <sqrti+0x6f>
mov    -0xc(%rbp),%eax
or     -0x8(%rbp),%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
cmp    -0x4(%rbp),%eax
jg     114d <sqrti+0x4d>
mov    -0x8(%rbp),%ecx
mov    -0x4(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0xc(%rbp),%eax
add    -0x8(%rbp),%eax
mov    %eax,-0x8(%rbp)
jmp    1158 <sqrti+0x58>
mov    -0xc(%rbp),%ecx
mov    -0x8(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0xc(%rbp),%eax
sar    $0x2,%eax
mov    %eax,-0xc(%rbp)
jmp    1115 <sqrti+0x15>
mov    -0x8(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<sqrti>:
xor    %edx,%edx
cmp    $0x40000000,%edi
setl   %dl
shl    $0x1e,%edx
lea    (%rdx,%rdi,1),%eax
add    $0xc0000000,%eax
mov    %edx,%esi
add    $0xd0000000,%esi
xor    %ecx,%ecx
xor    %edi,%edi
cmp    %esi,%eax
setge  %dil
cmovl  %ecx,%esi
sub    %esi,%eax
shl    $0x1d,%edi
add    %edi,%edx
add    $0xc0000000,%edx
sar    %edx
lea    0x4000000(%rdx),%esi
xor    %edi,%edi
cmp    %esi,%eax
setge  %dil
cmovl  %ecx,%esi
sub    %esi,%eax
shl    $0x1b,%edi
add    %edi,%edx
add    $0x4000000,%edx
add    $0xfc000000,%edx
sar    %edx
or     $0x1000000,%edx
xor    %esi,%esi
cmp    %edx,%eax
mov    %edx,%edi
cmovl  %ecx,%edi
setge  %sil
sub    %edi,%eax
shl    $0x19,%esi
add    %esi,%edx
add    $0xff000000,%edx
sar    %edx
or     $0x400000,%edx
xor    %esi,%esi
cmp    %edx,%eax
setge  %sil
mov    %edx,%edi
cmovl  %ecx,%edi
sub    %edi,%eax
shl    $0x17,%esi
add    %esi,%edx
add    $0xffc00000,%edx
sar    %edx
or     $0x100000,%edx
xor    %esi,%esi
cmp    %edx,%eax
mov    %edx,%edi
cmovl  %ecx,%edi
setge  %sil
sub    %edi,%eax
shl    $0x15,%esi
add    %esi,%edx
add    $0xfff00000,%edx
sar    %edx
or     $0x40000,%edx
xor    %esi,%esi
cmp    %edx,%eax
setge  %sil
mov    %edx,%edi
cmovl  %ecx,%edi
sub    %edi,%eax
shl    $0x13,%esi
add    %esi,%edx
add    $0xfffc0000,%edx
sar    %edx
or     $0x10000,%edx
xor    %esi,%esi
cmp    %edx,%eax
mov    %edx,%edi
cmovl  %ecx,%edi
setge  %sil
sub    %edi,%eax
shl    $0x11,%esi
add    %esi,%edx
add    $0xffff0000,%edx
sar    %edx
or     $0x4000,%edx
xor    %esi,%esi
cmp    %edx,%eax
setge  %sil
mov    %edx,%edi
cmovl  %ecx,%edi
sub    %edi,%eax
shl    $0xf,%esi
add    %esi,%edx
add    $0xffffc000,%edx
sar    %edx
or     $0x1000,%edx
xor    %esi,%esi
cmp    %edx,%eax
mov    %edx,%edi
cmovl  %ecx,%edi
setge  %sil
sub    %edi,%eax
shl    $0xd,%esi
add    %esi,%edx
add    $0xfffff000,%edx
sar    %edx
or     $0x400,%edx
xor    %esi,%esi
cmp    %edx,%eax
setge  %sil
mov    %edx,%edi
cmovl  %ecx,%edi
sub    %edi,%eax
shl    $0xb,%esi
add    %esi,%edx
add    $0xfffffc00,%edx
sar    %edx
or     $0x100,%edx
xor    %esi,%esi
cmp    %edx,%eax
mov    %edx,%edi
cmovl  %ecx,%edi
setge  %sil
sub    %edi,%eax
shl    $0x9,%esi
add    %esi,%edx
add    $0xffffff00,%edx
sar    %edx
or     $0x40,%edx
xor    %esi,%esi
cmp    %edx,%eax
setge  %sil
mov    %edx,%edi
cmovl  %ecx,%edi
sub    %edi,%eax
shl    $0x7,%esi
add    %esi,%edx
add    $0xffffffc0,%edx
sar    %edx
or     $0x10,%edx
xor    %esi,%esi
cmp    %edx,%eax
mov    %edx,%edi
cmovl  %ecx,%edi
setge  %sil
sub    %edi,%eax
shl    $0x5,%esi
add    %esi,%edx
add    $0xfffffff0,%edx
sar    %edx
or     $0x4,%edx
xor    %esi,%esi
cmp    %edx,%eax
setge  %sil
cmovge %edx,%ecx
sub    %ecx,%eax
lea    (%rdx,%rsi,8),%ecx
add    $0xfffffffc,%ecx
sar    %ecx
or     $0x1,%ecx
xor    %edx,%edx
cmp    %ecx,%eax
setge  %dl
lea    (%rcx,%rdx,2),%eax
add    $0xffffffff,%eax
sar    %eax
ret

LLVM IR (-O0):
define i32 @sqrti(i32 %0) {
%2 = alloca i32
%3 = alloca i32
%4 = alloca i32
store i32 %0, i32* %2
store i32 0, i32* %3
store i32 1073741824, i32* %4
br label %5
5: ; preds = %26, %1
%6 = load i32, i32* %4
%7 = icmp ne i32 %6, 0
br i1 %7, label %8, label %31
8: ; preds = %5
%9 = load i32, i32* %4
%10 = load i32, i32* %3
%11 = or i32 %10, %9
store i32 %11, i32* %3
%12 = load i32, i32* %3
%13 = load i32, i32* %2
%14 = icmp sle i32 %12, %13
br i1 %14, label %15, label %22
15: ; preds = %8
%16 = load i32, i32* %3
%17 = load i32, i32* %2
%18 = sub nsw i32 %17, %16
store i32 %18, i32* %2
%19 = load i32, i32* %4
%20 = load i32, i32* %3
%21 = add nsw i32 %20, %19
store i32 %21, i32* %3
br label %26
22: ; preds = %8
%23 = load i32, i32* %4
%24 = load i32, i32* %3
%25 = sub nsw i32 %24, %23
store i32 %25, i32* %3
br label %26
26: ; preds = %22, %15
%27 = load i32, i32* %3
%28 = ashr i32 %27, 1
store i32 %28, i32* %3
%29 = load i32, i32* %4
%30 = ashr i32 %29, 2
store i32 %30, i32* %4
br label %5
31: ; preds = %5
%32 = load i32, i32* %3
ret i32 %32
}

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