double sqrt(double x) {
  union {
    int i;
    double x;
  } u;
  u.x = x;
  u.i = (1 << 29) + (u.i >> 1) - (1 << 22);
  u.x = 0.5f * (u.x + x / u.x);
  u.x = 0.5f * (u.x + x / u.x);
  u.x = 0.5f * (u.x + x / u.x);
  u.x = 0.5f * (u.x + x / u.x);
  u.x = 0.5f * (u.x + x / u.x);
  u.x = 0.5f * (u.x + x / u.x);
  return u.x;
}


x86 assembly (clang, -O0):
<sqrt>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
sar    $0x1,%eax
add    $0x20000000,%eax
sub    $0x400000,%eax
mov    %eax,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm1
movsd  -0x8(%rbp),%xmm0
divsd  -0x10(%rbp),%xmm0
addsd  %xmm0,%xmm1
movsd  0xebf(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm1
movsd  -0x8(%rbp),%xmm0
divsd  -0x10(%rbp),%xmm0
addsd  %xmm0,%xmm1
movsd  0xe9b(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm1
movsd  -0x8(%rbp),%xmm0
divsd  -0x10(%rbp),%xmm0
addsd  %xmm0,%xmm1
movsd  0xe77(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm1
movsd  -0x8(%rbp),%xmm0
divsd  -0x10(%rbp),%xmm0
addsd  %xmm0,%xmm1
movsd  0xe53(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm1
movsd  -0x8(%rbp),%xmm0
divsd  -0x10(%rbp),%xmm0
addsd  %xmm0,%xmm1
movsd  0xe2f(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm1
movsd  -0x8(%rbp),%xmm0
divsd  -0x10(%rbp),%xmm0
addsd  %xmm0,%xmm1
movsd  0xe0b(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<sqrt>:
movq   %xmm0,%rax
movabs $0xffffffff00000000,%rcx
ff ff ff
and    %rax,%rcx
sar    %eax
add    $0x1fc00000,%eax
or     %rax,%rcx
movq   %rcx,%xmm1
movdqa %xmm0,%xmm2
divsd  %xmm1,%xmm2
addsd  %xmm1,%xmm2
movsd  0xecb(%rip),%xmm1
mulsd  %xmm1,%xmm2
movdqa %xmm0,%xmm3
divsd  %xmm2,%xmm3
addsd  %xmm2,%xmm3
mulsd  %xmm1,%xmm3
movdqa %xmm0,%xmm2
divsd  %xmm3,%xmm2
addsd  %xmm3,%xmm2
mulsd  %xmm1,%xmm2
movdqa %xmm0,%xmm3
divsd  %xmm2,%xmm3
addsd  %xmm2,%xmm3
mulsd  %xmm1,%xmm3
movdqa %xmm0,%xmm2
divsd  %xmm3,%xmm2
addsd  %xmm3,%xmm2
mulsd  %xmm1,%xmm2
divsd  %xmm2,%xmm0
addsd  %xmm2,%xmm0
mulsd  %xmm1,%xmm0
ret

LLVM IR (-O0):
%union.anon = type { double }
define double @sqrt(double %0) {
%2 = alloca double
%3 = alloca %union.anon
store double %0, double* %2
%4 = load double, double* %2
%5 = bitcast %union.anon* %3 to double*
store double %4, double* %5
%6 = bitcast %union.anon* %3 to i32*
%7 = load i32, i32* %6
%8 = ashr i32 %7, 1
%9 = add nsw i32 536870912, %8
%10 = sub nsw i32 %9, 4194304
%11 = bitcast %union.anon* %3 to i32*
store i32 %10, i32* %11
%12 = bitcast %union.anon* %3 to double*
%13 = load double, double* %12
%14 = load double, double* %2
%15 = bitcast %union.anon* %3 to double*
%16 = load double, double* %15
%17 = fdiv double %14, %16
%18 = fadd double %13, %17
%19 = fmul double 5.000000e-01, %18
%20 = bitcast %union.anon* %3 to double*
store double %19, double* %20
%21 = bitcast %union.anon* %3 to double*
%22 = load double, double* %21
%23 = load double, double* %2
%24 = bitcast %union.anon* %3 to double*
%25 = load double, double* %24
%26 = fdiv double %23, %25
%27 = fadd double %22, %26
%28 = fmul double 5.000000e-01, %27
%29 = bitcast %union.anon* %3 to double*
store double %28, double* %29
%30 = bitcast %union.anon* %3 to double*
%31 = load double, double* %30
%32 = load double, double* %2
%33 = bitcast %union.anon* %3 to double*
%34 = load double, double* %33
%35 = fdiv double %32, %34
%36 = fadd double %31, %35
%37 = fmul double 5.000000e-01, %36
%38 = bitcast %union.anon* %3 to double*
store double %37, double* %38
%39 = bitcast %union.anon* %3 to double*
%40 = load double, double* %39
%41 = load double, double* %2
%42 = bitcast %union.anon* %3 to double*
%43 = load double, double* %42
%44 = fdiv double %41, %43
%45 = fadd double %40, %44
%46 = fmul double 5.000000e-01, %45
%47 = bitcast %union.anon* %3 to double*
store double %46, double* %47
%48 = bitcast %union.anon* %3 to double*
%49 = load double, double* %48
%50 = load double, double* %2
%51 = bitcast %union.anon* %3 to double*
%52 = load double, double* %51
%53 = fdiv double %50, %52
%54 = fadd double %49, %53
%55 = fmul double 5.000000e-01, %54
%56 = bitcast %union.anon* %3 to double*
store double %55, double* %56
%57 = bitcast %union.anon* %3 to double*
%58 = load double, double* %57
%59 = load double, double* %2
%60 = bitcast %union.anon* %3 to double*
%61 = load double, double* %60
%62 = fdiv double %59, %61
%63 = fadd double %58, %62
%64 = fmul double 5.000000e-01, %63
%65 = bitcast %union.anon* %3 to double*
store double %64, double* %65
%66 = bitcast %union.anon* %3 to double*
%67 = load double, double* %66
ret double %67
}

LLVM IR (-O2):
define double @sqrt(double %0) {
%2 = bitcast double %0 to i64
%3 = trunc i64 %2 to i32
%4 = ashr i32 %3, 1
%5 = add nsw i32 %4, 532676608
%6 = zext i32 %5 to i64
%7 = and i64 %2, -4294967296
%8 = or i64 %7, %6
%9 = bitcast i64 %8 to double
%10 = fdiv double %0, %9
%11 = fadd double %10, %9
%12 = fmul double %11, 5.000000e-01
%13 = fdiv double %0, %12
%14 = fadd double %12, %13
%15 = fmul double %14, 5.000000e-01
%16 = fdiv double %0, %15
%17 = fadd double %15, %16
%18 = fmul double %17, 5.000000e-01
%19 = fdiv double %0, %18
%20 = fadd double %18, %19
%21 = fmul double %20, 5.000000e-01
%22 = fdiv double %0, %21
%23 = fadd double %21, %22
%24 = fmul double %23, 5.000000e-01
%25 = fdiv double %0, %24
%26 = fadd double %24, %25
%27 = fmul double %26, 5.000000e-01
ret double %27
}