float sqrt(val)
float val;
{
  float x = val / 10;
  float dx;
  double diff;
  double min_tol = 0.00001;
  int i, flag;
  flag = 0;
  if (val == 0)
    x = 0;
  else {
    for (i = 1; i < 20; i++) {
      if (!flag) {
        dx = (val - (x * x)) / (2.0 * x);
        x = x + dx;
        diff = val - (x * x);
        if (fabs(diff) <= min_tol)
          flag = 1;
      } else
        x = x;
    }
  }
  return (x);
}


x86 assembly (clang, -O0):
<sqrt>:
push   %rbp
mov    %rsp,%rbp
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
movss  0xef6(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x8(%rbp)
movsd  0xed5(%rip),%xmm0
movsd  %xmm0,-0x20(%rbp)
movl   $0x0,-0x28(%rbp)
movss  -0x4(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    115b <sqrt+0x5b>
jp     115b <sqrt+0x5b>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    1249 <sqrt+0x149>
movl   $0x1,-0x24(%rbp)
cmpl   $0x14,-0x24(%rbp)
jge    1244 <sqrt+0x144>
cmpl   $0x0,-0x28(%rbp)
jne    1227 <sqrt+0x127>
movss  -0x4(%rbp),%xmm1
movss  -0x8(%rbp),%xmm0
movss  -0x8(%rbp),%xmm2
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x8(%rbp),%xmm1
cvtss2sd %xmm1,%xmm2
movsd  0xe59(%rip),%xmm1
mulsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0xc(%rbp)
movss  -0x8(%rbp),%xmm0
addss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x8(%rbp)
movss  -0x4(%rbp),%xmm1
movss  -0x8(%rbp),%xmm0
movss  -0x8(%rbp),%xmm2
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x18(%rbp),%xmm1
movaps 0xe18(%rip),%xmm0
pand   %xmm0,%xmm1
movsd  -0x20(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jb     1222 <sqrt+0x122>
movl   $0x1,-0x28(%rbp)
jmp    1231 <sqrt+0x131>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x8(%rbp)
jmp    1236 <sqrt+0x136>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1162 <sqrt+0x62>
jmp    1249 <sqrt+0x149>
movss  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<sqrt>:
cvtsd2ss %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm1
jne    110f <sqrt+0xf>
jp     110f <sqrt+0xf>
ret
movaps %xmm1,%xmm4
divss  0xee6(%rip),%xmm4
xor    %ecx,%ecx
mov    $0x13,%eax
movaps 0xee8(%rip),%xmm2
movsd  0xef0(%rip),%xmm3
jmp    114b <sqrt+0x4b>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movaps %xmm4,%xmm0
movaps %xmm0,%xmm4
add    $0xffffffff,%eax
je     110e <sqrt+0xe>
mov    %ecx,%edx
mov    $0x1,%ecx
test   %edx,%edx
jne    1140 <sqrt+0x40>
movaps %xmm4,%xmm0
mulss  %xmm4,%xmm0
movaps %xmm1,%xmm5
subss  %xmm0,%xmm5
xorps  %xmm0,%xmm0
cvtss2sd %xmm5,%xmm0
xorps  %xmm5,%xmm5
cvtss2sd %xmm4,%xmm5
addsd  %xmm5,%xmm5
divsd  %xmm5,%xmm0
cvtsd2ss %xmm0,%xmm0
addss  %xmm4,%xmm0
movaps %xmm0,%xmm4
mulss  %xmm0,%xmm4
movaps %xmm1,%xmm5
subss  %xmm4,%xmm5
andps  %xmm2,%xmm5
xorps  %xmm4,%xmm4
cvtss2sd %xmm5,%xmm4
ucomisd %xmm4,%xmm3
jae    1143 <sqrt+0x43>
xor    %ecx,%ecx
jmp    1143 <sqrt+0x43>

LLVM IR (-O0):
define float @sqrt(double %0) {
%2 = alloca float
%3 = alloca float
%4 = alloca float
%5 = alloca double
%6 = alloca double
%7 = alloca i32
%8 = alloca i32
%9 = fptrunc double %0 to float
store float %9, float* %2
%10 = load float, float* %2
%11 = fdiv float %10, 1.000000e+01
store float %11, float* %3
store double 1.000000e-05, double* %6
store i32 0, i32* %8
%12 = load float, float* %2
%13 = fcmp oeq float %12, 0.000000e+00
br i1 %13, label %14, label %15
14: ; preds = %1
store float 0.000000e+00, float* %3
br label %56
15: ; preds = %1
store i32 1, i32* %7
br label %16
16: ; preds = %52, %15
%17 = load i32, i32* %7
%18 = icmp slt i32 %17, 20
br i1 %18, label %19, label %55
19: ; preds = %16
%20 = load i32, i32* %8
%21 = icmp ne i32 %20, 0
br i1 %21, label %49, label %22
22: ; preds = %19
%23 = load float, float* %2
%24 = load float, float* %3
%25 = load float, float* %3
%26 = fneg float %24
%27 = call float @llvm.fmuladd.f32(float %26, float %25, float %23)
%28 = fpext float %27 to double
%29 = load float, float* %3
%30 = fpext float %29 to double
%31 = fmul double 2.000000e+00, %30
%32 = fdiv double %28, %31
%33 = fptrunc double %32 to float
store float %33, float* %4
%34 = load float, float* %3
%35 = load float, float* %4
%36 = fadd float %34, %35
store float %36, float* %3
%37 = load float, float* %2
%38 = load float, float* %3
%39 = load float, float* %3
%40 = fneg float %38
%41 = call float @llvm.fmuladd.f32(float %40, float %39, float %37)
%42 = fpext float %41 to double
store double %42, double* %5
%43 = load double, double* %5
%44 = call double @llvm.fabs.f64(double %43)
%45 = load double, double* %6
%46 = fcmp ole double %44, %45
br i1 %46, label %47, label %48
47: ; preds = %22
store i32 1, i32* %8
br label %48
48: ; preds = %47, %22
br label %51
49: ; preds = %19
%50 = load float, float* %3
store float %50, float* %3
br label %51
51: ; preds = %49, %48
br label %52
52: ; preds = %51
%53 = load i32, i32* %7
%54 = add nsw i32 %53, 1
store i32 %54, i32* %7
br label %16
55: ; preds = %16
br label %56
56: ; preds = %55, %14
%57 = load float, float* %3
ret float %57
}

LLVM IR (-O2):
define float @sqrt(double %0) {
%2 = fptrunc double %0 to float
%3 = fcmp oeq float %2, 0.000000e+00
br i1 %3, label %31, label %4
4: ; preds = %1
%5 = fdiv float %2, 1.000000e+01
br label %6
6: ; preds = %4, %26
%7 = phi i32 [ 0, %4 ], [ %28, %26 ]
%8 = phi i32 [ 1, %4 ], [ %29, %26 ]
%9 = phi float [ %5, %4 ], [ %27, %26 ]
%10 = icmp eq i32 %7, 0
br i1 %10, label %11, label %26
11: ; preds = %6
%12 = fneg float %9
%13 = tail call float @llvm.fmuladd.f32(float %12, float %9, float %2)
%14 = fpext float %13 to double
%15 = fpext float %9 to double
%16 = fmul double %15, 2.000000e+00
%17 = fdiv double %14, %16
%18 = fptrunc double %17 to float
%19 = fadd float %9, %18
%20 = fneg float %19
%21 = tail call float @llvm.fmuladd.f32(float %20, float %19, float %2)
%22 = tail call float @llvm.fabs.f32(float %21)
%23 = fpext float %22 to double
%24 = fcmp ugt double %23, 1.000000e-05
br i1 %24, label %26, label %25
25: ; preds = %11
br label %26
26: ; preds = %6, %25, %11
%27 = phi float [ %19, %25 ], [ %19, %11 ], [ %9, %6 ]
%28 = phi i32 [ 1, %25 ], [ 0, %11 ], [ 1, %6 ]
%29 = add nuw nsw i32 %8, 1
%30 = icmp eq i32 %29, 20
br i1 %30, label %31, label %6
31: ; preds = %26, %1
%32 = phi float [ 0.000000e+00, %1 ], [ %27, %26 ]
ret float %32
}