float my_sqrt(float x) {
  float error = 0.000001;
  float guess = 0;
  if (x > 2) {
    guess = x / 2;
    while (guess * guess - x > error) {
      guess = guess - (((guess * guess) - x) / (2 * guess));
    }
  } else {
    guess = x / 2;
    float quotient = x / guess;
    float average = (quotient + guess) / 2;
    while ((average * average - x) > error) {
      guess = average;
      quotient = x / guess;
      average = (quotient + guess) / 2;
    }
    guess = average;
  }
  return guess;
}


x86 assembly (clang, -O0):
<my_sqrt>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
movss  0xef3(%rip),%xmm0
movss  %xmm0,-0x8(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0xc(%rbp)
movss  -0x4(%rbp),%xmm0
movss  0xed5(%rip),%xmm1
ucomiss %xmm1,%xmm0
jbe    11c5 <my_sqrt+0xc5>
movss  -0x4(%rbp),%xmm0
movss  0xebf(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0xc(%rbp)
movss  -0xc(%rbp),%xmm0
movss  -0xc(%rbp),%xmm2
movss  -0x4(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    11c0 <my_sqrt+0xc0>
movss  -0xc(%rbp),%xmm0
movss  -0xc(%rbp),%xmm1
movss  -0xc(%rbp),%xmm3
movss  -0x4(%rbp),%xmm2
movd   %xmm2,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm2
mulss  %xmm3,%xmm1
addss  %xmm2,%xmm1
movss  0xe57(%rip),%xmm2
mulss  -0xc(%rbp),%xmm2
divss  %xmm2,%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0xc(%rbp)
jmp    114a <my_sqrt+0x4a>
jmp    1276 <my_sqrt+0x176>
movss  -0x4(%rbp),%xmm0
movss  0xe2e(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0xc(%rbp)
movss  -0x4(%rbp),%xmm0
divss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
addss  -0xc(%rbp),%xmm0
movss  0xe04(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x14(%rbp),%xmm0
movss  -0x14(%rbp),%xmm2
movss  -0x4(%rbp),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    126c <my_sqrt+0x16c>
movss  -0x14(%rbp),%xmm0
movss  %xmm0,-0xc(%rbp)
movss  -0x4(%rbp),%xmm0
divss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
addss  -0xc(%rbp),%xmm0
movss  0xda2(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x14(%rbp)
jmp    1205 <my_sqrt+0x105>
movss  -0x14(%rbp),%xmm0
movss  %xmm0,-0xc(%rbp)
movss  -0xc(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<my_sqrt>:
ucomiss 0xef9(%rip),%xmm0
movss  0xef5(%rip),%xmm1
mulss  %xmm0,%xmm1
jbe    1161 <my_sqrt+0x61>
movaps %xmm1,%xmm2
mulss  %xmm1,%xmm2
subss  %xmm0,%xmm2
ucomiss 0xee1(%rip),%xmm2
jbe    11d2 <my_sqrt+0xd2>
xorps  0xedc(%rip),%xmm0
movss  0xecc(%rip),%xmm3
nopl   0x0(%rax)
movaps %xmm1,%xmm4
addss  %xmm1,%xmm4
divss  %xmm4,%xmm2
subss  %xmm2,%xmm1
movaps %xmm1,%xmm2
mulss  %xmm1,%xmm2
addss  %xmm0,%xmm2
ucomiss %xmm3,%xmm2
ja     1140 <my_sqrt+0x40>
jmp    11d2 <my_sqrt+0xd2>
movaps %xmm0,%xmm2
divss  %xmm1,%xmm2
addss  %xmm1,%xmm2
mulss  0xe90(%rip),%xmm2
movaps %xmm2,%xmm1
mulss  %xmm2,%xmm1
subss  %xmm0,%xmm1
ucomiss 0xe82(%rip),%xmm1
jbe    11d6 <my_sqrt+0xd6>
movaps 0xe81(%rip),%xmm3
xorps  %xmm0,%xmm3
movss  0xe6a(%rip),%xmm4
movss  0xe66(%rip),%xmm5
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movaps %xmm0,%xmm1
divss  %xmm2,%xmm1
addss  %xmm2,%xmm1
mulss  %xmm4,%xmm1
movaps %xmm1,%xmm2
mulss  %xmm1,%xmm2
addss  %xmm3,%xmm2
ucomiss %xmm5,%xmm2
movaps %xmm1,%xmm2
ja     11b0 <my_sqrt+0xb0>
movaps %xmm1,%xmm0
ret
movaps %xmm2,%xmm0
ret

LLVM IR (-O0):
define float @my_sqrt(float %0) {
%2 = alloca float
%3 = alloca float
%4 = alloca float
%5 = alloca float
%6 = alloca float
store float %0, float* %2
store float 0x3EB0C6F7A0000000, float* %3
store float 0.000000e+00, float* %4
%7 = load float, float* %2
%8 = fcmp ogt float %7, 2.000000e+00
br i1 %8, label %9, label %32
9: ; preds = %1
%10 = load float, float* %2
%11 = fdiv float %10, 2.000000e+00
store float %11, float* %4
br label %12
12: ; preds = %20, %9
%13 = load float, float* %4
%14 = load float, float* %4
%15 = load float, float* %2
%16 = fneg float %15
%17 = call float @llvm.fmuladd.f32(float %13, float %14, float %16)
%18 = load float, float* %3
%19 = fcmp ogt float %17, %18
br i1 %19, label %20, label %31
20: ; preds = %12
%21 = load float, float* %4
%22 = load float, float* %4
%23 = load float, float* %4
%24 = load float, float* %2
%25 = fneg float %24
%26 = call float @llvm.fmuladd.f32(float %22, float %23, float %25)
%27 = load float, float* %4
%28 = fmul float 2.000000e+00, %27
%29 = fdiv float %26, %28
%30 = fsub float %21, %29
store float %30, float* %4
br label %12
31: ; preds = %12
br label %61
32: ; preds = %1
%33 = load float, float* %2
%34 = fdiv float %33, 2.000000e+00
store float %34, float* %4
%35 = load float, float* %2
%36 = load float, float* %4
%37 = fdiv float %35, %36
store float %37, float* %5
%38 = load float, float* %5
%39 = load float, float* %4
%40 = fadd float %38, %39
%41 = fdiv float %40, 2.000000e+00
store float %41, float* %6
br label %42
42: ; preds = %50, %32
%43 = load float, float* %6
%44 = load float, float* %6
%45 = load float, float* %2
%46 = fneg float %45
%47 = call float @llvm.fmuladd.f32(float %43, float %44, float %46)
%48 = load float, float* %3
%49 = fcmp ogt float %47, %48
br i1 %49, label %50, label %59
50: ; preds = %42
%51 = load float, float* %6
store float %51, float* %4
%52 = load float, float* %2
%53 = load float, float* %4
%54 = fdiv float %52, %53
store float %54, float* %5
%55 = load float, float* %5
%56 = load float, float* %4
%57 = fadd float %55, %56
%58 = fdiv float %57, 2.000000e+00
store float %58, float* %6
br label %42
59: ; preds = %42
%60 = load float, float* %6
store float %60, float* %4
br label %61
61: ; preds = %59, %31
%62 = load float, float* %4
ret float %62
}

LLVM IR (-O2):
define float @my_sqrt(float %0) {
%2 = fcmp ogt float %0, 2.000000e+00
%3 = fmul float %0, 5.000000e-01
br i1 %2, label %4, label %16
4: ; preds = %1
%5 = fneg float %0
%6 = tail call float @llvm.fmuladd.f32(float %3, float %3, float %5)
%7 = fcmp ogt float %6, 0x3EB0C6F7A0000000
br i1 %7, label %8, label %30
8: ; preds = %4, %8
%9 = phi float [ %14, %8 ], [ %6, %4 ]
%10 = phi float [ %13, %8 ], [ %3, %4 ]
%11 = fmul float %10, 2.000000e+00
%12 = fdiv float %9, %11
%13 = fsub float %10, %12
%14 = tail call float @llvm.fmuladd.f32(float %13, float %13, float %5)
%15 = fcmp ogt float %14, 0x3EB0C6F7A0000000
br i1 %15, label %8, label %30
16: ; preds = %1
%17 = fdiv float %0, %3
%18 = fadd float %3, %17
%19 = fneg float %0
%20 = fmul float %18, 5.000000e-01
%21 = tail call float @llvm.fmuladd.f32(float %20, float %20, float %19)
%22 = fcmp ogt float %21, 0x3EB0C6F7A0000000
br i1 %22, label %23, label %30
23: ; preds = %16, %23
%24 = phi float [ %27, %23 ], [ %20, %16 ]
%25 = fdiv float %0, %24
%26 = fadd float %24, %25
%27 = fmul float %26, 5.000000e-01
%28 = tail call float @llvm.fmuladd.f32(float %27, float %27, float %19)
%29 = fcmp ogt float %28, 0x3EB0C6F7A0000000
br i1 %29, label %23, label %30
30: ; preds = %23, %8, %16, %4
%31 = phi float [ %3, %4 ], [ %20, %16 ], [ %13, %8 ], [ %27, %23 ]
ret float %31
}