double sqrt(double x) {
  double mod = 1, n = 0;
  if (x >= 0) {
    while (n * n != x) {
      if (n * n > x) {
        n -= mod;
        mod /= 10;
      } else {
        n += mod;
      }
    }
  }
  return n;
}


x86 assembly (clang, -O0):
<sqrt>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  0xeef(%rip),%xmm0
movsd  %xmm0,-0x10(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     11b1 <sqrt+0xb1>
jmp    1135 <sqrt+0x35>
movsd  -0x18(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
ucomisd -0x8(%rbp),%xmm0
jne    1155 <sqrt+0x55>
jp     1155 <sqrt+0x55>
jmp    11ac <sqrt+0xac>
movsd  -0x18(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
ucomisd -0x8(%rbp),%xmm0
jbe    1198 <sqrt+0x98>
movsd  -0x10(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  0xe7e(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    11a7 <sqrt+0xa7>
movsd  -0x10(%rbp),%xmm0
addsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
jmp    1135 <sqrt+0x35>
jmp    11b1 <sqrt+0xb1>
movsd  -0x18(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<sqrt>:
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1154 <sqrt+0x54>
movsd  0xeee(%rip),%xmm2
xorpd  %xmm4,%xmm4
movsd  0xeea(%rip),%xmm3
xorpd  %xmm1,%xmm1
jmp    1144 <sqrt+0x44>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
addsd  %xmm2,%xmm1
movapd %xmm1,%xmm4
mulsd  %xmm1,%xmm4
ucomisd %xmm0,%xmm4
jne    1144 <sqrt+0x44>
jnp    1154 <sqrt+0x54>
ucomisd %xmm0,%xmm4
jbe    1130 <sqrt+0x30>
subsd  %xmm2,%xmm1
divsd  %xmm3,%xmm2
jmp    1134 <sqrt+0x34>
movapd %xmm1,%xmm0
ret

LLVM IR (-O0):
define double @sqrt(double %0) {
%2 = alloca double
%3 = alloca double
%4 = alloca double
store double %0, double* %2
store double 1.000000e+00, double* %3
store double 0.000000e+00, double* %4
%5 = load double, double* %2
%6 = fcmp oge double %5, 0.000000e+00
br i1 %6, label %7, label %32
7: ; preds = %1
br label %8
8: ; preds = %30, %7
%9 = load double, double* %4
%10 = load double, double* %4
%11 = fmul double %9, %10
%12 = load double, double* %2
%13 = fcmp une double %11, %12
br i1 %13, label %14, label %31
14: ; preds = %8
%15 = load double, double* %4
%16 = load double, double* %4
%17 = fmul double %15, %16
%18 = load double, double* %2
%19 = fcmp ogt double %17, %18
br i1 %19, label %20, label %26
20: ; preds = %14
%21 = load double, double* %3
%22 = load double, double* %4
%23 = fsub double %22, %21
store double %23, double* %4
%24 = load double, double* %3
%25 = fdiv double %24, 1.000000e+01
store double %25, double* %3
br label %30
26: ; preds = %14
%27 = load double, double* %3
%28 = load double, double* %4
%29 = fadd double %28, %27
store double %29, double* %4
br label %30
30: ; preds = %26, %20
br label %8
31: ; preds = %8
br label %32
32: ; preds = %31, %1
%33 = load double, double* %4
ret double %33
}

LLVM IR (-O2):
define double @sqrt(double %0) {
%2 = fcmp ogt double %0, 0.000000e+00
br i1 %2, label %3, label %18
3: ; preds = %1, %13
%4 = phi double [ %16, %13 ], [ 0.000000e+00, %1 ]
%5 = phi double [ %15, %13 ], [ 0.000000e+00, %1 ]
%6 = phi double [ %14, %13 ], [ 1.000000e+00, %1 ]
%7 = fcmp ogt double %4, %0
br i1 %7, label %8, label %11
8: ; preds = %3
%9 = fsub double %5, %6
%10 = fdiv double %6, 1.000000e+01
br label %13
11: ; preds = %3
%12 = fadd double %6, %5
br label %13
13: ; preds = %11, %8
%14 = phi double [ %10, %8 ], [ %6, %11 ]
%15 = phi double [ %9, %8 ], [ %12, %11 ]
%16 = fmul double %15, %15
%17 = fcmp une double %16, %0
br i1 %17, label %3, label %18
18: ; preds = %13, %1
%19 = phi double [ 0.000000e+00, %1 ], [ %15, %13 ]
ret double %19
}