double sqrt(x)
double x;
{
  double og, ng;
  short niter;
  int exp;
  if (x <= 0.0)
    return 0.0;
  og = x;
  if (og < 1.0)
    og = 1.0 / og;
  og = frexp(og, &exp);
  og = ldexp(og, exp / 2);
  if (x < 1.0)
    og = 1.0 / og;
  for (niter = 0; niter < 20; niter++) {
    ng = (x / og + og) / 2.0;
    if (ng == og)
      break;
    og = ng;
  }
  return og;
}


x86 assembly (clang, -O0):
<sqrt>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
movsd  %xmm0,-0x10(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x10(%rbp),%xmm0
jb     1148 <sqrt+0x28>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    123e <sqrt+0x11e>
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  0xea6(%rip),%xmm0
ucomisd -0x18(%rbp),%xmm0
jbe    1177 <sqrt+0x57>
movsd  0xe93(%rip),%xmm0
divsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x18(%rbp),%xmm0
lea    -0x28(%rbp),%rdi
call   1040 <frexp@plt>
movsd  %xmm0,-0x18(%rbp)
movsd  -0x18(%rbp),%xmm0
mov    -0x28(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%edi
call   1030 <ldexp@plt>
movsd  %xmm0,-0x18(%rbp)
movsd  0xe52(%rip),%xmm0
ucomisd -0x10(%rbp),%xmm0
jbe    11cb <sqrt+0xab>
movsd  0xe3f(%rip),%xmm0
divsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
movw   $0x0,-0x22(%rbp)
movswl -0x22(%rbp),%eax
cmp    $0x14,%eax
jge    1234 <sqrt+0x114>
movsd  -0x10(%rbp),%xmm0
divsd  -0x18(%rbp),%xmm0
addsd  -0x18(%rbp),%xmm0
movsd  0xe13(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x20(%rbp),%xmm0
ucomisd -0x18(%rbp),%xmm0
jne    1219 <sqrt+0xf9>
jp     1219 <sqrt+0xf9>
jmp    1234 <sqrt+0x114>
movsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
mov    -0x22(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x22(%rbp)
jmp    11d1 <sqrt+0xb1>
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<sqrt>:
xorpd  %xmm1,%xmm1
ucomisd %xmm0,%xmm1
jae    11f2 <sqrt+0xd2>
sub    $0x28,%rsp
movapd %xmm0,%xmm2
movsd  0xec2(%rip),%xmm3
movapd %xmm3,%xmm1
divsd  %xmm0,%xmm1
cmpltsd %xmm3,%xmm0
andpd  %xmm0,%xmm1
andnpd %xmm2,%xmm0
orpd   %xmm1,%xmm0
lea    0xc(%rsp),%rdi
movapd %xmm2,0x10(%rsp)
call   1040 <frexp@plt>
mov    0xc(%rsp),%eax
mov    %eax,%edi
shr    $0x1f,%edi
add    %eax,%edi
sar    %edi
call   1030 <ldexp@plt>
movsd  0xe7f(%rip),%xmm1
movapd 0x10(%rsp),%xmm4
ucomisd %xmm4,%xmm1
jbe    1195 <sqrt+0x75>
divsd  %xmm0,%xmm1
movapd %xmm1,%xmm0
mov    $0x14,%ax
movsd  0xe67(%rip),%xmm2
add    $0x28,%rsp
cs nopw 0x0(%rax,%rax,1)
nop
movapd %xmm4,%xmm3
divsd  %xmm0,%xmm3
addsd  %xmm0,%xmm3
mulsd  %xmm2,%xmm3
ucomisd %xmm0,%xmm3
movapd %xmm0,%xmm1
jne    11cc <sqrt+0xac>
jnp    11f2 <sqrt+0xd2>
movapd %xmm4,%xmm0
divsd  %xmm3,%xmm0
addsd  %xmm3,%xmm0
mulsd  %xmm2,%xmm0
ucomisd %xmm3,%xmm0
movapd %xmm3,%xmm1
jne    11e8 <sqrt+0xc8>
jnp    11f2 <sqrt+0xd2>
movapd %xmm0,%xmm1
add    $0xfffe,%ax
jne    11b0 <sqrt+0x90>
movapd %xmm1,%xmm0
ret

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

LLVM IR (-O2):
define double @sqrt(double %0) {
%2 = alloca i32
%3 = bitcast i32* %2 to i8*
%4 = fcmp ugt double %0, 0.000000e+00
br i1 %4, label %5, label %30
5: ; preds = %1
%6 = fcmp olt double %0, 1.000000e+00
%7 = fdiv double 1.000000e+00, %0
%8 = select i1 %6, double %7, double %0
%9 = call double @frexp(double %8, i32* %2)
%10 = load i32, i32* %2
%11 = sdiv i32 %10, 2
%12 = tail call double @ldexp(double %9, i32 %11)
%13 = fdiv double 1.000000e+00, %12
%14 = select i1 %6, double %13, double %12
br label %23
15: ; preds = %23
%16 = fdiv double %0, %28
%17 = fadd double %28, %16
%18 = fmul double %17, 5.000000e-01
%19 = fcmp oeq double %18, %28
br i1 %19, label %30, label %20
20: ; preds = %15
%21 = add nuw nsw i16 %24, 2
%22 = icmp eq i16 %21, 20
br i1 %22, label %30, label %23
23: ; preds = %20, %5
%24 = phi i16 [ 0, %5 ], [ %21, %20 ]
%25 = phi double [ %14, %5 ], [ %18, %20 ]
%26 = fdiv double %0, %25
%27 = fadd double %25, %26
%28 = fmul double %27, 5.000000e-01
%29 = fcmp oeq double %28, %25
br i1 %29, label %30, label %15
30: ; preds = %23, %15, %20, %1
%31 = phi double [ 0.000000e+00, %1 ], [ %25, %23 ], [ %28, %15 ], [ %18, %20 ]
ret double %31
}