double mySQRT(double x) {
  double px, a;
  a = px = x;
  x /= 2.0;
  while ((((x - px) < 0) ? -(x - px) : (x - px)) > 1.e-19) {
    px = x;
    x = (px + a / px) / 2;
  }
  return x;
}


x86 assembly (clang, -O0):
<mySQRT>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm0,-0x18(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  0xedb(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm1
subsd  -0x10(%rbp),%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    1170 <mySQRT+0x70>
movsd  -0x8(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    117f <mySQRT+0x7f>
movsd  -0x8(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  0xe7c(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    11c9 <mySQRT+0xc9>
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm1
divsd  -0x10(%rbp),%xmm1
addsd  %xmm1,%xmm0
movsd  0xe45(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    112e <mySQRT+0x2e>
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<mySQRT>:
movsd  0xef8(%rip),%xmm3
mulsd  %xmm0,%xmm3
movapd %xmm3,%xmm1
subsd  %xmm0,%xmm1
movapd 0xef4(%rip),%xmm4
xorpd  %xmm1,%xmm4
xorpd  %xmm8,%xmm8
movapd %xmm1,%xmm5
cmpltsd %xmm8,%xmm5
andpd  %xmm5,%xmm4
andnpd %xmm1,%xmm5
orpd   %xmm4,%xmm5
ucomisd 0xec5(%rip),%xmm5
jbe    11a5 <mySQRT+0xa5>
movsd  0xeb3(%rip),%xmm4
movapd 0xebb(%rip),%xmm5
movsd  0xeab(%rip),%xmm6
nopl   (%rax)
movapd %xmm0,%xmm1
divsd  %xmm3,%xmm1
addsd  %xmm3,%xmm1
mulsd  %xmm4,%xmm1
movapd %xmm1,%xmm2
subsd  %xmm3,%xmm2
movapd %xmm2,%xmm3
xorpd  %xmm5,%xmm3
movapd %xmm2,%xmm7
cmpltsd %xmm8,%xmm7
andpd  %xmm7,%xmm3
andnpd %xmm2,%xmm7
orpd   %xmm3,%xmm7
ucomisd %xmm6,%xmm7
movapd %xmm1,%xmm3
ja     1160 <mySQRT+0x60>
movapd %xmm1,%xmm0
ret
movapd %xmm3,%xmm0
ret

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

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