void mandel() {
  int x, y, n;
  for (x = 0; x < 5000; ++x) {
    for (y = 0; y < 5000; ++y) {
      double __complex__ c = (-2.0 + x * (- -2.0 - -2.0) / 5000) +
                             (-2.0 - y * (- -2.0 - -2.0) / 5000) * 1.0iF;
      double __complex__ z = 0.0;
      for (n = 0; n < 10; ++n) {
        z = z * z + c;
        if (hypot(__real__ z, __imag__ z) >= 2)
          break;
      }
      emit(z);
    }
  }
}


x86 assembly (clang, -O0):
<mandel>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
movl   $0x0,-0x4(%rbp)
cmpl   $0x1388,-0x4(%rbp)
jge    1334 <mandel+0x214>
movl   $0x0,-0x8(%rbp)
cmpl   $0x1388,-0x8(%rbp)
jge    1321 <mandel+0x201>
cvtsi2sdl -0x4(%rbp),%xmm0
movsd  0xeb8(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xea4(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  0xe90(%rip),%xmm1
addsd  %xmm0,%xmm1
cvtsi2sdl -0x8(%rbp),%xmm2
movsd  0xe8f(%rip),%xmm0
mulsd  %xmm0,%xmm2
movsd  0xe7b(%rip),%xmm0
divsd  %xmm0,%xmm2
movsd  0xe67(%rip),%xmm0
subsd  %xmm2,%xmm0
xorps  %xmm3,%xmm3
movaps %xmm0,%xmm2
mulsd  %xmm3,%xmm2
movsd  0xe49(%rip),%xmm3
mulsd  %xmm3,%xmm0
addsd  %xmm2,%xmm1
movsd  %xmm1,-0x20(%rbp)
movsd  %xmm0,-0x18(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
movl   $0x0,-0xc(%rbp)
cmpl   $0xa,-0xc(%rbp)
jge    12ee <mandel+0x1ce>
movsd  -0x30(%rbp),%xmm1
movsd  %xmm1,-0x80(%rbp)
movsd  -0x28(%rbp),%xmm2
movsd  %xmm2,-0x78(%rbp)
movsd  -0x30(%rbp),%xmm4
movsd  %xmm4,-0x70(%rbp)
movsd  -0x28(%rbp),%xmm5
movsd  %xmm5,-0x68(%rbp)
movaps %xmm1,%xmm0
mulsd  %xmm4,%xmm0
movaps %xmm2,%xmm3
mulsd  %xmm5,%xmm3
mulsd  %xmm5,%xmm1
mulsd  %xmm4,%xmm2
subsd  %xmm3,%xmm0
movsd  %xmm0,-0x60(%rbp)
addsd  %xmm2,%xmm1
movsd  %xmm1,-0x58(%rbp)
ucomisd %xmm0,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  %xmm1,-0x48(%rbp)
jnp    128f <mandel+0x16f>
movsd  -0x58(%rbp),%xmm1
movsd  -0x60(%rbp),%xmm0
ucomisd %xmm1,%xmm1
movsd  %xmm0,-0x50(%rbp)
movsd  %xmm1,-0x48(%rbp)
jnp    128f <mandel+0x16f>
movsd  -0x68(%rbp),%xmm3
movsd  -0x70(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
movsd  -0x80(%rbp),%xmm0
call   1340 <__muldc3>
movsd  %xmm0,-0x50(%rbp)
movsd  %xmm1,-0x48(%rbp)
movsd  -0x50(%rbp),%xmm1
movsd  -0x48(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm3
movsd  -0x18(%rbp),%xmm2
addsd  %xmm3,%xmm1
addsd  %xmm2,%xmm0
movsd  %xmm1,-0x30(%rbp)
movsd  %xmm0,-0x28(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  -0x28(%rbp),%xmm1
call   1030 <hypot@plt>
movsd  0xd54(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     12db <mandel+0x1bb>
jmp    12ee <mandel+0x1ce>
jmp    12e0 <mandel+0x1c0>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    11e0 <mandel+0xc0>
movsd  -0x30(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm0
movsd  %xmm1,-0x40(%rbp)
movsd  %xmm0,-0x38(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x38(%rbp),%xmm1
mov    $0x2,%al
call   1040 <emit@plt>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    1146 <mandel+0x26>
jmp    1326 <mandel+0x206>
mov    -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    1132 <mandel+0x12>
add    $0x80,%rsp
pop    %rbp
ret
nopl   (%rax)

x86 assembly (clang, -O2):
<mandel>:
push   %rbp
push   %r14
push   %rbx
sub    $0x40,%rsp
xor    %r14d,%r14d
xorpd  %xmm0,%xmm0
jmp    115f <mandel+0x3f>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsd  0x8(%rsp),%xmm0
addsd  0xeda(%rip),%xmm0
add    $0x1,%r14d
cmp    $0x1388,%r14d
je     1281 <mandel+0x161>
movsd  %xmm0,0x8(%rsp)
mulsd  0xe93(%rip),%xmm0
divsd  0xe93(%rip),%xmm0
addsd  0xe93(%rip),%xmm0
movsd  %xmm0,0x10(%rsp)
xorpd  %xmm0,%xmm0
xor    %ebp,%ebp
jmp    11b7 <mandel+0x97>
nopl   0x0(%rax,%rax,1)
movaps %xmm2,%xmm0
movapd %xmm3,%xmm1
mov    $0x2,%al
call   1040 <emit@plt>
movsd  0x18(%rsp),%xmm0
addsd  0xe7c(%rip),%xmm0
add    $0x1,%ebp
cmp    $0x1388,%ebp
je     1140 <mandel+0x20>
movsd  %xmm0,0x18(%rsp)
mulsd  0xe53(%rip),%xmm0
divsd  0xe3b(%rip),%xmm0
addsd  0xe3b(%rip),%xmm0
xorpd  %xmm2,%xmm2
movsd  %xmm0,0x28(%rsp)
mulsd  %xmm2,%xmm0
addsd  0x10(%rsp),%xmm0
movsd  %xmm0,0x20(%rsp)
xor    %ebx,%ebx
xorpd  %xmm3,%xmm3
cs nopw 0x0(%rax,%rax,1)
nop
movapd %xmm2,%xmm0
mulsd  %xmm2,%xmm0
movapd %xmm3,%xmm1
mulsd  %xmm3,%xmm1
subsd  %xmm1,%xmm0
movapd %xmm3,%xmm1
mulsd  %xmm2,%xmm1
addsd  %xmm1,%xmm1
ucomisd %xmm0,%xmm0
jp     126c <mandel+0x14c>
addsd  0x20(%rsp),%xmm0
movsd  %xmm0,0x38(%rsp)
addsd  0x28(%rsp),%xmm1
movsd  %xmm1,0x30(%rsp)
call   1030 <hypot@plt>
movsd  0x30(%rsp),%xmm3
movsd  0x38(%rsp),%xmm2
ucomisd 0xdc9(%rip),%xmm0
jae    1190 <mandel+0x70>
lea    0x1(%rbx),%eax
cmp    $0x9,%ebx
mov    %eax,%ebx
jb     1200 <mandel+0xe0>
jmp    1190 <mandel+0x70>
ucomisd %xmm1,%xmm1
jnp    1226 <mandel+0x106>
movapd %xmm2,%xmm0
movapd %xmm3,%xmm1
call   1290 <__muldc3>
jmp    1226 <mandel+0x106>
add    $0x40,%rsp
pop    %rbx
pop    %r14
pop    %rbp
ret
nopw   0x0(%rax,%rax,1)

LLVM IR (-O0):
define void @mandel() {
%1 = alloca i32
%2 = alloca i32
%3 = alloca i32
%4 = alloca { double, double }
%5 = alloca { double, double }
%6 = alloca { double, double }
store i32 0, i32* %1
br label %7
7: ; preds = %95, %0
%8 = load i32, i32* %1
%9 = icmp slt i32 %8, 5000
br i1 %9, label %10, label %98
10: ; preds = %7
store i32 0, i32* %2
br label %11
11: ; preds = %91, %10
%12 = load i32, i32* %2
%13 = icmp slt i32 %12, 5000
br i1 %13, label %14, label %94
14: ; preds = %11
%15 = load i32, i32* %1
%16 = sitofp i32 %15 to double
%17 = fmul double %16, 4.000000e+00
%18 = fdiv double %17, 5.000000e+03
%19 = fadd double -2.000000e+00, %18
%20 = load i32, i32* %2
%21 = sitofp i32 %20 to double
%22 = fmul double %21, 4.000000e+00
%23 = fdiv double %22, 5.000000e+03
%24 = fsub double -2.000000e+00, %23
%25 = fmul double %24, 0.000000e+00
%26 = fmul double %24, 1.000000e+00
%27 = fadd double %19, %25
%28 = getelementptr inbounds { double, double }, { double, double }* %4, i32 0, i32 0
%29 = getelementptr inbounds { double, double }, { double, double }* %4, i32 0, i32 1
store double %27, double* %28
store double %26, double* %29
%30 = getelementptr inbounds { double, double }, { double, double }* %5, i32 0, i32 0
%31 = getelementptr inbounds { double, double }, { double, double }* %5, i32 0, i32 1
store double 0.000000e+00, double* %30
store double 0.000000e+00, double* %31
store i32 0, i32* %3
br label %32
32: ; preds = %76, %14
%33 = load i32, i32* %3
%34 = icmp slt i32 %33, 10
br i1 %34, label %35, label %79
35: ; preds = %32
%36 = getelementptr inbounds { double, double }, { double, double }* %5, i32 0, i32 0
%37 = load double, double* %36
%38 = getelementptr inbounds { double, double }, { double, double }* %5, i32 0, i32 1
%39 = load double, double* %38
%40 = getelementptr inbounds { double, double }, { double, double }* %5, i32 0, i32 0
%41 = load double, double* %40
%42 = getelementptr inbounds { double, double }, { double, double }* %5, i32 0, i32 1
%43 = load double, double* %42
%44 = fmul double %37, %41
%45 = fmul double %39, %43
%46 = fmul double %37, %43
%47 = fmul double %39, %41
%48 = fsub double %44, %45
%49 = fadd double %46, %47
%50 = fcmp uno double %48, %48
br i1 %50, label %51, label %57
51: ; preds = %35
%52 = fcmp uno double %49, %49
br i1 %52, label %53, label %57
53: ; preds = %51
%54 = call { double, double } @__muldc3(double %37, double %39, double %41, double %43)
%55 = extractvalue { double, double } %54, 0
%56 = extractvalue { double, double } %54, 1
br label %57
57: ; preds = %53, %51, %35
%58 = phi double [ %48, %35 ], [ %48, %51 ], [ %55, %53 ]
%59 = phi double [ %49, %35 ], [ %49, %51 ], [ %56, %53 ]
%60 = getelementptr inbounds { double, double }, { double, double }* %4, i32 0, i32 0
%61 = load double, double* %60
%62 = getelementptr inbounds { double, double }, { double, double }* %4, i32 0, i32 1
%63 = load double, double* %62
%64 = fadd double %58, %61
%65 = fadd double %59, %63
%66 = getelementptr inbounds { double, double }, { double, double }* %5, i32 0, i32 0
%67 = getelementptr inbounds { double, double }, { double, double }* %5, i32 0, i32 1
store double %64, double* %66
store double %65, double* %67
%68 = getelementptr inbounds { double, double }, { double, double }* %5, i32 0, i32 0
%69 = load double, double* %68
%70 = getelementptr inbounds { double, double }, { double, double }* %5, i32 0, i32 1
%71 = load double, double* %70
%72 = call double @hypot(double %69, double %71)
%73 = fcmp oge double %72, 2.000000e+00
br i1 %73, label %74, label %75
74: ; preds = %57
br label %79
75: ; preds = %57
br label %76
76: ; preds = %75
%77 = load i32, i32* %3
%78 = add nsw i32 %77, 1
store i32 %78, i32* %3
br label %32
79: ; preds = %74, %32
%80 = getelementptr inbounds { double, double }, { double, double }* %5, i32 0, i32 0
%81 = load double, double* %80
%82 = getelementptr inbounds { double, double }, { double, double }* %5, i32 0, i32 1
%83 = load double, double* %82
%84 = getelementptr inbounds { double, double }, { double, double }* %6, i32 0, i32 0
%85 = getelementptr inbounds { double, double }, { double, double }* %6, i32 0, i32 1
store double %81, double* %84
store double %83, double* %85
%86 = getelementptr inbounds { double, double }, { double, double }* %6, i32 0, i32 0
%87 = load double, double* %86
%88 = getelementptr inbounds { double, double }, { double, double }* %6, i32 0, i32 1
%89 = load double, double* %88
%90 = call i32 (double, double, ...) bitcast (i32 (...)* @emit to i32 (double, double, ...)*)(double %87, double %89)
br label %91
91: ; preds = %79
%92 = load i32, i32* %2
%93 = add nsw i32 %92, 1
store i32 %93, i32* %2
br label %11
94: ; preds = %11
br label %95
95: ; preds = %94
%96 = load i32, i32* %1
%97 = add nsw i32 %96, 1
store i32 %97, i32* %1
br label %7
98: ; preds = %7
ret void
}

LLVM IR (-O2):
define void @mandel() {
br label %1
1: ; preds = %0, %45
%2 = phi i32 [ 0, %0 ], [ %46, %45 ]
%3 = sitofp i32 %2 to double
%4 = fmul double %3, 4.000000e+00
%5 = fdiv double %4, 5.000000e+03
%6 = fadd double %5, -2.000000e+00
br label %7
7: ; preds = %1, %41
%8 = phi i32 [ 0, %1 ], [ %43, %41 ]
%9 = sitofp i32 %8 to double
%10 = fmul double %9, 4.000000e+00
%11 = fdiv double %10, 5.000000e+03
%12 = fsub double -2.000000e+00, %11
%13 = fmul double %12, 0.000000e+00
%14 = fadd double %6, %13
br label %15
15: ; preds = %31, %7
%16 = phi double [ 0.000000e+00, %7 ], [ %34, %31 ]
%17 = phi double [ 0.000000e+00, %7 ], [ %35, %31 ]
%18 = phi i32 [ 0, %7 ], [ %38, %31 ]
%19 = fmul double %16, %16
%20 = fmul double %17, %17
%21 = fmul double %17, %16
%22 = fsub double %19, %20
%23 = fadd double %21, %21
%24 = fcmp uno double %22, 0.000000e+00
br i1 %24, label %25, label %31
25: ; preds = %15
%26 = fcmp uno double %23, 0.000000e+00
br i1 %26, label %27, label %31
27: ; preds = %25
%28 = tail call { double, double } @__muldc3(double %16, double %17, double %16, double %17)
%29 = extractvalue { double, double } %28, 0
%30 = extractvalue { double, double } %28, 1
br label %31
31: ; preds = %27, %25, %15
%32 = phi double [ %22, %15 ], [ %22, %25 ], [ %29, %27 ]
%33 = phi double [ %23, %15 ], [ %23, %25 ], [ %30, %27 ]
%34 = fadd double %14, %32
%35 = fadd double %12, %33
%36 = tail call double @hypot(double %34, double %35)
%37 = fcmp ult double %36, 2.000000e+00
%38 = add nuw nsw i32 %18, 1
%39 = icmp ult i32 %18, 9
%40 = select i1 %37, i1 %39, i1 false
br i1 %40, label %15, label %41
41: ; preds = %31
%42 = tail call i32 (double, double, ...) bitcast (i32 (...)* @emit to i32 (double, double, ...)*)(double %34, double %35)
%43 = add nuw nsw i32 %8, 1
%44 = icmp eq i32 %43, 5000
br i1 %44, label %45, label %7
45: ; preds = %41
%46 = add nuw nsw i32 %2, 1
%47 = icmp eq i32 %46, 5000
br i1 %47, label %48, label %1
48: ; preds = %45
ret void
}